YANG typedefs generation as class with extends key word
[controller.git] / opendaylight / sal / yang-prototype / code-generator / binding-java-api-generator / src / main / java / org / opendaylight / controller / sal / java / api / generator / ClassCodeGenerator.java
index b8f988bff395354d46e7cd4049f434cd400bf070..31b94a65cad703d8b78ca79c8fbaf94f62ea7f70 100644 (file)
@@ -15,95 +15,124 @@ import java.io.Writer;
 import java.util.List;
 import java.util.Map;
 
-import org.opendaylight.controller.binding.generator.util.TypeConstants;
 import org.opendaylight.controller.sal.binding.model.api.*;
 
 public final class ClassCodeGenerator implements CodeGenerator {
 
     private Map<String, String> imports;
 
-    @Override
-    public Writer generate(Type type) throws IOException {
-        final Writer writer = new StringWriter();
+    private void generatePackage(Writer writer, String packageName) throws IOException {
+        writer.write(GeneratorUtil.createPackageDeclaration(packageName));
+        writer.write(NL);
+    }
 
-        if (type instanceof GeneratedTransferObject) {
-            GeneratedTransferObject genTO = (GeneratedTransferObject) type;
-            imports = GeneratorUtil.createImports(genTO);
+    private void generateImports(Writer writer) throws IOException {
+        List<String> importLines = GeneratorUtil.createImportLines(imports, null);
+        for (String line : importLines) {
+            writer.write(line + NL);
+        }
+        writer.write(NL);
+    }
 
-            final String currentPkg = genTO.getPackageName();
-            final List<GeneratedProperty> fields = genTO.getProperties();
-            final List<Enumeration> enums = genTO.getEnumerations();
-            final List<Constant> consts = genTO.getConstantDefinitions();
+    private void generateClassBody(Writer writer, GeneratedTransferObject genTO, String packageName, String indent,
+            boolean isInnerClass) throws IOException {
+        final List<GeneratedProperty> fields = genTO.getProperties();
+        final List<Enumeration> enums = genTO.getEnumerations();
+        final List<Constant> consts = genTO.getConstantDefinitions();
 
-            writer.write(GeneratorUtil.createPackageDeclaration(currentPkg));
-            writer.write(NL);
+        writer.write(GeneratorUtil.createClassDeclaration(genTO, indent, imports, genTO.isAbstract(), isInnerClass));
+        writer.write(NL);
+        writer.write(NL);
 
-            List<String> importLines = GeneratorUtil.createImportLines(imports);
-            for (String line : importLines) {
-                writer.write(line + NL);
+        if (consts != null) {
+            for (Constant con : consts) {
+                writer.write(GeneratorUtil.createConstant(con, indent + TAB, imports, packageName));
+                writer.write(NL);
+            }
+        }
+
+        if (enums != null) {
+            EnumGenerator enumGenerator = new EnumGenerator();
+            for (Enumeration e : enums) {
+                writer.write(enumGenerator.generateInnerEnumeration(e, indent + TAB).toString());
+                writer.write(NL);
+            }
+        }
+
+        writer.write(GeneratorUtil.createStaticInicializationBlock(genTO, indent + TAB));
+
+        if (fields != null) {
+            for (GeneratedProperty field : fields) {
+                writer.write(GeneratorUtil.createField(field, indent + TAB, imports, packageName) + NL);
             }
-            writer.write(NL);
 
-            writer.write(GeneratorUtil.createClassDeclaration(genTO, "", imports, genTO.isAbstract()));
             writer.write(NL);
+            final boolean oneConstructor;
+            if (genTO.isUnionType()) {
+                oneConstructor = false;
+            } else {
+                oneConstructor = true;
+            }
+            writer.write(GeneratorUtil.createConstructor(genTO, indent + TAB, imports, genTO.isAbstract(),
+                    oneConstructor));
             writer.write(NL);
 
-            if (consts != null) {
-                for (Constant con : consts) {
-                    writer.write(GeneratorUtil.createConstant(con, TAB, imports, currentPkg));
-                    writer.write(NL);
+            for (GeneratedProperty field : fields) {
+                writer.write(GeneratorUtil.createGetter(field, indent + TAB, imports, packageName) + NL);
+                if (!field.isReadOnly()) {
+                    writer.write(GeneratorUtil.createSetter(field, indent + TAB, imports, packageName) + NL);
                 }
             }
 
-            if (enums != null) {
-                EnumGenerator enumGenerator = new EnumGenerator();
-                for (Enumeration e : enums) {
-                    writer.write(enumGenerator.generateInnerEnumeration(e, TAB).toString());
-                    writer.write(NL);
-                }
+            if (!genTO.getHashCodeIdentifiers().isEmpty()) {
+                writer.write(GeneratorUtil.createHashCode(genTO.getHashCodeIdentifiers(), indent + TAB) + NL);
             }
 
-            boolean memberPatternListCodeRequired = false;
-            memberPatternListCodeRequired = (GeneratorUtil.isConstantInTO(TypeConstants.PATTERN_CONSTANT_NAME, genTO));
-            if (fields != null || memberPatternListCodeRequired) {
-                if (fields != null) {
-                    for (GeneratedProperty field : fields) {
-                        writer.write(GeneratorUtil.createField(field, TAB, imports, currentPkg) + NL);
-                    }
-                }
-                if (memberPatternListCodeRequired) {
-                    writer.write(TAB + PRIVATE + GAP + "List<Pattern>" + GAP + MEMBER_PATTERN_LIST + GAP + ASSIGN + GAP
-                            + "new ArrayList<Pattern>()" + GAP + SC + NL);
+            if (!genTO.getEqualsIdentifiers().isEmpty()) {
+                writer.write(GeneratorUtil.createEquals(genTO, genTO.getEqualsIdentifiers(), indent + TAB) + NL);
+            }
 
-                }
-                writer.write(NL);
-                writer.write(GeneratorUtil.createConstructor(genTO, TAB, imports, genTO.isAbstract()) + NL);
-                writer.write(NL);
-                if (fields != null) {
-                    for (GeneratedProperty field : fields) {
-                        writer.write(GeneratorUtil.createGetter(field, TAB, imports, currentPkg) + NL);
-                        if (!field.isReadOnly()) {
-                            writer.write(GeneratorUtil.createSetter(field, TAB, imports, currentPkg) + NL);
-                        }
-                    }
-                    writer.write(NL);
-
-                    if (!genTO.getHashCodeIdentifiers().isEmpty()) {
-                        writer.write(GeneratorUtil.createHashCode(genTO.getHashCodeIdentifiers(), TAB) + NL);
-                    }
-
-                    if (!genTO.getEqualsIdentifiers().isEmpty()) {
-                        writer.write(GeneratorUtil.createEquals(genTO, genTO.getEqualsIdentifiers(), TAB) + NL);
-                    }
-
-                    if (!genTO.getToStringIdentifiers().isEmpty()) {
-                        writer.write(GeneratorUtil.createToString(genTO, genTO.getToStringIdentifiers(), TAB) + NL);
-                    }
-
-                    writer.write(RCB);
-                }
+            if (!genTO.getToStringIdentifiers().isEmpty()) {
+                writer.write(GeneratorUtil.createToString(genTO, genTO.getToStringIdentifiers(), indent + TAB) + NL);
             }
+
+            writer.write(indent + RCB);
+        }
+    }
+
+    @Override
+    public Writer generate(Type type) throws IOException {
+        final Writer writer = new StringWriter();
+
+        if (type instanceof GeneratedTransferObject) {
+            GeneratedTransferObject genTO = (GeneratedTransferObject) type;
+            imports = GeneratorUtil.createImports(genTO);
+
+            final String currentPkg = genTO.getPackageName();
+
+            generatePackage(writer, currentPkg);
+
+            generateImports(writer);
+
+            generateClassBody(writer, genTO, currentPkg, NO_INDENT, false);
+
+        }
+        return writer;
+    }
+
+    public Writer generateOnlyClass(Type type, Map<String, String> imports) throws IOException {
+        this.imports = imports;
+        Writer writer = new StringWriter();
+
+        if (type instanceof GeneratedTransferObject) {
+            GeneratedTransferObject genTO = (GeneratedTransferObject) type;
+
+            final String currentPkg = "";
+
+            generateClassBody(writer, genTO, currentPkg, TAB, true);
+
         }
+
         return writer;
     }
 }