X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fnetconf%2Fnetconf-util%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fnetconf%2Futil%2Fmapping%2FAbstractNetconfOperation.java;h=b7bbd3c6a70199cac0915d412568aae7d796d594;hb=860206dfce8edb0fe74be842d2101f0eac7db2bd;hp=5850e64a0591a4d58c320eb67330e1dc0aa55cae;hpb=a92d9d6a21a0f6ca8d2153795721f500eaf29ee9;p=controller.git diff --git a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/mapping/AbstractNetconfOperation.java b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/mapping/AbstractNetconfOperation.java index 5850e64a05..b7bbd3c6a7 100644 --- a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/mapping/AbstractNetconfOperation.java +++ b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/mapping/AbstractNetconfOperation.java @@ -11,15 +11,18 @@ package org.opendaylight.controller.netconf.util.mapping; import java.util.Map; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; -import org.opendaylight.controller.netconf.api.NetconfOperationRouter; import org.opendaylight.controller.netconf.mapping.api.HandlingPriority; import org.opendaylight.controller.netconf.mapping.api.NetconfOperation; +import org.opendaylight.controller.netconf.mapping.api.NetconfOperationChainedExecution; import org.opendaylight.controller.netconf.util.xml.XmlElement; import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.util.xml.XmlUtil; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +import com.google.common.base.Optional; public abstract class AbstractNetconfOperation implements NetconfOperation { private final String netconfSessionIdForReporting; @@ -28,7 +31,7 @@ public abstract class AbstractNetconfOperation implements NetconfOperation { this.netconfSessionIdForReporting = netconfSessionIdForReporting; } - public String getNetconfSessionIdForReporting() { + public final String getNetconfSessionIdForReporting() { return netconfSessionIdForReporting; } @@ -38,7 +41,7 @@ public abstract class AbstractNetconfOperation implements NetconfOperation { return canHandle(operationNameAndNamespace.getOperationName(), operationNameAndNamespace.getNamespace()); } - public static class OperationNameAndNamespace { + public static final class OperationNameAndNamespace { private final String operationName, namespace; public OperationNameAndNamespace(Document message) { @@ -63,37 +66,68 @@ public abstract class AbstractNetconfOperation implements NetconfOperation { XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0); } - protected abstract HandlingPriority canHandle(String operationName, String netconfOperationNamespace); + protected HandlingPriority canHandle(String operationName, String operationNamespace) { + return operationName.equals(getOperationName()) && operationNamespace.equals(getOperationNamespace()) + ? getHandlingPriority() + : HandlingPriority.CANNOT_HANDLE; + } + + protected HandlingPriority getHandlingPriority() { + return HandlingPriority.HANDLE_WITH_DEFAULT_PRIORITY; + } + + protected String getOperationNamespace() { + return XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0; + } + + protected abstract String getOperationName(); @Override - public Document handle(Document message, NetconfOperationRouter opRouter) throws NetconfDocumentedException { + public Document handle(Document requestMessage, + NetconfOperationChainedExecution subsequentOperation) throws NetconfDocumentedException { - XmlElement requestElement = getRequestElementWithCheck(message); + XmlElement requestElement = getRequestElementWithCheck(requestMessage); Document document = XmlUtil.newDocument(); XmlElement operationElement = requestElement.getOnlyChildElement(); Map attributes = requestElement.getAttributes(); - Element response = handle(document, operationElement, opRouter); - - Element rpcReply = document.createElementNS(XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0, - XmlNetconfConstants.RPC_REPLY_KEY); - rpcReply.appendChild(response); + Element response = handle(document, operationElement, subsequentOperation); + Element rpcReply = XmlUtil.createElement(document, XmlNetconfConstants.RPC_REPLY_KEY, Optional.of(XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0)); + + if(XmlElement.fromDomElement(response).hasNamespace()) { + rpcReply.appendChild(response); + } else { + Element responseNS = XmlUtil.createElement(document, response.getNodeName(), Optional.of(XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0)); + NodeList list = response.getChildNodes(); + while(list.getLength()!=0) { + responseNS.appendChild(list.item(0)); + } + rpcReply.appendChild(responseNS); + } for (String attrName : attributes.keySet()) { - rpcReply.setAttribute(attrName, attributes.get(attrName).getNodeValue()); + rpcReply.setAttributeNode((Attr) document.importNode(attributes.get(attrName), true)); } - document.appendChild(rpcReply); return document; } - protected abstract Element handle(Document document, XmlElement operationElement, NetconfOperationRouter opRouter) + protected abstract Element handle(Document document, XmlElement message, NetconfOperationChainedExecution subsequentOperation) throws NetconfDocumentedException; @Override public String toString() { - return getClass() + "{" + netconfSessionIdForReporting + '}'; + final StringBuffer sb = new StringBuffer(getClass().getName()); + try { + sb.append("{name=").append(getOperationName()); + } catch(UnsupportedOperationException e) { + // no problem + } + sb.append(", namespace=").append(getOperationNamespace()); + sb.append(", session=").append(netconfSessionIdForReporting); + sb.append('}'); + return sb.toString(); } }