From: Robert Varga Date: Sat, 11 May 2019 09:47:38 +0000 (+0200) Subject: Do not use raw superclass for CodecDataObject instances X-Git-Tag: v6.0.1~31 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=1e355e58a1c3f9163576546692ac8cef996d34b2;p=mdsal.git Do not use raw superclass for CodecDataObject instances We can improve generated class accuracy by specifying generic type argument of CodecDataObject, thus making generated classes look not like raw subclasses. JIRA: MDSAL-550 Change-Id: If0581ea7186793539c9bc149c5e62c6db906616b Signed-off-by: Robert Varga --- diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CodecDataObjectGenerator.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CodecDataObjectGenerator.java index d8f1f36724..b2eeedc4be 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CodecDataObjectGenerator.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CodecDataObjectGenerator.java @@ -35,6 +35,7 @@ import net.bytebuddy.description.field.FieldDescription; import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDefinition; import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.description.type.TypeDescription.ForLoadedType; import net.bytebuddy.description.type.TypeDescription.Generic; import net.bytebuddy.dynamic.DynamicType.Builder; import net.bytebuddy.dynamic.scaffold.InstrumentedType; @@ -168,9 +169,9 @@ abstract class CodecDataObjectGenerator> implements implements NodeContextSupplierProvider { private final ImmutableMap properties; - Fixed(final Builder template, final ImmutableMap properties, + Fixed(final TypeDescription superClass, final ImmutableMap properties, final @Nullable Method keyMethod) { - super(template, keyMethod); + super(superClass, keyMethod); this.properties = requireNonNull(properties); } @@ -207,9 +208,9 @@ abstract class CodecDataObjectGenerator> implements private final ImmutableMap simpleProperties; private final Map> daoProperties; - Reusable(final Builder template, final ImmutableMap simpleProperties, + Reusable(final TypeDescription superClass, final ImmutableMap simpleProperties, final Map> daoProperties, final @Nullable Method keyMethod) { - super(template, keyMethod); + super(superClass, keyMethod); this.simpleProperties = requireNonNull(simpleProperties); this.daoProperties = requireNonNull(daoProperties); } @@ -258,6 +259,8 @@ abstract class CodecDataObjectGenerator> implements private static final Generic BB_DATAOBJECT = TypeDefinition.Sort.describe(DataObject.class); private static final Generic BB_HELPER = TypeDefinition.Sort.describe(ToStringHelper.class); private static final Generic BB_INT = TypeDefinition.Sort.describe(int.class); + private static final TypeDescription BB_CDO = ForLoadedType.of(CodecDataObject.class); + private static final TypeDescription BB_ACDO = ForLoadedType.of(AugmentableCodecDataObject.class); private static final Comparator METHOD_BY_ALPHABET = Comparator.comparing(Method::getName); private static final StackManipulation ARRAYS_EQUALS = invokeMethod(Arrays.class, "equals", @@ -272,20 +275,13 @@ abstract class CodecDataObjectGenerator> implements private static final int PROT_FINAL = Opcodes.ACC_PROTECTED | Opcodes.ACC_FINAL | Opcodes.ACC_SYNTHETIC; private static final int PUB_FINAL = Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL | Opcodes.ACC_SYNTHETIC; - private static final Builder CDO; - private static final Builder ACDO; + private static final ByteBuddy BB = new ByteBuddy(); - static { - final ByteBuddy bb = new ByteBuddy(); - CDO = bb.subclass(CodecDataObject.class).visit(ByteBuddyUtils.computeFrames()); - ACDO = bb.subclass(AugmentableCodecDataObject.class).visit(ByteBuddyUtils.computeFrames()); - } - - private final Builder template; + private final TypeDescription superClass; private final Method keyMethod; - CodecDataObjectGenerator(final Builder template, final @Nullable Method keyMethod) { - this.template = requireNonNull(template); + CodecDataObjectGenerator(final TypeDescription superClass, final @Nullable Method keyMethod) { + this.superClass = requireNonNull(superClass); this.keyMethod = keyMethod; } @@ -293,7 +289,7 @@ abstract class CodecDataObjectGenerator> implements final Class bindingInterface, final ImmutableMap simpleProperties, final Map> daoProperties, final Method keyMethod) { return loader.generateClass(bindingInterface, "codecImpl", - new Reusable<>(CDO, simpleProperties, daoProperties, keyMethod)); + new Reusable<>(BB_CDO, simpleProperties, daoProperties, keyMethod)); } static > Class generateAugmentable( @@ -301,7 +297,7 @@ abstract class CodecDataObjectGenerator> implements final ImmutableMap simpleProperties, final Map> daoProperties, final Method keyMethod) { return loader.generateClass(bindingInterface, "codecImpl", - new Reusable<>(ACDO, simpleProperties, daoProperties, keyMethod)); + new Reusable<>(BB_ACDO, simpleProperties, daoProperties, keyMethod)); } @Override @@ -309,8 +305,10 @@ abstract class CodecDataObjectGenerator> implements final Class bindingInterface) { LOG.trace("Generating class {}", fqcn); + final Generic bindingDef = TypeDefinition.Sort.describe(bindingInterface); @SuppressWarnings("unchecked") - Builder builder = (Builder) template.name(fqcn).implement(bindingInterface); + Builder builder = (Builder) BB.subclass(Generic.Builder.parameterizedType(superClass, bindingDef).build()) + .visit(ByteBuddyUtils.computeFrames()).name(fqcn).implement(bindingDef); builder = generateGetters(builder);