BUG-1485: switch ClassTemplate to new range enformcement 74/21274/13
authorRobert Varga <rovarga@cisco.com>
Wed, 27 May 2015 20:00:18 +0000 (22:00 +0200)
committerRobert Varga <rovarga@cisco.com>
Sun, 31 May 2015 17:25:09 +0000 (19:25 +0200)
Switch range checks for simple classes (typedefs and similar) to the new
range checker. Also move printRangeConstraint() from BaseTemplate to
BuilderTemplate, as it ends up being used only there.

Change-Id: I16e4c1faf239d838ff415c0173ef3d06acc61701
Signed-off-by: Robert Varga <rovarga@cisco.com>
code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BaseTemplate.xtend
code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/BuilderTemplate.xtend
code-generator/binding-java-api-generator/src/main/java/org/opendaylight/yangtools/sal/java/api/generator/ClassTemplate.xtend

index 9fed74f915527a3561e7d87439661519dcbf2426..ef40bb1c0cccbce81c056c431f753da903a33812 100644 (file)
@@ -334,27 +334,6 @@ abstract class BaseTemplate {
         «clazz.importedNumber» _constraint = «clazz.importedNumber».valueOf(«paramName»«IF isNestedType».getValue()«ENDIF».length«IF !isArray»()«ENDIF»);
     '''
 
-    def printRangeConstraint(Type returnType, String paramName, boolean isNestedType) '''
-        «IF BigDecimal.canonicalName.equals(returnType.fullyQualifiedName)»
-            «BigDecimal.importedName» _constraint = new «BigDecimal.importedName»(«paramName»«IF isNestedType».getValue()«ENDIF».toString());
-        «ELSE»
-            «IF isNestedType»
-                «val propReturnType = findProperty(returnType as GeneratedTransferObject, "value").returnType»
-                «IF propReturnType.fullyQualifiedName.equals(BigInteger.canonicalName)»
-                    «BigInteger.importedName» _constraint = «paramName».getValue();
-                «ELSE»
-                    «BigInteger.importedName» _constraint = «BigInteger.importedName».valueOf(«paramName».getValue());
-                «ENDIF»
-            «ELSE»
-                «IF returnType.fullyQualifiedName.equals(BigInteger.canonicalName)»
-                    «BigInteger.importedName» _constraint = «paramName»;
-                «ELSE»
-                    «BigInteger.importedName» _constraint = «BigInteger.importedName».valueOf(«paramName»);
-                «ENDIF»
-            «ENDIF»
-        «ENDIF»
-    '''
-
     def protected generateToString(Collection<GeneratedProperty> properties) '''
         «IF !properties.empty»
             @Override
@@ -462,7 +441,7 @@ abstract class BaseTemplate {
         return "new " + number + "(\"" + value + "\")"
     }
 
-    def private GeneratedProperty findProperty(GeneratedTransferObject gto, String name) {
+    def protected GeneratedProperty findProperty(GeneratedTransferObject gto, String name) {
         val props = gto.properties
         for (prop : props) {
             if (prop.name.equals(name)) {
index b8b8810ae67518d600819193cbe9de5aa5124e5d..22649f4967b59cb1d485e3e2ef414b39e8023df7 100644 (file)
@@ -532,6 +532,27 @@ class BuilderTemplate extends BaseTemplate {
         }
     '''
 
+    def private printRangeConstraint(Type returnType, String paramName, boolean isNestedType) '''
+        «IF BigDecimal.canonicalName.equals(returnType.fullyQualifiedName)»
+            «BigDecimal.importedName» _constraint = new «BigDecimal.importedName»(«paramName»«IF isNestedType».getValue()«ENDIF».toString());
+        «ELSE»
+            «IF isNestedType»
+                «val propReturnType = findProperty(returnType as GeneratedTransferObject, "value").returnType»
+                «IF propReturnType.fullyQualifiedName.equals(BigInteger.canonicalName)»
+                    «BigInteger.importedName» _constraint = «paramName».getValue();
+                «ELSE»
+                    «BigInteger.importedName» _constraint = «BigInteger.importedName».valueOf(«paramName».getValue());
+                «ENDIF»
+            «ELSE»
+                «IF returnType.fullyQualifiedName.equals(BigInteger.canonicalName)»
+                    «BigInteger.importedName» _constraint = «paramName»;
+                «ELSE»
+                    «BigInteger.importedName» _constraint = «BigInteger.importedName».valueOf(«paramName»);
+                «ENDIF»
+            «ENDIF»
+        «ENDIF»
+    '''
+
     def private generateLengthMethod(String methodName, Type type, String className, String varName) '''
         «val Restrictions restrictions = type.restrictions»
         «IF restrictions != null && !(restrictions.lengthConstraints.empty)»
index e32a990559e34d89ed39e9f6eab79164b5df47a0..aeec8bdceca6b276a2c78ef929884dd21b21792b 100644 (file)
@@ -59,6 +59,8 @@ class ClassTemplate extends BaseTemplate {
 
     protected val GeneratedTransferObject genTO;
 
+    private val AbstractRangeGenerator<?> rangeGenerator
+
     /**
      * Creates instance of this class with concrete <code>genType</code>.
      *
@@ -83,6 +85,13 @@ class ClassTemplate extends BaseTemplate {
         this.enums = genType.enumerations
         this.consts = genType.constantDefinitions
         this.enclosedGeneratedTypes = genType.enclosedTypes
+
+        if (restrictions != null && !restrictions.rangeConstraints.nullOrEmpty) {
+            rangeGenerator = AbstractRangeGenerator.forType(findProperty(genType, "value").returnType)
+            Preconditions.checkNotNull(rangeGenerator)
+        } else {
+            rangeGenerator = null
+        }
     }
 
     /**
@@ -117,7 +126,11 @@ class ClassTemplate extends BaseTemplate {
                 !restrictions.lengthConstraints.nullOrEmpty)»
             «generateConstraints»
 
+            «IF !restrictions.rangeConstraints.nullOrEmpty»
+            «rangeGenerator.generateRangeChecker("_value", restrictions.rangeConstraints)»
+            «ENDIF»
             «ENDIF»
+
             «constructors»
 
             «defaultInstance»
@@ -349,7 +362,13 @@ class ClassTemplate extends BaseTemplate {
                 «generateLengthRestriction(returnType, restrictions, paramName, isNestedType)»
             «ENDIF»
             «IF !restrictions.rangeConstraints.empty»
-                «generateRangeRestriction(returnType, paramName, isNestedType)»
+                if («paramName» != null) {
+                    «IF isNestedType»
+                        «rangeGenerator.generateRangeCheckerCall(paramName, paramName + ".getValue()")»
+                    «ELSE»
+                        «rangeGenerator.generateRangeCheckerCall(paramName, paramName)»
+                    «ENDIF»
+                }
             «ENDIF»
         «ENDIF»
     '''
@@ -370,21 +389,6 @@ class ClassTemplate extends BaseTemplate {
         }
     '''
 
-    def private generateRangeRestriction(Type returnType, String paramName, boolean isNestedType) '''
-        if («paramName» != null) {
-            «printRangeConstraint(returnType, paramName, isNestedType)»
-            boolean isValidRange = false;
-            for («Range.importedName»<«returnType.importedNumber»> r : «IF isNestedType»«returnType.importedName».«ENDIF»range()) {
-                if (r.contains(_constraint)) {
-                    isValidRange = true;
-                }
-            }
-            if (!isValidRange) {
-                throw new IllegalArgumentException(String.format("Invalid range: %s, expected: %s.", «paramName», «IF isNestedType»«returnType.importedName».«ENDIF»range()));
-            }
-        }
-    '''
-
     def protected copyConstructor() '''
     /**
      * Creates a copy from Source Object.