From 0c923340c2e23ce2f9c5e40c2a92c3930327f50c Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sun, 26 Apr 2020 15:06:09 +0200 Subject: [PATCH] Revert "Remove deprecated uint migration elements" This reverts commit 1382c1d88b753e152ff26eae1091cd42e5aba76b, reinstating generation of compatibility elements. JIRA: MDSAL-490 Change-Id: Ia59eb16f3f0e534ce7339c46c24fc4d0b22d6f05 Signed-off-by: Robert Varga --- .../java/api/generator/BaseTemplate.xtend | 13 ++++ .../java/api/generator/BuilderTemplate.xtend | 15 +++++ .../java/api/generator/ClassTemplate.xtend | 47 ++++++++++++++ .../yangtools/yang/binding/CodeHelpers.java | 65 +++++++++++++++++++ 4 files changed, 140 insertions(+) diff --git a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/BaseTemplate.xtend b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/BaseTemplate.xtend index a17d9c7ca3..92bd21dae4 100644 --- a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/BaseTemplate.xtend +++ b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/BaseTemplate.xtend @@ -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) } diff --git a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/BuilderTemplate.xtend b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/BuilderTemplate.xtend index 14b91bcf2f..2ed424abaa 100644 --- a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/BuilderTemplate.xtend +++ b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/BuilderTemplate.xtend @@ -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» ''' /** diff --git a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/ClassTemplate.xtend b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/ClassTemplate.xtend index fac6cf25c5..3b18d18815 100644 --- a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/ClassTemplate.xtend +++ b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/ClassTemplate.xtend @@ -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 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 + } } diff --git a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/CodeHelpers.java b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/CodeHelpers.java index 2dd7ac1674..fce8d8301f 100644 --- a/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/CodeHelpers.java +++ b/binding/yang-binding/src/main/java/org/opendaylight/yangtools/yang/binding/CodeHelpers.java @@ -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: *
-- 
2.36.6