From 4a41a9ca248f86dd3bfc39656495b7cbd609ef4b Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Mon, 21 Mar 2022 18:52:03 +0100 Subject: [PATCH] Clean up DataSchemaContainerTree Clean up the class hierarchy and mark things for future improvement, deprecating unintentionally-public methods and providing guidance. Change-Id: I9d4a2005714c964880198b9e0bde5e1401c4cb41 Signed-off-by: Robert Varga --- .../util/AbstractInteriorContextNode.java | 9 +- .../data/util/AbstractMixinContextNode.java | 7 +- .../data/util/AbstractOpaqueContextNode.java | 2 +- .../data/util/AugmentationContextNode.java | 6 +- .../yang/data/util/ChoiceNodeContextNode.java | 7 +- .../data/util/DataContainerContextNode.java | 30 ++--- .../yang/data/util/DataSchemaContextNode.java | 125 ++++++++++++------ .../yang/data/util/DataSchemaContextTree.java | 20 +-- .../yang/data/util/LeafContextNode.java | 4 +- .../data/util/LeafListEntryContextNode.java | 5 +- .../yang/data/util/ListItemContextNode.java | 7 +- .../data/util/UnkeyedListItemContextNode.java | 4 +- .../util/UnkeyedListMixinContextNode.java | 22 +-- .../UnorderedLeafListMixinContextNode.java | 25 ++-- .../util/UnorderedMapMixinContextNode.java | 24 ++-- 15 files changed, 166 insertions(+), 131 deletions(-) diff --git a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AbstractInteriorContextNode.java b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AbstractInteriorContextNode.java index 0ec3baf3f5..ff09288007 100644 --- a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AbstractInteriorContextNode.java +++ b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AbstractInteriorContextNode.java @@ -10,16 +10,13 @@ package org.opendaylight.yangtools.yang.data.util; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -abstract class AbstractInteriorContextNode extends - DataSchemaContextNode { - - protected AbstractInteriorContextNode(final T identifier, final DataSchemaNode schema) { +abstract class AbstractInteriorContextNode extends DataSchemaContextNode { + AbstractInteriorContextNode(final T identifier, final DataSchemaNode schema) { super(identifier, schema); } @Override - public boolean isLeaf() { + public final boolean isLeaf() { return false; } - } \ No newline at end of file diff --git a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AbstractMixinContextNode.java b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AbstractMixinContextNode.java index 3806612fd9..23d28deab1 100644 --- a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AbstractMixinContextNode.java +++ b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AbstractMixinContextNode.java @@ -10,10 +10,8 @@ package org.opendaylight.yangtools.yang.data.util; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -abstract class AbstractMixinContextNode extends - AbstractInteriorContextNode { - - protected AbstractMixinContextNode(final T identifier, final DataSchemaNode schema) { +abstract class AbstractMixinContextNode extends AbstractInteriorContextNode { + AbstractMixinContextNode(final T identifier, final DataSchemaNode schema) { super(identifier, schema); } @@ -21,5 +19,4 @@ abstract class AbstractMixinContextNode extends public final boolean isMixin() { return true; } - } \ No newline at end of file diff --git a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AbstractOpaqueContextNode.java b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AbstractOpaqueContextNode.java index 857486be0d..12dcf7f653 100644 --- a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AbstractOpaqueContextNode.java +++ b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AbstractOpaqueContextNode.java @@ -11,7 +11,7 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; abstract class AbstractOpaqueContextNode extends AbstractLeafContextNode { - AbstractOpaqueContextNode(S schema) { + AbstractOpaqueContextNode(final S schema) { super(NodeIdentifier.create(schema.getQName()), schema); } diff --git a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AugmentationContextNode.java b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AugmentationContextNode.java index e4c81ece17..bf3e3a8bad 100644 --- a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AugmentationContextNode.java +++ b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/AugmentationContextNode.java @@ -17,8 +17,8 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.util.EffectiveAugmentationSchema; final class AugmentationContextNode extends DataContainerContextNode { - AugmentationContextNode(final AugmentationSchemaNode augmentation, final DataNodeContainer schema) { - super(augmentationIdentifierFrom(augmentation), new EffectiveAugmentationSchema(augmentation, schema), null); + AugmentationContextNode(final AugmentationSchemaNode augmentation, final DataNodeContainer target) { + super(augmentationIdentifierFrom(augmentation), new EffectiveAugmentationSchema(augmentation, target), null); } @Override @@ -33,7 +33,7 @@ final class AugmentationContextNode extends DataContainerContextNode { - +final class ChoiceNodeContextNode extends AbstractMixinContextNode { private final ImmutableMap> byQName; private final ImmutableMap> byArg; - protected ChoiceNodeContextNode(final ChoiceSchemaNode schema) { + ChoiceNodeContextNode(final ChoiceSchemaNode schema) { super(NodeIdentifier.create(schema.getQName()), schema); ImmutableMap.Builder> byQNameBuilder = ImmutableMap.builder(); ImmutableMap.Builder> byArgBuilder = ImmutableMap.builder(); for (CaseSchemaNode caze : schema.getCases()) { for (DataSchemaNode cazeChild : caze.getChildNodes()) { - DataSchemaContextNode childOp = fromDataSchemaNode(cazeChild); + DataSchemaContextNode childOp = DataSchemaContextNode.of(cazeChild); byArgBuilder.put(childOp.getIdentifier(), childOp); for (QName qname : childOp.getQNameIdentifiers()) { byQNameBuilder.put(qname, childOp); diff --git a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/DataContainerContextNode.java b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/DataContainerContextNode.java index 51aa4e284d..96869c1b8d 100644 --- a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/DataContainerContextNode.java +++ b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/DataContainerContextNode.java @@ -7,27 +7,24 @@ */ package org.opendaylight.yangtools.yang.data.util; -import java.util.Map; +import static java.util.Objects.requireNonNull; + import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -class DataContainerContextNode extends - AbstractInteriorContextNode { - - private final DataNodeContainer schema; - private final Map> byQName; - private final Map> byArg; +abstract class DataContainerContextNode extends AbstractInteriorContextNode { + private final ConcurrentMap> byArg = new ConcurrentHashMap<>(); + private final ConcurrentMap> byQName = new ConcurrentHashMap<>(); + private final DataNodeContainer container; - protected DataContainerContextNode(final T identifier, final DataNodeContainer schema, - final DataSchemaNode node) { - super(identifier, node); - this.schema = schema; - this.byArg = new ConcurrentHashMap<>(); - this.byQName = new ConcurrentHashMap<>(); + DataContainerContextNode(final T identifier, final DataNodeContainer container, final DataSchemaNode schema) { + super(identifier, schema); + this.container = requireNonNull(container); } @Override @@ -46,16 +43,16 @@ class DataContainerContextNode extends if (potential != null) { return potential; } - potential = fromLocalSchemaAndQName(schema, child); + potential = fromLocalSchemaAndQName(container, child); return register(potential); } private DataSchemaContextNode fromLocalSchema(final PathArgument child) { if (child instanceof AugmentationIdentifier) { - return fromSchemaAndQNameChecked(schema, ((AugmentationIdentifier) child).getPossibleChildNames() + return fromSchemaAndQNameChecked(container, ((AugmentationIdentifier) child).getPossibleChildNames() .iterator().next()); } - return fromSchemaAndQNameChecked(schema, child.getNodeType()); + return fromSchemaAndQNameChecked(container, child.getNodeType()); } protected DataSchemaContextNode fromLocalSchemaAndQName(final DataNodeContainer schema2, final QName child) { @@ -64,6 +61,7 @@ class DataContainerContextNode extends private DataSchemaContextNode register(final DataSchemaContextNode potential) { if (potential != null) { + // FIXME: use putIfAbsent() to make sure we do not perform accidental overrwrites byArg.put(potential.getIdentifier(), potential); for (QName qname : potential.getQNameIdentifiers()) { byQName.put(qname, potential); diff --git a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/DataSchemaContextNode.java b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/DataSchemaContextNode.java index ec92da849e..ac6e43e808 100644 --- a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/DataSchemaContextNode.java +++ b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/DataSchemaContextNode.java @@ -9,7 +9,6 @@ package org.opendaylight.yangtools.yang.data.util; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; -import java.util.List; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -43,25 +42,33 @@ import org.opendaylight.yangtools.yang.model.api.SchemaNode; * @param Path Argument type */ public abstract class DataSchemaContextNode extends AbstractSimpleIdentifiable { + // FIXME: this can be null only for AugmentationContextNode and in that case the interior part is handled by a + // separate field in DataContainerContextNode. We need to re-examine our base interface class hierarchy + // so that the underlying (effective in augment's case) SchemaNode is always available. private final DataSchemaNode dataSchemaNode; - protected DataSchemaContextNode(final T identifier, final SchemaNode schema) { + DataSchemaContextNode(final T identifier, final DataSchemaNode schema) { super(identifier); - if (schema instanceof DataSchemaNode) { - this.dataSchemaNode = (DataSchemaNode) schema; - } else { - this.dataSchemaNode = null; - } + this.dataSchemaNode = schema; } + @Deprecated(forRemoval = true, since = "8.0.2") + protected DataSchemaContextNode(final T identifier, final SchemaNode schema) { + this(identifier, schema instanceof DataSchemaNode ? (DataSchemaNode) schema : null); + } + + // FIXME: document this method public boolean isMixin() { return false; } + // FIXME: document this method public boolean isKeyedEntry() { return false; } + // FIXME: this is counter-intuitive: anydata/anyxml are considered non-leaf. This method needs a better name and + // a proper description. public abstract boolean isLeaf(); protected Set getQNameIdentifiers() { @@ -74,10 +81,13 @@ public abstract class DataSchemaContextNode extends Abst * @param child Child path argument * @return A child node, or null if not found */ + // FIXME: document PathArgument type mismatch public abstract @Nullable DataSchemaContextNode getChild(PathArgument child); + // FIXME: document child == null public abstract @Nullable DataSchemaContextNode getChild(QName child); + // FIXME: final public @Nullable DataSchemaNode getDataSchemaNode() { return dataSchemaNode; } @@ -113,7 +123,7 @@ public abstract class DataSchemaContextNode extends Abst if (result != null && schema instanceof DataSchemaNode && result.isAugmenting()) { return fromAugmentation(schema, (AugmentationTarget) schema, result); } - return fromDataSchemaNode(result); + return lenientOf(result); } // FIXME: this looks like it should be a Predicate on a stream with findFirst() @@ -141,14 +151,53 @@ public abstract class DataSchemaContextNode extends Abst .collect(Collectors.toSet())); } + static @NonNull DataSchemaContextNode of(final @NonNull DataSchemaNode schema) { + if (schema instanceof ContainerLike) { + return new ContainerContextNode((ContainerLike) schema); + } else if (schema instanceof ListSchemaNode) { + return fromListSchemaNode((ListSchemaNode) schema); + } else if (schema instanceof LeafSchemaNode) { + return new LeafContextNode((LeafSchemaNode) schema); + } else if (schema instanceof ChoiceSchemaNode) { + return new ChoiceNodeContextNode((ChoiceSchemaNode) schema); + } else if (schema instanceof LeafListSchemaNode) { + return fromLeafListSchemaNode((LeafListSchemaNode) schema); + } else if (schema instanceof AnydataSchemaNode) { + return new AnydataContextNode((AnydataSchemaNode) schema); + } else if (schema instanceof AnyxmlSchemaNode) { + return new AnyXmlContextNode((AnyxmlSchemaNode) schema); + } else { + throw new IllegalStateException("Unhandled schema " + schema); + } + } + + // FIXME: do we tolerate null argument? do we tolerate unknown subclasses? + static @Nullable DataSchemaContextNode lenientOf(final @Nullable DataSchemaNode schema) { + if (schema instanceof ContainerLike) { + return new ContainerContextNode((ContainerLike) schema); + } else if (schema instanceof ListSchemaNode) { + return fromListSchemaNode((ListSchemaNode) schema); + } else if (schema instanceof LeafSchemaNode) { + return new LeafContextNode((LeafSchemaNode) schema); + } else if (schema instanceof ChoiceSchemaNode) { + return new ChoiceNodeContextNode((ChoiceSchemaNode) schema); + } else if (schema instanceof LeafListSchemaNode) { + return fromLeafListSchemaNode((LeafListSchemaNode) schema); + } else if (schema instanceof AnydataSchemaNode) { + return new AnydataContextNode((AnydataSchemaNode) schema); + } else if (schema instanceof AnyxmlSchemaNode) { + return new AnyXmlContextNode((AnyxmlSchemaNode) schema); + } else { + return null; + } + } + /** * Returns a DataContextNodeOperation for provided child node * *

- * If supplied child is added by Augmentation this operation returns a - * DataContextNodeOperation for augmentation, otherwise returns a - * DataContextNodeOperation for child as call for - * {@link #fromDataSchemaNode(DataSchemaNode)}. + * If supplied child is added by Augmentation this operation returns a DataSchemaContextNode for augmentation, + * otherwise returns a DataSchemaContextNode for child as call for {@link #lenientOf(DataSchemaNode)}. */ static @Nullable DataSchemaContextNode fromAugmentation(final DataNodeContainer parent, final AugmentationTarget parentAug, final DataSchemaNode child) { @@ -157,47 +206,49 @@ public abstract class DataSchemaContextNode extends Abst return new AugmentationContextNode(aug, parent); } } - return fromDataSchemaNode(child); + return lenientOf(child); } + /** + * Get a {@link DataSchemaContextNode} for a particular {@link DataSchemaNode}. + * + * @param potential Backing DataSchemaNode + * @return A {@link DataSchemaContextNode}, or null if the input is {@code null} or of unhandled type + */ + @Deprecated(forRemoval = true, since = "8.0.2") public static @Nullable DataSchemaContextNode fromDataSchemaNode(final DataSchemaNode potential) { - if (potential instanceof ContainerLike) { - return new ContainerContextNode((ContainerLike) potential); - } else if (potential instanceof ListSchemaNode) { - return fromListSchemaNode((ListSchemaNode) potential); - } else if (potential instanceof LeafSchemaNode) { - return new LeafContextNode((LeafSchemaNode) potential); - } else if (potential instanceof ChoiceSchemaNode) { - return new ChoiceNodeContextNode((ChoiceSchemaNode) potential); - } else if (potential instanceof LeafListSchemaNode) { - return fromLeafListSchemaNode((LeafListSchemaNode) potential); - } else if (potential instanceof AnydataSchemaNode) { - return new AnydataContextNode((AnydataSchemaNode) potential); - } else if (potential instanceof AnyxmlSchemaNode) { - return new AnyXmlContextNode((AnyxmlSchemaNode) potential); - } - return null; + return lenientOf(potential); } - private static DataSchemaContextNode fromListSchemaNode(final ListSchemaNode potential) { - List keyDefinition = potential.getKeyDefinition(); - if (keyDefinition == null || keyDefinition.isEmpty()) { + private static @NonNull DataSchemaContextNode fromListSchemaNode(final ListSchemaNode potential) { + var keyDefinition = potential.getKeyDefinition(); + if (keyDefinition.isEmpty()) { return new UnkeyedListMixinContextNode(potential); - } - if (potential.isUserOrdered()) { + } else if (potential.isUserOrdered()) { return new OrderedMapMixinContextNode(potential); + } else { + return new UnorderedMapMixinContextNode(potential); } - return new UnorderedMapMixinContextNode(potential); } - private static DataSchemaContextNode fromLeafListSchemaNode(final LeafListSchemaNode potential) { + private static @NonNull DataSchemaContextNode fromLeafListSchemaNode(final LeafListSchemaNode potential) { if (potential.isUserOrdered()) { return new OrderedLeafListMixinContextNode(potential); } return new UnorderedLeafListMixinContextNode(potential); } - public static DataSchemaContextNode from(final EffectiveModelContext ctx) { + /** + * Return a DataSchemaContextNode corresponding to specified {@link EffectiveModelContext}. + * + * @param ctx EffectiveModelContext + * @return A DataSchemaContextNode + * @throws NullPointerException if {@code ctx} is null + * @deprecated Use {@link DataSchemaContextTree#from(EffectiveModelContext)} and + * {@link DataSchemaContextTree#getRoot()} instead. + */ + @Deprecated(forRemoval = true, since = "8.0.2") + public static @NonNull DataSchemaContextNode from(final EffectiveModelContext ctx) { return new ContainerContextNode(ctx); } } diff --git a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/DataSchemaContextTree.java b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/DataSchemaContextTree.java index df3e019b61..1a66488615 100644 --- a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/DataSchemaContextTree.java +++ b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/DataSchemaContextTree.java @@ -24,19 +24,19 @@ import org.opendaylight.yangtools.yang.model.spi.AbstractEffectiveModelContextPr * @author Robert Varga */ public final class DataSchemaContextTree extends AbstractEffectiveModelContextProvider { - private static final LoadingCache TREES = CacheBuilder.newBuilder() - .weakKeys().weakValues().build(new CacheLoader() { - @Override - public DataSchemaContextTree load(final EffectiveModelContext key) { - return new DataSchemaContextTree(key); - } - }); + private static final LoadingCache TREES = + CacheBuilder.newBuilder().weakKeys().weakValues().build(new CacheLoader<>() { + @Override + public DataSchemaContextTree load(final EffectiveModelContext key) { + return new DataSchemaContextTree(key); + } + }); - private final DataSchemaContextNode root; + private final @NonNull ContainerContextNode root; private DataSchemaContextTree(final EffectiveModelContext ctx) { super(ctx); - root = DataSchemaContextNode.from(ctx); + root = new ContainerContextNode(ctx); } public static @NonNull DataSchemaContextTree from(final @NonNull EffectiveModelContext ctx) { @@ -51,7 +51,7 @@ public final class DataSchemaContextTree extends AbstractEffectiveModelContextPr * @throws NullPointerException if {@code path} is null */ public @NonNull Optional<@NonNull DataSchemaContextNode> findChild(final @NonNull YangInstanceIdentifier path) { - return getRoot().findChild(path); + return root.findChild(path); } public @NonNull DataSchemaContextNode getRoot() { diff --git a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/LeafContextNode.java b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/LeafContextNode.java index 67cf08af60..f86f68ee53 100644 --- a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/LeafContextNode.java +++ b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/LeafContextNode.java @@ -11,7 +11,7 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; final class LeafContextNode extends AbstractLeafNodeContext { - LeafContextNode(final LeafSchemaNode potential) { - super(NodeIdentifier.create(potential.getQName()), potential); + LeafContextNode(final LeafSchemaNode schema) { + super(NodeIdentifier.create(schema.getQName()), schema); } } diff --git a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/LeafListEntryContextNode.java b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/LeafListEntryContextNode.java index dc313f4dd5..e86e4741df 100644 --- a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/LeafListEntryContextNode.java +++ b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/LeafListEntryContextNode.java @@ -12,8 +12,9 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithV import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; final class LeafListEntryContextNode extends AbstractLeafNodeContext, LeafListSchemaNode> { - LeafListEntryContextNode(final LeafListSchemaNode potential) { - super(new NodeWithValue<>(potential.getQName(), Empty.value()), potential); + LeafListEntryContextNode(final LeafListSchemaNode schema) { + // FIXME: Empty() here is NOT NICE -- it assumes the list is of such entries... + super(new NodeWithValue<>(schema.getQName(), Empty.value()), schema); } @Override diff --git a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ListItemContextNode.java b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ListItemContextNode.java index 3465f5638b..18cfd0aac1 100644 --- a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ListItemContextNode.java +++ b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/ListItemContextNode.java @@ -10,11 +10,8 @@ package org.opendaylight.yangtools.yang.data.util; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; -final class ListItemContextNode extends - DataContainerContextNode { - - - protected ListItemContextNode(final NodeIdentifierWithPredicates identifier, final ListSchemaNode schema) { +final class ListItemContextNode extends DataContainerContextNode { + ListItemContextNode(final NodeIdentifierWithPredicates identifier, final ListSchemaNode schema) { super(identifier, schema, schema); } diff --git a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/UnkeyedListItemContextNode.java b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/UnkeyedListItemContextNode.java index 0817d5bba2..a4ffbc1fe9 100644 --- a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/UnkeyedListItemContextNode.java +++ b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/UnkeyedListItemContextNode.java @@ -11,9 +11,7 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; final class UnkeyedListItemContextNode extends DataContainerContextNode { - - protected UnkeyedListItemContextNode(final ListSchemaNode schema) { + UnkeyedListItemContextNode(final ListSchemaNode schema) { super(NodeIdentifier.create(schema.getQName()), schema, schema); } - } diff --git a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/UnkeyedListMixinContextNode.java b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/UnkeyedListMixinContextNode.java index 507d611bd0..00ba8b4810 100644 --- a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/UnkeyedListMixinContextNode.java +++ b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/UnkeyedListMixinContextNode.java @@ -7,34 +7,34 @@ */ package org.opendaylight.yangtools.yang.data.util; +import org.eclipse.jdt.annotation.Nullable; 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.model.api.ListSchemaNode; -class UnkeyedListMixinContextNode extends AbstractMixinContextNode { - +final class UnkeyedListMixinContextNode extends AbstractMixinContextNode { private final UnkeyedListItemContextNode innerNode; UnkeyedListMixinContextNode(final ListSchemaNode list) { super(NodeIdentifier.create(list.getQName()), list); - this.innerNode = new UnkeyedListItemContextNode(list); + innerNode = new UnkeyedListItemContextNode(list); } @Override public DataSchemaContextNode getChild(final PathArgument child) { - if (child.getNodeType().equals(getIdentifier().getNodeType())) { - return innerNode; - } - return null; + // FIXME: 10.0.0: checkArgument() on PathArgument + return innerNodeIfMatch(child.getNodeType()); } @Override public DataSchemaContextNode getChild(final QName child) { - if (getIdentifier().getNodeType().equals(child)) { - return innerNode; - } - return null; + return innerNodeIfMatch(child); } + // FIXME: dead ringers in other AbstractMixinContextNode subclasses + private @Nullable DataSchemaContextNode innerNodeIfMatch(final QName qname) { + // FIXME: 10.0.0: requireNonNull(qname) + return getIdentifier().getNodeType().equals(qname) ? innerNode : null; + } } diff --git a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/UnorderedLeafListMixinContextNode.java b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/UnorderedLeafListMixinContextNode.java index c6907f31c1..9d6618c2fa 100644 --- a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/UnorderedLeafListMixinContextNode.java +++ b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/UnorderedLeafListMixinContextNode.java @@ -14,27 +14,22 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgum import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; class UnorderedLeafListMixinContextNode extends AbstractMixinContextNode { + private final LeafListEntryContextNode innerOp; - private final DataSchemaContextNode innerOp; - - UnorderedLeafListMixinContextNode(final LeafListSchemaNode potential) { - super(NodeIdentifier.create(potential.getQName()), potential); - innerOp = new LeafListEntryContextNode(potential); + UnorderedLeafListMixinContextNode(final LeafListSchemaNode schema) { + super(NodeIdentifier.create(schema.getQName()), schema); + innerOp = new LeafListEntryContextNode(schema); } @Override - public DataSchemaContextNode getChild(final PathArgument child) { - if (child instanceof NodeWithValue) { - return innerOp; - } - return null; + public final DataSchemaContextNode getChild(final PathArgument child) { + // FIXME: 10.0.0: reject null and invalid + return child instanceof NodeWithValue ? innerOp : null; } @Override - public DataSchemaContextNode getChild(final QName child) { - if (getIdentifier().getNodeType().equals(child)) { - return innerOp; - } - return null; + public final DataSchemaContextNode getChild(final QName child) { + // FIXME: requireNonNull, common code with UnkeyedListMixinNode + return getIdentifier().getNodeType().equals(child) ? innerOp : null; } } diff --git a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/UnorderedMapMixinContextNode.java b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/UnorderedMapMixinContextNode.java index 5e36250e16..4b76598303 100644 --- a/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/UnorderedMapMixinContextNode.java +++ b/data/yang-data-util/src/main/java/org/opendaylight/yangtools/yang/data/util/UnorderedMapMixinContextNode.java @@ -7,6 +7,7 @@ */ package org.opendaylight.yangtools.yang.data.util; +import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; @@ -18,22 +19,23 @@ class UnorderedMapMixinContextNode extends AbstractMixinContextNode getChild(final PathArgument child) { - if (child.getNodeType().equals(getIdentifier().getNodeType())) { - return innerNode; - } - return null; + public final DataSchemaContextNode getChild(final PathArgument child) { + // FIXME: validate PathArgument type + return innerNodeIfMatch(child.getNodeType()); } @Override - public DataSchemaContextNode getChild(final QName child) { - if (getIdentifier().getNodeType().equals(child)) { - return innerNode; - } - return null; + public final DataSchemaContextNode getChild(final QName child) { + return innerNodeIfMatch(child); + } + + // FIXME: dead ringers in other AbstractMixinContextNode subclasses + private @Nullable DataSchemaContextNode innerNodeIfMatch(final QName qname) { + // FIXME: 10.0.0: requireNonNull(qname) + return getIdentifier().getNodeType().equals(qname) ? innerNode : null; } } -- 2.36.6