View Javadoc

1   /*
2    * $Id: JXPathFilterTestCase.java 22387 2011-07-12 03:53:36Z dirk.olmes $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
9    */
10  
11  package org.mule.routing.filters.xml;
12  
13  import org.mule.DefaultMuleMessage;
14  import org.mule.module.xml.filters.JXPathFilter;
15  import org.mule.module.xml.util.XMLTestUtils;
16  import org.mule.tck.junit4.AbstractMuleContextTestCase;
17  
18  import java.io.InputStream;
19  import java.io.StringReader;
20  import java.util.HashMap;
21  import java.util.Iterator;
22  import java.util.List;
23  import java.util.Map;
24  
25  import javax.xml.parsers.DocumentBuilderFactory;
26  import javax.xml.stream.XMLStreamReader;
27  
28  import org.apache.commons.io.IOUtils;
29  import org.dom4j.DocumentHelper;
30  import org.junit.Test;
31  import org.xml.sax.InputSource;
32  
33  import static org.junit.Assert.assertNotNull;
34  import static org.junit.Assert.assertTrue;
35  import static org.junit.Assert.fail;
36  
37  public class JXPathFilterTestCase extends AbstractMuleContextTestCase
38  {
39      private String xmlStringInput = null;
40      private String xmlStringInputNS = null;
41      private org.dom4j.Document dom4jDocumentInput = null;
42      private org.dom4j.Document dom4jDocumentInputNS = null;
43      private org.w3c.dom.Document w3cDocumentInput = null;
44      private org.w3c.dom.Document w3cDocumentInputNS = null;
45      private JXPathFilter simpleFilter = null;
46      private JXPathFilter nsAwareFilter = null;
47  
48      // @SuppressWarnings("unchecked")
49      protected void doSetUp() throws Exception
50      {
51          final ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader();
52  
53          // Read No-Namespace Xml file
54          InputStream is = currentClassLoader.getResourceAsStream("cdcatalog.xml");
55          assertNotNull("Test resource 'cdcatalog.xml' not found.", is);
56          xmlStringInput = IOUtils.toString(is);
57          dom4jDocumentInput = DocumentHelper.parseText(xmlStringInput);
58          w3cDocumentInput = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(
59                  new InputSource(new StringReader(xmlStringInput)));
60          simpleFilter = new JXPathFilter();
61          simpleFilter.setMuleContext(muleContext);
62  
63          // Read Namespace Xml file
64          is = currentClassLoader.getResourceAsStream("cdcatalogNS.xml");
65          assertNotNull("Test resource 'cdcatalogNS.xml' not found.", is);
66          xmlStringInputNS = IOUtils.toString(is);
67          dom4jDocumentInputNS = DocumentHelper.parseText(xmlStringInputNS);
68          DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
69          dbf.setNamespaceAware(true);
70          w3cDocumentInputNS = dbf.newDocumentBuilder().parse(
71                  new InputSource(new StringReader(xmlStringInputNS)));
72          nsAwareFilter = new JXPathFilter();
73          Map namespaces = new HashMap();
74          namespaces.put("nsone", "http://one.org");
75          namespaces.put("nstwo", "http://two.org");
76          nsAwareFilter.setNamespaces(namespaces);
77          nsAwareFilter.setMuleContext(muleContext);
78          muleContext.start();
79      }
80  
81      @Test
82      public void testBogusExpression() throws Exception
83      {
84          try
85          {
86              JXPathFilter myFilter = createObject(JXPathFilter.class);
87              myFilter.setPattern("foo/bar/");
88              myFilter.accept(new DefaultMuleMessage(xmlStringInput, muleContext));
89              fail("Invalid XPath should have thrown an exception");
90          }
91          //Now we have Jaxen on the class path we get a Jaxen exception, but this is an unchecked exception
92          catch (Exception e)
93          {
94              // expected
95          }
96      }
97  
98      private void doTestExpectedValueFilter(Object xmlData) throws Exception
99      {
100         simpleFilter.setPattern("catalog/cd[3]/title");
101         simpleFilter.setExpectedValue("Greatest Hits");
102         assertTrue(simpleFilter.accept(new DefaultMuleMessage(xmlData, muleContext)));
103     }
104 
105     private void doTestBooleanFilter1(Object xmlData) throws Exception
106     {
107         simpleFilter.setPattern("(catalog/cd[3]/title) ='Greatest Hits'");
108         assertTrue(simpleFilter.accept(new DefaultMuleMessage(xmlData, muleContext)));
109     }
110 
111     private void doTestBooleanFilter2(Object xmlData) throws Exception
112     {
113         simpleFilter.setPattern("count(catalog/cd) = 26");
114         assertTrue(simpleFilter.accept(new DefaultMuleMessage(xmlData, muleContext)));
115     }
116 
117     private void doTestExpectedValueFilterNS(Object xmlData) throws Exception
118     {
119         nsAwareFilter.setPattern("nsone:catalog/nstwo:cd[3]/title");
120         nsAwareFilter.setExpectedValue("Greatest Hits");
121         assertTrue(nsAwareFilter.accept(new DefaultMuleMessage(xmlData, muleContext)));
122     }
123 
124     private void doTestBooleanFilter1NS(Object xmlData) throws Exception
125     {
126         nsAwareFilter.setPattern("(nsone:catalog/nstwo:cd[3]/title) ='Greatest Hits'");
127         assertTrue(nsAwareFilter.accept(new DefaultMuleMessage(xmlData, muleContext)));
128     }
129 
130     private void doTestBooleanFilter2NS(Object xmlData) throws Exception
131     {
132         nsAwareFilter.setPattern("count(nsone:catalog/nstwo:cd) = 26");
133         assertTrue(nsAwareFilter.accept(new DefaultMuleMessage(xmlData, muleContext)));
134     }
135 
136     @Test
137     public void testFilterOnObject() throws Exception
138     {
139         Dummy d = new Dummy();
140         d.setId(10);
141         d.setContent("hello");
142 
143         simpleFilter.setPattern("id=10 and content='hello'");
144         assertTrue(simpleFilter.accept(new DefaultMuleMessage(d, muleContext)));
145     }
146 
147     @Test
148     public void testExpectedValueFilterXmlString() throws Exception
149     {
150         doTestExpectedValueFilter(xmlStringInput);
151     }
152 
153     @Test
154     public void testExpectedValueFilterXmlByteArray() throws Exception
155     {
156         doTestExpectedValueFilter(xmlStringInput.getBytes());
157     }
158 
159     @Test
160     public void testBooleanFilter1XmlString() throws Exception
161     {
162         doTestBooleanFilter1(xmlStringInput);
163     }
164 
165     @Test
166     public void testBooleanFilter2XmlString() throws Exception
167     {
168         doTestBooleanFilter2(xmlStringInput);
169     }
170 
171     @Test
172     public void testExpectedValueFilterDom4JDocument() throws Exception
173     {
174         doTestExpectedValueFilter(dom4jDocumentInput);
175     }
176 
177     @Test
178     public void testBooleanFilter1Dom4JDocument() throws Exception
179     {
180         doTestBooleanFilter1(dom4jDocumentInput);
181     }
182 
183     @Test
184     public void testBooleanFilter2Dom4JDocument() throws Exception
185     {
186         doTestBooleanFilter2(dom4jDocumentInput);
187     }
188 
189     @Test
190     public void testExpectedValueFilterW3cDocument() throws Exception
191     {
192         doTestExpectedValueFilter(w3cDocumentInput);
193     }
194 
195     @Test
196     public void testBooleanFilter1W3cDocument() throws Exception
197     {
198         doTestBooleanFilter1(w3cDocumentInput);
199     }
200 
201     @Test
202     public void testBooleanFilter2W3cDocument() throws Exception
203     {
204         doTestBooleanFilter2(w3cDocumentInput);
205     }
206 
207     @Test
208     public void testExpectedValueFilterXmlStringNS() throws Exception
209     {
210         doTestExpectedValueFilterNS(xmlStringInputNS);
211     }
212 
213     @Test
214     public void testBooleanFilter1XmlStringNS() throws Exception
215     {
216         doTestBooleanFilter1NS(xmlStringInputNS);
217     }
218 
219     @Test
220     public void testBooleanFilter2XmlStringNS() throws Exception
221     {
222         doTestBooleanFilter2NS(xmlStringInputNS);
223     }
224 
225     @Test
226     public void testExpectedValueFilterDom4JDocumentNS() throws Exception
227     {
228         doTestExpectedValueFilterNS(dom4jDocumentInputNS);
229     }
230 
231     @Test
232     public void testBooleanFilter1Dom4JDocumentNS() throws Exception
233     {
234         doTestBooleanFilter1NS(dom4jDocumentInputNS);
235     }
236 
237     @Test
238     public void testBooleanFilter2Dom4JDocumentNS() throws Exception
239     {
240         doTestBooleanFilter2NS(dom4jDocumentInputNS);
241     }
242 
243     @Test
244     public void testExpectedValueFilterW3cDocumentNS() throws Exception
245     {
246         doTestExpectedValueFilterNS(w3cDocumentInputNS);
247     }
248 
249     @Test
250     public void testBooleanFilter1W3cDocumentNS() throws Exception
251     {
252         doTestBooleanFilter1NS(w3cDocumentInputNS);
253     }
254 
255     @Test
256     public void testBooleanFilter2W3cDocumentNS() throws Exception
257     {
258         doTestBooleanFilter2NS(w3cDocumentInputNS);
259     }
260 
261     @Test
262     public void testSimpleFilterXmlMessageVariants() throws Exception
263     {
264         simpleFilter.setPattern("catalog/cd[3]/title");
265         simpleFilter.setExpectedValue("Greatest Hits");
266         
267         List list = XMLTestUtils.getXmlMessageVariants("cdcatalog.xml");
268         Iterator it = list.iterator();
269         
270         Object msg;
271         while (it.hasNext())
272         {
273             msg = it.next();
274             // TODO Not working for XMLStreamReader
275             if (!(msg instanceof XMLStreamReader))
276             {
277                 assertTrue("Test failed for message type: " + msg.getClass(), simpleFilter.accept(new DefaultMuleMessage(msg, muleContext)));
278             }
279         }
280     }
281 }