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

XPand Generator Wizard creates FeatureTypeLibrary

holger.willebrandt@gmail.com пре 14 година
родитељ
комит
a8f28261ad

+ 1 - 3
plugins/org.yakindu.sct.generator.genmodel.ui/src/org/yakindu/sct/generator/genmodel/ui/wizard/XpandGeneratorWizardPage1.java

@@ -113,12 +113,10 @@ public class XpandGeneratorWizardPage1 extends WizardPage {
 		GridDataFactory.fillDefaults().grab(true, false)
 				.applyTo(txtGeneratorDesc);
 
-		// TODO : implement Feature Type Library generation
 		Label lblLibraryCheckBox = new Label(generatorGroup, SWT.WRAP);
 		lblLibraryCheckBox.setText("Create Fetaure Library");
-		lblLibraryCheckBox.setVisible(false);
+
 		cbLibrary = new Button(generatorGroup, SWT.CHECK);
-		cbLibrary.setVisible(false);
 
 		setGeneratorGroupEnabled(false);
 		setPageComplete(false);

+ 74 - 16
plugins/org.yakindu.sct.generator.genmodel.ui/src/org/yakindu/sct/generator/genmodel/ui/wizard/XpandProjectTemplate.xtend

@@ -33,7 +33,12 @@ import org.eclipse.core.resources.IProject
 import org.eclipse.core.runtime.SubProgressMonitor
 import java.io.ByteArrayOutputStream
 import java.io.BufferedInputStream
-
+import org.yakindu.sct.model.sgen.SGenFactory
+import org.yakindu.sct.model.sgen.ParameterTypes
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.emf.common.util.URI
+import java.util.Collections
 
 /**
  * 
@@ -48,7 +53,7 @@ class XpandProjectTemplate {
 	}
 
 	def generate(ProjectData data) {
-		monitor.beginTask("Create YAKINDU Xpand Generator Project", 12);
+		monitor.beginTask("Create YAKINDU Xpand Generator Project", 15);
 		val project = ResourcesPlugin::workspace.root.getProject(data.projectName);
 		project.create(monitor.sub)
 		project.open(monitor.sub)
@@ -56,17 +61,24 @@ class XpandProjectTemplate {
 		project.createFolder('src')
 		project.getFile('.settings/org.eclipse.core.resources.prefs')
 			.write(data.projectSettings(ResourcesPlugin::encoding))
-		project.getFile('.settings/org.eclipse.xtend.shared.ui.prefs').write(data.xpandSettings)
+		project.getFile('.settings/org.eclipse.xtend.shared.ui.prefs')
+			.write(data.xpandSettings)
 		project.getFile('build.properties').write(data.buildProperties)
 		project.getFile('META-INF/MANIFEST.MF').write(data.manifest)
 		project.getFile('src/'+data.targetPackage.asFolder+'/'+data.templateName+'.xpt').
 			write(resource('XpandDefaultTemplate.xpt'.fromMyFolder,'iso-8859-1'))
 		if (data.pluginExport) {
 			project.getFile('plugin.xml').write(data.plugin)
-			project.getFile('src/'+data.generatorClass.javaFilename).write(data.generator)
+			project.getFile('src/'+data.generatorClass.javaFilename)
+				.write(data.generator)
 			if (data.typeLibrary) {
 				project.createFolder('library')
-				//TODO create FeatureTypeLibrary.xmi
+				project.getFile('library/FeatureTypeLibrary.xmi')
+					.write(data.featureLibrary)
+				project.getFile('src/'+data.providerClass.javaFilename)
+					.write(data.defaultProvider)
+				project.getFile('src/'+data.libraryConstantsClass.javaFilename)
+					.write(data.libraryConstants)
 			}	
 		}
 		project.getFile('.classpath').write(data.classpath);
@@ -114,11 +126,37 @@ class XpandProjectTemplate {
 	def providerClass(ProjectData data){
 		data.generatorClass+'DefaultValueProvider'
 	}
+
+	def libraryConstantsClass(ProjectData data){
+		data.providerClass.packageName+'.IFeatureConstants'
+	}
 	
 	def javaFilename(String s) {
 		s.replaceAll('\\.','/')+'.java'
 	}
 	
+	def featureLibrary(ProjectData data) {
+		val factory = SGenFactory::eINSTANCE
+		val lib = factory.createFeatureTypeLibrary
+		lib.name=data.generatorName
+		val type = factory.createFeatureType
+		type.name='MyFeature'
+		val parameter = factory.createFeatureParameter
+		parameter.name='MyParameter'
+		parameter.parameterType=ParameterTypes::STRING
+		type.parameters.add(parameter)
+		lib.types.add(type)
+		return lib		
+	}
+	
+	def write(IFile file, EObject object) {
+		val uri = URI::createPlatformResourceURI(file.fullPath.toString,true)
+		val resourceSet = new ResourceSetImpl()
+		val resource = resourceSet.createResource(uri)
+		resource.contents.add(object)
+		resource.save(Collections::emptyMap)
+	}
+	
 	def write(IFile file, StringConcatenation content) {
 		file.write(content.toString)
 	}
@@ -298,34 +336,54 @@ class XpandProjectTemplate {
 	def defaultProvider(ProjectData data) '''
 		package «data.providerClass.packageName»;
 		
+		import static «data.libraryConstantsClass».LIBRARY_NAME;
+		import static «data.libraryConstantsClass».MY_PARAMETER;
+		
+		import org.eclipse.core.runtime.IStatus;
+		import org.eclipse.core.runtime.Status;
 		import org.yakindu.sct.generator.core.features.AbstractDefaultFeatureValueProvider;
+		import org.yakindu.sct.model.sgen.FeatureParameterValue;
+		import org.yakindu.sct.model.sgen.FeatureTypeLibrary;
+		import org.yakindu.sct.model.sgraph.Statechart;
 		
 		/**
-		 * Default value proivder for «data.generatorName» feature library
+		 * Default value provider for «data.generatorName» feature library
 		 */
 		public class «data.providerClass.simpleName» extends AbstractDefaultFeatureValueProvider {
 		
-			private static final String LIBRARY_NAME = "«data.generatorName»";
-			
+
+			public boolean isProviderFor(FeatureTypeLibrary library) {
+				return library.getName().equals(LIBRARY_NAME);
+			}
+
 			@Override
 			protected void setDefaultValue(FeatureParameterValue parameterValue,
 					Statechart statechart) {
 				String parameterName = parameterValue.getParameter().getName();
-				//TODO: set the default values
-			}
-		
-			public boolean isProviderFor(FeatureTypeLibrary library) {
-				return library.getName().equals(LIBRARY_NAME);
+				if (MY_PARAMETER.equals(parameterName)) {
+					parameterValue.setValue("default value");
+				}
 			}
 		
-			public IStatus validateParameterValue(FeatureParameterValue value) {
-				String name = value.getParameter().getName();
-				//TODO implement validation
+			public IStatus validateParameterValue(FeatureParameterValue parameterValue) {
+				String parameterName = parameterValue.getParameter().getName();
+				// TODO implement validation
+				// return error("Illegal parameter value");
 				return Status.OK_STATUS;
 			}
 		}
 	'''
 	
+	def libraryConstants(ProjectData data) '''
+		package «data.libraryConstantsClass.packageName»;
+		
+		public interface «data.libraryConstantsClass.simpleName» {
+			public static final String LIBRARY_NAME = "«data.generatorName»";
+			public static final String MY_FEATURE = "MyFeature";
+			public static final String MY_PARAMETER = "MyParameter";
+		}
+	'''
+	
 	def projectSettings(ProjectData data, String encoding) '''
 		eclipse.preferences.version=1
 		encoding/<project>=«encoding»

+ 155 - 24
plugins/org.yakindu.sct.generator.genmodel.ui/xtend-gen/org/yakindu/sct/generator/genmodel/ui/wizard/XpandProjectTemplate.java

@@ -6,7 +6,8 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
-
+import java.util.Collections;
+import java.util.Map;
 import org.apache.commons.lang.StringEscapeUtils;
 import org.eclipse.core.resources.IContainer;
 import org.eclipse.core.resources.IFile;
@@ -17,14 +18,26 @@ import org.eclipse.core.resources.IWorkspace;
 import org.eclipse.core.resources.IWorkspaceRoot;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
 import org.eclipse.xtext.xbase.lib.BooleanExtensions;
 import org.eclipse.xtext.xbase.lib.IntegerExtensions;
 import org.eclipse.xtext.xbase.lib.ObjectExtensions;
 import org.eclipse.xtext.xbase.lib.StringExtensions;
 import org.eclipse.xtext.xtend2.lib.StringConcatenation;
+import org.yakindu.sct.generator.genmodel.ui.wizard.ProjectData;
+import org.yakindu.sct.model.sgen.FeatureParameter;
+import org.yakindu.sct.model.sgen.FeatureType;
+import org.yakindu.sct.model.sgen.FeatureTypeLibrary;
+import org.yakindu.sct.model.sgen.ParameterTypes;
+import org.yakindu.sct.model.sgen.SGenFactory;
 
 @SuppressWarnings("all")
 public class XpandProjectTemplate {
@@ -38,7 +51,7 @@ public class XpandProjectTemplate {
   
   public void generate(final ProjectData data) throws IOException, UnsupportedEncodingException, CoreException {
     {
-      this.monitor.beginTask("Create YAKINDU Xpand Generator Project", 12);
+      this.monitor.beginTask("Create YAKINDU Xpand Generator Project", 15);
       IWorkspace _workspace = ResourcesPlugin.getWorkspace();
       IWorkspaceRoot _root = _workspace.getRoot();
       String _projectName = data.getProjectName();
@@ -88,16 +101,33 @@ public class XpandProjectTemplate {
           this.write(_file_6, _generator);
           boolean _isTypeLibrary = data.isTypeLibrary();
           if (_isTypeLibrary) {
-            this.createFolder(project, "library");
+            {
+              this.createFolder(project, "library");
+              IFile _file_7 = project.getFile("library/FeatureTypeLibrary.xmi");
+              FeatureTypeLibrary _featureLibrary = this.featureLibrary(data);
+              this.write(_file_7, _featureLibrary);
+              String _providerClass = this.providerClass(data);
+              String _javaFilename_1 = this.javaFilename(_providerClass);
+              String _operator_plus_5 = StringExtensions.operator_plus("src/", _javaFilename_1);
+              IFile _file_8 = project.getFile(_operator_plus_5);
+              StringConcatenation _defaultProvider = this.defaultProvider(data);
+              this.write(_file_8, _defaultProvider);
+              String _libraryConstantsClass = this.libraryConstantsClass(data);
+              String _javaFilename_2 = this.javaFilename(_libraryConstantsClass);
+              String _operator_plus_6 = StringExtensions.operator_plus("src/", _javaFilename_2);
+              IFile _file_9 = project.getFile(_operator_plus_6);
+              StringConcatenation _libraryConstants = this.libraryConstants(data);
+              this.write(_file_9, _libraryConstants);
+            }
           }
         }
       }
-      IFile _file_7 = project.getFile(".classpath");
+      IFile _file_10 = project.getFile(".classpath");
       StringConcatenation _classpath = this.classpath(data);
-      this.write(_file_7, _classpath);
-      IFile _file_8 = project.getFile(".project");
+      this.write(_file_10, _classpath);
+      IFile _file_11 = project.getFile(".project");
       StringConcatenation _projectFile = this.projectFile(data);
-      this.write(_file_8, _projectFile);
+      this.write(_file_11, _projectFile);
     }
   }
   
@@ -166,12 +196,58 @@ public class XpandProjectTemplate {
     return _operator_plus;
   }
   
+  public String libraryConstantsClass(final ProjectData data) {
+    String _providerClass = this.providerClass(data);
+    String _packageName = this.packageName(_providerClass);
+    String _operator_plus = StringExtensions.operator_plus(_packageName, ".IFeatureConstants");
+    return _operator_plus;
+  }
+  
   public String javaFilename(final String s) {
     String _replaceAll = s.replaceAll("\\.", "/");
     String _operator_plus = StringExtensions.operator_plus(_replaceAll, ".java");
     return _operator_plus;
   }
   
+  public FeatureTypeLibrary featureLibrary(final ProjectData data) {
+    {
+      final SGenFactory factory = SGenFactory.eINSTANCE;
+      FeatureTypeLibrary _createFeatureTypeLibrary = factory.createFeatureTypeLibrary();
+      final FeatureTypeLibrary lib = _createFeatureTypeLibrary;
+      String _generatorName = data.getGeneratorName();
+      lib.setName(_generatorName);
+      FeatureType _createFeatureType = factory.createFeatureType();
+      final FeatureType type = _createFeatureType;
+      type.setName("MyFeature");
+      FeatureParameter _createFeatureParameter = factory.createFeatureParameter();
+      final FeatureParameter parameter = _createFeatureParameter;
+      parameter.setName("MyParameter");
+      parameter.setParameterType(ParameterTypes.STRING);
+      EList<FeatureParameter> _parameters = type.getParameters();
+      _parameters.add(parameter);
+      EList<FeatureType> _types = lib.getTypes();
+      _types.add(type);
+      return lib;
+    }
+  }
+  
+  public void write(final IFile file, final EObject object) throws IOException {
+    {
+      IPath _fullPath = file.getFullPath();
+      String _string = _fullPath.toString();
+      URI _createPlatformResourceURI = URI.createPlatformResourceURI(_string, true);
+      final URI uri = _createPlatformResourceURI;
+      ResourceSetImpl _resourceSetImpl = new ResourceSetImpl();
+      final ResourceSetImpl resourceSet = _resourceSetImpl;
+      Resource _createResource = resourceSet.createResource(uri);
+      final Resource resource = _createResource;
+      EList<EObject> _contents = resource.getContents();
+      _contents.add(object);
+      Map<Object,Object> _emptyMap = Collections.<Object, Object>emptyMap();
+      resource.save(_emptyMap);
+    }
+  }
+  
   public void write(final IFile file, final StringConcatenation content) throws IOException, UnsupportedEncodingException, CoreException {
     String _string = content.toString();
     this.write(file, _string);
@@ -653,13 +729,34 @@ public class XpandProjectTemplate {
     _builder.append(";");
     _builder.newLineIfNotEmpty();
     _builder.newLine();
+    _builder.append("import static ");
+    String _libraryConstantsClass = this.libraryConstantsClass(data);
+    _builder.append(_libraryConstantsClass, "");
+    _builder.append(".LIBRARY_NAME;");
+    _builder.newLineIfNotEmpty();
+    _builder.append("import static ");
+    String _libraryConstantsClass_1 = this.libraryConstantsClass(data);
+    _builder.append(_libraryConstantsClass_1, "");
+    _builder.append(".MY_PARAMETER;");
+    _builder.newLineIfNotEmpty();
+    _builder.newLine();
+    _builder.append("import org.eclipse.core.runtime.IStatus;");
+    _builder.newLine();
+    _builder.append("import org.eclipse.core.runtime.Status;");
+    _builder.newLine();
     _builder.append("import org.yakindu.sct.generator.core.features.AbstractDefaultFeatureValueProvider;");
     _builder.newLine();
+    _builder.append("import org.yakindu.sct.model.sgen.FeatureParameterValue;");
+    _builder.newLine();
+    _builder.append("import org.yakindu.sct.model.sgen.FeatureTypeLibrary;");
+    _builder.newLine();
+    _builder.append("import org.yakindu.sct.model.sgraph.Statechart;");
+    _builder.newLine();
     _builder.newLine();
     _builder.append("/**");
     _builder.newLine();
     _builder.append(" ");
-    _builder.append("* Default value proivder for ");
+    _builder.append("* Default value provider for ");
     String _generatorName = data.getGeneratorName();
     _builder.append(_generatorName, " ");
     _builder.append(" feature library");
@@ -674,13 +771,16 @@ public class XpandProjectTemplate {
     _builder.append(" extends AbstractDefaultFeatureValueProvider {");
     _builder.newLineIfNotEmpty();
     _builder.newLine();
+    _builder.newLine();
     _builder.append("\t");
-    _builder.append("private static final String LIBRARY_NAME = \"");
-    String _generatorName_1 = data.getGeneratorName();
-    _builder.append(_generatorName_1, "	");
-    _builder.append("\";");
-    _builder.newLineIfNotEmpty();
+    _builder.append("public boolean isProviderFor(FeatureTypeLibrary library) {");
+    _builder.newLine();
+    _builder.append("\t\t");
+    _builder.append("return library.getName().equals(LIBRARY_NAME);");
+    _builder.newLine();
     _builder.append("\t");
+    _builder.append("}");
+    _builder.newLine();
     _builder.newLine();
     _builder.append("\t");
     _builder.append("@Override");
@@ -695,30 +795,29 @@ public class XpandProjectTemplate {
     _builder.append("String parameterName = parameterValue.getParameter().getName();");
     _builder.newLine();
     _builder.append("\t\t");
-    _builder.append("//TODO: set the default values");
+    _builder.append("if (MY_PARAMETER.equals(parameterName)) {");
     _builder.newLine();
-    _builder.append("\t");
-    _builder.append("}");
-    _builder.newLine();
-    _builder.newLine();
-    _builder.append("\t");
-    _builder.append("public boolean isProviderFor(FeatureTypeLibrary library) {");
+    _builder.append("\t\t\t");
+    _builder.append("parameterValue.setValue(\"default value\");");
     _builder.newLine();
     _builder.append("\t\t");
-    _builder.append("return library.getName().equals(LIBRARY_NAME);");
+    _builder.append("}");
     _builder.newLine();
     _builder.append("\t");
     _builder.append("}");
     _builder.newLine();
     _builder.newLine();
     _builder.append("\t");
-    _builder.append("public IStatus validateParameterValue(FeatureParameterValue value) {");
+    _builder.append("public IStatus validateParameterValue(FeatureParameterValue parameterValue) {");
     _builder.newLine();
     _builder.append("\t\t");
-    _builder.append("String name = value.getParameter().getName();");
+    _builder.append("String parameterName = parameterValue.getParameter().getName();");
+    _builder.newLine();
+    _builder.append("\t\t");
+    _builder.append("// TODO implement validation");
     _builder.newLine();
     _builder.append("\t\t");
-    _builder.append("//TODO implement validation");
+    _builder.append("// return error(\"Illegal parameter value\");");
     _builder.newLine();
     _builder.append("\t\t");
     _builder.append("return Status.OK_STATUS;");
@@ -731,6 +830,38 @@ public class XpandProjectTemplate {
     return _builder;
   }
   
+  public StringConcatenation libraryConstants(final ProjectData data) {
+    StringConcatenation _builder = new StringConcatenation();
+    _builder.append("package ");
+    String _libraryConstantsClass = this.libraryConstantsClass(data);
+    String _packageName = this.packageName(_libraryConstantsClass);
+    _builder.append(_packageName, "");
+    _builder.append(";");
+    _builder.newLineIfNotEmpty();
+    _builder.newLine();
+    _builder.append("public interface ");
+    String _libraryConstantsClass_1 = this.libraryConstantsClass(data);
+    String _simpleName = this.simpleName(_libraryConstantsClass_1);
+    _builder.append(_simpleName, "");
+    _builder.append(" {");
+    _builder.newLineIfNotEmpty();
+    _builder.append("\t");
+    _builder.append("public static final String LIBRARY_NAME = \"");
+    String _generatorName = data.getGeneratorName();
+    _builder.append(_generatorName, "	");
+    _builder.append("\";");
+    _builder.newLineIfNotEmpty();
+    _builder.append("\t");
+    _builder.append("public static final String MY_FEATURE = \"MyFeature\";");
+    _builder.newLine();
+    _builder.append("\t");
+    _builder.append("public static final String MY_PARAMETER = \"MyParameter\";");
+    _builder.newLine();
+    _builder.append("}");
+    _builder.newLine();
+    return _builder;
+  }
+  
   public StringConcatenation projectSettings(final ProjectData data, final String encoding) {
     StringConcatenation _builder = new StringConcatenation();
     _builder.append("eclipse.preferences.version=1");