Tag TypeObjects which wrap a value with ScalarTypeObject
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 24 Mar 2020 15:58:29 +0000 (16:58 +0100)
committerAnil Belur <abelur@linuxfoundation.org>
Wed, 19 Jun 2024 00:41:31 +0000 (10:41 +1000)
Capturing this type of objects has a nice side-effect of being
able to specialize code generation. It is furthermore useful
for providing a common definition of getValue() method.

This is an unfortunate side-effect of changing the API
mapping for boolean typedefs: the accessor changes from isValue()
to getValue().

JIRA: MDSAL-530
Change-Id: Ie40e50bbe566a747d0a5d3e9ff84e428c2960a94
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/EncapsulatedValueCodec.java
binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/ClassTemplate.xtend
binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/TypedefCompilationTest.java

index 3452e2ac65bd1fe575da2b0f16feca4092f35e1b..97ee81ff51fef8df9d943d165494e06f04518ab7 100644 (file)
@@ -17,8 +17,8 @@ import java.lang.invoke.MethodType;
 import java.lang.reflect.Method;
 import java.util.concurrent.Callable;
 import org.opendaylight.mdsal.binding.dom.codec.impl.ValueTypeCodec.SchemaUnawareCodec;
+import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition;
 
 /**
  * Derived YANG types are just immutable value holders for simple value
@@ -41,15 +41,9 @@ final class EncapsulatedValueCodec extends ReflectionBasedCodec implements Schem
 
     static Callable<EncapsulatedValueCodec> loader(final Class<?> typeClz, final TypeDefinition<?> typeDef) {
         return () -> {
-            final Method m;
-            if (typeDef instanceof BooleanTypeDefinition) {
-                m = typeClz.getMethod("isValue");
-            } else {
-                m = typeClz.getMethod("getValue");
-            }
+            final Method m = typeClz.getMethod(BindingMapping.SCALAR_TYPE_OBJECT_GET_VALUE_NAME);
             final MethodHandle getter = LOOKUP.unreflect(m).asType(OBJ_METHOD);
             final Class<?> valueType = m.getReturnType();
-
             final MethodHandle constructor = LOOKUP.findConstructor(typeClz,
                 MethodType.methodType(void.class, valueType)).asType(OBJ_METHOD);
             return new EncapsulatedValueCodec(typeClz, constructor, getter, valueType);
index ca39faad6e4b4bdeb42ed655bb7b252d2fa332f8..a41bd27edd9805e9b9f122ec53ac7e7b2242d7b6 100644 (file)
@@ -39,6 +39,8 @@ 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
+import org.opendaylight.mdsal.binding.model.util.BindingTypes
+import org.opendaylight.mdsal.binding.spec.naming.BindingMapping
 
 /**
  * Template for generating JAVA class.
@@ -148,12 +150,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 +165,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 (BindingTypes.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.
index 38636e060021296ad63be95057943d4f0ba06152..dd932fba0fe18003a7475f4ce623d46d134026df 100644 (file)
@@ -124,7 +124,7 @@ public class TypedefCompilationTest extends BaseCompilationTest {
         CompilationTestUtils.assertContainsMethod(int32Ext1Class, Integer.class, GET_VAL);
         defInst = CompilationTestUtils.assertContainsMethod(int32Ext1Class, int32Ext1Class, "getDefaultInstance",
             String.class);
-        assertEquals(6, int32Ext1Class.getDeclaredMethods().length);
+        assertEquals(7, int32Ext1Class.getDeclaredMethods().length);
 
         List<Range<Integer>> rangeConstraints = new ArrayList<>();
         rangeConstraints.add(Range.closed(2, 2147483647));
@@ -173,7 +173,7 @@ public class TypedefCompilationTest extends BaseCompilationTest {
         defInst = CompilationTestUtils.assertContainsMethod(stringExt1Class, stringExt1Class, "getDefaultInstance",
             String.class);
         CompilationTestUtils.assertContainsDefaultMethods(stringExt1Class);
-        assertEquals(6, stringExt1Class.getDeclaredMethods().length);
+        assertEquals(7, stringExt1Class.getDeclaredMethods().length);
 
         List<Range<Integer>> lengthConstraints = new ArrayList<>();
         lengthConstraints.add(Range.closed(5, 11));
@@ -235,7 +235,7 @@ public class TypedefCompilationTest extends BaseCompilationTest {
         CompilationTestUtils.assertContainsDefaultMethods(myDecimalTypeClass);
         defInst = CompilationTestUtils.assertContainsMethod(myDecimalTypeClass, myDecimalTypeClass,
             "getDefaultInstance", String.class);
-        assertEquals(6, myDecimalTypeClass.getDeclaredMethods().length);
+        assertEquals(7, myDecimalTypeClass.getDeclaredMethods().length);
 
         List<Range<BigDecimal>> decimalRangeConstraints = new ArrayList<>();
         decimalRangeConstraints.add(Range.closed(new BigDecimal("1.5"), new BigDecimal("5.5")));
@@ -259,7 +259,7 @@ public class TypedefCompilationTest extends BaseCompilationTest {
         CompilationTestUtils.assertContainsDefaultMethods(myDecimalType2Class);
         defInst = CompilationTestUtils.assertContainsMethod(myDecimalType2Class, myDecimalType2Class,
             "getDefaultInstance", String.class);
-        assertEquals(6, myDecimalType2Class.getDeclaredMethods().length);
+        assertEquals(7, myDecimalType2Class.getDeclaredMethods().length);
 
         List<Range<BigDecimal>> decimal2RangeConstraints = new ArrayList<>();
         decimal2RangeConstraints.add(Range.closed(new BigDecimal("0"), new BigDecimal("1")));