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%2FInMemoryDataTree.java;h=13070428ec896c1722f01454bdd2841a4b25fcab;hb=f57da82ed313a3c17a5f8b2a7ee3ec5bb5ff4263;hp=fc9f744a6fe400ee83de27db5a7fa352341eeb51;hpb=c7c67c1ad9fbd77e2705345400f1db5b3d46e200;p=yangtools.git diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTree.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTree.java index fc9f744a6f..13070428ec 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTree.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTree.java @@ -10,10 +10,17 @@ package org.opendaylight.yangtools.yang.data.impl.schema.tree; import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodes; -import org.opendaylight.yangtools.yang.data.api.schema.tree.TipProducingDataTree; 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.TreeType; import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.TreeNode; +import org.opendaylight.yangtools.yang.data.util.DataSchemaContextNode; +import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree; +import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; +import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; +import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -26,12 +33,17 @@ final class InMemoryDataTree extends AbstractDataTreeTip implements TipProducing AtomicReferenceFieldUpdater.newUpdater(InMemoryDataTree.class, DataTreeState.class, "state"); private static final Logger LOG = LoggerFactory.getLogger(InMemoryDataTree.class); + private final YangInstanceIdentifier rootPath; + private final TreeType treeType; + /** * Current data store state generation. */ private volatile DataTreeState state; - public InMemoryDataTree(final TreeNode rootNode, final SchemaContext schemaContext) { + public InMemoryDataTree(final TreeNode rootNode, final TreeType treeType, final YangInstanceIdentifier rootPath, final SchemaContext schemaContext) { + this.treeType = Preconditions.checkNotNull(treeType, "treeType"); + this.rootPath = Preconditions.checkNotNull(rootPath, "rootPath"); state = DataTreeState.createInitial(rootNode); if (schemaContext != null) { setSchemaContext(schemaContext); @@ -48,12 +60,31 @@ final class InMemoryDataTree extends AbstractDataTreeTip implements TipProducing LOG.debug("Following schema contexts will be attempted {}", newSchemaContext); - final SchemaAwareApplyOperation operation = SchemaAwareApplyOperation.from(newSchemaContext); + final DataSchemaContextTree contextTree = DataSchemaContextTree.from(newSchemaContext); + final DataSchemaContextNode rootContextNode = contextTree.getChild(rootPath); + if (rootContextNode == null) { + LOG.debug("Could not find root {} in new schema context, not upgrading", rootPath); + return; + } + + final DataSchemaNode rootSchemaNode = rootContextNode.getDataSchemaNode(); + if (!(rootSchemaNode instanceof DataNodeContainer)) { + LOG.warn("Root {} resolves to non-container type {}, not upgrading", rootPath, rootSchemaNode); + return; + } + + 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); + } else { + rootNode = SchemaAwareApplyOperation.from(rootSchemaNode, treeType); + } DataTreeState currentState, newState; do { currentState = state; - newState = currentState.withSchemaContext(newSchemaContext, operation); + newState = currentState.withSchemaContext(newSchemaContext, rootNode); } while (!STATE_UPDATER.compareAndSet(this, currentState, newState)); } @@ -67,7 +98,6 @@ final class InMemoryDataTree extends AbstractDataTreeTip implements TipProducing if (candidate instanceof NoopDataTreeCandidate) { return; } - Preconditions.checkArgument(candidate instanceof InMemoryDataTreeCandidate, "Invalid candidate class %s", candidate.getClass()); final InMemoryDataTreeCandidate c = (InMemoryDataTreeCandidate)candidate; @@ -90,9 +120,18 @@ final class InMemoryDataTree extends AbstractDataTreeTip implements TipProducing } while (!STATE_UPDATER.compareAndSet(this, currentState, newState)); } + @Override + public YangInstanceIdentifier getRootPath() { + return rootPath; + } + @Override public String toString() { - return MoreObjects.toStringHelper(this).add("object", super.toString()).add("state", state).toString(); + return MoreObjects.toStringHelper(this). + add("object", super.toString()). + add("rootPath", rootPath). + add("state", state). + toString(); } @Override