package org.opendaylight.yangtools.yang.data.impl.schema;
import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.api.schema.*;
+import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+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.MapEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.ListNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeBuilder;
-import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.*;
-import org.opendaylight.yangtools.yang.model.api.*;
-
-public class Builders {
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableAugmentationNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableAugmentationNodeSchemaAwareBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableChoiceNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableChoiceNodeSchemaAwareBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeSchemaAwareBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafNodeSchemaAwareBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetEntryNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetEntryNodeSchemaAwareBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetNodeSchemaAwareBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapEntryNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapEntryNodeSchemaAwareBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapNodeSchemaAwareBuilder;
+import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
+import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
+
+public final class Builders {
+
+ private Builders() {
+ throw new UnsupportedOperationException("Utilities class should not be instantiated");
+ }
public static <T> NormalizedNodeBuilder<InstanceIdentifier.NodeIdentifier, T, LeafNode<T>> leafBuilder() {
return ImmutableLeafNodeBuilder.create();
}
public static <T> NormalizedNodeBuilder<InstanceIdentifier.NodeIdentifier, T, LeafNode<T>> leafBuilder(
- LeafSchemaNode schema) {
+ final LeafSchemaNode schema) {
return ImmutableLeafNodeSchemaAwareBuilder.create(schema);
}
}
public static <T> NormalizedNodeBuilder<InstanceIdentifier.NodeWithValue, T, LeafSetEntryNode<T>> leafSetEntryBuilder(
- LeafListSchemaNode schema) {
+ final LeafListSchemaNode schema) {
return ImmutableLeafSetEntryNodeSchemaAwareBuilder.create(schema);
}
- public static <T> ListNodeBuilder<T, LeafSetEntryNode<T>> leafSetBuilder() {
+ public static <T> ListNodeBuilder<T,LeafSetEntryNode<T>> leafSetBuilder() {
return ImmutableLeafSetNodeBuilder.create();
}
- public static <T> ListNodeBuilder<T, LeafSetEntryNode<T>> leafSetBuilder(LeafListSchemaNode schema) {
- return ImmutableLeafSetNodeSchemaAwareBuilder.create(schema);
+ public static <T> ListNodeBuilder<T,LeafSetEntryNode<T>> leafSetBuilder(final LeafListSchemaNode schema) {
+ return ImmutableLeafSetNodeSchemaAwareBuilder.<T>create(schema);
}
public static DataContainerNodeBuilder<InstanceIdentifier.NodeIdentifier, ContainerNode> containerBuilder() {
}
public static DataContainerNodeBuilder<InstanceIdentifier.NodeIdentifier, ContainerNode> containerBuilder(
- ContainerSchemaNode schema) {
+ final ContainerSchemaNode schema) {
return ImmutableContainerNodeSchemaAwareBuilder.create(schema);
}
}
public static DataContainerNodeBuilder<InstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode> mapEntryBuilder(
- ListSchemaNode schema) {
+ final ListSchemaNode schema) {
return ImmutableMapEntryNodeSchemaAwareBuilder.create(schema);
}
return ImmutableMapNodeBuilder.create();
}
- public static CollectionNodeBuilder<MapEntryNode, MapNode> mapBuilder(ListSchemaNode schema) {
+ public static CollectionNodeBuilder<MapEntryNode, MapNode> mapBuilder(final ListSchemaNode schema) {
return ImmutableMapNodeSchemaAwareBuilder.create(schema);
}
return ImmutableAugmentationNodeBuilder.create();
}
- public static DataContainerNodeBuilder<InstanceIdentifier.AugmentationIdentifier, AugmentationNode> augmentationBuilder(AugmentationSchema schema) {
+ public static DataContainerNodeBuilder<InstanceIdentifier.AugmentationIdentifier, AugmentationNode> augmentationBuilder(final AugmentationSchema schema) {
return ImmutableAugmentationNodeSchemaAwareBuilder.create(schema);
}
return ImmutableChoiceNodeBuilder.create();
}
- public static DataContainerNodeBuilder<InstanceIdentifier.NodeIdentifier, ChoiceNode> choiceBuilder(org.opendaylight.yangtools.yang.model.api.ChoiceNode schema) {
+ public static DataContainerNodeBuilder<InstanceIdentifier.NodeIdentifier, ChoiceNode> choiceBuilder(final org.opendaylight.yangtools.yang.model.api.ChoiceNode schema) {
return ImmutableChoiceNodeSchemaAwareBuilder.create(schema);
}
--- /dev/null
+/*
+ * 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;
+
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifierWithPredicates;
+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.MapNode;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapEntryNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapNodeBuilder;
+
+public final class ImmutableNodes {
+
+ private ImmutableNodes() {
+ throw new UnsupportedOperationException("Utilities class should not be instantiated");
+ }
+
+ public static final CollectionNodeBuilder<MapEntryNode, MapNode> mapNodeBuilder() {
+ return ImmutableMapNodeBuilder.create();
+ }
+
+ public static final CollectionNodeBuilder<MapEntryNode, MapNode> mapNodeBuilder(final QName name) {
+ return ImmutableMapNodeBuilder.create().withNodeIdentifier(new NodeIdentifier(name));
+ }
+
+ public static final <T> LeafNode<T> leafNode(final QName name,final T value) {
+ return ImmutableLeafNodeBuilder.<T>create()
+ .withNodeIdentifier(new NodeIdentifier(name))
+ .withValue(value)
+ .build();
+ }
+
+ public static DataContainerNodeBuilder<NodeIdentifierWithPredicates, MapEntryNode> mapEntryBuilder(final QName nodeName,final QName keyName,final Object keyValue) {
+ return ImmutableMapEntryNodeBuilder.create()
+ .withNodeIdentifier(new NodeIdentifierWithPredicates(nodeName, keyName,keyValue))
+ .withChild(leafNode(keyName, keyValue));
+ }
+
+ public static MapEntryNode mapEntry(final QName nodeName,final QName keyName,final Object keyValue) {
+ return mapEntryBuilder(nodeName, keyName, keyValue).build();
+ }
+
+ public static DataContainerNodeBuilder<NodeIdentifierWithPredicates, MapEntryNode> mapEntryBuilder() {
+ return ImmutableMapEntryNodeBuilder.create();
+ }
+
+ public static NormalizedNode<?, ?> containerNode(final QName name) {
+ return ImmutableContainerNodeBuilder.create().withNodeIdentifier(new NodeIdentifier(name)).build();
+ }
+
+}
--- /dev/null
+/*
+ * 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;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Iterator;
+
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifierWithPredicates;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeWithValue;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.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;
+
+import com.google.common.base.Optional;
+
+public final class NormalizedNodeUtils {
+ private NormalizedNodeUtils() {
+ throw new UnsupportedOperationException("Utilities class should not be instantiated");
+ }
+
+ public static Optional<NormalizedNode<?, ?>> findNode(final InstanceIdentifier rootPath, final NormalizedNode<?, ?> rootNode, final InstanceIdentifier childPath) {
+ if(rootPath.contains(childPath)) {
+ int common = rootPath.getPath().size();
+ InstanceIdentifier relativePath = new InstanceIdentifier(childPath.getPath().subList(common, childPath.getPath().size()));
+ return findNode(rootNode, relativePath);
+ }
+ return Optional.absent();
+ }
+
+ public static Optional<NormalizedNode<?, ?>> findNode(final NormalizedNode<?, ?> tree, final InstanceIdentifier path) {
+ checkNotNull(tree, "Tree must not be null");
+ checkNotNull(path, "Path must not be null");
+
+ Optional<NormalizedNode<?, ?>> currentNode = Optional.<NormalizedNode<?, ?>> of(tree);
+ Iterator<PathArgument> pathIterator = path.getPath().iterator();
+ while (currentNode.isPresent() && pathIterator.hasNext()) {
+ currentNode = getDirectChild(currentNode.get(), pathIterator.next());
+ }
+ return currentNode;
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ public static Optional<NormalizedNode<?, ?>> getDirectChild(final NormalizedNode<?, ?> node, final PathArgument pathArg) {
+ if (node instanceof LeafNode<?> || node instanceof LeafSetEntryNode<?>) {
+ return Optional.absent();
+ } else if (node instanceof DataContainerNode<?>) {
+ return (Optional) ((DataContainerNode<?>) node).getChild(pathArg);
+ } else if (node instanceof MapNode && pathArg instanceof NodeIdentifierWithPredicates) {
+ return (Optional) ((MapNode) node).getChild((NodeIdentifierWithPredicates) pathArg);
+ } else if (node instanceof LeafSetNode<?>) {
+ return (Optional) ((LeafSetNode<?>) node).getChild((NodeWithValue) pathArg);
+ }
+ return Optional.absent();
+ }
+}
import java.util.List;
import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-public interface CollectionNodeBuilder<V, R extends NormalizedNode<InstanceIdentifier.NodeIdentifier, ?>>
- extends NormalizedNodeBuilder<InstanceIdentifier.NodeIdentifier, List<V>, R> {
+public interface CollectionNodeBuilder<V extends NormalizedNode<?, ?>, R extends NormalizedNode<InstanceIdentifier.NodeIdentifier, ?>>
+ extends NormalizedNodeContainerBuilder<NodeIdentifier,PathArgument, V, R> {
//TODO might be list to keep ordering and map internal
@Override
package org.opendaylight.yangtools.yang.data.impl.schema.builder.api;
import java.util.List;
-import java.util.Map;
import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument;
import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
public interface DataContainerNodeBuilder<I extends InstanceIdentifier.PathArgument, R extends DataContainerNode<I>>
- extends NormalizedNodeBuilder<I, List<DataContainerChild<? extends InstanceIdentifier.PathArgument, ?>>, R> {
+ extends NormalizedNodeContainerBuilder<I, PathArgument, DataContainerChild<? extends PathArgument, ?>, R> {
@Override
DataContainerNodeBuilder<I, R> withValue(List<DataContainerChild<? extends InstanceIdentifier.PathArgument, ?>> value);
import java.util.List;
import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
public interface ListNodeBuilder<T, V>
- extends CollectionNodeBuilder<V, LeafSetNode<T>> {
+ extends CollectionNodeBuilder<LeafSetEntryNode<T>, LeafSetNode<T>> {
@Override
ListNodeBuilder<T, V> withNodeIdentifier(InstanceIdentifier.NodeIdentifier nodeIdentifier);
@Override
- ListNodeBuilder<T, V> withValue(List<V> value);
+ ListNodeBuilder<T, V> withValue(List<LeafSetEntryNode<T>> value);
@Override
- ListNodeBuilder<T, V> withChild(V child);
+ ListNodeBuilder<T, V> withChild(LeafSetEntryNode<T> child);
ListNodeBuilder<T, V> withChildValue(T child);
}
--- /dev/null
+package org.opendaylight.yangtools.yang.data.impl.schema.builder.api;
+
+import java.util.List;
+
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+
+public interface NormalizedNodeContainerBuilder<K extends PathArgument,CK extends PathArgument,CV extends NormalizedNode<? extends CK, ?>,P extends NormalizedNode<K, ?>>
+extends NormalizedNodeBuilder<K,List<CV>,P>{
+
+ @Override
+ public NormalizedNodeContainerBuilder<K,CK,CV,P> withNodeIdentifier(K nodeIdentifier);
+
+ @Override
+ public NormalizedNodeContainerBuilder<K,CK,CV,P> withValue(List<CV> value);
+
+ public NormalizedNodeContainerBuilder<K,CK,CV,P> addChild(CV child);
+}
import java.util.Map;
import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument;
import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
abstract class AbstractImmutableDataContainerNodeBuilder<I extends InstanceIdentifier.PathArgument, R extends DataContainerNode<I>>
implements DataContainerNodeBuilder<I, R> {
- protected Map<InstanceIdentifier.PathArgument, DataContainerChild<? extends InstanceIdentifier.PathArgument, ?>> value;
+ protected final Map<InstanceIdentifier.PathArgument, DataContainerChild<? extends InstanceIdentifier.PathArgument, ?>> value;
protected I nodeIdentifier;
protected AbstractImmutableDataContainerNodeBuilder() {
}
@Override
- public DataContainerNodeBuilder<I, R> withValue(List<DataContainerChild<? extends InstanceIdentifier.PathArgument, ?>> value) {
+ public DataContainerNodeBuilder<I, R> withValue(final List<DataContainerChild<? extends InstanceIdentifier.PathArgument, ?>> value) {
// TODO Replace or putAll ?
for (DataContainerChild<? extends InstanceIdentifier.PathArgument, ?> dataContainerChild : value) {
withChild(dataContainerChild);
}
@Override
- public DataContainerNodeBuilder<I, R> withChild(DataContainerChild<?, ?> child) {
+ public DataContainerNodeBuilder<I, R> withChild(final DataContainerChild<?, ?> child) {
this.value.put(child.getIdentifier(), child);
return this;
}
@Override
- public DataContainerNodeBuilder<I, R> withNodeIdentifier(I nodeIdentifier) {
+ public DataContainerNodeBuilder<I, R> withNodeIdentifier(final I nodeIdentifier) {
this.nodeIdentifier = nodeIdentifier;
return this;
}
+
+ @Override
+ public DataContainerNodeBuilder<I, R> addChild(
+ final DataContainerChild<? extends PathArgument, ?> child) {
+ return withChild(child);
+ }
}
import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableDataContainerNode;
import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableMap;
public class ImmutableAugmentationNodeBuilder
extends AbstractImmutableDataContainerNodeBuilder<InstanceIdentifier.AugmentationIdentifier, AugmentationNode> {
@Override
public DataContainerNodeBuilder<InstanceIdentifier.AugmentationIdentifier, AugmentationNode> withChild(
- DataContainerChild<?, ?> child) {
+ final DataContainerChild<?, ?> child) {
// Check nested augments
Preconditions.checkArgument(child instanceof AugmentationNode == false,
"Unable to add: %s, as a child for: %s, Nested augmentations are not permitted", child.getNodeType(),
extends AbstractImmutableDataContainerNode<InstanceIdentifier.AugmentationIdentifier>
implements AugmentationNode {
- ImmutableAugmentationNode(InstanceIdentifier.AugmentationIdentifier nodeIdentifier, Map<InstanceIdentifier.PathArgument, DataContainerChild<? extends InstanceIdentifier.PathArgument, ?>> children) {
- super(children, nodeIdentifier);
+ ImmutableAugmentationNode(final InstanceIdentifier.AugmentationIdentifier nodeIdentifier, final Map<InstanceIdentifier.PathArgument, DataContainerChild<? extends InstanceIdentifier.PathArgument, ?>> children) {
+ super(ImmutableMap.copyOf(children), nodeIdentifier);
}
}
}
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableDataContainerNode;
+import com.google.common.collect.ImmutableMap;
+
public class ImmutableChoiceNodeBuilder extends AbstractImmutableDataContainerNodeBuilder<InstanceIdentifier.NodeIdentifier, ChoiceNode> {
public static DataContainerNodeBuilder<InstanceIdentifier.NodeIdentifier, ChoiceNode> create() {
return new ImmutableChoiceNodeBuilder();
}
+ @Override
public ChoiceNode build() {
return new ImmutableChoiceNode(nodeIdentifier, value);
}
extends AbstractImmutableDataContainerNode<InstanceIdentifier.NodeIdentifier>
implements ChoiceNode {
- ImmutableChoiceNode(InstanceIdentifier.NodeIdentifier nodeIdentifier,
- Map<InstanceIdentifier.PathArgument, DataContainerChild<? extends InstanceIdentifier.PathArgument, ?>> children) {
- super(children, nodeIdentifier);
+ ImmutableChoiceNode(final InstanceIdentifier.NodeIdentifier nodeIdentifier,
+ final Map<InstanceIdentifier.PathArgument, DataContainerChild<? extends InstanceIdentifier.PathArgument, ?>> children) {
+ super(ImmutableMap.copyOf(children), nodeIdentifier);
}
}
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableDataContainerNode;
+import com.google.common.collect.ImmutableMap;
+
public class ImmutableContainerNodeBuilder extends AbstractImmutableDataContainerNodeBuilder<InstanceIdentifier.NodeIdentifier, ContainerNode> {
public static DataContainerNodeBuilder<InstanceIdentifier.NodeIdentifier, ContainerNode> create() {
implements ContainerNode {
ImmutableContainerNode(
- InstanceIdentifier.NodeIdentifier nodeIdentifier,
- Map<InstanceIdentifier.PathArgument, DataContainerChild<? extends InstanceIdentifier.PathArgument, ?>> children) {
- super(children, nodeIdentifier);
+ final InstanceIdentifier.NodeIdentifier nodeIdentifier,
+ final Map<InstanceIdentifier.PathArgument, DataContainerChild<? extends InstanceIdentifier.PathArgument, ?>> children) {
+ super(ImmutableMap.copyOf(children), nodeIdentifier);
}
}
import java.util.List;
import java.util.Map;
+import org.opendaylight.yangtools.concepts.Immutable;
import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument;
import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.ListNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeContainerBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableNormalizedNode;
import com.google.common.base.Optional;
import com.google.common.collect.Maps;
-import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
-public class ImmutableLeafSetNodeBuilder<T>
- implements ListNodeBuilder<T, LeafSetEntryNode<T>> {
+public class ImmutableLeafSetNodeBuilder<T> implements ListNodeBuilder<T, LeafSetEntryNode<T>> {
- protected Map<InstanceIdentifier.NodeWithValue, LeafSetEntryNode<T>> value;
+ protected Map<InstanceIdentifier.NodeWithValue, LeafSetEntryNode<T>> value = Maps.newLinkedHashMap();
protected InstanceIdentifier.NodeIdentifier nodeIdentifier;
public static <T> ListNodeBuilder<T, LeafSetEntryNode<T>> create() {
return new ImmutableLeafSetNodeBuilder<>();
}
- public ListNodeBuilder<T, LeafSetEntryNode<T>> withChild(LeafSetEntryNode<T> child) {
- if(this.value == null) {
- this.value = Maps.newLinkedHashMap();
- }
-
+ @Override
+ public ListNodeBuilder<T, LeafSetEntryNode<T>> withChild(final LeafSetEntryNode<T> child) {
this.value.put(child.getIdentifier(), child);
return this;
}
}
@Override
- public ListNodeBuilder<T, LeafSetEntryNode<T>> withNodeIdentifier(InstanceIdentifier.NodeIdentifier nodeIdentifier) {
+ public ListNodeBuilder<T, LeafSetEntryNode<T>> withNodeIdentifier(
+ final InstanceIdentifier.NodeIdentifier nodeIdentifier) {
this.nodeIdentifier = nodeIdentifier;
return this;
}
@Override
- public ListNodeBuilder<T, LeafSetEntryNode<T>> withValue(List<LeafSetEntryNode<T>> value) {
+ public ListNodeBuilder<T, LeafSetEntryNode<T>> withValue(final List<LeafSetEntryNode<T>> value) {
for (LeafSetEntryNode<T> leafSetEntry : value) {
withChild(leafSetEntry);
}
}
@Override
- public ListNodeBuilder<T, LeafSetEntryNode<T>> withChildValue(T value) {
- return withChild(new ImmutableLeafSetEntryNodeBuilder.ImmutableLeafSetEntryNode<>(new InstanceIdentifier.NodeWithValue(nodeIdentifier.getNodeType(), value), value));
+ public ListNodeBuilder<T, LeafSetEntryNode<T>> withChildValue(final T value) {
+ return withChild(new ImmutableLeafSetEntryNodeBuilder.ImmutableLeafSetEntryNode<>(
+ new InstanceIdentifier.NodeWithValue(nodeIdentifier.getNodeType(), value), value));
}
- final class ImmutableLeafSetNode<T> extends AbstractImmutableNormalizedNode<InstanceIdentifier.NodeIdentifier, Iterable<LeafSetEntryNode<T>>> implements LeafSetNode<T> {
+ private final static class ImmutableLeafSetNode<T> extends
+ AbstractImmutableNormalizedNode<InstanceIdentifier.NodeIdentifier, Iterable<LeafSetEntryNode<T>>> implements
+ Immutable, LeafSetNode<T> {
private final Map<InstanceIdentifier.NodeWithValue, LeafSetEntryNode<T>> mappedChildren;
- ImmutableLeafSetNode(InstanceIdentifier.NodeIdentifier nodeIdentifier, Map<InstanceIdentifier.NodeWithValue, LeafSetEntryNode<T>> children) {
+ ImmutableLeafSetNode(final InstanceIdentifier.NodeIdentifier nodeIdentifier,
+ final Map<InstanceIdentifier.NodeWithValue, LeafSetEntryNode<T>> children) {
super(nodeIdentifier, children.values());
this.mappedChildren = children;
}
@Override
- public Optional<LeafSetEntryNode<T>> getChild(InstanceIdentifier.NodeWithValue child) {
+ public Optional<LeafSetEntryNode<T>> getChild(final InstanceIdentifier.NodeWithValue child) {
return Optional.fromNullable(mappedChildren.get(child));
}
}
}
+ @Override
+ public NormalizedNodeContainerBuilder<NodeIdentifier, PathArgument, LeafSetEntryNode<T>, LeafSetNode<T>> addChild(
+ final LeafSetEntryNode<T> child) {
+ return withChild(child);
+ }
+
}
import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
-import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.valid.DataNodeContainerValidator;
import org.opendaylight.yangtools.yang.data.impl.schema.nodes.AbstractImmutableDataContainerNode;
import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
public class ImmutableMapEntryNodeBuilder
// FIXME, find better solution than 2 maps (map from QName to Child ?)
@Override
- public DataContainerNodeBuilder<InstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode> withValue(List<DataContainerChild<? extends InstanceIdentifier.PathArgument, ?>> value) {
+ public DataContainerNodeBuilder<InstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode> withValue(final List<DataContainerChild<? extends InstanceIdentifier.PathArgument, ?>> value) {
for (DataContainerChild<? extends InstanceIdentifier.PathArgument, ?> childId : value) {
this.childrenQNamesToPaths.put(childId.getNodeType(), childId.getIdentifier());
}
}
@Override
- public DataContainerNodeBuilder<InstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode> withChild(DataContainerChild<?, ?> child) {
+ public DataContainerNodeBuilder<InstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode> withChild(final DataContainerChild<?, ?> child) {
childrenQNamesToPaths.put(child.getNodeType(), child.getIdentifier());
return super.withChild(child);
}
+ @Override
public MapEntryNode build() {
checkKeys();
return new ImmutableMapEntryNode(nodeIdentifier, value);
static final class ImmutableMapEntryNode extends AbstractImmutableDataContainerNode<InstanceIdentifier.NodeIdentifierWithPredicates> implements MapEntryNode {
- ImmutableMapEntryNode(InstanceIdentifier.NodeIdentifierWithPredicates nodeIdentifier,
- Map<InstanceIdentifier.PathArgument, DataContainerChild<? extends InstanceIdentifier.PathArgument, ?>> children) {
- super(children, nodeIdentifier);
+ ImmutableMapEntryNode(final InstanceIdentifier.NodeIdentifierWithPredicates nodeIdentifier,
+ final Map<InstanceIdentifier.PathArgument, DataContainerChild<? extends InstanceIdentifier.PathArgument, ?>> children) {
+ super(ImmutableMap.copyOf(children), nodeIdentifier);
}
}
}
import java.util.List;
import java.util.Map;
+import org.opendaylight.yangtools.concepts.Immutable;
import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
public class ImmutableMapNodeBuilder
implements CollectionNodeBuilder<MapEntryNode, MapNode> {
- protected Map<InstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode> value;
+ protected Map<InstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode> value = Maps.newLinkedHashMap();
protected InstanceIdentifier.NodeIdentifier nodeIdentifier;
public static CollectionNodeBuilder<MapEntryNode, MapNode> create() {
return new ImmutableMapNodeBuilder();
}
- public CollectionNodeBuilder<MapEntryNode, MapNode> withChild(MapEntryNode child) {
- if(this.value == null) {
- this.value = Maps.newLinkedHashMap();
- }
-
+ @Override
+ public CollectionNodeBuilder<MapEntryNode, MapNode> withChild(final MapEntryNode child) {
this.value.put(child.getIdentifier(), child);
return this;
}
@Override
- public CollectionNodeBuilder<MapEntryNode, MapNode> withValue(List<MapEntryNode> value) {
+ public CollectionNodeBuilder<MapEntryNode, MapNode> withValue(final List<MapEntryNode> value) {
// TODO replace or putAll ?
for (MapEntryNode mapEntryNode : value) {
withChild(mapEntryNode);
return this;
}
- public CollectionNodeBuilder<MapEntryNode, MapNode> withNodeIdentifier(InstanceIdentifier.NodeIdentifier nodeIdentifier) {
+ @Override
+ public CollectionNodeBuilder<MapEntryNode, MapNode> withNodeIdentifier(final InstanceIdentifier.NodeIdentifier nodeIdentifier) {
this.nodeIdentifier = nodeIdentifier;
return this;
}
return new ImmutableMapNode(nodeIdentifier, value);
}
- static final class ImmutableMapNode extends AbstractImmutableNormalizedNode<InstanceIdentifier.NodeIdentifier, Iterable<MapEntryNode>> implements MapNode {
+ @Override
+ public CollectionNodeBuilder<MapEntryNode, MapNode> addChild(
+ final MapEntryNode child) {
+ return withChild(child);
+ }
+
+ static final class ImmutableMapNode extends AbstractImmutableNormalizedNode<InstanceIdentifier.NodeIdentifier, Iterable<MapEntryNode>> implements Immutable,MapNode {
private final Map<InstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode> mappedChildren;
- ImmutableMapNode(InstanceIdentifier.NodeIdentifier nodeIdentifier,
- Map<InstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode> children) {
+ ImmutableMapNode(final InstanceIdentifier.NodeIdentifier nodeIdentifier,
+ final Map<InstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode> children) {
super(nodeIdentifier, children.values());
this.mappedChildren = children;
}
@Override
- public Optional<MapEntryNode> getChild(InstanceIdentifier.NodeIdentifierWithPredicates child) {
+ public Optional<MapEntryNode> getChild(final InstanceIdentifier.NodeIdentifierWithPredicates child) {
return Optional.fromNullable(mappedChildren.get(child));
}
import java.util.Map;
-import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
+import org.opendaylight.yangtools.concepts.Immutable;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument;
import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
import com.google.common.base.Optional;
-public abstract class AbstractImmutableDataContainerNode<K extends InstanceIdentifier.PathArgument>
- extends AbstractImmutableNormalizedNode<K, Iterable<DataContainerChild<? extends InstanceIdentifier.PathArgument, ?>>>
- implements DataContainerNode<K> {
+public abstract class AbstractImmutableDataContainerNode<K extends PathArgument> //
+ extends AbstractImmutableNormalizedNode<K, Iterable<DataContainerChild<? extends PathArgument, ?>>> //
+ implements Immutable, DataContainerNode<K> {
- protected Map<InstanceIdentifier.PathArgument, DataContainerChild<? extends InstanceIdentifier.PathArgument, ?>> children;
+ protected final Map<PathArgument, DataContainerChild<? extends PathArgument, ?>> children;
- public AbstractImmutableDataContainerNode(Map<InstanceIdentifier.PathArgument, DataContainerChild<? extends InstanceIdentifier.PathArgument, ?>> children, K nodeIdentifier) {
+ public AbstractImmutableDataContainerNode(
+ final Map<PathArgument, DataContainerChild<? extends PathArgument, ?>> children, final K nodeIdentifier) {
super(nodeIdentifier, children.values());
this.children = children;
}
@Override
- public Optional<DataContainerChild<? extends InstanceIdentifier.PathArgument, ?>> getChild(InstanceIdentifier.PathArgument child) {
- return Optional.<DataContainerChild<? extends InstanceIdentifier.PathArgument, ?>>fromNullable(children.get(child));
+ public final Optional<DataContainerChild<? extends PathArgument, ?>> getChild(final PathArgument child) {
+ return Optional.<DataContainerChild<? extends PathArgument, ?>> fromNullable(children.get(child));
}
@Override
--- /dev/null
+package org.opendaylight.yangtools.yang.data.impl.schema.test;
+
+import static org.junit.Assert.assertNotNull;
+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 org.junit.Test;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.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.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
+
+import com.google.common.base.Optional;
+
+/**
+ *
+ * Schema structure of document is
+ *
+ * <pre>
+ * container root {
+ * list list-a {
+ * key leaf-a;
+ * leaf leaf-a;
+ * choice choice-a {
+ * case one {
+ * leaf one;
+ * }
+ * case two-three {
+ * leaf two;
+ * leaf three;
+ * }
+ * }
+ * list list-b {
+ * key leaf-b;
+ * leaf leaf-b;
+ * }
+ * }
+ * }
+ * </pre>
+ *
+ */
+public class NormalizedNodeUtilsTest {
+
+ private static final QName ROOT_QNAME = QName.create("urn:opendalight:controller:sal:dom:store:test", "2014-03-13",
+ "root");
+ private static final QName LIST_A_QNAME = QName.create(ROOT_QNAME, "list-a");
+ private static final QName LIST_B_QNAME = QName.create(ROOT_QNAME, "list-b");
+ private static final QName CHOICE_A_QNAME = QName.create(ROOT_QNAME, "choice-a");
+ private static final QName LEAF_A_QNAME = QName.create(ROOT_QNAME, "leaf-a");
+ private static final QName LEAF_B_QNAME = QName.create(ROOT_QNAME, "leaf-b");
+ private static final String FOO = "foo";
+ private static final String BAR = "bar";
+ private static final String ONE = "one";
+ private static final String TWO = "two";
+
+ private static final InstanceIdentifier LIST_A_FOO_PATH = InstanceIdentifier.builder()
+ //.node(ROOT_QNAME)
+ .node(LIST_A_QNAME)
+ .nodeWithKey(LIST_A_QNAME, LEAF_A_QNAME, FOO)
+ .build();
+ private static final InstanceIdentifier LIST_B_TWO_PATH = InstanceIdentifier.builder()
+ //.node(ROOT_QNAME)
+ .node(LIST_A_QNAME)
+ .nodeWithKey(LIST_A_QNAME, LEAF_A_QNAME, BAR)
+ .node(LIST_B_QNAME)
+ .nodeWithKey(LIST_B_QNAME,LEAF_B_QNAME,TWO)
+ .build();
+
+ /**
+ * Returns a test document
+ *
+ * <pre>
+ * root
+ * list-a
+ * leaf-a "foo"
+ * list-a
+ * leaf-a "bar"
+ * list-b
+ * leaf-b "one"
+ * list-b
+ * leaf-b "two"
+ *
+ * </pre>
+ *
+ * @return
+ */
+ public NormalizedNode<?, ?> createDocumentOne() {
+ return ImmutableContainerNodeBuilder
+ .create()
+ .withNodeIdentifier(new NodeIdentifier(ROOT_QNAME))
+ .withChild(
+ mapNodeBuilder(LIST_A_QNAME)
+ .withChild(mapEntry(LIST_A_QNAME, LEAF_A_QNAME, FOO))
+ .withChild(
+ mapEntryBuilder(LIST_A_QNAME, LEAF_A_QNAME, BAR).withChild(
+ mapNodeBuilder(LIST_B_QNAME)
+ .withChild(mapEntry(LIST_B_QNAME, LEAF_B_QNAME, ONE))
+ .withChild(mapEntry(LIST_B_QNAME, LEAF_B_QNAME, TWO)).build())
+ .build()).build()).build();
+
+ }
+
+ @Test
+ public void findNodeTest() {
+ NormalizedNode<?, ?> tree = createDocumentOne();
+ assertNotNull(tree);
+
+ Optional<NormalizedNode<?, ?>> listFooResult = NormalizedNodeUtils.findNode(tree, LIST_A_FOO_PATH);
+ assertTrue(listFooResult.isPresent());
+
+ Optional<NormalizedNode<?, ?>> listTwoResult = NormalizedNodeUtils.findNode(tree, LIST_B_TWO_PATH);
+ assertTrue(listTwoResult.isPresent());
+ }
+
+}