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%2FInMemoryDataTreeFactory.java;h=17e330eb09e544c6c5ea11f4ca1ebc66140cb35b;hb=9041b2200d7c48962615f414ed884cb54a7573df;hp=a44ae5c98c2e22697266bc02b2af378fd3171a21;hpb=a6ea70c09b13489918c387d54cde8f1095721acc;p=yangtools.git diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeFactory.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeFactory.java index a44ae5c98c..17e330eb09 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeFactory.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/InMemoryDataTreeFactory.java @@ -7,7 +7,13 @@ */ package org.opendaylight.yangtools.yang.data.impl.schema.tree; -import com.google.common.base.Preconditions; +import static com.google.common.base.Preconditions.checkArgument; + +import java.util.Optional; +import javax.inject.Inject; +import javax.inject.Singleton; +import org.eclipse.jdt.annotation.NonNull; +import org.kohsuke.MetaInfServices; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; @@ -17,79 +23,63 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTree; 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.DataTreeConfiguration.Builder; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeFactory; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataValidationFailedException; -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.TreeNodeFactory; import org.opendaylight.yangtools.yang.data.api.schema.tree.spi.Version; import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder; import org.opendaylight.yangtools.yang.data.util.DataSchemaContextNode; import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree; +import org.opendaylight.yangtools.yang.model.api.ContainerLike; 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.EffectiveModelContext; import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Deactivate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * A factory for creating in-memory data trees. */ +@MetaInfServices +@Singleton +@Component(immediate = true) public final class InMemoryDataTreeFactory implements DataTreeFactory { - private static final InMemoryDataTreeFactory INSTANCE = new InMemoryDataTreeFactory(); - private static final NormalizedNode ROOT_CONTAINER = ImmutableNodes.containerNode(SchemaContext.NAME); - - private InMemoryDataTreeFactory() { - // Never instantiated externally - } - - @Deprecated - @Override - public TipProducingDataTree create(final TreeType treeType) { - return create(DataTreeConfiguration.getDefault(treeType)); - } - - @Deprecated - @Override - public TipProducingDataTree create(final TreeType treeType, final YangInstanceIdentifier rootPath) { - if (rootPath.isEmpty()) { - return create(treeType); - } - - final DataTreeConfiguration defConfig = DataTreeConfiguration.getDefault(treeType); - final DataTreeConfiguration config; - if (!rootPath.isEmpty()) { - config = new Builder(treeType).setMandatoryNodesValidation(defConfig.isMandatoryNodesValidationEnabled()) - .setRootPath(rootPath).setUniqueIndexes(defConfig.isUniqueIndexEnabled()).build(); - } else { - config = defConfig; - } - - return new InMemoryDataTree(TreeNodeFactory.createTreeNode(createRoot(rootPath), Version.initial()), config, - null); + private static final Logger LOG = LoggerFactory.getLogger(InMemoryDataTreeFactory.class); + // FIXME: YANGTOOLS-1074: we do not want this name + private static final @NonNull NormalizedNode ROOT_CONTAINER = + ImmutableNodes.containerNode(SchemaContext.NAME); + + @Inject + public InMemoryDataTreeFactory() { + // Exposed for DI } @Override - public TipProducingDataTree create(final DataTreeConfiguration treeConfig) { + public DataTree create(final DataTreeConfiguration treeConfig) { return new InMemoryDataTree(TreeNodeFactory.createTreeNode(createRoot(treeConfig.getRootPath()), Version.initial()), treeConfig, null); } @Override - public DataTree create(final DataTreeConfiguration treeConfig, final SchemaContext initialSchemaContext) { - return create(treeConfig, initialSchemaContext, true); + public DataTree create(final DataTreeConfiguration treeConfig, final EffectiveModelContext initialSchemaContext) { + return createDataTree(treeConfig, initialSchemaContext, true); } @Override - public DataTree create(final DataTreeConfiguration treeConfig, final SchemaContext initialSchemaContext, + public DataTree create(final DataTreeConfiguration treeConfig, final EffectiveModelContext initialSchemaContext, final NormalizedNodeContainer initialRoot) throws DataValidationFailedException { - final DataTree ret = create(treeConfig, initialSchemaContext, false); + final DataTree ret = createDataTree(treeConfig, initialSchemaContext, false); final DataTreeModification mod = ret.takeSnapshot().newModification(); - mod.write(YangInstanceIdentifier.EMPTY, initialRoot); + mod.write(YangInstanceIdentifier.empty(), initialRoot); mod.ready(); ret.validate(mod); @@ -98,8 +88,20 @@ public final class InMemoryDataTreeFactory implements DataTreeFactory { return ret; } - private static DataTree create(final DataTreeConfiguration treeConfig, final SchemaContext initialSchemaContext, - final boolean maskMandatory) { + @Activate + @SuppressWarnings("static-method") + void activate() { + LOG.info("In-memory Data Tree activated"); + } + + @Deactivate + @SuppressWarnings("static-method") + void deactivate() { + LOG.info("In-memory Data Tree deactivated"); + } + + private static @NonNull DataTree createDataTree(final DataTreeConfiguration treeConfig, + final EffectiveModelContext initialSchemaContext, final boolean maskMandatory) { final DataSchemaNode rootSchemaNode = getRootSchemaNode(initialSchemaContext, treeConfig.getRootPath()); final NormalizedNode rootDataNode = createRoot((DataNodeContainer)rootSchemaNode, treeConfig.getRootPath()); @@ -107,44 +109,31 @@ public final class InMemoryDataTreeFactory implements DataTreeFactory { initialSchemaContext, rootSchemaNode, maskMandatory); } - private static DataSchemaNode getRootSchemaNode(final SchemaContext schemaContext, - final YangInstanceIdentifier rootPath) { - final DataSchemaContextTree contextTree = DataSchemaContextTree.from(schemaContext); - final DataSchemaContextNode rootContextNode = contextTree.getChild(rootPath); - Preconditions.checkArgument(rootContextNode != null, "Failed to find root %s in schema context", rootPath); - - final DataSchemaNode rootSchemaNode = rootContextNode.getDataSchemaNode(); - Preconditions.checkArgument(rootSchemaNode instanceof DataNodeContainer, - "Root %s resolves to non-container type %s", rootPath, rootSchemaNode); - return rootSchemaNode; - } - - private static NormalizedNode createRoot(final DataNodeContainer schemaNode, + private static @NonNull NormalizedNode createRoot(final DataNodeContainer schemaNode, final YangInstanceIdentifier path) { if (path.isEmpty()) { - Preconditions.checkArgument(schemaNode instanceof ContainerSchemaNode, + checkArgument(schemaNode instanceof ContainerLike, "Conceptual tree root has to be a container, not %s", schemaNode); return ROOT_CONTAINER; } final PathArgument arg = path.getLastPathArgument(); if (schemaNode instanceof ContainerSchemaNode) { - Preconditions.checkArgument(arg instanceof NodeIdentifier, "Mismatched container %s path %s", schemaNode, - path); + checkArgument(arg instanceof NodeIdentifier, "Mismatched container %s path %s", schemaNode, path); return ImmutableContainerNodeBuilder.create().withNodeIdentifier((NodeIdentifier) arg).build(); } else if (schemaNode instanceof ListSchemaNode) { // This can either be a top-level list or its individual entry if (arg instanceof NodeIdentifierWithPredicates) { return ImmutableNodes.mapEntryBuilder().withNodeIdentifier((NodeIdentifierWithPredicates) arg).build(); } - Preconditions.checkArgument(arg instanceof NodeIdentifier, "Mismatched list %s path %s", schemaNode, path); + checkArgument(arg instanceof NodeIdentifier, "Mismatched list %s path %s", schemaNode, path); return ImmutableNodes.mapNodeBuilder().withNodeIdentifier((NodeIdentifier) arg).build(); } else { throw new IllegalArgumentException("Unsupported root schema " + schemaNode); } } - private static NormalizedNode createRoot(final YangInstanceIdentifier path) { + private static @NonNull NormalizedNode createRoot(final YangInstanceIdentifier path) { if (path.isEmpty()) { return ROOT_CONTAINER; } @@ -161,12 +150,15 @@ public final class InMemoryDataTreeFactory implements DataTreeFactory { throw new IllegalArgumentException("Unsupported root node " + arg); } - /** - * Get an instance of this factory. This method cannot fail. - * - * @return Data tree factory instance. - */ - public static InMemoryDataTreeFactory getInstance() { - return INSTANCE; + private static DataSchemaNode getRootSchemaNode(final EffectiveModelContext schemaContext, + final YangInstanceIdentifier rootPath) { + final DataSchemaContextTree contextTree = DataSchemaContextTree.from(schemaContext); + final Optional> rootContextNode = contextTree.findChild(rootPath); + checkArgument(rootContextNode.isPresent(), "Failed to find root %s in schema context", rootPath); + + final DataSchemaNode rootSchemaNode = rootContextNode.get().getDataSchemaNode(); + checkArgument(rootSchemaNode instanceof DataNodeContainer, "Root %s resolves to non-container type %s", + rootPath, rootSchemaNode); + return rootSchemaNode; } }