Implemented range validation (Bug 178).
[mdsal.git] / code-generator / binding-java-api-generator / src / main / java / org / opendaylight / yangtools / sal / java / api / generator / ClassTemplate.xtend
index de3ceb454dc68a7d78554cad3fffd9ff2ade9734..5f001d8401c043ad819c9348340e8ec4a55aa2ed 100644 (file)
@@ -12,6 +12,9 @@ import java.util.Collections\rimport java.util.Arrays
 import org.opendaylight.yangtools.sal.binding.model.api.Restrictions
 import com.google.common.collect.Range
 import java.util.regex.Pattern
+import com.google.common.io.BaseEncoding
+import java.beans.ConstructorProperties
+import com.google.common.collect.Lists
 
 /**\r
  * Template for generating JAVA class. \r
@@ -95,7 +98,11 @@ class ClassTemplate extends BaseTemplate {
             «enumDeclarations»\r
             «constantsDeclarations»\r
             «generateFields»\r
+\r
             «constructors»\r
+            \r
+            «defaultInstance»\r
+\r
             «FOR field : properties SEPARATOR "\n"»\r
                 «field.getterMethod»\r
                 «IF !field.readOnly»\r
@@ -107,7 +114,7 @@ class ClassTemplate extends BaseTemplate {
 \r
             «generateEquals»\r
 \r
-            «generateToString»\r
+            «generateToString(genTO.toStringIdentifiers)»\r
 \r
             «generateGetLength»\r
 \r
@@ -148,6 +155,9 @@ class ClassTemplate extends BaseTemplate {
     '''\r
     \r
     def protected allValuesConstructor() '''\r
+    «IF genTO.typedef && !allProperties.empty && allProperties.size == 1 && allProperties.get(0).name.equals("value")»\r
+        @«ConstructorProperties.importedName»("value")\r
+    «ENDIF»\r
     public «type.name»(«allProperties.asArgumentsDeclaration») {\r
         «IF false == parentProperties.empty»\r
             super(«parentProperties.asArguments»);\r
@@ -198,7 +208,7 @@ class ClassTemplate extends BaseTemplate {
         «ENDFOR»\r
     }\r
     '''\r
-    \r
+\r
     def protected parentConstructor() '''\r
     /**\r
      * Creates a new instance from «genTO.superType.importedName»\r
@@ -209,9 +219,46 @@ class ClassTemplate extends BaseTemplate {
             super(source);\r
     }\r
     '''\r
-    \r
 \r
-    \r
+    def protected defaultInstance() '''\r
+        «IF genTO.typedef && !allProperties.empty && !genTO.unionType»\r
+            «val prop = allProperties.get(0)»\r
+            «IF !("org.opendaylight.yangtools.yang.binding.InstanceIdentifier".equals(prop.returnType.fullyQualifiedName))»\r
+            public static «genTO.name» getDefaultInstance(String defaultValue) {\r
+                «IF "byte[]".equals(prop.returnType.name)»\r
+                    «BaseEncoding.importedName» baseEncoding = «BaseEncoding.importedName».base64(); \r
+                    return new «genTO.name»(baseEncoding.decode(defaultValue));\r
+                «ELSEIF "java.lang.String".equals(prop.returnType.fullyQualifiedName)»\r
+                    return new «genTO.name»(defaultValue);\r
+                «ELSEIF allProperties.size > 1»\r
+                    «bitsArgs»\r
+                «ELSE»\r
+                    return new «genTO.name»(new «prop.returnType.importedName»(defaultValue));\r
+                «ENDIF»\r
+            }\r
+            «ENDIF»\r
+        «ENDIF»\r
+    '''\r
+\r
+    def protected bitsArgs() '''\r
+        «List.importedName»<«String.importedName»> properties = «Lists.importedName».newArrayList(«allProperties.propsAsArgs»);\r
+        if (!properties.contains(defaultValue)) {\r
+            throw new «IllegalArgumentException.importedName»("invalid default parameter");\r
+        }\r
+        int i = 0;\r
+        return new «genTO.name»(\r
+        «FOR prop : allProperties SEPARATOR ","»\r
+            properties.get(i++).equals(defaultValue) ? new «Boolean.importedName»("true") : null\r
+        «ENDFOR»\r
+        );\r
+    '''\r
+\r
+    def protected propsAsArgs(Iterable<GeneratedProperty> properties) '''\r
+        «FOR prop : properties SEPARATOR ","»\r
+            "«prop.name»"\r
+        «ENDFOR»\r
+    '''\r
+\r
     /**\r
      * Template method which generates JAVA class declaration.\r
      * \r
@@ -375,38 +422,20 @@ class ClassTemplate extends BaseTemplate {
         «ENDIF»\r
     '''\r
 \r
-    /**\r
-     * Template method which generates the method <code>toString()</code>.\r
-     *\r
-     * @return string with the <code>toString()</code> method definition in JAVA format\r
-     */\r
-    def protected generateToString() '''\r
-        «IF !genTO.toStringIdentifiers.empty»\r
-            @Override\r
-            public String toString() {\r
-                StringBuilder builder = new StringBuilder();\r
-                «val properties = genTO.toStringIdentifiers»\r
-                builder.append("«type.name» [«properties.get(0).fieldName»=");\r
-                «IF properties.get(0).returnType.name.contains("[")»\r
-                    builder.append(«Arrays.importedName».toString(«properties.get(0).fieldName»));\r
-                «ELSE»\r
-                    builder.append(«properties.get(0).fieldName»);\r
-                «ENDIF»\r
-                «FOR i : 1..<genTO.toStringIdentifiers.size»\r
-                    builder.append(", «properties.get(i).fieldName»=");\r
-                    «IF properties.get(i).returnType.name.contains("[")»\r
-                        builder.append(«Arrays.importedName».toString(«properties.get(i).fieldName»));\r
-                    «ELSE»\r
-                        builder.append(«properties.get(i).fieldName»);\r
-                    «ENDIF»\r
+    def private generateGetLength() '''\r
+        «IF restrictions != null && !(restrictions.lengthConstraints.empty)»\r
+            public static «List.importedName»<«Range.importedName»<Integer>> getLength() {\r
+                final «List.importedName»<«Range.importedName»<Integer>> result = new «ArrayList.importedName»<>();\r
+                «List.importedName»<«Range.importedName»<«Integer.importedName»>> lengthConstraints = new «ArrayList.importedName»<>(); \r
+                «FOR r : restrictions.lengthConstraints»\r
+                    result.add(«Range.importedName».closed(«r.min», «r.max»));\r
                 «ENDFOR»\r
-                builder.append("]");\r
-                return builder.toString();\r
+                return result;\r
             }\r
         «ENDIF»\r
     '''\r
 \r
-    def private generateGetLength() '''\r
+    def private generateGetRange() '''\r
         «IF restrictions != null && !(restrictions.lengthConstraints.empty)»\r
             public static «List.importedName»<«Range.importedName»<Integer>> getLength() {\r
                 final «List.importedName»<«Range.importedName»<Integer>> result = new «ArrayList.importedName»<>();\r