Browse Source

If the target project in the genmodel does not exist, it is created.
for the JavaGenerator, a JavaProject is setup with default classpath entries

Andreas Mülder 13 years ago
parent
commit
f2b0ed4f19

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

@@ -6,11 +6,11 @@ Bundle-Version: 1.0.0.qualifier
 Bundle-Activator: org.yakindu.sct.generator.core.GeneratorActivator
 Bundle-Vendor: YAKINDU
 Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
+ org.eclipse.core.runtime;visibility:=reexport,
  org.yakindu.sct.model.sgen;bundle-version="1.0.0";visibility:=reexport,
  org.yakindu.sct.model.sexec;bundle-version="1.0.0";visibility:=reexport,
  org.eclipse.xpand;bundle-version="1.1.0",
- org.eclipse.core.resources;bundle-version="3.7.100",
+ org.eclipse.core.resources;bundle-version="3.7.100";visibility:=reexport,
  org.eclipse.xtend;bundle-version="1.1.0",
  org.eclipse.xtend.typesystem.emf;bundle-version="1.0.1",
  org.yakindu.sct.model.stext;bundle-version="1.0.0"

+ 17 - 1
plugins/org.yakindu.sct.generator.core/src/org/yakindu/sct/generator/core/impl/AbstractXpandBasedCodeGenerator.java

@@ -77,9 +77,26 @@ public abstract class AbstractXpandBasedCodeGenerator extends
 				OUTLET_FEATURE_TARGET_PROJECT).getValue();
 		IProject project = ResourcesPlugin.getWorkspace().getRoot()
 				.getProject(projectName);
+		if (!project.exists()) {
+			createProject(project, entry);
+		}
 		return project;
 	}
 
+	/**
+	 * The default implementation only creates a new default project. Clients
+	 * may override if they want to contribute generatorspecific project setup
+	 */
+	protected void createProject(IProject project, GeneratorEntry entry) {
+		try {
+			NullProgressMonitor monitor = new NullProgressMonitor();
+			project.create(monitor);
+			project.open(monitor);
+		} catch (CoreException e) {
+			e.printStackTrace();
+		}
+	}
+
 	protected XpandExecutionContext createXpandContext(Output output) {
 		XpandExecutionContextImpl execCtx = new XpandExecutionContextImpl(
 				output, null, Collections.<String, Variable> emptyMap(), null,
@@ -107,7 +124,6 @@ public abstract class AbstractXpandBasedCodeGenerator extends
 		Outlet outlet = new Outlet(absoluteTargetFolder);
 		outlet.setOverwrite(true);
 		output.addOutlet(outlet);
-		System.out.println("Generating to " + absoluteTargetFolder);
 		return output;
 	}
 

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

@@ -17,7 +17,8 @@ Require-Bundle: org.eclipse.jdt.core;bundle-version="3.5.0",
  org.eclipse.xtend;bundle-version="0.7.0",
  org.eclipse.xtend.typesystem.emf;bundle-version="0.7.0",
  org.yakindu.sct.model.stext;bundle-version="1.0.0",
- org.yakindu.sct.generator.core;bundle-version="1.0.0"
+ org.yakindu.sct.generator.core;bundle-version="1.0.0",
+ org.eclipse.jdt.launching;bundle-version="3.6.0"
 Bundle-Vendor: YAKINDU
 Export-Package: org.yakindu.sct.generator.java
 Bundle-ActivationPolicy: lazy

+ 58 - 0
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/JavaSCTGenerator.java

@@ -10,8 +10,27 @@
  */
 package org.yakindu.sct.generator.java;
 
+import static org.yakindu.sct.generator.core.features.ICoreFeatureConstants.OUTLET_FEATURE_TARGET_FOLDER;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.launching.JavaRuntime;
 import org.yakindu.sct.generator.core.ISCTGenerator;
 import org.yakindu.sct.generator.core.impl.AbstractXpandBasedCodeGenerator;
+import org.yakindu.sct.model.sgen.FeatureConfiguration;
+import org.yakindu.sct.model.sgen.FeatureParameterValue;
+import org.yakindu.sct.model.sgen.GeneratorEntry;
 
 /**
  * Implementation of {@link ISCTGenerator} interface registered via extension
@@ -27,4 +46,43 @@ public class JavaSCTGenerator extends AbstractXpandBasedCodeGenerator {
 		return "org::yakindu::sct::generator::java::templates::Main::main";
 	}
 
+	/**
+	 * For Java Generators, we want to create a Project with Java Nature and add
+	 * the target folder to the classpath
+	 */
+	protected void createProject(IProject project, GeneratorEntry entry) {
+		super.createProject(project, entry);
+
+		FeatureConfiguration outletConfig = getOutletFeatureConfiguration(entry);
+		FeatureParameterValue targetFolder = outletConfig
+				.getParameterValue(OUTLET_FEATURE_TARGET_FOLDER);
+
+		try {
+			IProjectDescription description = project.getDescription();
+			description.setNatureIds(new String[] { JavaCore.NATURE_ID });
+			project.setDescription(description, new NullProgressMonitor());
+			IJavaProject javaProject = JavaCore.create(project);
+			// Create bin folder
+			IFolder binDir = project.getFolder("bin");
+			IPath binPath = binDir.getFullPath();
+			javaProject.setOutputLocation(binPath, null);
+			// Set up classpath with default JRE runtime and the target folder
+			javaProject.setRawClasspath(
+					getClasspathEntries(project.getName(),
+							targetFolder.getValue()), null);
+		} catch (CoreException ex) {
+			ex.printStackTrace();
+		}
+	}
+
+	protected IClasspathEntry[] getClasspathEntries(String projectName,
+			String targetFolder) {
+		List<IClasspathEntry> entries = new ArrayList<IClasspathEntry>();
+		entries.add(JavaRuntime.getDefaultJREContainerEntry());
+		IPath sourceFolderPath = new Path(projectName).makeAbsolute().append(
+				targetFolder);
+		entries.add(JavaCore.newSourceEntry(sourceFolderPath));
+		return entries.toArray(new IClasspathEntry[] {});
+	}
+
 }