Resolve Bug:445 Remove freemarker from config code generator.
[controller.git] / opendaylight / config / yang-jmx-generator-plugin / src / main / java / org / opendaylight / controller / config / yangjmxgenerator / plugin / gofactory / ConcreteModuleGeneratedObjectFactory.java
diff --git a/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/gofactory/ConcreteModuleGeneratedObjectFactory.java b/opendaylight/config/yang-jmx-generator-plugin/src/main/java/org/opendaylight/controller/config/yangjmxgenerator/plugin/gofactory/ConcreteModuleGeneratedObjectFactory.java
new file mode 100644 (file)
index 0000000..fbc507d
--- /dev/null
@@ -0,0 +1,101 @@
+package org.opendaylight.controller.config.yangjmxgenerator.plugin.gofactory;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Optional;
+import org.opendaylight.controller.config.api.DependencyResolver;
+import org.opendaylight.controller.config.api.ModuleIdentifier;
+import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry;
+import org.opendaylight.controller.config.yangjmxgenerator.plugin.java.FullyQualifiedName;
+import org.opendaylight.controller.config.yangjmxgenerator.plugin.java.GeneratedObject;
+import org.opendaylight.controller.config.yangjmxgenerator.plugin.java.GeneratedObjectBuilder;
+import org.opendaylight.controller.config.yangjmxgenerator.plugin.java.JavaFileInputBuilder;
+import org.opendaylight.controller.config.yangjmxgenerator.plugin.java.TypeName;
+
+import java.util.LinkedHashMap;
+
+public class ConcreteModuleGeneratedObjectFactory {
+
+    public GeneratedObject toGeneratedObject(ModuleMXBeanEntry mbe, Optional<String> copyright, Optional<String> header) {
+        FullyQualifiedName concreteFQN = new FullyQualifiedName(mbe.getPackageName(), mbe.getStubModuleName());
+        FullyQualifiedName abstractFQN = new FullyQualifiedName(mbe.getPackageName(), mbe.getAbstractModuleName());
+        Optional<String> classJavaDoc = Optional.fromNullable(mbe.getNullableDescription());
+        return toGeneratedObject(concreteFQN, abstractFQN, copyright, header, classJavaDoc);
+    }
+
+    GeneratedObject toGeneratedObject(FullyQualifiedName concreteFQN,
+                                             FullyQualifiedName abstractFQN,
+                                             Optional<String> copyright,
+                                             Optional<String> header,
+                                             Optional<String> classJavaDoc) {
+        // there are two constructors and two methods
+        JavaFileInputBuilder builder = new JavaFileInputBuilder();
+        builder.setTypeName(TypeName.classType);
+        builder.setFqn(concreteFQN);
+        builder.addExtendsFQN(abstractFQN);
+
+        builder.setCopyright(copyright);
+        builder.setHeader(header);
+        builder.setClassJavaDoc(classJavaDoc);
+
+        builder.addToBody(getNewCtor(concreteFQN));
+        builder.addToBody(getCopyCtor(concreteFQN));
+        builder.addToBody(getCustomValidationStub());
+        builder.addToBody(getCreateInstanceStub());
+
+        return new GeneratedObjectBuilder(builder.build()).toGeneratedObject();
+    }
+
+    private static String getNewCtor(FullyQualifiedName fqn) {
+        LinkedHashMap<String, String> parameters = new LinkedHashMap<String, String>(){
+            {
+                put(ModuleIdentifier.class.getCanonicalName(), "identifier");
+                put(DependencyResolver.class.getCanonicalName(), "dependencyResolver");
+            }
+        };
+        StringBuilder stringBuilder = getCtor(fqn, parameters);
+        return stringBuilder.toString();
+    }
+
+    private static StringBuilder getCtor(FullyQualifiedName fqn , LinkedHashMap<String, String> parameters) {
+        StringBuilder stringBuilder = new StringBuilder();
+        stringBuilder.append("public ").append(fqn.getTypeName()).append("(");
+        // parameters
+        stringBuilder.append(Joiner.on(", ").withKeyValueSeparator(" ").join(parameters));
+        stringBuilder.append(") {\n");
+        if (parameters.isEmpty() == false) {
+            stringBuilder.append("super(");
+            stringBuilder.append(Joiner.on(", ").join(parameters.values()));
+            stringBuilder.append(");\n");
+        }
+        stringBuilder.append("}");
+        return stringBuilder;
+    }
+
+    private static String getCopyCtor(final FullyQualifiedName fqn) {
+        LinkedHashMap<String, String> parameters = new LinkedHashMap<String, String>(){
+            {
+                put(ModuleIdentifier.class.getCanonicalName(), "identifier");
+                put(DependencyResolver.class.getCanonicalName(), "dependencyResolver");
+                put(fqn.toString(), "oldModule");
+                put(AutoCloseable.class.getCanonicalName(), "oldInstance");
+            }
+        };
+        StringBuilder stringBuilder = getCtor(fqn, parameters);
+        return stringBuilder.toString();
+    }
+
+    private static String getCustomValidationStub() {
+        return "@Override\n" +
+                "public void customValidation() {\n" +
+                "// add custom validation form module attributes here.\n" +
+                "}";
+    }
+
+    private static String getCreateInstanceStub() {
+        return "@Override\n" +
+                "public " + AutoCloseable.class.getCanonicalName() + " createInstance() {\n" +
+                "// TODO:implement\n" +
+                "throw new " + UnsupportedOperationException.class.getCanonicalName() + "();\n"+
+                "}";
+    }
+}