--- /dev/null
+/*
+ * Copyright (c) 2016 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.api.schema.tree;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.Preconditions;
+import org.opendaylight.yangtools.concepts.Immutable;
+
+/**
+ * DataTree configuration class.
+ *
+ * TreeConfig supports currently the following options:
+ * <ul>
+ * <li>treeType</li>
+ * <li>enable/disable unique indexes and unique constraint validation</li>
+ * <li>enable/disable mandatory nodes validation</li>
+ * </ul>
+ *
+ * TreeConfig can be easily extended in order to support further data tree
+ * configuration options, like following:
+ * <ul>
+ * <li>enable/disable case exclusion validation</li>
+ * <li>enable/disable other indexes</li>
+ * <li>other schema aware validation options</li>
+ * </ul>
+ *
+ * This can be useful when strict validation is not required or useful for some
+ * reasons.
+ *
+ */
+@Beta
+public class DataTreeConfiguration implements Immutable {
+ public static final DataTreeConfiguration DEFAULT_CONFIGURATION = new DataTreeConfiguration(TreeType.CONFIGURATION,
+ false, true);
+ public static final DataTreeConfiguration DEFAULT_OPERATIONAL = new DataTreeConfiguration(TreeType.OPERATIONAL,
+ false, true);
+
+ private final TreeType treeType;
+ private final boolean uniqueIndexes;
+ private final boolean mandatoryNodesValidation;
+
+ private DataTreeConfiguration(final TreeType treeType, final boolean uniqueIndexes,
+ final boolean mandatoryNodesValidation) {
+ this.treeType = Preconditions.checkNotNull(treeType);
+ this.uniqueIndexes = uniqueIndexes;
+ this.mandatoryNodesValidation = mandatoryNodesValidation;
+ }
+
+ public TreeType getTreeType() {
+ return treeType;
+ }
+
+ public boolean isUniqueIndexEnabled() {
+ return uniqueIndexes;
+ }
+
+ public boolean isMandatoryNodesValidationEnabled() {
+ return mandatoryNodesValidation;
+ }
+
+ public static DataTreeConfiguration getDefault(final TreeType treeType) {
+ Preconditions.checkNotNull(treeType);
+ switch (treeType) {
+ case CONFIGURATION:
+ return DEFAULT_CONFIGURATION;
+ case OPERATIONAL:
+ return DEFAULT_OPERATIONAL;
+ default:
+ return new DataTreeConfiguration(treeType, false, true);
+ }
+ }
+
+ public static class Builder {
+ private final TreeType treeType;
+ private boolean uniqueIndexes;
+ private boolean mandatoryNodesValidation;
+
+ public Builder(final TreeType treeType) {
+ this.treeType = Preconditions.checkNotNull(treeType);
+ }
+
+ public Builder setUniqueIndexes(final boolean uniqueIndexes) {
+ this.uniqueIndexes = uniqueIndexes;
+ return this;
+ }
+
+ public Builder setMandatoryNodesValidation(final boolean mandatoryNodesValidation) {
+ this.mandatoryNodesValidation = mandatoryNodesValidation;
+ return this;
+ }
+
+ public DataTreeConfiguration build() {
+ return new DataTreeConfiguration(treeType, uniqueIndexes, mandatoryNodesValidation);
+ }
+ }
+}
\ No newline at end of file
*/
DataTree create(TreeType type);
+ /**
+ * Create a new data tree.
+ * @param treeConfig
+ * Tree config.
+ *
+ * @return A data tree instance.
+ */
+ DataTree create(DataTreeConfiguration treeConfig);
+
/**
* Create a new data tree rooted at a particular node.
* @param treeType
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
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.tree.TreeType;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
import org.opendaylight.yangtools.yang.model.api.AugmentationTarget;
import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
@Override
public ModificationApplyOperation load(@Nonnull final PathArgument key) {
if (key instanceof AugmentationIdentifier && schema instanceof AugmentationTarget) {
- return SchemaAwareApplyOperation.from(schema, (AugmentationTarget) schema, (AugmentationIdentifier) key, treeType);
+ return SchemaAwareApplyOperation.from(schema, (AugmentationTarget) schema, (AugmentationIdentifier) key, treeConfig);
}
final DataSchemaNode child = schema.getDataChildByName(key.getNodeType());
Preconditions.checkArgument(child != null, "Schema %s does not have a node for child %s", schema, key.getNodeType());
- return SchemaAwareApplyOperation.from(child, treeType);
+ return SchemaAwareApplyOperation.from(child, treeConfig);
}
});
private final T schema;
- private final TreeType treeType;
+ private final DataTreeConfiguration treeConfig;
- protected AbstractDataNodeContainerModificationStrategy(final T schema, final Class<? extends NormalizedNode<?, ?>> nodeClass, final TreeType treeType) {
- super(nodeClass, treeType);
+ protected AbstractDataNodeContainerModificationStrategy(final T schema, final Class<? extends NormalizedNode<?, ?>> nodeClass, final DataTreeConfiguration treeConfig) {
+ super(nodeClass, treeConfig);
this.schema = Preconditions.checkNotNull(schema,"schema");
- this.treeType = Preconditions.checkNotNull(treeType,"treeType");
+ this.treeConfig = Preconditions.checkNotNull(treeConfig,"treeConfig");
}
protected final T getSchema() {
package org.opendaylight.yangtools.yang.data.impl.schema.tree;
import static com.google.common.base.Preconditions.checkArgument;
+
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.base.Verify;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
import org.opendaylight.yangtools.yang.data.api.schema.tree.ModificationType;
import org.opendaylight.yangtools.yang.data.api.schema.tree.ModifiedNodeDoesNotExistException;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.MutableTreeNode;
import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNode;
private final boolean verifyChildrenStructure;
protected AbstractNodeContainerModificationStrategy(final Class<? extends NormalizedNode<?, ?>> nodeClass,
- final TreeType treeType) {
+ final DataTreeConfiguration treeConfig) {
this.nodeClass = Preconditions.checkNotNull(nodeClass , "nodeClass");
- this.verifyChildrenStructure = (treeType == TreeType.CONFIGURATION);
+ this.verifyChildrenStructure = (treeConfig.getTreeType() == TreeType.CONFIGURATION);
}
@SuppressWarnings("rawtypes")
}
@Override
- protected void recursivelyVerifyStructure(NormalizedNode<?, ?> value) {
+ protected void recursivelyVerifyStructure(final NormalizedNode<?, ?> value) {
final NormalizedNodeContainer container = (NormalizedNodeContainer) value;
for (final Object child : container.getValue()) {
checkArgument(child instanceof NormalizedNode);
Verify.verify(value instanceof NormalizedNodeContainer, "Attempted to merge non-container %s", value);
@SuppressWarnings({"unchecked", "rawtypes"})
final Collection<NormalizedNode<?, ?>> children = ((NormalizedNodeContainer) value).getValue();
- for (NormalizedNode<?, ?> c : children) {
+ for (final NormalizedNode<?, ?> c : children) {
final PathArgument id = c.getIdentifier();
modification.modifyChild(id, resolveChildOperation(id), version);
}
private void mergeChildrenIntoModification(final ModifiedNode modification,
final Collection<NormalizedNode<?, ?>> children, final Version version) {
- for (NormalizedNode<?, ?> c : children) {
+ for (final NormalizedNode<?, ?> c : children) {
final ModificationApplyOperation childOp = resolveChildOperation(c.getIdentifier());
final ModifiedNode childNode = modification.modifyChild(c.getIdentifier(), childOp, version);
childOp.mergeIntoModifiedNode(childNode, c, version);
import java.util.Set;
import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableAugmentationNodeBuilder;
import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
import org.opendaylight.yangtools.yang.model.util.EffectiveAugmentationSchema;
final class AugmentationModificationStrategy extends AbstractDataNodeContainerModificationStrategy<AugmentationSchema> {
- AugmentationModificationStrategy(final AugmentationSchema schema, final DataNodeContainer resolved, final TreeType treeType) {
- super(createAugmentProxy(schema,resolved), AugmentationNode.class, treeType);
+ AugmentationModificationStrategy(final AugmentationSchema schema, final DataNodeContainer resolved, final DataTreeConfiguration treeConfig) {
+ super(createAugmentProxy(schema,resolved), AugmentationNode.class, treeConfig);
}
@Override
}
@Override
- protected NormalizedNode<?, ?> createEmptyValue(NormalizedNode<?, ?> original) {
+ protected NormalizedNode<?, ?> createEmptyValue(final NormalizedNode<?, ?> original) {
checkArgument(original instanceof AugmentationNode);
return ImmutableAugmentationNodeBuilder.create()
.withNodeIdentifier(((AugmentationNode) original).getIdentifier()).build();
import org.opendaylight.yangtools.concepts.Immutable;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
this.enforcer = Preconditions.checkNotNull(enforcer);
}
- static CaseEnforcer forTree(final ChoiceCaseNode schema, final TreeType type) {
+ static CaseEnforcer forTree(final ChoiceCaseNode schema, final DataTreeConfiguration treeConfig) {
+ final TreeType type = treeConfig.getTreeType();
final Builder<NodeIdentifier, DataSchemaNode> builder = ImmutableMap.builder();
if (SchemaAwareApplyOperation.belongsToTree(type, schema)) {
- for (DataSchemaNode child : schema.getChildNodes()) {
+ for (final DataSchemaNode child : schema.getChildNodes()) {
if (SchemaAwareApplyOperation.belongsToTree(type, child)) {
builder.put(NodeIdentifier.create(child.getQName()), child);
}
}
final Map<NodeIdentifier, DataSchemaNode> children = builder.build();
- return children.isEmpty() ? null : new CaseEnforcer(children, MandatoryLeafEnforcer.forContainer(schema, type));
+ return children.isEmpty() ? null : new CaseEnforcer(children, MandatoryLeafEnforcer.forContainer(schema,
+ treeConfig));
}
Set<Entry<NodeIdentifier, DataSchemaNode>> getChildEntries() {
import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
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.TreeType;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
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.builder.api.DataContainerNodeBuilder;
private final Map<CaseEnforcer, Collection<CaseEnforcer>> exclusions;
private final Map<PathArgument, CaseEnforcer> caseEnforcers;
- ChoiceModificationStrategy(final ChoiceSchemaNode schemaNode, final TreeType treeType) {
- super(ChoiceNode.class, treeType);
+ ChoiceModificationStrategy(final ChoiceSchemaNode schemaNode, final DataTreeConfiguration treeConfig) {
+ super(ChoiceNode.class, treeConfig);
final Builder<PathArgument, ModificationApplyOperation> childBuilder = ImmutableMap.builder();
final Builder<PathArgument, CaseEnforcer> enforcerBuilder = ImmutableMap.builder();
for (final ChoiceCaseNode caze : schemaNode.getCases()) {
- final CaseEnforcer enforcer = CaseEnforcer.forTree(caze, treeType);
+ final CaseEnforcer enforcer = CaseEnforcer.forTree(caze, treeConfig);
if (enforcer != null) {
for (final Entry<NodeIdentifier, DataSchemaNode> e : enforcer.getChildEntries()) {
- childBuilder.put(e.getKey(), SchemaAwareApplyOperation.from(e.getValue(), treeType));
+ childBuilder.put(e.getKey(), SchemaAwareApplyOperation.from(e.getValue(), treeConfig));
enforcerBuilder.put(e.getKey(), enforcer);
}
}
caseEnforcers = enforcerBuilder.build();
final Map<CaseEnforcer, Collection<CaseEnforcer>> exclusionsBuilder = new HashMap<>();
- for (CaseEnforcer e : caseEnforcers.values()) {
+ for (final CaseEnforcer e : caseEnforcers.values()) {
exclusionsBuilder.put(e, ImmutableList.copyOf(
Collections2.filter(caseEnforcers.values(), Predicates.not(Predicates.equalTo(e)))));
}
Verify.verifyNotNull(enforcer, "Case enforcer cannot be null. Most probably, child node %s of choice node %s does not belong in current tree type.", firstChild.getIdentifier(), normalizedNode.getIdentifier());
// Make sure no leaves from other cases are present
- for (CaseEnforcer other : exclusions.get(enforcer)) {
- for (NodeIdentifier id : other.getChildIdentifiers()) {
+ for (final CaseEnforcer other : exclusions.get(enforcer)) {
+ for (final NodeIdentifier id : other.getChildIdentifiers()) {
final Optional<NormalizedNode<?, ?>> maybeChild = NormalizedNodes.getDirectChild(normalizedNode, id);
Preconditions.checkArgument(!maybeChild.isPresent(),
"Child %s (from case %s) implies non-presence of child %s (from case %s), which is %s",
}
@Override
- protected NormalizedNode<?, ?> createEmptyValue(NormalizedNode<?, ?> original) {
+ protected NormalizedNode<?, ?> createEmptyValue(final NormalizedNode<?, ?> original) {
checkArgument(original instanceof ChoiceNode);
return ImmutableChoiceNodeBuilder.create().withNodeIdentifier(((ChoiceNode) original).getIdentifier()).build();
}
import com.google.common.base.Preconditions;
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
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.model.api.ContainerSchemaNode;
* and by {@link StructuralContainerModificationStrategy} as a delegate.
*/
class ContainerModificationStrategy extends AbstractDataNodeContainerModificationStrategy<ContainerSchemaNode> {
- ContainerModificationStrategy(final ContainerSchemaNode schemaNode, final TreeType treeType) {
- super(schemaNode, ContainerNode.class, treeType);
+ ContainerModificationStrategy(final ContainerSchemaNode schemaNode, final DataTreeConfiguration treeConfig) {
+ super(schemaNode, ContainerNode.class, treeConfig);
}
@Override
}
@Override
- protected NormalizedNode<?, ?> createEmptyValue(NormalizedNode<?, ?> original) {
+ protected NormalizedNode<?, ?> createEmptyValue(final NormalizedNode<?, ?> original) {
Preconditions.checkArgument(original instanceof ContainerNode);
return ImmutableContainerNodeBuilder.create().withNodeIdentifier(((ContainerNode) original).getIdentifier())
.build();
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodes;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
import org.opendaylight.yangtools.yang.data.api.schema.tree.TipProducingDataTree;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNode;
import org.opendaylight.yangtools.yang.data.util.DataSchemaContextNode;
private static final Logger LOG = LoggerFactory.getLogger(InMemoryDataTree.class);
private final YangInstanceIdentifier rootPath;
- private final TreeType treeType;
+ private final DataTreeConfiguration treeConfig;
/**
* Current data store state generation.
private volatile DataTreeState state;
public InMemoryDataTree(final TreeNode rootNode, final TreeType treeType, final YangInstanceIdentifier rootPath, final SchemaContext schemaContext) {
- this.treeType = Preconditions.checkNotNull(treeType, "treeType");
+ this(rootNode, DataTreeConfiguration.getDefault(treeType), rootPath, schemaContext);
+ }
+
+ public InMemoryDataTree(final TreeNode rootNode, final DataTreeConfiguration treeConfig, final YangInstanceIdentifier rootPath, final SchemaContext schemaContext) {
+ this.treeConfig = Preconditions.checkNotNull(treeConfig, "treeConfig");
this.rootPath = Preconditions.checkNotNull(rootPath, "rootPath");
state = DataTreeState.createInitial(rootNode);
if (schemaContext != null) {
final ModificationApplyOperation rootNode;
if (rootSchemaNode instanceof ContainerSchemaNode) {
// FIXME: real root needs to enfore presence, but that require pre-population
- rootNode = new ContainerModificationStrategy((ContainerSchemaNode) rootSchemaNode, treeType);
+ rootNode = new ContainerModificationStrategy((ContainerSchemaNode) rootSchemaNode, treeConfig);
} else {
- rootNode = SchemaAwareApplyOperation.from(rootSchemaNode, treeType);
+ rootNode = SchemaAwareApplyOperation.from(rootSchemaNode, treeConfig);
}
DataTreeState currentState, newState;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeFactory;
import org.opendaylight.yangtools.yang.data.api.schema.tree.TipProducingDataTree;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNodeFactory;
import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.Version;
treeType, YangInstanceIdentifier.EMPTY, null);
}
+ @Override
+ public TipProducingDataTree create(final DataTreeConfiguration treeConfig) {
+ return new InMemoryDataTree(TreeNodeFactory.createTreeNode(rootContainer, Version.initial()),
+ treeConfig, YangInstanceIdentifier.EMPTY, null);
+ }
+
@Override
public TipProducingDataTree create(final TreeType treeType, final YangInstanceIdentifier rootPath) {
if (rootPath.isEmpty()) {
package org.opendaylight.yangtools.yang.data.impl.schema.tree;
import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
final class LeafModificationStrategy extends AbstractValueNodeModificationStrategy<LeafSchemaNode> {
@SuppressWarnings({ "unchecked", "rawtypes" })
- LeafModificationStrategy(final LeafSchemaNode schema, final TreeType treeType) {
+ LeafModificationStrategy(final LeafSchemaNode schema) {
super(schema, (Class) LeafNode.class);
}
}
\ No newline at end of file
package org.opendaylight.yangtools.yang.data.impl.schema.tree;
import static com.google.common.base.Preconditions.checkArgument;
+
import com.google.common.base.Optional;
import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
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.builder.api.DataContainerNodeBuilder;
final class ListEntryModificationStrategy extends AbstractDataNodeContainerModificationStrategy<ListSchemaNode> {
private final MandatoryLeafEnforcer enforcer;
- ListEntryModificationStrategy(final ListSchemaNode schema, final TreeType treeType) {
- super(schema, MapEntryNode.class, treeType);
- enforcer = MandatoryLeafEnforcer.forContainer(schema, treeType);
+ ListEntryModificationStrategy(final ListSchemaNode schema, final DataTreeConfiguration treeConfig) {
+ super(schema, MapEntryNode.class, treeConfig);
+ enforcer = MandatoryLeafEnforcer.forContainer(schema, treeConfig);
}
@Override
}
@Override
- protected NormalizedNode<?, ?> createEmptyValue(NormalizedNode<?, ?> original) {
+ protected NormalizedNode<?, ?> createEmptyValue(final NormalizedNode<?, ?> original) {
checkArgument(original instanceof MapEntryNode);
return ImmutableMapEntryNodeBuilder.create().withNodeIdentifier(((MapEntryNode) original).getIdentifier())
.build();
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
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.DataTreeConfiguration;
import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNode;
import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition;
@Override
protected void enforceOnTreeNode(final NormalizedNode<?, ?> data) {
- for (YangInstanceIdentifier id : mandatoryNodes) {
+ for (final YangInstanceIdentifier id : mandatoryNodes) {
final Optional<NormalizedNode<?, ?>> descandant = NormalizedNodes.findNode(data, id);
Preconditions.checkArgument(descandant.isPresent(), "Node %s is missing mandatory descendant %s",
data.getIdentifier(), id);
private static void findMandatoryNodes(final Builder<YangInstanceIdentifier> builder,
final YangInstanceIdentifier id, final DataNodeContainer schema, final TreeType type) {
- for (DataSchemaNode child : schema.getChildNodes()) {
+ for (final DataSchemaNode child : schema.getChildNodes()) {
if (SchemaAwareApplyOperation.belongsToTree(type, child)) {
if (child instanceof ContainerSchemaNode) {
final ContainerSchemaNode container = (ContainerSchemaNode) child;
}
}
- static MandatoryLeafEnforcer forContainer(final DataNodeContainer schema, final TreeType type) {
- switch (type) {
+ static MandatoryLeafEnforcer forContainer(final DataNodeContainer schema, final DataTreeConfiguration treeConfig) {
+ if (!treeConfig.isMandatoryNodesValidationEnabled()) {
+ return NOOP_ENFORCER;
+ }
+ final TreeType treeType = treeConfig.getTreeType();
+ switch (treeType) {
case CONFIGURATION:
final Builder<YangInstanceIdentifier> builder = ImmutableList.builder();
- findMandatoryNodes(builder, YangInstanceIdentifier.EMPTY, schema, type);
+ findMandatoryNodes(builder, YangInstanceIdentifier.EMPTY, schema, treeType);
final Collection<YangInstanceIdentifier> mandatoryNodes = builder.build();
return mandatoryNodes.isEmpty() ? NOOP_ENFORCER : new Strict(mandatoryNodes);
case OPERATIONAL:
return NOOP_ENFORCER;
default:
- throw new UnsupportedOperationException(String.format("Not supported tree type %s", type));
+ throw new UnsupportedOperationException(String.format("Not supported tree type %s", treeType));
}
}
}
import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.api.schema.OrderedLeafSetNode;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeContainerBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableOrderedLeafSetNodeBuilder;
import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
private final Optional<ModificationApplyOperation> entryStrategy;
@SuppressWarnings({ "unchecked", "rawtypes" })
- OrderedLeafSetModificationStrategy(final LeafListSchemaNode schema, final TreeType treeType) {
- super((Class) LeafSetNode.class, treeType);
+ OrderedLeafSetModificationStrategy(final LeafListSchemaNode schema, final DataTreeConfiguration treeConfig) {
+ super((Class) LeafSetNode.class, treeConfig);
entryStrategy = Optional.of(new LeafSetEntryModificationStrategy(schema));
}
}
@Override
- protected NormalizedNode<?, ?> createEmptyValue(NormalizedNode<?, ?> original) {
+ protected NormalizedNode<?, ?> createEmptyValue(final NormalizedNode<?, ?> original) {
checkArgument(original instanceof OrderedLeafSetNode<?>);
return ImmutableOrderedLeafSetNodeBuilder.create()
.withNodeIdentifier(((OrderedLeafSetNode<?>) original).getIdentifier()).build();
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.OrderedMapNode;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeContainerBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableOrderedMapNodeBuilder;
import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
final class OrderedMapModificationStrategy extends AbstractNodeContainerModificationStrategy {
private final Optional<ModificationApplyOperation> entryStrategy;
- OrderedMapModificationStrategy(final ListSchemaNode schema, final TreeType treeType) {
- super(OrderedMapNode.class, treeType);
- entryStrategy = Optional.of(new ListEntryModificationStrategy(schema, treeType));
+ OrderedMapModificationStrategy(final ListSchemaNode schema, final DataTreeConfiguration treeConfig) {
+ super(OrderedMapNode.class, treeConfig);
+ entryStrategy = Optional.of(new ListEntryModificationStrategy(schema, treeConfig));
}
@Override
}
@Override
- protected NormalizedNode<?, ?> createEmptyValue(NormalizedNode<?, ?> original) {
+ protected NormalizedNode<?, ?> createEmptyValue(final NormalizedNode<?, ?> original) {
checkArgument(original instanceof OrderedMapNode);
return ImmutableOrderedMapNodeBuilder.create().withNodeIdentifier(((OrderedMapNode) original).getIdentifier())
.build();
import com.google.common.base.Optional;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
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.model.api.ContainerSchemaNode;
final class PresenceContainerModificationStrategy extends ContainerModificationStrategy {
private final MandatoryLeafEnforcer enforcer;
- PresenceContainerModificationStrategy(final ContainerSchemaNode schemaNode, final TreeType treeType) {
- super(schemaNode, treeType);
- enforcer = MandatoryLeafEnforcer.forContainer(schemaNode, treeType);
+ PresenceContainerModificationStrategy(final ContainerSchemaNode schemaNode, final DataTreeConfiguration treeConfig) {
+ super(schemaNode, treeConfig);
+ enforcer = MandatoryLeafEnforcer.forContainer(schemaNode, treeConfig);
}
@Override
import org.opendaylight.yangtools.yang.data.api.schema.tree.ConflictingModificationAppliedException;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
import org.opendaylight.yangtools.yang.data.api.schema.tree.ModificationType;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNode;
import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.Version;
abstract class SchemaAwareApplyOperation extends ModificationApplyOperation {
private static final Logger LOG = LoggerFactory.getLogger(SchemaAwareApplyOperation.class);
- public static ModificationApplyOperation from(final DataSchemaNode schemaNode, final TreeType treeType) {
- if (treeType == TreeType.CONFIGURATION) {
+ public static ModificationApplyOperation from(final DataSchemaNode schemaNode, final DataTreeConfiguration treeConfig) {
+ if (treeConfig.getTreeType() == TreeType.CONFIGURATION) {
Preconditions.checkArgument(schemaNode.isConfiguration(), "Supplied %s does not belongs to configuration tree.", schemaNode.getPath());
}
if (schemaNode instanceof ContainerSchemaNode) {
final ContainerSchemaNode containerSchema = (ContainerSchemaNode) schemaNode;
if (containerSchema.isPresenceContainer()) {
- return new PresenceContainerModificationStrategy(containerSchema, treeType);
+ return new PresenceContainerModificationStrategy(containerSchema, treeConfig);
} else {
- return new StructuralContainerModificationStrategy(containerSchema, treeType);
+ return new StructuralContainerModificationStrategy(containerSchema, treeConfig);
}
} else if (schemaNode instanceof ListSchemaNode) {
- return fromListSchemaNode((ListSchemaNode) schemaNode, treeType);
+ return fromListSchemaNode((ListSchemaNode) schemaNode, treeConfig);
} else if (schemaNode instanceof ChoiceSchemaNode) {
- return new ChoiceModificationStrategy((ChoiceSchemaNode) schemaNode, treeType);
+ return new ChoiceModificationStrategy((ChoiceSchemaNode) schemaNode, treeConfig);
} else if (schemaNode instanceof LeafListSchemaNode) {
- return fromLeafListSchemaNode((LeafListSchemaNode) schemaNode, treeType);
+ return fromLeafListSchemaNode((LeafListSchemaNode) schemaNode, treeConfig);
} else if (schemaNode instanceof LeafSchemaNode) {
- return new LeafModificationStrategy((LeafSchemaNode) schemaNode, treeType);
+ return new LeafModificationStrategy((LeafSchemaNode) schemaNode);
}
throw new IllegalArgumentException("Not supported schema node type for " + schemaNode.getClass());
}
public static SchemaAwareApplyOperation from(final DataNodeContainer resolvedTree,
- final AugmentationTarget augSchemas, final AugmentationIdentifier identifier, final TreeType treeType) {
+ final AugmentationTarget augSchemas, final AugmentationIdentifier identifier, final DataTreeConfiguration treeConfig) {
for (final AugmentationSchema potential : augSchemas.getAvailableAugmentations()) {
for (final DataSchemaNode child : potential.getChildNodes()) {
if (identifier.getPossibleChildNames().contains(child.getQName())) {
- return new AugmentationModificationStrategy(potential, resolvedTree, treeType);
+ return new AugmentationModificationStrategy(potential, resolvedTree, treeConfig);
}
}
}
}
}
- private static SchemaAwareApplyOperation fromListSchemaNode(final ListSchemaNode schemaNode, final TreeType treeType) {
+ private static SchemaAwareApplyOperation fromListSchemaNode(final ListSchemaNode schemaNode, final DataTreeConfiguration treeConfig) {
final List<QName> keyDefinition = schemaNode.getKeyDefinition();
final SchemaAwareApplyOperation op;
if (keyDefinition == null || keyDefinition.isEmpty()) {
- op = new UnkeyedListModificationStrategy(schemaNode, treeType);
+ op = new UnkeyedListModificationStrategy(schemaNode, treeConfig);
} else if (schemaNode.isUserOrdered()) {
- op = new OrderedMapModificationStrategy(schemaNode, treeType);
+ op = new OrderedMapModificationStrategy(schemaNode, treeConfig);
} else {
- op = new UnorderedMapModificationStrategy(schemaNode, treeType);
+ op = new UnorderedMapModificationStrategy(schemaNode, treeConfig);
}
return MinMaxElementsValidation.from(op, schemaNode);
}
- private static SchemaAwareApplyOperation fromLeafListSchemaNode(final LeafListSchemaNode schemaNode, final TreeType treeType) {
+ private static SchemaAwareApplyOperation fromLeafListSchemaNode(final LeafListSchemaNode schemaNode, final DataTreeConfiguration treeConfig) {
final SchemaAwareApplyOperation op;
if (schemaNode.isUserOrdered()) {
- op = new OrderedLeafSetModificationStrategy(schemaNode, treeType);
+ op = new OrderedLeafSetModificationStrategy(schemaNode, treeConfig);
} else {
- op = new UnorderedLeafSetModificationStrategy(schemaNode, treeType);
+ op = new UnorderedLeafSetModificationStrategy(schemaNode, treeConfig);
}
return MinMaxElementsValidation.from(op, schemaNode);
}
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
import org.opendaylight.yangtools.yang.data.api.schema.tree.ModificationType;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNode;
import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNodeFactory;
import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.Version;
private static final Version FAKE_VERSION = Version.initial();
private final ContainerModificationStrategy delegate;
- StructuralContainerModificationStrategy(final ContainerSchemaNode schemaNode, final TreeType treeType) {
- this.delegate = new ContainerModificationStrategy(schemaNode, treeType);
+ StructuralContainerModificationStrategy(final ContainerSchemaNode schemaNode, final DataTreeConfiguration treeConfig) {
+ this.delegate = new ContainerModificationStrategy(schemaNode, treeConfig);
}
private Optional<TreeNode> fakeMeta(final Version version) {
}
@Override
- void recursivelyVerifyStructure(NormalizedNode<?, ?> value) {
+ void recursivelyVerifyStructure(final NormalizedNode<?, ?> value) {
delegate.recursivelyVerifyStructure(value);
}
}
@Override
- void mergeIntoModifiedNode(ModifiedNode modification, NormalizedNode<?, ?> value, Version version) {
+ void mergeIntoModifiedNode(final ModifiedNode modification, final NormalizedNode<?, ?> value, final Version version) {
delegate.mergeIntoModifiedNode(modification, value, version);
}
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableUnkeyedListEntryNodeBuilder;
import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
final class UnkeyedListItemModificationStrategy extends AbstractDataNodeContainerModificationStrategy<ListSchemaNode> {
- UnkeyedListItemModificationStrategy(final ListSchemaNode schemaNode, final TreeType treeType) {
- super(schemaNode, UnkeyedListEntryNode.class, treeType);
+ UnkeyedListItemModificationStrategy(final ListSchemaNode schemaNode, final DataTreeConfiguration treeConfig) {
+ super(schemaNode, UnkeyedListEntryNode.class, treeConfig);
}
@Override
}
@Override
- protected NormalizedNode<?, ?> createEmptyValue(NormalizedNode<?, ?> original) {
+ protected NormalizedNode<?, ?> createEmptyValue(final NormalizedNode<?, ?> original) {
checkArgument(original instanceof UnkeyedListEntryNode);
return ImmutableUnkeyedListEntryNodeBuilder.create()
.withNodeIdentifier(((UnkeyedListEntryNode) original).getIdentifier()).build();
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.tree.IncorrectDataStructureException;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.MutableTreeNode;
import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNode;
import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNodeFactory;
private final Optional<ModificationApplyOperation> entryStrategy;
- UnkeyedListModificationStrategy(final ListSchemaNode schema, final TreeType treeType) {
- entryStrategy = Optional.of(new UnkeyedListItemModificationStrategy(schema, treeType));
+ UnkeyedListModificationStrategy(final ListSchemaNode schema, final DataTreeConfiguration treeConfig) {
+ entryStrategy = Optional.of(new UnkeyedListItemModificationStrategy(schema, treeConfig));
}
@Override
}
@Override
- void recursivelyVerifyStructure(NormalizedNode<?, ?> value) {
+ void recursivelyVerifyStructure(final NormalizedNode<?, ?> value) {
// NOOP
}
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeContainerBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafSetNodeBuilder;
import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
private final Optional<ModificationApplyOperation> entryStrategy;
@SuppressWarnings({ "unchecked", "rawtypes" })
- UnorderedLeafSetModificationStrategy(final LeafListSchemaNode schema, final TreeType treeType) {
- super((Class) LeafSetNode.class, treeType);
+ UnorderedLeafSetModificationStrategy(final LeafListSchemaNode schema, final DataTreeConfiguration treeConfig) {
+ super((Class) LeafSetNode.class, treeConfig);
entryStrategy = Optional.of(new LeafSetEntryModificationStrategy(schema));
}
}
@Override
- protected NormalizedNode<?, ?> createEmptyValue(NormalizedNode<?, ?> original) {
+ protected NormalizedNode<?, ?> createEmptyValue(final NormalizedNode<?, ?> original) {
checkArgument(original instanceof LeafSetNode<?>);
return ImmutableLeafSetNodeBuilder.create().withNodeIdentifier(((LeafSetNode<?>) original).getIdentifier())
.build();
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeContainerBuilder;
import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableMapNodeBuilder;
import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
final class UnorderedMapModificationStrategy extends AbstractNodeContainerModificationStrategy {
private final Optional<ModificationApplyOperation> entryStrategy;
- UnorderedMapModificationStrategy(final ListSchemaNode schema, final TreeType treeType) {
- super(MapNode.class, treeType);
- entryStrategy = Optional.of(new ListEntryModificationStrategy(schema, treeType));
+ UnorderedMapModificationStrategy(final ListSchemaNode schema, final DataTreeConfiguration treeConfig) {
+ super(MapNode.class, treeConfig);
+ entryStrategy = Optional.of(new ListEntryModificationStrategy(schema, treeConfig));
}
@SuppressWarnings("rawtypes")
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.tree.DataTreeCandidate;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException;
import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
assertNotNull("Schema context must not be null.", schemaContext);
}
- private InMemoryDataTree initDataTree() {
- InMemoryDataTree inMemoryDataTree = (InMemoryDataTree) InMemoryDataTreeFactory.getInstance().create(
- TreeType.CONFIGURATION);
+ private InMemoryDataTree initDataTree(final boolean enableValidation) {
+ final InMemoryDataTree inMemoryDataTree = (InMemoryDataTree) InMemoryDataTreeFactory.getInstance().create(
+ new DataTreeConfiguration.Builder(TreeType.CONFIGURATION).setMandatoryNodesValidation(enableValidation)
+ .build());
inMemoryDataTree.setSchemaContext(schemaContext);
return inMemoryDataTree;
}
@Test
public void testCorrectMandatoryLeafWrite() throws DataValidationFailedException {
- final InMemoryDataTree inMemoryDataTree = initDataTree();
+ final InMemoryDataTree inMemoryDataTree = initDataTree(true);
final NodeIdentifier choice1Id = new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "choice1"));
final ContainerNode container = Builders
@Test
public void testCorrectMandatoryLeafChoiceWrite() throws DataValidationFailedException {
- final InMemoryDataTree inMemoryDataTree = initDataTree();
+ final InMemoryDataTree inMemoryDataTree = initDataTree(true);
// Container write
final ContainerNode container = Builders.containerBuilder()
.withNodeIdentifier(new NodeIdentifier(TestModel.TEST_QNAME)).build();
@Test(expected = IllegalArgumentException.class)
public void testMandatoryLeafViolation() throws DataValidationFailedException {
- final InMemoryDataTree inMemoryDataTree = initDataTree();
+ final InMemoryDataTree inMemoryDataTree = initDataTree(true);
final NodeIdentifier choice1Id = new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "choice1"));
final ContainerNode container = Builders
inMemoryDataTree.validate(modificationTree);
final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
inMemoryDataTree.commit(prepare);
- } catch (IllegalArgumentException e) {
+ } catch (final IllegalArgumentException e) {
assertEquals(
"Node (urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:store:test?revision=2014-03-13)choice1 is missing mandatory descendant /(urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:store:test?revision=2014-03-13)case2-cont/case2-leaf1",
e.getMessage());
}
}
+ @Test
+ public void testDisabledValidation() throws DataValidationFailedException {
+ final InMemoryDataTree inMemoryDataTree = initDataTree(false);
+ final NodeIdentifier choice1Id = new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "choice1"));
+
+ final ContainerNode container = Builders
+ .containerBuilder()
+ .withNodeIdentifier(new NodeIdentifier(TestModel.TEST_QNAME))
+ .withChild(
+ Builders.choiceBuilder()
+ .withNodeIdentifier(choice1Id)
+ .withChild(
+ Builders.containerBuilder()
+ .withNodeIdentifier(
+ new NodeIdentifier(QName.create(TestModel.TEST_QNAME,
+ "case2-cont")))
+ .withChild(
+ leafNode(QName.create(TestModel.TEST_QNAME, "case2-leaf2"),
+ "leaf-value2")).build()).build()).build();
+ final InMemoryDataTreeModification modificationTree = inMemoryDataTree.takeSnapshot().newModification();
+ modificationTree.write(TestModel.TEST_PATH, container);
+ modificationTree.ready();
+
+ inMemoryDataTree.validate(modificationTree);
+ final DataTreeCandidate prepare = inMemoryDataTree.prepare(modificationTree);
+ inMemoryDataTree.commit(prepare);
+ }
+
@Test(expected = IllegalArgumentException.class)
public void testMandatoryLeafViolationChoiceWrite() throws DataValidationFailedException {
- final InMemoryDataTree inMemoryDataTree = initDataTree();
+ final InMemoryDataTree inMemoryDataTree = initDataTree(true);
// Container write
final ContainerNode container = Builders.containerBuilder()
.withNodeIdentifier(new NodeIdentifier(TestModel.TEST_QNAME)).build();
inMemoryDataTree.validate(modificationTree2);
final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
inMemoryDataTree.commit(prepare2);
- } catch (IllegalArgumentException e) {
+ } catch (final IllegalArgumentException e) {
assertEquals(
"Node (urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:store:test?revision=2014-03-13)choice1 is missing mandatory descendant /(urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:store:test?revision=2014-03-13)case2-cont/case2-leaf1",
e.getMessage());
throw e;
}
}
+
+ @Test
+ public void testDisabledValidationChoiceWrite() throws DataValidationFailedException {
+ final InMemoryDataTree inMemoryDataTree = initDataTree(false);
+ // Container write
+ final ContainerNode container = Builders.containerBuilder()
+ .withNodeIdentifier(new NodeIdentifier(TestModel.TEST_QNAME)).build();
+
+ final InMemoryDataTreeModification modificationTree1 = inMemoryDataTree.takeSnapshot().newModification();
+ modificationTree1.write(TestModel.TEST_PATH, container);
+ modificationTree1.ready();
+
+ inMemoryDataTree.validate(modificationTree1);
+ final DataTreeCandidate prepare1 = inMemoryDataTree.prepare(modificationTree1);
+ inMemoryDataTree.commit(prepare1);
+
+ // Choice write
+ final NodeIdentifier choice1Id = new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "choice1"));
+ final ChoiceNode choice = Builders
+ .choiceBuilder()
+ .withNodeIdentifier(choice1Id)
+ .withChild(
+ Builders.containerBuilder()
+ .withNodeIdentifier(
+ new NodeIdentifier(QName.create(TestModel.TEST_QNAME, "case2-cont")))
+ .withChild(leafNode(QName.create(TestModel.TEST_QNAME, "case2-leaf2"), "leaf-value2"))
+ .build()).build();
+
+ final InMemoryDataTreeModification modificationTree2 = inMemoryDataTree.takeSnapshot().newModification();
+ modificationTree2.write(TestModel.TEST_PATH.node(choice1Id), choice);
+ modificationTree2.ready();
+ inMemoryDataTree.validate(modificationTree2);
+ final DataTreeCandidate prepare2 = inMemoryDataTree.prepare(modificationTree2);
+ inMemoryDataTree.commit(prepare2);
+ }
}
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.Before;
import org.junit.Test;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree;
import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNodeFactory;
import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.Version;
public void prepare() throws ReactorException {
schemaContext = TestModel.createTestContext();
assertNotNull("Schema context must not be null.", schemaContext);
- rootOper = RootModificationApplyOperation.from(SchemaAwareApplyOperation.from(schemaContext, TreeType.OPERATIONAL));
+ rootOper = RootModificationApplyOperation.from(SchemaAwareApplyOperation.from(schemaContext, DataTreeConfiguration.DEFAULT_OPERATIONAL));
}
/**
import static org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes.mapNodeBuilder;
import com.google.common.base.Optional;
-
import java.util.Map;
-
import org.junit.Before;
import org.junit.Test;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
import org.opendaylight.yangtools.yang.data.api.schema.tree.StoreTreeNodes;
-import org.opendaylight.yangtools.yang.data.api.schema.tree.TreeType;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeConfiguration;
import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNode;
import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNodeFactory;
import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.Version;
public void prepare() throws ReactorException {
schemaContext = TestModel.createTestContext();
assertNotNull("Schema context must not be null.", schemaContext);
- rootOper = RootModificationApplyOperation.from(SchemaAwareApplyOperation.from(schemaContext, TreeType.OPERATIONAL));
+ rootOper = RootModificationApplyOperation.from(SchemaAwareApplyOperation.from(schemaContext, DataTreeConfiguration.DEFAULT_OPERATIONAL));
}
public NormalizedNode<?, ?> createDocumentOne() {