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    }