Bläddra i källkod

Added Builder infrastructure for code generation

Andreas Mülder 14 år sedan
förälder
incheckning
20da3c88e9

+ 3 - 2
plugins/org.yakindu.sct.generator.base/META-INF/MANIFEST.MF

@@ -11,11 +11,12 @@ Require-Bundle: org.eclipse.ui,
  org.yakindu.sct.model.sexec;visibility:=reexport,
  com.google.inject,
  org.eclipse.xpand,
- org.eclipse.core.resources,
+ org.eclipse.core.resources;visibility:=reexport,
  org.eclipse.xtend,
  org.eclipse.emf,
  org.eclipse.xtend.typesystem.emf,
- org.yakindu.sct.model.stext
+ org.yakindu.sct.model.stext,
+ org.yakindu.sct.statechart.builder;bundle-version="1.0.0";visibility:=reexport
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-ActivationPolicy: lazy
 Export-Package: org.yakindu.sct.generator.base,

+ 81 - 0
plugins/org.yakindu.sct.generator.base/src/org/yakindu/sct/generator/base/util/AbstractXpandCodeGeneratorSubscriber.java

@@ -0,0 +1,81 @@
+package org.yakindu.sct.generator.base.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collections;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.xpand2.XpandExecutionContextImpl;
+import org.eclipse.xpand2.XpandFacade;
+import org.eclipse.xpand2.output.Outlet;
+import org.eclipse.xpand2.output.OutputImpl;
+import org.eclipse.xtend.expression.Variable;
+import org.eclipse.xtend.typesystem.emf.EmfRegistryMetaModel;
+import org.yakindu.sct.builder.subscriber.IBuilderSubscriber;
+import org.yakindu.sct.model.sexec.ExecutionFlow;
+import org.yakindu.sct.model.sexec.SexecPackage;
+import org.yakindu.sct.model.sgraph.SGraphPackage;
+import org.yakindu.sct.model.sgraph.Statechart;
+import org.yakindu.sct.model.stext.stext.StextPackage;
+
+/**
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public abstract class AbstractXpandCodeGeneratorSubscriber implements
+		IBuilderSubscriber {
+
+	public abstract String getTemplatePath();
+
+	public abstract String getOutletPath(IResource resource);
+
+	public void doBuild(IResource resource) {
+		try {
+			IProject project = resource.getProject();
+			Statechart statechart = GeneratorBaseUtil.loadStatechart(resource);
+			ExecutionFlow executionFlow = GeneratorBaseUtil
+					.createExecutionFlowModel(statechart);
+			String absoluteTargetFolder = ResourcesPlugin.getWorkspace()
+					.getRoot().getLocation().toOSString()
+					+ File.separator
+					+ project.getFullPath().toOSString()
+					+ File.separator + getOutletPath(resource);
+
+			OutputImpl output = new OutputImpl();
+			Outlet outlet = new Outlet(absoluteTargetFolder);
+			outlet.setOverwrite(true);
+			output.addOutlet(outlet);
+
+			XpandExecutionContextImpl execCtx = new XpandExecutionContextImpl(
+					output, null, Collections.<String, Variable> emptyMap(),
+					null, null);
+			EmfRegistryMetaModel metamodel = new EmfRegistryMetaModel() {
+				@Override
+				protected EPackage[] allPackages() {
+					return new EPackage[] { SGraphPackage.eINSTANCE,
+							StextPackage.eINSTANCE, EcorePackage.eINSTANCE,
+							SexecPackage.eINSTANCE };
+				}
+			};
+			execCtx.registerMetaModel(metamodel);
+			// generate
+			XpandFacade facade = XpandFacade.create(execCtx);
+			facade.evaluate(getTemplatePath(), executionFlow);
+			// refresh the project to get external updates:
+			project.refreshLocal(IResource.DEPTH_INFINITE,
+					new NullProgressMonitor());
+		} catch (IOException ex) {
+			ex.printStackTrace();
+		} catch (CoreException e) {
+			e.printStackTrace();
+		}
+
+	}
+}

+ 26 - 59
plugins/org.yakindu.sct.generator.base/src/org/yakindu/sct/generator/base/util/GeneratorBaseUtil.java

@@ -1,36 +1,20 @@
 package org.yakindu.sct.generator.base.util;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.Collections;
 
-import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EcorePackage;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.Resource.Factory;
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.resource.impl.ResourceFactoryRegistryImpl;
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-import org.eclipse.xpand2.XpandExecutionContextImpl;
-import org.eclipse.xpand2.XpandFacade;
-import org.eclipse.xpand2.output.Outlet;
-import org.eclipse.xpand2.output.OutputImpl;
-import org.eclipse.xtend.expression.Variable;
-import org.eclipse.xtend.typesystem.emf.EmfRegistryMetaModel;
 import org.yakindu.sct.model.sexec.ExecutionFlow;
-import org.yakindu.sct.model.sexec.SexecPackage;
 import org.yakindu.sct.model.sexec.transformation.ModelSequencer;
 import org.yakindu.sct.model.sexec.transformation.SequencerModule;
-import org.yakindu.sct.model.sgraph.SGraphPackage;
 import org.yakindu.sct.model.sgraph.Statechart;
-import org.yakindu.sct.model.stext.stext.StextPackage;
 
 import com.google.inject.Guice;
 import com.google.inject.Injector;
@@ -46,16 +30,36 @@ public class GeneratorBaseUtil {
 	 * Loads a {@link Statechart} model via the registered resource for a given
 	 * {@link URI}
 	 */
-	public static Statechart loadStatechart(URI uri) throws IOException {
-		Factory factory = ResourceFactoryRegistryImpl.INSTANCE.getFactory(uri);
-		ResourceSet resourceSet = new ResourceSetImpl();
-		Resource resource = factory.createResource(uri);
-		resourceSet.getResources().add(resource);
-		resource.load(Collections.emptyMap());
+	public static Statechart loadStatechart(IResource resource)
+			throws IOException {
+		URI uri = URI.createPlatformResourceURI(resource.getFullPath()
+				.toString(), true);
+		return loadStatechart(uri);
+	}
+
+	/**
+	 * Loads a {@link Statechart} model via the registered resource for a given
+	 * {@link URI}
+	 */
+	public static Statechart loadStatechart(URI uri) {
+		Resource resource = loadResource(uri);
 		Statechart statechart = (Statechart) resource.getContents().get(0);
 		Assert.isNotNull(statechart);
 		return statechart;
+	}
 
+	public static Resource loadResource(URI uri) {
+		Factory factory = ResourceFactoryRegistryImpl.INSTANCE.getFactory(uri);
+		ResourceSet resourceSet = new ResourceSetImpl();
+		Resource resource = factory.createResource(uri);
+		resourceSet.getResources().add(resource);
+		try {
+			resource.load(Collections.emptyMap());
+		} catch (IOException e) {
+			e.printStackTrace();
+			return null;
+		}
+		return resource;
 	}
 
 	/**
@@ -68,41 +72,4 @@ public class GeneratorBaseUtil {
 		Assert.isNotNull(flow);
 		return flow;
 	}
-
-	/**
-	 * Invokes the Template engine to generate resources
-	 */
-	public static void generate(ExecutionFlow flow, String templatePath,
-			IProject project, String targetFolder) throws CoreException {
-
-		String absoluteTargetFolder = ResourcesPlugin.getWorkspace().getRoot()
-				.getLocation().toOSString()
-				+ File.separator
-				+ project.getFullPath().toOSString()
-				+ File.separator + targetFolder;
-
-		OutputImpl output = new OutputImpl();
-		Outlet outlet = new Outlet(absoluteTargetFolder);
-		outlet.setOverwrite(true);
-		output.addOutlet(outlet);
-
-		XpandExecutionContextImpl execCtx = new XpandExecutionContextImpl(
-				output, null, Collections.<String, Variable> emptyMap(), null,
-				null);
-		EmfRegistryMetaModel metamodel = new EmfRegistryMetaModel() {
-			@Override
-			protected EPackage[] allPackages() {
-				return new EPackage[] { SGraphPackage.eINSTANCE,
-						StextPackage.eINSTANCE, EcorePackage.eINSTANCE,
-						SexecPackage.eINSTANCE };
-			}
-		};
-		execCtx.registerMetaModel(metamodel);
-		// generate
-		XpandFacade facade = XpandFacade.create(execCtx);
-		facade.evaluate(templatePath, flow);
-		// refresh the project to get external updates:
-		project.refreshLocal(IResource.DEPTH_INFINITE,
-				new NullProgressMonitor());
-	}
 }

+ 3 - 2
plugins/org.yakindu.sct.generator.cpp/META-INF/MANIFEST.MF

@@ -1,7 +1,7 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: Yakindu SCT C++ Generator
-Bundle-SymbolicName: org.yakindu.sct.generator.cpp; singleton:=true
+Bundle-SymbolicName: org.yakindu.sct.generator.cpp;singleton:=true
 Bundle-Version: 1.0.0.qualifier
 Require-Bundle: org.yakindu.sct.model.sexec,
  org.eclipse.jdt.core,
@@ -17,7 +17,8 @@ Require-Bundle: org.yakindu.sct.model.sexec,
  org.eclipse.xpand,
  org.eclipse.xtend,
  org.eclipse.xtend.typesystem.emf,
- org.yakindu.sct.model.stext
+ org.yakindu.sct.model.stext,
+ org.yakindu.sct.generator.base;bundle-version="1.0.0"
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Export-Package: org.yakindu.sct.generator.cpp.templates
 Bundle-Vendor: YAKINDU

+ 3 - 1
plugins/org.yakindu.sct.generator.cpp/build.properties

@@ -1,2 +1,4 @@
 source.. = src/
-bin.includes = META-INF/,.
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml

+ 11 - 0
plugins/org.yakindu.sct.generator.cpp/plugin.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+   <extension
+         point="org.yakindu.sct.builder.subscriber">
+      <BuilderSubscriber
+            class="org.yakindu.sct.generator.cpp.subscriber.CppCodeGeneratorSubscriber"
+            resourceExtension="sct">
+      </BuilderSubscriber>
+   </extension>
+</plugin>

+ 27 - 0
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/subscriber/CppCodeGeneratorSubscriber.java

@@ -0,0 +1,27 @@
+package org.yakindu.sct.generator.cpp.subscriber;
+
+import java.io.File;
+
+import org.eclipse.core.resources.IResource;
+import org.yakindu.sct.generator.base.util.AbstractXpandCodeGeneratorSubscriber;
+
+/**
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public class CppCodeGeneratorSubscriber extends
+		AbstractXpandCodeGeneratorSubscriber {
+
+	@Override
+	public String getTemplatePath() {
+		return "org::yakindu::sct::generator::cpp::templates::Main::main";
+	}
+
+	@Override
+	public String getOutletPath(IResource resource) {
+		return "src-gen" + File.separator
+				+ resource.getName().replaceAll(" ", "");
+	}
+
+}