Implemented length statement. Added new method to Builder classes.
[yangtools.git] / code-generator / binding-java-api-generator / src / main / java / org / opendaylight / yangtools / sal / java / api / generator / BuilderTemplate.xtend
index 6857ed2be940f5e8ece8b0a0c9ccad73f4e3e53d..0bf6252fbb2929423e5fea3ccfdca1ecccb7b6ff 100644 (file)
@@ -1,5 +1,6 @@
 package org.opendaylight.yangtools.sal.java.api.generator\r
 \r
+import java.util.Arrays;\r
 import java.util.LinkedHashSet\r
 import java.util.List\r
 import java.util.Map\r
@@ -15,8 +16,9 @@ import org.opendaylight.yangtools.sal.binding.model.api.Type
 import org.opendaylight.yangtools.yang.binding.Augmentable\r
 import static org.opendaylight.yangtools.binding.generator.util.Types.*\r
 import java.util.HashMap\r
-import java.util.Collections\r
-\r
+import java.util.Collections\rimport org.opendaylight.yangtools.yang.binding.DataObject
+import java.util.ArrayList
+
 /**\r
  * Template for generating JAVA builder classes. \r
  */\r
@@ -203,6 +205,10 @@ class BuilderTemplate extends BaseTemplate {
 \r
             «generateFields(false)»\r
 \r
+            «generateConstructorsFromIfcs(type)»\r
+\r
+            «generateSetterFromIfcs(type)»\r
+\r
             «generateGetters(false)»\r
 \r
             «generateSetters»\r
@@ -213,6 +219,8 @@ class BuilderTemplate extends BaseTemplate {
 \r
             private static final class «type.name»«IMPL» implements «type.name» {\r
 \r
+                «implementedInterfaceGetter»\r
+\r
                 «generateFields(true)»\r
 \r
                 «generateConstructor»\r
@@ -227,6 +235,85 @@ class BuilderTemplate extends BaseTemplate {
         }\r
     '''\r
 \r
+    def private generateConstructorsFromIfcs(Type type) '''\r
+        public «type.name»«BUILDER»() {\r
+        } \r
+        «IF (type instanceof GeneratedType && !(type instanceof GeneratedTransferObject))»\r
+        «val ifc = type as GeneratedType»\r
+        «FOR impl : ifc.implements»\r
+            «generateConstructorFromIfc(impl)»\r
+        «ENDFOR»\r
+        «ENDIF»\r
+    '''\r
+\r
+    def private generateConstructorFromIfc(Type impl) '''\r
+        «IF (impl instanceof GeneratedType) &&  !((impl as GeneratedType).methodDefinitions.empty)»\r
+        «val implType = impl as GeneratedType»\r
+\r
+        public «type.name»«BUILDER»(«implType.fullyQualifiedName» arg) {\r
+            «printConstructorProperties(implType)»\r
+        }\r
+        «FOR implTypeImplement : implType.implements»\r
+            «generateConstructorFromIfc(implTypeImplement)»\r
+        «ENDFOR»\r
+        «ENDIF»\r
+    '''\r
+\r
+    def private printConstructorProperties(Type implementedIfc) '''\r
+        «IF (implementedIfc instanceof GeneratedType && !(implementedIfc instanceof GeneratedTransferObject))»\r
+        «val ifc = implementedIfc as GeneratedType»\r
+        «FOR getter : ifc.methodDefinitions»\r
+            this._«getter.propertyNameFromGetter» = arg.«getter.name»();\r
+        «ENDFOR»\r
+        «FOR impl : ifc.implements»\r
+        «printConstructorProperties(impl)»\r
+        «ENDFOR»\r
+        «ENDIF»\r
+    '''\r
+\r
+    def private generateSetterFromIfcs(Type type) '''\r
+        «IF (type instanceof GeneratedType && !(type instanceof GeneratedTransferObject))»\r
+        «val ifc = type as GeneratedType»\r
+        «val List<Type> done = new ArrayList()»\r
+        public void fieldsFrom(«DataObject.importedName» arg) {\r
+            «FOR impl : ifc.implements»\r
+                «generateSettersForIfc(impl, done)»\r
+            «ENDFOR»\r
+        }\r
+        «ENDIF»\r
+    '''\r
+\r
+    def private generateSettersForIfc(Type impl, List<Type> done) '''\r
+        «IF (impl instanceof GeneratedType) &&  !((impl as GeneratedType).methodDefinitions.empty)»\r
+            «val implType = impl as GeneratedType»\r
+            «val boolean added = done.contains(impl)»\r
+            «IF !(added)»\r
+                if (arg instanceof «implType.fullyQualifiedName») {\r
+                    «printSetterProperties(implType, done)»\r
+                }\r
+            «ENDIF»\r
+            «FOR implTypeImplement : implType.implements»\r
+                «generateSettersForIfc(implTypeImplement, done)»\r
+            «ENDFOR»\r
+        «ENDIF»\r
+    '''\r
+\r
+    def private printSetterProperties(Type implementedIfc, List<Type> done) '''\r
+        «IF (implementedIfc instanceof GeneratedType && !(implementedIfc instanceof GeneratedTransferObject))»\r
+        «val ifc = implementedIfc as GeneratedType»\r
+        «val boolean added = done.contains(ifc)»\r
+        «IF !(added)»\r
+        «FOR getter : ifc.methodDefinitions»\r
+            this._«getter.propertyNameFromGetter» = ((«implementedIfc.fullyQualifiedName»)arg).«getter.name»();\r
+        «ENDFOR»\r
+        «val add = done.add(ifc)»\r
+        «ENDIF»\r
+        «FOR impl : ifc.implements»\r
+        «printSetterProperties(impl, done)»\r
+        «ENDFOR»\r
+        «ENDIF»\r
+    '''\r
+\r
        /**\r
         * Template method which generates class attributes.\r
         * \r
@@ -252,6 +339,8 @@ class BuilderTemplate extends BaseTemplate {
     def private generateSetters() '''\r
         «FOR field : properties SEPARATOR '\n'»\r
             public «type.name»«BUILDER» set«field.name.toFirstUpper»(«field.returnType.importedName» value) {\r
+                «generateLengthRestrictions(field.returnType, "value")»\r
+\r
                 this.«field.fieldName» = value;\r
                 return this;\r
             }\r
@@ -264,7 +353,7 @@ class BuilderTemplate extends BaseTemplate {
             }\r
         «ENDIF»\r
     '''\r
-    \r
+\r
     /**\r
      * Template method which generate constructor for IMPL class.\r
      * \r
@@ -322,7 +411,7 @@ class BuilderTemplate extends BaseTemplate {
                 int result = 1;\r
                 «FOR property : properties»\r
                     «IF property.returnType.name.contains("[")»\r
-                    result = prime * result + ((«property.fieldName» == null) ? 0 : java.util.Arrays.hashCode(«property.fieldName»));\r
+                    result = prime * result + ((«property.fieldName» == null) ? 0 : «Arrays.importedName».hashCode(«property.fieldName»));\r
                     «ELSE»\r
                     result = prime * result + ((«property.fieldName» == null) ? 0 : «property.fieldName».hashCode());\r
                     «ENDIF»\r
@@ -361,7 +450,7 @@ class BuilderTemplate extends BaseTemplate {
                             return false;\r
                         }\r
                     «IF property.returnType.name.contains("[")»\r
-                    } else if(!java.util.Arrays.equals(«fieldName», other.«fieldName»)) {\r
+                    } else if(!«Arrays.importedName».equals(«fieldName», other.«fieldName»)) {\r
                     «ELSE»\r
                     } else if(!«fieldName».equals(other.«fieldName»)) {\r
                     «ENDIF»\r
@@ -387,5 +476,11 @@ class BuilderTemplate extends BaseTemplate {
         '''«type.fullyQualifiedName»Builder'''.toString\r
     }\r
     \r
+    def implementedInterfaceGetter() '''\r
+    public «Class.importedName»<«type.importedName»> getImplementedInterface() {\r
+        return «type.importedName».class;\r
+    }\r
+    '''\r
+    \r
 }\r
 \r