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 877bcfce630113940aadbc238fd2b7700f02911c..31b94a65cad703d8b78ca79c8fbaf94f62ea7f70 100644 (file)
@@ -12,97 +12,127 @@ import static org.opendaylight.controller.sal.java.api.generator.Constants.*;
 import java.io.IOException;
 import java.io.StringWriter;
 import java.io.Writer;
-import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.opendaylight.controller.sal.binding.model.api.CodeGenerator;
-import org.opendaylight.controller.sal.binding.model.api.Enumeration;
-import org.opendaylight.controller.sal.binding.model.api.GeneratedProperty;
-import org.opendaylight.controller.sal.binding.model.api.GeneratedTransferIdentityObject;
-import org.opendaylight.controller.sal.binding.model.api.GeneratedTransferObject;
-import org.opendaylight.controller.sal.binding.model.api.Type;
+import org.opendaylight.controller.sal.binding.model.api.*;
 
 public final class ClassCodeGenerator implements CodeGenerator {
 
-    private Map<String, LinkedHashMap<String, Integer>> imports;
+    private Map<String, String> imports;
+
+    private void generatePackage(Writer writer, String packageName) throws IOException {
+        writer.write(GeneratorUtil.createPackageDeclaration(packageName));
+        writer.write(NL);
+    }
+
+    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);
+    }
+
+    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.createClassDeclaration(genTO, indent, imports, genTO.isAbstract(), isInnerClass));
+        writer.write(NL);
+        writer.write(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);
+            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);
+
+            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 (!genTO.getHashCodeIdentifiers().isEmpty()) {
+                writer.write(GeneratorUtil.createHashCode(genTO.getHashCodeIdentifiers(), indent + TAB) + NL);
+            }
+
+            if (!genTO.getEqualsIdentifiers().isEmpty()) {
+                writer.write(GeneratorUtil.createEquals(genTO, genTO.getEqualsIdentifiers(), indent + TAB) + NL);
+            }
+
+            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;            
+            GeneratedTransferObject genTO = (GeneratedTransferObject) type;
             imports = GeneratorUtil.createImports(genTO);
-            
+
             final String currentPkg = genTO.getPackageName();
-            final List<GeneratedProperty> fields = genTO.getProperties();
-            final List<Enumeration> enums = genTO.getEnumerations();
 
-            writer.write(GeneratorUtil.createPackageDeclaration(currentPkg));
-            writer.write(NL);
+            generatePackage(writer, currentPkg);
 
-            List<String> importLines = GeneratorUtil.createImportLines(imports);
-            for (String line : importLines) {
-                writer.write(line + NL);
-            }
-            writer.write(NL);
+            generateImports(writer);
 
-            writer.write(GeneratorUtil.createClassDeclaration(genTO, "",
-                    imports, genTO.isAbstract()));
-            writer.write(NL);
-            writer.write(NL);
-            
-            if (enums != null) {           
-                       EnumGenerator enumGenerator = new EnumGenerator();
-               for ( Enumeration e : enums ) {                         
-                       writer.write(enumGenerator.generateInnerEnumeration(e, TAB).toString());
-                       writer.write(NL);
-               }
-            }
+            generateClassBody(writer, genTO, currentPkg, NO_INDENT, false);
 
-            if (fields != null) {
-                for (GeneratedProperty field : fields) {
-                    writer.write(GeneratorUtil.createField(field, TAB, imports,
-                            currentPkg) + NL);
-                }
-                writer.write(NL);
-                writer.write(GeneratorUtil.createConstructor(genTO, TAB,
-                        imports, genTO.isAbstract()) + NL);
-                writer.write(NL);
-                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);
+        }
+        return writer;
+    }
 
-                if (!genTO.getHashCodeIdentifiers().isEmpty()) {
-                    writer.write(GeneratorUtil.createHashCode(
-                            genTO.getHashCodeIdentifiers(), TAB)
-                            + NL);
-                }
+    public Writer generateOnlyClass(Type type, Map<String, String> imports) throws IOException {
+        this.imports = imports;
+        Writer writer = new StringWriter();
 
-                if (!genTO.getEqualsIdentifiers().isEmpty()) {
-                    writer.write(GeneratorUtil.createEquals(genTO,
-                            genTO.getEqualsIdentifiers(), TAB)
-                            + NL);
-                }
+        if (type instanceof GeneratedTransferObject) {
+            GeneratedTransferObject genTO = (GeneratedTransferObject) type;
 
-                if (!genTO.getToStringIdentifiers().isEmpty()) {
-                    writer.write(GeneratorUtil.createToString(genTO,
-                            genTO.getToStringIdentifiers(), TAB)
-                            + NL);
+            final String currentPkg = "";
 
-                }
+            generateClassBody(writer, genTO, currentPkg, TAB, true);
 
-                writer.write(RCB);
-            }
         }
+
         return writer;
     }
-
 }