[generator] AbstractGenerator binding can be overridden

Change-Id: Iab7427a5b598d49b60265761d7a48e1a336484c4
diff --git a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/Main.java b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/Main.java
index 1a023e5..00a4344 100644
--- a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/Main.java
+++ b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/Main.java
@@ -79,6 +79,13 @@
 		if (isTerminateOnError() && ret!=GENERATOR_OK)
 			System.exit(ret);
 	}
+	
+	/**
+	 * @return the unique {@link GlobalSettings}
+	 */
+	public static GlobalGeneratorSettings getSettings() {
+		return (GlobalGeneratorSettings) getInstance().getGeneratorSettings();
+	}
 
 	@Inject
 	private MainGen mainGenerator;
@@ -95,11 +102,13 @@
 	@Inject
 	protected IDataConfiguration dataConfig;
 
+	private Root genModelResult = null;
+	
 	/**
-	 * @return the unique {@link GlobalSettings}
+	 *  The resulting genmodel of {@linkplain #Main.runGenerator} if available.
 	 */
-	public static GlobalGeneratorSettings getSettings() {
-		return (GlobalGeneratorSettings) getInstance().getGeneratorSettings();
+	public Root getGenModel() {
+		return genModelResult;
 	}
 	
 	/**
@@ -146,7 +155,7 @@
 				return GENERATOR_ERROR;
 			}
 			
-			Root genModel = createGeneratorModel(getSettings().isGenerateAsLibrary(), getSettings().getGeneratorModelPath());
+			Root genModel = createGeneratorModel(getSettings().isGenerateAsLibrary(), getSettings().getGeneratorModelPath());		
 			if (diagnostician.isFailed() || genModel==null) {
 				logger.logInfo("errors during build of generator model");
 				logger.logError("-- terminating", null);
@@ -187,6 +196,9 @@
 				logger.logError("-- terminating", null);
 				return GENERATOR_ERROR;
 			}
+			
+			genModelResult = genModel;
+			
 			logger.logInfo("-- finished code generation");
 		}
 		finally {
diff --git a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/setup/GeneratorModule.java b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/setup/GeneratorModule.java
index 8bee757..3eaa133 100644
--- a/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/setup/GeneratorModule.java
+++ b/plugins/org.eclipse.etrice.generator.c/src/org/eclipse/etrice/generator/c/setup/GeneratorModule.java
@@ -34,10 +34,14 @@
 	public void configure(Binder binder) {
 		super.configure(binder);
 
-		binder.bind(AbstractGenerator.class).to(Main.class);
 		binder.bind(GenericProtocolClassGenerator.class).to(ProtocolClassGen.class);
 		binder.bind(GenericActorClassGenerator.class).to(ActorClassGen.class);
 	}
+	
+	@Override
+	public Class<? extends AbstractGenerator> bindAbstractGenerator() {
+		return Main.class;
+	}
 
 	@Override
 	public Class<? extends ILanguageExtension> bindILanguageExtension() {
diff --git a/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/setup/GeneratorModule.java b/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/setup/GeneratorModule.java
index 14fea06..a2eba36 100644
--- a/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/setup/GeneratorModule.java
+++ b/plugins/org.eclipse.etrice.generator.cpp/src/org/eclipse/etrice/generator/cpp/setup/GeneratorModule.java
@@ -37,14 +37,19 @@
 	public void configure(Binder binder) {
 		super.configure(binder);
 
-		binder.bind(AbstractGenerator.class).to(Main.class);
 		binder.bind(ProcedureHelpers.class).to(CppProcedureHelpers.class);
 		binder.bind(GenericProtocolClassGenerator.class).to(ProtocolClassGen.class);
 		binder.bind(GenericActorClassGenerator.class).to(ActorClassGen.class);
 
 		binder.bind(ImportUriResolver.class).to(ModelLocatorUriResolver.class);
 	}
-
+	
+	@Override
+	public Class<? extends AbstractGenerator> bindAbstractGenerator() {
+		return Main.class;
+	}
+	
+	@Override
 	public Class<? extends ILanguageExtension> bindILanguageExtension() {
 		return CppExtensions.class;
 	}
diff --git a/plugins/org.eclipse.etrice.generator.doc/src/org/eclipse/etrice/generator/doc/setup/GeneratorModule.java b/plugins/org.eclipse.etrice.generator.doc/src/org/eclipse/etrice/generator/doc/setup/GeneratorModule.java
index e4becc5..4d0bcfd 100644
--- a/plugins/org.eclipse.etrice.generator.doc/src/org/eclipse/etrice/generator/doc/setup/GeneratorModule.java
+++ b/plugins/org.eclipse.etrice.generator.doc/src/org/eclipse/etrice/generator/doc/setup/GeneratorModule.java
@@ -29,10 +29,13 @@
 	public void configure(Binder binder) {
 		super.configure(binder);
 		
-		binder.bind(AbstractGenerator.class).to(Main.class);
-		
 		binder.bind(GlobalGeneratorSettings.class).to(GlobalSettings.class);
 	}
+	
+	@Override
+	public Class<? extends AbstractGenerator> bindAbstractGenerator() {
+		return Main.class;
+	}
 
 	@Override
 	public Class<? extends ILanguageExtension> bindILanguageExtension() {
diff --git a/plugins/org.eclipse.etrice.generator.fsm/src/org/eclipse/etrice/generator/fsm/base/IncrementalGenerationFileIo.java b/plugins/org.eclipse.etrice.generator.fsm/src/org/eclipse/etrice/generator/fsm/base/IncrementalGenerationFileIo.java
index 8c227ac..c291ab6 100644
--- a/plugins/org.eclipse.etrice.generator.fsm/src/org/eclipse/etrice/generator/fsm/base/IncrementalGenerationFileIo.java
+++ b/plugins/org.eclipse.etrice.generator.fsm/src/org/eclipse/etrice/generator/fsm/base/IncrementalGenerationFileIo.java
@@ -56,6 +56,7 @@
 	 * then the file stored in the {@code infopath} is copied to {@code path} while preserving the file data.
 	 * In the other case the key is stored and the file is stored to {@code infopath} and {@code path}.
 	 */
+	@Override
 	public void generateFile(String desc, String path, String infopath, String file, CharSequence contents) {
 		
 		long oldCRC = 0;
diff --git a/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/setup/GeneratorModule.java b/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/setup/GeneratorModule.java
index 9dcad33..522c31e 100644
--- a/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/setup/GeneratorModule.java
+++ b/plugins/org.eclipse.etrice.generator.java/src/org/eclipse/etrice/generator/java/setup/GeneratorModule.java
@@ -37,14 +37,17 @@
 	public void configure(Binder binder) {
 		super.configure(binder);
 
-		binder.bind(AbstractGenerator.class).to(Main.class);
 		binder.bind(GenericProtocolClassGenerator.class).to(ProtocolClassGen.class);
 		binder.bind(GenericActorClassGenerator.class).to(ActorClassGen.class);
 
 		binder.bind(ImportUriResolver.class).to(ModelLocatorUriResolver.class);
 
 		binder.bind(GlobalGeneratorSettings.class).to(GlobalSettings.class);
-
+	}
+	
+	@Override
+	public Class<? extends AbstractGenerator> bindAbstractGenerator() {
+		return Main.class;
 	}
 
 	@Override
diff --git a/plugins/org.eclipse.etrice.generator/src/org/eclipse/etrice/generator/base/AbstractGeneratorBaseModule.java b/plugins/org.eclipse.etrice.generator/src/org/eclipse/etrice/generator/base/AbstractGeneratorBaseModule.java
index 95e9f10..c2d502a 100644
--- a/plugins/org.eclipse.etrice.generator/src/org/eclipse/etrice/generator/base/AbstractGeneratorBaseModule.java
+++ b/plugins/org.eclipse.etrice.generator/src/org/eclipse/etrice/generator/base/AbstractGeneratorBaseModule.java
@@ -70,6 +70,8 @@
 		binder.bind(IMessageIdGenerator.class).to(GenericProtocolClassGenerator.class);
 		binder.bind(IIfItemIdGenerator.class).to(GenericActorClassGenerator.class);
 		
+		if(bindAbstractGenerator() != null)
+			binder.bind(AbstractGenerator.class).to(bindAbstractGenerator());
 		binder.bind(IDetailCodeTranslator.class).to(AbstractGenerator.class);
 		
 		binder.bind(ILanguageExtensionBase.class).to(ILanguageExtension.class);
@@ -84,6 +86,12 @@
 		binder.bind(EValidator.Registry.class).toInstance(EValidator.Registry.INSTANCE);
 		binder.bind(org.eclipse.emf.ecore.util.Diagnostician.class).to(GenerationEMFDiagnostician.class).asEagerSingleton();
 	}
+	
+	/**
+	 * Abstract method that retrieves a class to which {@link AbstractGenerator} is bound
+	 * @return a Class extending {@link AbstractGenerator}
+	 */
+	public abstract Class<? extends AbstractGenerator> bindAbstractGenerator();
 
 	/**
 	 * Abstract method that retrieves a class to which {@link ILanguageExtension} is bound