Revert "Remove deprecated uint migration elements" 96/89396/1
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 26 Apr 2020 13:06:09 +0000 (15:06 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Sun, 26 Apr 2020 13:06:37 +0000 (15:06 +0200)
This reverts commit 1382c1d88b753e152ff26eae1091cd42e5aba76b,
reinstating generation of compatibility elements.

JIRA: MDSAL-490
Change-Id: Ia59eb16f3f0e534ce7339c46c24fc4d0b22d6f05
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
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/BuilderTemplate.xtend
binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/ClassTemplate.xtend
binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/CodeHelpers.java

index a17d9c7ca33927238d94ba3549b815928d4c52f6..92bd21dae47fd26d2ba9f28a1560659f94541636 100644 (file)
@@ -13,7 +13,9 @@ import static org.opendaylight.mdsal.binding.model.util.Types.STRING;
 import com.google.common.base.CharMatcher
 import com.google.common.base.MoreObjects
 import com.google.common.base.Splitter
+import com.google.common.collect.ImmutableMap
 import com.google.common.collect.Iterables
+import java.math.BigInteger
 import java.util.Collection
 import java.util.List
 import java.util.Locale
@@ -38,6 +40,10 @@ import org.opendaylight.mdsal.binding.model.util.TypeConstants
 import org.opendaylight.mdsal.binding.model.util.Types
 import org.opendaylight.mdsal.binding.spec.naming.BindingMapping
 import org.opendaylight.yangtools.yang.common.QName
+import org.opendaylight.yangtools.yang.common.Uint8
+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.model.api.ContainerSchemaNode
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode
 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition
@@ -65,6 +71,13 @@ abstract class BaseTemplate extends JavaFileTemplate {
         .addIgnoredStatement(YangStmtMapping.ORGANIZATION)
         .build();
 
+    protected static val UINT_TYPES = ImmutableMap.of(
+        Types.typeForClass(Uint8), Types.typeForClass(Short),
+        Types.typeForClass(Uint16), Types.typeForClass(Integer),
+        Types.typeForClass(Uint32), Types.typeForClass(Long),
+        Types.typeForClass(Uint64), Types.typeForClass(BigInteger)
+    );
+
     new(GeneratedType type) {
         super(type)
     }
index 14b91bcf2fc995ea873e92b1d03cf96fbb562ba5..2ed424abaa1ae67b5717c96f04755c49517d2fca 100644 (file)
@@ -358,6 +358,21 @@ class BuilderTemplate extends AbstractBuilderTemplate {
             this.«field.fieldName» = value;
             return this;
         }
+        «val uintType = UINT_TYPES.get(field.returnType)»
+        «IF uintType !== null»
+
+            /**
+             * Utility migration setter.
+             *
+             * @param value field value in legacy type
+             * @return this builder
+             * @deprecated Use {#link «setterName»(«field.returnType.importedJavadocName»)} instead.
+             */
+            @Deprecated(forRemoval = true)
+            public «type.getName» «setterName»(final «uintType.importedName» value) {
+                return «setterName»(«CODEHELPERS.importedName».compatUint(value));
+            }
+        «ENDIF»
     '''
 
     /**
index fac6cf25c5aed0a114667df8fd07314f01508bbb..3b18d18815c34424358ee347cc25b915f4a5c9af 100644 (file)
@@ -251,8 +251,10 @@ class ClassTemplate extends BaseTemplate {
             «genUnionConstructor»
         «ELSEIF genTO.typedef && allProperties.size == 1 && allProperties.get(0).name.equals(TypeConstants.VALUE_PROP)»
             «typedefConstructor»
+            «legacyConstructor»
         «ELSE»
             «allValuesConstructor»
+            «legacyConstructor»
         «ENDIF»
 
         «IF !allProperties.empty»
@@ -311,6 +313,29 @@ class ClassTemplate extends BaseTemplate {
     }
     '''
 
+    def private legacyConstructor() {
+        if (!hasUintProperties) {
+            return ""
+        }
+
+        val compatUint = CODEHELPERS.importedName + ".compatUint("
+        return '''
+
+            /**
+             * Utility migration constructor.
+             *
+             «FOR prop : allProperties»
+             * @param «prop.fieldName» «prop.name»«IF prop.isUintType» in legacy Java type«ENDIF»
+             «ENDFOR»
+             * @deprecated Use {#link «type.name»(«FOR prop : allProperties SEPARATOR ", "»«prop.returnType.importedJavadocName»«ENDFOR»)} instead.
+             */
+            @Deprecated(forRemoval = true)
+            public «type.getName»(«FOR prop : allProperties SEPARATOR ", "»«prop.legacyType.importedName» «prop.fieldName»«ENDFOR») {
+                this(«FOR prop : allProperties SEPARATOR ", "»«IF prop.isUintType»«compatUint»«prop.fieldName»)«ELSE»«prop.fieldName»«ENDIF»«ENDFOR»);
+            }
+        '''
+    }
+
     def protected genUnionConstructor() '''
     «FOR p : allProperties»
         «val List<GeneratedProperty> other = new ArrayList(properties)»
@@ -598,4 +623,26 @@ class ClassTemplate extends BaseTemplate {
         }
         return null
     }
+
+    def private hasUintProperties() {
+        for (GeneratedProperty prop : allProperties) {
+            if (prop.isUintType) {
+                return true
+            }
+        }
+        return false
+    }
+
+    def private static isUintType(GeneratedProperty prop) {
+        UINT_TYPES.containsKey(prop.returnType)
+    }
+
+    def private static legacyType(GeneratedProperty prop) {
+        val type = prop.returnType
+        val uint = UINT_TYPES.get(type)
+        if (uint !== null) {
+            return uint
+        }
+        return type
+    }
 }
index 2dd7ac1674c302dbd93cf2997dca7a6e257437a2..fce8d8301fb59d97f437fe5ebdef35c0ed43c3a4 100644 (file)
@@ -16,6 +16,7 @@ import com.google.common.base.VerifyException;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
+import java.math.BigInteger;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -23,6 +24,10 @@ import java.util.Objects;
 import java.util.regex.Pattern;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
+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;
 
 /**
  * Helper methods for generated binding code. This class concentrates useful primitives generated code may call
@@ -315,6 +320,66 @@ public final class CodeHelpers {
         return wrapHashCode(Arrays.hashCode(obj));
     }
 
+    /**
+     * Compatibility utility for converting a legacy {@link Short} {@code uint8} value to its {@link Uint8}
+     * counterpart.
+     *
+     * @param value Legacy value
+     * @return Converted value
+     * @throws IllegalArgumentException if the value does not fit an Uint8
+     * @deprecated This method is provided for migration purposes only, do not use it outside of deprecated
+     *             compatibility methods.
+     */
+    @Deprecated
+    public static @Nullable Uint8 compatUint(final @Nullable Short value) {
+        return value == null ? null : Uint8.valueOf(value.shortValue());
+    }
+
+    /**
+     * Compatibility utility for converting a legacy {@link Integer} {@code uint16} value to its {@link Uint16}
+     * counterpart.
+     *
+     * @param value Legacy value
+     * @return Converted value
+     * @throws IllegalArgumentException if the value does not fit an Uint16
+     * @deprecated This method is provided for migration purposes only, do not use it outside of deprecated
+     *             compatibility methods.
+     */
+    @Deprecated
+    public static @Nullable Uint16 compatUint(final @Nullable Integer value) {
+        return value == null ? null : Uint16.valueOf(value.intValue());
+    }
+
+    /**
+     * Compatibility utility for converting a legacy {@link Long} {@code uint32} value to its {@link Uint32}
+     * counterpart.
+     *
+     * @param value Legacy value
+     * @return Converted value
+     * @throws IllegalArgumentException if the value does not fit an Uint32
+     * @deprecated This method is provided for migration purposes only, do not use it outside of deprecated
+     *             compatibility methods.
+     */
+    @Deprecated
+    public static @Nullable Uint32 compatUint(final @Nullable Long value) {
+        return value == null ? null : Uint32.valueOf(value.longValue());
+    }
+
+    /**
+     * Compatibility utility for converting a legacy {@link BigInteger} {@code uint64} value to its {@link Uint64}
+     * counterpart.
+     *
+     * @param value Legacy value
+     * @return Converted value
+     * @throws IllegalArgumentException if the value does not fit an Uint64
+     * @deprecated This method is provided for migration purposes only, do not use it outside of deprecated
+     *             compatibility methods.
+     */
+    @Deprecated
+    public static @Nullable Uint64 compatUint(final @Nullable BigInteger value) {
+        return value == null ? null : Uint64.valueOf(value);
+    }
+
     /**
      * The constant '31' is the result of folding this code:
      * <pre>