blob: 8e6238f5281c1cb0c00fa86f1bd19e3f9bb3334a [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.app.ypm;
import org.onosproject.yms.ydt.YdtContext;
import org.onosproject.yms.ypm.DefaultYpmNode;
import org.onosproject.yms.ypm.YpmContext;
import org.onosproject.yms.ypm.YpmService;
import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Represents implementation of YANG protocol metadata manager.
*/
@Component(immediate = true, service = YpmService.class)
public class YpmManager implements YpmService {
private final Logger log = LoggerFactory.getLogger(getClass());
private YpmContext rootYpmNode;
@Activate
public void activate() {
log.info("Started");
}
@Deactivate
public void deactivate() {
log.info("Stopped");
}
@Override
public YpmContext getProtocolData(YdtContext rootYdtNode) {
if (rootYdtNode == null) {
log.debug("Input data is null. So, will not proceed.");
return null;
}
// Iterate through YDT and search the path in YPM tree and create new YPM tree equivalent to given YDT
// and return it.
if (rootYpmNode == null) {
log.debug("YPM tree has no data.");
return null;
}
YdtContext currentYdtNode = rootYdtNode;
YpmContext currentYpmNode = rootYpmNode;
YpmContext rootRetYpmNode = new DefaultYpmNode(currentYdtNode.getName());
YpmContext currRetYpmNode = rootRetYpmNode;
while (currentYdtNode != null) {
// Each ypm node can have children. So, create new corresponding ypm child
// and add it to new returning ypm tree, otherwise return new ypm tree.
YdtContext nextNode = currentYdtNode.getFirstChild();
if (nextNode != null) {
YpmContext ypmChild = currentYpmNode.getChild(nextNode.getName());
if (ypmChild != null) {
currRetYpmNode.addChild(ypmChild.getName());
} else {
return rootRetYpmNode;
}
currentYdtNode = nextNode;
currentYpmNode = currentYpmNode.getChild(nextNode.getName());
currRetYpmNode = currRetYpmNode.getChild(nextNode.getName());
currRetYpmNode.setMetaData(currentYpmNode.getMetaData());
continue;
}
// No child nodes, so walk tree
while (currentYdtNode != null) {
// Each ypm node can have sibling. So, create new corresponding ypm sibling node
// and add it to new returning ypm tree, otherwise return new ypm tree.
nextNode = currentYdtNode.getNextSibling();
if (nextNode != null) {
YpmContext ypmSibling = currentYpmNode.getSibling(nextNode.getName());
if (ypmSibling != null) {
currRetYpmNode.addSibling(ypmSibling.getName());
} else {
return rootRetYpmNode;
}
currentYdtNode = nextNode;
currentYpmNode = currentYpmNode.getSibling(nextNode.getName());
currRetYpmNode = currRetYpmNode.getSibling(nextNode.getName());
currRetYpmNode.setMetaData(currentYpmNode.getMetaData());
break;
}
// Move up
if (currentYdtNode == rootYdtNode) {
currentYdtNode = null;
} else {
currentYdtNode = currentYdtNode.getParent();
currentYpmNode = currentYpmNode.getParent();
currRetYpmNode = currRetYpmNode.getParent();
}
}
}
return rootRetYpmNode;
}
@Override
public void setProtocolData(YdtContext rootYdtNode, Object data) {
if (rootYdtNode == null || data == null) {
log.debug("Input data is null. So, will not proceed.");
return;
}
// Iterate through YDT and add each node of this path to ypm tree if it is not exists
YdtContext currentYdtNode = rootYdtNode;
YpmContext currentYpmNode = rootYpmNode;
while (currentYdtNode != null) {
// Check the ypm root node first
if (rootYpmNode == null) {
rootYpmNode = new DefaultYpmNode(currentYdtNode.getName());
currentYpmNode = rootYpmNode;
// In logical node, should not set protocol metadata
}
// Move down to first child
YdtContext nextNode = currentYdtNode.getFirstChild();
if (nextNode != null) {
// Each ypm node can have sibling. So, get corresponding sibling node, otherwise create it.
if (currentYpmNode.getChild(nextNode.getName()) == null) {
currentYpmNode.addChild(nextNode.getName());
}
currentYpmNode = currentYpmNode.getChild(nextNode.getName());
// Set/update protocol metadata
currentYpmNode.setMetaData(data);
currentYdtNode = nextNode;
continue;
}
// No child nodes, so walk tree
while (currentYdtNode != null) {
// Move to sibling if possible.
nextNode = currentYdtNode.getNextSibling();
if (nextNode != null) {
// Each ypm node can have children (sibling). So, get corresponding ypm child, otherwise create it.
if (currentYpmNode.getSibling(nextNode.getName()) == null) {
currentYpmNode.addSibling(nextNode.getName());
}
currentYpmNode = currentYpmNode.getSibling(nextNode.getName());
// Set/update protocol metadata
currentYpmNode.setMetaData(data);
currentYdtNode = nextNode;
break;
}
// Move up
if (currentYdtNode == rootYdtNode) {
currentYdtNode = null;
} else {
currentYdtNode = currentYdtNode.getParent();
currentYpmNode = currentYpmNode.getParent();
}
}
}
}
}