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.putField;
import com.google.common.base.Throwables;
import java.lang.invoke.MethodHandle;
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.runtime.api.NotificationRuntimeType;
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 & Notification<D>>
+ extends DataObjectCodecContext<D, NotificationRuntimeType> {
private static final Generic EVENT_INSTANT_AWARE = TypeDefinition.Sort.describe(EventInstantAware.class);
private static final String EVENT_INSTANT_NAME;
}
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);
+ DistinctNodeContainer.class, Instant.class);
private static final MethodType NOTIFICATION_TYPE = MethodType.methodType(Notification.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();
.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)
}
@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) {
+ Notification<?> deserialize(final @NonNull ContainerNode data, final @NonNull Instant eventInstant) {
try {
- return (Notification) eventProxy.invokeExact(this, data, eventInstant);
+ return (Notification<?>) eventProxy.invokeExact(this, data, eventInstant);
} catch (final Throwable e) {
Throwables.throwIfUnchecked(e);
throw new IllegalStateException(e);
}
@Override
- protected Object deserializeObject(final NormalizedNode<?, ?> normalizedNode) {
+ protected Object deserializeObject(final NormalizedNode normalizedNode) {
return deserialize(normalizedNode);
}
private enum ConstructorImplementation implements Implementation {
INSTANCE;
- private static final StackManipulation INSTANT_ARG = MethodVariableAccess.REFERENCE.loadFrom(3);
+ private static final StackManipulation LOAD_INSTANT_ARG = MethodVariableAccess.REFERENCE.loadFrom(3);
private static final StackManipulation LOAD_CTOR_ARGS;
static {
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);
}
@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(
- ByteBuddyUtils.THIS,
+ loadThis(),
LOAD_CTOR_ARGS,
MethodInvocation.invoke(superCtor),
- ByteBuddyUtils.THIS,
- INSTANT_ARG,
- ByteBuddyUtils.putField(instrumentedType, INSTANT_FIELD),
+ loadThis(),
+ LOAD_INSTANT_ARG,
+ putField(instrumentedType, INSTANT_FIELD),
MethodReturn.VOID);
}
}
@Override
public ByteCodeAppender appender(final Target implementationTarget) {
return new ByteCodeAppender.Simple(
- ByteBuddyUtils.THIS,
- ByteBuddyUtils.getField(implementationTarget.getInstrumentedType(), INSTANT_FIELD),
+ loadThis(),
+ getField(implementationTarget.getInstrumentedType(), INSTANT_FIELD),
MethodReturn.REFERENCE);
}
}