Newer
Older
/*
* generated by Xtext 2.27.0
*/
package org.etsi.mts.tdl.ui.wizard
import org.eclipse.core.runtime.Status
import org.eclipse.jdt.core.JavaCore
import org.eclipse.xtext.ui.XtextProjectHelper
import org.eclipse.xtext.ui.util.PluginProjectFactory
import org.eclipse.xtext.ui.wizard.template.IProjectGenerator
import org.eclipse.xtext.ui.wizard.template.IProjectTemplateProvider
import org.eclipse.xtext.ui.wizard.template.ProjectTemplate
import static org.eclipse.core.runtime.IStatus.*
import org.eclipse.xtext.ui.PluginImageHelper
import com.google.inject.Inject
import java.util.List
import org.eclipse.swt.graphics.Image
import org.etsi.mts.tdl.tx.ui.internal.TxActivator
import org.etsi.mts.tdl.openapi2tdl.next.ConverterNext
import org.eclipse.ui.preferences.ScopedPreferenceStore
import org.eclipse.core.runtime.preferences.InstanceScope
import org.etsi.mts.tdl.ui.wizard.TemplateHelper.Libraries
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/**
* Create a list with all project templates to be shown in the template new project wizard.
*
* Each template is able to generate one or more projects. Each project can be configured such that any number of files are included.
*/
class TDLtxProjectTemplateProvider implements IProjectTemplateProvider {
@Inject
TDLtxProject project
@Inject
TDLtxProjectWithOpenAPI projectWithOpenAPI
override getProjectTemplates() {
//#[new TDLtxProject]
#[project, projectWithOpenAPI]
}
}
//TODO: customise
@ProjectTemplate(label="TDLtx", icon="project_template.png", description="<p><b>TDLtx</b></p>
<p>This is a parameterized project for TDLtx. You can set a parameter to modify the content in the generated file
and a parameter to set the path the file is created in.</p><p><img href=\"project_template.png\"/></p>")
final class TDLtxProject {
//TODO: remove after testing
val testFile = "/Users/philip-iii/Dev/git/etsi-labs/eg-203647-restful-api-guide/OpenAPI/ExampleAPI.yaml"
val advanced = check("Advanced:", false)
val advancedGroup = group("Properties")
val name = combo("Package Name:", #["Example", "Sample", "Tutorial", "Pack"], "The name of the package", advancedGroup)
val path = text("Path:", "tdltx_example", "The package path to place the files in", advancedGroup)
@Inject
PluginImageHelper pluginImageHelper
override protected updateVariables() {
name.enabled = advanced.value
path.enabled = advanced.value
if (!advanced.value) {
name.value = "Example"
path.value = "tdltx.example"
}
}
override protected validate() {
if (path.value.matches('[a-z][a-z0-9_.]*(/[a-z][a-z0-9_.]*)*'))
null
else
new Status(ERROR, "Wizard", "'" + path + "' is not a valid package name")
//TODO: validate data definitions as well
}
override generateProjects(IProjectGenerator generator) {
generator.generate(new PluginProjectFactory => [
projectName = projectInfo.projectName
location = projectInfo.locationPath
//projectNatures += #[JavaCore.NATURE_ID, "org.eclipse.pde.PluginNature", XtextProjectHelper.NATURE_ID]
//builderIds += #[JavaCore.BUILDER_ID, XtextProjectHelper.BUILDER_ID]
projectNatures += #[XtextProjectHelper.NATURE_ID]
builderIds += #[XtextProjectHelper.BUILDER_ID]
folders += "src"
//TODO: remove hardcoded import
addFile('''src/«path»/Wizardry.tdltx''', TemplateContent.Example)
addFile('''src/«path»/Model.tdltx''', '''
/*
* This is an example package
*/
Package «name» {
Import all from Wizardry
Type float
}
''')
])
}
protected override List<Pair<String, Image>> getImages() {
#["project_template.png".image]
}
private def image(String id) {
id -> pluginImageHelper.getImage('''platform:/plugin/«TxActivator.PLUGIN_ID»/«id»''')
}
}
//TODO: customise further, reuse?
@ProjectTemplate(label="TDLtx with OpenAPI", icon="project_template.png", description="<p><b>TDLtx with OpenAPI</b></p>
<p>This is a parameterized project for TDLtx with the option to import data definitions from OpenAPI.
You can set a parameter to modify the content in the generated file
and a parameter to set the path the file is created in.</p><p><img href=\"project_template.png\"/></p>")
final class TDLtxProjectWithOpenAPI {
//TODO: more modern way?
//TODO: differentiate for project vs file wizard
val s = new ScopedPreferenceStore(new InstanceScope(), "org.etsi.mts.tdl.tx.ui.template.data.openapi")
val lastUsed = "LAST_USED"
//TODO: file prompt?
//TODO: remove after testing
val advanced = check("Advanced:", true)
val advancedGroup = group("Properties")
val name = text("Main Package Name:", "Main", "The name of the main package")
// val name = combo("Package Name:", #["Example", "Sample", "Tutorial", "Pack"], "The name of the package", advancedGroup)
val path = text("Path:", "tdl", "The package path to place the files in", advancedGroup)
val dataDefinitionsPath = text("Data DefinitionsPath:", s.getString(lastUsed), "The data definitions path to import from", advancedGroup)
val sourceMapping = text("Source mapping tag:", "SOURCE_MAPPING", "The source mapping tag to be used for the data mappings", advancedGroup)
val targetMapping = text("Target mapping tag:", "TARGET_MAPPING", "The target mapping tag to be used for the data mappings", advancedGroup)
@Inject
PluginImageHelper pluginImageHelper
override protected updateVariables() {
name.enabled = advanced.value
path.enabled = advanced.value
dataDefinitionsPath.enabled = advanced.value
sourceMapping.enabled = advanced.value
targetMapping.enabled = advanced.value
if (!advanced.value) {
name.value = "Main"
path.value = "tdl"
dataDefinitionsPath.value = s.getString(lastUsed)
sourceMapping.value = "SOURCE_MAPPING"
targetMapping.value = "TARGET_MAPPING"
}
}
override protected validate() {
if (path.value.matches('[a-z][a-z0-9_.]*(/[a-z][a-z0-9_.]*)*'))
null
else
new Status(ERROR, "Wizard", "'" + path + "' is not a valid package name")
//TODO: validate data definitions as well
}
override generateProjects(IProjectGenerator generator) {
generator.generate(new PluginProjectFactory => [
projectName = projectInfo.projectName
location = projectInfo.locationPath
//projectNatures += #[JavaCore.NATURE_ID, "org.eclipse.pde.PluginNature", XtextProjectHelper.NATURE_ID]
//builderIds += #[JavaCore.BUILDER_ID, XtextProjectHelper.BUILDER_ID]
projectNatures += #[XtextProjectHelper.NATURE_ID]
builderIds += #[XtextProjectHelper.BUILDER_ID]
folders += "src"
addRequiredBundles(List.of("org.etsi.mts.tdl.tx.ui"))
// addFile('''src/«path»/Standard.tdltx''', TemplateContent.Standard)
//TODO: move libraries to a separate bundle
addFile('''src/«path»/Standard.tdltx''', TemplateHelper.getLibrary("Standard"))
//TODO: remove hardcoded import
//TODO: make target package name configurable? i.e. based on name
addFile('''src/«path»/imported.tdltx''',
ConverterNext.processToString(dataDefinitionsPath.value,
"src/"+path.value+"/imported.tdltx",
sourceMapping.value,
targetMapping.value
))
addFile('''src/«path»/Model.tdltx''', '''
/*
* This is an example package
*/
Package «name» {
Import all from Standard
Import all from generated_from_ExampleAPI_yaml
])
}
protected override List<Pair<String, Image>> getImages() {
#["project_template.png".image]
}
private def image(String id) {
id -> pluginImageHelper.getImage('''platform:/plugin/«TxActivator.PLUGIN_ID»/«id»''')
}
}