1
2
3
4
5
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
45 protected void doSetUp() throws Exception
46 {
47 final ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader();
48
49
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
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
88 catch (Exception e)
89 {
90
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
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 }