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);
}