blob: 846b443a8f16ddce04d8e10b9328b9cb7b8909c8 [file] [log] [blame]
/*
* Copyright 2016-present Open Networking Foundation
*
* 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.ypm;
/**
* Represents implementation of interfaces to build and obtain YANG protocol metadata tree node.
*/
public class DefaultYpmNode implements YpmContext {
/**
* Name of the node.
*/
private String name;
/**
* Parent reference.
*/
private DefaultYpmNode parent;
/**
* First child reference.
*/
private DefaultYpmNode child;
/**
* Next sibling reference.
*/
private DefaultYpmNode nextSibling;
/**
* Previous sibling reference.
*/
private DefaultYpmNode previousSibling;
/**
* Protocol metadata object.
*/
private Object metaData;
/**
* Creates a specific type of node.
*
* @param name of ypm node
*/
public DefaultYpmNode(String name) {
setName(name);
}
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public DefaultYpmNode getParent() {
return parent;
}
@Override
public void setParent(YpmContext parent) {
this.parent = (DefaultYpmNode) parent;
}
@Override
public YpmContext getFirstChild() {
return child;
}
@Override
public YpmContext getChild(String ypmName) {
if (ypmName == null) {
// Input is null. So, will not proceed.
return null;
}
if (child == null) {
// No children
return null;
}
// Check the first child
if (child.name.equals(ypmName)) {
return child;
}
// Check its siblings
YpmContext currentChild = child;
while (currentChild.getNextSibling() != null) {
currentChild = currentChild.getNextSibling();
if (currentChild.getName().equals(ypmName)) {
return currentChild;
}
}
return null;
}
@Override
public void addChild(String ypmName) {
if (ypmName == null) {
// Input is null. So, will not proceed.
return;
}
if (getChild(ypmName) != null) {
// Already available with the same name. So, no need to add
return;
}
// Create new ypm node and attach to its parent
DefaultYpmNode newNode = new DefaultYpmNode(ypmName);
newNode.setParent(this);
// Check the first child
if (child == null) {
child = newNode;
return;
}
// Add it to its siblings
YpmContext currentChild = child;
// Go to the last child
while (currentChild.getNextSibling() != null) {
currentChild = currentChild.getNextSibling();
}
currentChild.setNextSibling(newNode);
newNode.setPreviousSibling((DefaultYpmNode) currentChild);
}
@Override
public YpmContext getSibling(String ypmName) {
if (ypmName == null) {
// Input is null. So, will not proceed.
return null;
}
YpmContext sibling = getNextSibling();
while (sibling != null) {
if (sibling.getName().equals(ypmName)) {
return sibling;
}
sibling = sibling.getNextSibling();
}
return null;
}
@Override
public void addSibling(String ypmName) {
if (ypmName == null) {
// Input is null. So, will not proceed.
return;
}
if (getSibling(ypmName) != null) {
// Already available with the same name. So, no need to add
return;
}
// Create new ypm node and attach to its parent
DefaultYpmNode newSibling = new DefaultYpmNode(ypmName);
newSibling.setParent(this.getParent());
// Add it as its sibling
YpmContext sibling = getNextSibling();
if (sibling == null) {
setNextSibling(newSibling);
newSibling.setPreviousSibling(this);
} else {
// Go to the last sibling
while (sibling.getNextSibling() != null) {
sibling = sibling.getNextSibling();
}
sibling.setNextSibling(newSibling);
newSibling.setPreviousSibling((DefaultYpmNode) sibling);
}
}
@Override
public DefaultYpmNode getNextSibling() {
return nextSibling;
}
@Override
public void setNextSibling(DefaultYpmNode sibling) {
nextSibling = sibling;
}
@Override
public DefaultYpmNode getPreviousSibling() {
return previousSibling;
}
@Override
public void setPreviousSibling(DefaultYpmNode sibling) {
this.previousSibling = sibling;
}
@Override
public Object getMetaData() {
return this.metaData;
}
@Override
public void setMetaData(Object data) {
this.metaData = data;
}
}