Explorar o código

changed ModuleProvider to Injector provider for injector caching

Andreas Mülder %!s(int64=11) %!d(string=hai) anos
pai
achega
9f7a427cf7
Modificáronse 14 ficheiros con 126 adicións e 157 borrados
  1. 1 1
      plugins/org.yakindu.sct.domain.default_/plugin.xml
  2. 49 23
      plugins/org.yakindu.sct.domain.default_/src/org/yakindu/sct/domain/default_/extension/DefaultDomainModuleProvider.java
  3. 0 6
      plugins/org.yakindu.sct.domain.default_/src/org/yakindu/sct/domain/default_/modules/DefaultSequencerModule.java
  4. 2 2
      plugins/org.yakindu.sct.domain/src/org/yakindu/sct/domain/extension/DomainRegistry.java
  5. 48 0
      plugins/org.yakindu.sct.domain/src/org/yakindu/sct/domain/extension/IDomainInjectorProvider.java
  6. 0 62
      plugins/org.yakindu.sct.domain/src/org/yakindu/sct/domain/extension/IDomainModuleProvider.java
  7. 2 2
      plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/CCodeGenerator.java
  8. 4 8
      plugins/org.yakindu.sct.generator.core/src/org/yakindu/sct/generator/core/impl/AbstractSGraphModelGenerator.java
  9. 3 17
      plugins/org.yakindu.sct.generator.core/src/org/yakindu/sct/generator/core/impl/GenericJavaBasedGenerator.java
  10. 2 2
      plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/CppCodeGenerator.java
  11. 2 2
      plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/JavaCodeGenerator.java
  12. 2 15
      plugins/org.yakindu.sct.model.resource/src/org/yakindu/sct/model/resource/SCTResourceFactory.java
  13. 5 9
      plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/container/DefaultExecutionContextInitializer.xtend
  14. 6 8
      plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/launch/SexecLaunchConfigurationDelegate.java

+ 1 - 1
plugins/org.yakindu.sct.domain.default_/plugin.xml

@@ -6,7 +6,7 @@
       <Domain
             description="The default domain for Yakindu Statechart Tools."
             domainID="org.yakindu.domain.default"
-            domainModuleProvider="org.yakindu.sct.domain.default_.extension.DefaultDomainModuleProvider"
+            domainModuleProvider="org.yakindu.sct.domain.default_.extension.DefaultDomainInjectorProvider"
             image="icons/logo_small.png"
             name="Default">
       </Domain>

+ 49 - 23
plugins/org.yakindu.sct.domain.default_/src/org/yakindu/sct/domain/default_/extension/DefaultDomainModuleProvider.java

@@ -20,7 +20,7 @@ import org.yakindu.sct.domain.default_.modules.DefaultSimulationModule;
 import org.yakindu.sct.domain.default_.modules.DefaultTypeSystemModule;
 import org.yakindu.sct.domain.default_.modules.EntryRuleRuntimeModule;
 import org.yakindu.sct.domain.default_.modules.EntryRuleUIModule;
-import org.yakindu.sct.domain.extension.IDomainModuleProvider;
+import org.yakindu.sct.domain.extension.IDomainInjectorProvider;
 import org.yakindu.sct.model.sgraph.State;
 import org.yakindu.sct.model.sgraph.Statechart;
 import org.yakindu.sct.model.sgraph.Transition;
@@ -31,6 +31,8 @@ import org.yakindu.sct.model.stext.stext.TransitionSpecification;
 import org.yakindu.sct.model.stext.ui.STextUiModule;
 import org.yakindu.sct.model.stext.ui.internal.STextActivator;
 
+import com.google.inject.Guice;
+import com.google.inject.Injector;
 import com.google.inject.Module;
 import com.google.inject.util.Modules;
 
@@ -39,27 +41,30 @@ import com.google.inject.util.Modules;
  * @author andreas muelder - Initial contribution and API
  * 
  */
-public class DefaultDomainModuleProvider implements IDomainModuleProvider {
+public class DefaultDomainInjectorProvider implements IDomainInjectorProvider {
 
 	private static final Map<String, Class<? extends EObject>> semanticTargetToRuleMap = new HashMap<String, Class<? extends EObject>>();
+
+	private Injector resourceInjector;
+	private Injector simulationInjector;
+	private Injector sequencerInjector;
+	private Map<String, Injector> embeddedInjectors = new HashMap<String, Injector>();
+
 	static {
 		semanticTargetToRuleMap.put(Statechart.class.getName(), StatechartSpecification.class);
 		semanticTargetToRuleMap.put(Transition.class.getName(), TransitionSpecification.class);
 		semanticTargetToRuleMap.put(State.class.getName(), StateSpecification.class);
 	}
 
-	@Override
-	public Module getSharedStateModule() {
+	protected Module getSharedStateModule() {
 		return new SharedStateModule();
 	}
 
-	@Override
-	public Module getLanguageRuntimeModule() {
+	protected Module getLanguageRuntimeModule() {
 		return new STextRuntimeModule();
 	}
 
-	@Override
-	public Module getLanguageUIModule() {
+	protected Module getLanguageUIModule() {
 		return new STextUiModule(STextActivator.getInstance());
 	}
 
@@ -67,32 +72,53 @@ public class DefaultDomainModuleProvider implements IDomainModuleProvider {
 		return new DefaultTypeSystemModule();
 	}
 
-	@Override
-	public Module getSimulationModule() {
+	protected Module getSimulationModule() {
 		return new DefaultSimulationModule();
 	}
 
-	@Override
-	public Module getSequencerModule() {
+	protected Module getSequencerModule() {
 		return new DefaultSequencerModule();
 	}
 
-	@Override
-	public Module getResourceModule() {
+	protected Module getResourceModule() {
 		Module uiModule = Modules.override(getLanguageRuntimeModule()).with(getLanguageUIModule());
-		Module result =  Modules.override(uiModule).with(getSharedStateModule());
-		return Modules.override(result).with (getTypeSystemModule());
-	}
-
-	@Override
-	public Module getEmbeddedEditorModule(String semanticTarget) {
-		return getEmbeddedEditorModule(semanticTargetToRuleMap.get(semanticTarget));
+		Module result = Modules.override(uiModule).with(getSharedStateModule());
+		return Modules.override(result).with(getTypeSystemModule());
 	}
 
 	protected Module getEmbeddedEditorModule(Class<? extends EObject> rule) {
 		Module runtimeModule = Modules.override(getLanguageRuntimeModule()).with(new EntryRuleRuntimeModule(rule));
 		Module uiModule = Modules.override(getLanguageUIModule()).with(new EntryRuleUIModule(rule));
-		Module result =  Modules.override(Modules.override(runtimeModule).with(uiModule)).with(getSharedStateModule());
-		return Modules.override(result).with (getTypeSystemModule());
+		Module result = Modules.override(Modules.override(runtimeModule).with(uiModule)).with(getSharedStateModule());
+		return Modules.override(result).with(getTypeSystemModule());
+	}
+
+	@Override
+	public Injector getEmbeddedEditorInjector(String semanticTarget) {
+		if (embeddedInjectors.get(semanticTarget) == null)
+			embeddedInjectors.put(semanticTarget,
+					Guice.createInjector(getEmbeddedEditorModule(semanticTargetToRuleMap.get(semanticTarget))));
+		return embeddedInjectors.get(semanticTarget);
+	}
+
+	@Override
+	public Injector getResourceInjector() {
+		if (resourceInjector == null)
+			resourceInjector = Guice.createInjector(getResourceModule());
+		return resourceInjector;
+	}
+
+	@Override
+	public Injector getSimulationInjector() {
+		if (simulationInjector == null)
+			simulationInjector = Guice.createInjector(getSimulationModule());
+		return simulationInjector;
+	}
+
+	@Override
+	public Injector getSequencerInjector() {
+		if (sequencerInjector == null)
+			sequencerInjector = Guice.createInjector(getSequencerModule());
+		return sequencerInjector;
 	}
 }

+ 0 - 6
plugins/org.yakindu.sct.domain.default_/src/org/yakindu/sct/domain/default_/modules/DefaultSequencerModule.java

@@ -17,8 +17,6 @@ import org.eclipse.xtext.service.AbstractGenericModule;
 import org.yakindu.base.types.inferrer.ITypeSystemInferrer;
 import org.yakindu.base.types.typesystem.DefaultTypeSystem;
 import org.yakindu.base.types.typesystem.ITypeSystem;
-import org.yakindu.sct.model.sexec.naming.DefaultNamingService;
-import org.yakindu.sct.model.sexec.naming.INamingService;
 import org.yakindu.sct.model.sexec.transformation.IModelSequencer;
 import org.yakindu.sct.model.sexec.transformation.ModelSequencer;
 import org.yakindu.sct.model.sgraph.naming.SGraphNameProvider;
@@ -59,10 +57,6 @@ public class DefaultSequencerModule extends AbstractGenericModule {
 		return DefaultTypeSystem.class;
 	}
 
-	public Class<? extends INamingService> bindINamingService() {
-		return DefaultNamingService.class;
-	}
-
 	public Class<? extends IResourceDescriptions> bindIResourceDescriptions() {
 		return ResourceSetBasedResourceDescriptions.class;
 	}

+ 2 - 2
plugins/org.yakindu.sct.domain/src/org/yakindu/sct/domain/extension/DomainRegistry.java

@@ -70,9 +70,9 @@ public class DomainRegistry {
 			return configElement.getAttribute(DESCRIPTION);
 		}
 
-		public IDomainModuleProvider getModuleProvider() {
+		public IDomainInjectorProvider getDomainInjectorProvider() {
 			try {
-				return (IDomainModuleProvider) configElement.createExecutableExtension(MODULE_PROVIDER);
+				return (IDomainInjectorProvider) configElement.createExecutableExtension(MODULE_PROVIDER);
 			} catch (CoreException e) {
 				e.printStackTrace();
 			}

+ 48 - 0
plugins/org.yakindu.sct.domain/src/org/yakindu/sct/domain/extension/IDomainInjectorProvider.java

@@ -0,0 +1,48 @@
+/**
+ * Copyright (c) 2015 committers of YAKINDU and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * Contributors:
+ * 	committers of YAKINDU - initial API and implementation
+ * 
+ */
+package org.yakindu.sct.domain.extension;
+
+import org.yakindu.sct.model.sgraph.resource.AbstractSCTResource;
+
+import com.google.inject.Injector;
+
+/**
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public interface IDomainInjectorProvider {
+
+	/**
+	 * Returns the injector used for injection the {@link AbstractSCTResource}
+	 * 
+	 */
+	public Injector getResourceInjector();
+
+	/**
+	 * Returns the injector for the Simulation engine
+	 */
+	public Injector getSimulationInjector();
+
+	/**
+	 * Returns the Injector for the model sequencing
+	 */
+	public Injector getSequencerInjector();
+
+	/**
+	 * Injector used to create the embedded in-diagram Xtext Editor
+	 * 
+	 * @param elementKey
+	 *            A key indicating for which element the in-diagram editor
+	 *            should be created, i.e. State, Statechart or Transition
+	 */
+	public Injector getEmbeddedEditorInjector(String elementKey);
+
+}

+ 0 - 62
plugins/org.yakindu.sct.domain/src/org/yakindu/sct/domain/extension/IDomainModuleProvider.java

@@ -1,62 +0,0 @@
-/**
- * Copyright (c) 2015 committers of YAKINDU and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * Contributors:
- * 	committers of YAKINDU - initial API and implementation
- * 
- */
-package org.yakindu.sct.domain.extension;
-
-import org.yakindu.sct.model.sgraph.resource.AbstractSCTResource;
-
-import com.google.inject.Module;
-
-/**
- * @author andreas muelder - Initial contribution and API
- * 
- */
-public interface IDomainModuleProvider {
-	/**
-	 * Returns the SharedStateModule that is used for in-diagram expression
-	 * language
-	 */
-	public Module getSharedStateModule();
-
-	/**
-	 * Returns the runtime module that is used as in-diagram expression language
-	 */
-	public Module getLanguageRuntimeModule();
-
-	/**
-	 * Returns the ui module that is used as in-diagram expression language
-	 */
-	public Module getLanguageUIModule();
-
-	/**
-	 * Module used to create an instance of {@link AbstractSCTResource}
-	 */
-	public Module getResourceModule();
-
-	/**
-	 * Returns the module used during simulation
-	 */
-	public Module getSimulationModule();
-
-	/**
-	 * Returns the module used for model sequencing
-	 */
-	public Module getSequencerModule();
-
-	/**
-	 * Module used to create the embedded in-diagram Xtext Editor
-	 * 
-	 * @param elementKey
-	 *            A key indicating for which element the in-diagram editor
-	 *            should be created, i.e. State, Statechart or Transition
-	 */
-	public Module getEmbeddedEditorModule(String elementKey);
-
-}

+ 2 - 2
plugins/org.yakindu.sct.generator.c/src/org/yakindu/sct/generator/c/CCodeGenerator.java

@@ -45,8 +45,8 @@ public class CCodeGenerator extends GenericJavaBasedGenerator {
 	}
 
 	@Override
-	protected Module createModule(final GeneratorEntry entry) {
-		Module module = super.createModule(entry);
+	protected Module getChildInjectorModule(final GeneratorEntry entry) {
+		Module module = super.getChildInjectorModule(entry);
 		return Modules.override(module).with(new Module() {
 			public void configure(Binder binder) {
 				binder.bind(ICodegenTypeSystemAccess.class)

+ 4 - 8
plugins/org.yakindu.sct.generator.core/src/org/yakindu/sct/generator/core/impl/AbstractSGraphModelGenerator.java

@@ -31,10 +31,8 @@ import org.yakindu.sct.model.sgen.GeneratorEntry;
 import org.yakindu.sct.model.sgraph.Statechart;
 
 import com.google.inject.Binder;
-import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.google.inject.Module;
-import com.google.inject.util.Modules;
 
 /**
  * abstract base class for all code generators that want to generate code based
@@ -135,19 +133,17 @@ public abstract class AbstractSGraphModelGenerator implements ISCTGenerator {
 	private Injector injector;
 
 	protected Injector createInjector(GeneratorEntry entry) {
-		return Guice.createInjector(createModule(entry));
+		Injector sequencerInjector = DomainRegistry.getDomainDescriptor(entry.getElementRef()).getDomainInjectorProvider().getSequencerInjector();
+		return sequencerInjector.createChildInjector(getChildInjectorModule(entry));
 	}
 
-	protected Module createModule(GeneratorEntry entry) {
-		Module defaultModule = DomainRegistry.getDomainDescriptor(entry.getElementRef()).getModuleProvider()
-				.getSequencerModule();
+	protected Module getChildInjectorModule(GeneratorEntry entry) {
 		Module bridgeModule = new Module() {
 			public void configure(Binder binder) {
 				binder.bind(IGeneratorBridge.class).toInstance(bridge);
 			}
 		};
-		defaultModule = Modules.override(defaultModule).with(bridgeModule);
-		return defaultModule;
+		return bridgeModule;
 	}
 
 	protected Injector getInjector(GeneratorEntry entry) {

+ 3 - 17
plugins/org.yakindu.sct.generator.core/src/org/yakindu/sct/generator/core/impl/GenericJavaBasedGenerator.java

@@ -32,7 +32,6 @@ import org.yakindu.sct.model.sgen.FeatureParameterValue;
 import org.yakindu.sct.model.sgen.GeneratorEntry;
 import org.yakindu.sct.model.sgraph.Statechart;
 
-import com.google.inject.Guice;
 import com.google.inject.Module;
 import com.google.inject.util.Modules;
 
@@ -44,13 +43,8 @@ import com.google.inject.util.Modules;
 public class GenericJavaBasedGenerator extends AbstractSExecModelGenerator {
 
 	@Override
-	protected com.google.inject.Injector createInjector(GeneratorEntry entry) {
-		return Guice.createInjector(createModule(entry));
-	}
-
-	@Override
-	protected Module createModule(final GeneratorEntry entry) {
-		Module defaultModule = super.createModule(entry);
+	protected Module getChildInjectorModule(final GeneratorEntry entry) {
+		Module defaultModule = super.getChildInjectorModule(entry);
 
 		String overridingModuleClass = null;
 		FeatureConfiguration featureConfiguration = entry
@@ -71,18 +65,10 @@ public class GenericJavaBasedGenerator extends AbstractSExecModelGenerator {
 					defaultModule = Modules.override(defaultModule)
 							.with(module);
 				}
-			} catch (ClassNotFoundException e) {
+			} catch (Exception e) {
 				e.printStackTrace();
 				writeToConsole("Overriding module not found: "
 						+ overridingModuleClass);
-			} catch (InstantiationException e) {
-				e.printStackTrace();
-				writeToConsole("Module can't be instantiated : "
-						+ overridingModuleClass);
-			} catch (IllegalAccessException e) {
-				e.printStackTrace();
-				writeToConsole("Access to module denied: "
-						+ overridingModuleClass);
 			}
 		}
 		return defaultModule;

+ 2 - 2
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/CppCodeGenerator.java

@@ -43,8 +43,8 @@ public class CppCodeGenerator extends GenericJavaBasedGenerator {
 	}
 
 	@Override
-	protected Module createModule(final GeneratorEntry entry) {
-		Module module = super.createModule(entry);
+	protected Module getChildInjectorModule(final GeneratorEntry entry) {
+		Module module = super.getChildInjectorModule(entry);
 		return Modules.override(module).with(new Module() {
 			public void configure(Binder binder) {
 				binder.bind(ICodegenTypeSystemAccess.class).to(

+ 2 - 2
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/JavaCodeGenerator.java

@@ -41,8 +41,8 @@ public class JavaCodeGenerator extends AbstractJavaCodeGenerator {
 	}
 
 	@Override
-	protected Module createModule(final GeneratorEntry entry) {
-		Module module = super.createModule(entry);
+	protected Module getChildInjectorModule(final GeneratorEntry entry) {
+		Module module = super.getChildInjectorModule(entry);
 		final GenmodelEntries entries = new GenmodelEntries();
 		return Modules.override(module).with(new Module() {
 			public void configure(Binder binder) {

+ 2 - 15
plugins/org.yakindu.sct.model.resource/src/org/yakindu/sct/model/resource/SCTResourceFactory.java

@@ -11,8 +11,6 @@
 package org.yakindu.sct.model.resource;
 
 import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
 
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.resource.Resource;
@@ -28,9 +26,7 @@ import org.yakindu.sct.domain.extension.DomainRegistry.DomainDescriptor;
 import org.yakindu.sct.model.sgraph.SGraphPackage;
 import org.yakindu.sct.model.sgraph.Statechart;
 
-import com.google.inject.Guice;
 import com.google.inject.Injector;
-import com.google.inject.Module;
 
 /**
  * 
@@ -39,21 +35,12 @@ import com.google.inject.Module;
  */
 public class SCTResourceFactory extends XMIResourceFactoryImpl {
 
-	private Map<String, Injector> injectorCache;
-
-	public SCTResourceFactory() {
-		injectorCache = new HashMap<String, Injector>();
-	}
-
 	@Override
 	public Resource createResource(URI uri) {
 		String domainID = determineDomainID(uri);
 		DomainDescriptor domainDescriptor = DomainRegistry.getDomainDescriptor(domainID);
-		Module resourceModule = domainDescriptor.getModuleProvider().getResourceModule();
-		if (injectorCache.get(domainID) == null) {
-			injectorCache.put(domainID, Guice.createInjector(resourceModule));
-		}
-		Resource resource = injectorCache.get(domainID).getInstance(Resource.class);
+		Injector injector = domainDescriptor.getDomainInjectorProvider().getResourceInjector();
+		Resource resource = injector.getInstance(Resource.class);
 		ResourceSet set = new ResourceSetImpl();
 		set.getResources().add(resource);
 		resource.setURI(uri);

+ 5 - 9
plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/container/DefaultExecutionContextInitializer.xtend

@@ -116,15 +116,15 @@ class DefaultExecutionContextInitializer implements IExecutionContextInitializer
 		it.name = variable.fullyQualifiedName.lastSegment
 		it.fqName = variable.fullyQualifiedName.toString
 		it.type = variable.inferType(null)
-		it.value = it.type.initialValue
+		it.value = it.type.defaultValue
 		it.writable = !variable.const
 	}
 
 	def dispatch ExecutionSlot create new ExecutionEventImpl() transform(EventDefinition event) {
 		it.name = event.fullyQualifiedName.lastSegment
 		it.fqName = event.fullyQualifiedName.toString
-		it.type = event.inferType(null)
-		it.value = it.type.initialValue
+		it.type = event.type
+		it.value = it.type.defaultValue
 		it.direction = EventDirection.get(event.direction.value)
 	}
 
@@ -132,18 +132,14 @@ class DefaultExecutionContextInitializer implements IExecutionContextInitializer
 		it.name = op.fullyQualifiedName.lastSegment
 		it.fqName = op.fullyQualifiedName.toString
 		it.type = if(op.type != null) op.type else getType(DefaultTypeSystem.VOID)
-		it.value = it.type.initialValue
+		it.value = it.type.defaultValue
 	}
 
 	def dispatch ExecutionSlot create new ExecutionEventImpl() transform(TimeEvent event) {
 		it.name = event.fullyQualifiedName.lastSegment
 		it.fqName = event.fullyQualifiedName.toString
 		it.type = getType(DefaultTypeSystem.INTEGER)
-		it.value = initialValue(it.type)
+		it.value = it.type.defaultValue
 	}
 
-	def Object initialValue(Type type) {
-		return type.originType.defaultValue
-	}
-	
 }

+ 6 - 8
plugins/org.yakindu.sct.simulation.core.sexec/src/org/yakindu/sct/simulation/core/sexec/launch/SexecLaunchConfigurationDelegate.java

@@ -20,10 +20,9 @@ import org.yakindu.sct.simulation.core.launch.AbstractSCTLaunchConfigurationDele
 import org.yakindu.sct.simulation.core.sexec.container.ISimulationEngineFactory;
 
 import com.google.inject.Binder;
-import com.google.inject.Guice;
 import com.google.inject.Inject;
+import com.google.inject.Injector;
 import com.google.inject.Module;
-import com.google.inject.util.Modules;
 
 /**
  * 
@@ -40,15 +39,15 @@ public class SexecLaunchConfigurationDelegate extends AbstractSCTLaunchConfigura
 
 	@Override
 	protected ISimulationEngine createExecutionContainer(final ILaunch launch, Statechart statechart) {
-		Module simulationModule = DomainRegistry.getDomainDescriptor(statechart).getModuleProvider()
-				.getSimulationModule();
-		Module module = Modules.override(simulationModule).with(new Module() {
+		Injector injector = DomainRegistry.getDomainDescriptor(statechart).getDomainInjectorProvider()
+				.getSimulationInjector();
+		Module module = new Module() {
 			@Override
 			public void configure(Binder binder) {
 				binder.bind(ILaunch.class).toInstance(launch);
 			}
-		});
-		Guice.createInjector(module).injectMembers(this);
+		};
+		injector.createChildInjector(module).injectMembers(this);
 		try {
 			return factory.createExecutionContainer(statechart, launch);
 		} catch (CoreException e) {
@@ -56,5 +55,4 @@ public class SexecLaunchConfigurationDelegate extends AbstractSCTLaunchConfigura
 			return null;
 		}
 	}
-
 }