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=332707334c9cbc54bbb0e53298ab74428002f6f3;hb=d9a9901b2b9e33685d1702cc7105509c5369625d;hp=a6fe0b5887582c853441f615db33703151990b16;hpb=26664cfa0f2a5145ae09b94701166efd2f9811d2;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 a6fe0b5887..332707334c 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 @@ -8,8 +8,9 @@ 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; -import static org.opendaylight.mdsal.binding.dom.codec.impl.ByteBuddyUtils.loadThis; import static org.opendaylight.mdsal.binding.dom.codec.impl.ByteBuddyUtils.putField; import com.google.common.base.Throwables; @@ -34,17 +35,17 @@ 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.loader.CodecClassLoader.GeneratorResult; +import org.opendaylight.mdsal.binding.dom.codec.impl.loader.CodecClassLoader.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.binding.Notification; 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.NormalizedNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer; -import org.opendaylight.yangtools.yang.model.api.NotificationDefinition; -final class NotificationCodecContext - extends DataObjectCodecContext { +final class NotificationCodecContext + extends DataObjectCodecContext { private static final Generic EVENT_INSTANT_AWARE = TypeDefinition.Sort.describe(EventInstantAware.class); private static final String EVENT_INSTANT_NAME; @@ -57,18 +58,18 @@ final class NotificationCodecContext } private static final Generic BB_DOCC = TypeDefinition.Sort.describe(DataObjectCodecContext.class); - private static final Generic BB_NNC = TypeDefinition.Sort.describe(NormalizedNodeContainer.class); + private static final Generic BB_DNC = TypeDefinition.Sort.describe(DistinctNodeContainer.class); private static final Generic BB_I = TypeDefinition.Sort.describe(Instant.class); private static final MethodType CONSTRUCTOR_TYPE = MethodType.methodType(void.class, DataObjectCodecContext.class, - NormalizedNodeContainer.class, Instant.class); - private static final MethodType NOTIFICATION_TYPE = MethodType.methodType(Notification.class, + DistinctNodeContainer.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 NotificationDefinition schema, + NotificationCodecContext(final Class key, final NotificationRuntimeType schema, final CodecContextFactory factory) { super(DataContainerCodecPrototype.from(key, schema, factory)); final Class bindingClass = getBindingClass(); @@ -83,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_NNC, BB_I) + .withParameters(BB_DOCC, BB_DNC, BB_I) .intercept(ConstructorImplementation.INSTANCE) .defineMethod(EVENT_INSTANT_NAME, EVENT_INSTANT_RETTYPE, Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC) .intercept(EventInstantImplementation.INSTANCE) @@ -100,23 +101,25 @@ final class NotificationCodecContext } @Override - public D deserialize(final NormalizedNode data) { - checkState(data instanceof ContainerNode); + public D deserialize(final NormalizedNode data) { + checkState(data instanceof ContainerNode, "Unexpected data %s", data); return createBindingProxy((ContainerNode) data); } @SuppressWarnings("checkstyle:illegalCatch") - Notification deserialize(final @NonNull ContainerNode data, final @NonNull Instant eventInstant) { + @NonNull BaseNotification deserialize(final @NonNull ContainerNode data, final @NonNull Instant eventInstant) { + final BaseNotification ret; try { - return (Notification) eventProxy.invokeExact(this, data, eventInstant); + ret = (BaseNotification) eventProxy.invokeExact(this, data, eventInstant); } catch (final Throwable e) { Throwables.throwIfUnchecked(e); - throw new IllegalStateException(e); + throw new LinkageError("Failed to instantiate notification", e); } + return verifyNotNull(ret); } @Override - protected Object deserializeObject(final NormalizedNode normalizedNode) { + protected Object deserializeObject(final NormalizedNode normalizedNode) { return deserialize(normalizedNode); } @@ -130,7 +133,7 @@ final class NotificationCodecContext try { LOAD_CTOR_ARGS = MethodVariableAccess.allArgumentsOf(new MethodDescription.ForLoadedConstructor( AugmentableCodecDataObject.class.getDeclaredConstructor(DataObjectCodecContext.class, - NormalizedNodeContainer.class))); + DistinctNodeContainer.class))); } catch (NoSuchMethodException e) { throw new ExceptionInInitializerError(e); } @@ -144,7 +147,7 @@ final class NotificationCodecContext @Override public ByteCodeAppender appender(final Target implementationTarget) { final TypeDescription instrumentedType = implementationTarget.getInstrumentedType(); - final InGenericShape superCtor = instrumentedType.getSuperClass().getDeclaredMethods() + final InGenericShape superCtor = verifyNotNull(instrumentedType.getSuperClass()).getDeclaredMethods() .filter(ElementMatchers.isConstructor()).getOnly(); return new ByteCodeAppender.Simple(