Skip to content
This repository has been archived by the owner on Jan 5, 2021. It is now read-only.

Commit

Permalink
Add registration of generator module and generate default module (#1050)
Browse files Browse the repository at this point in the history
When creating new custom generator configured for plugin export, the extension point registration needs a 'bindings' setting which defines a module class that contains all generator specific Guice bindings.
  • Loading branch information
DominikTesch authored and tkutz committed Oct 26, 2016
1 parent b6e7fb0 commit 38582fc
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 84 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,13 @@ h1(#Test2). Yakindu SCT Testcase 07 - Custom Generators

|_. Nr |_. Testname |_. Test Instructions |_. Postconditions |_. Status|
| 7.1 | Create Xtend2/Java Generator | Select the TestProject in the Package Explorer<p>Select *File->New->Project...*</p><p>Select YAKINDU SCT-> *Xtend2/Java Generator Project*</p><p>Click on Next button</p><p>Enter TestProject.generator.xtend as Project name</p><p>Enter testproject.generator.xtend.XtendGenerator as Generator class</p><p>Check Use Xtend checkbox</p><p>Click on Finish button</p> | Project *TestProject.generator.xtend* has been created in the workspace. | %{color:red}open% |




| 7.1.1 | Create Generator Model for Custom Xtend/Java Generator | Select TestProject in project explorer.<p>Select *File→New→Other* from the menu.</p><p>Select *YAKINDU SCT→Code Generator Model*.</p><p>Click *Next*.</p><p>As file name, enter StaircaseXtend.sgen.</p> <p>Click *Next*.</p><p>Select Custom Xtend2/Java-based Generator and check Staircase.sct.</p><p>Click on *Finish* button.</p> | File StaircaseXtend.sgen has been created with initial settings. | %{color:red}open% |
| 7.1.2 | add Project to buildpath | Open the properties of the TestProject project (*rightclick → Properties or [Alt+Enter]*).<p>Select *Java Build Path*.</p><p>Select tab *Projects*.</p><p>Click *Add…*.</p><p>Add TestProject.generator.xtend.</p><p>Click *OK*.</p> | No errors occurred. | %{color:red}open% |
| 7.1.3 | Setup Xtend Generator Model | Open the file StaircaseXtend.sgen and set the following features:<p>&emsp;- targetFolder = "src-gen-xtend"<br>&emsp;- generatorProject = "TestProject.generator.xtend"<br>&emsp;- generatorPath = "testproject.generator.xtend.XtendGenerator"</p><p>Save the file. | Folder src-gen-xtend with generated code created.</p> | %{color:red}open% |
| 7.2| Create Java Generator | Select the TestProject in the Package Explorer<p>Select *File->New->Project...*<p>Select *YAKINDU SCT-> Xtend2/Java Generator Project*<p>Click on *Next* button<p>Enter TestProject.generator.java as Project name<p>Enter TestProject.generator.java.JavaGenerator as Generator class<p>Check *no* checkbox<p>Click on *Finish* button | Project TestProject.generator.java has been created in the workspace. | %{color:red}open% |
| 7.2.1 | Create Generator Model for Java | Select TestProject in project explorer.<p>Select *File→New→Other* from the menu.<p>Select *YAKINDU SCT→Code Generator Model*.<p>Click *Next*.<p>As file name, enter JavaTestcase.sgen.<p>Click Next.<p>Select Custom Xtend2/Java-based Generator and check Staircase.sct.<p>Click on *Finish* button. | File JavaTestcase.sgen has been created with initial settings.<p>Folders src and src-gen have been created and populated by builder. | %{color:red}open% |
| 7.2.2 | Change Output Folder | Open the file JavaTestcase.sgen and set the following features:<p> - targetFolder = "src-gen-java"<br> - generatorProject = "TestProject.generator.java"<br> - generatorClass = "Testproject.generator.java.JavaGenerator"<p>Save the file. | Folder src-gen-java has been created and populated with with generated code. | %{color:red}open% |
| 7.3 | Create Custom Generator | Select the TestProject in the Package Explorer<p>Select *File->New->Project...*<p>Select *YAKINDU SCT-> Xtend2/Java Generator Project*<p>Click on *Next* button<p>Enter TestProject.generator.custom as Project name<p>Enter TestProject.generator.custom.CustomGenerator as Generator class<p>Check *Use Xtend* and *Configure for Plugin Export* checkbox<p>Enter CustomGenerator as Generator name.<p>Click on *Finish* button | Project TestProject.generator.custom has been created in the workspace. | %{color:red}open% |
| 7.3.1 | Use the new Generator Plugin | Select *File -> Export... -> Plug-in Development -> Deployable plug-ins and fragments*<p> <p>Click *next*<p><p>Check TestProject.generator.custom<p> <p>Choose some arbitrary target folder<p><p>Copy the exported *jar* file into the *plugins* folder of the product installation<p><p>Go back to SCT and select <p>*File -> Restart* | no errors should appear | %{color:red}open% |
| 7.3.3 | Create Generator Model for Custom | Select TestProject in project explorer.<p>Select *File→New→Other* from the menu.<p>Select *YAKINDU SCT→Code Generator Model*.<p>Click *Next*.<p>As file name, enter CustomTestcase.sgen.<p>Click Next.<p>Select Custom Generator and check Staircase.sct.<p>Click on *Finish* button. | A new option is visible in the dropdown menu <p>File CustomTestcase.sgen has been created with initial settings.<p>Folders src and src-gen have been created and populated by builder. | %{color:red}open% |
|
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,7 @@ h1(#Test2). Yakindu SCT Testcase 08 - Genmodel
| 8.2.1 | Change Output Folder | Open file StaircaseC.sgen.<p>Change targetFolder to from src-gen to src-gen-c.</p><p>Save the file by e.g. pressing *[Ctrl+S]*.</p> | Folder src-gen-c has been created and populated with with generated code. | %{color:red}open% |
| 8.3 | Create Generator Model for C++ | Select TestProject in project explorer.<p>Select *File→New→Other* from the menu.</p><p>Select *YAKINDU SCT→Code Generator Model*.</p><p>Click *Next*.</p><p>As file name, enter StaircaseCpp.sgen. </p><p>Click *Next*.</p><p>Select YAKINDU SCT C++ Code Generator and check Staircase.sct.</p><p>Click on *Finish* button.</p> | File StaircaseCpp.sgen has been created with initial settings.<p>Folders src and src-gen have been created and populated by builder.</p> | %{color:red}open% |
| 8.3.1 | Change Output Folder | Open file StaircaseCpp.sgen.<p>Change targetFolder to from src-gen to src-gen-cpp.</p><p>Save the file by e.g. pressing *[Ctrl+S]*.</p> | Folder src-gen-cpp has been created and populated with with generated code. | %{color:red}open% |
| 8.4 | Create Generator Model for Custom Xtend/Java Generator | Select TestProject in project explorer.<p>Select *File→New→Other* from the menu.</p><p>Select *YAKINDU SCT→Code Generator Model*.</p><p>Click *Next*.</p><p>As file name, enter StaircaseXtend.sgen.</p> <p>Click *Next*.</p><p>Select Custom Xtend2/Java-based Generator and check Staircase.sct.</p><p>Click on *Finish* button.</p> | File StaircaseXtend.sgen has been created with initial settings. | %{color:red}open% |
| 8.4.1 | add Project to buildpath | Open the properties of the TestProject project (*rightclick → Properties or [Alt+Enter]*).<p>Select *Java Build Path*.</p><p>Select tab *Projects*.</p><p>Click *Add…*.</p><p>Add TestProject.generator.xtend.</p><p>Click *OK*.</p> | No errors occurred. | %{color:red}open% |
| 8.4.2 | Setup Xtend Generator Model | Open the file StaircaseXtend.sgen and set the following features:<p>&emsp;- targetFolder = "src-gen-xtend"<br>&emsp;- generatorProject = "TestProject.generator.xtend"<br>&emsp;- generatorPath = "testproject.generator.xtend.XtendGenerator"</p><p>Save the file. | Folder src-gen-xtend with generated code created.</p> | %{color:red}open% |




Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,7 @@ package org.yakindu.sct.generator.genmodel.ui.wizard

import com.google.inject.Inject
import com.google.inject.Provider
import java.io.BufferedInputStream
import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream
import java.util.Collections
import org.apache.commons.lang.StringEscapeUtils
import org.eclipse.core.resources.IContainer
Expand All @@ -24,14 +22,14 @@ import org.eclipse.core.resources.IResource
import org.eclipse.core.resources.IWorkspace
import org.eclipse.core.runtime.IProgressMonitor
import org.eclipse.core.runtime.Path
import org.eclipse.core.runtime.SubProgressMonitor
import org.eclipse.core.runtime.SubMonitor
import org.eclipse.emf.common.util.URI
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl
import org.eclipse.xtext.parser.IEncodingProvider
import org.eclipse.xtext.util.Strings
import org.yakindu.sct.model.sgen.ParameterTypes
import org.yakindu.sct.model.sgen.SGenFactory
import org.eclipse.xtext.util.Strings

/**
*
Expand Down Expand Up @@ -62,14 +60,15 @@ class GeneratorProjectTemplate {
.write(data.projectSettings(encodingProvider.getEncoding(URI::createPlatformResourceURI(project.location.toString, true))))
project.getFile('.settings/org.eclipse.jdt.core.prefs')
.write(data.jdtSettings())
if (data.generatorType != GeneratorType::Java) {
if (data.generatorType == GeneratorType::Xtend) {
project.getFile('.settings/org.eclipse.xtend.shared.ui.prefs')
.write(data.xpandSettings)
.write(data.xtendSettings)
}
project.getFile('build.properties').write(data.buildProperties)
project.getFile('META-INF/MANIFEST.MF').write(data.manifest)
if (data.pluginExport) {
project.getFile('plugin.xml').write(data.plugin)
project.getFile('src/'+data.moduleClass.javaFilename).write(data.module)
if (data.typeLibrary) {
project.createFolder('library')
project.getFile('library/FeatureTypeLibrary.xmi')
Expand All @@ -92,60 +91,38 @@ class GeneratorProjectTemplate {
}
}

def fromMyFolder(String s) {
'org/yakindu/sct/generator/genmodel/ui/wizard/'+s
}

def sub(IProgressMonitor mon) {
new SubProgressMonitor(mon,1)
}

def templateName(ProjectData data) {
if (data.pluginExport)
data.generatorClass.simpleName
else
'Main'
}

def targetPackage(ProjectData data) {
if (data.pluginExport)
data.generatorClass.packageName
else
'org.yakindu.sct.generator.xpand'
def protected sub(IProgressMonitor mon) {
SubMonitor.convert(mon, 1)
}

def asFolder(String s) {
s.replaceAll('\\.','/')
}

def javaPathToXpand(String s) {
s.replaceAll('\\.','::')
}

def simpleName(String s) {
def protected simpleName(String s) {
s.substring(s.lastIndexOf('.')+1)
}

def packageName(String s) {
def protected packageName(String s) {
s.substring(0, s.lastIndexOf('.'))
}

def providerClass(ProjectData data){
def protected moduleClass(ProjectData data) {
data.generatorClass+'Module'
}

def protected providerClass(ProjectData data){
data.generatorClass+'DefaultValueProvider'
}

def libraryConstantsClass(ProjectData data){
def protected libraryConstantsClass(ProjectData data){
data.providerClass.packageName+'.IFeatureConstants'
}

def javaFilename(String s) {
def protected javaFilename(String s) {
s.replaceAll('\\.','/')+'.java'
}
def xtendFilename(String s) {
def protected xtendFilename(String s) {
s.replaceAll('\\.','/')+'.xtend'
}

def featureLibrary(ProjectData data) {
def protected featureLibrary(ProjectData data) {
val factory = SGenFactory::eINSTANCE
val lib = factory.createFeatureTypeLibrary
lib.name=data.generatorName
Expand All @@ -159,19 +136,19 @@ class GeneratorProjectTemplate {
return lib
}

def write(IFile file, EObject object) {
def protected 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, CharSequence content) {
def protected write(IFile file, CharSequence content) {
file.write(content.toString)
}

def write(IFile file, String content) {
def protected write(IFile file, String content) {
if (!file.parent.exists) {
createFolderHierarchy(file.parent as IFolder,monitor.sub)
}
Expand All @@ -192,12 +169,12 @@ class GeneratorProjectTemplate {
monitor.worked(1)
}

def createFolder(IContainer container, String folderPath) {
def protected createFolder(IContainer container, String folderPath) {
createFolderHierarchy(container.getFolder(new Path(folderPath)),monitor.sub);
monitor.worked(1)
}

def void createFolderHierarchy(IFolder folder, IProgressMonitor submonitor) {
def protected void createFolderHierarchy(IFolder folder, IProgressMonitor submonitor) {
if (!folder.exists) {
if (!folder.parent.exists
&& folder.parent.type == IResource::FOLDER) {
Expand All @@ -207,26 +184,11 @@ class GeneratorProjectTemplate {
}
}

def escapeForXml(String s) {
def protected escapeForXml(String s) {
StringEscapeUtils::escapeXml(s)
}

def resource(String path, String encoding) {
val inStream = Thread::currentThread.contextClassLoader.getResourceAsStream(path)
val outStream = new ByteArrayOutputStream()
try {
val buffer = new BufferedInputStream(inStream)
var result=0;
while ((result=buffer.read) != -1 ) {
outStream.write(result as byte)
}
outStream.toString(encoding)
} finally {
inStream.close
}
}

def projectFile(ProjectData data) '''
def protected projectFile(ProjectData data) '''
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>«data.projectName»</name>
Expand Down Expand Up @@ -277,7 +239,7 @@ class GeneratorProjectTemplate {
</projectDescription>
'''

def classpath(ProjectData data) '''
def protected classpath(ProjectData data) '''
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
«IF data.generatorType == GeneratorType::Xtend»
Expand All @@ -290,7 +252,7 @@ class GeneratorProjectTemplate {
</classpath>
'''

def manifest(ProjectData data)'''
def protected manifest(ProjectData data)'''
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: «data.projectName»
Expand All @@ -316,17 +278,18 @@ class GeneratorProjectTemplate {
org.yakindu.sct.model.sexec,
org.yakindu.sct.model.stext,
org.yakindu.sct.model.sgraph
Bundle-RequiredExecutionEnvironment: J2SE-1.7
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
'''
def plugin(ProjectData data) '''
def protected plugin(ProjectData data) '''
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
<extension
point="org.yakindu.sct.generator.core.generator">
<SCTGenerator
executor="org.yakindu.sct.generator.core.execution.SExecGeneratorEntryExecutor"
bindings="«data.generatorClass.escapeForXml»Module"
description="«data.generatorDescription.escapeForXml»"
id="«data.generatorId»"
name="«data.generatorName.escapeForXml»"
Expand Down Expand Up @@ -358,7 +321,7 @@ class GeneratorProjectTemplate {
</extension>
</plugin>
'''
def javaGenerator(ProjectData data) '''
def protected javaGenerator(ProjectData data) '''
package «data.generatorClass.packageName»;

import org.yakindu.sct.model.sexec.ExecutionFlow;
Expand Down Expand Up @@ -386,7 +349,8 @@ class GeneratorProjectTemplate {
}
}
'''
def xtendGenerator(ProjectData data) '''
def protected xtendGenerator(ProjectData data) '''
package «data.generatorClass.packageName»

import org.yakindu.sct.model.sgen.GeneratorEntry
Expand Down Expand Up @@ -414,8 +378,7 @@ class GeneratorProjectTemplate {
}
'''
def defaultProvider(ProjectData data) '''
def protected defaultProvider(ProjectData data) '''
package «data.providerClass.packageName»;

import static «data.libraryConstantsClass».LIBRARY_NAME;
Expand Down Expand Up @@ -456,7 +419,7 @@ class GeneratorProjectTemplate {
}
'''
def libraryConstants(ProjectData data) '''
def protected libraryConstants(ProjectData data) '''
package «data.libraryConstantsClass.packageName»;

public interface «data.libraryConstantsClass.simpleName» {
Expand All @@ -466,25 +429,25 @@ class GeneratorProjectTemplate {
}
'''
def projectSettings(ProjectData data, String encoding) '''
def protected projectSettings(ProjectData data, String encoding) '''
eclipse.preferences.version=1
encoding/<project>=«encoding»
'''
def xpandSettings(ProjectData data) '''
def protected xtendSettings(ProjectData data) '''
eclipse.preferences.version=1
project.specific.metamodel=true
metamodelContributor=org.eclipse.xtend.typesystem.emf.ui.EmfMetamodelContributor
'''
def jdtSettings(ProjectData data) '''
def protected jdtSettings(ProjectData data) '''
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
org.eclipse.jdt.core.compiler.compliance=1.5
org.eclipse.jdt.core.compiler.source=1.5
'''
def buildProperties(ProjectData data) '''
def protected buildProperties(ProjectData data) '''
source.. = src/«IF data.generatorType == GeneratorType::Xtend»,\
xtend-gen
«ELSE»«Strings.newLine»«ENDIF»
Expand All @@ -494,5 +457,21 @@ class GeneratorProjectTemplate {
bin.includes = META-INF/,.
«ENDIF»
'''
def protected module(ProjectData data) '''
package «data.generatorClass.packageName»;

import org.yakindu.sct.generator.core.GeneratorModule;
import org.yakindu.sct.generator.core.IExecutionFlowGenerator;
import org.yakindu.sct.model.sgen.GeneratorEntry;

import com.google.inject.Binder;

public class «data.moduleClass.simpleName» implements GeneratorModule {

public void configure(GeneratorEntry entry, Binder binder) {
binder.bind(IExecutionFlowGenerator.class).to(«data.generatorClass.simpleName».class);
}
}
'''
}

0 comments on commit 38582fc

Please sign in to comment.