X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=netconf%2Fnetconf-util%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetconf%2Futil%2Fmessages%2FSubtreeFilter.java;h=49fbc559be7c49a7da429603699800ed3d36ce36;hb=38e1f73f062455df1c833d75128919a4473a71d2;hp=73ce520d2b8774013082c389abb9ff49085473b2;hpb=af7f884b22abe43447b7173f841e82399a8d884d;p=netconf.git diff --git a/netconf/netconf-util/src/main/java/org/opendaylight/netconf/util/messages/SubtreeFilter.java b/netconf/netconf-util/src/main/java/org/opendaylight/netconf/util/messages/SubtreeFilter.java index 73ce520d2b..49fbc559be 100644 --- a/netconf/netconf-util/src/main/java/org/opendaylight/netconf/util/messages/SubtreeFilter.java +++ b/netconf/netconf-util/src/main/java/org/opendaylight/netconf/util/messages/SubtreeFilter.java @@ -5,16 +5,15 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.netconf.util.messages; -import com.google.common.base.Optional; -import java.io.IOException; import java.util.Map; -import org.opendaylight.controller.config.util.xml.DocumentedException; -import org.opendaylight.controller.config.util.xml.XmlElement; -import org.opendaylight.controller.config.util.xml.XmlUtil; +import java.util.Optional; +import javax.xml.XMLConstants; +import org.opendaylight.netconf.api.DocumentedException; +import org.opendaylight.netconf.api.xml.XmlElement; import org.opendaylight.netconf.api.xml.XmlNetconfConstants; +import org.opendaylight.netconf.api.xml.XmlUtil; import org.opendaylight.netconf.util.mapping.AbstractNetconfOperation.OperationNameAndNamespace; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,24 +21,29 @@ import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; -import org.xml.sax.SAXException; /** * See rfc6241 for details. */ -public class SubtreeFilter { +public final class SubtreeFilter { private static final Logger LOG = LoggerFactory.getLogger(SubtreeFilter.class); - public static Document applyRpcSubtreeFilter(Document requestDocument, Document rpcReply) throws DocumentedException { + private SubtreeFilter() { + + } + + public static Document applyRpcSubtreeFilter(final Document requestDocument, + final Document rpcReply) throws DocumentedException { OperationNameAndNamespace operationNameAndNamespace = new OperationNameAndNamespace(requestDocument); - if (XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0.equals(operationNameAndNamespace.getNamespace()) && - XmlNetconfConstants.GET.equals(operationNameAndNamespace.getOperationName()) || - XmlNetconfConstants.GET_CONFIG.equals(operationNameAndNamespace.getOperationName())) { + if (XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0.equals(operationNameAndNamespace.getNamespace()) + && XmlNetconfConstants.GET.equals(operationNameAndNamespace.getOperationName()) + || XmlNetconfConstants.GET_CONFIG.equals(operationNameAndNamespace.getOperationName())) { // process subtree filtering here, in case registered netconf operations do // not implement filtering. - Optional maybeFilter = operationNameAndNamespace.getOperationElement().getOnlyChildElementOptionally( - XmlNetconfConstants.FILTER, XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0); - if (!maybeFilter.isPresent()) { + Optional maybeFilter = operationNameAndNamespace.getOperationElement() + .getOnlyChildElementOptionally(XmlNetconfConstants.FILTER, + XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0); + if (maybeFilter.isEmpty()) { return rpcReply; } XmlElement filter = maybeFilter.get(); @@ -59,28 +63,30 @@ public class SubtreeFilter { * @param filter filter * @param notification notification * @return document containing filtered notification content - * @throws DocumentedException + * @throws DocumentedException if operation fails */ - public static Optional applySubtreeNotificationFilter(XmlElement filter, Document notification) throws DocumentedException { + public static Optional applySubtreeNotificationFilter(final XmlElement filter, + final Document notification) throws DocumentedException { removeEventTimeNode(notification); if (isSupported(filter)) { - return Optional.fromNullable(filteredNotification(filter, notification)); + return Optional.ofNullable(filteredNotification(filter, notification)); } return Optional.of(extractNotificationContent(notification)); } - private static void removeEventTimeNode(Document document) { - final Node eventTimeNode = document.getDocumentElement().getElementsByTagNameNS( - XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_CAPABILITY_NOTIFICATION_1_0, XmlNetconfConstants.EVENT_TIME).item(0); + private static void removeEventTimeNode(final Document document) { + final Node eventTimeNode = document.getDocumentElement().getElementsByTagNameNS(XmlNetconfConstants + .URN_IETF_PARAMS_NETCONF_CAPABILITY_NOTIFICATION_1_0, XmlNetconfConstants.EVENT_TIME).item(0); document.getDocumentElement().removeChild(eventTimeNode); } - private static boolean isSupported(XmlElement filter) { - return "subtree".equals(filter.getAttribute("type"))|| - "subtree".equals(filter.getAttribute("type", XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0)); + private static boolean isSupported(final XmlElement filter) { + return "subtree".equals(filter.getAttribute("type")) + || "subtree".equals(filter.getAttribute("type", + XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0)); } - private static Document extractNotificationContent(Document notification) throws DocumentedException { + private static Document extractNotificationContent(final Document notification) throws DocumentedException { XmlElement root = XmlElement.fromDomElement(notification.getDocumentElement()); XmlElement content = root.getOnlyChildElement(); notification.removeChild(root.getDomElement()); @@ -88,28 +94,30 @@ public class SubtreeFilter { return notification; } - private static Document filteredNotification(XmlElement filter, Document originalNotification) throws DocumentedException { + private static Document filteredNotification(final XmlElement filter, + final Document originalNotification) throws DocumentedException { Document result = XmlUtil.newDocument(); XmlElement dataSrc = XmlElement.fromDomDocument(originalNotification); Element dataDst = (Element) result.importNode(dataSrc.getDomElement(), false); for (XmlElement filterChild : filter.getChildElements()) { addSubtree2(filterChild, dataSrc.getOnlyChildElement(), XmlElement.fromDomElement(dataDst)); } - if(dataDst.getFirstChild() != null) { + if (dataDst.getFirstChild() != null) { result.appendChild(dataDst.getFirstChild()); return result; - } else { - return null; } + return null; } - private static Document filtered(XmlElement filter, Document originalReplyDocument) throws DocumentedException { + private static Document filtered(final XmlElement filter, final Document originalReplyDocument) + throws DocumentedException { Document result = XmlUtil.newDocument(); // even if filter is empty, copy /rpc/data Element rpcReply = originalReplyDocument.getDocumentElement(); Node rpcReplyDst = result.importNode(rpcReply, false); result.appendChild(rpcReplyDst); - XmlElement dataSrc = XmlElement.fromDomElement(rpcReply).getOnlyChildElement("data", XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0); + XmlElement dataSrc = XmlElement.fromDomElement(rpcReply).getOnlyChildElement("data", + XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0); Element dataDst = (Element) result.importNode(dataSrc.getDomElement(), false); rpcReplyDst.appendChild(dataDst); addSubtree(filter, dataSrc, XmlElement.fromDomElement(dataDst)); @@ -117,7 +125,8 @@ public class SubtreeFilter { return result; } - private static void addSubtree(XmlElement filter, XmlElement src, XmlElement dst) throws DocumentedException { + private static void addSubtree(final XmlElement filter, final XmlElement src, final XmlElement dst) + throws DocumentedException { for (XmlElement srcChild : src.getChildElements()) { for (XmlElement filterChild : filter.getChildElements()) { addSubtree2(filterChild, srcChild, dst); @@ -125,21 +134,23 @@ public class SubtreeFilter { } } - private static MatchingResult addSubtree2(XmlElement filter, XmlElement src, XmlElement dstParent) throws DocumentedException { + private static MatchingResult addSubtree2(final XmlElement filter, final XmlElement src, + final XmlElement dstParent) throws DocumentedException { Document document = dstParent.getDomElement().getOwnerDocument(); MatchingResult matches = matches(src, filter); if (matches != MatchingResult.NO_MATCH && matches != MatchingResult.CONTENT_MISMATCH) { // copy srcChild to dst - boolean filterHasChildren = filter.getChildElements().isEmpty() == false; + boolean filterHasChildren = !filter.getChildElements().isEmpty(); // copy to depth if this is leaf of filter tree - Element copied = (Element) document.importNode(src.getDomElement(), filterHasChildren == false); - boolean shouldAppend = filterHasChildren == false; + Element copied = (Element) document.importNode(src.getDomElement(), !filterHasChildren); + boolean shouldAppend = !filterHasChildren; if (filterHasChildren) { // this implies TAG_MATCH // do the same recursively int numberOfTextMatchingChildren = 0; for (XmlElement srcChild : src.getChildElements()) { for (XmlElement filterChild : filter.getChildElements()) { - MatchingResult childMatch = addSubtree2(filterChild, srcChild, XmlElement.fromDomElement(copied)); + MatchingResult childMatch = + addSubtree2(filterChild, srcChild, XmlElement.fromDomElement(copied)); if (childMatch == MatchingResult.CONTENT_MISMATCH) { return MatchingResult.NO_MATCH; } @@ -167,9 +178,9 @@ public class SubtreeFilter { * Shallow compare src node to filter: tag name and namespace must match. * If filter node has no children and has text content, it also must match. */ - private static MatchingResult matches(XmlElement src, XmlElement filter) throws DocumentedException { - boolean tagMatch = src.getName().equals(filter.getName()) && - src.getNamespaceOptionally().equals(filter.getNamespaceOptionally()); + private static MatchingResult matches(final XmlElement src, final XmlElement filter) throws DocumentedException { + boolean tagMatch = src.getName().equals(filter.getName()) + && src.getNamespaceOptionally().equals(filter.getNamespaceOptionally()); MatchingResult result = null; if (tagMatch) { // match text content @@ -185,7 +196,7 @@ public class SubtreeFilter { if (result == null) { for (Attr attr : filter.getAttributes().values()) { // ignore namespace declarations - if (XmlUtil.XMLNS_URI.equals(attr.getNamespaceURI()) == false ) { + if (!XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(attr.getNamespaceURI())) { // find attr with matching localName(), namespaceURI(), == value() in src String found = src.getAttribute(attr.getLocalName(), attr.getNamespaceURI()); if (attr.getValue().equals(found) && result != MatchingResult.NO_MATCH) { @@ -207,7 +218,8 @@ public class SubtreeFilter { return result; } - private static boolean prefixedContentMatches(final XmlElement filter, final XmlElement src) throws DocumentedException { + private static boolean prefixedContentMatches(final XmlElement filter, + final XmlElement src) throws DocumentedException { final Map.Entry prefixToNamespaceOfFilter; final Map.Entry prefixToNamespaceOfSrc; try { @@ -228,8 +240,10 @@ public class SubtreeFilter { return false; } - final String unprefixedFilterContent = filter.getTextContent().substring(prefixToNamespaceOfFilter.getKey().length() + 1); - final String unprefixedSrcContnet = src.getTextContent().substring(prefixToNamespaceOfSrc.getKey().length() + 1); + final String unprefixedFilterContent = + filter.getTextContent().substring(prefixToNamespaceOfFilter.getKey().length() + 1); + final String unprefixedSrcContnet = + src.getTextContent().substring(prefixToNamespaceOfSrc.getKey().length() + 1); // Finally compare unprefixed content return unprefixedFilterContent.equals(unprefixedSrcContnet); }