2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.yang.data.impl;
10 import java.util.HashSet;
11 import java.util.List;
15 import org.opendaylight.yangtools.yang.common.QName;
16 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
17 import org.opendaylight.yangtools.yang.data.api.ModifyAction;
18 import org.opendaylight.yangtools.yang.data.api.MutableCompositeNode;
19 import org.opendaylight.yangtools.yang.data.api.MutableNode;
20 import org.opendaylight.yangtools.yang.data.api.MutableSimpleNode;
21 import org.opendaylight.yangtools.yang.data.api.Node;
22 import org.opendaylight.yangtools.yang.data.api.NodeModificationBuilder;
23 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
24 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
25 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
28 * @author michal.rehak
30 * @deprecated Use {@link Builders} instead.
33 public class NodeModificationBuilderImpl implements NodeModificationBuilder {
35 private final SchemaContext context;
37 private final Set<MutableNode<?>> changeLog;
38 private final LazyNodeToNodeMap originalToMutable;
43 public NodeModificationBuilderImpl(final SchemaContext context) {
44 this.context = context;
45 originalToMutable = new LazyNodeToNodeMap();
46 changeLog = new HashSet<>();
53 private void addModificationToLog(final MutableNode<?> modNode, final ModifyAction action) {
54 modNode.setModifyAction(action);
55 changeLog.add(modNode);
59 public void addNode(final MutableSimpleNode<?> newNode) {
60 NodeUtils.fixParentRelation(newNode);
61 addModificationToLog(newNode, ModifyAction.CREATE);
65 public void addNode(final MutableCompositeNode newNode) {
66 NodeUtils.fixParentRelation(newNode);
67 addModificationToLog(newNode, ModifyAction.CREATE);
71 public void replaceNode(final MutableSimpleNode<?> replacementNode) {
72 addModificationToLog(replacementNode, ModifyAction.REPLACE);
76 public void replaceNode(final MutableCompositeNode replacementNode) {
77 addModificationToLog(replacementNode, ModifyAction.REPLACE);
81 public void deleteNode(final MutableCompositeNode deadNode) {
82 addModificationToLog(deadNode, ModifyAction.DELETE);
86 public void deleteNode(final MutableSimpleNode<?> deadNode) {
87 addModificationToLog(deadNode, ModifyAction.DELETE);
91 public void removeNode(final MutableSimpleNode<?> deadNode) {
92 addModificationToLog(deadNode, ModifyAction.REMOVE);
96 public void removeNode(final MutableCompositeNode deadNode) {
97 addModificationToLog(deadNode, ModifyAction.REMOVE);
101 public void mergeNode(final MutableCompositeNode alteredNode) {
102 addModificationToLog(alteredNode, ModifyAction.MERGE);
106 * @return minimalistic tree containing diffs only
109 public CompositeNode buildDiffTree() {
110 Set<Node<?>> wanted = new HashSet<>();
112 // walk changeLog, collect all required nodes
113 for (MutableNode<?> mutant : changeLog) {
114 wanted.addAll(collectSelfAndAllParents(mutant));
117 // walk wanted and add relevant keys
118 Map<String, ListSchemaNode> mapOfLists = NodeUtils.buildMapOfListNodes(context);
119 for (Node<?> outlaw : wanted) {
120 if (outlaw instanceof CompositeNode) {
121 String path = NodeUtils.buildPath(outlaw);
122 if (mapOfLists.containsKey(path)) {
123 ListSchemaNode listSchema = mapOfLists.get(path);
124 if (listSchema.getQName().equals(outlaw.getNodeType())) {
125 // try to add key subnode to wanted list
126 List<QName> supportedKeys = listSchema.getKeyDefinition();
127 CompositeNode outlawOriginal = ((MutableCompositeNode) outlaw).getOriginal();
128 for (Node<?> outlawOriginalChild : outlawOriginal.getValue()) {
129 if (supportedKeys.contains(outlawOriginalChild.getNodeType())) {
130 originalToMutable.getMutableEquivalent(outlawOriginalChild);
138 return originalToMutable.getMutableRoot();
142 * @param focusedDescendant
143 * @return set of parents and focusedAncestor itself
145 private static Set<Node<?>> collectSelfAndAllParents(final Node<?> focusedDescendant) {
146 Set<Node<?>> family = new HashSet<>();
147 Node<?> tmpNode = focusedDescendant;
148 while (tmpNode != null) {
150 tmpNode = tmpNode.getParent();
156 * @param originalNode
157 * @return mutable version of given node
160 public Node<?> getMutableEquivalent(final Node<?> originalNode) {
161 return originalToMutable.getMutableEquivalent(originalNode);