Improve often-used class imports
[mdsal.git] / binding / mdsal-binding-java-api-generator / src / main / java / org / opendaylight / mdsal / binding / java / api / generator / ClassTemplate.xtend
index 0f5620597994d7326b60f0ab86745aa4ba79f596..fac6cf25c5aed0a114667df8fd07314f01508bbb 100644 (file)
@@ -8,8 +8,21 @@
 package org.opendaylight.mdsal.binding.java.api.generator
 
 import static java.util.Objects.requireNonNull
-import static org.opendaylight.mdsal.binding.model.util.Types.BOOLEAN;
-import static org.opendaylight.mdsal.binding.model.util.Types.BYTE_ARRAY;
+import static org.opendaylight.mdsal.binding.model.util.BaseYangTypes.BINARY_TYPE
+import static org.opendaylight.mdsal.binding.model.util.BaseYangTypes.BOOLEAN_TYPE
+import static org.opendaylight.mdsal.binding.model.util.BaseYangTypes.EMPTY_TYPE
+import static org.opendaylight.mdsal.binding.model.util.BaseYangTypes.INSTANCE_IDENTIFIER
+import static org.opendaylight.mdsal.binding.model.util.BaseYangTypes.INT16_TYPE
+import static org.opendaylight.mdsal.binding.model.util.BaseYangTypes.INT32_TYPE
+import static org.opendaylight.mdsal.binding.model.util.BaseYangTypes.INT64_TYPE
+import static org.opendaylight.mdsal.binding.model.util.BaseYangTypes.INT8_TYPE
+import static org.opendaylight.mdsal.binding.model.util.BaseYangTypes.STRING_TYPE
+import static org.opendaylight.mdsal.binding.model.util.BaseYangTypes.UINT16_TYPE
+import static org.opendaylight.mdsal.binding.model.util.BaseYangTypes.UINT32_TYPE
+import static org.opendaylight.mdsal.binding.model.util.BaseYangTypes.UINT64_TYPE
+import static org.opendaylight.mdsal.binding.model.util.BaseYangTypes.UINT8_TYPE
+import static org.opendaylight.mdsal.binding.model.util.BindingTypes.SCALAR_TYPE_OBJECT
+import static org.opendaylight.mdsal.binding.model.util.Types.BOOLEAN
 import static org.opendaylight.mdsal.binding.model.util.Types.STRING;
 import static extension org.apache.commons.text.StringEscapeUtils.escapeJava
 
@@ -23,6 +36,7 @@ import java.util.Base64;
 import java.util.Comparator
 import java.util.List
 import java.util.Map
+import java.util.Set
 import javax.management.ConstructorParameters
 import org.gaul.modernizer_maven_annotations.SuppressModernizer
 import org.opendaylight.mdsal.binding.model.api.ConcreteType
@@ -33,11 +47,8 @@ import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject
 import org.opendaylight.mdsal.binding.model.api.Restrictions
 import org.opendaylight.mdsal.binding.model.api.Type
 import org.opendaylight.mdsal.binding.model.util.TypeConstants
+import org.opendaylight.mdsal.binding.spec.naming.BindingMapping
 import org.opendaylight.yangtools.yang.common.Empty
-import org.opendaylight.yangtools.yang.common.Uint16
-import org.opendaylight.yangtools.yang.common.Uint32
-import org.opendaylight.yangtools.yang.common.Uint64
-import org.opendaylight.yangtools.yang.common.Uint8
 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition
 
 /**
@@ -46,6 +57,16 @@ import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition
 @SuppressModernizer
 class ClassTemplate extends BaseTemplate {
     static val Comparator<GeneratedProperty> PROP_COMPARATOR = Comparator.comparing([prop | prop.name])
+    static val VALUEOF_TYPES = Set.of(
+        BOOLEAN_TYPE,
+        INT8_TYPE,
+        INT16_TYPE,
+        INT32_TYPE,
+        INT64_TYPE,
+        UINT8_TYPE,
+        UINT16_TYPE,
+        UINT32_TYPE,
+        UINT64_TYPE)
 
     protected val List<GeneratedProperty> properties
     protected val List<GeneratedProperty> finalProperties
@@ -148,12 +169,7 @@ class ClassTemplate extends BaseTemplate {
 
             «defaultInstance»
 
-            «FOR field : properties SEPARATOR "\n"»
-                «field.getterMethod»
-                «IF !field.readOnly»
-                    «field.setterMethod»
-                «ENDIF»
-            «ENDFOR»
+            «propertyMethods»
 
             «IF (genTO.isTypedef() && genTO.getBaseType instanceof BitsTypeDefinition)»
                 «generateGetValueForBitsTypeDef»
@@ -168,6 +184,38 @@ class ClassTemplate extends BaseTemplate {
 
     '''
 
+    def private propertyMethods() {
+        if (properties.empty) {
+            return ""
+        }
+        isScalarTypeObject ? scalarTypeObjectValue(properties.get(0)) : defaultProperties
+    }
+
+    def private isScalarTypeObject() {
+        for (impl : genTO.implements) {
+            if (SCALAR_TYPE_OBJECT.identifier.equals(impl.identifier)) {
+                return true
+            }
+        }
+        return false
+    }
+
+    def private defaultProperties() '''
+        «FOR field : properties SEPARATOR "\n"»
+            «field.getterMethod»
+            «IF !field.readOnly»
+                «field.setterMethod»
+            «ENDIF»
+        «ENDFOR»
+    '''
+
+    def private scalarTypeObjectValue(GeneratedProperty field) '''
+        @«OVERRIDE.importedName»
+        public «field.returnType.importedName» «BindingMapping.SCALAR_TYPE_OBJECT_GET_VALUE_NAME»() {
+            return «field.fieldName»«IF field.returnType.name.endsWith("[]")».clone()«ENDIF»;
+        }
+    '''
+
     /**
      * Template method which generates the method <code>getValue()</code> for typedef,
      * which base type is BitsDefinition.
@@ -217,7 +265,7 @@ class ClassTemplate extends BaseTemplate {
 
     def private allValuesConstructor() '''
     public «type.name»(«allProperties.asArgumentsDeclaration») {
-        «IF false == parentProperties.empty»
+        «IF !parentProperties.empty»
             super(«parentProperties.asArguments»);
         «ENDIF»
         «FOR p : allProperties»
@@ -239,7 +287,7 @@ class ClassTemplate extends BaseTemplate {
     @«ConstructorParameters.importedName»("«TypeConstants.VALUE_PROP»")
     @«ConstructorProperties.importedName»("«TypeConstants.VALUE_PROP»")
     public «type.name»(«allProperties.asArgumentsDeclaration») {
-        «IF false == parentProperties.empty»
+        «IF !parentProperties.empty»
             super(«parentProperties.asArguments»);
         «ENDIF»
         «FOR p : allProperties»
@@ -274,7 +322,7 @@ class ClassTemplate extends BaseTemplate {
 
     def protected genConstructor(GeneratedProperty property, Iterable<GeneratedProperty> other) '''
     public «type.name»(«property.returnType.importedName + " " + property.name») {
-        «IF false == parentProperties.empty»
+        «IF !parentProperties.empty»
             super(«parentProperties.asArguments»);
         «ENDIF»
 
@@ -327,7 +375,7 @@ class ClassTemplate extends BaseTemplate {
      * @param source Source object
      */
     public «type.name»(«type.name» source) {
-        «IF false == parentProperties.empty»
+        «IF !parentProperties.empty»
             super(source);
         «ENDIF»
         «FOR p : properties»
@@ -352,37 +400,22 @@ class ClassTemplate extends BaseTemplate {
     def protected defaultInstance() '''
         «IF genTO.typedef && !allProperties.empty && !genTO.unionType»
             «val prop = allProperties.get(0)»
-            «IF !("org.opendaylight.yangtools.yang.binding.InstanceIdentifier".equals(prop.returnType.fullyQualifiedName))»
-            public static «genTO.name» getDefaultInstance(String defaultValue) {
-                «IF BYTE_ARRAY.equals(prop.returnType)»
-                    return new «genTO.name»(«Base64.importedName».getDecoder().decode(defaultValue));
-                «ELSEIF STRING.equals(prop.returnType)»
+            «val propType = prop.returnType»
+            «IF !(INSTANCE_IDENTIFIER.identifier.equals(propType.identifier))»
+            public static «genTO.name» getDefaultInstance(final String defaultValue) {
+                «IF allProperties.size > 1»
+                    «bitsArgs»
+                «ELSEIF VALUEOF_TYPES.contains(propType)»
+                    return new «genTO.name»(«propType.importedName».valueOf(defaultValue));
+                «ELSEIF STRING_TYPE.equals(propType)»
                     return new «genTO.name»(defaultValue);
-                «ELSEIF Constants.EMPTY.equals(prop.returnType)»
+                «ELSEIF BINARY_TYPE.equals(propType)»
+                    return new «genTO.name»(«Base64.importedName».getDecoder().decode(defaultValue));
+                «ELSEIF EMPTY_TYPE.equals(propType)»
                     «Preconditions.importedName».checkArgument(defaultValue.isEmpty(), "Invalid value %s", defaultValue);
                     return new «genTO.name»(«Empty.importedName».getInstance());
-                «ELSEIF allProperties.size > 1»
-                    «bitsArgs»
-                «ELSEIF BOOLEAN.equals(prop.returnType)»
-                    return new «genTO.name»(«Boolean.importedName».valueOf(defaultValue));
-                «ELSEIF "java.lang.Byte".equals(prop.returnType.fullyQualifiedName)»
-                    return new «genTO.name»(«Byte.importedName».valueOf(defaultValue));
-                «ELSEIF "java.lang.Short".equals(prop.returnType.fullyQualifiedName)»
-                    return new «genTO.name»(«Short.importedName».valueOf(defaultValue));
-                «ELSEIF "java.lang.Integer".equals(prop.returnType.fullyQualifiedName)»
-                    return new «genTO.name»(«Integer.importedName».valueOf(defaultValue));
-                «ELSEIF "java.lang.Long".equals(prop.returnType.fullyQualifiedName)»
-                    return new «genTO.name»(«Long.importedName».valueOf(defaultValue));
-                «ELSEIF "org.opendaylight.yangtools.yang.common.Uint8".equals(prop.returnType.fullyQualifiedName)»
-                    return new «genTO.name»(«Uint8.importedName».valueOf(defaultValue));
-                «ELSEIF "org.opendaylight.yangtools.yang.common.Uint16".equals(prop.returnType.fullyQualifiedName)»
-                    return new «genTO.name»(«Uint16.importedName».valueOf(defaultValue));
-                «ELSEIF "org.opendaylight.yangtools.yang.common.Uint32".equals(prop.returnType.fullyQualifiedName)»
-                    return new «genTO.name»(«Uint32.importedName».valueOf(defaultValue));
-                «ELSEIF "org.opendaylight.yangtools.yang.common.Uint64".equals(prop.returnType.fullyQualifiedName)»
-                    return new «genTO.name»(«Uint64.importedName».valueOf(defaultValue));
                 «ELSE»
-                    return new «genTO.name»(new «prop.returnType.importedName»(defaultValue));
+                    return new «genTO.name»(new «propType.importedName»(defaultValue));
                 «ENDIF»
             }
             «ENDIF»
@@ -398,7 +431,7 @@ class ClassTemplate extends BaseTemplate {
         int i = 0;
         return new «genTO.name»(
         «FOR prop : allProperties SEPARATOR ","»
-            properties.get(i++).equals(defaultValue) ? «Boolean.importedName».TRUE : null
+            properties.get(i++).equals(defaultValue) ? «BOOLEAN.importedName».TRUE : null
         «ENDFOR»
         );
     '''