blob: c226e9fc94d299cacefcf9989b2a4c3ef2f5eec7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2018 Willink Transformations and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* E.D.Willink - Initial API and implementation
*******************************************************************************/
package org.eclipse.ocl.options;
import java.lang.reflect.Field;
import org.eclipse.ocl.common.preferences.PreferenceableOption;
/**
* Implementation of the {@link PreferenceableOption} interface for object OCL options.
*
* When persisted as a preference, the representation is a Java-class name followed by a dot and
* then the static object name. e.g. "org.eclipse.emf.ecore.EPackage$Literals.EOBJECT" or "null".
*
* @since 3.2
*/
public class ObjectOption<T> extends BasicOption<T> implements PreferenceableOption<T>
{
protected final Class<?> classType;
public ObjectOption(String pluginId, String key, T defaultValue, Class<? extends T> classType) {
super(pluginId, key, defaultValue);
this.classType = classType;
}
@SuppressWarnings("unchecked")
public T getValueOf(String string) {
if (string == null) {
return null;
}
int index = string.lastIndexOf("."); //$NON-NLS-1$
if (index <= 0) {
return null;
}
String className = string.substring(0, index);
String instanceName = string.substring(index+1);
try {
ClassLoader classLoader = classType.getClassLoader();
if (classLoader == null) { // May be null for java.lang.Object
classLoader = getClass().getClassLoader();
}
Class<?> loadClass = classLoader.loadClass(className);
if (loadClass == null) {
return null;
}
Field field = loadClass.getField(instanceName);
return (T) field.get(null);
} catch (Exception e) {
// e.printStackTrace();
return getDefaultValue();
}
}
}