package org.xpect.util; import java.util.List; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.plugin.EcorePlugin; import org.xpect.XjmContribution; import org.xpect.XpectJavaModel; import org.xpect.registry.ILanguageInfo; import org.xpect.setup.XpectGuiceModule; import com.google.common.collect.Lists; import com.google.inject.Injector; import com.google.inject.Module; public interface IXtInjectorProvider { public class Delegate implements IXtInjectorProvider { private IXtInjectorProvider delegate; public Injector getInjector(XpectJavaModel javaModel, URI uri) { return delegate.getInjector(javaModel, uri); } public void setDelegate(IXtInjectorProvider delegate) { this.delegate = delegate; } } public class RuntimeXtInjectorProvider implements IXtInjectorProvider { protected void collectBuiltinModules(List<Class<? extends Module>> moduleClasses) { } @SuppressWarnings("unchecked") protected void collectSetupModules(List<Class<? extends Module>> moduleClasses, XpectJavaModel javaModel) { if (javaModel != null) { Iterable<XjmContribution> contributions = javaModel.getContributions(XpectGuiceModule.class, EnvironmentUtil.ENVIRONMENT); for (XjmContribution contribution : contributions) if (contribution.isActive()) { Class<?> javaClass = contribution.getJavaClass(); if (Module.class.isAssignableFrom(javaClass)) moduleClasses.add((Class<? extends Module>) javaClass); } } } public Injector getInjector(XpectJavaModel javaModel, URI uri) { String ext = new URIDelegationHandler().getOriginalFileExtension(uri.lastSegment()); ILanguageInfo info = ILanguageInfo.Registry.INSTANCE.getLanguageByFileExtension(ext); if (info == null) return null; List<Class<? extends Module>> moduleClasses = Lists.newArrayList(); collectBuiltinModules(moduleClasses); collectSetupModules(moduleClasses, javaModel); Injector injector = info.getInjector(moduleClasses); return injector; } } public static final IXtInjectorProvider INSTANCE = EcorePlugin.IS_ECLIPSE_RUNNING ? new Delegate() : new RuntimeXtInjectorProvider(); Injector getInjector(XpectJavaModel javaModel, URI uri); }