X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-data-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fdata%2Fimpl%2Fschema%2Ftree%2FSchemaAwareApplyOperation.java;h=e721221ee9249db083d16bb9c0fffdd4c1ede5a7;hb=feee4ab29bdac297faec390c145cebe8f142385c;hp=d0a0bcd33fe9d7d82df72dedd2700be4fc3f62e7;hpb=dc9e811389fe7fb7c9de0092df1f2b025fdd9dcf;p=yangtools.git diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/SchemaAwareApplyOperation.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/SchemaAwareApplyOperation.java index d0a0bcd33f..e721221ee9 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/SchemaAwareApplyOperation.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/SchemaAwareApplyOperation.java @@ -9,10 +9,10 @@ package org.opendaylight.yangtools.yang.data.impl.schema.tree; import com.google.common.base.Optional; import com.google.common.base.Preconditions; +import java.util.List; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; 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.ConflictingModificationAppliedException; @@ -20,7 +20,6 @@ import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailed import org.opendaylight.yangtools.yang.data.api.schema.tree.IncorrectDataStructureException; import org.opendaylight.yangtools.yang.data.api.schema.tree.ModificationType; 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; import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; import org.opendaylight.yangtools.yang.model.api.AugmentationTarget; @@ -34,8 +33,6 @@ import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.List; - abstract class SchemaAwareApplyOperation implements ModificationApplyOperation { private static final Logger LOG = LoggerFactory.getLogger(SchemaAwareApplyOperation.class); @@ -158,7 +155,18 @@ abstract class SchemaAwareApplyOperation implements ModificationApplyOperation { } } - protected void checkWriteApplicable(final YangInstanceIdentifier path, final NodeModification modification, final Optional current) throws DataValidationFailedException { + /** + * Checks if write operation can be applied to current TreeNode. + * The operation checks if original tree node to which the modification is going to be applied exists and if + * current node in TreeNode structure exists. + * + * @param path Path from current node in TreeNode + * @param modification modification to apply + * @param current current node in TreeNode for modification to apply + * @throws DataValidationFailedException + */ + protected void checkWriteApplicable(final YangInstanceIdentifier path, final NodeModification modification, + final Optional current) throws DataValidationFailedException { Optional original = modification.getOriginal(); if (original.isPresent() && current.isPresent()) { checkNotConflicting(path, original.get(), current.get()); @@ -176,25 +184,35 @@ abstract class SchemaAwareApplyOperation implements ModificationApplyOperation { } } + boolean isOrdered() { + return false; + } + @Override public final Optional apply(final ModifiedNode modification, final Optional currentMeta, final Version version) { switch (modification.getType()) { case DELETE: - return modification.storeSnapshot(Optional. absent()); + return modification.setSnapshot(Optional. absent()); case SUBTREE_MODIFIED: Preconditions.checkArgument(currentMeta.isPresent(), "Metadata not available for modification", modification); - return modification.storeSnapshot(Optional.of(applySubtreeChange(modification, currentMeta.get(), + return modification.setSnapshot(Optional.of(applySubtreeChange(modification, currentMeta.get(), version))); case MERGE: - if(currentMeta.isPresent()) { - return modification.storeSnapshot(Optional.of(applyMerge(modification,currentMeta.get(), version))); + final TreeNode result; + + // This is a slight optimization: a merge on a non-existing node equals to a write + if (currentMeta.isPresent()) { + result = applyMerge(modification,currentMeta.get(), version); + } else { + result = applyWrite(modification, currentMeta, version); } - // intentional fall-through: if the node does not exist a merge is same as a write + + return modification.setSnapshot(Optional.of(result)); case WRITE: - return modification.storeSnapshot(Optional.of(applyWrite(modification, currentMeta, version))); + return modification.setSnapshot(Optional.of(applyWrite(modification, currentMeta, version))); case UNMODIFIED: return currentMeta; default: @@ -225,55 +243,4 @@ abstract class SchemaAwareApplyOperation implements ModificationApplyOperation { final Optional current) throws DataValidationFailedException; protected abstract void verifyWrittenStructure(NormalizedNode writtenValue); - - public static class UnkeyedListModificationStrategy extends SchemaAwareApplyOperation { - - private final Optional entryStrategy; - - protected UnkeyedListModificationStrategy(final ListSchemaNode schema) { - entryStrategy = Optional. of(new DataNodeContainerModificationStrategy.UnkeyedListItemModificationStrategy(schema)); - } - - @Override - protected TreeNode applyMerge(final ModifiedNode modification, final TreeNode currentMeta, - final Version version) { - return applyWrite(modification, Optional.of(currentMeta), version); - } - - @Override - protected TreeNode applySubtreeChange(final ModifiedNode modification, - final TreeNode currentMeta, final Version version) { - throw new UnsupportedOperationException("UnkeyedList does not support subtree change."); - } - - @Override - protected TreeNode applyWrite(final ModifiedNode modification, - final Optional currentMeta, final Version version) { - /* - * FIXME: BUG-1258: This is inefficient: it needlessly creates index nodes for the entire subtree. - * We can determine the depth into which metadata need to be created from the modification - * -- if it does not have children, no need to bother with metadata. - */ - return TreeNodeFactory.createTreeNode(modification.getWrittenValue(), version); - } - - @Override - public Optional getChild(final PathArgument child) { - if (child instanceof NodeIdentifier) { - return entryStrategy; - } - return Optional.absent(); - } - - @Override - protected void verifyWrittenStructure(final NormalizedNode writtenValue) { - - } - - @Override - protected void checkSubtreeModificationApplicable(final YangInstanceIdentifier path, final NodeModification modification, - final Optional current) throws IncorrectDataStructureException { - throw new IncorrectDataStructureException(path, "Subtree modification is not allowed."); - } - } }