/* * Copyright 2016-present Open Networking Laboratory * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.onosproject.yms.app.ydt; import org.onosproject.yangutils.datamodel.YangSchemaNode; import org.onosproject.yms.ydt.YdtContext; import org.onosproject.yms.ydt.YdtContextOperationType; import java.util.List; import static org.onosproject.yms.app.ydt.YdtAppNodeOperationType.BOTH; import static org.onosproject.yms.app.ydt.YdtUtils.getAppOpTypeFromYdtOpType; /** * Abstraction of an entity which represents YDT application context * information. This context information will be used by protocol to obtain * the information associated with YDT application tree node. */ public final class DefaultYdtAppContext<T extends AppData> implements YdtAppContext { /* * Parent reference. */ private YdtAppContext parent; /* * First child reference. */ private YdtAppContext child; /* * Next sibling reference. */ private YdtAppContext nextSibling; /* * Previous sibling reference. */ private YdtAppContext previousSibling; /* * Last child reference. */ private YdtAppContext lastChild; /* * YDT application tree extended information. */ private final T appData; /* * Reference for operation type for application root node. */ private YdtAppNodeOperationType operationType; /** * Creates an instance of YANG application tree which is used by all node * needs delete list. * * @param data application data */ DefaultYdtAppContext(T data) { appData = data; } @Override public void updateAppOperationType(YdtContextOperationType ydtOpType) { if (parent == null) { return; } YdtAppNodeOperationType opType = getAppOpTypeFromYdtOpType(ydtOpType); YdtAppContext curNode = this; YdtAppNodeOperationType parentOpType = operationType; if (opType != parentOpType) { if (parentOpType != null) { while (curNode.getOperationType() != BOTH && curNode.getParent() != null) { curNode.setOperationType(BOTH); curNode = curNode.getParent(); } } else { // If operation type for ydt node is "NONE" then in that // case operation type for module node in app tree set as null. // Once the target node operation type received by ydt then // operation type for module node will be updated with the // same target node operation type in app tree. while (curNode.getParent() != null && curNode .getOperationType() == null) { curNode.setOperationType(opType); curNode = curNode.getParent(); } } } } @Override public void setAppData(YdtNode moduleNode, YangSchemaNode augmentNode) { if (augmentNode != null) { ((AugmentAppData) appData).setAugmentingSchemaNode(augmentNode); } else { ((ModuleAppData) appData).setModuleContext(moduleNode); } } @Override public AppData getAppData() { return appData; } @Override public YdtAppContext getParent() { return parent; } @Override public void setParent(YdtAppContext parent) { this.parent = parent; } @Override public YdtAppContext getFirstChild() { return child; } /** * Sets the context of first child. * * @param child node */ private void setChild(YdtAppContext child) { this.child = child; } @Override public YdtAppContext getNextSibling() { return nextSibling; } @Override public void setNextSibling(YdtAppContext context) { this.nextSibling = context; } @Override public YdtAppContext getPreviousSibling() { return previousSibling; } @Override public void setPreviousSibling(YdtAppContext context) { this.previousSibling = context; } @Override public YdtAppNodeOperationType getOperationType() { return operationType; } @Override public void setOperationType(YdtAppNodeOperationType opType) { operationType = opType; } @Override public List<YdtContext> getDeleteNodes() { return ((ModuleAppData) appData).getDeleteNodes(); } @Override public void addDeleteNode(YdtNode node) { DefaultYdtAppContext<?> curNode = this; while (curNode.getParent().getParent() != null) { curNode = (DefaultYdtAppContext<?>) curNode.getParent(); } ((ModuleAppData) curNode.appData).addDeleteNodes(node); } @Override public YdtContext getModuleContext() { return ((ModuleAppData) appData).getModuleContext(); } @Override public YangSchemaNode getAugmentingSchemaNode() { return ((AugmentAppData) appData).getAugmentingSchemaNode(); } @Override public void setAugmentingSchemaNode(YangSchemaNode schemaNode) { ((AugmentAppData) appData).setAugmentingSchemaNode(schemaNode); } @Override public YdtAppContext getLastChild() { return lastChild; } /** * Sets the context of last child. * * @param child node */ private void setLastChild(YdtAppContext child) { lastChild = child; } @Override public void addChild(YdtAppContext newChild) { if (newChild.getParent() == null) { newChild.setParent(this); } // First child to be added. if (getFirstChild() == null) { setChild(newChild); // Update last child. setLastChild(newChild); return; } // If the new node needs to be add as last child. YdtAppContext curNode = getLastChild(); curNode.setNextSibling(newChild); newChild.setPreviousSibling(curNode); setLastChild(newChild); } @Override public YangSchemaNode getYangSchemaNode() { return appData.getSchemaNode(); } }