Bug 7425: Recognize instance-identifier in union template
[mdsal.git] / binding / mdsal-binding-java-api-generator / src / main / java / org / opendaylight / yangtools / sal / java / api / generator / UnionTemplate.xtend
index e65fa9fcf5cf95c73238ba4b0bd003b1dbfe8c6b..b2bc7c3e16cf3771aef21fc8d858717c9c50aaf5 100644 (file)
@@ -7,10 +7,12 @@
  */
 package org.opendaylight.yangtools.sal.java.api.generator
 
-import org.opendaylight.yangtools.sal.binding.model.api.GeneratedTransferObject
+import static org.opendaylight.yangtools.binding.generator.util.Types.*
+import com.google.common.base.Preconditions;
 import java.beans.ConstructorProperties
+import org.opendaylight.yangtools.sal.binding.model.api.GeneratedProperty
+import org.opendaylight.yangtools.sal.binding.model.api.GeneratedTransferObject
 import org.opendaylight.yangtools.sal.binding.model.api.Enumeration
-import static org.opendaylight.yangtools.binding.generator.util.Types.*
 
 /**
  * Template for generating JAVA class.
@@ -24,6 +26,23 @@ class UnionTemplate extends ClassTemplate {
      */
     new(GeneratedTransferObject genType) {
         super(genType)
+        if(isBaseEncodingImportRequired) {
+            this.importMap.put("BaseEncoding","com.google.common.io")
+        }
+    }
+
+    final private def boolean isBaseEncodingImportRequired() {
+        for (property : finalProperties) {
+            val propRet = property.returnType
+            if (propRet instanceof GeneratedTransferObject && (propRet as GeneratedTransferObject).typedef &&
+                (propRet as GeneratedTransferObject).properties != null &&
+                !(propRet as GeneratedTransferObject).properties.empty &&
+                ((propRet as GeneratedTransferObject).properties.size == 1) &&
+                (propRet as GeneratedTransferObject).properties.get(0).name.equals("value") &&
+                "byte[]".equals((propRet as GeneratedTransferObject).properties.get(0).returnType.name)) {
+                return true;
+            }
+        }
     }
 
     override constructors() '''
@@ -40,8 +59,7 @@ class UnionTemplate extends ClassTemplate {
     private def unionConstructors() '''
         «FOR property : finalProperties SEPARATOR "\n"»
             «val propRet = property.returnType»
-            «val isCharArray = "char[]".equals(propRet.name)»
-            «IF isCharArray»
+            «IF "char[]".equals(propRet.name)»
                 /**
                  * Constructor provided only for using in JMX. Don't use it for
                  * construction new object of this union type.
@@ -68,45 +86,15 @@ class UnionTemplate extends ClassTemplate {
                     super(«parentProperties.asArguments»);
                     this.«property.fieldName» = «property.fieldName»;
                     «FOR other : finalProperties»
-                        «IF property != other»
-                            «IF "value".equals(other.name)»
-                                «IF "java.lang.String".equals(propRet.fullyQualifiedName)»
-                                    ««« type string
-                                    this.«other.fieldName» = «property.fieldName».toCharArray();
-                                «ELSEIF "byte[]".equals(propRet.name)»
-                                    ««« type binary
-                                    this.«other.fieldName» = new «String.importedName»(«property.fieldName»).toCharArray();
-                                «ELSEIF propRet.fullyQualifiedName.startsWith("java.lang")
-                                    || propRet instanceof Enumeration
-                                    || propRet.fullyQualifiedName.startsWith("java.math")»
-                                    ««« type int*, uint, decimal64 or enumeration*
-                                    this.«other.fieldName» = «property.fieldName».toString().toCharArray();
-                                «ELSEIF propRet instanceof GeneratedTransferObject && (propRet as GeneratedTransferObject).unionType»
-                                    ««« union type
-                                    this.«other.fieldName» = «property.fieldName».getValue();
-                                «ELSEIF propRet instanceof GeneratedTransferObject // Is it a GeneratedTransferObject
-                                        && (propRet as GeneratedTransferObject).typedef  // Is it a typedef
-                                        && (propRet as GeneratedTransferObject).properties != null
-                                        && !(propRet as GeneratedTransferObject).properties.empty
-                                        && ((propRet as GeneratedTransferObject).properties.size == 1)
-                                        && (propRet as GeneratedTransferObject).properties.get(0).name.equals("value")
-                                        && BOOLEAN.equals((propRet as GeneratedTransferObject).properties.get(0).returnType)» // And the property value is of type boolean
-                                    ««« generated boolean typedef
-                                    this.«other.fieldName» = «property.fieldName».isValue().toString().toCharArray();
-                                «ELSE»
-                                    ««« generated type
-                                    this.«other.fieldName» = «property.fieldName».getValue().toString().toCharArray();
-                                «ENDIF»
-                            «ELSE»
-                                this.«other.fieldName» = null;
-                            «ENDIF»
+                        «IF property != other && !"value".equals(other.name)»
+                             this.«other.fieldName» = null;
                         «ENDIF»
                     «ENDFOR»
                 }
             «ENDIF»
         «ENDFOR»
     '''
-    
+
     def typeBuilder() {
         val outerCls = getOuterClassName(type);
         if(outerCls !== null) {
@@ -123,6 +111,70 @@ class UnionTemplate extends ClassTemplate {
         «ENDFOR»
     '''
 
+    override protected getterMethod(GeneratedProperty field) {
+        if (!"value".equals(field.name)) {
+            return super.getterMethod(field)
+        }
+
+        Preconditions.checkArgument("char[]".equals(field.returnType.importedName))
+
+        '''
+            public char[] «field.getterMethodName»() {
+                if («field.fieldName» == null) {
+                    «FOR property : finalProperties.filter([ p | !"value".equals(p.name)]) SEPARATOR " else"»
+                        if («property.fieldName» != null) {
+                            «val propRet = property.returnType»
+                            «IF "java.lang.String".equals(propRet.fullyQualifiedName)»
+                                ««« type string
+                                «field.fieldName» = «property.fieldName».toCharArray();
+                            «ELSEIF "org.opendaylight.yangtools.yang.binding.InstanceIdentifier".equals(propRet.fullyQualifiedName)»
+                                ««« type instance-identifier
+                                «field.fieldName» = «property.fieldName».toString().toCharArray();
+                            «ELSEIF "byte[]".equals(propRet.name)»
+                                ««« type binary
+                                «field.fieldName» = new «String.importedName»(«property.fieldName»).toCharArray();
+                            «ELSEIF propRet.fullyQualifiedName.startsWith("java.lang")
+                                || propRet instanceof Enumeration
+                                || propRet.fullyQualifiedName.startsWith("java.math")»
+                                ««« type int*, uint, decimal64 or enumeration*
+                                «field.fieldName» = «property.fieldName».toString().toCharArray();
+                            «ELSEIF propRet instanceof GeneratedTransferObject && (propRet as GeneratedTransferObject).unionType»
+                                ««« union type
+                                «field.fieldName» = «property.fieldName».getValue();
+                            «ELSEIF propRet instanceof GeneratedTransferObject // Is it a GeneratedTransferObject
+                                    && (propRet as GeneratedTransferObject).typedef  // Is it a typedef
+                                    && (propRet as GeneratedTransferObject).properties != null
+                                    && !(propRet as GeneratedTransferObject).properties.empty
+                                    && ((propRet as GeneratedTransferObject).properties.size == 1)
+                                    && (propRet as GeneratedTransferObject).properties.get(0).name.equals("value")
+                                    && BOOLEAN.equals((propRet as GeneratedTransferObject).properties.get(0).returnType)» // And the property value is of type boolean
+                                ««« generated boolean typedef
+                                «field.fieldName» = «property.fieldName».isValue().toString().toCharArray();
+                            «ELSEIF propRet instanceof GeneratedTransferObject // Is it a GeneratedTransferObject
+                                    && (propRet as GeneratedTransferObject).typedef  // Is it a typedef
+                                    && (propRet as GeneratedTransferObject).properties != null
+                                    && !(propRet as GeneratedTransferObject).properties.empty
+                                    && ((propRet as GeneratedTransferObject).properties.size == 1)
+                                    && (propRet as GeneratedTransferObject).properties.get(0).name.equals("value")
+                                    && "byte[]".equals((propRet as GeneratedTransferObject).properties.get(0).returnType.name)»
+                                ««« generated byte[] typedef
+                                «field.fieldName» = BaseEncoding.base64().encode(«property.fieldName».getValue()).toCharArray();
+                            «ELSE»
+                                ««« generated type
+                                «field.fieldName» = «property.fieldName».getValue().toString().toCharArray();
+                            «ENDIF»
+                        }
+                    «ENDFOR»
+                }
+                return «field.fieldName» == null ? null : «field.fieldName».clone();
+            }
+        '''
+    }
+
+    override def isReadOnly(GeneratedProperty field) {
+        return !"value".equals(field.name) && super.isReadOnly(field)
+    }
+
     override protected copyConstructor() '''
         /**
          * Creates a copy from Source Object.
@@ -135,7 +187,7 @@ class UnionTemplate extends ClassTemplate {
             «ENDIF»
             «IF !properties.empty»
                 «FOR p : properties»
-                    «IF p.returnType.importedName.contains("[]")»
+                    «IF !"value".equals(p.name) && p.returnType.importedName.contains("[]")»
                     this.«p.fieldName» = source.«p.fieldName» == null ? null : source.«p.fieldName».clone();
                     «ELSE»
                     this.«p.fieldName» = source.«p.fieldName»;