From 05fab901cd69c0e7bc78aa39651bd8c758c4bac8 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 18 May 2023 21:49:03 +0200 Subject: [PATCH] Improve type safety of AbstractImmutableDataContainerNode Now that DataContainerNode's children are only keyed by NodeIdentifier, we can improve type safety of our maps -- removing the need for a verify. JIRA: YANGTOOLS-1511 Change-Id: I9ea336c52f78c1ac8d73f9bee104bffc13d7d317 Signed-off-by: Robert Varga --- ...ractImmutableDataContainerNodeBuilder.java | 13 ++++++----- .../impl/ImmutableChoiceNodeBuilder.java | 3 +-- .../impl/ImmutableContainerNodeBuilder.java | 3 +-- .../impl/ImmutableMapEntryNodeBuilder.java | 23 ++++++++----------- .../ImmutableUnkeyedListEntryNodeBuilder.java | 3 +-- .../AbstractImmutableDataContainerNode.java | 6 ++--- .../impl/schema/nodes/LazyLeafOperations.java | 15 ++++++------ .../data/impl/schema/nodes/LazyValues.java | 10 ++++---- 8 files changed, 35 insertions(+), 41 deletions(-) diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/AbstractImmutableDataContainerNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/AbstractImmutableDataContainerNodeBuilder.java index efc559ff64..057dcea5bf 100644 --- a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/AbstractImmutableDataContainerNodeBuilder.java +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/AbstractImmutableDataContainerNodeBuilder.java @@ -15,6 +15,7 @@ import java.util.Map; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.util.ModifiableMapPhase; import org.opendaylight.yangtools.util.UnmodifiableMapPhase; +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.DataContainerChild; import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode; @@ -43,7 +44,7 @@ abstract class AbstractImmutableDataContainerNodeBuilder value; + private Map value; private I nodeIdentifier; /* @@ -86,13 +87,13 @@ abstract class AbstractImmutableDataContainerNodeBuilder buildValue() { + protected final Map buildValue() { if (value instanceof ModifiableMapPhase) { - return ((ModifiableMapPhase)value).toUnmodifiableMap(); + return ((ModifiableMapPhase)value).toUnmodifiableMap(); } dirty = true; @@ -102,9 +103,9 @@ abstract class AbstractImmutableDataContainerNodeBuilder) value).toModifiableMap(); + value = ((UnmodifiableMapPhase) value).toModifiableMap(); } else if (value instanceof CloneableMap) { - value = ((CloneableMap) value).createMutableClone(); + value = ((CloneableMap) value).createMutableClone(); } else { value = newHashMap(value); } diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableChoiceNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableChoiceNodeBuilder.java index 445191fc24..7de8f15c4d 100644 --- a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableChoiceNodeBuilder.java +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableChoiceNodeBuilder.java @@ -10,7 +10,6 @@ package org.opendaylight.yangtools.yang.data.impl.schema.builder.impl; import java.util.Map; import org.eclipse.jdt.annotation.NonNull; 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.ChoiceNode; import org.opendaylight.yangtools.yang.data.api.schema.builder.DataContainerNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableDataContainerNode; @@ -50,7 +49,7 @@ public class ImmutableChoiceNodeBuilder extends AbstractImmutableDataContainerNo private static final class ImmutableChoiceNode extends AbstractImmutableDataContainerNode implements ChoiceNode { - ImmutableChoiceNode(final NodeIdentifier nodeIdentifier, final Map children) { + ImmutableChoiceNode(final NodeIdentifier nodeIdentifier, final Map children) { super(children, nodeIdentifier); } diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableContainerNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableContainerNodeBuilder.java index e62e81e80d..5f4ea979d1 100644 --- a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableContainerNodeBuilder.java +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableContainerNodeBuilder.java @@ -10,7 +10,6 @@ package org.opendaylight.yangtools.yang.data.impl.schema.builder.impl; import java.util.Map; import org.eclipse.jdt.annotation.NonNull; 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.ContainerNode; import org.opendaylight.yangtools.yang.data.api.schema.builder.DataContainerNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableDataContainerNode; @@ -51,7 +50,7 @@ public class ImmutableContainerNodeBuilder protected static final class ImmutableContainerNode extends AbstractImmutableDataContainerNode implements ContainerNode { - ImmutableContainerNode(final NodeIdentifier nodeIdentifier, final Map children) { + ImmutableContainerNode(final NodeIdentifier nodeIdentifier, final Map children) { super(children, nodeIdentifier); } diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapEntryNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapEntryNodeBuilder.java index d529ce81a4..1219132739 100644 --- a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapEntryNodeBuilder.java +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableMapEntryNodeBuilder.java @@ -10,13 +10,11 @@ package org.opendaylight.yangtools.yang.data.impl.schema.builder.impl; import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; -import java.util.Map.Entry; import org.eclipse.jdt.annotation.NonNull; 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; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; -import org.opendaylight.yangtools.yang.data.api.schema.LeafNode; import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.builder.DataContainerNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; @@ -28,8 +26,8 @@ import org.slf4j.LoggerFactory; public class ImmutableMapEntryNodeBuilder extends AbstractImmutableDataContainerNodeBuilder { private static final Logger LOG = LoggerFactory.getLogger(ImmutableMapEntryNodeBuilder.class); - // FIXME: NodeIdentifier instead - protected final Map childrenQNamesToPaths; + + protected final Map childrenQNamesToPaths; protected ImmutableMapEntryNodeBuilder() { childrenQNamesToPaths = new LinkedHashMap<>(); @@ -63,14 +61,13 @@ public class ImmutableMapEntryNodeBuilder return new ImmutableMapEntryNodeBuilder(immutableNode); } - private static void fillQNames(final Iterable iterable, final Map out) { - for (final DataContainerChild child : iterable) { + private static void fillQNames(final Iterable iterable, final Map out) { + for (var child : iterable) { putQName(out, child); } } - private static void putQName(final Map map, final DataContainerChild child) { - // Augmentation nodes cannot be keys, and do not have to be present in childrenQNamesToPaths map + private static void putQName(final Map map, final DataContainerChild child) { final var identifier = child.name(); map.put(identifier.getNodeType(), identifier); } @@ -91,12 +88,12 @@ public class ImmutableMapEntryNodeBuilder @Override public MapEntryNode build() { - for (final Entry key : getNodeIdentifier().entrySet()) { - final DataContainerChild childNode = getChild(childrenQNamesToPaths.get(key.getKey())); + for (var key : getNodeIdentifier().entrySet()) { + final var childNode = getChild(childrenQNamesToPaths.get(key.getKey())); // We have enough information to fill-in missing leaf nodes, so let's do that if (childNode == null) { - LeafNode leaf = ImmutableNodes.leafNode(key.getKey(), key.getValue()); + final var leaf = ImmutableNodes.leafNode(key.getKey(), key.getValue()); LOG.debug("Adding leaf {} implied by key {}", leaf, key); withChild(leaf); } else { @@ -113,7 +110,7 @@ public class ImmutableMapEntryNodeBuilder implements MapEntryNode { ImmutableMapEntryNode(final NodeIdentifierWithPredicates nodeIdentifier, - final Map children) { + final Map children) { super(children, nodeIdentifier); } diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableUnkeyedListEntryNodeBuilder.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableUnkeyedListEntryNodeBuilder.java index e15d08bf69..1a7b311ec8 100644 --- a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableUnkeyedListEntryNodeBuilder.java +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/builder/impl/ImmutableUnkeyedListEntryNodeBuilder.java @@ -10,7 +10,6 @@ package org.opendaylight.yangtools.yang.data.impl.schema.builder.impl; import java.util.Map; import org.eclipse.jdt.annotation.NonNull; 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.UnkeyedListEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.builder.DataContainerNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableDataContainerNode; @@ -55,7 +54,7 @@ public class ImmutableUnkeyedListEntryNodeBuilder protected static final class ImmutableUnkeyedListEntryNode extends AbstractImmutableDataContainerNode implements UnkeyedListEntryNode { - ImmutableUnkeyedListEntryNode(final NodeIdentifier nodeIdentifier, final Map children) { + ImmutableUnkeyedListEntryNode(final NodeIdentifier nodeIdentifier, final Map children) { super(children, nodeIdentifier); } diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/AbstractImmutableDataContainerNode.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/AbstractImmutableDataContainerNode.java index cb393c8b7a..08892e449b 100644 --- a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/AbstractImmutableDataContainerNode.java +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/AbstractImmutableDataContainerNode.java @@ -18,9 +18,9 @@ import org.opendaylight.yangtools.yang.data.spi.node.AbstractNormalizedNode; public abstract class AbstractImmutableDataContainerNode extends AbstractNormalizedNode implements DataContainerNode { - private final Map children; + private final Map children; - protected AbstractImmutableDataContainerNode(final Map children, final K nodeIdentifier) { + protected AbstractImmutableDataContainerNode(final Map children, final K nodeIdentifier) { super(nodeIdentifier); this.children = ImmutableOffsetMap.unorderedCopyOf(children); } @@ -49,7 +49,7 @@ public abstract class AbstractImmutableDataContainerNode getChildren() { + public final Map getChildren() { return children; } diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/LazyLeafOperations.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/LazyLeafOperations.java index ef3ca40c5f..b4c6403538 100644 --- a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/LazyLeafOperations.java +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/LazyLeafOperations.java @@ -15,7 +15,6 @@ import java.util.Map; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; 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.DataContainerChild; import org.opendaylight.yangtools.yang.data.api.schema.LeafNode; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; @@ -30,26 +29,26 @@ public final class LazyLeafOperations { // Hidden on purpose } - public static @Nullable DataContainerChild getChild(final Map map, final PathArgument key) { + public static @Nullable DataContainerChild getChild(final Map map, + final NodeIdentifier key) { final Object value = map.get(key); return value == null ? null : decodeChild(key, value); } - public static void putChild(final Map map, final DataContainerChild child) { + public static void putChild(final Map map, final DataContainerChild child) { final var node = requireNonNull(child); map.put(node.name(), encodeExpendableChild(node)); } - static @NonNull LeafNode coerceLeaf(final PathArgument key, final Object value) { - verify(key instanceof NodeIdentifier, "Unexpected value %s for child %s", value, key); - return ImmutableNodes.leafNode((NodeIdentifier) key, value); + static @NonNull LeafNode coerceLeaf(final NodeIdentifier key, final Object value) { + return ImmutableNodes.leafNode(key, value); } - private static @Nullable DataContainerChild decodeChild(final PathArgument key, final @NonNull Object value) { + private static @Nullable DataContainerChild decodeChild(final NodeIdentifier key, final @NonNull Object value) { return decodeExpendableChild(key, value); } - private static @NonNull DataContainerChild decodeExpendableChild(final PathArgument key, + private static @NonNull DataContainerChild decodeExpendableChild(final NodeIdentifier key, final @NonNull Object value) { return value instanceof DataContainerChild child ? child : coerceLeaf(key, value); } diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/LazyValues.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/LazyValues.java index 60ca848087..502041b9d0 100644 --- a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/LazyValues.java +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/nodes/LazyValues.java @@ -13,7 +13,7 @@ import java.util.AbstractCollection; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; // This is *almost* the same as Guava's TransformedCollection. The main difference is delegation of hashCode()/equals() @@ -22,9 +22,9 @@ import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; // Collection.equals() is undefined, but the expectation from users is that we will return the same view object, which // equals on identity. final class LazyValues extends AbstractCollection { - private final Map map; + private final Map map; - LazyValues(final Map map) { + LazyValues(final Map map) { this.map = requireNonNull(map); } @@ -54,9 +54,9 @@ final class LazyValues extends AbstractCollection { } private static final class Iter implements Iterator { - private final Iterator> iterator; + private final Iterator> iterator; - Iter(final Iterator> iterator) { + Iter(final Iterator> iterator) { this.iterator = requireNonNull(iterator); } -- 2.36.6