Move getter method naming to BindingMapping 16/77616/12
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 8 Nov 2018 11:18:17 +0000 (12:18 +0100)
committerJie Han <han.jie@zte.com.cn>
Tue, 13 Nov 2018 00:35:30 +0000 (00:35 +0000)
Both BaseTemplate.isAccessor() and a chunk of
AbstractTypeGenerator.getterMethodName() should actually be held
in BindingMapping, so we retain consistent naming of things.

This patch introduces the constants necessary for this to work
and migrates the code there. This cascades to various other places,
like mdsal-binding-dom-codec, where we extract copy&pasted code
to a common utility class.

JIRA: MDSAL-18
Change-Id: I5fb285f00658ce81f60890d03844b51e19bd4a40
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
12 files changed:
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/gen/impl/DataNodeContainerSerializerSource.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BitsCodec.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/UnionTypeCodec.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/util/BindingSchemaMapping.java [new file with mode: 0644]
binding/mdsal-binding-generator-impl/src/main/java/org/opendaylight/mdsal/binding/generator/impl/AbstractTypeGenerator.java
binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/BaseTemplate.xtend
binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/BuilderGenerator.java
binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/InterfaceTemplate.xtend
binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/naming/BindingMapping.java
binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/reflect/BindingReflections.java
binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/util/DataObjectReadingUtil.java

index aaeb898ff087473a2140828b77a0c5b312691b92..e7ad321324bc532b8611b89a235d0e972a82d2ca 100644 (file)
@@ -11,12 +11,12 @@ package org.opendaylight.mdsal.binding.dom.codec.gen.impl;
 import com.google.common.base.Preconditions;
 import java.util.HashMap;
 import java.util.Map;
+import org.opendaylight.mdsal.binding.dom.codec.util.BindingSchemaMapping;
 import org.opendaylight.mdsal.binding.dom.codec.util.ChoiceDispatchSerializer;
 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
 import org.opendaylight.mdsal.binding.model.api.MethodSignature;
 import org.opendaylight.mdsal.binding.model.api.ParameterizedType;
 import org.opendaylight.mdsal.binding.model.api.Type;
-import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
 import org.opendaylight.yangtools.yang.binding.BindingSerializer;
 import org.opendaylight.yangtools.yang.binding.BindingStreamEventWriter;
 import org.opendaylight.yangtools.yang.binding.DataObject;
@@ -30,10 +30,6 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -108,31 +104,11 @@ abstract class DataNodeContainerSerializerSource extends DataObjectSerializerSou
         return hashMap;
     }
 
-    private static String getGetterName(final DataSchemaNode node) {
-        final TypeDefinition<?> type;
-        if (node instanceof TypedDataSchemaNode) {
-            type = ((TypedDataSchemaNode) node).getType();
-        } else {
-            type = null;
-        }
-
-        final String prefix;
-        // Bug 8903: If it is a derived type of boolean or empty, not an inner type, then the return type
-        // of method would be the generated type of typedef not build-in types, so here it should be 'get'.
-        if ((type instanceof BooleanTypeDefinition || type instanceof EmptyTypeDefinition)
-                && (type.getPath().equals(node.getPath()) || type.getBaseType() == null)) {
-            prefix = "is";
-        } else {
-            prefix = "get";
-        }
-        return prefix + BindingMapping.getGetterSuffix(node.getQName());
-    }
-
     private void emitBody(final StringBuilder sb) {
         final Map<String, Type> getterToType = collectAllProperties(dtoType, new HashMap<String, Type>());
         for (final DataSchemaNode schemaChild : schemaNode.getChildNodes()) {
             if (!schemaChild.isAugmenting()) {
-                final String getter = getGetterName(schemaChild);
+                final String getter = BindingSchemaMapping.getGetterMethodName(schemaChild);
                 final Type childType = getterToType.get(getter);
                 if (childType == null) {
                     // FIXME AnyXml nodes are ignored, since their type cannot be found in generated bindnig
index 9a72ce2e7d85ec362bcb9ad0718a58b6ea8138d5..f4d589696eb4a5b668e3bca1faa87786915dbdb0 100644 (file)
@@ -28,9 +28,9 @@ import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode;
 import org.opendaylight.mdsal.binding.dom.codec.impl.NodeCodecContext.CodecContextFactory;
+import org.opendaylight.mdsal.binding.dom.codec.util.BindingSchemaMapping;
 import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext;
 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
-import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
 import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
 import org.opendaylight.yangtools.concepts.Codec;
 import org.opendaylight.yangtools.concepts.Immutable;
@@ -55,11 +55,9 @@ import org.opendaylight.yangtools.yang.model.api.DocumentedNode.WithStatus;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode;
-import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.InstanceIdentifierTypeDefinition;
@@ -235,23 +233,12 @@ final class BindingCodecContext implements CodecContextFactory, BindingCodecTree
         final Map<String, DataSchemaNode> getterToLeafSchema = new HashMap<>();
         for (final DataSchemaNode leaf : childSchema.getChildNodes()) {
             if (leaf instanceof TypedDataSchemaNode) {
-                getterToLeafSchema.put(getGetterName(leaf, ((TypedDataSchemaNode) leaf).getType()), leaf);
+                getterToLeafSchema.put(BindingSchemaMapping.getGetterMethodName((TypedDataSchemaNode) leaf), leaf);
             }
         }
         return getLeafNodesUsingReflection(parentClass, getterToLeafSchema);
     }
 
-    private static String getGetterName(final SchemaNode node, final TypeDefinition<?> typeDef) {
-        final String suffix = BindingMapping.getGetterSuffix(node.getQName());
-        // Bug 8903: If it is a derived type of boolean or empty, not an inner type, then the return type
-        // of method would be the generated type of typedef not build-in types, so here it should be 'get'.
-        if ((typeDef instanceof BooleanTypeDefinition || typeDef instanceof EmptyTypeDefinition)
-                && (typeDef.getPath().equals(node.getPath()) || typeDef.getBaseType() == null)) {
-            return "is" + suffix;
-        }
-        return "get" + suffix;
-    }
-
     private ImmutableMap<String, LeafNodeCodecContext<?>> getLeafNodesUsingReflection(final Class<?> parentClass,
             final Map<String, DataSchemaNode> getterToLeafSchema) {
         final Map<String, LeafNodeCodecContext<?>> leaves = new HashMap<>();
index 700986738d2db70beda3ed9fd566fbbc66c0ac6c..95ab2b331a494cee753ce0cd5b6197873e00a413 100644 (file)
@@ -52,7 +52,8 @@ final class BitsCodec extends ReflectionBasedCodec implements SchemaUnawareCodec
             final Set<String> ctorArgs = new TreeSet<>();
 
             for (Bit bit : rootType.getBits()) {
-                final Method valueGetter = returnType.getMethod("is" + BindingMapping.getClassName(bit.getName()));
+                final Method valueGetter = returnType.getMethod(BindingMapping.BOOLEAN_GETTER_PREFIX
+                    + BindingMapping.getClassName(bit.getName()));
                 ctorArgs.add(bit.getName());
                 getters.put(bit.getName(), valueGetter);
             }
index b7779a6f90137d9516327c1f7cc8f75857073946..cf23b5019a185d5847e3bfc48aebe7752c8d33bd 100644 (file)
@@ -41,8 +41,8 @@ final class UnionTypeCodec extends ReflectionBasedCodec {
                 if (subtype instanceof LeafrefTypeDefinition) {
                     addLeafrefValueCodec(unionCls, unionType, bindingCodecContext, values, subtype);
                 } else {
-                    final Method valueGetter =
-                            unionCls.getMethod("get" + BindingMapping.getClassName(subtype.getQName()));
+                    final Method valueGetter = unionCls.getMethod(BindingMapping.GETTER_PREFIX
+                        + BindingMapping.getClassName(subtype.getQName()));
                     final Class<?> valueType = valueGetter.getReturnType();
                     final Codec<Object, Object> valueCodec = bindingCodecContext.getCodec(valueType, subtype);
 
@@ -91,8 +91,8 @@ final class UnionTypeCodec extends ReflectionBasedCodec {
 
         // get method via reflection from generated code according to
         // get_TypeName_Value method
-        final Method valueGetterParent = unionCls
-                .getMethod(new StringBuilder("get").append(typeName).append(className).append("Value").toString());
+        final Method valueGetterParent = unionCls.getMethod(new StringBuilder().append(BindingMapping.GETTER_PREFIX)
+            .append(typeName).append(className).append("Value").toString());
         final Class<?> returnType = valueGetterParent.getReturnType();
 
         // prepare codec of union subtype according to return type of referenced
diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/util/BindingSchemaMapping.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/util/BindingSchemaMapping.java
new file mode 100644 (file)
index 0000000..c82825e
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2018 Pantheon Technologies, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.mdsal.binding.dom.codec.util;
+
+import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
+import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
+
+public final class BindingSchemaMapping {
+    private BindingSchemaMapping() {
+
+    }
+
+    public static String getGetterMethodName(final DataSchemaNode node) {
+        return node instanceof TypedDataSchemaNode ? getGetterMethodName((TypedDataSchemaNode) node)
+                : BindingMapping.getGetterMethodName(node.getQName(), false);
+    }
+
+    public static String getGetterMethodName(final TypedDataSchemaNode node) {
+        // Bug 8903: If it is a derived type of boolean or empty, not an inner type, then the return type
+        // of method would be the generated type of typedef not build-in types, so here it should be 'get'.
+        final TypeDefinition<?> type = node.getType();
+        return BindingMapping.getGetterMethodName(node.getQName(),
+            (type instanceof BooleanTypeDefinition || type instanceof EmptyTypeDefinition)
+            && (type.getPath().equals(node.getPath()) || type.getBaseType() == null));
+    }
+}
index f2a0cbe71dceff917bde5ef5da67d831f28bea2c..6911378103be30ca51a70c38b83acb0b4e8b4d3e 100644 (file)
@@ -1652,15 +1652,7 @@ abstract class AbstractTypeGenerator {
      * @return string with the name of the getter method for <code>methodName</code> in JAVA method format
      */
     public static String getterMethodName(final String localName, final Type returnType) {
-        final StringBuilder method = new StringBuilder();
-        if (BOOLEAN.equals(returnType)) {
-            method.append("is");
-        } else {
-            method.append("get");
-        }
-        final String name = BindingMapping.toFirstUpper(BindingMapping.getPropertyName(localName));
-        method.append(name);
-        return method.toString();
+        return BindingMapping.getGetterMethodName(localName, BOOLEAN.equals(returnType));
     }
 
     /**
index 0a6a0571b1e2ea665cefeae69ef42a05d8a58dc4..5aa6d5560a8d26ca1cc43d0d0ce3ed383b894e38 100644 (file)
@@ -84,19 +84,15 @@ abstract class BaseTemplate extends JavaFileTemplate {
     final protected def fieldName(GeneratedProperty property) '''_«property.name»'''
 
     final protected def propertyNameFromGetter(MethodSignature getter) {
-        var int prefix;
-        if (getter.name.startsWith("is")) {
-            prefix = 2
-        } else if (getter.name.startsWith("get")) {
-            prefix = 3
+        var String prefix;
+        if (getter.name.startsWith(BindingMapping.BOOLEAN_GETTER_PREFIX)) {
+            prefix = BindingMapping.BOOLEAN_GETTER_PREFIX
+        } else if (getter.name.startsWith(BindingMapping.GETTER_PREFIX)) {
+            prefix = BindingMapping.GETTER_PREFIX
         } else {
             throw new IllegalArgumentException("Not a getter")
         }
-        return getter.name.substring(prefix).toFirstLower;
-    }
-
-    final protected def isAccessor(MethodSignature maybeGetter) {
-        return maybeGetter.name.startsWith("is") || maybeGetter.name.startsWith("get");
+        return getter.name.substring(prefix.length).toFirstLower;
     }
 
     /**
index 13fcc9256d70fa219c70f17ac6e5bc273ffdcf70..12df6a80355bb70b79879a421a5ec870d947911f 100644 (file)
@@ -206,7 +206,7 @@ public final class BuilderGenerator implements CodeGenerator {
         checkArgument(method.getReturnType() != null);
         checkArgument(method.getName() != null);
         checkArgument(!method.getName().isEmpty());
-        final String prefix = Types.BOOLEAN.equals(method.getReturnType()) ? "is" : "get";
+        final String prefix = BindingMapping.getGetterPrefix(Types.BOOLEAN.equals(method.getReturnType()));
         if (!method.getName().startsWith(prefix)) {
             return null;
         }
index 6b954361439f9967456a68ebab6387c33f487794..d03400aeeae1122dbd0d70959b1db0e7a47c9afe 100644 (file)
@@ -7,6 +7,8 @@
  */
 package org.opendaylight.mdsal.binding.java.api.generator
 
+import static extension org.opendaylight.mdsal.binding.spec.naming.BindingMapping.isGetterMethodName
+
 import java.util.List
 import org.opendaylight.mdsal.binding.model.api.AnnotationType
 import org.opendaylight.mdsal.binding.model.api.Constant
@@ -166,7 +168,7 @@ class InterfaceTemplate extends BaseTemplate {
     def private generateMethods() '''
         «IF !methods.empty»
             «FOR m : methods SEPARATOR "\n"»
-                «val accessor = m.isAccessor»
+                «val accessor = m.name.isGetterMethodName»
                 «val ret = m.returnType»
                 «IF accessor»
                     «formatDataForJavaDoc(m, "@return " + asCode(ret.fullyQualifiedName) + " "
index 118c6d374adcae2d843562d02a8a5b2ce81e1ac8..17715e5178cd3e4cd15df3a9010afb9382028a0d 100644 (file)
@@ -73,6 +73,16 @@ public final class BindingMapping {
      */
     public static final String IDENTIFIABLE_KEY_NAME = "key";
 
+    /**
+     * Prefix for getter methods working on top of boolean.
+     */
+    public static final String BOOLEAN_GETTER_PREFIX = "is";
+
+    /**
+     * Prefix for normal getter methods.
+     */
+    public static final String GETTER_PREFIX = "get";
+
     public static final String RPC_INPUT_SUFFIX = "Input";
     public static final String RPC_OUTPUT_SUFFIX = "Output";
 
@@ -185,6 +195,22 @@ public final class BindingMapping {
         return getMethodName(name.getLocalName());
     }
 
+    public static String getGetterPrefix(final boolean isBoolean) {
+        return isBoolean ? BOOLEAN_GETTER_PREFIX : GETTER_PREFIX;
+    }
+
+    public static String getGetterMethodName(final String localName, final boolean isBoolean) {
+        return getGetterPrefix(isBoolean) + toFirstUpper(getPropertyName(localName));
+    }
+
+    public static String getGetterMethodName(final QName name, final boolean isBoolean) {
+        return getGetterPrefix(isBoolean) + getGetterSuffix(name);
+    }
+
+    public static boolean isGetterMethodName(final String methodName) {
+        return methodName.startsWith(GETTER_PREFIX) || methodName.startsWith(BOOLEAN_GETTER_PREFIX);
+    }
+
     public static String getGetterSuffix(final QName name) {
         checkArgument(name != null, "Name should not be null.");
         final String candidate = toFirstUpper(toCamelCase(name.getLocalName()));
@@ -213,12 +239,8 @@ public final class BindingMapping {
         if (rawString == null || rawString.isEmpty()) {
             return rawString;
         }
-        char firstChar = rawString.charAt(0);
-        if (firstChar >= '0' && firstChar <= '9') {
-            return "_" + rawString;
-        } else {
-            return rawString;
-        }
+        final char firstChar = rawString.charAt(0);
+        return firstChar >= '0' && firstChar <= '9' ? "_" + rawString : rawString;
     }
 
     /**
index 764d5a1b1e77060267c02afc3918b4fb26b85b1e..3ef83f13edd1095974552807faa23834d0655c88 100644 (file)
@@ -409,7 +409,7 @@ public final class BindingReflections {
 
     @SuppressWarnings({ "unchecked", "rawtypes", "checkstyle:illegalCatch" })
     private static Optional<Class<? extends DataContainer>> getYangModeledReturnType(final Method method) {
-        if ("getClass".equals(method.getName()) || !method.getName().startsWith("get")
+        if ("getClass".equals(method.getName()) || !method.getName().startsWith(BindingMapping.GETTER_PREFIX)
                 || method.getParameterTypes().length > 0) {
             return Optional.empty();
         }
index e35ed7eb3a1f18fa1b010550c78fb1d61281e762..ad239a3f8425afd8773f7c4d790003724d71cff8 100644 (file)
@@ -22,6 +22,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
+import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
 import org.opendaylight.yangtools.yang.binding.Augmentable;
 import org.opendaylight.yangtools.yang.binding.Augmentation;
 import org.opendaylight.yangtools.yang.binding.DataContainer;
@@ -174,7 +175,7 @@ public final class DataObjectReadingUtil {
         public abstract DataContainer read(DataContainer parent, Class<?> child);
 
         private static Method resolveGetterMethod(final Class<? extends DataContainer> parent, final Class<?> child) {
-            String methodName = "get" + child.getSimpleName();
+            String methodName = BindingMapping.GETTER_PREFIX + child.getSimpleName();
             try {
                 return parent.getMethod(methodName);
             } catch (NoSuchMethodException e) {