X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=binding%2Fmdsal-binding-dom-codec%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fdom%2Fcodec%2Fimpl%2FNotificationCodecContext.java;h=324b01f01863a48e3ffeac72c32740de9ca5587f;hb=3b18d17d6882c14b0f3542717e3ca539c0bc9593;hp=332707334c9cbc54bbb0e53298ab74428002f6f3;hpb=d9a9901b2b9e33685d1702cc7105509c5369625d;p=mdsal.git diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/NotificationCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/NotificationCodecContext.java index 332707334c..324b01f018 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/NotificationCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/NotificationCodecContext.java @@ -7,7 +7,6 @@ */ package org.opendaylight.mdsal.binding.dom.codec.impl; -import static com.google.common.base.Preconditions.checkState; import static com.google.common.base.Verify.verifyNotNull; import static net.bytebuddy.implementation.bytecode.member.MethodVariableAccess.loadThis; import static org.opendaylight.mdsal.binding.dom.codec.impl.ByteBuddyUtils.getField; @@ -35,13 +34,14 @@ import net.bytebuddy.implementation.bytecode.member.MethodVariableAccess; import net.bytebuddy.jar.asm.Opcodes; import net.bytebuddy.matcher.ElementMatchers; import org.eclipse.jdt.annotation.NonNull; -import org.opendaylight.mdsal.binding.dom.codec.impl.loader.CodecClassLoader.GeneratorResult; +import org.opendaylight.mdsal.binding.loader.BindingClassLoader.GeneratorResult; import org.opendaylight.mdsal.binding.runtime.api.NotificationRuntimeType; import org.opendaylight.yangtools.yang.binding.BaseNotification; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.EventInstantAware; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; -import org.opendaylight.yangtools.yang.data.api.schema.DistinctNodeContainer; +import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; final class NotificationCodecContext @@ -58,25 +58,25 @@ final class NotificationCodecContext } private static final Generic BB_DOCC = TypeDefinition.Sort.describe(DataObjectCodecContext.class); - private static final Generic BB_DNC = TypeDefinition.Sort.describe(DistinctNodeContainer.class); + private static final Generic BB_DCN = TypeDefinition.Sort.describe(DataContainerNode.class); private static final Generic BB_I = TypeDefinition.Sort.describe(Instant.class); private static final MethodType CONSTRUCTOR_TYPE = MethodType.methodType(void.class, DataObjectCodecContext.class, - DistinctNodeContainer.class, Instant.class); + DataContainerNode.class, Instant.class); private static final MethodType NOTIFICATION_TYPE = MethodType.methodType(BaseNotification.class, NotificationCodecContext.class, ContainerNode.class, Instant.class); private static final String INSTANT_FIELD = "instant"; private final MethodHandle eventProxy; - NotificationCodecContext(final Class key, final NotificationRuntimeType schema, + NotificationCodecContext(final Class notificationClass, final NotificationRuntimeType type, final CodecContextFactory factory) { - super(DataContainerCodecPrototype.from(key, schema, factory)); - final Class bindingClass = getBindingClass(); + super(new Prototype<>(notificationClass, type, factory)); + final var bindingClass = getBindingClass(); - final Class awareClass = factory().getLoader().generateClass(bindingClass, "eventInstantAware", - (loader, fqcn, bindingInterface) -> { - final Class codecImpl = loader.getGeneratedClass(bindingClass, "codecImpl"); + final var eventAwareClass = CodecPackage.EVENT_AWARE.generateClass(prototype().contextFactory().getLoader(), + bindingClass, (loader, fqcn, bindingInterface) -> { + final var codecImpl = CodecPackage.CODEC.getGeneratedClass(loader, bindingClass); return GeneratorResult.of(new ByteBuddy() .subclass(codecImpl, ConstructorStrategy.Default.NO_CONSTRUCTORS) @@ -84,7 +84,7 @@ final class NotificationCodecContext .name(fqcn) .defineField(INSTANT_FIELD, BB_I, Opcodes.ACC_PRIVATE | Opcodes.ACC_FINAL | Opcodes.ACC_SYNTHETIC) .defineConstructor(Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC) - .withParameters(BB_DOCC, BB_DNC, BB_I) + .withParameters(BB_DOCC, BB_DCN, BB_I) .intercept(ConstructorImplementation.INSTANCE) .defineMethod(EVENT_INSTANT_NAME, EVENT_INSTANT_RETTYPE, Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC) .intercept(EventInstantImplementation.INSTANCE) @@ -93,7 +93,7 @@ final class NotificationCodecContext final MethodHandle ctor; try { - ctor = MethodHandles.publicLookup().findConstructor(awareClass, CONSTRUCTOR_TYPE); + ctor = MethodHandles.publicLookup().findConstructor(eventAwareClass, CONSTRUCTOR_TYPE); } catch (IllegalAccessException | NoSuchMethodException e) { throw new LinkageError("Failed to acquire constructor", e); } @@ -102,8 +102,7 @@ final class NotificationCodecContext @Override public D deserialize(final NormalizedNode data) { - checkState(data instanceof ContainerNode, "Unexpected data %s", data); - return createBindingProxy((ContainerNode) data); + return createBindingProxy(checkDataArgument(ContainerNode.class, data)); } @SuppressWarnings("checkstyle:illegalCatch") @@ -123,6 +122,22 @@ final class NotificationCodecContext return deserialize(normalizedNode); } + /** + * Prototype for a {@code notification}. This class only exists because DataContainerCodecContext requires a + * prototype. + */ + static final class Prototype + extends DataObjectCodecPrototype { + private Prototype(final Class cls, final NotificationRuntimeType type, final CodecContextFactory factory) { + super(cls, NodeIdentifier.create(type.statement().argument()), type, factory); + } + + @Override + NotificationCodecContext createInstance() { + throw new UnsupportedOperationException("Should never be invoked"); + } + } + private enum ConstructorImplementation implements Implementation { INSTANCE; @@ -132,8 +147,8 @@ final class NotificationCodecContext static { try { LOAD_CTOR_ARGS = MethodVariableAccess.allArgumentsOf(new MethodDescription.ForLoadedConstructor( - AugmentableCodecDataObject.class.getDeclaredConstructor(DataObjectCodecContext.class, - DistinctNodeContainer.class))); + AugmentableCodecDataObject.class.getDeclaredConstructor(AbstractDataObjectCodecContext.class, + DataContainerNode.class))); } catch (NoSuchMethodException e) { throw new ExceptionInInitializerError(e); }