Added support for root in create(TreeType, YangInstanceIdentifier)
[yangtools.git] / yang / yang-data-impl / src / main / java / org / opendaylight / yangtools / yang / data / impl / schema / tree / InMemoryDataTreeFactory.java
index 486c1c2cf5569641e6de28df1ea444f67925c998..a60497fd448117d9e14a4f9652062b8fd85a5f36 100644 (file)
@@ -1,12 +1,25 @@
+/*
+ * 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 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;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
+import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeFactory;
+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.Builders;
+import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeBuilder;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 
 /**
@@ -14,17 +27,44 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext;
  */
 public final class InMemoryDataTreeFactory implements DataTreeFactory {
     private static final InMemoryDataTreeFactory INSTANCE = new InMemoryDataTreeFactory();
+    private final NormalizedNode<?, ?> rootContainer = ImmutableNodes.containerNode(SchemaContext.NAME);
 
     private InMemoryDataTreeFactory() {
         // Never instantiated externally
     }
 
+    @Deprecated
+    @Override
+    public TipProducingDataTree create() {
+        return create(TreeType.OPERATIONAL);
+    }
+
     @Override
-    public InMemoryDataTree create() {
-        final NodeIdentifier root = new NodeIdentifier(SchemaContext.NAME);
-        final NormalizedNode<?, ?> data = Builders.containerBuilder().withNodeIdentifier(root).build();
+    public TipProducingDataTree create(final TreeType treeType) {
+        return new InMemoryDataTree(TreeNodeFactory.createTreeNode(rootContainer, Version.initial()),
+            treeType, YangInstanceIdentifier.EMPTY, null);
+    }
+
+    @Override
+    public TipProducingDataTree create(final TreeType treeType, final YangInstanceIdentifier rootPath) {
+        if (rootPath.isEmpty()) {
+            return create(treeType);
+        }
+        final NormalizedNode<?, ?> root;
+        final PathArgument arg = rootPath.getLastPathArgument();
+        if (arg instanceof NodeIdentifier) {
+            root = rootContainer;
+        } else if (arg instanceof NodeIdentifierWithPredicates) {
+            final DataContainerNodeBuilder<NodeIdentifierWithPredicates, MapEntryNode> b = ImmutableNodes.mapEntryBuilder();
+            b.withNodeIdentifier((NodeIdentifierWithPredicates) arg);
+            root = b.build();
+        } else {
+
+            // FIXME: implement augmentations and leaf-lists
+            throw new IllegalArgumentException("Unsupported root node " + arg);
+        }
 
-        return new InMemoryDataTree(TreeNodeFactory.createTreeNode(data, Version.initial()), null);
+        return new InMemoryDataTree(TreeNodeFactory.createTreeNode(root, Version.initial()), treeType, rootPath, null);
     }
 
     /**
@@ -32,7 +72,7 @@ public final class InMemoryDataTreeFactory implements DataTreeFactory {
      *
      * @return Data tree factory instance.
      */
-    public static final InMemoryDataTreeFactory getInstance() {
+    public static InMemoryDataTreeFactory getInstance() {
         return INSTANCE;
     }
 }