jxpathfilter.java
来自「提供ESB 应用mule源代码 提供ESB 应用mule源代码」· Java 代码 · 共 309 行
JAVA
309 行
/* * $Id: JXPathFilter.java 12422 2008-07-29 19:28:48Z tcarlson $ * -------------------------------------------------------------------------------------- * Copyright (c) MuleSource, Inc. All rights reserved. http://www.mulesource.com * * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */package org.mule.module.xml.filters;import org.mule.api.MuleMessage;import org.mule.api.routing.filter.Filter;import org.mule.module.xml.util.XMLUtils;import java.util.Iterator;import java.util.Map;import org.apache.commons.jxpath.AbstractFactory;import org.apache.commons.jxpath.JXPathContext;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.XPath;/** * <code>JXPathFilter</code> evaluates an XPath expression against a W3C Document, * XML string, or Java bean and returns true if the result is as expected. */public class JXPathFilter implements Filter{ protected transient Log logger = LogFactory.getLog(getClass()); private String pattern; private String expectedValue; private Map namespaces = null; private Map contextProperties = null; private AbstractFactory factory; private boolean lenient = true; public JXPathFilter() { super(); } public JXPathFilter(String pattern) { this.pattern = pattern; } public JXPathFilter(String pattern, String expectedValue) { this.pattern = pattern; this.expectedValue = expectedValue; } public boolean accept(MuleMessage obj) { if (obj.getPayload() instanceof byte[]) { try { return accept(obj.getPayloadAsString()); } catch (Exception e) { logger.warn("JxPath filter rejected message because it could not convert from byte[] to String" + e.getMessage(), e); return false; } } return accept(obj.getPayload()); } private boolean accept(Object obj) { if (obj == null) { logger.warn("Applying JXPathFilter to null object."); return false; } if (pattern == null) { logger.warn("Expression for JXPathFilter is not set."); return false; } if (expectedValue == null) { // Handle the special case where the expected value really is null. if (pattern.endsWith("= null") || pattern.endsWith("=null")) { expectedValue = "null"; pattern = pattern.substring(0, pattern.lastIndexOf("=")); } else { if (logger.isInfoEnabled()) { logger.info("Expected value for JXPathFilter is not set, using 'true' by default"); } expectedValue = Boolean.TRUE.toString(); } } Object xpathResult = null; boolean accept = false; Document dom4jDoc; try { dom4jDoc = XMLUtils.toDocument(obj); } catch (Exception e) { logger.warn("JxPath filter rejected message because of an error while parsing XML: " + e.getMessage(), e); return false; } // Payload is XML if (dom4jDoc != null) { if (namespaces == null) { // no namespace defined, let's perform a direct evaluation xpathResult = dom4jDoc.valueOf(pattern); } else { // create an xpath expression with namespaces and evaluate it XPath xpath = DocumentHelper.createXPath(pattern); xpath.setNamespaceURIs(namespaces); xpathResult = xpath.valueOf(dom4jDoc); } } // Payload is a Java object else { if (logger.isDebugEnabled()) { logger.debug("Passing object of type " + obj.getClass().getName() + " to JXPathContext"); } JXPathContext context = JXPathContext.newContext(obj); initialise(context); xpathResult = context.getValue(pattern); } if (logger.isDebugEnabled()) { logger.debug("JXPathFilter Expression result = '" + xpathResult + "' - Expected value = '" + expectedValue + "'"); } // Compare the XPath result with the expected result. if (xpathResult != null) { accept = xpathResult.toString().equals(expectedValue); } else { // A null result was actually expected. if (expectedValue.equals("null")) { accept = true; } // A null result was not expected, something probably went wrong. else { logger.warn("JXPathFilter expression evaluates to null: " + pattern); } } if (logger.isDebugEnabled()) { logger.debug("JXPathFilter accept object : " + accept); } return accept; } /** * Initializes the JXPathContext based on any relevant properties set for the * filter. * * @param context the JXPathContext to initialize */ protected void initialise(JXPathContext context) { Map.Entry entry; if (namespaces != null) { if (logger.isDebugEnabled()) { logger.debug("Initializing JXPathContext with namespaces: " + namespaces); } for (Iterator iterator = namespaces.entrySet().iterator(); iterator.hasNext();) { entry = (Map.Entry) iterator.next(); context.registerNamespace(entry.getKey().toString(), entry.getValue().toString()); } } if (contextProperties != null) { if (logger.isDebugEnabled()) { logger.debug("Initializing JXPathContext with properties: " + contextProperties); } for (Iterator iterator = contextProperties.entrySet().iterator(); iterator.hasNext();) { entry = (Map.Entry) iterator.next(); context.setValue(entry.getKey().toString(), entry.getValue()); } } if (factory != null) { context.setFactory(factory); } context.setLenient(lenient); } /** @return XPath expression */ public String getPattern() { return pattern; } /** @param pattern The XPath expression */ public void setPattern(String pattern) { this.pattern = pattern; } /** @return The expected result value of the XPath expression */ public String getExpectedValue() { return expectedValue; } /** Sets the expected result value of the XPath expression */ public void setExpectedValue(String expectedValue) { this.expectedValue = expectedValue; } /** * @return The expected result value of the XPath expression * @deprecated Use <code>getExpectedValue()</code>. */ public String getValue() { return getExpectedValue(); } /** * Sets the expected result value of the XPath expression * * @deprecated Use <code>setExpectedValue(String expectedValue)</code>. */ public void setValue(String value) { setExpectedValue(value); } public Map getNamespaces() { return namespaces; } public void setNamespaces(Map namespaces) { this.namespaces = namespaces; } public Map getContextProperties() { return contextProperties; } public void setContextProperties(Map contextProperties) { this.contextProperties = contextProperties; } public AbstractFactory getFactory() { return factory; } public void setFactory(AbstractFactory factory) { this.factory = factory; } public boolean isLenient() { return lenient; } public void setLenient(boolean lenient) { this.lenient = lenient; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?