View Javadoc

1   /**
2    * Copyright 2005-2011 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.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   * Tests the XPathQualifierResolver.
36   * 
37   * @author Kuali Rice Team (rice.collab@kuali.org)
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 		// should fail with this document content
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 		// however, should succeed with this
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 		// should fail with this document content
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 		// however, should succeed with this
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 }