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