Quellcode durchsuchen

decoupled workspace access from generator core plugin

Andreas Muelder vor 9 Jahren
Ursprung
Commit
8da5ed0e42

+ 34 - 0
plugins/org.yakindu.sct.generator.builder/src/org/yakindu/sct/generator/builder/GenModelLoader.java

@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2016 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.generator.builder;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.yakindu.sct.model.sgen.GeneratorModel;
+
+/**
+ * 
+ * @author andreas muelder - Initial contribution and API
+ */
+public class GenModelLoader {
+
+	public static GeneratorModel load(IFile file) {
+		Resource resource = null;
+		URI uri = URI.createPlatformResourceURI(file.getFullPath().toString(), true);
+		resource = new ResourceSetImpl().getResource(uri, true);
+		if (resource == null || resource.getContents().size() == 0 || resource.getErrors().size() > 0)
+			return null;
+		final GeneratorModel model = (GeneratorModel) resource.getContents().get(0);
+		return model;
+	}
+}

+ 0 - 109
plugins/org.yakindu.sct.generator.builder/src/org/yakindu/sct/generator/builder/GeneratorExecutor.java

@@ -1,109 +0,0 @@
-/**
- * Copyright (c) 2011 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.generator.builder;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.yakindu.base.types.typesystem.AbstractTypeSystem;
-import org.yakindu.base.types.typesystem.ITypeSystem;
-import org.yakindu.sct.domain.extension.DomainRegistry;
-import org.yakindu.sct.domain.extension.IDomainDescriptor;
-import org.yakindu.sct.generator.core.ISCTGenerator;
-import org.yakindu.sct.generator.core.extensions.GeneratorExtensions;
-import org.yakindu.sct.generator.core.extensions.IGeneratorDescriptor;
-import org.yakindu.sct.generator.core.impl.AbstractSGraphModelGenerator;
-import org.yakindu.sct.model.sgen.GeneratorEntry;
-import org.yakindu.sct.model.sgen.GeneratorModel;
-
-import com.google.inject.Injector;
-import com.google.inject.Module;
-
-/**
- * 
- * @author andreas muelder - Initial contribution and API
- * @author holger willebrandt - refactoring
- * @author markus mühlbrandt - added executeGenerator for generator models
- */
-public class GeneratorExecutor {
-
-	public void executeGenerator(IFile file) {
-		Resource resource = loadResource(file);
-		if (resource == null || resource.getContents().size() == 0 || resource.getErrors().size() > 0)
-			return;
-		final GeneratorModel model = (GeneratorModel) resource.getContents().get(0);
-
-
-		Job generatorJob = new Job("Execute SCT Genmodel " + file.getName()) {
-			@Override
-			protected IStatus run(IProgressMonitor monitor) {
-				executeGenerator(model);
-				return Status.OK_STATUS;
-			}
-		};
-		generatorJob.setRule(file.getProject().getWorkspace().getRuleFactory().buildRule());
-		generatorJob.schedule();
-	}
-
-	public void executeGenerator(GeneratorModel model) {
-
-		final EList<GeneratorEntry> entries = model.getEntries();
-
-		for (GeneratorEntry generatorEntry : entries) {
-			final ISCTGenerator generator = getGenerator(model, generatorEntry);
-			generator.generate(generatorEntry);
-		}
-	}
-
-	protected ISCTGenerator getGenerator(GeneratorModel model, GeneratorEntry entry) {
-		String generatorId = model.getGeneratorId();
-		IGeneratorDescriptor description = GeneratorExtensions.getGeneratorDescriptor(generatorId);
-		if (description == null)
-			throw new RuntimeException("No generator registered for ID: " + generatorId);
-		final ISCTGenerator generator = description.createGenerator();
-		if (generator == null)
-			throw new RuntimeException("Failed to create Generator instance for ID:" + generatorId);
-		IDomainDescriptor domainDescriptor = DomainRegistry.getDomainDescriptor(entry.getElementRef());
-		Module overridesModule = null;
-		if (generator instanceof AbstractSGraphModelGenerator) {
-			overridesModule = ((AbstractSGraphModelGenerator) generator).getOverridesModule(entry);
-		}
-		Injector injector = domainDescriptor.getDomainInjectorProvider().getGeneratorInjector(model.getGeneratorId(),
-				overridesModule);
-		injector.injectMembers(generator);
-		
-		// TODO: refactor location for adding type system resource.
-		ITypeSystem typeSystem = injector.getInstance(ITypeSystem.class);
-		if (typeSystem instanceof AbstractTypeSystem) {
-			ResourceSet set = entry.getElementRef().eResource().getResourceSet();
-			set.getResources().add(((AbstractTypeSystem) typeSystem).getResource());
-			EcoreUtil.resolveAll(set);
-		}
-
-		return generator;
-	}
-
-	protected Resource loadResource(IFile file) {
-		Resource resource = null;
-		URI uri = URI.createPlatformResourceURI(file.getFullPath().toString(), true);
-		resource = new ResourceSetImpl().getResource(uri, true);
-		return resource;
-	}
-
-}

+ 17 - 1
plugins/org.yakindu.sct.generator.builder/src/org/yakindu/sct/generator/builder/SCTBuilder.java

@@ -13,6 +13,7 @@ package org.yakindu.sct.generator.builder;
 import java.util.Map;
 import java.util.Set;
 
+import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
@@ -25,6 +26,7 @@ import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.common.util.WrappedException;
 import org.eclipse.emf.ecore.EObject;
@@ -34,6 +36,7 @@ import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.yakindu.sct.generator.core.GeneratorActivator;
+import org.yakindu.sct.generator.core.execution.GeneratorExecutor;
 import org.yakindu.sct.model.sgen.GeneratorEntry;
 import org.yakindu.sct.model.sgen.GeneratorModel;
 import org.yakindu.sct.model.sgraph.Statechart;
@@ -213,7 +216,20 @@ public class SCTBuilder extends IncrementalProjectBuilder {
 	}
 
 	protected void executeGenmodelGenerator(IResource resource) {
-		new GeneratorExecutor().executeGenerator(resource.getProject().getFile(resource.getProjectRelativePath()));
+		IFile file = resource.getProject().getFile(resource.getProjectRelativePath());
+		final GeneratorModel model = GenModelLoader
+				.load(file);
+		if (model != null) {
+			Job generatorJob = new Job("Execute SCT Genmodel " + file.getName()) {
+				@Override
+				protected IStatus run(IProgressMonitor monitor) {
+					new GeneratorExecutor().executeGenerator(model);
+					return Status.OK_STATUS;
+				}
+			};
+			generatorJob.setRule(file.getProject().getWorkspace().getRuleFactory().buildRule());
+			generatorJob.schedule();
+		}
 	}
 
 	protected void logGenmodelError(String resource) {

+ 18 - 5
plugins/org.yakindu.sct.generator.builder/src/org/yakindu/sct/generator/builder/action/GenerateModelAction.java

@@ -14,8 +14,10 @@ import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.emf.common.util.Diagnostic;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.resource.Resource;
@@ -31,8 +33,10 @@ import org.eclipse.ui.IObjectActionDelegate;
 import org.eclipse.ui.IWorkbenchPart;
 import org.eclipse.ui.PlatformUI;
 import org.yakindu.sct.generator.builder.BuilderActivator;
-import org.yakindu.sct.generator.builder.GeneratorExecutor;
+import org.yakindu.sct.generator.builder.GenModelLoader;
 import org.yakindu.sct.generator.core.GeneratorActivator;
+import org.yakindu.sct.generator.core.execution.GeneratorExecutor;
+import org.yakindu.sct.model.sgen.GeneratorModel;
 
 /**
  * 
@@ -43,10 +47,7 @@ public class GenerateModelAction implements IObjectActionDelegate {
 
 	private ISelection selection;
 
-	private GeneratorExecutor generatorExecutor;
-	
 	public GenerateModelAction() {
-		generatorExecutor = new GeneratorExecutor();
 	}
 
 	public void run(IAction action) {
@@ -58,7 +59,19 @@ public class GenerateModelAction implements IObjectActionDelegate {
 					new Status(IStatus.ERROR, GeneratorActivator.PLUGIN_ID, "The file contains errors"));
 			return;
 		}
-		generatorExecutor.executeGenerator(file);
+		final GeneratorModel model = GenModelLoader.load(file);
+		if (model != null) {
+			Job generatorJob = new Job("Execute SCT Genmodel " + file.getName()) {
+				@Override
+				protected IStatus run(IProgressMonitor monitor) {
+					new GeneratorExecutor().executeGenerator(model);
+					return Status.OK_STATUS;
+				}
+			};
+			generatorJob.setRule(file.getProject().getWorkspace().getRuleFactory().buildRule());
+			generatorJob.schedule();
+
+		}
 	}
 
 	private boolean hasError(IFile file) {

+ 2 - 1
plugins/org.yakindu.sct.generator.core/META-INF/MANIFEST.MF

@@ -17,9 +17,10 @@ Require-Bundle: org.yakindu.sct.model.sexec;visibility:=reexport,
 Bundle-RequiredExecutionEnvironment: JavaSE-1.7
 Bundle-ActivationPolicy: lazy
 Export-Package: org.yakindu.sct.generator.core,
+ org.yakindu.sct.generator.core.execution,
  org.yakindu.sct.generator.core.extensions,
- org.yakindu.sct.generator.core.library.impl,
  org.yakindu.sct.generator.core.filesystem,
  org.yakindu.sct.generator.core.impl,
  org.yakindu.sct.generator.core.library,
+ org.yakindu.sct.generator.core.library.impl,
  org.yakindu.sct.generator.core.types

+ 1 - 2
plugins/org.yakindu.sct.generator.genmodel/META-INF/MANIFEST.MF

@@ -19,8 +19,7 @@ Require-Bundle: org.eclipse.xtext;visibility:=reexport,
  org.eclipse.core.runtime,
  org.yakindu.sct.generator.core;visibility:=reexport,
  org.yakindu.sct.model.sgen;visibility:=reexport,
- org.yakindu.base.types,
- org.eclipse.emf.workspace
+ org.yakindu.base.types
 Import-Package: org.apache.log4j,
  org.apache.commons.logging,
  org.eclipse.xtext.xbase.lib

+ 1 - 3
plugins/org.yakindu.sct.generator.java/META-INF/MANIFEST.MF

@@ -5,9 +5,7 @@ Bundle-SymbolicName: org.yakindu.sct.generator.java;singleton:=true
 Bundle-Version: 2.7.1.qualifier
 Require-Bundle: org.yakindu.sct.model.stext,
  org.yakindu.sct.generator.core,
- org.yakindu.sct.generator.genmodel,
- org.yakindu.sct.model.resource,
- org.eclipse.xpand
+ org.yakindu.sct.generator.genmodel
 Bundle-Vendor: statecharts.org
 Export-Package: org.yakindu.sct.generator.java,
  org.yakindu.sct.generator.java.features,

+ 0 - 46
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/Beautifier.java

@@ -1,46 +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.generator.java;
-
-import java.io.File;
-
-import org.eclipse.xpand2.output.FileHandle;
-import org.eclipse.xpand2.output.FileHandleImpl;
-import org.eclipse.xpand2.output.JavaBeautifier;
-import org.eclipse.xpand2.output.Outlet;
-
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
-@Singleton
-public class Beautifier {
-
-	@Inject
-	JavaBeautifier javaBeautifier;
-
-	/**
-	 * Format code with PostProcessor (XPand style).
-	 */
-	public CharSequence format(String fileName, CharSequence code) {
-
-		// create fileHandle with dummy outlet.
-		File file = new File(fileName);
-		FileHandle fileHandle = new FileHandleImpl(new Outlet(), file);
-		fileHandle.setBuffer(code);
-
-		// call postProcessor for formatting the code.
-		javaBeautifier.beforeWriteAndClose(fileHandle);
-
-		// return formatted results.
-		return fileHandle.getBuffer();
-
-	}
-}

+ 1 - 3
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/Statemachine.xtend

@@ -39,11 +39,9 @@ class Statemachine {
 	@Inject protected extension FlowCode
 	@Inject protected extension StateVectorExtensions
 	
-	@Inject Beautifier beautifier
-	
 	def generateStatemachine(ExecutionFlow flow, GeneratorEntry entry, IFileSystemAccess fsa) {
 		var filename = flow.getImplementationPackagePath(entry) + '/' + flow.statemachineClassName.java
-		var content = beautifier.format(filename, content(flow, entry))
+		var content = content(flow, entry)
 		fsa.generateFile(filename, content)
 	}
 	

+ 1 - 2
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/StatemachineInterface.xtend

@@ -35,13 +35,12 @@ class StatemachineInterface {
 	@Inject extension ITypeSystem
 	@Inject extension ICodegenTypeSystemAccess
 	@Inject extension ExpressionCode
-	@Inject Beautifier beautifier
 
 	@Inject ICoreLibraryHelper outletFeatureHelper
 
 	def generateStatemachineInterface(ExecutionFlow flow, GeneratorEntry entry, IFileSystemAccess fsa) {
 		var filename = flow.getImplementationPackagePath(entry) + '/' + flow.statemachineInterfaceName.java
-		var content = beautifier.format(filename, content(flow, entry))
+		var content = content(flow, entry)
 		if (outletFeatureHelper.getApiTargetFolderValue(entry) != null) {
 			// generate into API target folder in case one is specified, as it is an interface
 			fsa.generateFile(filename, API_TARGET_FOLDER_OUTPUT, content)

+ 1 - 1
test-plugins/org.yakindu.sct.generator.c.test/src/org/yakindu/sct/generator/c/gtest/GTestHelper.java

@@ -37,7 +37,7 @@ import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.FrameworkUtil;
-import org.yakindu.sct.generator.builder.GeneratorExecutor;
+import org.yakindu.sct.generator.core.execution.GeneratorExecutor;
 import org.yakindu.sct.model.sgen.GeneratorModel;
 import org.yakindu.sct.model.sgraph.Statechart;
 import org.yakindu.sct.test.models.SCTUnitTestModels;