1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  package org.kuali.rice.kew.role;
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.assertTrue;
22  
23  import java.util.ArrayList;
24  import java.util.Collections;
25  import java.util.HashMap;
26  import java.util.List;
27  import java.util.Map;
28  
29  import org.junit.FixMethodOrder;
30  import org.junit.Test;
31  import org.junit.runners.MethodSorters;
32  import org.kuali.rice.core.api.criteria.QueryByCriteria;
33  import org.kuali.rice.core.api.delegation.DelegationType;
34  import org.kuali.rice.core.api.membership.MemberType;
35  import org.kuali.rice.kew.api.KewApiConstants;
36  import org.kuali.rice.kew.api.KewApiServiceLocator;
37  import org.kuali.rice.kew.api.WorkflowDocument;
38  import org.kuali.rice.kew.api.WorkflowDocumentFactory;
39  import org.kuali.rice.kew.api.action.ActionRequest;
40  import org.kuali.rice.kew.api.action.ActionRequestPolicy;
41  import org.kuali.rice.kew.api.action.ActionType;
42  import org.kuali.rice.kew.api.document.node.RouteNodeInstance;
43  import org.kuali.rice.kew.test.KEWTestCase;
44  import org.kuali.rice.kim.api.identity.principal.Principal;
45  import org.kuali.rice.kim.api.role.Role;
46  import org.kuali.rice.kim.api.role.RoleMembership;
47  import org.kuali.rice.kim.api.role.RoleResponsibilityAction;
48  import org.kuali.rice.kim.api.role.RoleService;
49  import org.kuali.rice.kim.api.services.KimApiServiceLocator;
50  import org.kuali.rice.kim.impl.common.attribute.KimAttributeBo;
51  import org.kuali.rice.kim.impl.common.delegate.DelegateMemberBo;
52  import org.kuali.rice.kim.impl.common.delegate.DelegateTypeBo;
53  import org.kuali.rice.kim.impl.responsibility.ResponsibilityAttributeBo;
54  import org.kuali.rice.kim.impl.responsibility.ResponsibilityBo;
55  import org.kuali.rice.kim.impl.responsibility.ResponsibilityTemplateBo;
56  import org.kuali.rice.kim.impl.role.RoleBo;
57  import org.kuali.rice.kim.impl.role.RoleMemberAttributeDataBo;
58  import org.kuali.rice.kim.impl.role.RoleMemberBo;
59  import org.kuali.rice.kim.impl.role.RoleResponsibilityActionBo;
60  import org.kuali.rice.kim.impl.role.RoleResponsibilityBo;
61  import org.kuali.rice.kim.impl.type.KimTypeAttributeBo;
62  import org.kuali.rice.kim.impl.type.KimTypeBo;
63  import org.kuali.rice.krad.data.KradDataServiceLocator;
64  import org.kuali.rice.test.BaselineTestCase;
65  import org.springframework.transaction.TransactionStatus;
66  import org.springframework.transaction.support.TransactionCallback;
67  
68  
69  
70  
71  
72  
73  
74  
75  
76  
77  @FixMethodOrder(MethodSorters.NAME_ASCENDING)
78  @BaselineTestCase.BaselineMode(BaselineTestCase.Mode.CLEAR_DB)
79  public class RoleRouteModuleTest extends KEWTestCase {
80  
81      private static final String NAMESPACE = KewApiConstants.KEW_NAMESPACE;
82      private static final String ROLE_NAME = "RoleRouteModuleTestRole";
83  
84      private static boolean suiteDataInitialized = false;
85      private static boolean suiteCreateDelegateInitialized = false;
86  
87      @Override
88      protected void loadTestData() throws Exception {
89          loadXmlFile("RoleRouteModuleTestConfig.xml");
90  
91          
92          if (suiteDataInitialized) {
93              return;
94          }
95  
96          
97  
98  
99  
100 
101 
102 
103 
104         
105         Long chartAttributeId = getNextSequenceLongValue("KRIM_ATTR_DEFN_ID_S");
106         KimAttributeBo chartAttribute = new KimAttributeBo();
107         chartAttribute.setId("" + chartAttributeId);
108         chartAttribute.setAttributeName("chart");
109         chartAttribute.setComponentName("org.kuali.rice.kim.bo.impl.KimAttributes");
110         chartAttribute.setNamespaceCode(NAMESPACE);
111         chartAttribute.setAttributeLabel("chart");
112         chartAttribute.setActive(true);
113         chartAttribute = KradDataServiceLocator.getDataObjectService().save(chartAttribute);
114 
115         
116         Long orgAttributeId = getNextSequenceLongValue("KRIM_ATTR_DEFN_ID_S");
117         KimAttributeBo orgAttribute = new KimAttributeBo();
118         orgAttribute.setId("" + orgAttributeId);
119         orgAttribute.setComponentName("org.kuali.rice.kim.bo.impl.KimAttributes");
120         orgAttribute.setAttributeName("org");
121         orgAttribute.setNamespaceCode(NAMESPACE);
122         orgAttribute.setAttributeLabel("org");
123         orgAttribute.setActive(true);
124         orgAttribute = KradDataServiceLocator.getDataObjectService().save(orgAttribute);
125 
126         
127         Long kimTypeId = getNextSequenceLongValue("KRIM_TYP_ID_S");
128         KimTypeBo kimType = new KimTypeBo();
129         kimType.setId("" + kimTypeId);
130         kimType.setName("ChartOrg");
131         kimType.setNamespaceCode(NAMESPACE);
132         kimType.setServiceName("testBaseRoleTypeService"); 
133         kimType.setActive(true);
134         kimType = KradDataServiceLocator.getDataObjectService().save(kimType);
135 
136         
137         Long chartTypeAttributeId = getNextSequenceLongValue("KRIM_TYP_ATTR_ID_S");
138         KimTypeAttributeBo chartTypeAttribute = new KimTypeAttributeBo();
139         chartTypeAttribute.setId("" + chartTypeAttributeId);
140         chartTypeAttribute.setActive(true);
141         chartTypeAttribute.setKimAttributeId(chartAttribute.getId());
142         chartTypeAttribute.setKimTypeId(kimType.getId());
143         chartTypeAttribute = KradDataServiceLocator.getDataObjectService().save(chartTypeAttribute);
144 
145         
146         Long orgTypeAttributeId = getNextSequenceLongValue("KRIM_TYP_ATTR_ID_S");
147         KimTypeAttributeBo orgTypeAttribute = new KimTypeAttributeBo();
148         orgTypeAttribute.setId("" + orgTypeAttributeId);
149         orgTypeAttribute.setActive(true);
150         orgTypeAttribute.setKimAttributeId(orgAttribute.getId());
151         orgTypeAttribute.setKimTypeId(kimType.getId());
152         orgTypeAttribute = KradDataServiceLocator.getDataObjectService().save(orgTypeAttribute);
153 
154         
155 
156 
157 
158         String roleId = "" + getNextSequenceLongValue("KRIM_ROLE_ID_S");
159         RoleBo role = new RoleBo();
160         role.setId(roleId);
161         role.setNamespaceCode(NAMESPACE);
162         role.setDescription("");
163         role.setName(ROLE_NAME);
164         role.setActive(true);
165         role.setKimTypeId(kimType.getId());
166 
167         String roleMemberId1 = "" + getNextSequenceLongValue("KRIM_ROLE_MBR_ID_S");
168         RoleMemberBo adminRolePrincipal = new RoleMemberBo();
169         adminRolePrincipal.setId(roleMemberId1);
170         adminRolePrincipal.setRoleId(roleId);
171         Principal adminPrincipal = KimApiServiceLocator.getIdentityService().getPrincipalByPrincipalName("admin");
172         assertNotNull(adminPrincipal);
173         adminRolePrincipal.setMemberId(adminPrincipal.getPrincipalId());
174         adminRolePrincipal.setType( MemberType.PRINCIPAL );
175 
176         String roleMemberId2 = "" + getNextSequenceLongValue("KRIM_ROLE_MBR_ID_S");
177         RoleMemberBo user2RolePrincipal = new RoleMemberBo();
178         user2RolePrincipal.setId(roleMemberId2);
179         user2RolePrincipal.setRoleId(roleId);
180         Principal user2Principal = KimApiServiceLocator.getIdentityService().getPrincipalByPrincipalName("user2");
181         assertNotNull(user2Principal);
182         user2RolePrincipal.setMemberId(user2Principal.getPrincipalId());
183         user2RolePrincipal.setType( MemberType.PRINCIPAL );
184 
185         String roleMemberId3 = "" + getNextSequenceLongValue("KRIM_ROLE_MBR_ID_S");
186         RoleMemberBo user1RolePrincipal = new RoleMemberBo();
187         user1RolePrincipal.setId(roleMemberId3);
188         user1RolePrincipal.setRoleId(roleId);
189         Principal user1Principal = KimApiServiceLocator.getIdentityService().getPrincipalByPrincipalName("user1");
190         assertNotNull(user1Principal);
191         user1RolePrincipal.setMemberId(user1Principal.getPrincipalId());
192         user1RolePrincipal.setType( MemberType.PRINCIPAL );
193 
194         List<RoleMemberBo> memberPrincipals = new ArrayList<RoleMemberBo>();
195         memberPrincipals.add(adminRolePrincipal);
196         memberPrincipals.add(user2RolePrincipal);
197         memberPrincipals.add(user1RolePrincipal);
198 
199         role.setMembers(memberPrincipals);
200 
201         
202 
203 
204 
205         String dataId = "" + getNextSequenceLongValue("KRIM_GRP_ATTR_DATA_ID_S");
206         RoleMemberAttributeDataBo chartDataBL = new RoleMemberAttributeDataBo();
207         chartDataBL.setId(dataId);
208         chartDataBL.setAttributeValue("BL");
209         chartDataBL.setKimAttribute(chartAttribute);
210         chartDataBL.setKimAttributeId(chartAttribute.getId());
211         chartDataBL.setKimTypeId(kimType.getId());
212         chartDataBL.setAssignedToId(adminRolePrincipal.getId());
213 
214         dataId = "" + getNextSequenceLongValue("KRIM_GRP_ATTR_DATA_ID_S");
215         RoleMemberAttributeDataBo chartDataBL2 = new RoleMemberAttributeDataBo();
216         chartDataBL2.setId(dataId);
217         chartDataBL2.setAttributeValue("BL");
218         chartDataBL2.setKimAttribute(chartAttribute);
219         chartDataBL2.setKimAttributeId(chartAttribute.getId());
220         chartDataBL2.setKimTypeId(kimType.getId());
221         chartDataBL2.setAssignedToId(user2RolePrincipal.getId());
222 
223         dataId = "" + getNextSequenceLongValue("KRIM_GRP_ATTR_DATA_ID_S");
224         RoleMemberAttributeDataBo orgDataBUS = new RoleMemberAttributeDataBo();
225         orgDataBUS.setId(dataId);
226         orgDataBUS.setAttributeValue("BUS");
227         orgDataBUS.setKimAttribute(orgAttribute);
228         orgDataBUS.setKimAttributeId(orgAttribute.getId());
229         orgDataBUS.setKimTypeId(kimType.getId());
230         orgDataBUS.setAssignedToId(adminRolePrincipal.getId());
231 
232         dataId = "" + getNextSequenceLongValue("KRIM_GRP_ATTR_DATA_ID_S");
233         RoleMemberAttributeDataBo orgDataBUS2 = new RoleMemberAttributeDataBo();
234         orgDataBUS2.setId(dataId);
235         orgDataBUS2.setAttributeValue("BUS");
236         orgDataBUS2.setKimAttribute(orgAttribute);
237         orgDataBUS2.setKimAttributeId(orgAttribute.getId());
238         orgDataBUS2.setKimTypeId(kimType.getId());
239         orgDataBUS2.setAssignedToId(user2RolePrincipal.getId());
240 
241 
242         dataId = "" + getNextSequenceLongValue("KRIM_GRP_ATTR_DATA_ID_S");
243         RoleMemberAttributeDataBo chartDataIN = new RoleMemberAttributeDataBo();
244         chartDataIN.setId(dataId);
245         chartDataIN.setAttributeValue("IN");
246         chartDataIN.setKimAttribute(chartAttribute);
247         chartDataIN.setKimAttributeId(chartAttribute.getId());
248         chartDataIN.setKimTypeId(kimType.getId());
249         chartDataIN.setAssignedToId(user1RolePrincipal.getId());
250 
251         dataId = "" + getNextSequenceLongValue("KRIM_GRP_ATTR_DATA_ID_S");
252         RoleMemberAttributeDataBo orgDataMED = new RoleMemberAttributeDataBo();
253         orgDataMED.setId(dataId);
254         orgDataMED.setAttributeValue("MED");
255         orgDataMED.setKimAttribute(orgAttribute);
256         orgDataMED.setKimAttributeId(orgAttribute.getId());
257         orgDataMED.setKimTypeId(kimType.getId());
258         orgDataMED.setAssignedToId(user1RolePrincipal.getId());
259 
260         List<RoleMemberAttributeDataBo> user1Attributes = new ArrayList<RoleMemberAttributeDataBo>();
261         user1Attributes.add(chartDataIN);
262         user1Attributes.add(orgDataMED);
263         user1RolePrincipal.setAttributeDetails(user1Attributes);
264 
265         List<RoleMemberAttributeDataBo> user2Attributes = new ArrayList<RoleMemberAttributeDataBo>();
266         user2Attributes.add(chartDataBL2);
267         user2Attributes.add(orgDataBUS2);
268         user2RolePrincipal.setAttributeDetails(user2Attributes);
269 
270         List<RoleMemberAttributeDataBo> adminAttributes = new ArrayList<RoleMemberAttributeDataBo>();
271         adminAttributes.add(chartDataBL);
272         adminAttributes.add(orgDataBUS);
273         adminRolePrincipal.setAttributeDetails(adminAttributes);
274 
275 
276         
277 
278 
279 
280         role = KradDataServiceLocator.getDataObjectService().save(role);
281 
282 
283         
284 
285 
286 
287         
288         Long documentTypeAttributeId = getNextSequenceLongValue("KRIM_ATTR_DEFN_ID_S");
289         KimAttributeBo documentTypeAttribute = new KimAttributeBo();
290         documentTypeAttribute.setId("" + documentTypeAttributeId);
291         documentTypeAttribute.setAttributeName(KewApiConstants.DOCUMENT_TYPE_NAME_DETAIL);
292         documentTypeAttribute.setNamespaceCode(NAMESPACE);
293         documentTypeAttribute.setAttributeLabel("documentType");
294         documentTypeAttribute.setActive(true);
295         documentTypeAttribute = KradDataServiceLocator.getDataObjectService().save(documentTypeAttribute);
296 
297         
298         Long nodeNameAttributeId = getNextSequenceLongValue("KRIM_ATTR_DEFN_ID_S");
299         KimAttributeBo nodeNameAttribute = new KimAttributeBo();
300         nodeNameAttribute.setId("" + nodeNameAttributeId);
301         nodeNameAttribute.setAttributeName(KewApiConstants.ROUTE_NODE_NAME_DETAIL);
302         nodeNameAttribute.setNamespaceCode(NAMESPACE);
303         nodeNameAttribute.setAttributeLabel("nodeName");
304         nodeNameAttribute.setActive(true);
305         nodeNameAttribute = KradDataServiceLocator.getDataObjectService().save(nodeNameAttribute);
306 
307         
308         Long kimRespTypeId = getNextSequenceLongValue("KRIM_TYP_ID_S");
309         KimTypeBo kimRespType = new KimTypeBo();
310         kimRespType.setId("" + kimRespTypeId);
311         kimRespType.setName("RespDetails");
312         kimRespType.setNamespaceCode(NAMESPACE);
313         kimRespType.setServiceName("testBaseResponsibilityTypeService");
314         kimRespType.setActive(true);
315         kimRespType = KradDataServiceLocator.getDataObjectService().save(kimRespType);
316 
317         
318         Long documentTypeTypeAttributeId = getNextSequenceLongValue("KRIM_TYP_ATTR_ID_S");
319         KimTypeAttributeBo documentTypeTypeAttribute = new KimTypeAttributeBo();
320         documentTypeTypeAttribute.setId("" + documentTypeTypeAttributeId);
321         documentTypeTypeAttribute.setActive(true);
322         documentTypeTypeAttribute.setKimAttributeId(chartAttribute.getId());
323         documentTypeTypeAttribute.setKimTypeId(kimType.getId());
324         documentTypeTypeAttribute.setSortCode("a");
325         documentTypeTypeAttribute = KradDataServiceLocator.getDataObjectService().save(documentTypeTypeAttribute);
326 
327         
328         Long nodeNameTypeAttributeId = getNextSequenceLongValue("KRIM_TYP_ATTR_ID_S");
329         KimTypeAttributeBo nodeNameTypeAttribute = new KimTypeAttributeBo();
330         nodeNameTypeAttribute.setId("" + nodeNameTypeAttributeId);
331         nodeNameTypeAttribute.setActive(true);
332         nodeNameTypeAttribute.setKimAttributeId(orgAttribute.getId());
333         nodeNameTypeAttribute.setKimTypeId(kimType.getId());
334         nodeNameTypeAttribute.setSortCode("a");
335         nodeNameTypeAttribute = KradDataServiceLocator.getDataObjectService().save(nodeNameTypeAttribute);
336 
337         createResponsibilityForRoleRouteModuleTest(role, documentTypeAttribute, nodeNameAttribute, kimRespType, user1RolePrincipal, user2RolePrincipal, adminRolePrincipal,
338                                                    "FirstApproveReview", "RoleRouteModuleTest1", "resp1", "VoluntaryReview1", ActionRequestPolicy.FIRST);
339         
340         createResponsibilityForRoleRouteModuleTest(role, documentTypeAttribute, nodeNameAttribute, kimRespType, user1RolePrincipal, user2RolePrincipal, adminRolePrincipal,
341                                                    "AllApproveReview", "RoleRouteModuleTest2", "resp2", "VoluntaryReview2", ActionRequestPolicy.ALL);
342         
343 
344         suiteDataInitialized = true;
345     }
346 
347     private void createResponsibilityForRoleRouteModuleTest(RoleBo role, KimAttributeBo documentTypeAttribute, KimAttributeBo nodeNameAttribute, KimTypeBo kimRespType, RoleMemberBo user1RolePrincipal, RoleMemberBo user2RolePrincipal, RoleMemberBo adminRolePrincipal,
348                                                             String templateName, String docTypeDetailValue, String responsibilityName, String responsibilityDesc, ActionRequestPolicy actionRequestPolicy) {
349 
350         
351 
352 
353 
354         String templateId = String.valueOf(getNextSequenceLongValue("KRIM_RSP_TMPL_ID_S"));
355         ResponsibilityTemplateBo template = new ResponsibilityTemplateBo();
356         template.setId(templateId);
357         template.setNamespaceCode(NAMESPACE);
358         template.setName(templateName);
359         template.setKimTypeId(kimRespType.getId());
360         template.setActive(true);
361         template.setDescription("description");
362 
363         template = KradDataServiceLocator.getDataObjectService().save(template);
364 
365 
366         
367 
368 
369 
370         String responsibilityId = "" + getNextSequenceLongValue("KRIM_ROLE_RSP_ID_S");
371 
372         String dataId = "" + getNextSequenceLongValue("KRIM_GRP_ATTR_DATA_ID_S");
373         ResponsibilityAttributeBo documentTypeDetail = new ResponsibilityAttributeBo();
374         documentTypeDetail.setId(dataId);
375         documentTypeDetail.setAttributeValue(docTypeDetailValue);
376         documentTypeDetail.setKimAttribute(documentTypeAttribute);
377         documentTypeDetail.setKimAttributeId(documentTypeAttribute.getId());
378         documentTypeDetail.setKimTypeId(kimRespType.getId());
379         documentTypeDetail.setAssignedToId(responsibilityId);
380 
381         dataId = "" + getNextSequenceLongValue("KRIM_GRP_ATTR_DATA_ID_S");
382         ResponsibilityAttributeBo nodeNameDetail = new ResponsibilityAttributeBo();
383         nodeNameDetail.setId(dataId);
384         nodeNameDetail.setAttributeValue("Role1");
385         nodeNameDetail.setKimAttribute(nodeNameAttribute);
386         nodeNameDetail.setKimAttributeId(nodeNameAttribute.getId());
387         nodeNameDetail.setKimTypeId(kimRespType.getId());
388         nodeNameDetail.setAssignedToId(responsibilityId);
389 
390 
391 
392         
393 
394 
395 
396         List<ResponsibilityAttributeBo> detailObjects = new ArrayList<ResponsibilityAttributeBo>();
397         detailObjects.add(documentTypeDetail);
398         detailObjects.add(nodeNameDetail);
399 
400         ResponsibilityBo responsibility = new ResponsibilityBo();
401         responsibility.setActive(true);
402         responsibility.setDescription(responsibilityDesc);
403         responsibility.setAttributeDetails(detailObjects);
404         responsibility.setName(responsibilityName);
405         responsibility.setNamespaceCode(NAMESPACE);
406         responsibility.setId(responsibilityId);
407         responsibility.setTemplate(template);
408         responsibility.setTemplateId(template.getId());
409 
410         responsibility = KradDataServiceLocator.getDataObjectService().save(responsibility);
411 
412         
413 
414 
415 
416         String roleResponsibilityId = "" + getNextSequenceLongValue("KRIM_ROLE_RSP_ID_S");
417         RoleResponsibilityBo roleResponsibility = new RoleResponsibilityBo();
418         roleResponsibility.setRoleResponsibilityId(roleResponsibilityId);
419         roleResponsibility.setActive(true);
420         roleResponsibility.setResponsibilityId(responsibilityId);
421         roleResponsibility.setRoleId(role.getId());
422 
423         roleResponsibility = KradDataServiceLocator.getDataObjectService().save(roleResponsibility);
424 
425         
426 
427 
428         String roleResponsibilityActionId = "" + getNextSequenceLongValue("KRIM_ROLE_RSP_ACTN_ID_S");
429         RoleResponsibilityActionBo roleResponsibilityAction1 = new RoleResponsibilityActionBo();
430         roleResponsibilityAction1.setId(roleResponsibilityActionId);
431         roleResponsibilityAction1.setRoleResponsibilityId(roleResponsibilityId);
432         roleResponsibilityAction1.setRoleMemberId(user1RolePrincipal.getId());
433         roleResponsibilityAction1.setActionTypeCode(KewApiConstants.ACTION_REQUEST_APPROVE_REQ);
434         roleResponsibilityAction1.setActionPolicyCode(actionRequestPolicy.getCode());
435         roleResponsibilityAction1.setPriorityNumber(1);
436         roleResponsibilityAction1.setForceAction(true);
437         roleResponsibilityAction1 = KradDataServiceLocator.getDataObjectService().save(roleResponsibilityAction1);
438 
439         roleResponsibilityActionId = "" + getNextSequenceLongValue("KRIM_ROLE_RSP_ACTN_ID_S");
440         RoleResponsibilityActionBo roleResponsibilityAction2 = new RoleResponsibilityActionBo();
441         roleResponsibilityAction2.setId(roleResponsibilityActionId);
442         roleResponsibilityAction2.setRoleResponsibilityId(roleResponsibilityId);
443         roleResponsibilityAction2.setRoleMemberId(user2RolePrincipal.getId());
444         roleResponsibilityAction2.setActionTypeCode(KewApiConstants.ACTION_REQUEST_APPROVE_REQ);
445         roleResponsibilityAction2.setActionPolicyCode(actionRequestPolicy.getCode());
446         roleResponsibilityAction2.setPriorityNumber(1);
447         roleResponsibilityAction2.setForceAction(true);
448         roleResponsibilityAction2 = KradDataServiceLocator.getDataObjectService().save(roleResponsibilityAction2);
449 
450         roleResponsibilityActionId = "" + getNextSequenceLongValue("KRIM_ROLE_RSP_ACTN_ID_S");
451         RoleResponsibilityActionBo roleResponsibilityAction3 = new RoleResponsibilityActionBo();
452         roleResponsibilityAction3.setId(roleResponsibilityActionId);
453         roleResponsibilityAction3.setRoleResponsibilityId(roleResponsibilityId);
454         roleResponsibilityAction3.setRoleMemberId(adminRolePrincipal.getId());
455         roleResponsibilityAction3.setActionTypeCode(KewApiConstants.ACTION_REQUEST_APPROVE_REQ);
456         roleResponsibilityAction3.setActionPolicyCode(actionRequestPolicy.getCode());
457         roleResponsibilityAction3.setPriorityNumber(1);
458         roleResponsibilityAction3.setForceAction(true);
459         roleResponsibilityAction3 = KradDataServiceLocator.getDataObjectService().save(roleResponsibilityAction3);
460 
461     }
462 
463     private void createDelegate(){
464 
465         if (suiteCreateDelegateInitialized) {
466             return;
467         }
468 
469         
470         Long kimDlgnTypeId = getNextSequenceLongValue("KRIM_TYP_ID_S");
471         KimTypeBo kimDlgnType = new KimTypeBo();
472         kimDlgnType.setId("" + kimDlgnTypeId);
473         kimDlgnType.setName("TestBaseDelegationType");
474         kimDlgnType.setNamespaceCode(NAMESPACE);
475         kimDlgnType.setServiceName("testBaseDelegationTypeService");
476         kimDlgnType.setActive(true);
477         kimDlgnType = KradDataServiceLocator.getDataObjectService().save(kimDlgnType);
478 
479         
480 
481 
482         String id = "" + getNextSequenceLongValue("KRIM_DLGN_MBR_ID_S");
483         DelegateTypeBo delegate = new DelegateTypeBo();
484 
485         delegate.setDelegationId(id);
486         delegate.setDelegationType(DelegationType.PRIMARY);
487         delegate.setActive(true);
488         delegate.setKimTypeId("" + kimDlgnTypeId);
489         
490 
491 
492 
493         Role role = KimApiServiceLocator.getRoleService().getRoleByNamespaceCodeAndName(NAMESPACE, ROLE_NAME);
494         assertNotNull("Role should exist.", role);
495         delegate.setRoleId(role.getId());
496         delegate = KradDataServiceLocator.getDataObjectService().save(delegate);
497 
498         
499         String delgMemberId = "" + getNextSequenceLongValue("KRIM_DLGN_MBR_ID_S");
500         DelegateMemberBo user1RoleDelegate = new DelegateMemberBo();
501         user1RoleDelegate.setDelegationMemberId(delgMemberId);
502         
503         
504         Principal kPrincipal = KimApiServiceLocator.getIdentityService().getPrincipalByPrincipalName("ewestfal");
505         assertNotNull(kPrincipal);
506         user1RoleDelegate.setMemberId(kPrincipal.getPrincipalId());
507         
508 
509 
510 
511         user1RoleDelegate.setType( MemberType.PRINCIPAL );
512 
513         
514         user1RoleDelegate.setDelegationId(delegate.getDelegationId());
515 
516         user1RoleDelegate = KradDataServiceLocator.getDataObjectService().save(user1RoleDelegate);
517 
518         suiteCreateDelegateInitialized = true;
519 
520     }
521 
522 
523     @Test
524     public void testRoleRouteModule_FirstApprove() throws Exception {
525 
526         WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), "RoleRouteModuleTest1");
527         document.route("");
528 
529         
530         
531 
532         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("admin"), document.getDocumentId());
533         assertTrue("Approval should be requested.", document.isApprovalRequested());
534         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user1"), document.getDocumentId());
535         assertTrue("Approval should be requested.", document.isApprovalRequested());
536         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user2"), document.getDocumentId());
537         assertTrue("Approval should be requested.", document.isApprovalRequested());
538 
539         
540         List<ActionRequest> actionRequests = KewApiServiceLocator.getWorkflowDocumentService().getRootActionRequests(document.getDocumentId());
541         
542         assertEquals("Should have 3 action requests.", 3, actionRequests.size());
543         int numRoots = 0;
544         for (ActionRequest actionRequest : actionRequests) {
545             
546             if (actionRequest.getRequestPolicy() != null) {
547                 assertEquals(ActionRequestPolicy.FIRST, actionRequest.getRequestPolicy());
548             }
549             if (actionRequest.getParentActionRequestId() == null) {
550                 numRoots++;
551             }
552         }
553         assertEquals("There should have been 3 root requests.", 3, numRoots);
554 
555         
556         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user1"), document.getDocumentId());
557         document.approve("");
558         assertTrue("Document should be ENROUTE.", document.isEnroute());
559 
560         
561         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("admin"), document.getDocumentId());
562         assertTrue("Approval should be requested.", document.isApprovalRequested());
563         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user2"), document.getDocumentId());
564         assertTrue("Approval should be requested.", document.isApprovalRequested());
565 
566         
567         document.approve("");
568         assertTrue("Document should be ENROUTE.", document.isEnroute());
569 
570         
571         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("admin"), document.getDocumentId());
572         document.approve("");
573         assertTrue("Document should be FINAL.", document.isFinal());
574     }
575 
576     @Test
577     public void testRoleRouteModule_AllApprove() throws Exception {
578 
579         WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), "RoleRouteModuleTest2");
580         document.route("");
581 
582         
583 
584         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("admin"), document.getDocumentId());
585         assertTrue("Approval should be requested.", document.isApprovalRequested());
586         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user1"), document.getDocumentId());
587         assertTrue("Approval should be requested.", document.isApprovalRequested());
588         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user2"), document.getDocumentId());
589         assertTrue("Approval should be requested.", document.isApprovalRequested());
590 
591         
592         
593         List<ActionRequest> actionRequests = KewApiServiceLocator
594                 .getWorkflowDocumentService().getRootActionRequests(document.getDocumentId());
595         assertEquals("Should have 3 action requests.", 3, actionRequests.size());
596         int numRoots = 0;
597         for (ActionRequest actionRequest : actionRequests) {
598             assertNotNull(actionRequest.getRequestPolicy());
599             assertEquals(ActionRequestPolicy.FIRST, actionRequest.getRequestPolicy());
600             if (actionRequest.getParentActionRequestId() == null) {
601                 numRoots++;
602             }
603         }
604         assertEquals("There should have been 3 root requests.", 3, numRoots);
605 
606         
607         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user1"), document.getDocumentId());
608         document.approve("");
609         assertTrue("Document should still be enroute.", document.isEnroute());
610 
611         
612         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("admin"), document.getDocumentId());
613         assertTrue("Approval should be requested.", document.isApprovalRequested());
614         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user2"), document.getDocumentId());
615         assertTrue("Approval should be requested.", document.isApprovalRequested());
616 
617         
618         document.approve("");
619         assertTrue("Document should be ENROUTE.", document.isEnroute());
620 
621         
622         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("admin"), document.getDocumentId());
623         document.approve("");
624         assertTrue("Document should be FINAL.", document.isFinal());
625     }
626 
627     
628 
629 
630 
631     @Test
632     public void testRoleRouteModule_RoleResponsibilityActionUpdate() throws Exception {
633 
634         WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), "RoleRouteModuleTest1");
635         document.route("");
636 
637         
638         
639 
640         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("admin"), document.getDocumentId());
641         assertTrue("Approval should be requested.", document.isApprovalRequested());
642         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user1"), document.getDocumentId());
643         assertTrue("Approval should be requested.", document.isApprovalRequested());
644         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user2"), document.getDocumentId());
645         assertTrue("Approval should be requested.", document.isApprovalRequested());
646 
647         
648         List<ActionRequest> actionRequests = KewApiServiceLocator.getWorkflowDocumentService().getRootActionRequests(document.getDocumentId());
649         
650         assertEquals("Should have 3 action requests.", 3, actionRequests.size());
651         int numRoots = 0;
652         for (ActionRequest actionRequest : actionRequests) {
653             
654             if (actionRequest.getRequestPolicy() != null) {
655                 assertEquals(ActionRequestPolicy.FIRST, actionRequest.getRequestPolicy());
656             }
657             if (actionRequest.getParentActionRequestId() == null) {
658                 numRoots++;
659             }
660         }
661         assertEquals("There should have been 3 root requests.", 3, numRoots);
662 
663         RoleService roleService = KimApiServiceLocator.getRoleService();
664         Role role = roleService.getRoleByNamespaceCodeAndName(NAMESPACE, ROLE_NAME);
665         assertNotNull(role);
666         Principal user1Principal = KimApiServiceLocator.getIdentityService().getPrincipalByPrincipalName("user1");
667         List<RoleMembership> members = roleService.getRoleMembers(Collections.singletonList(role.getId()), null);
668         
669         RoleMembership m = null;
670         for (RoleMembership rm: members) {
671             if (user1Principal.getPrincipalId().equals(rm.getMemberId())) {
672                 m = rm;
673                 break;
674             }
675         }
676         assertNotNull("Failed to find user1Principal role membership", m);
677         assertEquals(user1Principal.getPrincipalId(), m.getMemberId());
678         List<RoleResponsibilityAction> rras = roleService.getRoleMemberResponsibilityActions(m.getId());
679         assertEquals(2, rras.size());
680         RoleResponsibilityAction rra = rras.get(0);
681         RoleResponsibilityAction.Builder b = RoleResponsibilityAction.Builder.create(rra);
682         b.setActionTypeCode(ActionType.ACKNOWLEDGE.getCode());
683 
684         roleService.updateRoleResponsibilityAction(b.build());
685 
686         
687         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user1"), document.getDocumentId());
688         assertFalse("Approval should NOT be requested.", document.isApprovalRequested());
689         assertTrue("Acknowledge should be requested.", document.isAcknowledgeRequested());
690         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("admin"), document.getDocumentId());
691         assertTrue("Approval should be requested.", document.isApprovalRequested());
692         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user2"), document.getDocumentId());
693         assertTrue("Approval should be requested.", document.isApprovalRequested());
694 
695         roleService.deleteRoleResponsibilityAction(rras.get(0).getId());
696 
697         
698         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user1"), document.getDocumentId());
699         assertTrue(document.getRequestedActions().getRequestedActions().isEmpty());
700 
701         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("admin"), document.getDocumentId());
702         assertTrue("Approval should be requested.", document.isApprovalRequested());
703         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user2"), document.getDocumentId());
704         assertTrue("Approval should be requested.", document.isApprovalRequested());
705 
706         
707         actionRequests = KewApiServiceLocator.getWorkflowDocumentService().getRootActionRequests(document.getDocumentId());
708         
709         assertEquals("Should have 2 action requests.", 2, actionRequests.size());
710     }
711 
712     @Test
713     public void testRoleDelegate() throws Exception{
714         this.createDelegate();
715 
716         WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("rkirkend"), "RoleRouteModuleTest2");
717         document.route("");
718 
719         String ewestfalPrincipalId = getPrincipalIdForName("ewestfal");
720 
721         
722         document = WorkflowDocumentFactory.loadDocument(ewestfalPrincipalId, document.getDocumentId());
723         assertTrue("ewestfal should be able to approve", document.isApprovalRequested());
724 
725         
726         List<ActionRequest> actionRequests = document.getRootActionRequests();
727         assertEquals(3, actionRequests.size());
728 
729         for (ActionRequest actionRequest : actionRequests) {
730             
731             assertFalse(ewestfalPrincipalId.equals(actionRequest.getPrincipalId()));
732             
733             assertEquals(1, actionRequest.getChildRequests().size());
734             ActionRequest delegateRequest = actionRequest.getChildRequests().get(0);
735             assertEquals(ewestfalPrincipalId, delegateRequest.getPrincipalId());
736             assertEquals("Delegation type should been PRIMARY", DelegationType.PRIMARY, delegateRequest.getDelegationType());
737         }
738     }
739 
740     @Test
741     public void testRoleDelegateApproval() throws Exception{
742         this.createDelegate();
743 
744         WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("rkirkend"), "RoleRouteModuleTest2");
745         document.route("");
746 
747         
748         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("ewestfal"), document.getDocumentId());
749         assertTrue("ewestfal should have an approval request", document.isApprovalRequested());
750         document.approve("");
751 
752         assertTrue("Document should have been approved by the delegate.", document.isFinal());
753     }
754 
755     @Test
756     public void testRoleWithNoMembers() throws Exception {
757         getTransactionTemplate().execute(new TransactionCallback<Object>() {
758             @Override
759             public Object doInTransaction(TransactionStatus status) {
760 
761                 try {
762 
763                     
764 
765                     Role role = KimApiServiceLocator.getRoleService().getRoleByNamespaceCodeAndName(NAMESPACE,
766                             ROLE_NAME);
767                     Map<String, String> criteria = new HashMap<String, String>();
768                     criteria.put("roleId", role.getId());
769                     List<RoleMemberBo> roleMembers = KradDataServiceLocator.getDataObjectService().findMatching(RoleMemberBo.class, QueryByCriteria.Builder.forAttribute("roleId", role.getId()).build()).getResults();
770                     assertFalse("role member list should not currently be empty", roleMembers.isEmpty());
771                     for (RoleMemberBo roleMember : roleMembers) {
772                         
773                         
774                         assertNotNull("Role Member should exist.", roleMember);
775                         KradDataServiceLocator.getDataObjectService().delete(roleMember);
776                     }
777 
778                     
779                     KradDataServiceLocator.getDataObjectService().flush(RoleMemberBo.class);
780 
781                     List<RoleMembership> roleMemberInfos = KimApiServiceLocator.getRoleService().getRoleMembers(Collections.singletonList(role.getId()), Collections.<String, String>emptyMap());
782                     assertEquals("role member list should be empty now", 0, roleMemberInfos.size());
783 
784                     
785                     WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), "RoleRouteModuleTest1");
786                     document.route("");
787 
788                     
789 
790                     assertTrue("document should now be in final status", document.isFinal());
791 
792                     
793 
794                     List<RouteNodeInstance> routeNodeInstances = document.getRouteNodeInstances();
795                     assertEquals("Document should have 2 route node instances", 2, routeNodeInstances.size());
796 
797                     return null;
798                 } finally {
799                     status.setRollbackOnly();
800                 }
801             }
802         });
803     }
804 
805 }