Optimized method "fieldsFrom" in builder classes. 07/2507/1
authorMartin Vitez <mvitez@cisco.com>
Thu, 7 Nov 2013 14:11:48 +0000 (15:11 +0100)
committerMartin Vitez <mvitez@cisco.com>
Thu, 7 Nov 2013 14:11:48 +0000 (15:11 +0100)
Added javadoc to method. Added throw clause if given argument is none of valid types.

Signed-off-by: Martin Vitez <mvitez@cisco.com>
code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BuilderTemplate.xtend

index 0bf6252fbb2929423e5fea3ccfdca1ecccb7b6ff..7471406e83b2303e58096658699fc4be1191f9a6 100644 (file)
@@ -18,6 +18,8 @@ import static org.opendaylight.yangtools.binding.generator.util.Types.*
 import java.util.HashMap\r
 import java.util.Collections\rimport org.opendaylight.yangtools.yang.binding.DataObject
 import java.util.ArrayList
+import java.util.HashSet
+import java.util.Collection
 
 /**\r
  * Template for generating JAVA builder classes. \r
@@ -274,46 +276,103 @@ class BuilderTemplate extends BaseTemplate {
     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
+        «val List<Type> done = ifc.getBaseIfcs»\r
+        «generateCommentForSetter(ifc)»\r
         public void fieldsFrom(«DataObject.importedName» arg) {\r
-            «FOR impl : ifc.implements»\r
+            boolean isValidArg = false;\r
+            «FOR impl : ifc.getAllIfcs»\r
                 «generateSettersForIfc(impl, done)»\r
             «ENDFOR»\r
+            if (!isValidArg) {\r
+                throw new IllegalArgumentException(\r
+                  "expected one of: «ifc.getAllIfcs.toListOfNames» \n" +\r
+                  "but was: " + arg\r
+                );\r
+            }\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
+            if (arg instanceof «implType.fullyQualifiedName») {\r
+                «printSetterProperties(implType)»\r
+                isValidArg = true;\r
+            }\r
+        «ENDIF»\r
+    '''\r
+\r
+    def private generateSettersForNestedIfc(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
+                    «printSetterProperties(implType)»\r
                 }\r
             «ENDIF»\r
             «FOR implTypeImplement : implType.implements»\r
-                «generateSettersForIfc(implTypeImplement, done)»\r
+                «generateSettersForNestedIfc(implTypeImplement, done)»\r
             «ENDFOR»\r
         «ENDIF»\r
     '''\r
 \r
-    def private printSetterProperties(Type implementedIfc, List<Type> done) '''\r
+    def private printSetterProperties(Type implementedIfc) '''\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
+    def private generateCommentForSetter(GeneratedType type) '''\r
+        /**\r
+         Set fields from given grouping argument. Valid argument is instance of one of following types:\r
+         * <ul>\r
+         «FOR impl : type.getAllIfcs»\r
+         * <li>«impl.fullyQualifiedName»</li>\r
+         «ENDFOR»\r
+         * </ul>\r
+         *\r
+         * @param arg grouping object\r
+         * @throws IllegalArgumentException if given argument is none of valid types\r
+        */\r
+    '''\r
+\r
+    private def List<Type> getBaseIfcs(GeneratedType type) {\r
+        val List<Type> baseIfcs = new ArrayList();\r
+        for (ifc : type.implements) {\r
+            if (ifc instanceof GeneratedType && !(ifc as GeneratedType).methodDefinitions.empty) {\r
+                baseIfcs.add(ifc)\r
+            }\r
+        }\r
+        return baseIfcs \r
+    }\r
+\r
+    private def Set<Type> getAllIfcs(Type type) {\r
+        val Set<Type> baseIfcs = new HashSet()\r
+        if (type instanceof GeneratedType && !(type instanceof GeneratedTransferObject)) {\r
+            val ifc = type as GeneratedType\r
+            for (impl : ifc.implements) {\r
+                if (impl instanceof GeneratedType && !(impl as GeneratedType).methodDefinitions.empty) {\r
+                    baseIfcs.add(impl)\r
+                }\r
+                baseIfcs.addAll(impl.getAllIfcs)\r
+            }\r
+        }\r
+        return baseIfcs \r
+    }\r
+\r
+    private def List<String> toListOfNames(Collection<Type> types) {\r
+        val List<String> names = new ArrayList\r
+        for (type : types) {\r
+            names.add(type.fullyQualifiedName)\r
+        }\r
+        return names\r
+    }\r
+\r
        /**\r
         * Template method which generates class attributes.\r
         * \r