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 }