1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  package org.kuali.rice.kew.server;
17  
18  import static org.junit.Assert.assertEquals;
19  import static org.junit.Assert.assertFalse;
20  import static org.junit.Assert.assertNotNull;
21  import static org.junit.Assert.assertNotSame;
22  import static org.junit.Assert.assertTrue;
23  import static org.junit.Assert.fail;
24  
25  import java.rmi.RemoteException;
26  import java.sql.Timestamp;
27  import java.util.ArrayList;
28  import java.util.Arrays;
29  import java.util.Calendar;
30  import java.util.Collection;
31  import java.util.Collections;
32  import java.util.HashMap;
33  import java.util.HashSet;
34  import java.util.Iterator;
35  import java.util.List;
36  import java.util.Map;
37  import java.util.Set;
38  
39  import org.apache.commons.lang.StringUtils;
40  import org.joda.time.DateTime;
41  import org.junit.Test;
42  import org.kuali.rice.core.api.exception.RiceIllegalArgumentException;
43  import org.kuali.rice.core.api.exception.RiceIllegalStateException;
44  import org.kuali.rice.coreservice.api.parameter.Parameter;
45  import org.kuali.rice.coreservice.framework.CoreFrameworkServiceLocator;
46  import org.kuali.rice.kew.actionrequest.ActionRequestValue;
47  import org.kuali.rice.kew.api.KewApiConstants;
48  import org.kuali.rice.kew.api.KewApiServiceLocator;
49  import org.kuali.rice.kew.api.WorkflowDocument;
50  import org.kuali.rice.kew.api.WorkflowDocumentFactory;
51  import org.kuali.rice.kew.api.action.ActionItem;
52  import org.kuali.rice.kew.api.action.ActionRequest;
53  import org.kuali.rice.kew.api.action.ActionRequestType;
54  import org.kuali.rice.kew.api.action.RequestedActions;
55  import org.kuali.rice.kew.api.action.RoutingReportActionToTake;
56  import org.kuali.rice.kew.api.action.RoutingReportCriteria;
57  import org.kuali.rice.kew.api.action.WorkflowDocumentActionsService;
58  import org.kuali.rice.kew.api.actionlist.ActionListService;
59  import org.kuali.rice.kew.api.document.DocumentDetail;
60  import org.kuali.rice.kew.api.document.DocumentStatus;
61  import org.kuali.rice.kew.api.document.WorkflowDocumentService;
62  import org.kuali.rice.kew.api.document.search.DocumentSearchCriteria;
63  import org.kuali.rice.kew.api.document.search.DocumentSearchResult;
64  import org.kuali.rice.kew.api.document.search.DocumentSearchResults;
65  import org.kuali.rice.kew.api.document.search.RouteNodeLookupLogic;
66  import org.kuali.rice.kew.api.exception.WorkflowException;
67  import org.kuali.rice.kew.api.rule.Rule;
68  import org.kuali.rice.kew.api.rule.RuleReportCriteria;
69  import org.kuali.rice.kew.api.rule.RuleResponsibility;
70  import org.kuali.rice.kew.api.rule.RuleService;
71  import org.kuali.rice.kew.docsearch.DocumentSearchInternalUtils;
72  import org.kuali.rice.kew.docsearch.TestXMLSearchableAttributeDateTime;
73  import org.kuali.rice.kew.docsearch.TestXMLSearchableAttributeFloat;
74  import org.kuali.rice.kew.docsearch.TestXMLSearchableAttributeLong;
75  import org.kuali.rice.kew.docsearch.TestXMLSearchableAttributeString;
76  import org.kuali.rice.kew.service.KEWServiceLocator;
77  import org.kuali.rice.kew.test.KEWTestCase;
78  import org.kuali.rice.kew.test.TestUtilities;
79  import org.kuali.rice.kim.api.KimConstants;
80  import org.kuali.rice.kim.api.group.Group;
81  import org.kuali.rice.kim.api.services.KimApiServiceLocator;
82  import org.kuali.rice.krad.util.KRADConstants;
83  import org.kuali.rice.test.BaselineTestCase;
84  
85  @BaselineTestCase.BaselineMode(BaselineTestCase.Mode.CLEAR_DB)
86  public class WorkflowUtilityTest extends KEWTestCase {
87      private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(WorkflowUtilityTest.class);
88  
89  	@Override
90      protected void loadTestData() throws Exception {
91          loadXmlFile("WorkflowUtilityConfig.xml");
92      }
93  
94  	@Test
95      public void testGetDocumentDetailByAppId() throws WorkflowException{
96          WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), SeqSetup.DOCUMENT_TYPE_NAME);
97          document.setApplicationDocumentId("123456789");
98          document.route("");
99          WorkflowDocumentService documentService = KewApiServiceLocator.getWorkflowDocumentService();
100         DocumentDetail doc= documentService.getDocumentDetailByAppId(SeqSetup.DOCUMENT_TYPE_NAME, "123456789");
101 
102     	assertNotNull(doc);
103 
104         document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), SeqSetup.DOCUMENT_TYPE_NAME);
105         document.setApplicationDocumentId("123456789");
106         document.route("");
107 
108         try{
109         	documentService.getDocumentDetailByAppId(SeqSetup.DOCUMENT_TYPE_NAME, "123456789");
110         	assertTrue(false);
111         }catch(RiceIllegalStateException e){
112         	assertTrue(true);
113         }
114 
115         try{
116         	documentService.getDocumentDetailByAppId("notExist", "wrong");
117         	assertTrue(false);
118         }catch(RiceIllegalStateException e){
119         	assertTrue(true);
120         }
121 
122         try{
123         	documentService.getDocumentDetailByAppId("notExist", null);
124         	assertTrue(false);
125         }catch(RiceIllegalArgumentException e){
126         	assertTrue(true);
127         }
128 
129         try{
130         	documentService.getDocumentDetailByAppId(null, null);
131         	assertTrue(false);
132         }catch(RiceIllegalArgumentException e){
133         	assertTrue(true);
134         }
135 
136     }
137 
138     @Test public void testGetActionsRequested() throws Exception {
139         WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), SeqSetup.DOCUMENT_TYPE_NAME);
140         document.route("");
141         assertActionsRequested("ewestfal", document.getDocumentId(), false);
142         assertActionsRequested("bmcgough", document.getDocumentId(), true);
143         assertActionsRequested("rkirkend", document.getDocumentId(), true);
144     }
145 
146     protected void assertActionsRequested(String principalName, String documentId, boolean shouldHaveRequest) throws Exception {
147     	RequestedActions attrSet = KewApiServiceLocator.getWorkflowDocumentActionsService().
148                 determineRequestedActions(documentId, getPrincipalIdForName(principalName));
149     	assertNotNull("Actions requested should be populated", attrSet);
150         if (shouldHaveRequest) {
151     	    assertTrue("Actions requested should be populated with at least one entry", !attrSet.getRequestedActions().isEmpty());
152         } else {
153             assertTrue("Principal should have no requests", attrSet.getRequestedActions().isEmpty());
154         }
155     }
156 
157     @Test
158     public void testIsUserInRouteLog() throws Exception {
159         WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), SeqSetup.DOCUMENT_TYPE_NAME);
160         document.route("");
161         assertTrue(document.isEnroute());
162         WorkflowDocumentActionsService wdas = KewApiServiceLocator.getWorkflowDocumentActionsService();
163         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("ewestfal"), false));
164         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("bmcgough"), false));
165         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("rkirkend"), false));
166         assertFalse("User should not be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("pmckown"), false));
167         assertFalse("User should not be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("temay"), false));
168         assertFalse("User should not be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("jhopf"), false));
169         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("pmckown"), true));
170         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("temay"), true));
171         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("jhopf"), true));
172 
173         
174         document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), SeqSetup.DOCUMENT_TYPE_NAME);
175         document.saveDocument("");
176         assertTrue(document.isSaved());
177         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("ewestfal"), false));
178         assertFalse("User should not be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("bmcgough"), false));
179         assertFalse("User should not be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("rkirkend"), false));
180         assertFalse("User should not be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("pmckown"), false));
181         assertFalse("User should not be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("temay"), false));
182         assertFalse("User should not be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("jhopf"), false));
183 
184         
185         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("bmcgough"), true));
186         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("rkirkend"), true));
187         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("pmckown"), true));
188         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("temay"), true));
189         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("jhopf"), true));
190     }
191 
192     @Test public void testIsUserInRouteLogAfterReturnToPrevious() throws Exception {
193 	WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), SeqSetup.DOCUMENT_TYPE_NAME);
194         document.route("");
195         assertTrue(document.isEnroute());
196 
197         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("bmcgough"), document.getDocumentId());
198         assertTrue(document.isApprovalRequested());
199         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("rkirkend"), document.getDocumentId());
200         assertTrue(document.isApprovalRequested());
201 
202         
203         WorkflowDocumentActionsService wdas = KewApiServiceLocator.getWorkflowDocumentActionsService();
204         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("bmcgough"), false));
205         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("rkirkend"), false));
206         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("bmcgough"), true));
207         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("rkirkend"), true));
208         assertFalse("User should NOT be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("pmckown"), false));
209         
210         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("pmckown"), true));
211         TestUtilities.assertAtNode(document, "WorkflowDocument");
212 
213         document.returnToPreviousNode("", "AdHoc");
214         TestUtilities.assertAtNode(document, "AdHoc");
215         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("ewestfal"), document.getDocumentId());
216         assertTrue(document.isApprovalRequested());
217 
218         document.approve("");
219 
220         
221         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("bmcgough"), document.getDocumentId());
222         assertTrue(document.isApprovalRequested());
223         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("rkirkend"), document.getDocumentId());
224         assertTrue(document.isApprovalRequested());
225         TestUtilities.assertAtNode(document, "WorkflowDocument");
226 
227         
228         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("bmcgough"), false));
229         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("rkirkend"), false));
230         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("bmcgough"), true));
231         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("rkirkend"), true));
232         assertFalse("User should NOT be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("pmckown"), false));
233         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("pmckown"), true));
234 
235         
236 
237         List revokedNodeInstances = KEWServiceLocator.getRouteNodeService().getRevokedNodeInstances(KEWServiceLocator.getRouteHeaderService().getRouteHeader(document.getDocumentId()));
238         assertNotNull(revokedNodeInstances);
239         assertEquals(2, revokedNodeInstances.size());
240 
241         
242         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("bmcgough"), document.getDocumentId());
243         document.approve("");
244         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("rkirkend"), document.getDocumentId());
245         document.approve("");
246 
247         
248         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("pmckown"), document.getDocumentId());
249         TestUtilities.assertAtNode(document, "WorkflowDocument2");
250         assertTrue(document.isApprovalRequested());
251         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("bmcgough"), false));
252         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("rkirkend"), false));
253         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("bmcgough"), true));
254         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("rkirkend"), true));
255         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("pmckown"), false));
256         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("pmckown"), true));
257 
258         
259         document.returnToPreviousNode("", "WorkflowDocument");
260         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("bmcgough"), document.getDocumentId());
261         assertTrue(document.isApprovalRequested());
262         
263         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("bmcgough"), false));
264         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("rkirkend"), false));
265         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("bmcgough"), true));
266         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("rkirkend"), true));
267         assertFalse("User should NOT be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("pmckown"), false));
268         assertTrue("User should be authenticated.", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("pmckown"), true));
269     }
270 
271     @Test
272     public void testIsUserInRouteLogWithSplits() throws Exception {
273     	loadXmlFile("WorkflowUtilitySplitConfig.xml");
274 
275     	
276     	TestSplitNode.setLeftBranch(true);
277     	TestSplitNode.setRightBranch(true);
278 
279     	WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("admin"), "UserInRouteLog_Split");
280         document.route("");
281 
282         
283         document = TestUtilities.switchByPrincipalName("ewestfal", document);
284         assertTrue("should have approve", document.isApprovalRequested());
285         TestUtilities.assertAtNode(document, "BeforeSplit");
286 
287         
288         WorkflowDocumentActionsService wdas = KewApiServiceLocator.getWorkflowDocumentActionsService();
289         assertTrue("should be in route log", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("ewestfal"), true));
290         assertTrue("should be in route log", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("rkirkend"), true));
291         assertTrue("should be in route log", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("bmcgough"), true));
292         assertTrue("should be in route log", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("jhopf"), true));
293         assertTrue("should be in route log", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("natjohns"), true));
294         assertFalse("should NOT be in route log", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("user1"), true));
295 
296         
297         TestSplitNode.setRightBranch(false);
298         assertTrue("should be in route log", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("rkirkend"), true));
299         assertTrue("should be in route log", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("bmcgough"), true));
300         assertFalse("should NOT be in route log because right branch is not active", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("jhopf"), true));
301         assertTrue("should be in route log", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("natjohns"), true));
302 
303         
304         assertTrue("should be in route log", wdas.isUserInRouteLogWithOptionalFlattening(document.getDocumentId(), getPrincipalIdForName("rkirkend"), true, true));
305         assertTrue("should be in route log", wdas.isUserInRouteLogWithOptionalFlattening(document.getDocumentId(), getPrincipalIdForName("bmcgough"), true, true));
306         assertTrue("should be in route log because we've flattened nodes", wdas.isUserInRouteLogWithOptionalFlattening(document.getDocumentId(), getPrincipalIdForName("jhopf"), true, true));
307         assertTrue("should be in route log", wdas.isUserInRouteLogWithOptionalFlattening(document.getDocumentId(), getPrincipalIdForName("natjohns"), true, true));
308 
309         
310         TestSplitNode.setRightBranch(true);
311         TestSplitNode.setLeftBranch(false);
312 
313         assertFalse("should NOT be in route log", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("rkirkend"), true));
314         assertFalse("should NOT be in route log", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("bmcgough"), true));
315         assertTrue("should be in route log", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("jhopf"), true));
316         assertTrue("should be in route log", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("natjohns"), true));
317 
318         
319         TestSplitNode.setLeftBranch(true);
320         TestSplitNode.setRightBranch(false);
321 
322         
323         document.approve("");
324         
325         TestUtilities.assertAtNode(document, "SplitLeft1");
326 
327         document = TestUtilities.switchByPrincipalName("rkirkend", document);
328         assertTrue("should have an approve request", document.isApprovalRequested());
329 
330         
331         assertTrue("should be in route log", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("rkirkend"), true));
332         assertTrue("should be in route log", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("bmcgough"), true));
333         assertFalse("should NOT be in route log because right branch is not active", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("jhopf"), true));
334         assertTrue("should be in route log", wdas.isUserInRouteLog(document.getDocumentId(), getPrincipalIdForName("natjohns"), true));
335     }
336 
337     public interface ReportCriteriaGenerator {
338         RoutingReportCriteria buildCriteria(WorkflowDocument workflowDoc) throws Exception;
339         boolean isCriteriaRouteHeaderBased();
340     }
341 
342     private class ReportCriteriaGeneratorUsingXML implements ReportCriteriaGenerator {
343         @Override
344         public RoutingReportCriteria buildCriteria(WorkflowDocument workflowDoc) throws Exception {
345             RoutingReportCriteria.Builder criteria = RoutingReportCriteria.Builder.createByDocumentTypeName(
346                     workflowDoc.getDocumentTypeName());
347             criteria.setXmlContent(workflowDoc.getDocumentContent().getApplicationContent());
348             return criteria.build();
349         }
350         @Override
351         public boolean isCriteriaRouteHeaderBased() {
352             return false;
353         }
354     }
355 
356     private class ReportCriteriaGeneratorUsingDocumentId implements ReportCriteriaGenerator {
357         @Override
358         public RoutingReportCriteria buildCriteria(WorkflowDocument workflowDoc) throws Exception {
359             RoutingReportCriteria.Builder criteria = RoutingReportCriteria.Builder.createByDocumentId(workflowDoc.getDocumentId());
360             return criteria.build();
361         }
362         @Override
363         public boolean isCriteriaRouteHeaderBased() {
364             return true;
365         }
366     }
367 
368     @Test public void testDocumentWillHaveApproveOrCompleteRequestAtNode_DocumentId() throws Exception {
369         runDocumentWillHaveApproveOrCompleteRequestAtNode(SeqSetup.DOCUMENT_TYPE_NAME,new ReportCriteriaGeneratorUsingDocumentId());
370     }
371 
372     @Test public void testDocumentWillHaveApproveOrCompleteRequestAtNode_XmlContent() throws Exception {
373         runDocumentWillHaveApproveOrCompleteRequestAtNode(SeqSetup.DOCUMENT_TYPE_NAME,new ReportCriteriaGeneratorUsingXML());
374     }
375 
376     @Test public void testDocumentWillHaveApproveOrCompleteRequestAtNode_ForceAction_DocumentId() throws Exception {
377         runDocumentWillHaveApproveOrCompleteRequestAtNode_ForceAction("SimulationTestDocumenType_ForceAction",new ReportCriteriaGeneratorUsingDocumentId());
378     }
379 
380     @Test public void testDocumentWillHaveApproveOrCompleteRequestAtNode_ForceAction_XmlContent() throws Exception {
381         runDocumentWillHaveApproveOrCompleteRequestAtNode_ForceAction("SimulationTestDocumenType_ForceAction",new ReportCriteriaGeneratorUsingXML());
382     }
383 
384     private void runDocumentWillHaveApproveOrCompleteRequestAtNode_ForceAction(String documentType, ReportCriteriaGenerator generator) throws Exception {
385       
386 
387 
388 
389 
390 
391 
392 
393 
394 
395 
396         WorkflowDocumentActionsService wdas = KewApiServiceLocator.getWorkflowDocumentActionsService();
397 
398         WorkflowDocument doc = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), documentType);
399         RoutingReportCriteria.Builder builder = RoutingReportCriteria.Builder.createByDocumentId(doc.getDocumentId());
400         builder.setXmlContent(doc.getDocumentContent().getApplicationContent());
401         builder.setTargetNodeName("WorkflowDocument2");
402         builder.setRoutingPrincipalId(getPrincipalIdForName("bmcgough"));
403         assertTrue("Document should have at least one unfulfilled approve/complete request",wdas.documentWillHaveAtLeastOneActionRequest(builder.build(), Arrays.asList(new String[]{KewApiConstants.ACTION_REQUEST_APPROVE_REQ,KewApiConstants.ACTION_REQUEST_COMPLETE_REQ}), false));
404         builder.setTargetPrincipalIds(Collections.singletonList(getPrincipalIdForName("bmcgough")));
405         assertFalse("Document should not have any unfulfilled approve/complete requests",wdas.documentWillHaveAtLeastOneActionRequest(builder.build(), Arrays.asList(new String[]{KewApiConstants.ACTION_REQUEST_APPROVE_REQ,KewApiConstants.ACTION_REQUEST_COMPLETE_REQ}), false));
406 
407         builder = RoutingReportCriteria.Builder.createByDocumentId(doc.getDocumentId());
408         builder.setXmlContent(doc.getDocumentContent().getApplicationContent());
409         builder.setTargetNodeName("WorkflowDocument4");
410         builder.setRoutingPrincipalId(getPrincipalIdForName("bmcgough"));
411         List<RoutingReportActionToTake.Builder> actionsToTake = new ArrayList<RoutingReportActionToTake.Builder>();
412         actionsToTake.add(RoutingReportActionToTake.Builder.create(KewApiConstants.ACTION_TAKEN_APPROVED_CD,getPrincipalIdForName("rkirkend"),"WorkflowDocument3"));
413         actionsToTake.add(RoutingReportActionToTake.Builder.create(KewApiConstants.ACTION_TAKEN_APPROVED_CD,
414                 getPrincipalIdForName("jitrue"), "WorkflowDocument4"));
415 
416         builder.setActionsToTake(actionsToTake);
417         assertFalse("Document should not have any unfulfilled approve/complete requests",
418                 wdas.documentWillHaveAtLeastOneActionRequest(builder.build(), Arrays.asList(
419                         new String[]{KewApiConstants.ACTION_REQUEST_APPROVE_REQ,
420                                 KewApiConstants.ACTION_REQUEST_COMPLETE_REQ}), false));
421 
422         builder = RoutingReportCriteria.Builder.createByDocumentId(doc.getDocumentId());
423         builder.setXmlContent(doc.getDocumentContent().getApplicationContent());
424         builder.setTargetNodeName("WorkflowDocument4");
425         actionsToTake = new ArrayList<RoutingReportActionToTake.Builder>();
426         actionsToTake.add(RoutingReportActionToTake.Builder.create(KewApiConstants.ACTION_TAKEN_APPROVED_CD,getPrincipalIdForName("rkirkend"),"WorkflowDocument3"));
427         actionsToTake.add(RoutingReportActionToTake.Builder.create(KewApiConstants.ACTION_TAKEN_APPROVED_CD,getPrincipalIdForName("jitrue"),"WorkflowDocument4"));
428         builder.setActionsToTake(actionsToTake);
429         assertFalse("Document should not have any unfulfilled approve/complete requests", wdas.documentWillHaveAtLeastOneActionRequest(builder.build(), Arrays.asList(new String[]{KewApiConstants.ACTION_REQUEST_APPROVE_REQ,KewApiConstants.ACTION_REQUEST_COMPLETE_REQ}), false));
430 
431         WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("rkirkend"), documentType);
432         builder = RoutingReportCriteria.Builder.createByDocumentId(document.getDocumentId());
433         builder.setXmlContent(document.getDocumentContent().getApplicationContent());
434         builder.setRoutingPrincipalId(getPrincipalIdForName("rkirkend"));
435         builder.setTargetNodeName("WorkflowDocument");
436         assertFalse("Document should not have any approve/complete requests", wdas.documentWillHaveAtLeastOneActionRequest(builder.build(), Arrays.asList(new String[]{KewApiConstants.ACTION_REQUEST_APPROVE_REQ,KewApiConstants.ACTION_REQUEST_COMPLETE_REQ}), false));
437 
438         builder = RoutingReportCriteria.Builder.createByDocumentId(document.getDocumentId());
439         builder.setXmlContent(document.getDocumentContent().getApplicationContent());
440         builder.setRoutingPrincipalId(getPrincipalIdForName("rkirkend"));
441         builder.setTargetNodeName("WorkflowDocument2");
442         assertFalse("Document should not have any approve/complete requests", wdas.documentWillHaveAtLeastOneActionRequest(builder.build(), Arrays.asList(new String[]{KewApiConstants.ACTION_REQUEST_APPROVE_REQ,KewApiConstants.ACTION_REQUEST_COMPLETE_REQ}), false));
443 
444         builder = RoutingReportCriteria.Builder.createByDocumentId(document.getDocumentId());
445         builder.setXmlContent(document.getDocumentContent().getApplicationContent());
446         builder.setRoutingPrincipalId(getPrincipalIdForName("rkirkend"));
447         builder.setTargetPrincipalIds(Collections.singletonList(getPrincipalIdForName("rkirkend")));
448         assertFalse("Document should not have any approve/complete requests for user rkirkend", wdas.documentWillHaveAtLeastOneActionRequest(builder.build(), Arrays.asList(new String[]{KewApiConstants.ACTION_REQUEST_APPROVE_REQ,KewApiConstants.ACTION_REQUEST_COMPLETE_REQ}), false));
449 
450         document.route("");
451         assertEquals("Document should be enroute", DocumentStatus.ENROUTE, document.getStatus());
452         assertEquals("Document route node is incorrect", "WorkflowDocument3", document.getNodeNames().iterator().next());
453         builder = RoutingReportCriteria.Builder.createByDocumentId(document.getDocumentId());
454         builder.setXmlContent(document.getDocumentContent().getApplicationContent());
455         builder.setTargetNodeName("WorkflowDocument4");
456         assertTrue("At least one unfulfilled approve/complete request should have been generated", wdas.documentWillHaveAtLeastOneActionRequest(builder.build(), Arrays.asList(new String[]{KewApiConstants.ACTION_REQUEST_APPROVE_REQ,KewApiConstants.ACTION_REQUEST_COMPLETE_REQ}), false));
457 
458         builder = RoutingReportCriteria.Builder.createByDocumentId(document.getDocumentId());
459         builder.setXmlContent(document.getDocumentContent().getApplicationContent());
460         builder.setTargetPrincipalIds(Collections.singletonList(getPrincipalIdForName("rkirkend")));
461         assertTrue("At least one unfulfilled approve/complete request should have been generated for rkirkend", wdas.documentWillHaveAtLeastOneActionRequest(builder.build(), Arrays.asList(new String[]{KewApiConstants.ACTION_REQUEST_APPROVE_REQ,KewApiConstants.ACTION_REQUEST_COMPLETE_REQ}), false));
462 
463         builder = RoutingReportCriteria.Builder.createByDocumentId(document.getDocumentId());
464         builder.setXmlContent(document.getDocumentContent().getApplicationContent());
465         builder.setTargetNodeName("WorkflowDocument4");
466         assertTrue("At least one unfulfilled approve/complete request should have been generated", wdas.documentWillHaveAtLeastOneActionRequest(builder.build(), Arrays.asList(new String[]{KewApiConstants.ACTION_REQUEST_APPROVE_REQ,KewApiConstants.ACTION_REQUEST_COMPLETE_REQ}), false));
467 
468         
469         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("rkirkend"), document.getDocumentId());
470         document.approve("");
471         assertEquals("Document should be enroute", DocumentStatus.ENROUTE, document.getStatus());
472         assertEquals("Document route node is incorrect", "WorkflowDocument4", document.getNodeNames().iterator().next());
473     }
474 
475     private void runDocumentWillHaveApproveOrCompleteRequestAtNode(String documentType,ReportCriteriaGenerator generator) throws Exception {
476       
477 
478 
479 
480 
481 
482 
483 
484 
485 
486 
487         WorkflowDocumentActionsService wdas = KewApiServiceLocator.getWorkflowDocumentActionsService();
488 
489         WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), documentType);
490         RoutingReportCriteria.Builder builder = RoutingReportCriteria.Builder.createByDocumentId(document.getDocumentId());
491         builder.setXmlContent(document.getDocumentContent().getApplicationContent());
492         builder.setTargetNodeName("WorkflowDocument2");
493         builder.setRoutingPrincipalId(getPrincipalIdForName("bmcgough"));
494         assertTrue("Document should have one unfulfilled approve/complete request", wdas.documentWillHaveAtLeastOneActionRequest(builder.build(), Arrays.asList(new String[]{KewApiConstants.ACTION_REQUEST_APPROVE_REQ,KewApiConstants.ACTION_REQUEST_COMPLETE_REQ}), false));
495         builder.setTargetPrincipalIds(Collections.singletonList(getPrincipalIdForName("bmcgough")));
496         assertFalse("Document should not have any unfulfilled approve/complete requests", wdas.documentWillHaveAtLeastOneActionRequest(builder.build(), Arrays.asList(new String[]{KewApiConstants.ACTION_REQUEST_APPROVE_REQ,KewApiConstants.ACTION_REQUEST_COMPLETE_REQ}), false));
497 
498         builder = RoutingReportCriteria.Builder.createByDocumentId(document.getDocumentId());
499         builder.setXmlContent(document.getDocumentContent().getApplicationContent());
500         builder.setTargetNodeName("WorkflowDocument2");
501         builder.setRoutingPrincipalId(getPrincipalIdForName("bmcgough"));
502         List<RoutingReportActionToTake.Builder> actionsToTake = new ArrayList<RoutingReportActionToTake.Builder>();
503 
504         actionsToTake.add(RoutingReportActionToTake.Builder.create(KewApiConstants.ACTION_TAKEN_APPROVED_CD,getPrincipalIdForName("pmckown"),"WorkflowDocument2"));
505         builder.setActionsToTake(actionsToTake);
506         assertFalse("Document should not have any unfulfilled approve/complete requests", wdas.documentWillHaveAtLeastOneActionRequest(builder.build(), Arrays.asList(new String[]{KewApiConstants.ACTION_REQUEST_APPROVE_REQ,KewApiConstants.ACTION_REQUEST_COMPLETE_REQ}), false));
507 
508         builder = RoutingReportCriteria.Builder.createByDocumentId(document.getDocumentId());
509         builder.setXmlContent(document.getDocumentContent().getApplicationContent());
510         builder.setTargetNodeName("WorkflowDocument2");
511         actionsToTake = new ArrayList<RoutingReportActionToTake.Builder>();
512         actionsToTake.add(RoutingReportActionToTake.Builder.create(KewApiConstants.ACTION_TAKEN_APPROVED_CD,getPrincipalIdForName("bmcgough"),"WorkflowDocument"));
513         actionsToTake.add(RoutingReportActionToTake.Builder.create(KewApiConstants.ACTION_TAKEN_APPROVED_CD,getPrincipalIdForName("rkirkend"),"WorkflowDocument"));
514         builder.setActionsToTake(actionsToTake);
515         builder.setRoutingPrincipalId(getPrincipalIdForName("pmckown"));
516         assertFalse("Document should not have any unfulfilled approve/complete requests", wdas.documentWillHaveAtLeastOneActionRequest(builder.build(), Arrays.asList(new String[]{KewApiConstants.ACTION_REQUEST_APPROVE_REQ,KewApiConstants.ACTION_REQUEST_COMPLETE_REQ}), false));
517 
518         document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), documentType);
519         document.route("");
520         assertTrue(document.isEnroute());
521 
522         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("bmcgough"), document.getDocumentId());
523         document.approve("");
524 
525         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("rkirkend"), document.getDocumentId());
526         document.approve("");
527 
528         builder = RoutingReportCriteria.Builder.createByDocumentId(document.getDocumentId());
529         builder.setXmlContent(document.getDocumentContent().getApplicationContent());
530         builder.setTargetNodeName("WorkflowDocument2");
531         assertTrue("Document should have one unfulfilled approve/complete request", wdas.documentWillHaveAtLeastOneActionRequest(builder.build(), Arrays.asList(new String[]{KewApiConstants.ACTION_REQUEST_APPROVE_REQ,KewApiConstants.ACTION_REQUEST_COMPLETE_REQ}), false));
532 
533         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("pmckown"), document.getDocumentId());
534         document.approve("");
535         assertTrue(document.isProcessed());
536 
537         builder = RoutingReportCriteria.Builder.createByDocumentId(document.getDocumentId());
538         builder.setXmlContent(document.getDocumentContent().getApplicationContent());
539         builder.setTargetNodeName("Acknowledge1");
540         assertFalse("Document should not have any unfulfilled approve/complete requests when in processed status", wdas.documentWillHaveAtLeastOneActionRequest(builder.build(), Arrays.asList(new String[]{KewApiConstants.ACTION_REQUEST_APPROVE_REQ,KewApiConstants.ACTION_REQUEST_COMPLETE_REQ}), false));
541 
542         builder = RoutingReportCriteria.Builder.createByDocumentId(document.getDocumentId());
543         builder.setXmlContent(document.getDocumentContent().getApplicationContent());
544         builder.setTargetNodeName("Acknowledge1");
545         assertTrue("Document should have one unfulfilled Ack request when in final status", wdas.documentWillHaveAtLeastOneActionRequest(builder.build(), Arrays.asList(new String[]{KewApiConstants.ACTION_REQUEST_ACKNOWLEDGE_REQ}), false));
546         if (generator.isCriteriaRouteHeaderBased()) {
547             assertFalse("Document should have no unfulfilled Ack request generated when in final status", wdas.documentWillHaveAtLeastOneActionRequest(builder.build(), Arrays.asList(new String[]{KewApiConstants.ACTION_REQUEST_ACKNOWLEDGE_REQ}), true));
548         }
549 
550         
551         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("temay"), document.getDocumentId());
552         document.acknowledge("");
553         assertTrue(document.isProcessed());
554     }
555 
556     @Test public void testIsLastApprover() throws Exception {
557         
558         WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), SeqSetup.DOCUMENT_TYPE_NAME);
559         document.saveDocumentData();
560 
561         WorkflowDocumentActionsService wdas = KewApiServiceLocator.getWorkflowDocumentActionsService();
562 
563         
564         assertFalse("Should not be last approver.", wdas.isLastApproverAtNode(document.getDocumentId(), getPrincipalIdForName("ewestfal"), SeqSetup.ADHOC_NODE));
565 
566         
567 		String groupId = getGroupIdForName(KimConstants.KIM_GROUP_WORKFLOW_NAMESPACE_CODE, "TestWorkgroup");
568         document.adHocToGroup(ActionRequestType.APPROVE, "AdHoc", "", groupId, "", false);
569 
570         assertTrue("Should be last approver.", wdas.isLastApproverAtNode(document.getDocumentId(), getPrincipalIdForName("ewestfal"), SeqSetup.ADHOC_NODE));
571 
572         
573         document.adHocToPrincipal(ActionRequestType.APPROVE, "AdHoc", "", getPrincipalIdForName("jitrue"), "", false);
574         
575         assertTrue("Should be last approver.", wdas.isLastApproverAtNode(document.getDocumentId(), getPrincipalIdForName("jitrue"), SeqSetup.ADHOC_NODE));
576         
577         assertFalse("Should not be last approver.", wdas.isLastApproverAtNode(document.getDocumentId(), getPrincipalIdForName("ewestfal"), SeqSetup.ADHOC_NODE));
578 
579         
580         document.route("");
581         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("jitrue"), document.getDocumentId());
582         assertEquals("Document should be at adhoc node.", SeqSetup.ADHOC_NODE, document.getNodeNames().iterator().next());
583         assertTrue("Approve should be requested.", document.isApprovalRequested());
584         document.approve("");
585 
586         
587         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("bmcgough"), document.getDocumentId());
588         assertTrue("Approve should be requested.", document.isApprovalRequested());
589         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("rkirkend"), document.getDocumentId());
590         assertTrue("Approve should be requested.", document.isApprovalRequested());
591         
592         assertFalse("Should not be last approver.", wdas.isLastApproverAtNode(document.getDocumentId(), getPrincipalIdForName("bmcgough"), SeqSetup.WORKFLOW_DOCUMENT_NODE));
593         assertFalse("Should not be last approver.", wdas.isLastApproverAtNode(document.getDocumentId(), getPrincipalIdForName("rkirkend"), SeqSetup.WORKFLOW_DOCUMENT_NODE));
594         document.approve("");
595 
596         
597         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("bmcgough"), document.getDocumentId());
598         assertTrue("Approve should be requested.", document.isApprovalRequested());
599         assertTrue("Should be last approver.", wdas.isLastApproverAtNode(document.getDocumentId(), getPrincipalIdForName("bmcgough"), SeqSetup.WORKFLOW_DOCUMENT_NODE));
600         document.approve("");
601 
602     }
603 
604     
605 
606 
607 
608 
609 
610 
611     @Test public void testIsLastApproverActivation() throws Exception {
612         
613         Parameter lastApproverActivateParameter = CoreFrameworkServiceLocator.getParameterService().getParameter(KewApiConstants.KEW_NAMESPACE, KRADConstants.DetailTypes.FEATURE_DETAIL_TYPE, KewApiConstants.IS_LAST_APPROVER_ACTIVATE_FIRST_IND);
614         assertNotNull("last approver parameter should exist.", lastApproverActivateParameter);
615         assertTrue("initial parameter value should be null or empty.", StringUtils.isBlank(lastApproverActivateParameter.getValue()));
616         String originalParameterValue = lastApproverActivateParameter.getValue();
617 
618         WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), SeqSetup.LAST_APPROVER_DOCUMENT_TYPE_NAME);
619         document.route("");
620 
621         
622         assertEquals("We should be at the WorkflowDocument node.", SeqSetup.WORKFLOW_DOCUMENT_NODE, document.getNodeNames().iterator().next());
623         assertFalse("ewestfal should have not have approve because it's initiated", document.isApprovalRequested());
624         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("rkirkend"), document.getDocumentId());
625         assertFalse("rkirkend should not have approve because it's initiated", document.isApprovalRequested());
626         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("bmcgough"), document.getDocumentId());
627         assertTrue("bmcgough should have approve", document.isApprovalRequested());
628         List actionRequests = KEWServiceLocator.getActionRequestService().findPendingByDoc(document.getDocumentId());
629         assertEquals("Should be 3 pending requests.", 3, actionRequests.size());
630         
631         
632         boolean foundBmcgoughRequest = false;
633         boolean foundRkirkendRequest = false;
634         boolean foundEwestfalRequest = false;
635         for (Iterator iterator = actionRequests.iterator(); iterator.hasNext();) {
636             ActionRequestValue actionRequest = (ActionRequestValue) iterator.next();
637             String netId = getPrincipalNameForId(actionRequest.getPrincipalId());
638             if ("bmcgough".equals(netId)) {
639                 assertTrue("Request to bmcgough should be activated.", actionRequest.isActive());
640                 foundBmcgoughRequest = true;
641             } else if ("rkirkend".equals(netId)) {
642                 assertTrue("Request to rkirkend should be initialized.", actionRequest.isInitialized());
643                 foundRkirkendRequest = true;
644             } else if ("ewestfal".equals(netId)) {
645                 assertTrue("Request to ewestfal should be initialized.", actionRequest.isInitialized());
646                 assertTrue("Request to ewestfal should be forceAction.", actionRequest.getForceAction().booleanValue());
647                 foundEwestfalRequest = true;
648             }
649         }
650         assertTrue("Did not find request to bmcgough.", foundBmcgoughRequest);
651         assertTrue("Did not find request to rkirkend.", foundRkirkendRequest);
652         assertTrue("Did not find request to ewestfal.", foundEwestfalRequest);
653 
654         WorkflowDocumentActionsService wdas = KewApiServiceLocator.getWorkflowDocumentActionsService();
655         
656         assertFalse("Bmcgough should not be the final approver.", wdas.isLastApproverAtNode(document.getDocumentId(), getPrincipalIdForName("bmcgough"), SeqSetup.WORKFLOW_DOCUMENT_NODE));
657         assertFalse("Rkirkend should not be the final approver.", wdas.isLastApproverAtNode(document.getDocumentId(), getPrincipalIdForName("rkirkend"), SeqSetup.WORKFLOW_DOCUMENT_NODE));
658         assertFalse("Ewestfal should not be the final approver.", wdas.isLastApproverAtNode(document.getDocumentId(), getPrincipalIdForName("ewestfal"), SeqSetup.WORKFLOW_DOCUMENT_NODE));
659 
660         
661         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("bmcgough"), document.getDocumentId());
662         document.approve("");
663 
664         
665         
666         assertFalse("Rkirkend should not be the final approver.", wdas.isLastApproverAtNode(document.getDocumentId(), getPrincipalIdForName("rkirkend"), SeqSetup.WORKFLOW_DOCUMENT_NODE));
667         assertFalse("Ewestfal should not be the final approver.", wdas.isLastApproverAtNode(document.getDocumentId(), getPrincipalIdForName("ewestfal"), SeqSetup.WORKFLOW_DOCUMENT_NODE));
668 
669         
670         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("rkirkend"), document.getDocumentId());
671         document.approve("");
672 
673         
674         actionRequests = KEWServiceLocator.getActionRequestService().findPendingByDoc(document.getDocumentId());
675         assertEquals("Should be 1 pending requests.", 1, actionRequests.size());
676         ActionRequestValue actionRequest = (ActionRequestValue)actionRequests.get(0);
677         assertTrue("Should be activated.", actionRequest.isActive());
678 
679         
680         assertTrue("Ewestfal should be the final approver.", wdas.isLastApproverAtNode(document.getDocumentId(), getPrincipalIdForName("ewestfal"), SeqSetup.WORKFLOW_DOCUMENT_NODE));
681 
682         
683         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("ewestfal"), document.getDocumentId());
684         assertTrue("ewestfal should have approve request", document.isApprovalRequested());
685         document.approve("");
686 
687         
688         assertEquals("Should be at the WorkflowDocument2 Node.", SeqSetup.WORKFLOW_DOCUMENT_2_NODE, document.getNodeNames().iterator().next());
689         
690         
691         
692         assertFalse("Pmckown should not be the final approver.", wdas.isLastApproverAtNode(document.getDocumentId(), getPrincipalIdForName("pmckown"), SeqSetup.WORKFLOW_DOCUMENT_2_NODE));
693         assertFalse("Ewestfal should not be the final approver.", wdas.isLastApproverAtNode(document.getDocumentId(), getPrincipalIdForName("ewestfal"), SeqSetup.WORKFLOW_DOCUMENT_2_NODE));
694         actionRequests = KEWServiceLocator.getActionRequestService().findPendingByDoc(document.getDocumentId());
695         assertEquals("Should be 2 action requests.", 2, actionRequests.size());
696 
697         
698         String parameterValue = "Y";
699         Parameter.Builder b = Parameter.Builder.create(lastApproverActivateParameter);
700         b.setValue(parameterValue);
701         CoreFrameworkServiceLocator.getParameterService().updateParameter(b.build());
702 
703         lastApproverActivateParameter = CoreFrameworkServiceLocator.getParameterService().getParameter(KewApiConstants.KEW_NAMESPACE, KRADConstants.DetailTypes.FEATURE_DETAIL_TYPE, KewApiConstants.IS_LAST_APPROVER_ACTIVATE_FIRST_IND);
704         assertNotNull("Parameter should not be null.", lastApproverActivateParameter);
705         assertEquals("Parameter should be Y.", parameterValue, lastApproverActivateParameter.getValue());
706 
707 
708         document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), SeqSetup.LAST_APPROVER_DOCUMENT_TYPE_NAME);
709         document.route("");
710 
711         
712         
713         
714 
715         
716         assertFalse("Bmcgough should not be the final approver.", wdas.isLastApproverAtNode(document.getDocumentId(), getPrincipalIdForName("bmcgough"), SeqSetup.WORKFLOW_DOCUMENT_NODE));
717         assertFalse("Rkirkend should not be the final approver.", wdas.isLastApproverAtNode(document.getDocumentId(), getPrincipalIdForName("rkirkend"), SeqSetup.WORKFLOW_DOCUMENT_NODE));
718         assertFalse("Ewestfal should not be the final approver.", wdas.isLastApproverAtNode(document.getDocumentId(), getPrincipalIdForName("ewestfal"), SeqSetup.WORKFLOW_DOCUMENT_NODE));
719 
720         
721         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("bmcgough"), document.getDocumentId());
722         document.approve("");
723 
724         
725         assertFalse("Rkirkend should not be the final approver.", wdas.isLastApproverAtNode(document.getDocumentId(), getPrincipalIdForName("rkirkend"), SeqSetup.WORKFLOW_DOCUMENT_NODE));
726         assertFalse("Ewestfal should not be the final approver.", wdas.isLastApproverAtNode(document.getDocumentId(), getPrincipalIdForName("ewestfal"), SeqSetup.WORKFLOW_DOCUMENT_NODE));
727 
728         
729         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("ewestfal"), document.getDocumentId());
730         assertFalse("Ewestfal should not have permissions to approve", document.isApprovalRequested());
731 
732         
733         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("rkirkend"), document.getDocumentId());
734         document.approve("");
735 
736         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("ewestfal"), document.getDocumentId());
737         assertTrue("Ewestfal should now have permission to approve", document.isApprovalRequested());
738 
739         
740         assertTrue("Ewestfal should now be the final approver.", wdas.isLastApproverAtNode(document.getDocumentId(), getPrincipalIdForName("ewestfal"), SeqSetup.WORKFLOW_DOCUMENT_NODE));
741 
742         
743         document.approve("");
744 
745         TestUtilities.assertAtNode(document, SeqSetup.WORKFLOW_DOCUMENT_2_NODE);
746         List<ActionRequestValue> requests = KEWServiceLocator.getActionRequestService().findPendingRootRequestsByDocId(document.getDocumentId());
747         assertEquals("We should have 2 requests here.", 2, requests.size());
748 
749         
750         
751         
752         assertTrue("Pmckown should be the last approver at this node.", wdas.isLastApproverAtNode(document.getDocumentId(), getPrincipalIdForName("pmckown"), SeqSetup.WORKFLOW_DOCUMENT_2_NODE));
753         assertFalse("Ewestfal should not be the final approver.", wdas.isLastApproverAtNode(document.getDocumentId(), getPrincipalIdForName("ewestfal"), SeqSetup.WORKFLOW_DOCUMENT_2_NODE));
754 
755         
756         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("pmckown"), document.getDocumentId());
757         document.approve("");
758         assertTrue("Document should be processed.", document.isProcessed());
759 
760         
761         Parameter.Builder b2 = Parameter.Builder.create(lastApproverActivateParameter);
762         b2.setValue("");
763         CoreFrameworkServiceLocator.getParameterService().updateParameter(b2.build());
764     }
765 
766     @Test public void testIsFinalApprover() throws Exception {
767         
768         WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), SeqSetup.DOCUMENT_TYPE_NAME);
769         assertFinalApprover(document);
770     }
771 
772     @Test public void testIsFinalApproverChild() throws Exception {
773         
774         
775         WorkflowDocument childDocument = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), SeqSetup.CHILD_DOCUMENT_TYPE_NAME);
776         assertFinalApprover(childDocument);
777     }
778 
779     
780 
781 
782     private void assertFinalApprover(WorkflowDocument document) throws Exception {
783         document.route("");
784 
785         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("bmcgough"), document.getDocumentId());
786         assertTrue("Document should be enroute.", document.isEnroute());
787         assertTrue("Should have approve request.", document.isApprovalRequested());
788 
789         WorkflowDocumentActionsService wdas = KewApiServiceLocator.getWorkflowDocumentActionsService();
790         
791         assertFalse("Should not be final approver.", wdas.isFinalApprover(document.getDocumentId(), getPrincipalIdForName("bmcgough")));
792         
793         document.approve("");
794 
795         
796         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("rkirkend"), document.getDocumentId());
797         assertTrue("Document should be enroute.", document.isEnroute());
798         assertTrue("Should have approve request.", document.isApprovalRequested());
799         assertFalse("Should not be final approver.", wdas.isFinalApprover(document.getDocumentId(), getPrincipalIdForName("rkirkend")));
800         document.approve("");
801 
802         
803         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("pmckown"), document.getDocumentId());
804         assertTrue("Document should be enroute.", document.isEnroute());
805         assertTrue("Should have approve request.", document.isApprovalRequested());
806         assertTrue("Should be final approver.", wdas.isFinalApprover(document.getDocumentId(), getPrincipalIdForName("pmckown")));
807 
808         
809         document.adHocToPrincipal(ActionRequestType.APPROVE, SeqSetup.WORKFLOW_DOCUMENT_2_NODE,
810                 "", getPrincipalIdForName("temay"), "", true);
811         assertFalse("Should not be final approver.", wdas.isFinalApprover(document.getDocumentId(), getPrincipalIdForName("pmckown")));
812         assertFalse("Should not be final approver.", wdas.isFinalApprover(document.getDocumentId(), getPrincipalIdForName("temay")));
813 
814         
815         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("temay"), document.getDocumentId());
816         assertTrue("SHould have approve request.", document.isApprovalRequested());
817         document.approve("");
818 
819         
820         assertTrue("Should be final approver.", wdas.isFinalApprover(document.getDocumentId(), getPrincipalIdForName("pmckown")));
821         document.adHocToPrincipal(ActionRequestType.ACKNOWLEDGE, SeqSetup.WORKFLOW_DOCUMENT_2_NODE,
822                 "", getPrincipalIdForName("jhopf"), "", true);
823         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("jhopf"), document.getDocumentId());
824         assertTrue("Should have acknowledge request.", document.isAcknowledgeRequested());
825 
826         
827         assertTrue("Should be final approver.", wdas.isFinalApprover(document.getDocumentId(), getPrincipalIdForName("pmckown")));
828         assertFalse("Should not be final approver.", wdas.isFinalApprover(document.getDocumentId(), getPrincipalIdForName("jhopf")));
829 
830         
831         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("pmckown"), document.getDocumentId());
832         document.approve("");
833         assertTrue("Document should be processed.", document.isProcessed());
834     }
835 
836     @Test public void testGetPrincipalIdsInRouteLog() throws Exception {
837     	Set<String> NonSITMembers = new HashSet<String>(
838     			Arrays.asList(
839 						new String[] {
840 								getPrincipalIdForName("user1"),
841 								getPrincipalIdForName("user2"),
842 								getPrincipalIdForName("user3"),
843 								getPrincipalIdForName("dewey")}
844 				)
845     	);
846 
847     	Set<String> WorkflowAdminMembers = new HashSet<String>(
848     			Arrays.asList(
849     					new String[] {
850     							getPrincipalIdForName("ewestfal"),
851     							getPrincipalIdForName("rkirkend"),
852     							getPrincipalIdForName("jhopf"),
853     							getPrincipalIdForName("bmcgough"),
854     							getPrincipalIdForName("shenl"),
855     							getPrincipalIdForName("quickstart")
856     					}
857     			)
858     	);
859 
860     	WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("rkirkend"), RouteLogTestSetup.DOCUMENT_TYPE_NAME);
861 		document.route("");
862 
863         WorkflowDocumentActionsService wdas = KewApiServiceLocator.getWorkflowDocumentActionsService();
864 		
865 		List<String> principalIds = wdas.getPrincipalIdsInRouteLog(document.getDocumentId(), false);
866 		
867 		assertTrue(principalIds.contains(getPrincipalIdForName("ewestfal")));
868 		assertTrue(principalIds.containsAll(NonSITMembers));
869 
870 		
871 		assertFalse(principalIds.contains(getPrincipalIdForName("jitrue")));
872 		assertFalse(principalIds.containsAll(WorkflowAdminMembers));
873 
874 		
875 		principalIds = 	wdas.getPrincipalIdsInRouteLog(document.getDocumentId(), true);
876 
877 		
878 		assertTrue(principalIds.contains(getPrincipalIdForName("ewestfal")));
879 		assertTrue(principalIds.containsAll(NonSITMembers));
880 
881 		
882 		assertTrue(principalIds.contains(getPrincipalIdForName("jitrue")));
883 		assertTrue(principalIds.containsAll(WorkflowAdminMembers));
884     }
885 
886     @Test public void testRoutingReportOnDocumentType() throws Exception {
887         RoutingReportCriteria.Builder criteria = RoutingReportCriteria.Builder.createByDocumentTypeName("SeqDocType");
888     	criteria.setRuleTemplateNames(Collections.singletonList("WorkflowDocumentTemplate"));
889         WorkflowDocumentActionsService wdas = KewApiServiceLocator.getWorkflowDocumentActionsService();
890     	DocumentDetail documentDetail = wdas.executeSimulation(criteria.build());
891     	assertNotNull(documentDetail);
892     	assertEquals("Should have been 2 requests generated.", 2, documentDetail.getActionRequests().size());
893 
894     	
895     	criteria.setRuleTemplateNames(Arrays.asList(new String[] {"WorkflowDocumentTemplate", "WorkflowDocument2Template"}));
896     	documentDetail = wdas.executeSimulation(criteria.build());
897     	assertEquals("Should have been 3 requests generated.", 3, documentDetail.getActionRequests().size());
898 
899     	boolean foundRkirkend = false;
900     	boolean foundBmcgough = false;
901     	boolean foundPmckown = false;
902     	for (ActionRequest actionRequest : documentDetail.getActionRequests()) {
903 			String netId = getPrincipalNameForId(actionRequest.getPrincipalId());
904 			if (netId.equals("rkirkend")) {
905 				foundRkirkend = true;
906 				assertEquals(SeqSetup.WORKFLOW_DOCUMENT_NODE, actionRequest.getNodeName());
907 			} else if (netId.equals("bmcgough")) {
908 				foundBmcgough = true;
909 				assertEquals(SeqSetup.WORKFLOW_DOCUMENT_NODE, actionRequest.getNodeName());
910 			} else if (netId.equals("pmckown")) {
911 				foundPmckown = true;
912 				assertEquals(SeqSetup.WORKFLOW_DOCUMENT_2_NODE, actionRequest.getNodeName());
913 			}
914 		}
915     	assertTrue("Did not find request for rkirkend", foundRkirkend);
916     	assertTrue("Did not find request for bmcgough", foundBmcgough);
917     	assertTrue("Did not find request for pmckown", foundPmckown);
918 
919     }
920 
921     @Test public void testRoutingReportOnDocumentId() throws Exception {
922         WorkflowDocument doc = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("user1"), "SeqDocType");
923 
924         WorkflowDocumentActionsService wdas = KewApiServiceLocator.getWorkflowDocumentActionsService();
925         RoutingReportCriteria.Builder criteria = RoutingReportCriteria.Builder.createByDocumentId(doc.getDocumentId());
926         criteria.setRuleTemplateNames(Collections.singletonList("WorkflowDocumentTemplate"));
927         DocumentDetail documentDetail = wdas.executeSimulation(criteria.build());
928         assertNotNull(documentDetail);
929         assertEquals("Document id returned should be the same as the one passed in", doc.getDocumentId(),
930                 documentDetail.getDocument().getDocumentId());
931         assertEquals("Wrong number of action requests generated", 2, documentDetail.getActionRequests().size());
932 
933         
934         criteria.setRuleTemplateNames(Arrays.asList(new String[] { "WorkflowDocumentTemplate", "WorkflowDocument2Template" }));
935         documentDetail = wdas.executeSimulation(criteria.build());
936         assertEquals("Should have been 3 requests generated.", 3, documentDetail.getActionRequests().size());
937 
938         boolean foundRkirkend = false;
939         boolean foundBmcgough = false;
940         boolean foundPmckown = false;
941         for (ActionRequest actionRequest : documentDetail.getActionRequests()) {
942             String netId = getPrincipalNameForId(actionRequest.getPrincipalId());
943             if (netId.equals("rkirkend")) {
944                 foundRkirkend = true;
945                 assertEquals(SeqSetup.WORKFLOW_DOCUMENT_NODE, actionRequest.getNodeName());
946             } else if (netId.equals("bmcgough")) {
947                 foundBmcgough = true;
948                 assertEquals(SeqSetup.WORKFLOW_DOCUMENT_NODE, actionRequest.getNodeName());
949             } else if (netId.equals("pmckown")) {
950                 foundPmckown = true;
951                 assertEquals(SeqSetup.WORKFLOW_DOCUMENT_2_NODE, actionRequest.getNodeName());
952             }
953         }
954         assertTrue("Did not find request for rkirkend", foundRkirkend);
955         assertTrue("Did not find request for bmcgough", foundBmcgough);
956         assertTrue("Did not find request for pmckown", foundPmckown);
957 
958     }
959 
960     protected void verifyEmptyArray(String qualifier, Object[] array) {
961     	assertNotNull("Array should not be empty", array);
962         assertEquals("Number of " + qualifier + "s Returned Should be 0",0,array.length);
963     }
964 
965     private void verifyEmptyCollection(String qualifier, Collection collection) {
966     	assertNotNull("Array should not be empty", collection);
967         assertEquals("Number of " + qualifier + "s Returned Should be 0",0,collection.size());
968     }
969 
970     @Test public void testRuleReportGeneralFunction() throws Exception {
971         this.ruleExceptionTest(null, "Sending in null RuleReportCriteriaDTO should throw Exception");
972 
973         RuleReportCriteria.Builder ruleReportCriteria = RuleReportCriteria.Builder.create();
974         this.ruleExceptionTest(ruleReportCriteria.build(), "Sending in empty RuleReportCriteriaDTO should throw Exception");
975 
976         ruleReportCriteria.setResponsiblePrincipalId("hobo_man");
977         this.ruleExceptionTest(ruleReportCriteria.build(), "Sending in an invalid principle ID should throw Exception");
978 
979         ruleReportCriteria = RuleReportCriteria.Builder.create();
980         ruleReportCriteria.setResponsibleGroupId("-1234567");
981         this.ruleExceptionTest(ruleReportCriteria.build(), "Sending in an invalid Workgroup ID should throw Exception");
982 
983         ruleReportCriteria = RuleReportCriteria.Builder.create();
984         ruleReportCriteria.setRuleExtensions(Collections.singletonMap("key", "value"));
985         this.ruleExceptionTest(ruleReportCriteria.build(), "Sending in one or more RuleExtentionVO objects with no Rule Template Name should throw Exception");
986 
987 
988         RuleService wdas = KewApiServiceLocator.getRuleService();
989         List<Rule> rules = null;
990         ruleReportCriteria = RuleReportCriteria.Builder.create();
991         ruleReportCriteria.setConsiderGroupMembership(Boolean.FALSE.booleanValue());
992         ruleReportCriteria.setDocumentTypeName(RuleTestGeneralSetup.DOCUMENT_TYPE_NAME);
993         ruleReportCriteria.setIncludeDelegations(Boolean.FALSE.booleanValue());
994         rules = wdas.ruleReport(ruleReportCriteria.build());
995         assertEquals("Number of Rules Returned Should be 3",3,rules.size());
996 
997         rules = null;
998         ruleReportCriteria = RuleReportCriteria.Builder.create();
999         ruleReportCriteria.setActionRequestCodes(Collections.singletonList(KewApiConstants.ACTION_REQUEST_ACKNOWLEDGE_REQ));
1000         ruleReportCriteria.setConsiderGroupMembership(Boolean.FALSE.booleanValue());
1001         ruleReportCriteria.setDocumentTypeName(RuleTestGeneralSetup.DOCUMENT_TYPE_NAME);
1002         ruleReportCriteria.setIncludeDelegations(Boolean.FALSE.booleanValue());
1003         ruleReportCriteria.setResponsiblePrincipalId(getPrincipalIdForName("temay"));
1004         rules = wdas.ruleReport(ruleReportCriteria.build());
1005         verifyEmptyCollection("Rule", rules);
1006 
1007         rules = null;
1008         ruleReportCriteria = RuleReportCriteria.Builder.create();
1009         ruleReportCriteria.setActionRequestCodes(Collections.singletonList(KewApiConstants.ACTION_REQUEST_ACKNOWLEDGE_REQ));
1010         ruleReportCriteria.setConsiderGroupMembership(Boolean.FALSE.booleanValue());
1011         ruleReportCriteria.setDocumentTypeName(RuleTestGeneralSetup.DOCUMENT_TYPE_NAME);
1012         ruleReportCriteria.setIncludeDelegations(Boolean.FALSE.booleanValue());
1013         rules = wdas.ruleReport(ruleReportCriteria.build());
1014         assertEquals("Number of Rules Returned Should be 1",1,rules.size());
1015         
1016 
1017         Rule ruleVO = rules.get(0);
1018         assertEquals("Rule Document Type is not " + RuleTestGeneralSetup.DOCUMENT_TYPE_NAME,RuleTestGeneralSetup.DOCUMENT_TYPE_NAME,ruleVO.getDocTypeName());
1019         assertEquals("Rule Template Named returned is not " + RuleTestGeneralSetup.RULE_TEST_TEMPLATE_2,RuleTestGeneralSetup.RULE_TEST_TEMPLATE_2,ruleVO.getRuleTemplateName());
1020         assertEquals("Rule did not have force action set to false",Boolean.FALSE,ruleVO.isForceAction());
1021         assertEquals("Number of Rule Responsibilities returned is incorrect",2,ruleVO.getRuleResponsibilities().size());
1022 
1023         for (RuleResponsibility responsibility : ruleVO.getRuleResponsibilities()) {
1024             String responsibilityPrincipalName = getPrincipalNameForId(responsibility.getPrincipalId());
1025             if ("temay".equals(responsibilityPrincipalName)) {
1026                 assertEquals("Rule user is not correct","temay",responsibilityPrincipalName);
1027                 assertEquals("Rule priority is incorrect",Integer.valueOf(1),responsibility.getPriority());
1028                 assertEquals("Rule should be Ack Request",KewApiConstants.ACTION_REQUEST_APPROVE_REQ,responsibility.getActionRequestedCd());
1029             } else if ("ewestfal".equals(responsibilityPrincipalName)) {
1030                 assertEquals("Rule user is not correct","ewestfal",responsibilityPrincipalName);
1031                 assertEquals("Rule priority is incorrect",Integer.valueOf(2),responsibility.getPriority());
1032                 assertEquals("Rule should be Ack Request",KewApiConstants.ACTION_REQUEST_ACKNOWLEDGE_REQ,responsibility.getActionRequestedCd());
1033             } else {
1034                 fail("Network ID of user for this responsibility is neither temay or ewestfal");
1035             }
1036         }
1037 
1038         rules = null;
1039         ruleVO = null;
1040         RuleResponsibility responsibilityVO = null;
1041         ruleReportCriteria = RuleReportCriteria.Builder.create();
1042         ruleReportCriteria.setConsiderGroupMembership(Boolean.FALSE.booleanValue());
1043         ruleReportCriteria.setDocumentTypeName(RuleTestGeneralSetup.DOCUMENT_TYPE_NAME);
1044         ruleReportCriteria.setIncludeDelegations(Boolean.FALSE.booleanValue());
1045         ruleReportCriteria.setResponsiblePrincipalId(getPrincipalIdForName("temay"));
1046         rules = wdas.ruleReport(ruleReportCriteria.build());
1047         assertEquals("Number of Rules returned is not correct",2,rules.size());
1048         for (Rule rule : rules) {
1049             if (RuleTestGeneralSetup.RULE_TEST_TEMPLATE_1.equals(rule.getRuleTemplateName())) {
1050                 assertEquals("Rule Document Type is not " + RuleTestGeneralSetup.DOCUMENT_TYPE_NAME,RuleTestGeneralSetup.DOCUMENT_TYPE_NAME,rule.getDocTypeName());
1051                 assertEquals("Rule Template Named returned is not " + RuleTestGeneralSetup.RULE_TEST_TEMPLATE_1,RuleTestGeneralSetup.RULE_TEST_TEMPLATE_1,rule.getRuleTemplateName());
1052                 assertEquals("Rule did not have force action set to true",Boolean.TRUE,rule.isForceAction());
1053                 assertEquals("Number of Rule Responsibilities Returned Should be 1",1,rule.getRuleResponsibilities().size());
1054                 responsibilityVO = rule.getRuleResponsibilities().get(0);
1055                 assertEquals("Rule user is incorrect","temay",getPrincipalNameForId(responsibilityVO.getPrincipalId()));
1056                 assertEquals("Rule priority is incorrect",Integer.valueOf(3),responsibilityVO.getPriority());
1057                 assertEquals("Rule action request is incorrect",KewApiConstants.ACTION_REQUEST_APPROVE_REQ,responsibilityVO.getActionRequestedCd());
1058             } else if (RuleTestGeneralSetup.RULE_TEST_TEMPLATE_2.equals(rule.getRuleTemplateName())) {
1059                 assertEquals("Rule Document Type is not " + RuleTestGeneralSetup.DOCUMENT_TYPE_NAME,RuleTestGeneralSetup.DOCUMENT_TYPE_NAME,rule.getDocTypeName());
1060                 assertEquals("Rule Template Named returned is not " + RuleTestGeneralSetup.RULE_TEST_TEMPLATE_2,RuleTestGeneralSetup.RULE_TEST_TEMPLATE_2,rule.getRuleTemplateName());
1061                 assertEquals("Rule did not have force action set to false",Boolean.FALSE,rule.isForceAction());
1062                 assertEquals("Number of Rule Responsibilities returned is incorrect",2,rule.getRuleResponsibilities().size());
1063                 for (RuleResponsibility responsibility : rule.getRuleResponsibilities()) {
1064 
1065                     String responsibilityPrincipalName = getPrincipalNameForId(responsibility.getPrincipalId());
1066                     if ("temay".equals(responsibilityPrincipalName)) {
1067                         assertEquals("Rule user is not correct","temay",responsibilityPrincipalName);
1068                         assertEquals("Rule priority is incorrect",Integer.valueOf(1),responsibility.getPriority());
1069                         assertEquals("Rule should be Ack Request",KewApiConstants.ACTION_REQUEST_APPROVE_REQ,responsibility.getActionRequestedCd());
1070                     } else if ("ewestfal".equals(responsibilityPrincipalName)) {
1071                         assertEquals("Rule user is not correct","ewestfal",responsibilityPrincipalName);
1072                         assertEquals("Rule priority is incorrect",Integer.valueOf(2),responsibility.getPriority());
1073                         assertEquals("Rule should be Ack Request",KewApiConstants.ACTION_REQUEST_ACKNOWLEDGE_REQ,responsibility.getActionRequestedCd());
1074                     } else {
1075                         fail("Network ID of user for this responsibility is neither temay or ewestfal");
1076                     }
1077                 }
1078             } else {
1079                 fail("Rule Template of returned rule is not of type " + RuleTestGeneralSetup.RULE_TEST_TEMPLATE_1 + " nor " + RuleTestGeneralSetup.RULE_TEST_TEMPLATE_2);
1080             }
1081         }
1082 
1083         rules = null;
1084         ruleVO = null;
1085         responsibilityVO = null;
1086         ruleReportCriteria = RuleReportCriteria.Builder.create();
1087         ruleReportCriteria.setDocumentTypeName(RuleTestGeneralSetup.DOCUMENT_TYPE_NAME);
1088         ruleReportCriteria.setIncludeDelegations(Boolean.FALSE.booleanValue());
1089         ruleReportCriteria.setResponsibleGroupId(RuleTestGeneralSetup.RULE_TEST_GROUP_ID);
1090         rules = wdas.ruleReport(ruleReportCriteria.build());
1091         assertEquals("Number of Rules Returned Should be 1",1,rules.size());
1092         ruleVO = rules.get(0);
1093         assertEquals("Rule Document Type is not " + RuleTestGeneralSetup.DOCUMENT_TYPE_NAME,RuleTestGeneralSetup.DOCUMENT_TYPE_NAME,ruleVO.getDocTypeName());
1094         assertEquals("Rule Template Named returned is not " + RuleTestGeneralSetup.RULE_TEST_TEMPLATE_3,RuleTestGeneralSetup.RULE_TEST_TEMPLATE_3,ruleVO.getRuleTemplateName());
1095         assertEquals("Rule did not have force action set to true",Boolean.TRUE,ruleVO.isForceAction());
1096         assertEquals("Number of Rule Responsibilities Returned Should be 1",1,ruleVO.getRuleResponsibilities().size());
1097         responsibilityVO = ruleVO.getRuleResponsibilities().get(0);
1098         Group ruleTestGroup = KimApiServiceLocator.getGroupService().getGroup(responsibilityVO.getGroupId());
1099         assertEquals("Rule workgroup id is incorrect",RuleTestGeneralSetup.RULE_TEST_GROUP_ID, ruleTestGroup.getId());
1100         assertEquals("Rule priority is incorrect",Integer.valueOf(1),responsibilityVO.getPriority());
1101         assertEquals("Rule action request is incorrect",KewApiConstants.ACTION_REQUEST_FYI_REQ,responsibilityVO.getActionRequestedCd());
1102 
1103         rules = null;
1104         ruleVO = null;
1105         responsibilityVO = null;
1106         ruleReportCriteria = RuleReportCriteria.Builder.create();
1107         ruleReportCriteria.setDocumentTypeName(RuleTestGeneralSetup.DOCUMENT_TYPE_NAME);
1108         ruleReportCriteria.setIncludeDelegations(Boolean.FALSE.booleanValue());
1109         ruleReportCriteria.setResponsiblePrincipalId(getPrincipalIdForName("user1"));
1110         rules = wdas.ruleReport(ruleReportCriteria.build());
1111         assertEquals("Number of Rules Returned Should be 1",1,rules.size());
1112         ruleVO = rules.get(0);
1113         assertEquals("Rule Document Type is not " + RuleTestGeneralSetup.DOCUMENT_TYPE_NAME,RuleTestGeneralSetup.DOCUMENT_TYPE_NAME,ruleVO.getDocTypeName());
1114         assertNotSame("Rule Template Named returned is not " + RuleTestGeneralSetup.RULE_TEST_TEMPLATE_3,
1115                 RuleTestGeneralSetup.RULE_TEST_TEMPLATE_3, ruleVO.getRuleTemplateName());
1116         assertEquals("Rule did not have force action set to true",Boolean.TRUE,ruleVO.isForceAction());
1117         assertEquals("Number of Rule Responsibilities Returned Should be 1",1,ruleVO.getRuleResponsibilities().size());
1118         responsibilityVO = ruleVO.getRuleResponsibilities().get(0);
1119         assertEquals("Rule workgroup id is incorrect",RuleTestGeneralSetup.RULE_TEST_GROUP_ID, ruleTestGroup.getId());
1120         assertEquals("Rule priority is incorrect",Integer.valueOf(1),responsibilityVO.getPriority());
1121         assertEquals("Rule action request is incorrect",KewApiConstants.ACTION_REQUEST_FYI_REQ,responsibilityVO.getActionRequestedCd());
1122     }
1123 
1124     
1125 
1126 
1127 
1128 
1129     @Test public void testRuleReportOrgReviewTest() throws Exception {
1130         loadXmlFile("WorkflowUtilityRuleReportConfig.xml");
1131 
1132         RuleService wdas = KewApiServiceLocator.getRuleService();
1133 
1134         RuleReportCriteria.Builder ruleReportCriteria = RuleReportCriteria.Builder.create();
1135         ruleReportCriteria.setDocumentTypeName(RuleTestOrgReviewSetup.DOCUMENT_TYPE_NAME);
1136         ruleReportCriteria.setRuleTemplateName(RuleTestOrgReviewSetup.RULE_TEST_TEMPLATE);
1137         ruleReportCriteria.setResponsiblePrincipalId(getPrincipalIdForName("user1"));
1138         ruleReportCriteria.setIncludeDelegations(Boolean.FALSE.booleanValue());
1139         List<Rule> rules = wdas.ruleReport(ruleReportCriteria.build());
1140         assertEquals("Number of rules returned is incorrect",2,rules.size());
1141 
1142         ruleReportCriteria = null;
1143         rules = null;
1144         ruleReportCriteria = RuleReportCriteria.Builder.create();
1145         ruleReportCriteria.setDocumentTypeName(RuleTestOrgReviewSetup.DOCUMENT_TYPE_NAME);
1146         ruleReportCriteria.setRuleTemplateName(RuleTestOrgReviewSetup.RULE_TEST_TEMPLATE);
1147         ruleReportCriteria.setResponsiblePrincipalId(getPrincipalIdForName("user1"));
1148         ruleReportCriteria.setConsiderGroupMembership(Boolean.FALSE.booleanValue());
1149         ruleReportCriteria.setIncludeDelegations(Boolean.FALSE.booleanValue());
1150         rules = wdas.ruleReport(ruleReportCriteria.build());
1151         assertEquals("Number of rules returned is incorrect",1,rules.size());
1152 
1153         ruleReportCriteria = null;
1154         rules = null;
1155         ruleReportCriteria = RuleReportCriteria.Builder.create();
1156         ruleReportCriteria.setDocumentTypeName(RuleTestOrgReviewSetup.DOCUMENT_TYPE_NAME);
1157         ruleReportCriteria.setRuleTemplateName(RuleTestOrgReviewSetup.RULE_TEST_TEMPLATE);
1158         Map<String, String> ruleExtensions = new HashMap<String, String>();
1159         ruleExtensions.put(RuleTestOrgReviewSetup.RULE_TEST_CHART_CODE_NAME, "BA");
1160         ruleExtensions.put(RuleTestOrgReviewSetup.RULE_TEST_ORG_CODE_NAME,"FMOP");
1161         ruleReportCriteria.setRuleExtensions(ruleExtensions);
1162         ruleReportCriteria.setIncludeDelegations(Boolean.FALSE.booleanValue());
1163         rules = wdas.ruleReport(ruleReportCriteria.build());
1164         assertEquals("Number of rules returned is incorrect",2,rules.size());
1165 
1166         ruleReportCriteria = null;
1167         rules = null;
1168         ruleExtensions = new HashMap<String, String>();
1169         ruleReportCriteria = RuleReportCriteria.Builder.create();
1170         ruleReportCriteria.setDocumentTypeName(RuleTestOrgReviewSetup.DOCUMENT_TYPE_NAME);
1171         ruleReportCriteria.setRuleTemplateName(RuleTestOrgReviewSetup.RULE_TEST_TEMPLATE);
1172         ruleReportCriteria.setResponsiblePrincipalId(getPrincipalIdForName("ewestfal"));
1173         ruleReportCriteria.setIncludeDelegations(Boolean.FALSE.booleanValue());
1174         rules = wdas.ruleReport(ruleReportCriteria.build());
1175         assertEquals("Number of rules returned is incorrect",1,rules.size());
1176         Rule ruleVO = rules.get(0);
1177         assertEquals("Rule Document Type is not " + RuleTestOrgReviewSetup.DOCUMENT_TYPE_NAME,RuleTestOrgReviewSetup.DOCUMENT_TYPE_NAME,ruleVO.getDocTypeName());
1178         assertEquals("Rule Template Named returned is not " + RuleTestOrgReviewSetup.RULE_TEST_TEMPLATE,RuleTestOrgReviewSetup.RULE_TEST_TEMPLATE,ruleVO.getRuleTemplateName());
1179         assertEquals("Rule did not have force action set to true",Boolean.TRUE,ruleVO.isForceAction());
1180         assertEquals("Number of Rule Responsibilities Returned Should be 1",1,ruleVO.getRuleResponsibilities().size());
1181         RuleResponsibility responsibilityVO = ruleVO.getRuleResponsibilities().get(0);
1182         Group ruleTestGroup2 = KimApiServiceLocator.getGroupService().getGroup(responsibilityVO.getGroupId());
1183         assertEquals("Rule workgroup name is incorrect",RuleTestOrgReviewSetup.RULE_TEST_WORKGROUP2,ruleTestGroup2.getName());
1184         assertEquals("Rule priority is incorrect",Integer.valueOf(4),responsibilityVO.getPriority());
1185         assertEquals("Rule action request is incorrect",KewApiConstants.ACTION_REQUEST_FYI_REQ,responsibilityVO.getActionRequestedCd());
1186         ruleExtensions = ruleVO.getRuleExtensionMap();
1187         assertEquals("Number of Rule Extensions Returned Should be 2",2,ruleExtensions.size());
1188         for (Map.Entry<String, String> entry : ruleExtensions.entrySet()) {
1189             
1190             
1191             
1192             if (RuleTestOrgReviewSetup.RULE_TEST_CHART_CODE_NAME.equals(entry.getKey())) {
1193                 assertEquals("Rule Extension for key '" + RuleTestOrgReviewSetup.RULE_TEST_CHART_CODE_NAME + "' is incorrect","UA",entry.getValue());
1194             } else if (RuleTestOrgReviewSetup.RULE_TEST_ORG_CODE_NAME.equals(entry.getKey())) {
1195                 assertEquals("Rule Extension for key '" + RuleTestOrgReviewSetup.RULE_TEST_ORG_CODE_NAME + "' is incorrect","VPIT",entry.getValue());
1196             } else {
1197                 fail("Rule Extension has attribute key that is neither '" + RuleTestOrgReviewSetup.RULE_TEST_CHART_CODE_NAME +
1198                         "' nor '" + RuleTestOrgReviewSetup.RULE_TEST_ORG_CODE_NAME + "'");
1199             }
1200         }
1201 
1202         ruleReportCriteria = null;
1203         rules = null;
1204         ruleVO = null;
1205         responsibilityVO = null;
1206         ruleReportCriteria = RuleReportCriteria.Builder.create();
1207         ruleReportCriteria.setDocumentTypeName(RuleTestOrgReviewSetup.DOCUMENT_TYPE_NAME);
1208         ruleReportCriteria.setRuleTemplateName(RuleTestOrgReviewSetup.RULE_TEST_TEMPLATE);
1209         ruleReportCriteria.setResponsiblePrincipalId(getPrincipalIdForName("user1"));
1210         ruleReportCriteria.setIncludeDelegations(Boolean.FALSE);
1211         rules = wdas.ruleReport(ruleReportCriteria.build());
1212         assertEquals("Number of rules returned is incorrect",2,rules.size());
1213 
1214         ruleReportCriteria = null;
1215         rules = null;
1216         ruleVO = null;
1217         responsibilityVO = null;
1218         ruleExtensions = new HashMap<String, String>();
1219         ruleReportCriteria = RuleReportCriteria.Builder.create();
1220         ruleReportCriteria.setDocumentTypeName(RuleTestOrgReviewSetup.DOCUMENT_TYPE_NAME);
1221         ruleReportCriteria.setRuleTemplateName(RuleTestOrgReviewSetup.RULE_TEST_TEMPLATE);
1222         ruleExtensions.put(RuleTestOrgReviewSetup.RULE_TEST_CHART_CODE_NAME, "UA");
1223         ruleExtensions.put(RuleTestOrgReviewSetup.RULE_TEST_ORG_CODE_NAME, "FMOP");
1224         ruleReportCriteria.setRuleExtensions(ruleExtensions);
1225         ruleReportCriteria.setIncludeDelegations(Boolean.FALSE);
1226         rules = wdas.ruleReport(ruleReportCriteria.build());
1227         assertEquals("Number of rules returned is incorrect",1,rules.size());
1228         ruleVO = rules.get(0);
1229         assertEquals("Rule Document Type is not " + RuleTestOrgReviewSetup.DOCUMENT_TYPE_NAME,RuleTestOrgReviewSetup.DOCUMENT_TYPE_NAME,ruleVO.getDocTypeName());
1230         assertEquals("Rule Template Named returned is not " + RuleTestOrgReviewSetup.RULE_TEST_TEMPLATE,RuleTestOrgReviewSetup.RULE_TEST_TEMPLATE,ruleVO.getRuleTemplateName());
1231         assertEquals("Rule did not have force action set to true",Boolean.TRUE,ruleVO.isForceAction());
1232         assertEquals("Number of Rule Responsibilities Returned Should be 1",1,ruleVO.getRuleResponsibilities().size());
1233         responsibilityVO = ruleVO.getRuleResponsibilities().get(0);
1234         ruleTestGroup2 = KimApiServiceLocator.getGroupService().getGroup(responsibilityVO.getGroupId());
1235         assertEquals("Rule workgroup name is incorrect",RuleTestOrgReviewSetup.RULE_TEST_WORKGROUP, ruleTestGroup2.getName());
1236         assertEquals("Rule priority is incorrect",Integer.valueOf(1),responsibilityVO.getPriority());
1237         assertEquals("Rule action request is incorrect",KewApiConstants.ACTION_REQUEST_APPROVE_REQ,responsibilityVO.getActionRequestedCd());
1238     }
1239 
1240     @Test public void testGetUserActionItemCount() throws Exception {
1241         String principalId = getPrincipalIdForName("ewestfal");
1242         ActionListService als = KewApiServiceLocator.getActionListService();
1243         assertEquals("Count (test start) is incorrect for user " + principalId, Integer.valueOf(0), als.getUserActionItemCount(principalId));
1244 
1245         WorkflowDocument document = WorkflowDocumentFactory.createDocument(principalId, SeqSetup.DOCUMENT_TYPE_NAME);
1246         document.route("");
1247         assertTrue(document.isEnroute());
1248 
1249         assertEquals("Count is incorrect for user " + principalId, Integer.valueOf(0), als.getUserActionItemCount(principalId));
1250         principalId = getPrincipalIdForName("bmcgough");
1251         document = WorkflowDocumentFactory.loadDocument(principalId, document.getDocumentId());
1252         assertTrue(document.isApprovalRequested());
1253         assertEquals("Count is incorrect for user " + principalId, Integer.valueOf(1), als.getUserActionItemCount(
1254                 principalId));
1255         principalId = getPrincipalIdForName("rkirkend");
1256         document = WorkflowDocumentFactory.loadDocument(principalId, document.getDocumentId());
1257         assertTrue(document.isApprovalRequested());
1258         assertEquals("Count is incorrect for user " + principalId, Integer.valueOf(1), als.getUserActionItemCount(
1259                 principalId));
1260 
1261         TestUtilities.assertAtNode(document, "WorkflowDocument");
1262         document.returnToPreviousNode("", "AdHoc");
1263         TestUtilities.assertAtNode(document, "AdHoc");
1264         
1265         principalId = getPrincipalIdForName("ewestfal");
1266         document = WorkflowDocumentFactory.loadDocument(principalId, document.getDocumentId());
1267         assertTrue(document.isApprovalRequested());
1268         
1269         assertEquals("Count is incorrect for user " + principalId, Integer.valueOf(1), als.getUserActionItemCount(
1270                 principalId));
1271         principalId = getPrincipalIdForName("bmcgough");
1272         document = WorkflowDocumentFactory.loadDocument(principalId, document.getDocumentId());
1273         assertFalse(document.isApprovalRequested());
1274         assertTrue(document.isFYIRequested());
1275         
1276         assertEquals("Count is incorrect for user " + principalId, Integer.valueOf(1), als.getUserActionItemCount(
1277                 principalId));
1278         principalId = getPrincipalIdForName("rkirkend");
1279         document = WorkflowDocumentFactory.loadDocument(principalId, document.getDocumentId());
1280         assertFalse(document.isApprovalRequested());
1281         
1282         assertEquals("Count is incorrect for user " + principalId, Integer.valueOf(0), als.getUserActionItemCount(
1283                 principalId));
1284 
1285         principalId = getPrincipalIdForName("ewestfal");
1286         document = WorkflowDocumentFactory.loadDocument(principalId, document.getDocumentId());
1287         document.approve("");
1288         TestUtilities.assertAtNode(document, "WorkflowDocument");
1289 
1290         
1291         principalId = getPrincipalIdForName("ewestfal");
1292         document = WorkflowDocumentFactory.loadDocument(principalId, document.getDocumentId());
1293         assertFalse(document.isApprovalRequested());
1294         assertEquals("Count is incorrect for user " + principalId, Integer.valueOf(0), als.getUserActionItemCount(
1295                 principalId));
1296         principalId = getPrincipalIdForName("bmcgough");
1297         document = WorkflowDocumentFactory.loadDocument(principalId, document.getDocumentId());
1298         assertTrue(document.isApprovalRequested());
1299         assertEquals("Count is incorrect for user " + principalId, Integer.valueOf(1), als.getUserActionItemCount(
1300                 principalId));
1301         principalId = getPrincipalIdForName("rkirkend");
1302         document = WorkflowDocumentFactory.loadDocument(principalId, document.getDocumentId());
1303         assertTrue(document.isApprovalRequested());
1304         assertEquals("Count is incorrect for user " + principalId, Integer.valueOf(1), als.getUserActionItemCount(
1305                 principalId));
1306     }
1307 
1308     @Test public void testGetActionItems() throws Exception {
1309         String initiatorNetworkId = "ewestfal";
1310         String user1NetworkId = "bmcgough";
1311         String user2NetworkId ="rkirkend";
1312         String initiatorPrincipalId = getPrincipalIdForName(initiatorNetworkId);
1313         String user1PrincipalId = getPrincipalIdForName(user1NetworkId);
1314         String user2PrincipalId = getPrincipalIdForName(user2NetworkId);
1315         String principalId = getPrincipalIdForName(initiatorNetworkId);
1316         String docTitle = "this is the doc title";
1317         WorkflowDocument document = WorkflowDocumentFactory.createDocument(principalId, SeqSetup.DOCUMENT_TYPE_NAME);
1318         document.setTitle(docTitle);
1319         document.route("");
1320         assertTrue(document.isEnroute());
1321 
1322         ActionListService als = KewApiServiceLocator.getActionListService();
1323         List<ActionItem> actionItems = als.getAllActionItems(document.getDocumentId());
1324         assertEquals("Incorrect number of action items returned",2,actionItems.size());
1325         for (ActionItem actionItem : actionItems) {
1326             assertEquals("Action Item should be Approve request", KewApiConstants.ACTION_REQUEST_APPROVE_REQ, actionItem.getActionRequestCd());
1327             assertEquals("Action Item has incorrect doc title", docTitle, actionItem.getDocTitle());
1328             assertTrue("User should be one of '" + user1NetworkId + "' or '" + user2NetworkId + "'", user1PrincipalId.equals(actionItem.getPrincipalId()) || user2PrincipalId.equals(actionItem.getPrincipalId()));
1329         }
1330 
1331         principalId = getPrincipalIdForName(user2NetworkId);
1332         document = WorkflowDocumentFactory.loadDocument(principalId, document.getDocumentId());
1333         assertTrue(document.isApprovalRequested());
1334         TestUtilities.assertAtNode(document, "WorkflowDocument");
1335         document.returnToPreviousNode("", "AdHoc");
1336         TestUtilities.assertAtNode(document, "AdHoc");
1337         
1338         actionItems = als.getAllActionItems(document.getDocumentId());
1339         assertEquals("Incorrect number of action items returned",2,actionItems.size());
1340         for (ActionItem actionItem : actionItems) {
1341             assertEquals("Action Item has incorrect doc title", docTitle, actionItem.getDocTitle());
1342             assertTrue("Action Items should be Approve or FYI requests only", KewApiConstants.ACTION_REQUEST_APPROVE_REQ.equals(actionItem.getActionRequestCd()) || KewApiConstants.ACTION_REQUEST_FYI_REQ.equals(actionItem.getActionRequestCd()));
1343             if (KewApiConstants.ACTION_REQUEST_APPROVE_REQ.equals(actionItem.getActionRequestCd())) {
1344                 assertTrue("User should be '" + initiatorNetworkId + "'", initiatorPrincipalId.equals(actionItem.getPrincipalId()));
1345             } else if (KewApiConstants.ACTION_REQUEST_FYI_REQ.equals(actionItem.getActionRequestCd())) {
1346                 assertTrue("User should be  '" + user1NetworkId + "'", user1PrincipalId.equals(actionItem.getPrincipalId()));
1347             }
1348         }
1349 
1350         principalId = getPrincipalIdForName(initiatorNetworkId);
1351         document = WorkflowDocumentFactory.loadDocument(principalId, document.getDocumentId());
1352         assertTrue(document.isApprovalRequested());
1353         document.approve("");
1354         TestUtilities.assertAtNode(document, "WorkflowDocument");
1355 
1356         
1357         actionItems = als.getAllActionItems(document.getDocumentId());
1358         assertEquals("Incorrect number of action items returned",2,actionItems.size());
1359         for (ActionItem actionItem : actionItems) {
1360             assertEquals("Action Item should be Approve request", KewApiConstants.ACTION_REQUEST_APPROVE_REQ, actionItem.getActionRequestCd());
1361             assertEquals("Action Item has incorrect doc title", docTitle, actionItem.getDocTitle());
1362             assertTrue("User should be one of '" + user1NetworkId + "' or '" + user2NetworkId + "'", user1PrincipalId.equals(actionItem.getPrincipalId()) || user2PrincipalId.equals(actionItem.getPrincipalId()));
1363         }
1364     }
1365 
1366     @Test public void testGetActionItems_ActionRequestCodes() throws Exception {
1367         String initiatorNetworkId = "ewestfal";
1368         String user1NetworkId = "bmcgough";
1369         String user2NetworkId ="rkirkend";
1370         String initiatorPrincipalId = getPrincipalIdForName(initiatorNetworkId);
1371         String user1PrincipalId = getPrincipalIdForName(user1NetworkId);
1372         String user2PrincipalId = getPrincipalIdForName(user2NetworkId);
1373         String principalId = getPrincipalIdForName(initiatorNetworkId);
1374         String docTitle = "this is the doc title";
1375         WorkflowDocument document = WorkflowDocumentFactory.createDocument(principalId, SeqSetup.DOCUMENT_TYPE_NAME);
1376         document.setTitle(docTitle);
1377         document.route("");
1378         assertTrue(document.isEnroute());
1379 
1380         ActionListService als = KewApiServiceLocator.getActionListService();
1381         List<ActionItem> actionItems = als.getActionItems(document.getDocumentId(), Arrays.asList(new String[]{KewApiConstants.ACTION_REQUEST_COMPLETE_REQ}));
1382         verifyEmptyCollection("Action Item", actionItems);
1383         actionItems = als.getActionItems(document.getDocumentId(), Arrays.asList(new String[]{KewApiConstants.ACTION_REQUEST_APPROVE_REQ}));
1384         assertEquals("Incorrect number of action items returned",2,actionItems.size());
1385         for (ActionItem actionItem : actionItems) {
1386             assertEquals("Action Item should be Approve request", KewApiConstants.ACTION_REQUEST_APPROVE_REQ, actionItem.getActionRequestCd());
1387             assertEquals("Action Item has incorrect doc title", docTitle, actionItem.getDocTitle());
1388             assertTrue("User should be one of '" + user1NetworkId + "' or '" + user2NetworkId + "'", user1PrincipalId.equals(actionItem.getPrincipalId()) || user2PrincipalId.equals(actionItem.getPrincipalId()));
1389         }
1390 
1391         principalId = getPrincipalIdForName(user2NetworkId);
1392         document = WorkflowDocumentFactory.loadDocument(principalId, document.getDocumentId());
1393         assertTrue(document.isApprovalRequested());
1394         TestUtilities.assertAtNode(document, "WorkflowDocument");
1395         document.returnToPreviousNode("", "AdHoc");
1396         TestUtilities.assertAtNode(document, "AdHoc");
1397         
1398         actionItems = als.getActionItems(document.getDocumentId(), Arrays.asList(new String[]{KewApiConstants.ACTION_REQUEST_COMPLETE_REQ}));
1399         verifyEmptyCollection("Action Item", actionItems);
1400         actionItems = als.getActionItems(document.getDocumentId(), Arrays.asList(
1401                 new String[]{KewApiConstants.ACTION_REQUEST_APPROVE_REQ}));
1402         assertEquals("Incorrect number of action items returned",1,actionItems.size());
1403         actionItems = als.getActionItems(document.getDocumentId(), Arrays.asList(
1404                 new String[]{KewApiConstants.ACTION_REQUEST_FYI_REQ}));
1405         assertEquals("Incorrect number of action items returned",1,actionItems.size());
1406         actionItems = als.getActionItems(document.getDocumentId(), Arrays.asList(
1407                 new String[]{KewApiConstants.ACTION_REQUEST_FYI_REQ, KewApiConstants.ACTION_REQUEST_APPROVE_REQ}));
1408         assertEquals("Incorrect number of action items returned",2,actionItems.size());
1409         for (ActionItem actionItem : actionItems) {
1410             assertEquals("Action Item has incorrect doc title", docTitle, actionItem.getDocTitle());
1411             assertTrue("Action Items should be Approve or FYI requests only", KewApiConstants.ACTION_REQUEST_APPROVE_REQ.equals(actionItem.getActionRequestCd()) || KewApiConstants.ACTION_REQUEST_FYI_REQ.equals(actionItem.getActionRequestCd()));
1412             if (KewApiConstants.ACTION_REQUEST_APPROVE_REQ.equals(actionItem.getActionRequestCd())) {
1413                 assertTrue("User should be '" + initiatorNetworkId + "'", initiatorPrincipalId.equals(actionItem.getPrincipalId()));
1414             } else if (KewApiConstants.ACTION_REQUEST_FYI_REQ.equals(actionItem.getActionRequestCd())) {
1415                 assertTrue("User should be  '" + user1NetworkId + "'", user1PrincipalId.equals(actionItem.getPrincipalId()));
1416             } else {
1417                 fail("Should not have found action request with requested action '" + KewApiConstants.ACTION_REQUEST_CD.get(actionItem.getActionRequestCd()) + "'");
1418             }
1419         }
1420 
1421         principalId = getPrincipalIdForName(initiatorNetworkId);
1422         document = WorkflowDocumentFactory.loadDocument(principalId, document.getDocumentId());
1423         assertTrue(document.isApprovalRequested());
1424         document.approve("");
1425         TestUtilities.assertAtNode(document, "WorkflowDocument");
1426 
1427         
1428         actionItems = als.getActionItems(document.getDocumentId(), Arrays.asList(
1429                 new String[]{KewApiConstants.ACTION_REQUEST_COMPLETE_REQ}));
1430         verifyEmptyCollection("Action Item", actionItems);
1431         actionItems = als.getActionItems(document.getDocumentId(), Arrays.asList(
1432                 new String[]{KewApiConstants.ACTION_REQUEST_APPROVE_REQ}));
1433         assertEquals("Incorrect number of action items returned",2,actionItems.size());
1434         for (ActionItem actionItem : actionItems) {
1435             assertEquals("Action Item should be Approve request", KewApiConstants.ACTION_REQUEST_APPROVE_REQ, actionItem.getActionRequestCd());
1436             assertEquals("Action Item has incorrect doc title", docTitle, actionItem.getDocTitle());
1437             assertTrue("User should be one of '" + user1NetworkId + "' or '" + user2NetworkId + "'", user1PrincipalId.equals(actionItem.getPrincipalId()) || user2PrincipalId.equals(actionItem.getPrincipalId()));
1438         }
1439     }
1440 
1441     
1442 
1443 
1444     private void setupPerformDocumentSearchTests(String documentTypeName, String expectedRouteNodeName, String docTitle) throws WorkflowException {
1445         String userNetworkId = "ewestfal";
1446         WorkflowDocument workflowDocument = WorkflowDocumentFactory.createDocument(getPrincipalIdForName(userNetworkId), documentTypeName);
1447         workflowDocument.setTitle("Respect my Authoritah");
1448         workflowDocument.route("routing this document.");
1449         if (StringUtils.isNotBlank(expectedRouteNodeName)) {
1450         	assertEquals("Document is not at expected routeNodeName", expectedRouteNodeName, workflowDocument.getNodeNames().iterator().next());
1451         }
1452 
1453         userNetworkId = "rkirkend";
1454         workflowDocument = WorkflowDocumentFactory.createDocument(getPrincipalIdForName(userNetworkId), documentTypeName);
1455         workflowDocument.setTitle(docTitle);
1456         workflowDocument.route("routing this document.");
1457         if (StringUtils.isNotBlank(expectedRouteNodeName)) {
1458         	assertEquals("Document is not at expected routeNodeName", expectedRouteNodeName, workflowDocument.getNodeNames().iterator().next());
1459         }
1460     }
1461 
1462     @Test public void testPerformDocumentSearch_WithUser_CustomThreshold() throws Exception {
1463         runTestPerformDocumentSearch_CustomThreshold(getPrincipalIdForName("user2"));
1464     }
1465 
1466     @Test public void testPerformDocumentSearch_NoUser_CustomThreshold() throws Exception {
1467     	runTestPerformDocumentSearch_CustomThreshold(null);
1468     }
1469 
1470     private void runTestPerformDocumentSearch_CustomThreshold(String principalId) throws Exception {
1471         String documentTypeName = SeqSetup.DOCUMENT_TYPE_NAME;
1472         String docTitle = "Routing Style";
1473         setupPerformDocumentSearchTests(documentTypeName, null, docTitle);
1474 
1475         DocumentSearchCriteria.Builder criteria = DocumentSearchCriteria.Builder.create();
1476         criteria.setDocumentTypeName(documentTypeName);
1477         DocumentSearchResults results = KewApiServiceLocator.getWorkflowDocumentService().documentSearch(principalId,
1478                 criteria.build());
1479         assertEquals("Search results should have two documents.", 2, results.getSearchResults().size());
1480 
1481         int threshold = 1;
1482         criteria.setMaxResults(1);
1483         results = KewApiServiceLocator.getWorkflowDocumentService().documentSearch(principalId, criteria.build());
1484         assertTrue("Search results should signify search went over the given threshold: " + threshold, results.isOverThreshold());
1485         assertEquals("Search results should have one document.", threshold, results.getSearchResults().size());
1486     }
1487 
1488     @Test public void testPerformDocumentSearch_WithUser_BasicCriteria() throws Exception {
1489         runTestPerformDocumentSearch_BasicCriteria(getPrincipalIdForName("user2"));
1490     }
1491 
1492     @Test public void testPerformDocumentSearch_NoUser_BasicCriteria() throws Exception {
1493     	runTestPerformDocumentSearch_BasicCriteria(null);
1494     }
1495 
1496     private void runTestPerformDocumentSearch_BasicCriteria(String principalId) throws Exception {
1497         String documentTypeName = SeqSetup.DOCUMENT_TYPE_NAME;
1498         String docTitle = "Routing Style";
1499         setupPerformDocumentSearchTests(documentTypeName, null, docTitle);
1500         String userNetworkId = "delyea";
1501         WorkflowDocument workflowDocument = WorkflowDocumentFactory.createDocument(getPrincipalIdForName(userNetworkId), documentTypeName);
1502         workflowDocument.setTitle("Get Outta Dodge");
1503         workflowDocument.route("routing this document.");
1504 
1505         DocumentSearchCriteria.Builder criteria = DocumentSearchCriteria.Builder.create();
1506         criteria.setDocumentTypeName(documentTypeName);
1507         criteria.setTitle(docTitle);
1508         DocumentSearchResults results = KewApiServiceLocator.getWorkflowDocumentService().documentSearch(principalId,
1509                 criteria.build());
1510         assertEquals("Search results should have one document.", 1, results.getSearchResults().size());
1511 
1512         criteria = DocumentSearchCriteria.Builder.create();
1513         criteria.setInitiatorPrincipalName("rkirkend");
1514         results = KewApiServiceLocator.getWorkflowDocumentService().documentSearch(principalId, criteria.build());
1515         assertEquals("Search results should have one document.", 1, results.getSearchResults().size());
1516 
1517         criteria = DocumentSearchCriteria.Builder.create();
1518         criteria.setInitiatorPrincipalName("user1");
1519         results = KewApiServiceLocator.getWorkflowDocumentService().documentSearch(principalId, criteria.build());
1520         assertEquals("Search results should be empty.", 0, results.getSearchResults().size());
1521 
1522         criteria = DocumentSearchCriteria.Builder.create();
1523         criteria.setDocumentTypeName(documentTypeName);
1524         results = KewApiServiceLocator.getWorkflowDocumentService().documentSearch(principalId, criteria.build());
1525         assertEquals("Search results should have three documents.", 3, results.getSearchResults().size());
1526         
1527         boolean foundValidDocId = false;
1528         for (DocumentSearchResult result : results.getSearchResults()) {
1529             if (result.getDocument().getDocumentId().equals(workflowDocument.getDocumentId())) {
1530                 foundValidDocId = true;
1531                 break;
1532             }
1533         }
1534         assertTrue("Should have found document search result with specified document id", foundValidDocId);
1535     }
1536 
1537     @Test public void testPerformDocumentSearch_WithUser_RouteNodeSearch() throws Exception {
1538         runTestPerformDocumentSearch_RouteNodeSearch(getPrincipalIdForName("user2"));
1539     }
1540 
1541     @Test public void testPerformDocumentSearch_NoUser_RouteNodeSearch() throws Exception {
1542     	runTestPerformDocumentSearch_RouteNodeSearch(null);
1543     }
1544 
1545     private void runTestPerformDocumentSearch_RouteNodeSearch(String principalId) throws Exception {
1546         String documentTypeName = SeqSetup.DOCUMENT_TYPE_NAME;
1547         setupPerformDocumentSearchTests(documentTypeName, SeqSetup.WORKFLOW_DOCUMENT_NODE, "Doc Title");
1548 
1549         
1550         DocumentSearchCriteria.Builder criteria = DocumentSearchCriteria.Builder.create();
1551         criteria.setRouteNodeName(SeqSetup.ADHOC_NODE);
1552         try {
1553             KewApiServiceLocator.getWorkflowDocumentService().documentSearch(principalId, criteria.build());
1554             fail("Exception should have been thrown when specifying a route node name but no document type name");
1555         } catch (IllegalStateException e) {
1556             e.printStackTrace();
1557         }
1558 
1559         
1560         criteria = DocumentSearchCriteria.Builder.create();
1561         criteria.setDocumentTypeName(documentTypeName);
1562         criteria.setRouteNodeName("This is an invalid route node name!!!");
1563         try {
1564             DocumentSearchResults results = KewApiServiceLocator.getWorkflowDocumentService().documentSearch(principalId, criteria.build());
1565             assertTrue("No results should have been returned for route node name that does not exist on the specified documentType.", results.getSearchResults().isEmpty());
1566         } catch (Exception e) {
1567             fail("Exception should not have been thrown when specifying a route node name that does not exist on the specified document type name");
1568         }
1569 
1570         runPerformDocumentSearch_RouteNodeSearch(principalId, SeqSetup.ADHOC_NODE, documentTypeName, 0, 0, 2);
1571         runPerformDocumentSearch_RouteNodeSearch(principalId, SeqSetup.WORKFLOW_DOCUMENT_NODE, documentTypeName, 0, 2, 0);
1572         runPerformDocumentSearch_RouteNodeSearch(principalId, SeqSetup.WORKFLOW_DOCUMENT_2_NODE, documentTypeName, 2, 0, 0);
1573     }
1574 
1575     @Test public void testPerformDocumentSearch_RouteNodeSpecial() throws RemoteException, WorkflowException {
1576         String documentTypeName = "DocumentWithSpecialRouteNodes";
1577         setupPerformDocumentSearchTests(documentTypeName, "Level1", "Doc Title");
1578         runPerformDocumentSearch_RouteNodeSearch(null, "Level5", documentTypeName, 0, 0, 2);
1579         runPerformDocumentSearch_RouteNodeSearch(null, "Level1", documentTypeName, 0, 2, 0);
1580         runPerformDocumentSearch_RouteNodeSearch(null, "Level3", documentTypeName, 2, 0, 0);
1581 
1582     }
1583 
1584     private void runPerformDocumentSearch_RouteNodeSearch(String principalId, String routeNodeName, String documentTypeName, int countBeforeNode, int countAtNode, int countAfterNode) throws RemoteException, WorkflowException {
1585 
1586         DocumentSearchCriteria.Builder criteria = DocumentSearchCriteria.Builder.create();
1587         criteria.setDocumentTypeName(documentTypeName);
1588         criteria.setRouteNodeName(routeNodeName);
1589         DocumentSearchResults results = KewApiServiceLocator.getWorkflowDocumentService().documentSearch(principalId,
1590                 criteria.build());
1591         assertEquals("Wrong number of search results when checking docs at default node logic.", countAtNode, results.getSearchResults().size());
1592 
1593         criteria.setRouteNodeLookupLogic(RouteNodeLookupLogic.EXACTLY);
1594         results = KewApiServiceLocator.getWorkflowDocumentService().documentSearch(principalId, criteria.build());
1595         assertEquals("Wrong number of search results when checking docs at exact node.", countAtNode, results.getSearchResults().size());
1596 
1597         criteria.setRouteNodeLookupLogic(RouteNodeLookupLogic.BEFORE);
1598         results = KewApiServiceLocator.getWorkflowDocumentService().documentSearch(principalId, criteria.build());
1599         assertEquals("Wrong number of search results when checking docs before node.", countBeforeNode, results.getSearchResults().size());
1600 
1601         criteria.setRouteNodeLookupLogic(RouteNodeLookupLogic.AFTER);
1602         results = KewApiServiceLocator.getWorkflowDocumentService().documentSearch(principalId, criteria.build());
1603         assertEquals("Wrong number of search results when checking docs after node.", countAfterNode, results.getSearchResults().size());
1604     }
1605 
1606     @Test public void testPerformDocumentSearch_WithUser_SearchAttributes() throws Exception {
1607     	runTestPerformDocumentSearch_SearchAttributes(getPrincipalIdForName("user2"));
1608     }
1609 
1610     @Test public void testPerformDocumentSearch_NoUser_SearchAttributes() throws Exception {
1611     	runTestPerformDocumentSearch_SearchAttributes(null);
1612     }
1613 
1614     private void runTestPerformDocumentSearch_SearchAttributes(String principalId) throws Exception {
1615         String documentTypeName = SeqSetup.DOCUMENT_TYPE_NAME;
1616         String docTitle = "Routing Style";
1617         setupPerformDocumentSearchTests(documentTypeName, null, docTitle);
1618 
1619         DocumentSearchCriteria.Builder criteria = DocumentSearchCriteria.Builder.create();
1620         criteria.setDocumentTypeName(documentTypeName);
1621         criteria.getDocumentAttributeValues().put(TestXMLSearchableAttributeString.SEARCH_STORAGE_KEY, Collections.singletonList(TestXMLSearchableAttributeString.SEARCH_STORAGE_VALUE));
1622         DocumentSearchResults results = KewApiServiceLocator.getWorkflowDocumentService().documentSearch(principalId,
1623                 criteria.build());
1624         assertEquals("Search results should have two documents.", 2, results.getSearchResults().size());
1625 
1626         criteria = DocumentSearchCriteria.Builder.create();
1627         criteria.setDocumentTypeName(documentTypeName);
1628         criteria.getDocumentAttributeValues().put(TestXMLSearchableAttributeString.SEARCH_STORAGE_KEY, Collections.singletonList("fred"));
1629         results = KewApiServiceLocator.getWorkflowDocumentService().documentSearch(principalId, criteria.build());
1630         assertEquals("Search results should be empty.", 0, results.getSearchResults().size());
1631 
1632         criteria = DocumentSearchCriteria.Builder.create();
1633         criteria.setDocumentTypeName(documentTypeName);
1634         criteria.getDocumentAttributeValues().put("fakeproperty", Collections.singletonList("doesntexist"));
1635         try {
1636             results = KewApiServiceLocator.getWorkflowDocumentService().documentSearch(principalId, criteria.build());
1637             fail("Search results should be throwing a validation exception for use of non-existant searchable attribute");
1638         } catch (Exception e) {}
1639 
1640         criteria = DocumentSearchCriteria.Builder.create();
1641         criteria.setDocumentTypeName(documentTypeName);
1642         criteria.getDocumentAttributeValues().put(TestXMLSearchableAttributeLong.SEARCH_STORAGE_KEY, Collections.singletonList(TestXMLSearchableAttributeLong.SEARCH_STORAGE_VALUE.toString()));
1643         results = KewApiServiceLocator.getWorkflowDocumentService().documentSearch(principalId, criteria.build());
1644         assertEquals("Search results should have two documents.", 2, results.getSearchResults().size());
1645 
1646         criteria = DocumentSearchCriteria.Builder.create();
1647         criteria.setDocumentTypeName(documentTypeName);
1648         criteria.getDocumentAttributeValues().put(TestXMLSearchableAttributeLong.SEARCH_STORAGE_KEY, Collections.singletonList("1111111"));
1649         results = KewApiServiceLocator.getWorkflowDocumentService().documentSearch(principalId, criteria.build());
1650         assertEquals("Search results should be empty.", 0, results.getSearchResults().size());
1651 
1652         criteria = DocumentSearchCriteria.Builder.create();
1653         criteria.setDocumentTypeName(documentTypeName);
1654         criteria.getDocumentAttributeValues().put("fakeymcfakefake", Collections.singletonList("99999999"));
1655         try {
1656             results = KewApiServiceLocator.getWorkflowDocumentService().documentSearch(principalId, criteria.build());
1657             fail("Search results should be throwing a validation exception for use of non-existant searchable attribute");
1658         } catch (IllegalStateException ise) {
1659         } catch (Exception e) {}
1660 
1661         criteria = DocumentSearchCriteria.Builder.create();
1662         criteria.setDocumentTypeName(documentTypeName);
1663         criteria.getDocumentAttributeValues().put(TestXMLSearchableAttributeFloat.SEARCH_STORAGE_KEY, Collections.singletonList(TestXMLSearchableAttributeFloat.SEARCH_STORAGE_VALUE.toString()));
1664         results = KewApiServiceLocator.getWorkflowDocumentService().documentSearch(principalId, criteria.build());
1665         assertEquals("Search results should have two documents.", 2, results.getSearchResults().size());
1666 
1667         criteria = DocumentSearchCriteria.Builder.create();
1668         criteria.setDocumentTypeName(documentTypeName);
1669         criteria.getDocumentAttributeValues().put(TestXMLSearchableAttributeFloat.SEARCH_STORAGE_KEY, Collections.singletonList("215.3548"));
1670         results = KewApiServiceLocator.getWorkflowDocumentService().documentSearch(principalId, criteria.build());
1671         assertEquals("Search results should be empty.", 0, results.getSearchResults().size());
1672 
1673         criteria = DocumentSearchCriteria.Builder.create();
1674         criteria.setDocumentTypeName(documentTypeName);
1675         criteria.getDocumentAttributeValues().put("fakeylostington", Collections.singletonList("9999.9999"));
1676         try {
1677             results = KewApiServiceLocator.getWorkflowDocumentService().documentSearch(principalId, criteria.build());
1678             fail("Search results should be throwing a validation exception for use of non-existant searchable attribute");
1679         } catch (Exception e) {}
1680 
1681         criteria = DocumentSearchCriteria.Builder.create();
1682         criteria.setDocumentTypeName(documentTypeName);
1683         criteria.getDocumentAttributeValues().put(TestXMLSearchableAttributeDateTime.SEARCH_STORAGE_KEY, Collections.singletonList(
1684                 DocumentSearchInternalUtils.getDisplayValueWithDateOnly(new Timestamp(
1685                         TestXMLSearchableAttributeDateTime.SEARCH_STORAGE_VALUE_IN_MILLS))));
1686         results = KewApiServiceLocator.getWorkflowDocumentService().documentSearch(principalId, criteria.build());
1687         assertEquals("Search results should have two documents.", 2, results.getSearchResults().size());
1688 
1689         criteria = DocumentSearchCriteria.Builder.create();
1690         criteria.setDocumentTypeName(documentTypeName);
1691         criteria.getDocumentAttributeValues().put(TestXMLSearchableAttributeDateTime.SEARCH_STORAGE_KEY, Collections.singletonList("07/06/1979"));
1692         results = KewApiServiceLocator.getWorkflowDocumentService().documentSearch(principalId, criteria.build());
1693         assertEquals("Search results should be empty.", 0, results.getSearchResults().size());
1694 
1695         criteria = DocumentSearchCriteria.Builder.create();
1696         criteria.setDocumentTypeName(documentTypeName);
1697         criteria.getDocumentAttributeValues().put("lastingsfakerson", Collections.singletonList("07/06/2007"));
1698         try {
1699             results = KewApiServiceLocator.getWorkflowDocumentService().documentSearch(principalId, criteria.build());
1700             fail("Search results should be throwing a validation exception for use of non-existant searchable attribute");
1701         } catch (Exception e) {}
1702     }
1703 
1704     @Test public void testGetSearchableAttributeDateTimeValuesByKey() throws Exception {
1705         String documentTypeName = SeqSetup.DOCUMENT_TYPE_NAME;
1706         String userNetworkId = "ewestfal";
1707         WorkflowDocument workflowDocument = WorkflowDocumentFactory.createDocument(getPrincipalIdForName(userNetworkId), documentTypeName);
1708         workflowDocument.setTitle("Respect my Authoritah");
1709         workflowDocument.route("routing this document.");
1710         userNetworkId = "rkirkend";
1711         WorkflowDocument workflowDocument2 = WorkflowDocumentFactory.createDocument(getPrincipalIdForName(userNetworkId), documentTypeName);
1712         workflowDocument2.setTitle("Routing Style");
1713         workflowDocument2.route("routing this document.");
1714 
1715         WorkflowDocumentService wds = KewApiServiceLocator.getWorkflowDocumentService();
1716         List<DateTime> dateTimes = wds.getSearchableAttributeDateTimeValuesByKey(workflowDocument.getDocumentId(), TestXMLSearchableAttributeDateTime.SEARCH_STORAGE_KEY);
1717         assertNotNull("dateTimes should not be null", dateTimes);
1718         assertTrue("dateTimes should not be empty", !dateTimes.isEmpty());
1719         verifyTimestampToSecond(TestXMLSearchableAttributeDateTime.SEARCH_STORAGE_VALUE_IN_MILLS, dateTimes.get(0).getMillis());
1720 
1721         dateTimes = wds.getSearchableAttributeDateTimeValuesByKey(workflowDocument2.getDocumentId(), TestXMLSearchableAttributeDateTime.SEARCH_STORAGE_KEY);
1722         assertNotNull("dateTimes should not be null", dateTimes);
1723         assertTrue("dateTimes should not be empty", !dateTimes.isEmpty());
1724         verifyTimestampToSecond(TestXMLSearchableAttributeDateTime.SEARCH_STORAGE_VALUE_IN_MILLS, dateTimes.get(0).getMillis());
1725     }
1726 
1727     protected void verifyTimestampToSecond(Long originalTimeInMillis, Long testTimeInMillis) throws Exception {
1728         Calendar testDate = Calendar.getInstance();
1729         testDate.setTimeInMillis(originalTimeInMillis);
1730         testDate.set(Calendar.MILLISECOND, 0);
1731         Calendar attributeDate = Calendar.getInstance();
1732         attributeDate.setTimeInMillis(testTimeInMillis);
1733         attributeDate.set(Calendar.MILLISECOND, 0);
1734         assertEquals("The month value for the searchable attribute is wrong",testDate.get(Calendar.MONTH),attributeDate.get(Calendar.MONTH));
1735         assertEquals("The date value for the searchable attribute is wrong",testDate.get(Calendar.DATE),attributeDate.get(Calendar.DATE));
1736         assertEquals("The year value for the searchable attribute is wrong",testDate.get(Calendar.YEAR),attributeDate.get(Calendar.YEAR));
1737         assertEquals("The hour value for the searchable attribute is wrong",testDate.get(Calendar.HOUR),attributeDate.get(Calendar.HOUR));
1738         assertEquals("The minute value for the searchable attribute is wrong",testDate.get(Calendar.MINUTE),attributeDate.get(Calendar.MINUTE));
1739         assertEquals("The second value for the searchable attribute is wrong",testDate.get(Calendar.SECOND),attributeDate.get(Calendar.SECOND));
1740     }
1741 
1742     private void ruleExceptionTest(RuleReportCriteria ruleReportCriteria, String message) {
1743         try {
1744             KewApiServiceLocator.getRuleService().ruleReport(ruleReportCriteria);
1745             fail(message);
1746         } catch (Exception e) {
1747             
1748         }
1749     }
1750 
1751     private class RuleTestGeneralSetup {
1752         public static final String DOCUMENT_TYPE_NAME = "RuleTestDocType";
1753         public static final String RULE_TEST_TEMPLATE_1 = "WorkflowDocumentTemplate";
1754         public static final String RULE_TEST_TEMPLATE_2 = "WorkflowDocument2Template";
1755         public static final String RULE_TEST_TEMPLATE_3 = "WorkflowDocument3Template";
1756         public static final String RULE_TEST_GROUP_ID = "3003"; 
1757     }
1758 
1759     private class RuleTestOrgReviewSetup {
1760         public static final String DOCUMENT_TYPE_NAME = "OrgReviewTestDocType";
1761         public static final String RULE_TEST_TEMPLATE = "OrgReviewTemplate";
1762         public static final String RULE_TEST_WORKGROUP = "Org_Review_Group";
1763         public static final String RULE_TEST_WORKGROUP2 = "Org_Review_Group_2";
1764         public static final String RULE_TEST_CHART_CODE_NAME = "chartCode";
1765         public static final String RULE_TEST_ORG_CODE_NAME = "orgCode";
1766     }
1767 
1768     private class SeqSetup {
1769         public static final String DOCUMENT_TYPE_NAME = "SeqDocType";
1770         public static final String LAST_APPROVER_DOCUMENT_TYPE_NAME = "SeqLastApproverDocType";
1771         public static final String CHILD_DOCUMENT_TYPE_NAME = "SeqChildDocType";
1772         public static final String ADHOC_NODE = "AdHoc";
1773         public static final String WORKFLOW_DOCUMENT_NODE = "WorkflowDocument";
1774         public static final String WORKFLOW_DOCUMENT_2_NODE = "WorkflowDocument2";
1775         public static final String ACKNOWLEDGE_1_NODE = "Acknowledge1";
1776         public static final String ACKNOWLEDGE_2_NODE = "Acknowledge2";
1777     }
1778 
1779     private class RouteLogTestSetup {
1780         public static final String DOCUMENT_TYPE_NAME = "UserAndGroupTestDocType";
1781         public static final String RULE_TEST_TEMPLATE_1 = "WorkflowDocumentTemplate";
1782         public static final String RULE_TEST_TEMPLATE_2 = "WorkflowDocument2Template";
1783         public static final String RULE_TEST_GROUP_ID = "3003"; 
1784     }
1785 
1786 }