From 3b18d17d6882c14b0f3542717e3ca539c0bc9593 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 11 Jan 2024 19:42:26 +0100 Subject: [PATCH] Retain protype in DataContainerCodecContext Acknowledge that DataContainerCodecContext is always instantiated from a prototype and retain it in the base class. This ends up centralizing things enough to eliminate an ugly cast we are using in AugmentationCodecContext. JIRA: MDSAL-815 Change-Id: Ib604918c2d9e180fece0583331fc2486797cf546 Signed-off-by: Robert Varga --- ...tractBindingNormalizedNodeCacheHolder.java | 2 +- .../impl/AbstractDataObjectCodecContext.java | 4 +-- .../codec/impl/AugmentationCodecContext.java | 2 +- .../dom/codec/impl/BindingCodecContext.java | 12 ++++----- .../impl/BindingToNormalizedStreamWriter.java | 4 +-- .../impl/CachingNormalizedNodeCodec.java | 2 +- .../impl/CachingNormalizedNodeSerializer.java | 6 ++--- .../dom/codec/impl/ChoiceCodecContext.java | 4 +-- .../impl/CommonDataObjectCodecContext.java | 27 +++++-------------- .../codec/impl/DataContainerCodecContext.java | 25 +++++++++-------- .../codec/impl/DataObjectCodecContext.java | 14 +++++----- .../impl/DataObjectNormalizedNodeCache.java | 4 +-- .../codec/impl/NotificationCodecContext.java | 10 +++---- 13 files changed, 52 insertions(+), 64 deletions(-) diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractBindingNormalizedNodeCacheHolder.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractBindingNormalizedNodeCacheHolder.java index d07de864c5..e50b64402e 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractBindingNormalizedNodeCacheHolder.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractBindingNormalizedNodeCacheHolder.java @@ -27,7 +27,7 @@ abstract class AbstractBindingNormalizedNodeCacheHolder { @Override public AbstractBindingNormalizedNodeCache load(final CodecContext key) { // FIXME: Use a switch expression once we have https://openjdk.org/jeps/441 - if (key instanceof DataContainerCodecContext dataContainer) { + if (key instanceof DataContainerCodecContext dataContainer) { return new DataObjectNormalizedNodeCache(AbstractBindingNormalizedNodeCacheHolder.this, dataContainer); } diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractDataObjectCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractDataObjectCodecContext.java index 0afa5e63e4..d0e2f04db3 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractDataObjectCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractDataObjectCodecContext.java @@ -60,7 +60,7 @@ public abstract sealed class AbstractDataObjectCodecContext caze; + final DataContainerCodecContext caze; if (caseType.isPresent()) { // Non-ambiguous addressing this should not pose any problems caze = choice.getStreamChild(caseType.orElseThrow()); diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentationCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentationCodecContext.java index 9401a0e2f6..3d0e09f59d 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentationCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentationCodecContext.java @@ -73,7 +73,7 @@ final class AugmentationCodecContext> @SuppressWarnings("checkstyle:illegalCatch") @Override public D filterFrom(final DataContainerNode parentData) { - for (var childArg : ((AugmentationCodecPrototype) prototype).getChildArgs()) { + for (var childArg : ((AugmentationCodecPrototype) prototype()).getChildArgs()) { if (parentData.childByArg(childArg) != null) { try { return (D) proxyConstructor.invokeExact(this, parentData); diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java index c3e327ec9a..1547e7d0a9 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingCodecContext.java @@ -151,10 +151,10 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri return new DataContainerSerializer(BindingCodecContext.this, streamers.get(key)); } }); - private final LoadingCache, DataContainerCodecContext> childrenByClass = + private final LoadingCache, DataContainerCodecContext> childrenByClass = CacheBuilder.newBuilder().build(new CacheLoader<>() { @Override - public DataContainerCodecContext load(final Class key) { + public DataContainerCodecContext load(final Class key) { final var childSchema = context.getTypes().bindingChild(JavaTypeName.create(key)); if (childSchema instanceof ContainerLikeRuntimeType containerLike) { if (childSchema instanceof ContainerRuntimeType container @@ -177,10 +177,10 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri }); // FIXME: this could also be a leaf! - private final LoadingCache> childrenByDomArg = + private final LoadingCache> childrenByDomArg = CacheBuilder.newBuilder().build(new CacheLoader<>() { @Override - public DataContainerCodecContext load(final QName qname) throws ClassNotFoundException { + public DataContainerCodecContext load(final QName qname) throws ClassNotFoundException { final var type = context.getTypes(); final var child = type.schemaTreeChild(qname); if (child == null) { @@ -426,12 +426,12 @@ public final class BindingCodecContext extends AbstractBindingNormalizedNodeSeri return new BindingToNormalizedStreamWriter(getActionCodec(action).output(), domWriter); } - @NonNull DataContainerCodecContext getCodecContextNode(final InstanceIdentifier binding, + @NonNull DataContainerCodecContext getCodecContextNode(final InstanceIdentifier binding, final List builder) { final var it = binding.getPathArguments().iterator(); final var arg = it.next(); - DataContainerCodecContext current; + DataContainerCodecContext current; final var caseType = arg.getCaseType(); if (caseType.isPresent()) { final @NonNull Class type = caseType.orElseThrow(); diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingToNormalizedStreamWriter.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingToNormalizedStreamWriter.java index d4b8aedda2..7ae4331218 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingToNormalizedStreamWriter.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/BindingToNormalizedStreamWriter.java @@ -37,7 +37,7 @@ final class BindingToNormalizedStreamWriter implements AnydataBindingStreamWrite private final @NonNull NormalizedNodeStreamWriter delegate; private final CodecContext rootContext; - BindingToNormalizedStreamWriter(final DataContainerCodecContext rootContext, + BindingToNormalizedStreamWriter(final DataContainerCodecContext rootContext, final NormalizedNodeStreamWriter delegate) { this.rootContext = requireNonNull(rootContext); this.delegate = requireNonNull(delegate); @@ -71,7 +71,7 @@ final class BindingToNormalizedStreamWriter implements AnydataBindingStreamWrite if (current == null) { // Entry of first node next = rootContext; - } else if (current instanceof DataContainerCodecContext currentContainer) { + } else if (current instanceof DataContainerCodecContext currentContainer) { next = currentContainer.getStreamChild((Class) name); } else { throw new IllegalArgumentException("Could not start node " + name + " in non-container " + current); diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CachingNormalizedNodeCodec.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CachingNormalizedNodeCodec.java index 4d8599d4c4..a1807fd658 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CachingNormalizedNodeCodec.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CachingNormalizedNodeCodec.java @@ -17,7 +17,7 @@ import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; class CachingNormalizedNodeCodec & BindingNormalizedNodeCodec> + C extends DataContainerCodecContext & BindingNormalizedNodeCodec> extends AbstractBindingNormalizedNodeCacheHolder implements BindingNormalizedNodeCachingCodec { private final @NonNull C context; diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CachingNormalizedNodeSerializer.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CachingNormalizedNodeSerializer.java index b02b64879a..60cbccf998 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CachingNormalizedNodeSerializer.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CachingNormalizedNodeSerializer.java @@ -39,7 +39,7 @@ final class CachingNormalizedNodeSerializer extends ForwardingBindingStreamEvent private final BindingToNormalizedStreamWriter delegate; private CachingNormalizedNodeSerializer(final AbstractBindingNormalizedNodeCacheHolder cacheHolder, - final DataContainerCodecContext subtreeRoot) { + final DataContainerCodecContext subtreeRoot) { this.cacheHolder = requireNonNull(cacheHolder); delegate = new BindingToNormalizedStreamWriter(subtreeRoot, domWriter); } @@ -53,7 +53,7 @@ final class CachingNormalizedNodeSerializer extends ForwardingBindingStreamEvent * @return Normalized Node representation of data. */ static NormalizedNode serializeUsingStreamWriter(final AbstractBindingNormalizedNodeCacheHolder cacheHolder, - final DataContainerCodecContext subtreeRoot, final DataObject data) { + final DataContainerCodecContext subtreeRoot, final DataObject data) { final var writer = new CachingNormalizedNodeSerializer(cacheHolder, subtreeRoot); try { subtreeRoot.eventStreamSerializer().serialize(data, writer); @@ -120,7 +120,7 @@ final class CachingNormalizedNodeSerializer extends ForwardingBindingStreamEvent private AbstractBindingNormalizedNodeCache getCacheSerializer( final Class type) { if (cacheHolder.isCached(type)) { - final var currentCtx = (DataContainerCodecContext) delegate.current(); + final var currentCtx = (DataContainerCodecContext) delegate.current(); if (type.equals(currentCtx.getBindingClass())) { return cacheHolder.getCachingSerializer(currentCtx); } diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ChoiceCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ChoiceCodecContext.java index 810dfdca65..8e0adc74b7 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ChoiceCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ChoiceCodecContext.java @@ -204,7 +204,7 @@ final class ChoiceCodecContext extends CommonDataObjectCod @Override public WithStatus getSchema() { // FIXME: Bad cast, we should be returning an EffectiveStatement perhaps? - return (WithStatus) type().statement(); + return (WithStatus) prototype().runtimeType().statement(); } @Override @@ -269,7 +269,7 @@ final class ChoiceCodecContext extends CommonDataObjectCod return createCachingCodec(this, cacheSpecifier); } - DataContainerCodecContext getCaseByChildClass(final @NonNull Class type) { + DataContainerCodecContext getCaseByChildClass(final @NonNull Class type) { var result = byCaseChildClass.get(type); if (result == null) { // We have not found an unambiguous result, try ambiguous ones diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CommonDataObjectCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CommonDataObjectCodecContext.java index cae761a9bb..f5416d24f5 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CommonDataObjectCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CommonDataObjectCodecContext.java @@ -7,9 +7,6 @@ */ package org.opendaylight.mdsal.binding.dom.codec.impl; -import static java.util.Objects.requireNonNull; - -import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.mdsal.binding.dom.codec.api.CommonDataObjectCodecTreeNode; import org.opendaylight.mdsal.binding.runtime.api.CompositeRuntimeType; import org.opendaylight.yangtools.yang.binding.DataObject; @@ -21,34 +18,22 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent * Base implementation of {@link CommonDataObjectCodecTreeNode}. */ abstract sealed class CommonDataObjectCodecContext - extends DataContainerCodecContext implements CommonDataObjectCodecTreeNode + extends DataContainerCodecContext> + implements CommonDataObjectCodecTreeNode permits AbstractDataObjectCodecContext, ChoiceCodecContext { - final @NonNull CommonDataObjectCodecPrototype prototype; - CommonDataObjectCodecContext(final CommonDataObjectCodecPrototype prototype) { - super(prototype.runtimeType()); - this.prototype = requireNonNull(prototype); + super(prototype); } @SuppressWarnings("unchecked") @Override public final Class getBindingClass() { - return Class.class.cast(prototype.javaClass()); - } - - @Override - protected final CodecContextFactory factory() { - return prototype.contextFactory(); - } - - @Override - protected final T type() { - return prototype.runtimeType(); + return Class.class.cast(prototype().javaClass()); } @Override protected NodeIdentifier getDomPathArgument() { - return prototype.getYangArg(); + return prototype().getYangArg(); } /** @@ -59,6 +44,6 @@ abstract sealed class CommonDataObjectCodecContext +abstract sealed class DataContainerCodecContext> extends CodecContext implements BindingDataContainerCodecTreeNode permits CommonDataObjectCodecContext { private static final Logger LOG = LoggerFactory.getLogger(DataContainerCodecContext.class); @@ -77,6 +78,7 @@ abstract sealed class DataContainerCodecContext & BindingNormalizedNodeCodec> + static final & BindingNormalizedNodeCodec> @NonNull BindingNormalizedNodeCachingCodec createCachingCodec(final C context, final ImmutableCollection> cacheSpecifier) { return cacheSpecifier.isEmpty() ? new NonCachingCodec<>(context) @@ -194,7 +197,7 @@ abstract sealed class DataContainerCodecContext childClass, final String message, final Object... args) { - return childNullException(factory().getRuntimeContext(), childClass, message, args); + return childNullException(prototype().contextFactory().getRuntimeContext(), childClass, message, args); } @CheckReturnValue @@ -236,7 +239,7 @@ abstract sealed class DataContainerCodecContext possibleAugmentations; + final var loader = prototype().contextFactory().getLoader(); if (Augmentable.class.isAssignableFrom(bindingClass)) { // Verify we have the appropriate backing runtimeType final var runtimeType = prototype.runtimeType(); @@ -114,12 +114,12 @@ public abstract sealed class DataObjectCodecContext cls) { - final BindingRuntimeContext ctx = factory().getRuntimeContext(); + final var ctx = prototype().contextFactory().getRuntimeContext(); final Class loaded; try { loaded = ctx.loadClass(Type.of(cls)); @@ -262,7 +262,7 @@ public abstract sealed class DataObjectCodecContext> augClass; try { diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectNormalizedNodeCache.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectNormalizedNodeCache.java index f52f40a85a..c5528471dc 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectNormalizedNodeCache.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectNormalizedNodeCache.java @@ -16,11 +16,11 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; * A cache of NormalizedNodes corresponding to a particular DataObject instantiation. */ final class DataObjectNormalizedNodeCache - extends AbstractBindingNormalizedNodeCache> { + extends AbstractBindingNormalizedNodeCache> { private final AbstractBindingNormalizedNodeCacheHolder cacheHolder; DataObjectNormalizedNodeCache(final AbstractBindingNormalizedNodeCacheHolder cacheHolder, - final DataContainerCodecContext rootContext) { + final DataContainerCodecContext rootContext) { super(rootContext); this.cacheHolder = requireNonNull(cacheHolder, "cacheHolder"); } 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 8c9ea4ac3c..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 @@ -72,11 +72,11 @@ final class NotificationCodecContext NotificationCodecContext(final Class notificationClass, final NotificationRuntimeType type, final CodecContextFactory factory) { super(new Prototype<>(notificationClass, type, factory)); - final Class bindingClass = getBindingClass(); + final var bindingClass = getBindingClass(); - final Class awareClass = CodecPackage.EVENT_AWARE.generateClass(factory().getLoader(), bindingClass, - (loader, fqcn, bindingInterface) -> { - final Class codecImpl = CodecPackage.CODEC.getGeneratedClass(loader, bindingClass); + 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) @@ -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); } -- 2.36.6