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%2FInMemoryDataTreeCandidate.java;h=f6bb6ba2aac4e8da8c0ba922bd09d0f5621b43cb;hb=a10f89d551d5592577b8b573d571a9b0cf3f3ae2;hp=1f6b0f01c263d4c4bced319a823750d5164daed8;hpb=6c8e31286e3adaf52ed3decce3d78198ef88338a;p=yangtools.git diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeCandidate.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeCandidate.java index 1f6b0f01c2..f6bb6ba2aa 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeCandidate.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeCandidate.java @@ -1,13 +1,24 @@ +/* + * 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.tree; - import com.google.common.base.Function; import com.google.common.base.Optional; import com.google.common.base.Preconditions; -import com.google.common.collect.Iterables; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; +import com.google.common.collect.Collections2; +import java.util.Collection; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +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.NormalizedNodeContainer; +import org.opendaylight.yangtools.yang.data.api.schema.OrderedLeafSetNode; +import org.opendaylight.yangtools.yang.data.api.schema.OrderedMapNode; +import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateNode; import org.opendaylight.yangtools.yang.data.api.schema.tree.ModificationType; import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNode; @@ -45,20 +56,56 @@ final class InMemoryDataTreeCandidate extends AbstractDataTreeCandidate { } } + private DataTreeCandidateNode childNode(final ModifiedNode input) { + final PathArgument id = input.getIdentifier(); + return new ChildNode(input, childMeta(oldMeta, id), childMeta(newMeta, id)); + } + @Override - public Iterable getChildNodes() { - return Iterables.transform(mod.getChildren(), new Function() { + public Collection getChildNodes() { + return Collections2.transform(mod.getChildren(), new Function() { @Override public DataTreeCandidateNode apply(final ModifiedNode input) { - final PathArgument id = input.getIdentifier(); - return new ChildNode(input, childMeta(oldMeta, id), childMeta(newMeta, id)); + return childNode(input); } }); } @Override public ModificationType getModificationType() { - return mod.getType(); + switch (mod.getOperation()) { + case DELETE: + return ModificationType.DELETE; + case MERGE: + // Merge into non-existing data is a write + if (oldMeta == null) { + return ModificationType.WRITE; + } + + // Data-based checks to narrow down types + final NormalizedNode data = newMeta.getData(); + + // leaf or anyxml are always written + if (!(data instanceof NormalizedNodeContainer)) { + return ModificationType.WRITE; + } + + // Unkeyed collections are always written + if (data instanceof UnkeyedListNode || data instanceof OrderedMapNode || data instanceof OrderedLeafSetNode) { + return ModificationType.WRITE; + } + + // Everything else is subtree modified + return ModificationType.SUBTREE_MODIFIED; + case TOUCH: + return ModificationType.SUBTREE_MODIFIED; + case NONE: + return ModificationType.UNMODIFIED; + case WRITE: + return ModificationType.WRITE; + } + + throw new IllegalStateException("Unhandled internal operation " + mod.getOperation()); } private Optional> optionalData(final TreeNode meta) { @@ -78,6 +125,15 @@ final class InMemoryDataTreeCandidate extends AbstractDataTreeCandidate { public Optional> getDataBefore() { return optionalData(oldMeta); } + + @Override + public DataTreeCandidateNode getModifiedChild(final PathArgument identifier) { + final Optional childMod = mod.getChild(identifier); + if(childMod.isPresent()) { + return childNode(mod); + } + return null; + } } private static final class ChildNode extends AbstractNode { @@ -104,7 +160,7 @@ final class InMemoryDataTreeCandidate extends AbstractDataTreeCandidate { private final RootNode root; - InMemoryDataTreeCandidate(final InstanceIdentifier rootPath, final ModifiedNode modificationRoot, + InMemoryDataTreeCandidate(final YangInstanceIdentifier rootPath, final ModifiedNode modificationRoot, final TreeNode beforeRoot, final TreeNode afterRoot) { super(rootPath); this.root = new RootNode(modificationRoot, beforeRoot, afterRoot);