Refactor "value" property access 49/88649/6
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 24 Mar 2020 15:15:19 +0000 (16:15 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 25 Mar 2020 11:35:46 +0000 (12:35 +0100)
There are a number of callers open-coding the way to acquire 'value'
property. Centralize them.

JIRA: MDSAL-530
Change-Id: I6fdf17b204c7f491eb667747a68d6d80daf55b78
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-generator-api/src/main/java/org/opendaylight/mdsal/binding/model/api/GeneratedTransferObject.java
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/yang/types/AbstractTypeProvider.java
binding/mdsal-binding-generator-util/src/main/java/org/opendaylight/mdsal/binding/model/util/TypeConstants.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/main/java/org/opendaylight/mdsal/binding/java/api/generator/JavaFileTemplate.java
binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/TypeUtils.java
binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/TypeUtilsTest.java

index 50994f4d161ca212b4bee90a0945e50d3116c661..15632af2ac2e59c5da00ca7d98091297d7351897 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.mdsal.binding.model.api;
 
 import java.util.List;
+import java.util.Optional;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 
 /**
@@ -71,4 +72,15 @@ public interface GeneratedTransferObject extends GeneratedType {
     boolean isUnionTypeBuilder();
 
     Restrictions getRestrictions();
+
+    default Optional<? extends GeneratedProperty> findProperty(final String name) {
+        final Optional<GeneratedProperty> optProp = getProperties().stream()
+                .filter(prop -> prop.getName().equals(name)).findFirst();
+        if (optProp.isPresent()) {
+            return optProp;
+        }
+
+        final GeneratedTransferObject parent = getSuperType();
+        return parent != null ? parent.findProperty(name) : Optional.empty();
+    }
 }
index 11eccb424c00200a857e1537aedb349625b077a7..67c8aa6ef9c6e9cb4a1f3086ed43e72d91349d60 100644 (file)
@@ -862,7 +862,7 @@ public abstract class AbstractTypeProvider implements TypeProvider {
 
         final GeneratedTOBuilder genTOBuilder = typedefToTransferObject(basePackageName, typedef, moduleName);
         genTOBuilder.setRestrictions(BindingGeneratorUtil.getRestrictions(typedef));
-        final GeneratedPropertyBuilder genPropBuilder = genTOBuilder.addProperty("value");
+        final GeneratedPropertyBuilder genPropBuilder = genTOBuilder.addProperty(TypeConstants.VALUE_PROP);
         genPropBuilder.setReturnType(javaType);
         genTOBuilder.addEqualsIdentity(genPropBuilder);
         genTOBuilder.addHashIdentity(genPropBuilder);
@@ -1603,7 +1603,7 @@ public abstract class AbstractTypeProvider implements TypeProvider {
 
     @Override
     public String getConstructorPropertyName(final SchemaNode node) {
-        return node instanceof TypeDefinition<?> ? "value" : "";
+        return node instanceof TypeDefinition<?> ? TypeConstants.VALUE_PROP : "";
     }
 
     @Override
index d3550d721bc3575fd1e16ac143d6d0a42979b674..bfbcf67e30b8f0f61b88b396257d0f3c3f3a6a51 100644 (file)
@@ -7,6 +7,9 @@
  */
 package org.opendaylight.mdsal.binding.model.util;
 
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yangtools.yang.binding.ScalarTypeObject;
+
 /**
  * Contains constants used in relations with <code>Type</code>.
  */
@@ -19,7 +22,12 @@ public final class TypeConstants {
      * The map is keyed by Pattern-compatible string and values are XSD-compatible
      * strings.
      */
-    public static final String PATTERN_CONSTANT_NAME = "PATTERN_CONSTANTS";
+    public static final @NonNull String PATTERN_CONSTANT_NAME = "PATTERN_CONSTANTS";
+
+    /**
+     * Name of the property holding the value encapsulated in a {@link ScalarTypeObject}.
+     */
+    public static final @NonNull String VALUE_PROP = "value";
 
     /**
      * Creation of new instance is prohibited.
index e1fb605316a570d313075cf9c84f5d9387b29cb2..0f5620597994d7326b60f0ab86745aa4ba79f596 100644 (file)
@@ -99,7 +99,7 @@ class ClassTemplate extends BaseTemplate {
         this.consts = genType.constantDefinitions
 
         if (restrictions !== null && restrictions.rangeConstraint.present) {
-            rangeGenerator = requireNonNull(AbstractRangeGenerator.forType(findProperty(genType, "value").returnType))
+            rangeGenerator = requireNonNull(AbstractRangeGenerator.forType(TypeUtils.encapsulatedValueType(genType)))
         } else {
             rangeGenerator = null
         }
@@ -136,7 +136,8 @@ class ClassTemplate extends BaseTemplate {
 
             «IF restrictions !== null»
                 «IF restrictions.lengthConstraint.present»
-                    «LengthGenerator.generateLengthChecker("_value", findProperty(genTO, "value").returnType, restrictions.lengthConstraint.get, this)»
+                    «LengthGenerator.generateLengthChecker("_value", TypeUtils.encapsulatedValueType(genTO),
+                        restrictions.lengthConstraint.get, this)»
                 «ENDIF»
                 «IF restrictions.rangeConstraint.present»
                     «rangeGenerator.generateRangeChecker("_value", restrictions.rangeConstraint.get, this)»
@@ -200,7 +201,7 @@ class ClassTemplate extends BaseTemplate {
     def protected constructors() '''
         «IF genTO.unionType»
             «genUnionConstructor»
-        «ELSEIF genTO.typedef && allProperties.size == 1 && allProperties.get(0).name.equals("value"
+        «ELSEIF genTO.typedef && allProperties.size == 1 && allProperties.get(0).name.equals(TypeConstants.VALUE_PROP
             «typedefConstructor»
         «ELSE»
             «allValuesConstructor»
@@ -235,8 +236,8 @@ class ClassTemplate extends BaseTemplate {
     '''
 
     def private typedefConstructor() '''
-    @«ConstructorParameters.importedName»("value")
-    @«ConstructorProperties.importedName»("value")
+    @«ConstructorParameters.importedName»("«TypeConstants.VALUE_PROP»")
+    @«ConstructorProperties.importedName»("«TypeConstants.VALUE_PROP»")
     public «type.name»(«allProperties.asArgumentsDeclaration») {
         «IF false == parentProperties.empty»
             super(«parentProperties.asArguments»);
index 79d744cc510fd801b2f7d7394d3086fb1e068f74..bbe7e66ad10f15f7411e345f43727479f0ce3779 100644 (file)
@@ -106,17 +106,6 @@ class JavaFileTemplate {
         return type;
     }
 
-    static final GeneratedProperty findProperty(final GeneratedTransferObject gto, final String name) {
-        final Optional<GeneratedProperty> optProp = gto.getProperties().stream()
-                .filter(prop -> prop.getName().equals(name)).findFirst();
-        if (optProp.isPresent()) {
-            return optProp.get();
-        }
-
-        final GeneratedTransferObject parent = gto.getSuperType();
-        return parent != null ? findProperty(parent, name) : null;
-    }
-
     final String generateImportBlock() {
         verify(javaType instanceof TopLevelJavaGeneratedType);
         return ((TopLevelJavaGeneratedType) javaType).imports().map(name -> "import " + name + ";\n")
index bbb2d22b62496153d5d4bbdac6523ba2073693d6..079e1688ffd91a5798c62a828a9ed585b4f69901 100644 (file)
@@ -14,15 +14,14 @@ import org.opendaylight.mdsal.binding.model.api.ConcreteType;
 import org.opendaylight.mdsal.binding.model.api.GeneratedProperty;
 import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject;
 import org.opendaylight.mdsal.binding.model.api.Type;
+import org.opendaylight.mdsal.binding.model.util.TypeConstants;
 
 /**
  * Random utility methods for dealing with {@link Type} objects.
  */
 final class TypeUtils {
-    private static final String VALUE_PROP = "value";
-
     private TypeUtils() {
-        throw new UnsupportedOperationException();
+
     }
 
     /**
@@ -48,13 +47,17 @@ final class TypeUtils {
 
         // Look for the 'value' property and return its type
         for (GeneratedProperty s : rootGto.getProperties()) {
-            if (VALUE_PROP.equals(s.getName())) {
+            if (TypeConstants.VALUE_PROP.equals(s.getName())) {
                 return (ConcreteType) s.getReturnType();
             }
         }
 
         // Should never happen
         throw new IllegalArgumentException(String.format("Type %s root %s properties %s do not include \"%s\"",
-            type, rootGto, rootGto.getProperties(), VALUE_PROP));
+            type, rootGto, rootGto.getProperties(), TypeConstants.VALUE_PROP));
+    }
+
+    static Type encapsulatedValueType(final GeneratedTransferObject gto) {
+        return gto.findProperty(TypeConstants.VALUE_PROP).orElseThrow().getReturnType();
     }
 }
index 52a730ebe811b6ea6be75bd76a84afd0596e9db3..2121b5313ee31f2a9b5469cc65767435185d3354 100644 (file)
@@ -8,14 +8,10 @@
 package org.opendaylight.mdsal.binding.java.api.generator;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 
 import com.google.common.collect.ImmutableList;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
 import org.junit.Test;
 import org.opendaylight.mdsal.binding.model.api.ConcreteType;
 import org.opendaylight.mdsal.binding.model.api.GeneratedProperty;
@@ -50,16 +46,4 @@ public class TypeUtilsTest {
         doReturn(ImmutableList.of(property)).when(rootType).getProperties();
         TypeUtils.getBaseYangType(innerType);
     }
-
-    @Test
-    public void constructTest() throws ReflectiveOperationException {
-        final Constructor<TypeUtils> constructor = TypeUtils.class.getDeclaredConstructor();
-        constructor.setAccessible(true);
-        try {
-            constructor.newInstance();
-            fail();
-        } catch (InvocationTargetException e) {
-            assertTrue(e.getCause() instanceof UnsupportedOperationException);
-        }
-    }
 }
\ No newline at end of file