blob: a1138ce0d86a59ebaec3e2ddc1b9aae3a4087a48 [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.ych.defaultcodecs.netconf;
import com.google.common.collect.ImmutableSet;
import org.dom4j.Element;
import org.onosproject.yms.app.ych.YchException;
import org.onosproject.yms.ydt.YmsOperationType;
import java.util.Iterator;
import java.util.Set;
import static org.onosproject.yms.app.ych.defaultcodecs.netconf.NetconfCodecConstants.CONFIG;
import static org.onosproject.yms.app.ych.defaultcodecs.netconf.NetconfCodecConstants.DATA;
import static org.onosproject.yms.app.ych.defaultcodecs.netconf.NetconfCodecConstants.EDIT_CONFIG;
import static org.onosproject.yms.app.ych.defaultcodecs.netconf.NetconfCodecConstants.FILTER;
import static org.onosproject.yms.app.ych.defaultcodecs.netconf.NetconfCodecConstants.GET;
import static org.onosproject.yms.app.ych.defaultcodecs.netconf.NetconfCodecConstants.GET_CONFIG;
import static org.onosproject.yms.ydt.YmsOperationType.EDIT_CONFIG_REQUEST;
import static org.onosproject.yms.ydt.YmsOperationType.QUERY_CONFIG_REQUEST;
import static org.onosproject.yms.ydt.YmsOperationType.QUERY_REQUEST;
/**
* Represents an YCH netconf codec to find the root element in the xml string.
*/
public class NetconfCodec {
private static final String PROTO_OPER_ERROR = "Received protocol " +
"operation is not same as in the XML string: ";
private static final Set<String> ALLOWABLE_NAMES =
ImmutableSet.of(CONFIG, DATA, FILTER);
/**
* Validate the operation type.
*
* @param elementName tag name in the xml string
* @param opType operation type
*/
private void validateOpType(String elementName, YmsOperationType opType) {
switch (elementName) {
// edit-config tag name is found in xml then check the
// interaction type.
case EDIT_CONFIG: {
if (opType != EDIT_CONFIG_REQUEST) {
throw new YchException(PROTO_OPER_ERROR + opType);
}
break;
}
// get-config tag name is found in xml then check the
// interaction type.
case GET_CONFIG: {
if (opType != QUERY_CONFIG_REQUEST) {
throw new YchException(PROTO_OPER_ERROR + opType);
}
break;
}
// get tag name is found in xml then check the interaction type.
case GET: {
if (opType != QUERY_REQUEST) {
throw new YchException(PROTO_OPER_ERROR + opType);
}
break;
}
default: {
//TODO
}
}
}
/**
* Returns the data root element based on the NETCONF operation parameter.
*
* @param rootElement root element of document tree to find the root node
* @param opType protocol operation being performed
* @return the data root node element
*/
public Element getDataRootElement(Element rootElement,
YmsOperationType opType) {
Element retElement = null;
String elementName = rootElement.getName();
try {
validateOpType(elementName, opType);
// If config tag name is found then set the root element node.
if (DATA.equals(elementName)
|| CONFIG.equals(elementName)
|| FILTER.equals(elementName)) {
return rootElement;
}
// If element has child node then traverse through the child node
// by recursively calling getDataRootElement method.
if (rootElement.hasContent() && !rootElement.isTextOnly()) {
for (Iterator i = rootElement.elementIterator();
i.hasNext();) {
Element childElement = (Element) i.next();
retElement = getDataRootElement(childElement, opType);
}
}
} catch (Exception e) {
// TODO
}
return retElement;
}
}