MDSAL-292: Binding v2 - Pattern attribute ignored for leaf-list/leaf
[mdsal.git] / binding2 / mdsal-binding2-java-api-generator / src / main / twirl / org / opendaylight / mdsal / binding / javav2 / java / api / generator / builderTemplate.scala.txt
old mode 100644 (file)
new mode 100755 (executable)
index f9c732b..5a74bdb
 @import org.opendaylight.mdsal.binding.javav2.java.api.generator.renderers.BuilderRenderer.toListOfNames
 @import org.opendaylight.mdsal.binding.javav2.java.api.generator.rangeGenerators.AbstractRangeGenerator
 @import org.opendaylight.mdsal.binding.javav2.java.api.generator.rangeGenerators.LengthGenerator
+@import org.opendaylight.mdsal.binding.javav2.util.BindingMapping
+@import org.opendaylight.mdsal.binding.javav2.generator.util.Types
 @import org.opendaylight.mdsal.binding.javav2.model.api.ConcreteType
 @import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedType
 @import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedTypeForBuilder
 @import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedTransferObject
 @import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedProperty
 @import org.opendaylight.mdsal.binding.javav2.model.api.Type
+@import org.opendaylight.mdsal.binding.javav2.model.api.ParameterizedType
 @import org.opendaylight.yangtools.concepts.Builder
 
 @(genType: GeneratedType, properties: Set[GeneratedProperty], importedNames: Map[String, String],
 ImportedNamesWithProperties: Map[GeneratedProperty, String], augmentField: GeneratedProperty, copyConstructorHelper: String,
 getterMethods: List[String], parentTypeForBuilderName: String, childTreeNode: Boolean, childTreeNodeIdent: Boolean,
-keyTypeName: String, instantiable: Boolean)
+keyTypeName: String, instantiable: Boolean, constants: String)
 @if(genType != null) {
 @{wrapToDocumentation(formatDataForJavaDocBuilder(importedNames.get("genType")))}
 public class @{genType.getName}Builder implements @{getSimpleNameForBuilder} <@{importedNames.get("genType")}> {
 
     @generateFields(false)
 
+    @{constants}
+
     @generateAugmentField(false)
 
     @generateConstructorsFromIfcs()
@@ -251,40 +256,14 @@ public class @{genType.getName}Builder implements @{getSimpleNameForBuilder} <@{
 
 @generateSetters() = {
     @for(field <- properties) {
-        @if(!field.getReturnType.isInstanceOf[GeneratedType] && getRestrictions(field.getReturnType) != null) {
-            @if(getRestrictions(field.getReturnType).getRangeConstraint.isPresent) {
-                @{AbstractRangeGenerator.forType(field.getReturnType).generateRangeChecker(toFirstUpper(field.getName),
-                getRestrictions(field.getReturnType).getRangeConstraint.get)}
-            }
-            @if(getRestrictions(field.getReturnType).getLengthConstraint.isPresent) {
-                @{LengthGenerator.generateLengthChecker(fieldName(field), field.getReturnType,
-                getRestrictions(field.getReturnType).getLengthConstraint.get)}
-            }
-        }
-
-        public @{genType.getName}Builder set@{toFirstUpper(field.getName)}(final @{field.getReturnType.getFullyQualifiedName} value) {
-        @if(!field.getReturnType.isInstanceOf[GeneratedType] && getRestrictions(field.getReturnType) != null) {
-            if (value != null) {
-            @if(getRestrictions(field.getReturnType).getRangeConstraint.isPresent) {
-                @if(field.getReturnType.isInstanceOf[ConcreteType]) {
-                    @{AbstractRangeGenerator.forType(field.getReturnType).generateRangeCheckerCall(toFirstUpper(field.getName), "value")}
-                } else {
-                    @{AbstractRangeGenerator.forType(field.getReturnType).generateRangeCheckerCall(toFirstUpper(field.getName), "value.getValue()")}
-                }
-            }
-            @if(getRestrictions(field.getReturnType).getLengthConstraint.isPresent) {
-                @if(field.getReturnType.isInstanceOf[ConcreteType]) {
-                    @{LengthGenerator.generateLengthCheckerCall(fieldName(field), "value")}
-                } else {
-                    @{LengthGenerator.generateLengthCheckerCall(fieldName(field), "value.getValue()")}
-                }
-            }
-            }
-        }
-            this.@{fieldName(field)} = value;
-            return this;
+        @if(field.getReturnType.isInstanceOf[ParameterizedType]
+            && field.getReturnType.asInstanceOf[ParameterizedType].getRawType.equals(Types.typeForClass(classOf[List[_]]))) {
+          @generateSetter(field, field.getReturnType.asInstanceOf[ParameterizedType].getActualTypeArguments()(0), true)
+        } else {
+          @generateSetter(field, field.getReturnType, false)
         }
     }
+
     @if(augmentField != null) {
         public @{genType.getName}Builder add@{toFirstUpper(augmentField.getName)}(@{importedNames.get("class")}<? extends @{importedNames.get("augmentFieldReturnType")}> augmentationType, @{importedNames.get("augmentFieldReturnType")} augmentation) {
             if (augmentation == null) {
@@ -309,6 +288,69 @@ public class @{genType.getName}Builder implements @{getSimpleNameForBuilder} <@{
     }
 }
 
+@generateSetter(field: GeneratedProperty, actualType: Type, isList: Boolean) = {
+    @if(!actualType.isInstanceOf[GeneratedType] && getRestrictions(actualType) != null) {
+        @if(getRestrictions(actualType).getRangeConstraint.isPresent) {
+            @{AbstractRangeGenerator.forType(actualType).generateRangeChecker(toFirstUpper(field.getName),
+            getRestrictions(actualType).getRangeConstraint.get)}
+        }
+        @if(getRestrictions(actualType).getLengthConstraint.isPresent) {
+            @{LengthGenerator.generateLengthChecker(fieldName(field), actualType,
+            getRestrictions(actualType).getLengthConstraint.get)}
+        }
+    }
+
+    @if(isList) {
+        public @{genType.getName}Builder set@{toFirstUpper(field.getName)}(final @{ImportedNamesWithProperties.get(field)} values) {
+            @if(!actualType.isInstanceOf[GeneratedType] && getRestrictions(actualType) != null) {
+                if (values != null) {
+                    for (@{actualType.getFullyQualifiedName} value : values) {
+                        @checkArgument(field, actualType)
+                    }
+                }
+            }
+            this.@{fieldName(field)} = values;
+            return this;
+        }
+    } else {
+        public @{genType.getName}Builder set@{toFirstUpper(field.getName)}(final @{ImportedNamesWithProperties.get(field)} value) {
+            @if(!actualType.isInstanceOf[GeneratedType] && getRestrictions(actualType) != null) {
+                if (value != null) {
+                    @checkArgument(field, actualType)
+                }
+            }
+            this.@{fieldName(field)} = value;
+            return this;
+        }
+    }
+}
+
+@checkArgument(field: GeneratedProperty, actualType: Type) = {
+    @if(getRestrictions(actualType).getRangeConstraint.isPresent) {
+        @if(actualType.isInstanceOf[ConcreteType]) {
+            @{AbstractRangeGenerator.forType(actualType).generateRangeCheckerCall(toFirstUpper(field.getName), "value")}
+        } else {
+            @{AbstractRangeGenerator.forType(actualType).generateRangeCheckerCall(toFirstUpper(field.getName), "value.getValue()")}
+        }
+    }
+    @if(getRestrictions(actualType).getLengthConstraint.isPresent) {
+        @if(actualType.isInstanceOf[ConcreteType]) {
+            @{LengthGenerator.generateLengthCheckerCall(fieldName(field), "value")}
+        } else {
+            @{LengthGenerator.generateLengthCheckerCall(fieldName(field), "value.getValue()")}
+        }
+    }
+    @for(currentConstant <- genType.getConstantDefinitions) {
+        @defining(fieldName(field)) { suffix =>
+        @if(currentConstant.getName.startsWith(BindingMapping.PATTERN_CONSTANT_NAME)
+                && suffix.toUpperCase().equals(currentConstant.getName.substring(BindingMapping.PATTERN_CONSTANT_NAME.length))
+                && currentConstant.getValue.isInstanceOf[List[_]]) {
+            @{importedNames.get("codeHelpers")}.checkPattern(value, @{BindingMapping.MEMBER_PATTERN_LIST}@{suffix}, @{BindingMapping.MEMBER_REGEX_LIST}@{suffix};
+        }
+        }
+    }
+}
+
 @generateGetters(addOverride: Boolean) = {
     @if(!getterMethods.isEmpty) {
         @for(property <- getterMethods) {