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
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