From d98a73e49bee3edaf8991fc5578bea23d91a304e Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sun, 4 Jun 2023 21:51:49 +0200 Subject: [PATCH] Sharpen CodecDataObject.data Since we do not have AugmentationNodes, we now know that all DistinctNodeContainers backing CodecDataObject are DataContainerNodes. Sharpen the contract, which gets rid of some ugliness around generic arguments. Change-Id: I097e6fda0ca312fc808f2ac2d4e0bbc6ac679315 Signed-off-by: Robert Varga --- .../impl/AbstractDataObjectCodecContext.java | 9 ++++----- .../codec/impl/AugmentableCodecDataObject.java | 12 +++++++----- .../dom/codec/impl/AugmentationNodeContext.java | 4 +--- .../binding/dom/codec/impl/CodecDataObject.java | 17 ++++++----------- .../dom/codec/impl/CodecDataObjectAnalysis.java | 6 +++--- .../dom/codec/impl/DataObjectCodecContext.java | 5 ++--- .../binding/dom/codec/impl/LazyBindingList.java | 12 ++++++------ .../codec/impl/NotificationCodecContext.java | 10 +++++----- 8 files changed, 34 insertions(+), 41 deletions(-) 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 d993fb5d13..8849c2ef17 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 @@ -24,8 +24,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; -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.DataContainerNode; import org.opendaylight.yangtools.yang.model.api.DocumentedNode.WithStatus; /** @@ -140,7 +139,7 @@ public abstract class AbstractDataObjectCodecContext node) { + final @NonNull D createBindingProxy(final DataContainerNode node) { try { return (D) proxyConstructor.invokeExact(this, node); } catch (final Throwable e) { @@ -161,6 +160,6 @@ public abstract class AbstractDataObjectCodecContext>, Augmentation> getAllAugmentationsFrom( - DistinctNodeContainer data); + abstract @NonNull Map>, Augmentation> getAllAugmentationsFrom( + DataContainerNode data); } diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentableCodecDataObject.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentableCodecDataObject.java index 25eadbf195..5791d5f817 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentableCodecDataObject.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentableCodecDataObject.java @@ -12,13 +12,13 @@ import static java.util.Objects.requireNonNull; import com.google.common.collect.ImmutableMap; import java.lang.invoke.MethodHandles; import java.lang.invoke.VarHandle; +import java.util.Map; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.binding.Augmentable; import org.opendaylight.yangtools.yang.binding.Augmentation; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode; -import org.opendaylight.yangtools.yang.data.api.schema.DistinctNodeContainer; /** * A base class for {@link DataObject}s which are also {@link Augmentable}, backed by {@link DataObjectCodecContext}. @@ -45,7 +45,7 @@ public abstract class AugmentableCodecDataObject>, Augmentation> cachedAugmentations; protected AugmentableCodecDataObject(final AbstractDataObjectCodecContext context, - final DistinctNodeContainer data) { + final DataContainerNode data) { super(context, data); } @@ -69,7 +69,7 @@ public abstract class AugmentableCodecDataObject>, Augmentation> augmentations() { - final ImmutableMap>, Augmentation> local = acquireAugmentations(); + final var local = acquireAugmentations(); return local != null ? local : loadAugmentations(); } @@ -90,7 +90,9 @@ public abstract class AugmentableCodecDataObject>, Augmentation> loadAugmentations() { - final var ret = ImmutableMap.copyOf(codecContext().getAllAugmentationsFrom(codecData())); + @SuppressWarnings("rawtypes") + final Map extracted = codecContext().getAllAugmentationsFrom(codecData()); + final var ret = ImmutableMap.>, Augmentation>copyOf(extracted); final Object witness = CACHED_AUGMENTATIONS.compareAndExchangeRelease(this, null, ret); return witness == null ? ret : (ImmutableMap>, Augmentation>) witness; } diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentationNodeContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentationNodeContext.java index 10a591063e..1abdb5f58f 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentationNodeContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AugmentationNodeContext.java @@ -18,7 +18,6 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode; -import org.opendaylight.yangtools.yang.data.api.schema.DistinctNodeContainer; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; final class AugmentationNodeContext> @@ -73,8 +72,7 @@ final class AugmentationNodeContext> } @Override - Map>, Augmentation> getAllAugmentationsFrom( - final DistinctNodeContainer data) { + Map>, Augmentation> getAllAugmentationsFrom(final DataContainerNode data) { return Map.of(); } } diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CodecDataObject.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CodecDataObject.java index 24e3af78bf..1aa856a3de 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CodecDataObject.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CodecDataObject.java @@ -15,9 +15,8 @@ import java.lang.invoke.VarHandle; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.binding.DataObject; -import org.opendaylight.yangtools.yang.data.api.schema.DistinctNodeContainer; +import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; /** * A base class for {@link DataObject}s backed by {@link DataObjectCodecContext}. While this class is public, it not @@ -42,23 +41,21 @@ public abstract class CodecDataObject implements DataObjec } private final @NonNull AbstractDataObjectCodecContext context; - @SuppressWarnings("rawtypes") - private final @NonNull DistinctNodeContainer data; + private final @NonNull DataContainerNode data; // Accessed via a VarHandle @SuppressWarnings("unused") // FIXME: consider using a primitive int-based cache (with 0 being uninit) private volatile Integer cachedHashcode; - protected CodecDataObject(final AbstractDataObjectCodecContext context, - final DistinctNodeContainer data) { + protected CodecDataObject(final AbstractDataObjectCodecContext context, final DataContainerNode data) { this.data = requireNonNull(data, "Data must not be null"); this.context = requireNonNull(context, "Context must not be null"); } @Override public final int hashCode() { - final Integer cached = (Integer) CACHED_HASH_CODE.getAcquire(this); + final var cached = (Integer) CACHED_HASH_CODE.getAcquire(this); return cached != null ? cached : loadHashCode(); } @@ -110,15 +107,13 @@ public abstract class CodecDataObject implements DataObjec return context; } - @SuppressWarnings("rawtypes") - final @NonNull DistinctNodeContainer codecData() { + final @NonNull DataContainerNode codecData() { return data; } // Helper split out of codecMember to aid its inlining private Object loadMember(final VarHandle handle, final NodeCodecContext childCtx) { - @SuppressWarnings("unchecked") - final NormalizedNode child = data.childByArg(childCtx.getDomPathArgument()); + final var child = data.childByArg(childCtx.getDomPathArgument()); // We do not want to use Optional.map() here because we do not want to invoke defaultObject() when we have // normal value because defaultObject() may end up throwing an exception intentionally. diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CodecDataObjectAnalysis.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CodecDataObjectAnalysis.java index e3b379c32c..ca447d8a65 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CodecDataObjectAnalysis.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/CodecDataObjectAnalysis.java @@ -33,7 +33,7 @@ import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.OpaqueObject; import org.opendaylight.yangtools.yang.binding.contract.Naming; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; -import org.opendaylight.yangtools.yang.data.api.schema.DistinctNodeContainer; +import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode; /** * Analysis of a {@link DataObject} specialization class. The primary point of this class is to separate out creation @@ -42,9 +42,9 @@ import org.opendaylight.yangtools.yang.data.api.schema.DistinctNodeContainer; */ final class CodecDataObjectAnalysis { private static final MethodType CONSTRUCTOR_TYPE = MethodType.methodType(void.class, - AbstractDataObjectCodecContext.class, DistinctNodeContainer.class); + AbstractDataObjectCodecContext.class, DataContainerNode.class); private static final MethodType DATAOBJECT_TYPE = MethodType.methodType(DataObject.class, - AbstractDataObjectCodecContext.class, DistinctNodeContainer.class); + AbstractDataObjectCodecContext.class, DataContainerNode.class); final @NonNull ImmutableMap, DataContainerCodecPrototype> byStreamClass; final @NonNull ImmutableMap, DataContainerCodecPrototype> byBindingArgClass; diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectCodecContext.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectCodecContext.java index bccc10790c..99735f9e1a 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectCodecContext.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectCodecContext.java @@ -35,7 +35,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.DistinctNodeContainer; +import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.api.schema.builder.DataContainerNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.Builders; @@ -240,8 +240,7 @@ public abstract class DataObjectCodecContext>, Augmentation> getAllAugmentationsFrom( - final DistinctNodeContainer data) { + Map>, Augmentation> getAllAugmentationsFrom(final DataContainerNode data) { /** * Due to augmentation fields are at same level as direct children the data of each augmentation needs to be * aggregated into own container node, then only deserialized using associated prototype. diff --git a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/LazyBindingList.java b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/LazyBindingList.java index 3164084cf7..adbc7ffeb6 100644 --- a/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/LazyBindingList.java +++ b/binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/LazyBindingList.java @@ -22,7 +22,7 @@ import java.util.function.UnaryOperator; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.concepts.Immutable; import org.opendaylight.yangtools.yang.binding.DataObject; -import org.opendaylight.yangtools.yang.data.api.schema.DistinctNodeContainer; +import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -73,7 +73,7 @@ final class LazyBindingList extends AbstractList implem } static @NonNull List create(final ListNodeCodecContext codec, final int size, - final Collection> entries) { + final Collection entries) { if (size == 1) { // Do not bother with lazy instantiation in case of a singleton return List.of(codec.createBindingProxy(entries.iterator().next())); @@ -82,11 +82,11 @@ final class LazyBindingList extends AbstractList implem } private static @NonNull List eagerList(final ListNodeCodecContext codec, - final int size, final Collection> entries) { + final int size, final Collection entries) { @SuppressWarnings("unchecked") final E[] objs = (E[]) new DataObject[size]; int offset = 0; - for (DistinctNodeContainer node : entries) { + for (var node : entries) { objs[offset++] = codec.createBindingProxy(node); } verify(offset == objs.length); @@ -107,10 +107,10 @@ final class LazyBindingList extends AbstractList implem // // We could do a Class.isInstance() check here, but since the implementation is not marked as final (yet) we // would be at the mercy of CHA being able to prove this invariant. - return obj.getClass() == codec.generatedClass() ? (E) obj : load(index, (DistinctNodeContainer) obj); + return obj.getClass() == codec.generatedClass() ? (E) obj : load(index, (DataContainerNode) obj); } - private @NonNull E load(final int index, final DistinctNodeContainer node) { + private @NonNull E load(final int index, final DataContainerNode node) { final E ret = codec.createBindingProxy(node); final Object witness; return (witness = OBJ_AA.compareAndExchangeRelease(objects, index, node, ret)) == node ? ret : (E) witness; 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 64615d607f..b8cd98075d 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 @@ -40,7 +40,7 @@ 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.data.api.schema.ContainerNode; -import org.opendaylight.yangtools.yang.data.api.schema.DistinctNodeContainer; +import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; final class NotificationCodecContext @@ -57,11 +57,11 @@ final class NotificationCodecContext } private static final Generic BB_DOCC = TypeDefinition.Sort.describe(DataObjectCodecContext.class); - private static final Generic BB_DNC = TypeDefinition.Sort.describe(DistinctNodeContainer.class); + private static final Generic BB_DCN = TypeDefinition.Sort.describe(DataContainerNode.class); private static final Generic BB_I = TypeDefinition.Sort.describe(Instant.class); private static final MethodType CONSTRUCTOR_TYPE = MethodType.methodType(void.class, DataObjectCodecContext.class, - DistinctNodeContainer.class, Instant.class); + DataContainerNode.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"; @@ -83,7 +83,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_DNC, BB_I) + .withParameters(BB_DOCC, BB_DCN, BB_I) .intercept(ConstructorImplementation.INSTANCE) .defineMethod(EVENT_INSTANT_NAME, EVENT_INSTANT_RETTYPE, Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC) .intercept(EventInstantImplementation.INSTANCE) @@ -131,7 +131,7 @@ final class NotificationCodecContext try { LOAD_CTOR_ARGS = MethodVariableAccess.allArgumentsOf(new MethodDescription.ForLoadedConstructor( AugmentableCodecDataObject.class.getDeclaredConstructor(AbstractDataObjectCodecContext.class, - DistinctNodeContainer.class))); + DataContainerNode.class))); } catch (NoSuchMethodException e) { throw new ExceptionInInitializerError(e); } -- 2.36.6