-/*\r
- * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-package org.opendaylight.yangtools.yang.data.impl;\r
-\r
-import java.util.HashSet;\r
-import java.util.List;\r
-import java.util.Map;\r
-import java.util.Set;\r
-\r
-import org.opendaylight.yangtools.yang.common.QName;\r
-import org.opendaylight.yangtools.yang.data.api.CompositeNode;\r
-import org.opendaylight.yangtools.yang.data.api.ModifyAction;\r
-import org.opendaylight.yangtools.yang.data.api.MutableCompositeNode;\r
-import org.opendaylight.yangtools.yang.data.api.MutableNode;\r
-import org.opendaylight.yangtools.yang.data.api.MutableSimpleNode;\r
-import org.opendaylight.yangtools.yang.data.api.Node;\r
-import org.opendaylight.yangtools.yang.data.api.NodeModificationBuilder;\r
-import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;\r
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;\r
-\r
-/**\r
- * @author michal.rehak\r
- *\r
- */\r
-public class NodeModificationBuilderImpl implements NodeModificationBuilder {\r
-\r
- private SchemaContext context;\r
-\r
- private Set<MutableNode<?>> changeLog;\r
- private LazyNodeToNodeMap originalToMutable;\r
-\r
- /**\r
- * @param originalTreeRootNode\r
- * @param context\r
- */\r
- public NodeModificationBuilderImpl(CompositeNode originalTreeRootNode, SchemaContext context) {\r
- this.context = context;\r
- originalToMutable = new LazyNodeToNodeMap();\r
- changeLog = new HashSet<>();\r
- }\r
-\r
- /**\r
- * @param modNode\r
- * @param action\r
- */\r
- private void addModificationToLog(MutableNode<?> modNode, ModifyAction action) {\r
- modNode.setModifyAction(action);\r
- changeLog.add(modNode);\r
- }\r
-\r
- @Override\r
- public void addNode(MutableSimpleNode<?> newNode) {\r
- NodeUtils.fixParentRelation(newNode);\r
- addModificationToLog(newNode, ModifyAction.CREATE);\r
- }\r
-\r
- @Override\r
- public void addNode(MutableCompositeNode newNode) {\r
- NodeUtils.fixParentRelation(newNode);\r
- addModificationToLog(newNode, ModifyAction.CREATE);\r
- }\r
-\r
- @Override\r
- public void replaceNode(MutableSimpleNode<?> replacementNode) {\r
- addModificationToLog(replacementNode, ModifyAction.REPLACE);\r
- }\r
-\r
- @Override\r
- public void replaceNode(MutableCompositeNode replacementNode) {\r
- addModificationToLog(replacementNode, ModifyAction.REPLACE);\r
- }\r
-\r
- @Override\r
- public void deleteNode(MutableCompositeNode deadNode) {\r
- addModificationToLog(deadNode, ModifyAction.DELETE);\r
- }\r
-\r
- @Override\r
- public void deleteNode(MutableSimpleNode<?> deadNode) {\r
- addModificationToLog(deadNode, ModifyAction.DELETE);\r
- }\r
-\r
- @Override\r
- public void removeNode(MutableSimpleNode<?> deadNode) {\r
- addModificationToLog(deadNode, ModifyAction.REMOVE);\r
- }\r
-\r
- @Override\r
- public void removeNode(MutableCompositeNode deadNode) {\r
- addModificationToLog(deadNode, ModifyAction.REMOVE);\r
- }\r
-\r
- @Override\r
- public void mergeNode(MutableCompositeNode alteredNode) {\r
- addModificationToLog(alteredNode, ModifyAction.MERGE);\r
- }\r
-\r
- /**\r
- * @return minimalistic tree containing diffs only\r
- */\r
- @Override\r
- public CompositeNode buildDiffTree() {\r
- Set<Node<?>> wanted = new HashSet<>();\r
-\r
- // walk changeLog, collect all required nodes\r
- for (MutableNode<?> mutant : changeLog) {\r
- wanted.addAll(collectSelfAndAllParents(mutant));\r
- }\r
-\r
- // walk wanted and add relevant keys\r
- Map<String, ListSchemaNode> mapOfLists = NodeUtils.buildMapOfListNodes(context);\r
- for (Node<?> outlaw : wanted) {\r
- if (outlaw instanceof CompositeNode) {\r
- String path = NodeUtils.buildPath(outlaw);\r
- if (mapOfLists.containsKey(path)) {\r
- ListSchemaNode listSchema = mapOfLists.get(path);\r
- if (listSchema.getQName().equals(outlaw.getNodeType())) {\r
- // try to add key subnode to wanted list\r
- List<QName> supportedKeys = listSchema.getKeyDefinition();\r
- CompositeNode outlawOriginal = ((MutableCompositeNode) outlaw).getOriginal();\r
- for (Node<?> outlawOriginalChild : outlawOriginal.getChildren()) {\r
- if (supportedKeys.contains(outlawOriginalChild.getNodeType())) {\r
- originalToMutable.getMutableEquivalent(outlawOriginalChild);\r
- }\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- return originalToMutable.getMutableRoot();\r
- }\r
-\r
- /**\r
- * @param focusedDescendant\r
- * @return set of parents and focusedAncestor itself\r
- */\r
- private static Set<Node<?>> collectSelfAndAllParents(Node<?> focusedDescendant) {\r
- Set<Node<?>> family = new HashSet<>();\r
- Node<?> tmpNode = focusedDescendant;\r
- while (tmpNode != null) {\r
- family.add(tmpNode);\r
- tmpNode = tmpNode.getParent();\r
- }\r
- return family;\r
- }\r
-\r
- /**\r
- * @param originalNode\r
- * @return mutable version of given node\r
- */\r
- @Override\r
- public Node<?> getMutableEquivalent(Node<?> originalNode) {\r
- return originalToMutable.getMutableEquivalent(originalNode);\r
- }\r
-\r
-}\r
+/*
+ * Copyright (c) 2013 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;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.CompositeNode;
+import org.opendaylight.yangtools.yang.data.api.ModifyAction;
+import org.opendaylight.yangtools.yang.data.api.MutableCompositeNode;
+import org.opendaylight.yangtools.yang.data.api.MutableNode;
+import org.opendaylight.yangtools.yang.data.api.MutableSimpleNode;
+import org.opendaylight.yangtools.yang.data.api.Node;
+import org.opendaylight.yangtools.yang.data.api.NodeModificationBuilder;
+import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+
+/**
+ * @author michal.rehak
+ *
+ */
+public class NodeModificationBuilderImpl implements NodeModificationBuilder {
+
+ private SchemaContext context;
+
+ private Set<MutableNode<?>> changeLog;
+ private LazyNodeToNodeMap originalToMutable;
+
+ /**
+ * @param context
+ */
+ public NodeModificationBuilderImpl(SchemaContext context) {
+ this.context = context;
+ originalToMutable = new LazyNodeToNodeMap();
+ changeLog = new HashSet<>();
+ }
+
+ /**
+ * @param modNode
+ * @param action
+ */
+ private void addModificationToLog(MutableNode<?> modNode, ModifyAction action) {
+ modNode.setModifyAction(action);
+ changeLog.add(modNode);
+ }
+
+ @Override
+ public void addNode(MutableSimpleNode<?> newNode) {
+ NodeUtils.fixParentRelation(newNode);
+ addModificationToLog(newNode, ModifyAction.CREATE);
+ }
+
+ @Override
+ public void addNode(MutableCompositeNode newNode) {
+ NodeUtils.fixParentRelation(newNode);
+ addModificationToLog(newNode, ModifyAction.CREATE);
+ }
+
+ @Override
+ public void replaceNode(MutableSimpleNode<?> replacementNode) {
+ addModificationToLog(replacementNode, ModifyAction.REPLACE);
+ }
+
+ @Override
+ public void replaceNode(MutableCompositeNode replacementNode) {
+ addModificationToLog(replacementNode, ModifyAction.REPLACE);
+ }
+
+ @Override
+ public void deleteNode(MutableCompositeNode deadNode) {
+ addModificationToLog(deadNode, ModifyAction.DELETE);
+ }
+
+ @Override
+ public void deleteNode(MutableSimpleNode<?> deadNode) {
+ addModificationToLog(deadNode, ModifyAction.DELETE);
+ }
+
+ @Override
+ public void removeNode(MutableSimpleNode<?> deadNode) {
+ addModificationToLog(deadNode, ModifyAction.REMOVE);
+ }
+
+ @Override
+ public void removeNode(MutableCompositeNode deadNode) {
+ addModificationToLog(deadNode, ModifyAction.REMOVE);
+ }
+
+ @Override
+ public void mergeNode(MutableCompositeNode alteredNode) {
+ addModificationToLog(alteredNode, ModifyAction.MERGE);
+ }
+
+ /**
+ * @return minimalistic tree containing diffs only
+ */
+ @Override
+ public CompositeNode buildDiffTree() {
+ Set<Node<?>> wanted = new HashSet<>();
+
+ // walk changeLog, collect all required nodes
+ for (MutableNode<?> mutant : changeLog) {
+ wanted.addAll(collectSelfAndAllParents(mutant));
+ }
+
+ // walk wanted and add relevant keys
+ Map<String, ListSchemaNode> mapOfLists = NodeUtils.buildMapOfListNodes(context);
+ for (Node<?> outlaw : wanted) {
+ if (outlaw instanceof CompositeNode) {
+ String path = NodeUtils.buildPath(outlaw);
+ if (mapOfLists.containsKey(path)) {
+ ListSchemaNode listSchema = mapOfLists.get(path);
+ if (listSchema.getQName().equals(outlaw.getNodeType())) {
+ // try to add key subnode to wanted list
+ List<QName> supportedKeys = listSchema.getKeyDefinition();
+ CompositeNode outlawOriginal = ((MutableCompositeNode) outlaw).getOriginal();
+ for (Node<?> outlawOriginalChild : outlawOriginal.getChildren()) {
+ if (supportedKeys.contains(outlawOriginalChild.getNodeType())) {
+ originalToMutable.getMutableEquivalent(outlawOriginalChild);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return originalToMutable.getMutableRoot();
+ }
+
+ /**
+ * @param focusedDescendant
+ * @return set of parents and focusedAncestor itself
+ */
+ private static Set<Node<?>> collectSelfAndAllParents(Node<?> focusedDescendant) {
+ Set<Node<?>> family = new HashSet<>();
+ Node<?> tmpNode = focusedDescendant;
+ while (tmpNode != null) {
+ family.add(tmpNode);
+ tmpNode = tmpNode.getParent();
+ }
+ return family;
+ }
+
+ /**
+ * @param originalNode
+ * @return mutable version of given node
+ */
+ @Override
+ public Node<?> getMutableEquivalent(Node<?> originalNode) {
+ return originalToMutable.getMutableEquivalent(originalNode);
+ }
+
+}