diff options
Diffstat (limited to 'ncomp-sirius-manager-generator/src/main/groovy/org/openecomp/ncomp/sirius/manager/generator/ControllerGenerator.groovy')
-rw-r--r-- | ncomp-sirius-manager-generator/src/main/groovy/org/openecomp/ncomp/sirius/manager/generator/ControllerGenerator.groovy | 303 |
1 files changed, 303 insertions, 0 deletions
diff --git a/ncomp-sirius-manager-generator/src/main/groovy/org/openecomp/ncomp/sirius/manager/generator/ControllerGenerator.groovy b/ncomp-sirius-manager-generator/src/main/groovy/org/openecomp/ncomp/sirius/manager/generator/ControllerGenerator.groovy new file mode 100644 index 0000000..cf2fd59 --- /dev/null +++ b/ncomp-sirius-manager-generator/src/main/groovy/org/openecomp/ncomp/sirius/manager/generator/ControllerGenerator.groovy @@ -0,0 +1,303 @@ + +/*- + * ============LICENSE_START========================================== + * OPENECOMP - DCAE + * =================================================================== + * Copyright (c) 2017 AT&T Intellectual Property. All rights reserved. + * =================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END============================================ + */ + +package org.openecomp.ncomp.sirius.manager.generator +
+
+import org.openecomp.ncomp.sirius.manager.console.Utils; +import org.openecomp.ncomp.sirius.manager.controllermodel.ControllerModel + +import groovy.text.SimpleTemplateEngine
+ +import org.eclipse.emf.ecore.EClass
+import org.eclipse.emf.ecore.EFactory; +import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EOperation
+import org.eclipse.emf.ecore.EPackage;
+import org.json.JSONObject; +import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.Yaml; +
+
+class ControllerGenerator {
+ EObject o + EObject providerObject + String providerPackage + String providerPrefix
+ ControllerModel m
+ EPackage p
+ String subName
+ String clientName
+ String prefix
+ String type = "R"
+ ControllerGenerator root; + boolean enableDrools = false; + boolean enableIRequestHandler = true; + boolean enableISwaggerHandler = false; + boolean enableISiriusPlugin = true;
+ public ControllerGenerator(EObject o, ControllerModel m) {
+ this.o = o
+ this.m = m
+ root = this
+ }
+ public String packageName() {
+ if (this != root && clientName == null) {
+ return root.packageName() + (root.o.eClass().EPackage != o.eClass().EPackage? "." + subName : "")
+ }
+ EPackage p = o.eClass().getEPackage()
+ return p.nsURI.replaceAll('.'+p.nsPrefix+'$',"") + ".servers.${p.nsPrefix}"
+ }
+ public String factoryName() {
+ EPackage p = o.eClass().getEPackage()
+ return "${p.nsPrefix.capitalize()}Factory"
+ }
+ public String packageName2() {
+ EPackage p = o.eClass().getEPackage()
+ return "${p.nsPrefix.capitalize()}Package"
+ }
+ public def operations() {
+ def l = []
+ l += o.eClass().getEOperations();
+ o.eClass().getEAllSuperTypes().each { EClass c ->
+ l += c.getEOperations()
+ }
+ return l
+ }
+ public def operationsProvider() { + def l = [] + l += o.eClass().getEOperations(); + o.eClass().getEAllSuperTypes().each { EClass c -> + if (providerObject != null && ( + providerObject.eClass().getEAllSuperTypes().contains(c) + || c == providerObject.eClass())) return + l += c.getEOperations() + } + return l + } + public void generateAnt(String fname, boolean xtext, boolean tar) {
+ def xml = new XmlSlurper().parseText(new File(".classpath").text)
+ SimpleTemplateEngine engine = new SimpleTemplateEngine()
+ def env = [g:this,m:m,sourceDirectories:[],projects:[],xtext:xtext,tar:tar]
+ xml.classpathentry.each { e ->
+ switch (e.@kind) {
+ case "src":
+ def path = e.@path.toString()
+ if (path.startsWith("/")) {
+ println "path=$path"
+ switch (path) {
+ case "/org.openecomp.ncomp.webservice": env.projects += "org.openecomp.ncomp.utils.jar"; break
+ default: env.projects += path.replace("/","") + ".jar"
+ }
+ }
+ else {
+ env.sourceDirectories += path
+ }
+ break
+// <classpathentry kind="lib" path="/sirius-store/artifacts/org.openecomp.ncomp.gwt.api.jar"/>
+ case "lib":
+ def path = e.@path.toString()
+ switch (path) {
+ case ~/\/sirius-store.*/:
+ def a = path.split("/")
+ def jar = a[3]
+ println "jar=$jar"
+ env.projects += a[3]
+ }
+ }
+ }
+ println "Creating $fname"
+ def x = engine.createTemplate(new File("$m.templateDirectory/ant_xml").text).make(env)
+ File f = new File(fname)
+ f.delete()
+ f.parentFile.mkdirs()
+ f << x
+ }
+ public void generateScripts(String dir,String n) {
+ SimpleTemplateEngine engine = new SimpleTemplateEngine()
+ EPackage p = o.eClass().getEPackage() + def env = [g:this,m:m, n:n, nsPrefix: p.getNsPrefix()]
+ env.sClass = "${root.m.prefix}${root.o.eClass().name}Server"
+ env.sPackage = root.packageName()
+ String fname = "$dir/${n}-controller"
+ println "Creating $fname" + println "Using $m.templateDirectory/controller"
+ def x = engine.createTemplate(new File("$m.templateDirectory/controller").text).make(env)
+ File f = new File(fname)
+ f.delete()
+ f.parentFile.mkdirs()
+ f << x
+ }
+ public void generate(String dir) { + if (enableDrools && ! enableISiriusPlugin) { + System.err.println "Drools requires ISiriusPlugin, thus enabling ISiriusPlugin" + enableISiriusPlugin = true + }
+ SimpleTemplateEngine engine = new SimpleTemplateEngine()
+
+ File dir1 = new File(dir)
+ if (root == this && dir1.exists()) dir1.deleteDir()
+ dir1.mkdir()
+
+ EPackage p = o.eClass().getEPackage()
+
+ ["Server":[:],"Client":[:],"Console":[:],"Controller":[:],"Factory":[:],"Provider":[:]].each {n, c ->
+ if (root != this) {
+ switch (n) {
+ case "Server": return
+ case "Factory": if (type == "A" || type == "C" || type == "P") return; + case "Client": case "Console": if (type == "P") return;
+ }
+ }
+ def env = [
+ g: this,
+ o: o,
+ p: p,
+ prefix: m.prefix,
+ name : o.eClass().getName(),
+ nsPrefix : p.getNsPrefix(),
+ nsURI : p.getNsURI(),
+ packageName : packageName(),
+ cName : "${m.prefix}${o.eClass().name}$n",
+ fName : factoryName(),
+ path : root == this ? "resources" : subName,
+ ]
+ switch (n) {
+ case "Provider": env.cName = "${m.prefix}${o.eClass().name}ProviderTemplate"; break
+ case "Controller": env.cName = "${m.prefix}${o.eClass().name}"; break + case "Factory": env.cName = "${m.prefix}${env.fName}"; break
+ }
+ env.sClass = "${root.m.prefix}${root.o.eClass().name}Server"
+ env.sPackage = root == this ? "" : root.packageName()
+ def fname = "$dir/${env.cName}.java"
+ println "Creating $fname" + println "Using $m.templateDirectory/${n}.java"
+ def x = engine.createTemplate(new File("$m.templateDirectory/${n}.java").text).make(env)
+ def f = new File(fname)
+ f.parentFile.mkdirs()
+ f << x
+ switch (n) { + case "Provider": + def fname2 = "${dir.replace('src/main/sirius-gen','src/main/java')}/${env.cName}.java".replace("ProviderTemplate", "Provider") + def f2 = new File(fname2) + if (!f2.exists()) { + println "Creating $fname2" + f2.parentFile.mkdirs() + f2 << x.toString().replace("${o.eClass().name}ProviderTemplate", "${o.eClass().name}Provider") + } + break + } + // println "x=$x"
+ } + generateYaml(dir)
+ subApis.each { ControllerGenerator g ->
+ g.generate(dir + (g.o.eClass().EPackage != o.eClass().EPackage ? "/$g.subName" : ""))
+ }
+ } + def generateYaml(dir) { + def y = [operations:[:], messages:[dummy:[:]]] + EClass c = o.eClass() + c.getEAllOperations().each { EOperation op -> + y.operations[op.name] = [:] + y.messages[op.name] = [ + errorCode: "$op.name-FAILED-5001W", + messageFormat: "{0}", + description: "Operation Failed with Exception" + ] + } + c.getEAllOperations().each { EOperation op -> + y.operations["REMOTE_$op.name"] = [decription:"Remote call $op.name"] + y.messages["REMOTE_$op.name"] = [ + errorCode: "REMOTE-$op.name-FAILED-5001W", + messageFormat: "{0}", + description: "Remote Operation Failed with Exception" + ] + } + DumperOptions options = new DumperOptions(); + options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + Yaml yaml = new Yaml(options); + JSONObject j = Utils.object2json(y) + File f = new File("src/main/sirius-gen/${c.name}.yaml") + if (f.exists()) f.delete() + f << yaml.dump(yaml.load(j.toString())) + }
+ def subApis = []
+ public void addObject(String subpackage, EObject o, ControllerModel m, boolean enableIRequestHandler = false, boolean enableISiriusPlugin = false) {
+ def g = new ControllerGenerator(o,m)
+ g.root = this
+ g.subName = subpackage
+ g.type = "O" + g.enableIRequestHandler = enableIRequestHandler + g.enableISiriusPlugin = enableISiriusPlugin
+ subApis += g
+ }
+ public void addApi(String name, EObject o, ControllerModel m, boolean enableIRequestHandler = false, boolean enableISiriusPlugin = false) {
+ def g = new ControllerGenerator(o,m)
+ g.root = this
+ g.subName = name
+ g.type = "A" + g.enableIRequestHandler = enableIRequestHandler + g.enableISiriusPlugin = enableISiriusPlugin
+ subApis += g
+ }
+ public void addProvider(String name, EObject o, ControllerModel m) { + def g = new ControllerGenerator(o,m) + g.root = this + g.subName = name + g.type = "P" + g.enableIRequestHandler = false + g.enableISiriusPlugin = false + subApis += g + } + def subClients = []
+ public void addClient(String name, EObject o, ControllerModel m, boolean enableIRequestHandler = false, boolean enableISiriusPlugin = false) {
+ def g = new ControllerGenerator(o,m)
+ g.root = this
+ g.clientName = name
+ g.type = "C" + g.enableIRequestHandler = enableIRequestHandler + g.enableISiriusPlugin = enableISiriusPlugin
+ subClients += g
+ }
+ List<String> aliases = new ArrayList<String>();
+ public void addAlias(String alias) {
+ aliases.add(alias);
+ }
+ List<String> factories = new ArrayList<String>(); + def useNew = [:]
+ public void addFactory(String factory, boolean useNew = true) {
+ factories.add(factory); + this.useNew[factory] = useNew
+ } + public void enableDrools() { + enableDrools = true; + } + public void addFactory(EFactory f) { + def p = f.ePackage + String f1 = "${p.nsURI}.${p.name.capitalize()}Factory" + addFactory(f1,false) + } + public void setProvider(EObject o2, String prefix) { + providerObject = o2 + EPackage p = o2.eClass().getEPackage() + providerPackage = p.nsURI.replaceAll('.'+p.nsPrefix+'$',"") + ".servers.${p.nsPrefix}" + providerPrefix = prefix + }
+}
|