Convert mdsal-binding-dom-codec to a JPMS module
[mdsal.git] / binding / mdsal-binding-dom-codec / src / main / java / org / opendaylight / mdsal / binding / dom / codec / impl / NotificationCodecContext.java
index a6fe0b5887582c853441f615db33703151990b16..332707334c9cbc54bbb0e53298ab74428002f6f3 100644 (file)
@@ -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<D extends DataObject & Notification>
-        extends DataObjectCodecContext<D, NotificationDefinition> {
+final class NotificationCodecContext<D extends DataObject & BaseNotification>
+        extends DataObjectCodecContext<D, NotificationRuntimeType> {
     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<D extends DataObject & Notification>
     }
 
     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<D> bindingClass = getBindingClass();
@@ -83,7 +84,7 @@ final class NotificationCodecContext<D extends DataObject & Notification>
                     .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<D extends DataObject & Notification>
     }
 
     @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<D extends DataObject & Notification>
             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<D extends DataObject & Notification>
         @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(