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.server;
017
018 import org.apache.commons.lang.StringUtils;
019 import org.joda.time.DateTime;
020 import org.junit.Test;
021 import org.kuali.rice.core.api.delegation.DelegationType;
022 import org.kuali.rice.kew.actionitem.ActionItem;
023 import org.kuali.rice.kew.api.document.DocumentContent;
024 import org.kuali.rice.kew.api.document.DocumentContentUpdate;
025 import org.kuali.rice.kew.api.document.attribute.WorkflowAttributeDefinition;
026 import org.kuali.rice.kew.dto.DTOConverter;
027 import org.kuali.rice.kew.rule.TestRuleAttribute;
028 import org.kuali.rice.kew.test.KEWTestCase;
029 import org.kuali.rice.kew.api.KewApiConstants;
030 import org.kuali.rice.kim.api.KimConstants;
031 import org.kuali.rice.kim.api.group.Group;
032 import org.kuali.rice.kim.api.services.KimApiServiceLocator;
033
034 import java.sql.Timestamp;
035 import java.util.Date;
036
037 import static org.junit.Assert.*;
038
039 public class BeanConverterTester extends KEWTestCase {
040
041 private static final String DOCUMENT_CONTENT = KewApiConstants.DOCUMENT_CONTENT_ELEMENT;
042 private static final String ATTRIBUTE_CONTENT = KewApiConstants.ATTRIBUTE_CONTENT_ELEMENT;
043 private static final String SEARCHABLE_CONTENT = KewApiConstants.SEARCHABLE_CONTENT_ELEMENT;
044 private static final String APPLICATION_CONTENT = KewApiConstants.APPLICATION_CONTENT_ELEMENT;
045
046 /**
047 * Tests the conversion of a String into a DocumentContentVO object which should split the
048 * String into it's 3 distinct components.
049 */
050 @Test public void testConvertDocumentContent() throws Exception {
051
052 // test null content
053 String attributeContent = null;
054 String searchableContent = null;
055 String applicationContent = null;
056 String xmlContent = constructContent(attributeContent, searchableContent, applicationContent);
057 DocumentContent.Builder builder = DocumentContent.Builder.create("-1234");
058 builder.setApplicationContent(applicationContent);
059 builder.setAttributeContent(attributeContent);
060 builder.setSearchableContent(searchableContent);
061
062 DocumentContent content = builder.build();
063 assertFalse("Content cannot be empty.", org.apache.commons.lang.StringUtils.isEmpty(content.getFullContent()));
064 assertEquals("Attribute content is invalid.", null, content.getAttributeContent());
065 assertEquals("Searchable content is invalid.", null, content.getSearchableContent());
066 assertEquals("Application content is invalid.", null, content.getApplicationContent());
067 assertEquals("Should have fake document id.", "-1234", content.getDocumentId());
068
069 // test empty content
070 attributeContent = "";
071 searchableContent = "";
072 applicationContent = "";
073 builder = DocumentContent.Builder.create("testId");
074 builder.setApplicationContent(applicationContent);
075 builder.setAttributeContent(attributeContent);
076 builder.setSearchableContent(searchableContent);
077 content = builder.build();
078 assertContent(content, attributeContent, searchableContent, applicationContent);
079
080 // test fancy dancy content
081 attributeContent = "<iEnjoyFlexContent><id>1234</id></iEnjoyFlexContent>";
082 searchableContent = "<thisIdBeWarrenG>Warren G</thisIdBeWarrenG><whatsMyName>Snoop</whatsMyName>";
083 applicationContent = "<thisIsTotallyRad><theCoolestContentInTheWorld qualify=\"iSaidSo\">it's marvelous!</theCoolestContentInTheWorld></thisIsTotallyRad>";
084 builder = DocumentContent.Builder.create("testId");
085 builder.setApplicationContent(applicationContent);
086 builder.setAttributeContent(attributeContent);
087 builder.setSearchableContent(searchableContent);
088 content = builder.build();
089 assertContent(content, attributeContent, searchableContent, applicationContent);
090
091 /*attributeContent = "invalid<xml, I can't believe you would do such a thing<<<";
092 try {
093 builder = DocumentContent.Builder.create("testId");
094 builder.setApplicationContent(applicationContent);
095 builder.setAttributeContent(attributeContent);
096 builder.setSearchableContent(searchableContent);
097 content = builder.build();
098 fail("Parsing bad xml should have thrown an XmlException.");
099 } catch (XmlException e) {
100 log.info("Expected XmlException was thrown.");
101 // if we got the exception we are good to go
102 }*/
103
104 // test an older style document
105 /*String appSpecificXml = "<iAmAnOldSchoolApp><myDocContent type=\"custom\">is totally app specific</myDocContent><howIroll>old school, that's how I roll</howIroll></iAmAnOldSchoolApp>";
106 contentVO = DTOConverter.convertDocumentContent(appSpecificXml, null);
107 assertContent(contentVO, "", "", appSpecificXml);*/
108
109 // test the old school (Workflow 1.6) flex document XML
110 /*String fleXml = "<flexdoc><meinAttribute>nein</meinAttribute></flexdoc>";
111 contentVO = DTOConverter.convertDocumentContent(fleXml, null);
112 assertFalse("Content cannot be empty.", org.apache.commons.lang.StringUtils.isEmpty(contentVO.getFullContent()));
113 assertEquals("Attribute content is invalid.", fleXml, contentVO.getAttributeContent());
114 assertEquals("Searchable content is invalid.", "", contentVO.getSearchableContent());
115 assertEquals("Application content is invalid.", "", contentVO.getApplicationContent());*/
116 }
117
118 /**
119 * Tests the conversion of a DocumentContentVO object into an XML String. Includes generating content
120 * for any attributes which are on the DocumentContentVO object.
121 *
122 * TODO there is some crossover between this test and the DocumentContentTest, do we really need both of them???
123 */
124 @Test public void testBuildUpdatedDocumentContent() throws Exception {
125 String startContent = "<"+DOCUMENT_CONTENT+">";
126 String endContent = "</"+DOCUMENT_CONTENT+">";
127
128 /*
129 * // test no content, this should return null which indicates an unchanged document content VO
130 * //RouteHeaderVO routeHeaderVO = new RouteHeaderVO();
131 */
132
133 // test no content, this should return empty document content
134 DocumentContent contentVO = DocumentContent.Builder.create("1234").build();
135 String content = contentVO.getFullContent();
136 assertEquals("Invalid content conversion.", KewApiConstants.DEFAULT_DOCUMENT_CONTENT, content);
137
138 // test simple case, no attributes
139 String attributeContent = "<attribute1><id value=\"3\"/></attribute1>";
140 String searchableContent = "<searchable1><data>hello</data></searchable1>";
141 DocumentContent.Builder contentBuilder = DocumentContent.Builder.create("1234");
142 contentBuilder.setAttributeContent(constructContent(ATTRIBUTE_CONTENT, attributeContent));
143 contentBuilder.setSearchableContent(constructContent(SEARCHABLE_CONTENT, searchableContent));
144 contentVO = contentBuilder.build();
145 content = contentVO.getFullContent();
146 String fullContent = startContent+constructContent(ATTRIBUTE_CONTENT, attributeContent)+constructContent(SEARCHABLE_CONTENT, searchableContent)+endContent;
147 assertEquals("Invalid content conversion.", StringUtils.deleteWhitespace(fullContent), StringUtils.deleteWhitespace(content));
148
149 // now, add an attribute
150 String testAttributeContent = new TestRuleAttribute().getDocContent();
151 WorkflowAttributeDefinition attributeDefinition = WorkflowAttributeDefinition.Builder.create(TestRuleAttribute.class.getName()).build();
152 DocumentContentUpdate.Builder contentUpdate = DocumentContentUpdate.Builder.create();
153 contentUpdate.getAttributeDefinitions().add(attributeDefinition);
154 content = DTOConverter.buildUpdatedDocumentContent(KewApiConstants.DEFAULT_DOCUMENT_CONTENT, contentUpdate.build(), null);
155 fullContent = startContent+
156 constructContent(ATTRIBUTE_CONTENT, attributeContent+testAttributeContent)+
157 constructContent(SEARCHABLE_CONTENT, searchableContent)+
158 endContent;
159 assertEquals("Invalid content conversion.", StringUtils.deleteWhitespace(fullContent), StringUtils.deleteWhitespace(content));
160 }
161
162 private String constructContent(String type, String content) {
163 if (org.apache.commons.lang.StringUtils.isEmpty(content)) {
164 return "";
165 }
166 return "<"+type+">"+content+"</"+type+">";
167 }
168
169 private String constructContent(String attributeContent, String searchableContent, String applicationContent) {
170 return "<"+DOCUMENT_CONTENT+">"+
171 constructContent(ATTRIBUTE_CONTENT, attributeContent)+
172 constructContent(SEARCHABLE_CONTENT, searchableContent)+
173 constructContent(APPLICATION_CONTENT, applicationContent)+
174 "</"+DOCUMENT_CONTENT+">";
175 }
176
177 private void assertContent(DocumentContent contentVO, String attributeContent, String searchableContent, String applicationContent) throws Exception{
178 /*if (org.apache.commons.lang.StringUtils.isEmpty(attributeContent)) {
179 attributeContent = "";
180 } else {
181 attributeContent = "<"+ATTRIBUTE_CONTENT+">"+attributeContent+"</"+ATTRIBUTE_CONTENT+">";
182 }
183 if (org.apache.commons.lang.StringUtils.isEmpty(searchableContent)) {
184 searchableContent = "";
185 } else {
186 searchableContent = "<"+SEARCHABLE_CONTENT+">"+searchableContent+"</"+SEARCHABLE_CONTENT+">";
187 }*/
188 assertFalse("Content cannot be empty.", org.apache.commons.lang.StringUtils.isEmpty(contentVO.getFullContent()));
189 assertEquals("Attribute content is invalid.", attributeContent.replaceAll("\n", ""),
190 contentVO.getAttributeContent().replaceAll("\n", ""));
191 assertEquals("Searchable content is invalid.", searchableContent.replaceAll("\n", ""), contentVO.getSearchableContent().replaceAll(
192 "\n", ""));
193 assertEquals("Application content is invalid.", applicationContent.replaceAll("\n", ""), contentVO.getApplicationContent().replaceAll(
194 "\n", ""));
195 /*assertEquals("Incorrect number of attribute definitions.", 0, contentVO.get.getAttributeDefinitions().length);
196 assertEquals("Incorrect number of searchable attribute definitions.", 0, contentVO.getSearchableDefinitions().length);*/
197 }
198
199 @Test public void testConvertActionItem() throws Exception {
200 // get test data
201 String testWorkgroupName = "TestWorkgroup";
202 Group testWorkgroup = KimApiServiceLocator.getGroupService().getGroupByNamespaceCodeAndName(
203 KimConstants.KIM_GROUP_WORKFLOW_NAMESPACE_CODE, testWorkgroupName);
204 String testWorkgroupId = testWorkgroup.getId();
205 assertTrue("Test workgroup '" + testWorkgroupName + "' should have at least one user", KimApiServiceLocator.getGroupService().getDirectMemberPrincipalIds(
206 testWorkgroup.getId()).size() > 0);
207 String workflowId = KimApiServiceLocator.getGroupService().getDirectMemberPrincipalIds(testWorkgroup.getId()).get(0);
208 assertNotNull("User from workgroup should not be null", workflowId);
209 String actionRequestCd = KewApiConstants.ACTION_REQUEST_ACKNOWLEDGE_REQ;
210 String actionRequestId = "4";
211 String docName = "dummy";
212 String roleName = "fakeRole";
213 String documentId = "abc23";
214 Timestamp dateAssigned = new Timestamp(new Date().getTime());
215 String docHandlerUrl = "http://this.is.not.us";
216 String docTypeLabel = "Label Me";
217 String docTitle = "Title me";
218 String responsibilityId = "35";
219 DelegationType delegationType = DelegationType.PRIMARY;
220
221 // create fake action item
222 ActionItem actionItem = new ActionItem();
223 actionItem.setActionRequestCd(actionRequestCd);
224 actionItem.setActionRequestId(actionRequestId);
225 actionItem.setDocName(docName);
226 actionItem.setRoleName(roleName);
227 actionItem.setPrincipalId(workflowId);
228 actionItem.setDocumentId(documentId);
229 actionItem.setDateAssigned(dateAssigned);
230 actionItem.setDocHandlerURL(docHandlerUrl);
231 actionItem.setDocLabel(docTypeLabel);
232 actionItem.setDocTitle(docTitle);
233 actionItem.setGroupId(testWorkgroupId);
234 actionItem.setResponsibilityId(responsibilityId);
235 actionItem.setDelegationType(delegationType);
236 actionItem.setDelegatorPrincipalId(workflowId);
237 actionItem.setDelegatorGroupId(testWorkgroupId);
238
239 // convert to action item vo object and verify
240 org.kuali.rice.kew.api.action.ActionItem actionItemVO = ActionItem.to(actionItem);
241 assertEquals("Action Item VO object has incorrect value", actionRequestCd, actionItemVO.getActionRequestCd());
242 assertEquals("Action Item VO object has incorrect value", actionRequestId, actionItemVO.getActionRequestId());
243 assertEquals("Action Item VO object has incorrect value", docName, actionItemVO.getDocName());
244 assertEquals("Action Item VO object has incorrect value", roleName, actionItemVO.getRoleName());
245 assertEquals("Action Item VO object has incorrect value", workflowId, actionItemVO.getPrincipalId());
246 assertEquals("Action Item VO object has incorrect value", documentId, actionItemVO.getDocumentId());
247 assertEquals("Action Item VO object has incorrect value", new DateTime(dateAssigned.getTime()), actionItemVO.getDateTimeAssigned());
248 assertEquals("Action Item VO object has incorrect value", docHandlerUrl, actionItemVO.getDocHandlerURL());
249 assertEquals("Action Item VO object has incorrect value", docTypeLabel, actionItemVO.getDocLabel());
250 assertEquals("Action Item VO object has incorrect value", docTitle, actionItemVO.getDocTitle());
251 assertEquals("Action Item VO object has incorrect value", "" + testWorkgroupId, actionItemVO.getGroupId());
252 assertEquals("Action Item VO object has incorrect value", responsibilityId, actionItemVO.getResponsibilityId());
253 assertEquals("Action Item VO object has incorrect value", delegationType, actionItemVO.getDelegationType());
254 assertEquals("Action Item VO object has incorrect value", workflowId, actionItemVO.getDelegatorPrincipalId());
255 assertEquals("Action Item VO object has incorrect value", testWorkgroupId, actionItemVO.getDelegatorGroupId());
256 }
257
258 }