/* * Copyright (c) 2015 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.controller.netconf.mdsal.connector.ops; import com.google.common.collect.Lists; 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.PathArgument; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; public class DataTreeChangeTracker { private final ModifyAction defaultAction; private final Deque actions; private final Deque currentPath; private final ArrayList 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<>(); } public void pushAction(final ModifyAction action) { if (ModifyAction.DELETE.equals(action)) { deleteOperationTracker++; } if (ModifyAction.REMOVE.equals(action)) { removeOperationTracker++; } this.actions.push(action); } public ModifyAction peekAction() { return this.actions.peekFirst(); } public ModifyAction popAction() { final ModifyAction popResult = actions.pop(); if (ModifyAction.DELETE.equals(popResult)) { deleteOperationTracker--; } if (ModifyAction.REMOVE.equals(popResult)) { removeOperationTracker--; } return popResult; } public int getDeleteOperationTracker() { return deleteOperationTracker; } public int getRemoveOperationTracker() { return removeOperationTracker; } public void addDataTreeChange(final DataTreeChange change) { dataTreeChanges.add(change); } public ArrayList getDataTreeChanges() { return dataTreeChanges; } public ModifyAction getDefaultAction() { return defaultAction; } public void pushPath(final PathArgument pathArgument) { currentPath.push(pathArgument); } public PathArgument popPath() { return currentPath.pop(); } public Deque getCurrentPath() { return currentPath; } public static final class DataTreeChange { private final NormalizedNode changeRoot; private final ModifyAction action; private final List path; public DataTreeChange(final NormalizedNode changeRoot, final ModifyAction action, final ArrayList path) { this.changeRoot = changeRoot; this.action = action; this.path = Lists.reverse(path); } public NormalizedNode getChangeRoot() { return changeRoot; } public ModifyAction getAction() { return action; } public List getPath() { return path; } } }