package fr.inria.diverse.k3.ui.xtend.ide.support;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExecutableExtension;
import org.eclipse.core.runtime.IExecutableExtensionFactory;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.xtend.ide.XtendExecutableExtensionFactory;
import org.eclipse.xtend.ide.internal.XtendActivator;
import org.osgi.framework.Bundle;
import com.google.inject.Injector;
import fr.inria.diverse.k3.ui.Activator;
public class K3XtendExecutableExtensionFactory implements IExecutableExtensionFactory, IExecutableExtension {
public static final String GUICEKEY = "guicekey";
protected String clazzName;
protected IConfigurationElement config;
@SuppressWarnings({ "unchecked" })
public void setInitializationData(IConfigurationElement config, String propertyName, Object data)
throws CoreException {
if (data instanceof String) {
clazzName = (String) data;
} else if (data instanceof Map<?, ?>) {
clazzName = ((Map<String, String>)data).get(GUICEKEY);
}
if (clazzName == null) {
throw new IllegalArgumentException("couldn't handle passed data : "+data);
}
this.config = config;
}
public Object create() throws CoreException {
try {
final Class<?> clazz = getBundle().loadClass(clazzName);
final Injector injector = getInjector();
final Object result = injector.getInstance(clazz);
if (result instanceof IExecutableExtension)
((IExecutableExtension) result).setInitializationData(config, null, null);
return result;
}
catch (Exception e) {
Activator.logErrorMessage(e.getMessage(), e);
throw new CoreException(new Status(IStatus.ERROR, getBundle().getSymbolicName(), e.getMessage() + " ExtensionFactory: "+ getClass().getName(), e));
}
}
protected Bundle getBundle() {
return Activator.getDefault().getBundle();
}
protected Injector getInjector() {
return XtendActivator.getInstance().getInjector(XtendActivator.ORG_ECLIPSE_XTEND_CORE_XTEND);
}
}