001 package org.activemq.filter;
002
003 import java.io.ByteArrayInputStream;
004 import java.io.StringReader;
005
006 import javax.jms.BytesMessage;
007 import javax.jms.JMSException;
008 import javax.jms.Message;
009 import javax.jms.TextMessage;
010 import javax.xml.xpath.XPath;
011 import javax.xml.xpath.XPathConstants;
012 import javax.xml.xpath.XPathExpressionException;
013 import javax.xml.xpath.XPathFactory;
014
015 import org.xml.sax.InputSource;
016
017 public class JAXPXPathEvaluator implements XPathExpression.XPathEvaluator {
018
019 private static final XPathFactory factory = XPathFactory.newInstance();
020 private javax.xml.xpath.XPathExpression expression;
021
022 public JAXPXPathEvaluator(String xpathExpression) {
023 try {
024 XPath xpath = factory.newXPath();
025 expression = xpath.compile(xpathExpression);
026 } catch (XPathExpressionException e) {
027 throw new RuntimeException("Invalid XPath expression: "+xpathExpression);
028 }
029 }
030
031 public boolean evaluate(Message message) throws JMSException {
032 if( message instanceof TextMessage ) {
033 String text = ((TextMessage)message).getText();
034 return evaluate(text);
035 } else if ( message instanceof BytesMessage ) {
036 BytesMessage bm = (BytesMessage) message;
037 byte data[] = new byte[(int) bm.getBodyLength()];
038 bm.readBytes(data);
039 return evaluate(data);
040 }
041 return false;
042 }
043
044 private boolean evaluate(byte[] data) {
045 try {
046 InputSource inputSource = new InputSource(new ByteArrayInputStream(data));
047 return ((Boolean)expression.evaluate(inputSource, XPathConstants.BOOLEAN)).booleanValue();
048 } catch (XPathExpressionException e) {
049 return false;
050 }
051 }
052
053 private boolean evaluate(String text) {
054 try {
055 InputSource inputSource = new InputSource(new StringReader(text));
056 return ((Boolean)expression.evaluate(inputSource, XPathConstants.BOOLEAN)).booleanValue();
057 } catch (XPathExpressionException e) {
058 return false;
059 }
060 }
061 }