1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.rice.kew.role;
17
18 import org.junit.Test;
19 import org.kuali.rice.kew.api.extension.ExtensionDefinition;
20 import org.kuali.rice.kew.engine.RouteContext;
21 import org.kuali.rice.kew.routeheader.DocumentContent;
22 import org.kuali.rice.kew.routeheader.StandardDocumentContent;
23 import org.kuali.rice.kew.rule.bo.RuleAttribute;
24 import org.kuali.rice.kew.api.KewApiConstants;
25 import org.kuali.rice.test.BaseRiceTestCase;
26
27 import java.util.Collections;
28 import java.util.List;
29 import java.util.Map;
30
31 import static org.junit.Assert.assertEquals;
32 import static org.junit.Assert.fail;
33
34
35
36
37
38
39
40 public class XPathQualifierResolverTest extends BaseRiceTestCase {
41
42 private static final String SIMPLE_CONFIG_1 = "<resolverConfig>" +
43 "<baseXPathExpression>/xmlData/accountNumbers</baseXPathExpression>" +
44 "<attributes name=\"accountNumber\">" +
45 "<xPathExpression>./accountNumber</xPathExpression>" +
46 "</attributes>" +
47 "</resolverConfig>";
48
49 private static final String SIMPLE_DOC_XML_1 = "<xmlData>" +
50 "<accountNumbers>" +
51 "<accountNumber>12345</accountNumber>" +
52 "<accountNumber>54321</accountNumber>" +
53 "<accountNumber>102030</accountNumber>" +
54 "<accountNumber>302010</accountNumber>" +
55 "</accountNumbers>" +
56 "</xmlData>";
57
58 private static final String SIMPLE_CONFIG_2 = "<resolverConfig>" +
59 "<attributes name=\"accountNumber\">" +
60 "<xPathExpression>//accountNumber</xPathExpression>" +
61 "</attributes>" +
62 "</resolverConfig>";
63
64 private static final String COMPOUND_CONFIG_1 = "<resolverConfig>" +
65 "<baseXPathExpression>/xmlData/chartOrg</baseXPathExpression>" +
66 "<attributes name=\"chart\">" +
67 "<xPathExpression>./chart</xPathExpression>" +
68 "</attributes>" +
69 "<attributes name=\"org\">" +
70 "<xPathExpression>./org</xPathExpression>" +
71 "</attributes>" +
72 "</resolverConfig>";
73
74 private static final String COMPOUND_CONFIG_2 = "<resolverConfig>" +
75 "<attributes name=\"chart\">" +
76 "<xPathExpression>//chart</xPathExpression>" +
77 "</attributes>" +
78 "<attributes name=\"org\">" +
79 "<xPathExpression>//org</xPathExpression>" +
80 "</attributes>" +
81 "</resolverConfig>";
82
83
84 private static final String COMPOUND_DOC_XML_1 = "<xmlData>" +
85 "<chartOrg>" +
86 "<chart>BL</chart>" +
87 "<org>BUS</org>" +
88 "</chartOrg>" +
89 "<chartOrg>" +
90 "<chart>IN</chart>" +
91 "<org>MED</org>" +
92 "</chartOrg>" +
93 "</xmlData>";
94
95 private static final String COMPOUND_DOC_XML_2 = "<xmlData>" +
96 "<chartOrg>" +
97 "<chart>BL</chart>" +
98 "<org>BUS</org>" +
99 "<chart>IN</chart>" +
100 "<org>MED</org>" +
101 "</chartOrg>" +
102 "</xmlData>";
103
104 private static final String COMPOUND_DOC_XML_3 = "<xmlData>" +
105 "<chartOrg>" +
106 "<chart>BL</chart>" +
107 "<org>BUS</org>" +
108 "</chartOrg>" +
109 "</xmlData>";
110
111 @Test
112 public void testResolve_simpleMap() throws Exception {
113 XPathQualifierResolver resolver = new XPathQualifierResolver();
114 ExtensionDefinition.Builder extensionDefinition = ExtensionDefinition.Builder.create("fakeName", "fakeType", "fakeResourceDescriptor");
115 extensionDefinition.setConfiguration(Collections.singletonMap(KewApiConstants.ATTRIBUTE_XML_CONFIG_DATA, SIMPLE_CONFIG_1));
116 resolver.setExtensionDefinition(extensionDefinition.build());
117
118 RouteContext context = new RouteContext();
119 DocumentContent docContent = new StandardDocumentContent(SIMPLE_DOC_XML_1);
120 context.setDocumentContent(docContent);
121
122 List<Map<String, String>> maps = resolver.resolve(context);
123 verifyAccountmaps(maps);
124 }
125
126 @Test
127 public void testResolve_simpleMap_noBaseXPath() throws Exception {
128 XPathQualifierResolver resolver = new XPathQualifierResolver();
129 ExtensionDefinition.Builder extensionDefinition = ExtensionDefinition.Builder.create("fakeName", "fakeType", "fakeResourceDescriptor");
130 extensionDefinition.setConfiguration(Collections.singletonMap(KewApiConstants.ATTRIBUTE_XML_CONFIG_DATA, SIMPLE_CONFIG_2));
131 resolver.setExtensionDefinition(extensionDefinition.build());
132
133 RouteContext context = new RouteContext();
134 DocumentContent docContent = new StandardDocumentContent(SIMPLE_DOC_XML_1);
135 context.setDocumentContent(docContent);
136
137 List<Map<String, String>> maps = resolver.resolve(context);
138 verifyAccountmaps(maps);
139
140 }
141
142 private void verifyAccountmaps(List<Map<String, String>> maps) {
143 assertEquals("Incorrect number of attribute sets.", 4, maps.size());
144
145 String acctNumKey = "accountNumber";
146 Map<String, String> map1 = maps.get(0);
147 assertEquals(1, map1.size());
148 assertEquals("12345", map1.get(acctNumKey));
149 Map<String, String> map2 = maps.get(1);
150 assertEquals(1, map2.size());
151 assertEquals("54321", map2.get(acctNumKey));
152 Map<String, String> map3 = maps.get(2);
153 assertEquals(1, map3.size());
154 assertEquals("102030", map3.get(acctNumKey));
155 Map<String, String> map4 = maps.get(3);
156 assertEquals(1, map4.size());
157 assertEquals("302010", map4.get(acctNumKey));
158 }
159
160 @Test
161 public void testResolve_compoundMap1() throws Exception {
162 XPathQualifierResolver resolver = new XPathQualifierResolver();
163 ExtensionDefinition.Builder extensionDefinition = ExtensionDefinition.Builder.create("fakeName", "fakeType", "fakeResourceDescriptor");
164 extensionDefinition.setConfiguration(Collections.singletonMap(KewApiConstants.ATTRIBUTE_XML_CONFIG_DATA, COMPOUND_CONFIG_1));
165 resolver.setExtensionDefinition(extensionDefinition.build());
166
167 RouteContext context = new RouteContext();
168 DocumentContent docContent = new StandardDocumentContent(COMPOUND_DOC_XML_1);
169 context.setDocumentContent(docContent);
170
171 List<Map<String, String>> maps = resolver.resolve(context);
172 assertEquals("Incorrect number of attribute sets", 2, maps.size());
173
174 String chartKey = "chart";
175 String orgKey = "org";
176
177 Map<String, String> map1 = maps.get(0);
178 assertEquals(2, map1.size());
179 assertEquals("BL", map1.get(chartKey));
180 assertEquals("BUS", map1.get(orgKey));
181
182 Map<String, String> map2 = maps.get(1);
183 assertEquals(2, map2.size());
184 assertEquals("IN", map2.get(chartKey));
185 assertEquals("MED", map2.get(orgKey));
186 }
187
188 @Test
189 public void testResolve_compoundMap() throws Exception {
190 XPathQualifierResolver resolver = new XPathQualifierResolver();
191 ExtensionDefinition.Builder extensionDefinition = ExtensionDefinition.Builder.create("fakeName", "fakeType", "fakeResourceDescriptor");
192 extensionDefinition.setConfiguration(Collections.singletonMap(KewApiConstants.ATTRIBUTE_XML_CONFIG_DATA, COMPOUND_CONFIG_1));
193 resolver.setExtensionDefinition(extensionDefinition.build());
194
195 RouteContext context = new RouteContext();
196 DocumentContent docContent = new StandardDocumentContent(COMPOUND_DOC_XML_2);
197 context.setDocumentContent(docContent);
198
199
200
201 try {
202 resolver.resolve(context);
203 fail("Invalid XML was encountered, resolver should have thrown an exception");
204 } catch (Exception e) {
205 e.printStackTrace();
206 }
207
208
209
210 context = new RouteContext();
211 docContent = new StandardDocumentContent(COMPOUND_DOC_XML_3);
212 context.setDocumentContent(docContent);
213
214 List<Map<String, String>> maps = resolver.resolve(context);
215 assertEquals(1, maps.size());
216 assertEquals("BL", maps.get(0).get("chart"));
217 assertEquals("BUS", maps.get(0).get("org"));
218 }
219
220 @Test
221 public void testResolve_compoundMap_noBaseXPath() throws Exception {
222 XPathQualifierResolver resolver = new XPathQualifierResolver();
223 ExtensionDefinition.Builder extensionDefinition = ExtensionDefinition.Builder.create("fakeName", "fakeType", "fakeResourceDescriptor");
224 extensionDefinition.setConfiguration(Collections.singletonMap(KewApiConstants.ATTRIBUTE_XML_CONFIG_DATA, COMPOUND_CONFIG_2));
225 resolver.setExtensionDefinition(extensionDefinition.build());
226
227 RouteContext context = new RouteContext();
228 DocumentContent docContent = new StandardDocumentContent(COMPOUND_DOC_XML_2);
229 context.setDocumentContent(docContent);
230
231
232
233 try {
234 resolver.resolve(context);
235 fail("Invalid XML was encountered, resolver should have thrown an exception");
236 } catch (Exception e) {
237 e.printStackTrace();
238 }
239
240
241
242 context = new RouteContext();
243 docContent = new StandardDocumentContent(COMPOUND_DOC_XML_3);
244 context.setDocumentContent(docContent);
245
246 List<Map<String, String>> maps = resolver.resolve(context);
247 assertEquals(1, maps.size());
248 assertEquals("BL", maps.get(0).get("chart"));
249 assertEquals("BUS", maps.get(0).get("org"));
250
251 }
252
253 }