X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=binding%2Fmdsal-binding-dom-adapter%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fdom%2Fadapter%2FBindingToNormalizedNodeCodec.java;h=55fde2cd655b19b5e47517d3ca0ec7895f84cf50;hb=6e6ebc43866204667658f8bbf7cfb6233caffdc7;hp=dbf76b5f4240183747b4ce427e5c6558a1887ad2;hpb=0f351bbc28ddf2cddfe30c8d018646d81953fa17;p=mdsal.git diff --git a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodec.java b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodec.java index dbf76b5f42..55fde2cd65 100644 --- a/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodec.java +++ b/binding/mdsal-binding-dom-adapter/src/main/java/org/opendaylight/mdsal/binding/dom/adapter/BindingToNormalizedNodeCodec.java @@ -18,6 +18,7 @@ import com.google.common.collect.ImmutableBiMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterators; import java.lang.reflect.Method; +import java.time.Instant; import java.util.AbstractMap.SimpleEntry; import java.util.Collection; import java.util.HashSet; @@ -27,20 +28,21 @@ import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.function.Function; import java.util.stream.Collectors; -import javassist.ClassPool; -import javax.annotation.Nonnull; +import javax.annotation.PreDestroy; +import javax.inject.Inject; +import javax.inject.Singleton; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.binding.api.DataTreeIdentifier; import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree; import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory; import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeNode; +import org.opendaylight.mdsal.binding.dom.codec.api.BindingDataObjectCodecTreeNode; import org.opendaylight.mdsal.binding.dom.codec.api.BindingLazyContainerNode; import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer; -import org.opendaylight.mdsal.binding.dom.codec.gen.impl.StreamWriterGenerator; import org.opendaylight.mdsal.binding.dom.codec.impl.BindingNormalizedNodeCodecRegistry; import org.opendaylight.mdsal.binding.dom.codec.impl.MissingSchemaException; import org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy; import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; -import org.opendaylight.mdsal.binding.generator.util.JavassistUtils; import org.opendaylight.mdsal.binding.spec.naming.BindingMapping; import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections; import org.opendaylight.mdsal.dom.api.DOMDataTreeIdentifier; @@ -82,6 +84,7 @@ import org.slf4j.LoggerFactory; *

* NOTE: this class is non-final to allow controller adapter migration without duplicated code. */ +@Singleton public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory, BindingNormalizedNodeSerializer, SchemaContextListener, AutoCloseable { @@ -91,7 +94,7 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory, private final LoadingCache, YangInstanceIdentifier> iiCache = CacheBuilder.newBuilder() .softValues().build(new CacheLoader, YangInstanceIdentifier>() { @Override - public YangInstanceIdentifier load(@Nonnull final InstanceIdentifier key) { + public YangInstanceIdentifier load(final InstanceIdentifier key) { return toYangInstanceIdentifierBlocking(key); } }); @@ -100,6 +103,7 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory, private final FutureSchema futureSchema; private ListenerRegistration listenerRegistration; + @Inject public BindingToNormalizedNodeCodec(final ClassLoadingStrategy classLoadingStrategy, final BindingNormalizedNodeCodecRegistry codecRegistry) { this(classLoadingStrategy, codecRegistry, false); @@ -114,8 +118,7 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory, public static BindingToNormalizedNodeCodec newInstance(final ClassLoadingStrategy classLoadingStrategy, final DOMSchemaService schemaService) { - final BindingNormalizedNodeCodecRegistry codecRegistry = new BindingNormalizedNodeCodecRegistry( - StreamWriterGenerator.create(JavassistUtils.forClassPool(ClassPool.getDefault()))); + final BindingNormalizedNodeCodecRegistry codecRegistry = new BindingNormalizedNodeCodecRegistry(); BindingToNormalizedNodeCodec instance = new BindingToNormalizedNodeCodec( classLoadingStrategy, codecRegistry, true); instance.listenerRegistration = schemaService.registerSchemaContextListener(instance); @@ -147,7 +150,7 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory, } @Override - public final YangInstanceIdentifier toYangInstanceIdentifier(@Nonnull final InstanceIdentifier binding) { + public final YangInstanceIdentifier toYangInstanceIdentifier(final InstanceIdentifier binding) { return codecRegistry.toYangInstanceIdentifier(binding); } @@ -183,20 +186,24 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory, } @Override - public final Entry, DataObject> fromNormalizedNode(@Nonnull final YangInstanceIdentifier path, + public final Entry, DataObject> fromNormalizedNode(final YangInstanceIdentifier path, final NormalizedNode data) { return codecRegistry.fromNormalizedNode(path, data); } @Override - public final Notification fromNormalizedNodeNotification(@Nonnull final SchemaPath path, - @Nonnull final ContainerNode data) { + public final Notification fromNormalizedNodeNotification(final SchemaPath path, final ContainerNode data) { return codecRegistry.fromNormalizedNodeNotification(path, data); } @Override - public final DataObject fromNormalizedNodeRpcData(@Nonnull final SchemaPath path, - @Nonnull final ContainerNode data) { + public final Notification fromNormalizedNodeNotification(final SchemaPath path, final ContainerNode data, + final Instant eventInstant) { + return codecRegistry.fromNormalizedNodeNotification(path, data, eventInstant); + } + + @Override + public final DataObject fromNormalizedNodeRpcData(final SchemaPath path, final ContainerNode data) { return codecRegistry.fromNormalizedNodeRpcData(path, data); } @@ -213,17 +220,17 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory, } @Override - public final InstanceIdentifier fromYangInstanceIdentifier(@Nonnull final YangInstanceIdentifier dom) { + public final InstanceIdentifier fromYangInstanceIdentifier(final YangInstanceIdentifier dom) { return codecRegistry.fromYangInstanceIdentifier(dom); } @Override - public final ContainerNode toNormalizedNodeNotification(@Nonnull final Notification data) { + public final ContainerNode toNormalizedNodeNotification(final Notification data) { return codecRegistry.toNormalizedNodeNotification(data); } @Override - public final ContainerNode toNormalizedNodeRpcData(@Nonnull final DataContainer data) { + public final ContainerNode toNormalizedNodeRpcData(final DataContainer data) { return codecRegistry.toNormalizedNodeRpcData(data); } @@ -269,7 +276,7 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory, } public final Optional, DataObject>> toBinding( - @Nonnull final Entry> normalized) + final @NonNull Entry> normalized) throws DeserializationException { try { /* @@ -318,6 +325,7 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory, } @Override + @PreDestroy public void close() { if (listenerRegistration != null) { listenerRegistration.close(); @@ -387,7 +395,7 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory, private Method findRpcMethod(final Class key, final RpcDefinition rpcDef) throws NoSuchMethodException { - final String methodName = BindingMapping.getMethodName(rpcDef.getQName()); + final String methodName = BindingMapping.getRpcMethodName(rpcDef.getQName()); final Class inputClz = runtimeContext().getClassForSchema(rpcDef.getInput()); return key.getMethod(methodName, inputClz); } @@ -402,8 +410,7 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory, return codecRegistry.create(context, bindingClasses); } - @Nonnull - protected Entry, BindingCodecTreeNode> getSubtreeCodec( + protected @NonNull Entry, BindingDataObjectCodecTreeNode> getSubtreeCodec( final YangInstanceIdentifier domIdentifier) { final BindingCodecTree currentCodecTree = codecRegistry.getCodecContext(); @@ -413,7 +420,7 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory, * If we are able to deserialize YANG instance identifier, getSubtreeCodec must * return non-null value. */ - final BindingCodecTreeNode codecContext = currentCodecTree.getSubtreeCodec(bindingPath); + final BindingDataObjectCodecTreeNode codecContext = currentCodecTree.getSubtreeCodec(bindingPath); return new SimpleEntry<>(bindingPath, codecContext); } @@ -452,8 +459,16 @@ public class BindingToNormalizedNodeCodec implements BindingCodecTreeFactory, return ImmutableNodes.fromInstanceId(runtimeContext().getSchemaContext(), parentPath); } + /** + * This method creates an empty list container of a particular type. + * + * @deprecated This method is not generally useful, as empty lists do not convey information in YANG (they are + * equivalent to non-present lists). It also leaks implementation details to a broader scope and should + * never have been public in the first place. + */ + @Deprecated public NormalizedNode getDefaultNodeFor(final YangInstanceIdentifier parentMapPath) { - final BindingCodecTreeNode mapCodec = requireNonNull( + final BindingCodecTreeNode mapCodec = requireNonNull( codecRegistry.getCodecContext().getSubtreeCodec(parentMapPath), "Codec not found for yang instance identifier: " + parentMapPath); final WithStatus schema = mapCodec.getSchema();