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=5500c3ce51088ed6de1adedd35f52662a8304b1e;hp=7a66d30215a3ce48fbe823f122ac107ae928c396;hpb=994d142d7b05cc4c92b4d6dda4d16298b19de59a;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 7a66d30215..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,11 +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.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; @@ -27,14 +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; - private final TreeType treeType; - public InMemoryDataTree(final TreeNode rootNode, final TreeType treeType, final SchemaContext schemaContext) { - this.treeType = Preconditions.checkNotNull(treeType,treeType); + 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); @@ -51,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,treeType); + 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)); } @@ -92,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