*/
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 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.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;
}
// allocations.
if (value instanceof byte[]) {
// Binary
- return BaseEncoding.base64().encode((byte[]) value);
+ return Base64.getEncoder().encodeToString((byte[]) value);
}
if (value instanceof Set) {
// Bits
throw new UnsupportedOperationException();
}
+ @Override
+ public Iterator<NormalizedNodeContext> getChildAxisIterator(final Object contextNode) {
+ final NormalizedNodeContext ctx = cast(contextNode);
+ final NormalizedNode<?, ?> node = ctx.getNode();
+ return node instanceof DataContainerNode ? ctx.iterateChildren((DataContainerNode<?>) node) : null;
+ }
+
@Override
public Iterator<NormalizedNodeContext> getChildAxisIterator(final Object contextNode, final String localName,
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 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));
- }
-
+ public Iterator<? extends Entry<?, ?>> getAttributeAxisIterator(final Object contextNode) {
+ // 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<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);
- } else {
- return null;
- }
+ public Iterator<? extends Entry<?, ?>> getAttributeAxisIterator(final Object contextNode, final String localName,
+ final String namespacePrefix, final String namespaceURI) {
+ // 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;
}
@Override
}
@Override
- public Iterator<NormalizedNodeContext> getAncestorAxisIterator(final Object contextNode) throws UnsupportedAxisException {
+ public Iterator<NormalizedNodeContext> getAncestorAxisIterator(final Object contextNode)
+ throws UnsupportedAxisException {
final NormalizedNodeContext parent = cast(contextNode).getParent();
return parent == null ? null : new NormalizedNodeContextIterator(parent);
}
@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();
- }
-
- return null;
- }
-
- @Override
- public Iterator<NormalizedNodeContext> getSelfAxisIterator(final Object contextNode) throws UnsupportedAxisException {
+ public Iterator<NormalizedNodeContext> getSelfAxisIterator(final Object contextNode)
+ throws UnsupportedAxisException {
return Iterators.singletonIterator(cast(contextNode));
}
@Override
- public Iterator<NormalizedNodeContext> getAncestorOrSelfAxisIterator(final Object contextNode) throws UnsupportedAxisException {
+ public Iterator<NormalizedNodeContext> getAncestorOrSelfAxisIterator(final Object contextNode)
+ throws UnsupportedAxisException {
return new NormalizedNodeContextIterator(cast(contextNode));
}
return cast(contextNode).getParent();
}
- NormalizedNode<?, ?> getRootNode() {
- return document.getRootNode();
+ @Override
+ public EffectiveModelContext getEffectiveModelContext() {
+ return document.getEffectiveModelContext();
+ }
+
+ 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