001 /**
002 * Copyright 2005-2011 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.rice.kew.role;
017
018 import org.junit.Test;
019 import org.kuali.rice.kew.engine.RouteContext;
020 import org.kuali.rice.kew.routeheader.DocumentContent;
021 import org.kuali.rice.kew.routeheader.StandardDocumentContent;
022 import org.kuali.rice.kew.rule.bo.RuleAttribute;
023 import org.kuali.rice.kew.api.KewApiConstants;
024 import org.kuali.rice.test.BaseRiceTestCase;
025
026 import java.util.List;
027 import java.util.Map;
028
029 import static org.junit.Assert.assertEquals;
030 import static org.junit.Assert.fail;
031
032 /**
033 * Tests the XPathQualifierResolver.
034 *
035 * @author Kuali Rice Team (rice.collab@kuali.org)
036 *
037 */
038 public class XPathQualifierResolverTest extends BaseRiceTestCase {
039
040 private static final String SIMPLE_CONFIG_1 = "<resolverConfig>" +
041 "<baseXPathExpression>/xmlData/accountNumbers</baseXPathExpression>" +
042 "<qualifier name=\"accountNumber\">" +
043 "<xPathExpression>./accountNumber</xPathExpression>" +
044 "</qualifier>" +
045 "</resolverConfig>";
046
047 private static final String SIMPLE_DOC_XML_1 = "<xmlData>" +
048 "<accountNumbers>" +
049 "<accountNumber>12345</accountNumber>" +
050 "<accountNumber>54321</accountNumber>" +
051 "<accountNumber>102030</accountNumber>" +
052 "<accountNumber>302010</accountNumber>" +
053 "</accountNumbers>" +
054 "</xmlData>";
055
056 private static final String SIMPLE_CONFIG_2 = "<resolverConfig>" +
057 "<qualifier name=\"accountNumber\">" +
058 "<xPathExpression>//accountNumber</xPathExpression>" +
059 "</qualifier>" +
060 "</resolverConfig>";
061
062 private static final String COMPOUND_CONFIG_1 = "<resolverConfig>" +
063 "<baseXPathExpression>/xmlData/chartOrg</baseXPathExpression>" +
064 "<qualifier name=\"chart\">" +
065 "<xPathExpression>./chart</xPathExpression>" +
066 "</qualifier>" +
067 "<qualifier name=\"org\">" +
068 "<xPathExpression>./org</xPathExpression>" +
069 "</qualifier>" +
070 "</resolverConfig>";
071
072 private static final String COMPOUND_CONFIG_2 = "<resolverConfig>" +
073 "<qualifier name=\"chart\">" +
074 "<xPathExpression>//chart</xPathExpression>" +
075 "</qualifier>" +
076 "<qualifier name=\"org\">" +
077 "<xPathExpression>//org</xPathExpression>" +
078 "</qualifier>" +
079 "</resolverConfig>";
080
081
082 private static final String COMPOUND_DOC_XML_1 = "<xmlData>" +
083 "<chartOrg>" +
084 "<chart>BL</chart>" +
085 "<org>BUS</org>" +
086 "</chartOrg>" +
087 "<chartOrg>" +
088 "<chart>IN</chart>" +
089 "<org>MED</org>" +
090 "</chartOrg>" +
091 "</xmlData>";
092
093 private static final String COMPOUND_DOC_XML_2 = "<xmlData>" +
094 "<chartOrg>" +
095 "<chart>BL</chart>" +
096 "<org>BUS</org>" +
097 "<chart>IN</chart>" +
098 "<org>MED</org>" +
099 "</chartOrg>" +
100 "</xmlData>";
101
102 private static final String COMPOUND_DOC_XML_3 = "<xmlData>" +
103 "<chartOrg>" +
104 "<chart>BL</chart>" +
105 "<org>BUS</org>" +
106 "</chartOrg>" +
107 "</xmlData>";
108
109 @Test
110 public void testResolve_simpleMap() throws Exception {
111 XPathQualifierResolver resolver = new XPathQualifierResolver();
112
113 resolver.setXmlConfigData(SIMPLE_CONFIG_1);
114
115 RouteContext context = new RouteContext();
116 DocumentContent docContent = new StandardDocumentContent(SIMPLE_DOC_XML_1);
117 context.setDocumentContent(docContent);
118
119 List<Map<String, String>> maps = resolver.resolve(context);
120 verifyAccountmaps(maps);
121 }
122
123 @Test
124 public void testResolve_simpleMap_noBaseXPath() throws Exception {
125 XPathQualifierResolver resolver = new XPathQualifierResolver();
126
127 resolver.setXmlConfigData(SIMPLE_CONFIG_2);
128
129 RouteContext context = new RouteContext();
130 DocumentContent docContent = new StandardDocumentContent(SIMPLE_DOC_XML_1);
131 context.setDocumentContent(docContent);
132
133 List<Map<String, String>> maps = resolver.resolve(context);
134 verifyAccountmaps(maps);
135
136 }
137
138 private void verifyAccountmaps(List<Map<String, String>> maps) {
139 assertEquals("Incorrect number of attribute sets.", 4, maps.size());
140
141 String acctNumKey = "accountNumber";
142 Map<String, String> map1 = maps.get(0);
143 assertEquals(1, map1.size());
144 assertEquals("12345", map1.get(acctNumKey));
145 Map<String, String> map2 = maps.get(1);
146 assertEquals(1, map2.size());
147 assertEquals("54321", map2.get(acctNumKey));
148 Map<String, String> map3 = maps.get(2);
149 assertEquals(1, map3.size());
150 assertEquals("102030", map3.get(acctNumKey));
151 Map<String, String> map4 = maps.get(3);
152 assertEquals(1, map4.size());
153 assertEquals("302010", map4.get(acctNumKey));
154 }
155
156 @Test
157 public void testResolve_compoundMap1() throws Exception {
158 XPathQualifierResolver resolver = new XPathQualifierResolver();
159
160 resolver.setXmlConfigData(COMPOUND_CONFIG_1);
161
162 RouteContext context = new RouteContext();
163 DocumentContent docContent = new StandardDocumentContent(COMPOUND_DOC_XML_1);
164 context.setDocumentContent(docContent);
165
166 List<Map<String, String>> maps = resolver.resolve(context);
167 assertEquals("Incorrect number of attribute sets", 2, maps.size());
168
169 String chartKey = "chart";
170 String orgKey = "org";
171
172 Map<String, String> map1 = maps.get(0);
173 assertEquals(2, map1.size());
174 assertEquals("BL", map1.get(chartKey));
175 assertEquals("BUS", map1.get(orgKey));
176
177 Map<String, String> map2 = maps.get(1);
178 assertEquals(2, map2.size());
179 assertEquals("IN", map2.get(chartKey));
180 assertEquals("MED", map2.get(orgKey));
181 }
182
183 @Test
184 public void testResolve_compoundMap() throws Exception {
185 XPathQualifierResolver resolver = new XPathQualifierResolver();
186
187 resolver.setXmlConfigData(COMPOUND_CONFIG_1);
188
189 RouteContext context = new RouteContext();
190 DocumentContent docContent = new StandardDocumentContent(COMPOUND_DOC_XML_2);
191 context.setDocumentContent(docContent);
192
193 // should fail with this document content
194
195 try {
196 resolver.resolve(context);
197 fail("Invalid XML was encountered, resolver should have thrown an exception");
198 } catch (Exception e) {
199 e.printStackTrace();
200 }
201
202 // however, should succeed with this
203
204 context = new RouteContext();
205 docContent = new StandardDocumentContent(COMPOUND_DOC_XML_3);
206 context.setDocumentContent(docContent);
207
208 List<Map<String, String>> maps = resolver.resolve(context);
209 assertEquals(1, maps.size());
210 assertEquals("BL", maps.get(0).get("chart"));
211 assertEquals("BUS", maps.get(0).get("org"));
212 }
213
214 @Test
215 public void testResolve_compoundMap_noBaseXPath() throws Exception {
216 XPathQualifierResolver resolver = new XPathQualifierResolver();
217
218 resolver.setXmlConfigData(COMPOUND_CONFIG_2);
219
220 RouteContext context = new RouteContext();
221 DocumentContent docContent = new StandardDocumentContent(COMPOUND_DOC_XML_2);
222 context.setDocumentContent(docContent);
223
224 // should fail with this document content
225
226 try {
227 resolver.resolve(context);
228 fail("Invalid XML was encountered, resolver should have thrown an exception");
229 } catch (Exception e) {
230 e.printStackTrace();
231 }
232
233 // however, should succeed with this
234
235 context = new RouteContext();
236 docContent = new StandardDocumentContent(COMPOUND_DOC_XML_3);
237 context.setDocumentContent(docContent);
238
239 List<Map<String, String>> maps = resolver.resolve(context);
240 assertEquals(1, maps.size());
241 assertEquals("BL", maps.get(0).get("chart"));
242 assertEquals("BUS", maps.get(0).get("org"));
243
244 }
245
246 }