* 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.netconf.mdsal.connector.ops;
-import com.google.common.collect.Lists;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableList.Builder;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
import org.opendaylight.yangtools.yang.data.api.ModifyAction;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
public class DataTreeChangeTracker {
-
+ private final Deque<ModifyAction> actions = new ArrayDeque<>();
+ private final Deque<PathArgument> currentPath = new ArrayDeque<>();
+ private final List<DataTreeChange> dataTreeChanges = new ArrayList<>();
private final ModifyAction defaultAction;
- private final Deque<ModifyAction> actions;
- private final Deque<PathArgument> currentPath;
- private final ArrayList<DataTreeChange> dataTreeChanges;
private int deleteOperationTracker = 0;
private int removeOperationTracker = 0;
public DataTreeChangeTracker(final ModifyAction defaultAction) {
- this.defaultAction = defaultAction;
- this.currentPath = new ArrayDeque<>();
- this.actions = new ArrayDeque<>();
- this.dataTreeChanges = new ArrayList<>();
+ this.defaultAction = requireNonNull(defaultAction);
}
public void pushAction(final ModifyAction action) {
- if (ModifyAction.DELETE.equals(action)) {
- deleteOperationTracker++;
+ switch (action) {
+ case DELETE:
+ deleteOperationTracker++;
+ break;
+ case REMOVE:
+ removeOperationTracker++;
+ break;
+ default:
+ // no-op
}
- if (ModifyAction.REMOVE.equals(action)) {
- removeOperationTracker++;
- }
- this.actions.push(action);
+ actions.push(action);
}
+ // Returns nullable
public ModifyAction peekAction() {
- return this.actions.peekFirst();
+ return actions.peekFirst();
+ }
+
+ public ModifyAction currentAction() {
+ final ModifyAction stack = peekAction();
+ return stack != null ? stack : defaultAction;
}
public ModifyAction popAction() {
final ModifyAction popResult = actions.pop();
- if (ModifyAction.DELETE.equals(popResult)) {
- deleteOperationTracker--;
- }
-
- if (ModifyAction.REMOVE.equals(popResult)) {
- removeOperationTracker--;
+ switch (popResult) {
+ case DELETE:
+ deleteOperationTracker--;
+ break;
+ case REMOVE:
+ removeOperationTracker--;
+ break;
+ default:
+ // no-op
}
return popResult;
}
return removeOperationTracker;
}
- public void addDataTreeChange(final DataTreeChange change) {
- dataTreeChanges.add(change);
+ public void addDataTreeChange(final ModifyAction action, final NormalizedNode<?, ?> changeRoot) {
+ dataTreeChanges.add(new DataTreeChange(changeRoot, action, currentPath));
}
- public ArrayList<DataTreeChange> getDataTreeChanges() {
+ public List<DataTreeChange> getDataTreeChanges() {
return dataTreeChanges;
}
- public ModifyAction getDefaultAction() {
- return defaultAction;
- }
-
public void pushPath(final PathArgument pathArgument) {
currentPath.push(pathArgument);
}
return currentPath.pop();
}
- public Deque<PathArgument> getCurrentPath() {
- return currentPath;
- }
-
-
public static final class DataTreeChange {
-
private final NormalizedNode<?, ?> changeRoot;
+ private final YangInstanceIdentifier path;
private final ModifyAction action;
- private final List<PathArgument> path;
- public DataTreeChange(final NormalizedNode<?, ?> changeRoot, final ModifyAction action,
- final ArrayList<PathArgument> path) {
- this.changeRoot = changeRoot;
- this.action = action;
- this.path = Lists.reverse(path);
+ DataTreeChange(final NormalizedNode<?, ?> changeRoot, final ModifyAction action,
+ final Deque<PathArgument> path) {
+ this.changeRoot = requireNonNull(changeRoot);
+ this.action = requireNonNull(action);
+
+ final Builder<PathArgument> builder = ImmutableList.builderWithExpectedSize(path.size());
+ path.descendingIterator().forEachRemaining(builder::add);
+ this.path = YangInstanceIdentifier.create(builder.build());
}
public NormalizedNode<?, ?> getChangeRoot() {
return action;
}
- public List<PathArgument> getPath() {
+ public YangInstanceIdentifier getPath() {
return path;
}
}
package org.opendaylight.netconf.mdsal.connector.ops;
-import java.util.ArrayList;
import java.util.Map;
import org.opendaylight.netconf.api.xml.XmlNetconfConstants;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.EditConfigInput;
if (!action.equals(dataTreeChangeTracker.peekAction())) {
final LeafNode<Object> node = ImmutableNodes.leafNode(name, value);
dataTreeChangeTracker.pushPath(name);
- dataTreeChangeTracker.addDataTreeChange(new DataTreeChangeTracker.DataTreeChange(node, action,
- new ArrayList<>(dataTreeChangeTracker.getCurrentPath())));
+ dataTreeChangeTracker.addDataTreeChange(action, node);
getCurrent().removeChild(dataTreeChangeTracker.popPath());
}
}
&& dataTreeChangeTracker.getRemoveOperationTracker() == 0) {
if (!action.equals(dataTreeChangeTracker.peekAction())) {
final LeafSetEntryNode<?> node = Builders.leafSetEntryBuilder().withNodeIdentifier(
- new NodeWithValue(name, value)).withValue(value).build();
+ new NodeWithValue<>(name, value)).withValue(value).build();
dataTreeChangeTracker.pushPath(node.getIdentifier());
- dataTreeChangeTracker.addDataTreeChange(new DataTreeChangeTracker.DataTreeChange(node, action,
- new ArrayList<>(dataTreeChangeTracker.getCurrentPath())));
+ dataTreeChangeTracker.addDataTreeChange(action, node);
getCurrent().removeChild(dataTreeChangeTracker.popPath());
}
}
// for augments and choices
private void trackMixinNode(final PathArgument identifier) {
dataTreeChangeTracker.pushPath(identifier);
- dataTreeChangeTracker.pushAction(dataTreeChangeTracker.peekAction() != null
- ? dataTreeChangeTracker.peekAction() : dataTreeChangeTracker.getDefaultAction());
+ dataTreeChangeTracker.pushAction(dataTreeChangeTracker.currentAction());
}
// for containers, (unkeyed) list entries and yang-modeled-anyxmls
private void trackDataContainerNode(final PathArgument identifier, final Map<QName, String> attributes) {
dataTreeChangeTracker.pushPath(identifier);
final String operation = attributes.get(OPERATION_ATTRIBUTE);
- if (operation != null) {
- dataTreeChangeTracker.pushAction(ModifyAction.fromXmlValue(operation));
- } else {
- dataTreeChangeTracker.pushAction(dataTreeChangeTracker.peekAction() != null
- ? dataTreeChangeTracker.peekAction() : dataTreeChangeTracker.getDefaultAction());
- }
+ final ModifyAction action = operation != null ? ModifyAction.fromXmlValue(operation)
+ : dataTreeChangeTracker.currentAction();
+ dataTreeChangeTracker.pushAction(action);
}
@Override
//if parent and current actions don't match create a DataTreeChange and add it to the change list
//don't add a new child to the parent node
if (!currentAction.equals(dataTreeChangeTracker.peekAction())) {
- dataTreeChangeTracker.addDataTreeChange(new DataTreeChangeTracker.DataTreeChange(product,
- currentAction, new ArrayList<>(dataTreeChangeTracker.getCurrentPath())));
+ dataTreeChangeTracker.addDataTreeChange(currentAction, product);
if (getCurrent() instanceof NormalizedNodeResultBuilder) {
dataTreeChangeTracker.popPath();
return;