Remove SchemaContextProvider
[yangtools.git] / yang / yang-data-jaxen / src / main / java / org / opendaylight / yangtools / yang / data / jaxen / NormalizedNodeNavigator.java
index cd0c9954903167948c844ebcdbf3d96760ca122c..f8f27cf500d78ef9d3989329efb66304e36cc558 100644 (file)
@@ -7,20 +7,17 @@
  */
 package org.opendaylight.yangtools.yang.data.jaxen;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.base.Joiner;
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
 import com.google.common.base.Verify;
 import com.google.common.collect.Iterators;
 import com.google.common.collect.UnmodifiableIterator;
-import com.google.common.io.BaseEncoding;
-import java.util.AbstractMap.SimpleImmutableEntry;
+import java.util.Base64;
 import java.util.Iterator;
-import java.util.Map;
 import java.util.Map.Entry;
 import java.util.NoSuchElementException;
 import java.util.Set;
-import javax.annotation.Nonnull;
 import org.jaxen.DefaultNavigator;
 import org.jaxen.NamedAccessNavigator;
 import org.jaxen.Navigator;
@@ -29,27 +26,25 @@ import org.jaxen.XPath;
 import org.jaxen.saxpath.SAXPathException;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
-import org.opendaylight.yangtools.yang.data.api.AttributesContainer;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 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;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
+import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextProvider;
 
 /**
  * A {@link Navigator} implementation for YANG XPaths instantiated on a particular root {@link NormalizedNode}.
  */
-final class NormalizedNodeNavigator extends DefaultNavigator implements NamedAccessNavigator {
+final class NormalizedNodeNavigator extends DefaultNavigator
+        implements NamedAccessNavigator, EffectiveModelContextProvider {
     private static final long serialVersionUID = 1L;
     private static final Joiner JOINER = Joiner.on(" ").skipNulls();
     private final ConverterNamespaceContext namespaceContext;
     private final JaxenDocument document;
 
     NormalizedNodeNavigator(final ConverterNamespaceContext context, final JaxenDocument document) {
-        this.namespaceContext = Preconditions.checkNotNull(context);
+        this.namespaceContext = requireNonNull(context);
         this.document = document;
     }
 
@@ -171,7 +166,7 @@ final class NormalizedNodeNavigator extends DefaultNavigator implements NamedAcc
             //       allocations.
             if (value instanceof byte[]) {
                 // Binary
-                return BaseEncoding.base64().encode((byte[]) value);
+                return Base64.getEncoder().encodeToString((byte[]) value);
             }
             if (value instanceof Set) {
                 // Bits
@@ -216,11 +211,7 @@ final class NormalizedNodeNavigator extends DefaultNavigator implements NamedAcc
     public Iterator<NormalizedNodeContext> getChildAxisIterator(final Object contextNode) {
         final NormalizedNodeContext ctx = cast(contextNode);
         final NormalizedNode<?, ?> node = ctx.getNode();
-        if (node instanceof DataContainerNode) {
-            return Iterators.transform(((DataContainerNode<?>) node).getValue().iterator(), ctx);
-        }
-
-        return null;
+        return node instanceof DataContainerNode ? ctx.iterateChildren((DataContainerNode<?>) node) : null;
     }
 
     @Override
@@ -228,59 +219,41 @@ final class NormalizedNodeNavigator extends DefaultNavigator implements NamedAcc
             final String namespacePrefix, final String namespaceURI) {
         final NormalizedNodeContext ctx = cast(contextNode);
         final NormalizedNode<?, ?> node = ctx.getNode();
-        if (!(node instanceof DataContainerNode)) {
-            return null;
-        }
-
-        final QName qname = resolveQName(node, namespacePrefix, localName);
-        @SuppressWarnings({ "unchecked", "rawtypes" })
-        final Optional<NormalizedNode<?, ?>> maybeChild = ((DataContainerNode)node).getChild(new NodeIdentifier(qname));
-        if (!maybeChild.isPresent()) {
-            return null;
-        }
-
-        // The child may be a structural node
-        final NormalizedNode<?, ?> child = maybeChild.get();
-        if (child instanceof MapNode) {
-            return Iterators.transform(((MapNode)child).getValue().iterator(), ctx);
-        }
-        if (child instanceof LeafSetNode) {
-            return Iterators.transform(((LeafSetNode<?>)child).getValue().iterator(), ctx);
-        }
-
-        return Iterators.singletonIterator(ctx.apply(child));
+        return node instanceof DataContainerNode
+                ? ctx.iterateChildrenNamed((DataContainerNode<?>)node, resolveQName(node, namespacePrefix, localName))
+                        : null;
     }
 
     @Override
     public Iterator<? extends Entry<?, ?>> getAttributeAxisIterator(final Object contextNode) {
-        final NormalizedNode<?, ?> node = contextNode(contextNode);
-        if (node instanceof AttributesContainer) {
-            final Map<QName, String> attributes = ((AttributesContainer) node).getAttributes();
-            if (attributes.isEmpty()) {
-                return null;
-            }
-
-            return attributes.entrySet().iterator();
-        }
-
+        // FIXME: how do we mix in metadata?
+        //      final NormalizedNode<?, ?> node = contextNode(contextNode);
+        //      if (node instanceof AttributesContainer) {
+        //          final Map<QName, String> attributes = ((AttributesContainer) node).getAttributes();
+        //          if (attributes.isEmpty()) {
+        //              return null;
+        //          }
+        //
+        //          return attributes.entrySet().iterator();
+        //      }
         return null;
     }
 
     @Override
     public Iterator<? extends Entry<?, ?>> getAttributeAxisIterator(final Object contextNode, final String localName,
             final String namespacePrefix, final String namespaceURI) {
-        final NormalizedNode<?, ?> node = contextNode(contextNode);
-        if (node instanceof AttributesContainer) {
-            final Map<QName, String> attributes = ((AttributesContainer) node).getAttributes();
-            if (attributes.isEmpty()) {
-                return null;
-            }
-
-            final QName qname = resolveQName(node, namespacePrefix, localName);
-            final String value = attributes.get(qname);
-            return value == null ? null : Iterators.singletonIterator(new SimpleImmutableEntry<>(qname, value));
-        }
-
+        // FIXME: how do we mix in metadata?
+        //      final NormalizedNode<?, ?> node = contextNode(contextNode);
+        //      if (node instanceof AttributesContainer) {
+        //          final Map<QName, String> attributes = ((AttributesContainer) node).getAttributes();
+        //          if (attributes.isEmpty()) {
+        //              return null;
+        //          }
+        //
+        //          final QName qname = resolveQName(node, namespacePrefix, localName);
+        //          final String value = attributes.get(qname);
+        //          return value == null ? null : Iterators.singletonIterator(new SimpleImmutableEntry<>(qname, value));
+        //      }
         return null;
     }
 
@@ -314,20 +287,20 @@ final class NormalizedNodeNavigator extends DefaultNavigator implements NamedAcc
         return cast(contextNode).getParent();
     }
 
-    NormalizedNode<?, ?> getRootNode() {
-        return document.getRootNode();
+    @Override
+    public EffectiveModelContext getEffectiveModelContext() {
+        return document.getEffectiveModelContext();
     }
 
-    @Nonnull
-    SchemaContext getSchemaContext() {
-        return document.getSchemaContext();
+    JaxenDocument getDocument() {
+        return document;
     }
 
     private static final class NormalizedNodeContextIterator extends UnmodifiableIterator<NormalizedNodeContext> {
         private NormalizedNodeContext next;
 
         NormalizedNodeContextIterator(final NormalizedNodeContext initial) {
-            this.next = Preconditions.checkNotNull(initial);
+            this.next = requireNonNull(initial);
         }
 
         @Override