Publish StoreUtils as NormalizedNodes
[yangtools.git] / 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 997db8eab762ac73c0cdb8dabdcee91d1440decc..5f305d988c02e5d691e00405bff98775596ff950 100644 (file)
@@ -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<NormalizedNode<?, ?>> 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();
+        }
+    }
 }