View Javadoc

1   /*
2    * Copyright 2007-2009 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.rice.kew.role;
17  
18  import org.junit.Test;
19  import org.kuali.rice.kew.engine.RouteContext;
20  import org.kuali.rice.kew.routeheader.DocumentContent;
21  import org.kuali.rice.kew.routeheader.StandardDocumentContent;
22  import org.kuali.rice.kew.rule.bo.RuleAttribute;
23  import org.kuali.rice.test.BaseRiceTestCase;
24  
25  import java.util.List;
26  import java.util.Map;
27  
28  import static org.junit.Assert.assertEquals;
29  import static org.junit.Assert.fail;
30  
31  /**
32   * Tests the XPathQualifierResolver.
33   * 
34   * @author Kuali Rice Team (rice.collab@kuali.org)
35   *
36   */
37  public class XPathQualifierResolverTest extends BaseRiceTestCase {
38  
39  	private static final String SIMPLE_CONFIG_1 = "<resolverConfig>" +
40  		"<baseXPathExpression>/xmlData/accountNumbers</baseXPathExpression>" +
41  		"<qualifier name=\"accountNumber\">" +
42  		"<xPathExpression>./accountNumber</xPathExpression>" +
43  		"</qualifier>" +
44  		"</resolverConfig>";
45  	
46  	private static final String SIMPLE_DOC_XML_1 = "<xmlData>" +
47  		"<accountNumbers>" +
48  		"<accountNumber>12345</accountNumber>" +
49  		"<accountNumber>54321</accountNumber>" +
50  		"<accountNumber>102030</accountNumber>" +
51  		"<accountNumber>302010</accountNumber>" +
52  		"</accountNumbers>" +
53  		"</xmlData>";
54  	
55  	private static final String SIMPLE_CONFIG_2 = "<resolverConfig>" +
56  	"<qualifier name=\"accountNumber\">" +
57  	"<xPathExpression>//accountNumber</xPathExpression>" +
58  	"</qualifier>" +
59  	"</resolverConfig>";
60  	
61  	private static final String COMPOUND_CONFIG_1 = "<resolverConfig>" +
62  		"<baseXPathExpression>/xmlData/chartOrg</baseXPathExpression>" +
63  		"<qualifier name=\"chart\">" +
64  		"<xPathExpression>./chart</xPathExpression>" +
65  		"</qualifier>" +
66  		"<qualifier name=\"org\">" +
67  		"<xPathExpression>./org</xPathExpression>" +
68  		"</qualifier>" +
69  		"</resolverConfig>";
70  
71  	private static final String COMPOUND_CONFIG_2 = "<resolverConfig>" +
72  		"<qualifier name=\"chart\">" +
73  		"<xPathExpression>//chart</xPathExpression>" +
74  		"</qualifier>" +
75  		"<qualifier name=\"org\">" +
76  		"<xPathExpression>//org</xPathExpression>" +
77  		"</qualifier>" +
78  		"</resolverConfig>";
79  
80  	
81  	private static final String COMPOUND_DOC_XML_1 =  "<xmlData>" +
82  	 	"<chartOrg>" +
83  	 	"<chart>BL</chart>" +
84  	 	"<org>BUS</org>" +
85  	 	"</chartOrg>" +
86  	 	"<chartOrg>" +
87  	 	"<chart>IN</chart>" +
88  	 	"<org>MED</org>" +
89  	 	"</chartOrg>" +
90  	 	"</xmlData>";
91  	
92  	private static final String COMPOUND_DOC_XML_2 =  "<xmlData>" +
93  	 	"<chartOrg>" +
94  	 	"<chart>BL</chart>" +
95  	 	"<org>BUS</org>" +
96  	 	"<chart>IN</chart>" +
97  	 	"<org>MED</org>" +
98  	 	"</chartOrg>" +
99  	 	"</xmlData>";
100 	
101 	private static final String COMPOUND_DOC_XML_3 =  "<xmlData>" +
102  		"<chartOrg>" +
103  		"<chart>BL</chart>" +
104  		"<org>BUS</org>" +
105  		"</chartOrg>" +
106  		"</xmlData>";
107 	
108 	@Test
109 	public void testResolve_simpleMap() throws Exception {
110 		XPathQualifierResolver resolver = new XPathQualifierResolver();
111 		
112 		RuleAttribute ruleAttribute = new RuleAttribute();
113 		ruleAttribute.setXmlConfigData(SIMPLE_CONFIG_1);
114 		resolver.setRuleAttribute(ruleAttribute);
115 		
116 		RouteContext context = new RouteContext();
117 		DocumentContent docContent = new StandardDocumentContent(SIMPLE_DOC_XML_1);
118 		context.setDocumentContent(docContent);
119 		
120 		List<Map<String, String>> maps = resolver.resolve(context);
121 		verifyAccountmaps(maps);
122 	}
123 	
124 	@Test
125 	public void testResolve_simpleMap_noBaseXPath() throws Exception {
126 		XPathQualifierResolver resolver = new XPathQualifierResolver();
127 		
128 		RuleAttribute ruleAttribute = new RuleAttribute();
129 		ruleAttribute.setXmlConfigData(SIMPLE_CONFIG_2);
130 		resolver.setRuleAttribute(ruleAttribute);
131 		
132 		RouteContext context = new RouteContext();
133 		DocumentContent docContent = new StandardDocumentContent(SIMPLE_DOC_XML_1);
134 		context.setDocumentContent(docContent);
135 		
136 		List<Map<String, String>> maps = resolver.resolve(context);
137 		verifyAccountmaps(maps);
138 		
139 	}
140 	
141 	private void verifyAccountmaps(List<Map<String, String>> maps) {
142 		assertEquals("Incorrect number of attribute sets.", 4, maps.size());
143 		
144 		String acctNumKey = "accountNumber";
145 		Map<String, String> map1 = maps.get(0);
146 		assertEquals(1, map1.size());
147 		assertEquals("12345", map1.get(acctNumKey));
148 		Map<String, String> map2 = maps.get(1);
149 		assertEquals(1, map2.size());
150 		assertEquals("54321", map2.get(acctNumKey));
151 		Map<String, String> map3 = maps.get(2);
152 		assertEquals(1, map3.size());
153 		assertEquals("102030", map3.get(acctNumKey));
154 		Map<String, String> map4 = maps.get(3);
155 		assertEquals(1, map4.size());
156 		assertEquals("302010", map4.get(acctNumKey));
157 	}
158 	
159 	@Test
160 	public void testResolve_compoundMap1() throws Exception {
161 		XPathQualifierResolver resolver = new XPathQualifierResolver();
162 		
163 		RuleAttribute ruleAttribute = new RuleAttribute();
164 		ruleAttribute.setXmlConfigData(COMPOUND_CONFIG_1);
165 		resolver.setRuleAttribute(ruleAttribute);
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 		
192 		RuleAttribute ruleAttribute = new RuleAttribute();
193 		ruleAttribute.setXmlConfigData(COMPOUND_CONFIG_1);
194 		resolver.setRuleAttribute(ruleAttribute);
195 		
196 		RouteContext context = new RouteContext();
197 		DocumentContent docContent = new StandardDocumentContent(COMPOUND_DOC_XML_2);
198 		context.setDocumentContent(docContent);
199 		
200 		// should fail with this document content
201 		
202 		try {
203 			resolver.resolve(context);
204 			fail("Invalid XML was encountered, resolver should have thrown an exception");
205 		} catch (Exception e) {
206 			e.printStackTrace();
207 		}
208 		
209 		// however, should succeed with this
210 		
211 		context = new RouteContext();
212 		docContent = new StandardDocumentContent(COMPOUND_DOC_XML_3);
213 		context.setDocumentContent(docContent);
214 		
215 		List<Map<String, String>> maps = resolver.resolve(context);
216 		assertEquals(1, maps.size());
217 		assertEquals("BL", maps.get(0).get("chart"));
218 		assertEquals("BUS", maps.get(0).get("org"));
219 	}
220 	
221 	@Test
222 	public void testResolve_compoundMap_noBaseXPath() throws Exception {
223 		XPathQualifierResolver resolver = new XPathQualifierResolver();
224 		
225 		RuleAttribute ruleAttribute = new RuleAttribute();
226 		ruleAttribute.setXmlConfigData(COMPOUND_CONFIG_2);
227 		resolver.setRuleAttribute(ruleAttribute);
228 		
229 		RouteContext context = new RouteContext();
230 		DocumentContent docContent = new StandardDocumentContent(COMPOUND_DOC_XML_2);
231 		context.setDocumentContent(docContent);
232 		
233 		// should fail with this document content
234 		
235 		try {
236 			resolver.resolve(context);
237 			fail("Invalid XML was encountered, resolver should have thrown an exception");
238 		} catch (Exception e) {
239 			e.printStackTrace();
240 		}
241 		
242 		// however, should succeed with this
243 		
244 		context = new RouteContext();
245 		docContent = new StandardDocumentContent(COMPOUND_DOC_XML_3);
246 		context.setDocumentContent(docContent);
247 		
248 		List<Map<String, String>> maps = resolver.resolve(context);
249 		assertEquals(1, maps.size());
250 		assertEquals("BL", maps.get(0).get("chart"));
251 		assertEquals("BUS", maps.get(0).get("org"));
252 		
253 	}
254 	
255 }