From 058f1eebd2c0ba53acbd6eda83f50af4b1ddb473 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 25 Dec 2014 08:32:50 +0100 Subject: [PATCH] Publish StoreUtils as NormalizedNodes Move the widely useful functionality, which requires only API elements into the API package, so it can be reused elsewhere. Change-Id: I0eabfe3dbd1e0035f5ba96a0beee4b4c4d8d4114 Signed-off-by: Robert Varga --- .../data/api/schema/NormalizedNodes.java} | 70 +++++++++++++++---- .../yangtools/yang/data/impl/NodeUtils.java | 7 +- .../data/impl/schema/tree/DataTreeState.java | 3 +- .../impl/schema/tree/InMemoryDataTree.java | 3 +- .../tree/InMemoryDataTreeModification.java | 4 +- .../schema/tree/InMemoryDataTreeSnapshot.java | 9 ++- .../data/impl/schema/tree/StoreUtils.java | 70 ------------------- .../yangtools/yang/data/impl/NodeHelper.java | 7 +- .../schema/test/NormalizedNodeUtilsTest.java | 10 ++- 9 files changed, 75 insertions(+), 108 deletions(-) rename yang/{yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/NormalizedNodeUtils.java => yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizedNodes.java} (53%) delete mode 100644 yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/StoreUtils.java diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/NormalizedNodeUtils.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizedNodes.java similarity index 53% rename from yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/NormalizedNodeUtils.java rename to yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizedNodes.java index 997db8eab7..5f305d988c 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/NormalizedNodeUtils.java +++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/NormalizedNodes.java @@ -5,28 +5,28 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ -package org.opendaylight.yangtools.yang.data.impl.schema; +package org.opendaylight.yangtools.yang.data.api.schema; import static com.google.common.base.Preconditions.checkNotNull; - +import com.google.common.annotations.Beta; import com.google.common.base.Optional; - +import com.google.common.base.Strings; import java.util.Iterator; - import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue; 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.LeafNode; -import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -public final class NormalizedNodeUtils { - private NormalizedNodeUtils() { - throw new UnsupportedOperationException("Utilities class should not be instantiated"); +/** + * A set of utility methods for interacting with {@link NormalizedNode} objects. + */ +@Beta +public final class NormalizedNodes { + private static final int STRINGTREE_INDENT = 4; + + private NormalizedNodes() { + throw new UnsupportedOperationException("Utility class should not be instantiated"); } public static Optional> findNode(final YangInstanceIdentifier rootPath, final NormalizedNode rootNode, final YangInstanceIdentifier childPath) { @@ -63,4 +63,48 @@ public final class NormalizedNodeUtils { } return Optional.absent(); } + + /** + * Convert a data subtree under a node into a human-readable string format. + * + * @param node Data subtree root + * @return String containing a human-readable form of the subtree. + */ + public static String toStringTree(final NormalizedNode node) { + final StringBuilder builder = new StringBuilder(); + toStringTree(builder, node, 0); + return builder.toString(); + } + + private static void toStringTree(final StringBuilder builder, final NormalizedNode node, final int offset) { + final String prefix = Strings.repeat(" ", offset); + + builder.append(prefix).append(toStringTree(node.getIdentifier())); + if (node instanceof NormalizedNodeContainer) { + final NormalizedNodeContainer container = (NormalizedNodeContainer) node; + + builder.append(" {\n"); + for (NormalizedNode child : container.getValue()) { + toStringTree(builder, child, offset + STRINGTREE_INDENT); + } + + builder.append(prefix).append('}'); + } else { + builder.append(' ').append(node.getValue()); + } + builder.append('\n'); + } + + private static String toStringTree(final PathArgument identifier) { + if (identifier instanceof NodeIdentifierWithPredicates) { + StringBuilder builder = new StringBuilder(); + builder.append(identifier.getNodeType().getLocalName()); + builder.append(((NodeIdentifierWithPredicates) identifier).getKeyValues().values()); + return builder.toString(); + } else if (identifier instanceof AugmentationIdentifier) { + return "augmentation"; + } else { + return identifier.getNodeType().getLocalName(); + } + } } diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/NodeUtils.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/NodeUtils.java index b1ff225026..10e79e2bf3 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/NodeUtils.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/NodeUtils.java @@ -13,7 +13,6 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; - import java.util.AbstractMap.SimpleEntry; import java.util.ArrayDeque; import java.util.ArrayList; @@ -21,7 +20,6 @@ import java.util.Deque; import java.util.HashMap; import java.util.List; import java.util.Map; - import javax.annotation.Nonnull; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -31,14 +29,13 @@ import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; - import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.data.api.ModifyAction; import org.opendaylight.yangtools.yang.data.api.Node; import org.opendaylight.yangtools.yang.data.api.NodeModification; import org.opendaylight.yangtools.yang.data.api.SimpleNode; -import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeUtils; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodes; import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; @@ -50,7 +47,7 @@ import org.w3c.dom.Element; /** * @author michal.rehak * - * @deprecated Use {@link NormalizedNodeUtils} instead. + * @deprecated Use {@link NormalizedNodes} instead. */ @Deprecated public abstract class NodeUtils { diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/DataTreeState.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/DataTreeState.java index 9419d08f67..9790fc2d87 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/DataTreeState.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/DataTreeState.java @@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.data.impl.schema.tree; import com.google.common.base.Objects; import com.google.common.base.Preconditions; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodes; import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNode; import org.opendaylight.yangtools.yang.model.api.SchemaContext; @@ -59,6 +60,6 @@ final class DataTreeState { @Override public String toString() { final TreeNode r = root; - return Objects.toStringHelper(this).add("data", StoreUtils.toStringTree(r.getData())).toString(); + return Objects.toStringHelper(this).add("data", NormalizedNodes.toStringTree(r.getData())).toString(); } } \ No newline at end of file diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTree.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTree.java index 9d60ed0a9b..38e884c096 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTree.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTree.java @@ -14,6 +14,7 @@ import java.util.Collections; import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodes; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification; @@ -106,7 +107,7 @@ final class InMemoryDataTree implements DataTree { final InMemoryDataTreeCandidate c = (InMemoryDataTreeCandidate)candidate; if (LOG.isTraceEnabled()) { - LOG.trace("Data Tree is {}", StoreUtils.toStringTree(c.getAfterRoot().getData())); + LOG.trace("Data Tree is {}", NormalizedNodes.toStringTree(c.getAfterRoot().getData())); } final TreeNode newRoot = c.getAfterRoot(); diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeModification.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeModification.java index 34a93587ab..0b0c8516d8 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeModification.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeModification.java @@ -14,12 +14,12 @@ import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodes; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification; import org.opendaylight.yangtools.yang.data.api.schema.tree.ModificationType; import org.opendaylight.yangtools.yang.data.api.schema.tree.StoreTreeNodes; import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNode; import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.Version; -import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -95,7 +95,7 @@ final class InMemoryDataTreeModification implements DataTreeModification { final Optional result = resolveSnapshot(key, mod); if (result.isPresent()) { NormalizedNode data = result.get().getData(); - return NormalizedNodeUtils.findNode(key, data, path); + return NormalizedNodes.findNode(key, data, path); } else { return Optional.absent(); } diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeSnapshot.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeSnapshot.java index 0e61cd4031..6d3f9a3cbf 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeSnapshot.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeSnapshot.java @@ -1,16 +1,15 @@ package org.opendaylight.yangtools.yang.data.impl.schema.tree; +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodes; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot; import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNode; -import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeUtils; import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; - final class InMemoryDataTreeSnapshot implements DataTreeSnapshot { private final RootModificationApplyOperation applyOper; private final SchemaContext schemaContext; @@ -33,7 +32,7 @@ final class InMemoryDataTreeSnapshot implements DataTreeSnapshot { @Override public Optional> readNode(final YangInstanceIdentifier path) { - return NormalizedNodeUtils.findNode(rootNode.getData(), path); + return NormalizedNodes.findNode(rootNode.getData(), path); } @Override diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/StoreUtils.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/StoreUtils.java deleted file mode 100644 index 66dd68fd05..0000000000 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/StoreUtils.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.yangtools.yang.data.impl.schema.tree; - -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; -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.NormalizedNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer; - -import com.google.common.base.Strings; - -/** - * Data store tree manipulation utilities. - */ -public final class StoreUtils { - private static final int STRINGTREE_INDENT = 4; - - private StoreUtils() { - throw new UnsupportedOperationException("Utility class should not be instantiated"); - } - - /** - * Convert a data subtree under a node into a human-readable string format. - * - * @param node Data subtree root - * @return String containing a human-readable form of the subtree. - */ - public static String toStringTree(final NormalizedNode node) { - final StringBuilder builder = new StringBuilder(); - toStringTree(builder, node, 0); - return builder.toString(); - } - - private static void toStringTree(final StringBuilder builder, final NormalizedNode node, final int offset) { - final String prefix = Strings.repeat(" ", offset); - - builder.append(prefix).append(toStringTree(node.getIdentifier())); - if (node instanceof NormalizedNodeContainer) { - final NormalizedNodeContainer container = (NormalizedNodeContainer) node; - - builder.append(" {\n"); - for (NormalizedNode child : container.getValue()) { - toStringTree(builder, child, offset + STRINGTREE_INDENT); - } - - builder.append(prefix).append('}'); - } else { - builder.append(' ').append(node.getValue()); - } - builder.append('\n'); - } - - private static String toStringTree(final PathArgument identifier) { - if (identifier instanceof NodeIdentifierWithPredicates) { - StringBuilder builder = new StringBuilder(); - builder.append(identifier.getNodeType().getLocalName()); - builder.append(((NodeIdentifierWithPredicates) identifier).getKeyValues().values()); - return builder.toString(); - } else if (identifier instanceof AugmentationIdentifier) { - return "augmentation"; - } - return identifier.getNodeType().getLocalName(); - } -} diff --git a/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/NodeHelper.java b/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/NodeHelper.java index 65ec09204b..901750b6d1 100644 --- a/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/NodeHelper.java +++ b/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/NodeHelper.java @@ -10,7 +10,6 @@ package org.opendaylight.yangtools.yang.data.impl; import groovy.lang.Binding; import groovy.lang.GroovyShell; import groovy.lang.Script; - import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -24,20 +23,18 @@ import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; import java.util.Set; - import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; - import org.custommonkey.xmlunit.Diff; import org.junit.Assert; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.data.api.Node; -import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeUtils; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodes; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.parser.api.YangModelParser; @@ -50,7 +47,7 @@ import org.xml.sax.SAXException; /** * @author michal.rehak * - * @deprecated Use {@link NormalizedNodeUtils} instead. + * @deprecated Use {@link NormalizedNodes} instead. */ @Deprecated public abstract class NodeHelper { diff --git a/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/test/NormalizedNodeUtilsTest.java b/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/test/NormalizedNodeUtilsTest.java index 0b21ea01df..ff2e18a8ef 100644 --- a/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/test/NormalizedNodeUtilsTest.java +++ b/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/test/NormalizedNodeUtilsTest.java @@ -5,17 +5,15 @@ import static org.junit.Assert.assertTrue; import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapEntry; import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapEntryBuilder; import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapNodeBuilder; - +import com.google.common.base.Optional; import org.junit.Test; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeUtils; +import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodes; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder; -import com.google.common.base.Optional; - /** * * Schema structure of document is @@ -108,10 +106,10 @@ public class NormalizedNodeUtilsTest { NormalizedNode tree = createDocumentOne(); assertNotNull(tree); - Optional> listFooResult = NormalizedNodeUtils.findNode(tree, LIST_A_FOO_PATH); + Optional> listFooResult = NormalizedNodes.findNode(tree, LIST_A_FOO_PATH); assertTrue(listFooResult.isPresent()); - Optional> listTwoResult = NormalizedNodeUtils.findNode(tree, LIST_B_TWO_PATH); + Optional> listTwoResult = NormalizedNodes.findNode(tree, LIST_B_TWO_PATH); assertTrue(listTwoResult.isPresent()); } -- 2.36.6