1
2
3
4
5
6
7
8
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
49 protected void doSetUp() throws Exception
50 {
51 final ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader();
52
53
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
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
92 catch (Exception e)
93 {
94
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
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 }