Преглед изворни кода

YAKHMI-605 Add target folder of generated code to java build path if not done previously
+Changed name of Java-Generator Feature from "naming" to "javaTarget"

malknet42 пре 12 година
родитељ
комит
ade3d2be88

+ 78 - 0
plugins/org.yakindu.sct.generator.core/src/org/yakindu/sct/generator/core/util/ClasspathChanger.java

@@ -0,0 +1,78 @@
+/**
+ * Copyright (c) 2014 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.core.util;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+
+/**
+ * Source:
+ * http://stackoverflow.com/questions/7993838/programmatically-add-source
+ * -folder-from-eclipse-plugin
+ * 
+ * @author oliver bohl
+ * 
+ */
+
+public class ClasspathChanger {
+
+	public void addFolderToClassPath(IProject project, String folder) {
+
+		if (!isPartOfClassPath(project, folder)) {
+			IJavaProject javaProject = JavaCore.create(project);
+			IClasspathEntry[] entries = null;
+
+			try {
+				entries = javaProject.getRawClasspath();
+			} catch (JavaModelException e) {
+				e.printStackTrace();
+			}
+
+			IClasspathEntry[] newEntries = new IClasspathEntry[entries.length + 1];
+			System.arraycopy(entries, 0, newEntries, 0, entries.length);
+
+			IPath srcPath = javaProject.getPath().append(folder);
+			IClasspathEntry srcEntry = JavaCore.newSourceEntry(srcPath, null);
+
+			newEntries[entries.length] = JavaCore.newSourceEntry(srcEntry.getPath());
+
+			try {
+				javaProject.setRawClasspath(newEntries, null);
+			} catch (JavaModelException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+	public boolean isPartOfClassPath(IProject project, String folder) {
+
+		IJavaProject javaProject = JavaCore.create(project);
+		IClasspathEntry[] entries = null;
+
+		try {
+			entries = javaProject.getRawClasspath();
+		} catch (JavaModelException e) {
+			e.printStackTrace();
+		}
+
+		for (IClasspathEntry entry : entries) {
+			String projectString = "/" + project.getName() + "/" + folder;
+			if (entry.getPath().toString().equals(projectString)) {
+				return true;
+			}
+		}
+		return false;
+	}
+}

+ 10 - 0
plugins/org.yakindu.sct.generator.core/src/org/yakindu/sct/generator/core/util/GeneratorUtils.java

@@ -1,3 +1,13 @@
+/**
+ * Copyright (c) 2014 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.core.util;
 
 import static org.yakindu.sct.generator.core.features.ISCTBaseFeatureConstants.DEBUG_FEATURE;

+ 1 - 1
plugins/org.yakindu.sct.generator.java/library/FeatureTypeLibrary.xmi

@@ -6,7 +6,7 @@
     xmlns:sgen="http://www.yakindu.org/sct/statechart/SGen"
     xsi:schemaLocation="http://www.yakindu.org/sct/statechart/SGen ../../org.yakindu.sct.model.sgen/model/emf/sgen.ecore"
     name="Java Generator">
-  <types name="Naming"
+  <types name="JavaTargetFeatures"
       optional="true">
     <parameters
         name="basePackage"/>

+ 66 - 0
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/AbstractJavaCodeGenerator.java

@@ -0,0 +1,66 @@
+/**
+ * Copyright (c) 2014 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 org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.core.JavaCore;
+import org.yakindu.sct.generator.core.features.ICoreFeatureConstants;
+import org.yakindu.sct.generator.core.impl.GenericJavaBasedGenerator;
+import org.yakindu.sct.generator.core.util.ClasspathChanger;
+import org.yakindu.sct.generator.core.util.GeneratorUtils;
+import org.yakindu.sct.model.sgen.FeatureConfiguration;
+import org.yakindu.sct.model.sgen.GeneratorEntry;
+import org.yakindu.sct.model.sgraph.Statechart;
+
+abstract public class AbstractJavaCodeGenerator extends GenericJavaBasedGenerator {
+
+	abstract public void generate(Statechart statechart, GeneratorEntry entry);
+
+	private ClasspathChanger classpathChanger = new ClasspathChanger();
+
+	@Override
+	public final void runGenerator(Statechart statechart, GeneratorEntry entry) {
+
+		IProject project = GeneratorUtils.getTargetProject(entry);
+
+		if (hasJavaNature(project) && hasClasspath(project)) {
+			IProject targetProject = GeneratorUtils.getTargetProject(entry);
+			String targetFolderString = getTargetFolderString(entry);
+			classpathChanger.addFolderToClassPath(targetProject, targetFolderString);
+		}
+		generate(statechart, entry);
+	}
+
+	public String getTargetFolderString(GeneratorEntry entry) {
+		FeatureConfiguration outletConfig = entry.getFeatureConfiguration(ICoreFeatureConstants.OUTLET_FEATURE);
+		String projectName = outletConfig.getParameterValue(ICoreFeatureConstants.OUTLET_FEATURE_TARGET_FOLDER)
+				.getStringValue();
+		return projectName;
+	}
+
+	public boolean hasJavaNature(IProject project) {
+		try {
+			String[] natures = project.getDescription().getNatureIds();
+			for (String s : natures) {
+				if (s.equals(JavaCore.NATURE_ID))
+					return true;
+			}
+		} catch (CoreException e1) {
+			e1.printStackTrace();
+		}
+		return false;
+	}
+
+	public boolean hasClasspath(IProject project) {
+		return project.getFile(".classpath").exists();
+	}
+}

+ 4 - 4
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/GenmodelEntries.xtend

@@ -24,8 +24,8 @@ class GenmodelEntries {
 		getFeatureConfiguration(ICoreFeatureConstants::LICENSE_HEADER)
 	}
 	
-	def private getNamingFeature(GeneratorEntry it) {
-		getFeatureConfiguration(IJavaFeatureConstants::NAMING_FEATURE)
+	def private getJavaTargetFeature(GeneratorEntry it) {
+		getFeatureConfiguration(IJavaFeatureConstants::JAVA_TARGET_FEATURE)
 	}
 	
 	def private getGeneralFeatures(GeneratorEntry it) {
@@ -33,11 +33,11 @@ class GenmodelEntries {
 	}
 	
 	def private FeatureParameterValue getBasePackageParameter(GeneratorEntry it) {
-		namingFeature?.getParameterValue(IJavaFeatureConstants::BASE_PACKAGE)
+		javaTargetFeature?.getParameterValue(IJavaFeatureConstants::BASE_PACKAGE)
 	}
 	
 	def private FeatureParameterValue getImplementationSuffixParameter(GeneratorEntry it) {
-		namingFeature?.getParameterValue(IJavaFeatureConstants::IMPLEMENTATION_SUFFIX)
+		javaTargetFeature?.getParameterValue(IJavaFeatureConstants::IMPLEMENTATION_SUFFIX)
 	}
 	
 	def private FeatureParameterValue getLicenseTextParameter(GeneratorEntry it) {

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

@@ -11,7 +11,6 @@ package org.yakindu.sct.generator.java;
 
 import static org.yakindu.sct.generator.core.util.GeneratorUtils.isDumpSexec;
 
-import org.yakindu.sct.generator.core.impl.GenericJavaBasedGenerator;
 import org.yakindu.sct.generator.core.types.ICodegenTypeSystemAccess;
 import org.yakindu.sct.generator.java.types.JavaTypeSystemAccess;
 import org.yakindu.sct.generator.java.types.OldJavaTypeSystemAccess;
@@ -23,10 +22,10 @@ import com.google.inject.Binder;
 import com.google.inject.Module;
 import com.google.inject.util.Modules;
 
-public class JavaCodeGenerator extends GenericJavaBasedGenerator {
+public class JavaCodeGenerator extends AbstractJavaCodeGenerator {
 	
 	@Override
-	public void runGenerator(Statechart statechart, GeneratorEntry entry) {
+	public void generate(Statechart statechart, GeneratorEntry entry) {
 		JavaGenerator delegate = getInjector(entry).getInstance(
 				JavaGenerator.class);
 		
@@ -55,4 +54,5 @@ public class JavaCodeGenerator extends GenericJavaBasedGenerator {
 			}
 		});
 	}
+
 }

+ 1 - 1
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/features/IJavaFeatureConstants.java

@@ -19,7 +19,7 @@ public interface IJavaFeatureConstants {
 
 	public static final String LIBRARY_NAME = "Java Generator";
 
-	public static final String NAMING_FEATURE = "Naming";
+	public static final String JAVA_TARGET_FEATURE = "JavaTargetFeatures";
 
 	public static final String BASE_PACKAGE = "basePackage";
 

+ 3 - 3
plugins/org.yakindu.sct.generator.java/src/org/yakindu/sct/generator/java/features/JavaFeatureConstants.java

@@ -18,8 +18,8 @@ import static org.yakindu.sct.generator.core.features.ICoreFeatureConstants.LICE
  */
 public final class JavaFeatureConstants implements IJavaFeatureConstants {
 	
-	public static final String getNamingFeature() {
-		return NAMING_FEATURE;
+	public static final String getJavaTargetFeature() {
+		return JAVA_TARGET_FEATURE;
 	}
 	
 	public static final String getBasePackage() {
@@ -29,7 +29,7 @@ public final class JavaFeatureConstants implements IJavaFeatureConstants {
 	public static final String getImplementationSuffix() {
 		return IMPLEMENTATION_SUFFIX;
 	}
-	
+		
 	public static final String getLicenseHeader() {
 		return LICENSE_HEADER;
 	}