Seal NodeCodecContext hierarchy 64/106464/1
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 13 Jun 2023 11:53:05 +0000 (13:53 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 13 Jun 2023 11:54:45 +0000 (13:54 +0200)
We are about split out some of the contexts to public places. Before we
do that, though, make sure the hierarchy is sealed, so we do not get
accidental subclasses.

JIRA: MDSAL-828
Change-Id: Iaa1f0954eb1e571b08dbe8760157a996c1905143
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/AbstractDataObjectCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ContainerNodeCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataContainerCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/DataObjectCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/KeyedListNodeCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/LeafNodeCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ListNodeCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/NodeCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/OpaqueNodeCodecContext.java
binding/mdsal-binding-dom-codec/src/main/java/org/opendaylight/mdsal/binding/dom/codec/impl/ValueNodeCodecContext.java

index 8849c2ef177c88f3a5279376ea2f1fc25a60a6ac..98707aeb4d5b6ac02211029a61f91377015ae4f3 100644 (file)
@@ -44,8 +44,9 @@ import org.opendaylight.yangtools.yang.model.api.DocumentedNode.WithStatus;
  * While this class is public, it not part of API surface and is an implementation detail. The only reason for it being
  * public is that it needs to be accessible by code generated at runtime.
  */
-public abstract class AbstractDataObjectCodecContext<D extends DataObject, T extends CompositeRuntimeType>
-        extends DataContainerCodecContext<D, T> {
+public abstract sealed class AbstractDataObjectCodecContext<D extends DataObject, T extends CompositeRuntimeType>
+        extends DataContainerCodecContext<D, T>
+        permits AugmentationNodeContext, DataObjectCodecContext {
     private final ImmutableMap<Class<?>, DataContainerCodecPrototype<?>> byBindingArgClass;
     private final ImmutableMap<Class<?>, DataContainerCodecPrototype<?>> byStreamClass;
     private final ImmutableMap<NodeIdentifier, NodeContextSupplier> byYang;
index f5478d3f5824ea097101c718b8469902fb79ac42..42806b014a0b56d4340958b45705ca2c766214d2 100644 (file)
@@ -12,8 +12,9 @@ import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 
-class ContainerNodeCodecContext<D extends DataObject> extends DataObjectCodecContext<D, ContainerLikeRuntimeType<?, ?>>
-        implements RpcInputCodec<D> {
+sealed class ContainerNodeCodecContext<D extends DataObject>
+        extends DataObjectCodecContext<D, ContainerLikeRuntimeType<?, ?>> implements RpcInputCodec<D>
+        permits NonPresenceContainerNodeCodecContext {
     ContainerNodeCodecContext(final DataContainerCodecPrototype<ContainerLikeRuntimeType<?, ?>> prototype) {
         super(prototype);
     }
index bab78a43b8202114a16a3d76e85eec4b5c60b9c1..c7aeffeb7e34cc62eb293af31dc8f472dddcf61f 100644 (file)
@@ -55,8 +55,9 @@ import org.opendaylight.yangtools.yang.data.impl.schema.NormalizationResultHolde
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-abstract class DataContainerCodecContext<D extends DataObject, T extends RuntimeTypeContainer> extends NodeCodecContext
-        implements CommonDataObjectCodecTreeNode<D> {
+abstract sealed class DataContainerCodecContext<D extends DataObject, T extends RuntimeTypeContainer>
+        extends NodeCodecContext implements CommonDataObjectCodecTreeNode<D>
+        permits AbstractDataObjectCodecContext, ChoiceNodeCodecContext, SchemaRootCodecContext {
     private static final Logger LOG = LoggerFactory.getLogger(DataContainerCodecContext.class);
     private static final VarHandle EVENT_STREAM_SERIALIZER;
 
index cbc3c15eb9b2bd759b42473798bd992ac596992b..ac21c3bb045a59043bcb75898f5d70ab12356208 100644 (file)
@@ -47,8 +47,9 @@ import org.slf4j.LoggerFactory;
  * This class is an implementation detail. It is public only due to technical reasons and may change at any time.
  */
 @Beta
-public abstract class DataObjectCodecContext<D extends DataObject, T extends CompositeRuntimeType>
-        extends AbstractDataObjectCodecContext<D, T> implements BindingDataObjectCodecTreeNode<D> {
+public abstract sealed class DataObjectCodecContext<D extends DataObject, T extends CompositeRuntimeType>
+        extends AbstractDataObjectCodecContext<D, T> implements BindingDataObjectCodecTreeNode<D>
+        permits CaseNodeCodecContext, ContainerNodeCodecContext, ListNodeCodecContext, NotificationCodecContext {
     private static final Logger LOG = LoggerFactory.getLogger(DataObjectCodecContext.class);
 
     private static final VarHandle MISMATCHED_AUGMENTED;
index a63e824aff9127388c05b3978059e2a2ce9ce05e..2a59ae1548a69f212259f25f6a00388983bc648c 100644 (file)
@@ -25,7 +25,7 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
 
-abstract class KeyedListNodeCodecContext<I extends Identifier<D>, D extends DataObject & Identifiable<I>>
+abstract sealed class KeyedListNodeCodecContext<I extends Identifier<D>, D extends DataObject & Identifiable<I>>
         extends ListNodeCodecContext<D> {
     private static final class Ordered<I extends Identifier<D>, D extends DataObject & Identifiable<I>>
             extends KeyedListNodeCodecContext<I, D> {
index d27c222002cdc5e6a5a522ce9d5f59064e1762f5..bb3250c87e31755f475521d9356a0d13c3ff861e 100644 (file)
@@ -24,7 +24,7 @@ import org.opendaylight.yangtools.yang.model.api.ModuleImport;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
 
-class LeafNodeCodecContext extends ValueNodeCodecContext.WithCodec {
+sealed class LeafNodeCodecContext extends ValueNodeCodecContext.WithCodec {
     static final class OfTypeObject<T extends TypeObject> extends LeafNodeCodecContext
             implements BindingTypeObjectCodecTreeNode<T> {
         private final @NonNull Class<T> bindingClass;
index 33530b18156e276fc78f3162847945749203b962..58c5d7178d1f7b65b6ba11b7a726a49834f54c52 100644 (file)
@@ -20,7 +20,8 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
 import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode;
 
-class ListNodeCodecContext<D extends DataObject> extends DataObjectCodecContext<D, ListRuntimeType> {
+sealed class ListNodeCodecContext<D extends DataObject> extends DataObjectCodecContext<D, ListRuntimeType>
+        permits KeyedListNodeCodecContext {
     ListNodeCodecContext(final DataContainerCodecPrototype<ListRuntimeType> prototype) {
         super(prototype);
     }
index 8241120205a759cc120d127c4afb7e56087f608a..72c4f1f4e9af4895b6e8a513e67b40e1b670fd00 100644 (file)
@@ -19,13 +19,13 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
  * <p>
  * Two core subtypes of codec context are available:
  * <ul>
- * <li>{@link ValueNodeCodecContext} - Context for nodes, which does not contain any nested YANG modeled substructures.
- * </li>
- * <li>{@link DataObjectCodecContext} - Context for nodes, which does contain nested YANG modeled substructures. This
- * context nodes contains context for children nodes.</li>
+ *   <li>{@link ValueNodeCodecContext} for nodes, which do not contain any nested YANG modeled substructures</li>
+ *   <li>{@link DataContainerCodecContext} for nodes, which contain nested YANG modeled substructures. These context
+ *       nodes contain contexts for their individual children nodes</li>
  * </ul>
  */
-abstract class NodeCodecContext implements BindingCodecTreeNode {
+abstract sealed class NodeCodecContext implements BindingCodecTreeNode
+        permits DataContainerCodecContext, ValueNodeCodecContext {
     /**
      * Returns {@link NodeIdentifier} of current node, if applicable.
      *
index fe850b87c1f79360822fc63ad01ea034fdb1cc59..f9646c0102e698f6c4447c65df208cdcbd1129f4 100644 (file)
@@ -34,7 +34,7 @@ import org.opendaylight.yangtools.yang.model.api.AnydataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.AnyxmlSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 
-abstract class OpaqueNodeCodecContext<T extends OpaqueObject<T>> extends ValueNodeCodecContext
+abstract sealed class OpaqueNodeCodecContext<T extends OpaqueObject<T>> extends ValueNodeCodecContext
         implements BindingOpaqueObjectCodecTreeNode<T> {
     static final class Anyxml<T extends OpaqueObject<T>> extends OpaqueNodeCodecContext<T> {
         Anyxml(final AnyxmlSchemaNode schema, final String getterName, final Class<T> bindingClass,
index 13b4406f1cb2df0efc30a4878d7404ca4b549554..a5f3dae37a9117b5eb750a1e6fc85eabf95990fa 100644 (file)
@@ -17,8 +17,10 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
  * Abstract base class for atomic nodes. These are nodes which are not decomposed in the Binding Specification, such
  * as LeafNodes and LeafSetNodes.
  */
-abstract class ValueNodeCodecContext extends NodeCodecContext implements NodeContextSupplier {
-    abstract static class WithCodec extends ValueNodeCodecContext {
+abstract sealed class ValueNodeCodecContext extends NodeCodecContext implements NodeContextSupplier
+        permits OpaqueNodeCodecContext, ValueNodeCodecContext.WithCodec {
+    abstract static sealed class WithCodec extends ValueNodeCodecContext
+            permits LeafNodeCodecContext, LeafSetNodeCodecContext {
         private final @NonNull ValueCodec<Object, Object> valueCodec;
 
         WithCodec(final DataSchemaNode schema, final ValueCodec<Object, Object> codec, final String getterName,