1 18 package org.apache.activemq.filter; 19 20 import java.io.StringReader ; 21 22 import javax.jms.BytesMessage ; 23 import javax.jms.JMSException ; 24 import javax.jms.TextMessage ; 25 import javax.xml.xpath.XPath ; 26 import javax.xml.xpath.XPathConstants ; 27 import javax.xml.xpath.XPathExpressionException ; 28 import javax.xml.xpath.XPathFactory ; 29 30 import org.apache.activemq.command.Message; 31 import org.apache.activemq.util.ByteArrayInputStream; 32 import org.xml.sax.InputSource ; 33 34 public class JAXPXPathEvaluator implements XPathExpression.XPathEvaluator { 35 36 private static final XPathFactory factory = XPathFactory.newInstance(); 37 private javax.xml.xpath.XPathExpression expression; 38 39 public JAXPXPathEvaluator(String xpathExpression) { 40 try { 41 XPath xpath = factory.newXPath(); 42 expression = xpath.compile(xpathExpression); 43 } catch (XPathExpressionException e) { 44 throw new RuntimeException ("Invalid XPath expression: "+xpathExpression); 45 } 46 } 47 48 public boolean evaluate(Message message) throws JMSException { 49 if( message instanceof TextMessage ) { 50 String text = ((TextMessage )message).getText(); 51 return evaluate(text); 52 } else if ( message instanceof BytesMessage ) { 53 BytesMessage bm = (BytesMessage ) message; 54 byte data[] = new byte[(int) bm.getBodyLength()]; 55 bm.readBytes(data); 56 return evaluate(data); 57 } 58 return false; 59 } 60 61 private boolean evaluate(byte[] data) { 62 try { 63 InputSource inputSource = new InputSource (new ByteArrayInputStream(data)); 64 return ((Boolean )expression.evaluate(inputSource, XPathConstants.BOOLEAN)).booleanValue(); 65 } catch (XPathExpressionException e) { 66 return false; 67 } 68 } 69 70 private boolean evaluate(String text) { 71 try { 72 InputSource inputSource = new InputSource (new StringReader (text)); 73 return ((Boolean )expression.evaluate(inputSource, XPathConstants.BOOLEAN)).booleanValue(); 74 } catch (XPathExpressionException e) { 75 return false; 76 } 77 } 78 } 79 | Popular Tags |