001    /**
002     * Copyright 2005-2011 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.rice.kew.role;
017    
018    import org.junit.Test;
019    import org.kuali.rice.core.api.delegation.DelegationType;
020    import org.kuali.rice.core.api.membership.MemberType;
021    import org.kuali.rice.kew.api.KewApiServiceLocator;
022    import org.kuali.rice.kew.api.WorkflowDocument;
023    import org.kuali.rice.kew.api.WorkflowDocumentFactory;
024    import org.kuali.rice.kew.api.action.ActionRequest;
025    import org.kuali.rice.kew.api.action.ActionRequestPolicy;
026    import org.kuali.rice.kew.api.action.ActionType;
027    import org.kuali.rice.kew.api.document.node.RouteNodeInstance;
028    import org.kuali.rice.kew.test.KEWTestCase;
029    import org.kuali.rice.kew.api.KewApiConstants;
030    import org.kuali.rice.kim.api.identity.principal.Principal;
031    import org.kuali.rice.kim.api.role.Role;
032    import org.kuali.rice.kim.api.role.RoleMembership;
033    import org.kuali.rice.kim.api.role.RoleResponsibilityAction;
034    import org.kuali.rice.kim.api.role.RoleService;
035    import org.kuali.rice.kim.api.services.KimApiServiceLocator;
036    import org.kuali.rice.kim.impl.common.attribute.KimAttributeBo;
037    import org.kuali.rice.kim.impl.common.delegate.DelegateTypeBo;
038    import org.kuali.rice.kim.impl.common.delegate.DelegateMemberBo;
039    import org.kuali.rice.kim.impl.responsibility.ResponsibilityAttributeBo;
040    import org.kuali.rice.kim.impl.responsibility.ResponsibilityBo;
041    import org.kuali.rice.kim.impl.responsibility.ResponsibilityTemplateBo;
042    import org.kuali.rice.kim.impl.role.RoleBo;
043    import org.kuali.rice.kim.impl.role.RoleMemberAttributeDataBo;
044    import org.kuali.rice.kim.impl.role.RoleMemberBo;
045    import org.kuali.rice.kim.impl.role.RoleResponsibilityActionBo;
046    import org.kuali.rice.kim.impl.role.RoleResponsibilityBo;
047    import org.kuali.rice.kim.impl.type.KimTypeAttributeBo;
048    import org.kuali.rice.kim.impl.type.KimTypeBo;
049    import org.kuali.rice.krad.service.KRADServiceLocator;
050    import org.kuali.rice.test.BaselineTestCase;
051    import org.springframework.transaction.TransactionStatus;
052    import org.springframework.transaction.support.TransactionCallback;
053    
054    import java.util.ArrayList;
055    import java.util.Collections;
056    import java.util.HashMap;
057    import java.util.List;
058    import java.util.Map;
059    
060    import static org.junit.Assert.*;
061    
062    /**
063     * Tests Role-based routing integration between KEW and KIM.
064     *
065     * @author Kuali Rice Team (rice.collab@kuali.org)
066     *
067     */
068    @BaselineTestCase.BaselineMode(BaselineTestCase.Mode.CLEAR_DB)
069    public class RoleRouteModuleTest extends KEWTestCase {
070    
071        private static final String NAMESPACE = KewApiConstants.KEW_NAMESPACE;
072        private static final String ROLE_NAME = "RoleRouteModuleTestRole";
073    
074        private static boolean suiteDataInitialized = false;
075        private static boolean suiteCreateDelegateInitialized = false;
076    
077        protected void loadTestData() throws Exception {
078            loadXmlFile("RoleRouteModuleTestConfig.xml");
079    
080            // only create this data once per suite!
081            if (suiteDataInitialized) {
082                return;
083            }
084    
085            /**
086             * First we need to set up:
087             *
088             * 1) KimAttributes for both chart and org
089             * 2) The KimType for "chart/org"
090             * 3) The KimTypeAttributes for chart and org to define relationship between KimType and it's KimAttributes
091             */
092    
093            // create "chart" KimAttribute
094            Long chartAttributeId = KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_ATTR_DEFN_ID_S");
095            KimAttributeBo chartAttribute = new KimAttributeBo();
096            chartAttribute.setId("" + chartAttributeId);
097            chartAttribute.setAttributeName("chart");
098            chartAttribute.setComponentName("org.kuali.rice.kim.bo.impl.KimAttributes");
099            chartAttribute.setNamespaceCode(NAMESPACE);
100            chartAttribute.setAttributeLabel("chart");
101            chartAttribute.setActive(true);
102            chartAttribute = (KimAttributeBo) KRADServiceLocator.getBusinessObjectService().save(chartAttribute);
103    
104            // create "org" KimAttribute
105            Long orgAttributeId = KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_ATTR_DEFN_ID_S");
106            KimAttributeBo orgAttribute = new KimAttributeBo();
107            orgAttribute.setId("" + orgAttributeId);
108            orgAttribute.setComponentName("org.kuali.rice.kim.bo.impl.KimAttributes");
109            orgAttribute.setAttributeName("org");
110            orgAttribute.setNamespaceCode(NAMESPACE);
111            orgAttribute.setAttributeLabel("org");
112            orgAttribute.setActive(true);
113            orgAttribute = (KimAttributeBo) KRADServiceLocator.getBusinessObjectService().save(orgAttribute);
114    
115            // create KimType
116            Long kimTypeId = KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_TYP_ID_S");
117            KimTypeBo kimType = new KimTypeBo();
118            kimType.setId("" + kimTypeId);
119            kimType.setName("ChartOrg");
120            kimType.setNamespaceCode(NAMESPACE);
121            kimType.setServiceName("testBaseRoleTypeService"); // do we need to set the kim type service yet? we shall see...
122            kimType.setActive(true);
123            kimType = (KimTypeBo) KRADServiceLocator.getBusinessObjectService().save(kimType);
124    
125            // create chart KimTypeAttribute
126            Long chartTypeAttributeId = KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_TYP_ATTR_ID_S");
127            KimTypeAttributeBo chartTypeAttribute = new KimTypeAttributeBo();
128            chartTypeAttribute.setId("" + chartTypeAttributeId);
129            chartTypeAttribute.setActive(true);
130            chartTypeAttribute.setKimAttributeId(chartAttribute.getId());
131            chartTypeAttribute.setKimTypeId(kimType.getId());
132            chartTypeAttribute = (KimTypeAttributeBo) KRADServiceLocator.getBusinessObjectService().save(chartTypeAttribute);
133    
134            // create org KimTypeAttribute
135            Long orgTypeAttributeId = KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_TYP_ATTR_ID_S");
136            KimTypeAttributeBo orgTypeAttribute = new KimTypeAttributeBo();
137            orgTypeAttribute.setId("" + orgTypeAttributeId);
138            orgTypeAttribute.setActive(true);
139            orgTypeAttribute.setKimAttributeId(orgAttribute.getId());
140            orgTypeAttribute.setKimTypeId(kimType.getId());
141            orgTypeAttribute = (KimTypeAttributeBo) KRADServiceLocator.getBusinessObjectService().save(orgTypeAttribute);
142    
143            /**
144             * New let's create the Role
145             */
146    
147            String roleId = "" + KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_ROLE_ID_S");
148            RoleBo role = new RoleBo();
149            role.setId(roleId);
150            role.setNamespaceCode(NAMESPACE);
151            role.setDescription("");
152            role.setName(ROLE_NAME);
153            role.setActive(true);
154            role.setKimTypeId(kimType.getId());
155    
156            String roleMemberId1 = "" + KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_ROLE_ID_S");
157            RoleMemberBo adminRolePrincipal = new RoleMemberBo();
158            adminRolePrincipal.setId(roleMemberId1);
159            adminRolePrincipal.setRoleId(roleId);
160            Principal adminPrincipal = KimApiServiceLocator.getIdentityService().getPrincipalByPrincipalName("admin");
161            assertNotNull(adminPrincipal);
162            adminRolePrincipal.setMemberId(adminPrincipal.getPrincipalId());
163            adminRolePrincipal.setType( MemberType.PRINCIPAL );
164    
165            String roleMemberId2 = "" + KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_ROLE_ID_S");
166            RoleMemberBo user2RolePrincipal = new RoleMemberBo();
167            user2RolePrincipal.setId(roleMemberId2);
168            user2RolePrincipal.setRoleId(roleId);
169            Principal user2Principal = KimApiServiceLocator.getIdentityService().getPrincipalByPrincipalName("user2");
170            assertNotNull(user2Principal);
171            user2RolePrincipal.setMemberId(user2Principal.getPrincipalId());
172            user2RolePrincipal.setType( MemberType.PRINCIPAL );
173    
174            String roleMemberId3 = "" + KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_ROLE_ID_S");
175            RoleMemberBo user1RolePrincipal = new RoleMemberBo();
176            user1RolePrincipal.setId(roleMemberId3);
177            user1RolePrincipal.setRoleId(roleId);
178            Principal user1Principal = KimApiServiceLocator.getIdentityService().getPrincipalByPrincipalName("user1");
179            assertNotNull(user1Principal);
180            user1RolePrincipal.setMemberId(user1Principal.getPrincipalId());
181            user1RolePrincipal.setType( MemberType.PRINCIPAL );
182    
183            List<RoleMemberBo> memberPrincipals = new ArrayList<RoleMemberBo>();
184            memberPrincipals.add(adminRolePrincipal);
185            memberPrincipals.add(user2RolePrincipal);
186            memberPrincipals.add(user1RolePrincipal);
187    
188            role.setMembers(memberPrincipals);
189    
190            /**
191             * Let's create qualifiers for chart and org for our role members
192             */
193    
194            String dataId = "" + KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_GRP_ATTR_DATA_ID_S");
195            RoleMemberAttributeDataBo chartDataBL = new RoleMemberAttributeDataBo();
196            chartDataBL.setId(dataId);
197            chartDataBL.setAttributeValue("BL");
198            chartDataBL.setKimAttribute(chartAttribute);
199            chartDataBL.setKimAttributeId(chartAttribute.getId());
200            chartDataBL.setKimTypeId(kimType.getId());
201            chartDataBL.setAssignedToId(adminRolePrincipal.getId());
202    
203            dataId = "" + KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_GRP_ATTR_DATA_ID_S");
204            RoleMemberAttributeDataBo chartDataBL2 = new RoleMemberAttributeDataBo();
205            chartDataBL2.setId(dataId);
206            chartDataBL2.setAttributeValue("BL");
207            chartDataBL2.setKimAttribute(chartAttribute);
208            chartDataBL2.setKimAttributeId(chartAttribute.getId());
209            chartDataBL2.setKimTypeId(kimType.getId());
210            chartDataBL2.setAssignedToId(user2RolePrincipal.getId());
211    
212            dataId = "" + KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_GRP_ATTR_DATA_ID_S");
213            RoleMemberAttributeDataBo orgDataBUS = new RoleMemberAttributeDataBo();
214            orgDataBUS.setId(dataId);
215            orgDataBUS.setAttributeValue("BUS");
216            orgDataBUS.setKimAttribute(orgAttribute);
217            orgDataBUS.setKimAttributeId(orgAttribute.getId());
218            orgDataBUS.setKimTypeId(kimType.getId());
219            orgDataBUS.setAssignedToId(adminRolePrincipal.getId());
220    
221            dataId = "" + KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_GRP_ATTR_DATA_ID_S");
222            RoleMemberAttributeDataBo orgDataBUS2 = new RoleMemberAttributeDataBo();
223            orgDataBUS2.setId(dataId);
224            orgDataBUS2.setAttributeValue("BUS");
225            orgDataBUS2.setKimAttribute(orgAttribute);
226            orgDataBUS2.setKimAttributeId(orgAttribute.getId());
227            orgDataBUS2.setKimTypeId(kimType.getId());
228            orgDataBUS2.setAssignedToId(user2RolePrincipal.getId());
229    
230    
231            dataId = "" + KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_GRP_ATTR_DATA_ID_S");
232            RoleMemberAttributeDataBo chartDataIN = new RoleMemberAttributeDataBo();
233            chartDataIN.setId(dataId);
234            chartDataIN.setAttributeValue("IN");
235            chartDataIN.setKimAttribute(chartAttribute);
236            chartDataIN.setKimAttributeId(chartAttribute.getId());
237            chartDataIN.setKimTypeId(kimType.getId());
238            chartDataIN.setAssignedToId(user1RolePrincipal.getId());
239    
240            dataId = "" + KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_GRP_ATTR_DATA_ID_S");
241            RoleMemberAttributeDataBo orgDataMED = new RoleMemberAttributeDataBo();
242            orgDataMED.setId(dataId);
243            orgDataMED.setAttributeValue("MED");
244            orgDataMED.setKimAttribute(orgAttribute);
245            orgDataMED.setKimAttributeId(orgAttribute.getId());
246            orgDataMED.setKimTypeId(kimType.getId());
247            orgDataMED.setAssignedToId(user1RolePrincipal.getId());
248    
249            List<RoleMemberAttributeDataBo> user1Attributes = new ArrayList<RoleMemberAttributeDataBo>();
250            user1Attributes.add(chartDataIN);
251            user1Attributes.add(orgDataMED);
252            user1RolePrincipal.setAttributeDetails(user1Attributes);
253    
254            List<RoleMemberAttributeDataBo> user2Attributes = new ArrayList<RoleMemberAttributeDataBo>();
255            user2Attributes.add(chartDataBL2);
256            user2Attributes.add(orgDataBUS2);
257            user2RolePrincipal.setAttributeDetails(user2Attributes);
258    
259            List<RoleMemberAttributeDataBo> adminAttributes = new ArrayList<RoleMemberAttributeDataBo>();
260            adminAttributes.add(chartDataBL);
261            adminAttributes.add(orgDataBUS);
262            adminRolePrincipal.setAttributeDetails(adminAttributes);
263    
264    
265            /**
266             * Now we can save the role!
267             */
268    
269            role = KRADServiceLocator.getBusinessObjectService().save(role);
270    
271    
272            /**
273             * Let's set up attributes for responsibility details
274             */
275    
276            // create "documentType" KimAttribute
277            Long documentTypeAttributeId = KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_ATTR_DEFN_ID_S");
278            KimAttributeBo documentTypeAttribute = new KimAttributeBo();
279            documentTypeAttribute.setId("" + documentTypeAttributeId);
280            documentTypeAttribute.setAttributeName(KewApiConstants.DOCUMENT_TYPE_NAME_DETAIL);
281            documentTypeAttribute.setNamespaceCode(NAMESPACE);
282            documentTypeAttribute.setAttributeLabel("documentType");
283            documentTypeAttribute.setActive(true);
284            documentTypeAttribute = (KimAttributeBo) KRADServiceLocator.getBusinessObjectService().save(documentTypeAttribute);
285    
286            // create "node name" KimAttribute
287            Long nodeNameAttributeId = KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_ATTR_DEFN_ID_S");
288            KimAttributeBo nodeNameAttribute = new KimAttributeBo();
289            nodeNameAttribute.setId("" + nodeNameAttributeId);
290            nodeNameAttribute.setAttributeName(KewApiConstants.ROUTE_NODE_NAME_DETAIL);
291            nodeNameAttribute.setNamespaceCode(NAMESPACE);
292            nodeNameAttribute.setAttributeLabel("nodeName");
293            nodeNameAttribute.setActive(true);
294            nodeNameAttribute = (KimAttributeBo) KRADServiceLocator.getBusinessObjectService().save(nodeNameAttribute);
295    
296            // create KimType for responsibility details
297            Long kimRespTypeId = KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_TYP_ID_S");
298            KimTypeBo kimRespType = new KimTypeBo();
299            kimRespType.setId("" + kimRespTypeId);
300            kimRespType.setName("RespDetails");
301            kimRespType.setNamespaceCode(NAMESPACE);
302            kimRespType.setServiceName("testBaseResponsibilityTypeService");
303            kimRespType.setActive(true);
304            kimRespType = (KimTypeBo) KRADServiceLocator.getBusinessObjectService().save(kimRespType);
305    
306            // create document type KimTypeAttribute
307            Long documentTypeTypeAttributeId = KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_TYP_ATTR_ID_S");
308            KimTypeAttributeBo documentTypeTypeAttribute = new KimTypeAttributeBo();
309            documentTypeTypeAttribute.setId("" + documentTypeTypeAttributeId);
310            documentTypeTypeAttribute.setActive(true);
311            documentTypeTypeAttribute.setKimAttributeId(chartAttribute.getId());
312            documentTypeTypeAttribute.setKimTypeId(kimType.getId());
313            documentTypeTypeAttribute = KRADServiceLocator.getBusinessObjectService().save(documentTypeTypeAttribute);
314    
315            // create nodeNameType KimTypeAttribute
316            Long nodeNameTypeAttributeId = KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_TYP_ATTR_ID_S");
317            KimTypeAttributeBo nodeNameTypeAttribute = new KimTypeAttributeBo();
318            nodeNameTypeAttribute.setId("" + nodeNameTypeAttributeId);
319            nodeNameTypeAttribute.setActive(true);
320            nodeNameTypeAttribute.setKimAttributeId(orgAttribute.getId());
321            nodeNameTypeAttribute.setKimTypeId(kimType.getId());
322            nodeNameTypeAttribute = KRADServiceLocator.getBusinessObjectService().save(nodeNameTypeAttribute);
323    
324            createResponsibilityForRoleRouteModuleTest(role, documentTypeAttribute, nodeNameAttribute, kimRespType, user1RolePrincipal, user2RolePrincipal, adminRolePrincipal,
325                                                       "FirstApproveReview", "RoleRouteModuleTest1", "resp1", "VoluntaryReview1", ActionRequestPolicy.FIRST);
326            //createResponsibilityForRoleRouteModuleTest1(role, documentTypeAttribute, nodeNameAttribute, kimRespType, user1RolePrincipal, user2RolePrincipal, adminRolePrincipal);
327            createResponsibilityForRoleRouteModuleTest(role, documentTypeAttribute, nodeNameAttribute, kimRespType, user1RolePrincipal, user2RolePrincipal, adminRolePrincipal,
328                                                       "AllApproveReview", "RoleRouteModuleTest2", "resp2", "VoluntaryReview2", ActionRequestPolicy.ALL);
329            //createResponsibilityForRoleRouteModuleTest2(role, documentTypeAttribute, nodeNameAttribute, kimRespType, user1RolePrincipal, user2RolePrincipal, adminRolePrincipal);
330    
331            suiteDataInitialized = true;
332        }
333    
334        private void createResponsibilityForRoleRouteModuleTest(RoleBo role, KimAttributeBo documentTypeAttribute, KimAttributeBo nodeNameAttribute, KimTypeBo kimRespType, RoleMemberBo user1RolePrincipal, RoleMemberBo user2RolePrincipal, RoleMemberBo adminRolePrincipal,
335                                                                String templateName, String docTypeDetailValue, String responsibilityName, String responsibilityDesc, ActionRequestPolicy actionRequestPolicy) {
336    
337            /**
338             * Create the responsibility template
339             */
340    
341            String templateId = String.valueOf(KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_RSP_TMPL_ID_S"));
342            ResponsibilityTemplateBo template = new ResponsibilityTemplateBo();
343            template.setId(templateId);
344            template.setNamespaceCode(NAMESPACE);
345            template.setName(templateName);
346            template.setKimTypeId(kimRespType.getId());
347            template.setActive(true);
348            template.setDescription("description");
349    
350            template = KRADServiceLocator.getBusinessObjectService().save(template);
351    
352    
353            /**
354             * Create the responsibility details for RoleRouteModuleTest1
355             */
356    
357            String responsibilityId = "" + KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_ROLE_RSP_ID_S");
358    
359            String dataId = "" + KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_GRP_ATTR_DATA_ID_S");
360            ResponsibilityAttributeBo documentTypeDetail = new ResponsibilityAttributeBo();
361            documentTypeDetail.setId(dataId);
362            documentTypeDetail.setAttributeValue(docTypeDetailValue);
363            documentTypeDetail.setKimAttribute(documentTypeAttribute);
364            documentTypeDetail.setKimAttributeId(documentTypeAttribute.getId());
365            documentTypeDetail.setKimTypeId(kimRespType.getId());
366            documentTypeDetail.setAssignedToId(responsibilityId);
367    
368            dataId = "" + KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_GRP_ATTR_DATA_ID_S");
369            ResponsibilityAttributeBo nodeNameDetail = new ResponsibilityAttributeBo();
370            nodeNameDetail.setId(dataId);
371            nodeNameDetail.setAttributeValue("Role1");
372            nodeNameDetail.setKimAttribute(nodeNameAttribute);
373            nodeNameDetail.setKimAttributeId(nodeNameAttribute.getId());
374            nodeNameDetail.setKimTypeId(kimRespType.getId());
375            nodeNameDetail.setAssignedToId(responsibilityId);
376    
377    
378    
379            /**
380             * Create the responsibility
381             */
382    
383            List<ResponsibilityAttributeBo> detailObjects = new ArrayList<ResponsibilityAttributeBo>();
384            detailObjects.add(documentTypeDetail);
385            detailObjects.add(nodeNameDetail);
386    
387            ResponsibilityBo responsibility = new ResponsibilityBo();
388            responsibility.setActive(true);
389            responsibility.setDescription(responsibilityDesc);
390            responsibility.setAttributeDetails(detailObjects);
391            responsibility.setName(responsibilityName);
392            responsibility.setNamespaceCode(NAMESPACE);
393            responsibility.setId(responsibilityId);
394            responsibility.setTemplate(template);
395            responsibility.setTemplateId(template.getId());
396    
397            responsibility = (ResponsibilityBo) KRADServiceLocator.getBusinessObjectService().save(responsibility);
398    
399            /**
400             * Create the RoleResponsibility
401             */
402    
403            String roleResponsibilityId = "" + KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_ROLE_RSP_ID_S");
404            RoleResponsibilityBo roleResponsibility = new RoleResponsibilityBo();
405            roleResponsibility.setRoleResponsibilityId(roleResponsibilityId);
406            roleResponsibility.setActive(true);
407            roleResponsibility.setResponsibilityId(responsibilityId);
408            roleResponsibility.setRoleId(role.getId());
409    
410            roleResponsibility = KRADServiceLocator.getBusinessObjectService().save(roleResponsibility);
411    
412            /**
413             * Create the various responsibility actions
414             */
415            String roleResponsibilityActionId = "" + KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_ROLE_RSP_ACTN_ID_S");
416            RoleResponsibilityActionBo roleResponsibilityAction1 = new RoleResponsibilityActionBo();
417            roleResponsibilityAction1.setId(roleResponsibilityActionId);
418            roleResponsibilityAction1.setRoleResponsibilityId(roleResponsibilityId);
419            roleResponsibilityAction1.setRoleMemberId(user1RolePrincipal.getId());
420            roleResponsibilityAction1.setActionTypeCode(KewApiConstants.ACTION_REQUEST_APPROVE_REQ);
421            roleResponsibilityAction1.setActionPolicyCode(actionRequestPolicy.getCode());
422            roleResponsibilityAction1.setPriorityNumber(1);
423            roleResponsibilityAction1 = KRADServiceLocator.getBusinessObjectService().save(roleResponsibilityAction1);
424    
425            roleResponsibilityActionId = "" + KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_ROLE_RSP_ACTN_ID_S");
426            RoleResponsibilityActionBo roleResponsibilityAction2 = new RoleResponsibilityActionBo();
427            roleResponsibilityAction2.setId(roleResponsibilityActionId);
428            roleResponsibilityAction2.setRoleResponsibilityId(roleResponsibilityId);
429            roleResponsibilityAction2.setRoleMemberId(user2RolePrincipal.getId());
430            roleResponsibilityAction2.setActionTypeCode(KewApiConstants.ACTION_REQUEST_APPROVE_REQ);
431            roleResponsibilityAction2.setActionPolicyCode(actionRequestPolicy.getCode());
432            roleResponsibilityAction2.setPriorityNumber(1);
433            roleResponsibilityAction2 = KRADServiceLocator.getBusinessObjectService().save(roleResponsibilityAction2);
434    
435            roleResponsibilityActionId = "" + KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_ROLE_RSP_ACTN_ID_S");
436            RoleResponsibilityActionBo roleResponsibilityAction3 = new RoleResponsibilityActionBo();
437            roleResponsibilityAction3.setId(roleResponsibilityActionId);
438            roleResponsibilityAction3.setRoleResponsibilityId(roleResponsibilityId);
439            roleResponsibilityAction3.setRoleMemberId(adminRolePrincipal.getId());
440            roleResponsibilityAction3.setActionTypeCode(KewApiConstants.ACTION_REQUEST_APPROVE_REQ);
441            roleResponsibilityAction3.setActionPolicyCode(actionRequestPolicy.getCode());
442            roleResponsibilityAction3.setPriorityNumber(1);
443            roleResponsibilityAction3 = KRADServiceLocator.getBusinessObjectService().save(roleResponsibilityAction3);
444    
445        }
446    
447        private void createDelegate(){
448    
449            if (suiteCreateDelegateInitialized) {
450                return;
451            }
452    
453            // create delegation KimType
454            Long kimDlgnTypeId = KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_TYP_ID_S");
455            KimTypeBo kimDlgnType = new KimTypeBo();
456            kimDlgnType.setId("" + kimDlgnTypeId);
457            kimDlgnType.setName("TestBaseDelegationType");
458            kimDlgnType.setNamespaceCode(NAMESPACE);
459            kimDlgnType.setServiceName("testBaseDelegationTypeService");
460            kimDlgnType.setActive(true);
461            kimDlgnType = KRADServiceLocator.getBusinessObjectService().save(kimDlgnType);
462    
463            /*
464             * Manually create a delegate
465             */
466            String id = "" + KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_DLGN_MBR_ID_S");
467            DelegateTypeBo delegate = new DelegateTypeBo();
468    
469            delegate.setDelegationId(id);
470            delegate.setDelegationType(DelegationType.PRIMARY);
471            delegate.setActive(true);
472            delegate.setKimTypeId("" + kimDlgnTypeId);
473            /*
474             * Assign it a role that was created above.  This should mean that every
475             * principle in the role can have the delegate added below as a delegate
476             */
477            Role role = KimApiServiceLocator.getRoleService().getRoleByNamespaceCodeAndName(NAMESPACE, ROLE_NAME);
478            assertNotNull("Role should exist.", role);
479            delegate.setRoleId(role.getId());
480            delegate = KRADServiceLocator.getBusinessObjectService().save(delegate);
481    
482            // BC of the way the jpa is handled we have to create the delagate, then the members
483            String delgMemberId = "" + KRADServiceLocator.getSequenceAccessorService().getNextAvailableSequenceNumber("KRIM_DLGN_MBR_ID_S");
484            DelegateMemberBo user1RoleDelegate = new DelegateMemberBo();
485            user1RoleDelegate.setDelegationMemberId(delgMemberId);
486            // This is the user the delegation requests should be sent to.
487            Principal kPrincipal = KimApiServiceLocator.getIdentityService().getPrincipalByPrincipalName("ewestfal");
488            assertNotNull(kPrincipal);
489            user1RoleDelegate.setMemberId(kPrincipal.getPrincipalId());
490            /*
491             * this is checked when adding delegates in both the ActionRequestFactory
492             * and RoleServiceImpl
493             */
494            user1RoleDelegate.setType( MemberType.PRINCIPAL );
495    
496            // attach it to the delegate we created above
497            user1RoleDelegate.setDelegationId(delegate.getDelegationId());
498    
499            user1RoleDelegate = KRADServiceLocator.getBusinessObjectService().save(user1RoleDelegate);
500    
501            suiteCreateDelegateInitialized = true;
502    
503        }
504    
505    
506        @Test
507        public void testRoleRouteModule_FirstApprove() throws Exception {
508    
509            WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), "RoleRouteModuleTest1");
510            document.route("");
511    
512            // in this case we should have a first approve role that contains admin and user2, we
513            // should also have a first approve role that contains just user1
514    
515            document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("admin"), document.getDocumentId());
516            assertTrue("Approval should be requested.", document.isApprovalRequested());
517            document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user1"), document.getDocumentId());
518            assertTrue("Approval should be requested.", document.isApprovalRequested());
519            document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user2"), document.getDocumentId());
520            assertTrue("Approval should be requested.", document.isApprovalRequested());
521    
522            // examine the action requests
523            List<ActionRequest> actionRequests = KewApiServiceLocator.getWorkflowDocumentService().getRootActionRequests(document.getDocumentId());
524            // there should be 2 root action requests returned here, 1 containing the 2 requests for "BL", and one containing the request for "IN"
525            assertEquals("Should have 3 action requests.", 3, actionRequests.size());
526            int numRoots = 0;
527            for (ActionRequest actionRequest : actionRequests) {
528                // each of these should be "first approve"
529                if (actionRequest.getRequestPolicy() != null) {
530                    assertEquals(ActionRequestPolicy.FIRST, actionRequest.getRequestPolicy());
531                }
532                if (actionRequest.getParentActionRequestId() == null) {
533                    numRoots++;
534                }
535            }
536            assertEquals("There should have been 3 root requests.", 3, numRoots);
537    
538            // let's approve as "user1" and verify the document is still ENROUTE
539            document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user1"), document.getDocumentId());
540            document.approve("");
541            assertTrue("Document should be ENROUTE.", document.isEnroute());
542    
543            // verify that admin and user2 still have requests
544            document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("admin"), document.getDocumentId());
545            assertTrue("Approval should be requested.", document.isApprovalRequested());
546            document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user2"), document.getDocumentId());
547            assertTrue("Approval should be requested.", document.isApprovalRequested());
548    
549            // let's approve as "user2" and verify the document is still ENROUTE
550            document.approve("");
551            assertTrue("Document should be ENROUTE.", document.isEnroute());
552    
553            // let's approve as "admin" and verify the document has gone FINAL
554            document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("admin"), document.getDocumentId());
555            document.approve("");
556            assertTrue("Document should be FINAL.", document.isFinal());
557        }
558    
559        @Test
560        public void testRoleRouteModule_AllApprove() throws Exception {
561    
562            WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), "RoleRouteModuleTest2");
563            document.route("");
564    
565            // in this case we should have all approve roles for admin, user1 and user2
566    
567            document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("admin"), document.getDocumentId());
568            assertTrue("Approval should be requested.", document.isApprovalRequested());
569            document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user1"), document.getDocumentId());
570            assertTrue("Approval should be requested.", document.isApprovalRequested());
571            document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user2"), document.getDocumentId());
572            assertTrue("Approval should be requested.", document.isApprovalRequested());
573    
574            // examine the action requests, because there was only 1 responsibility on each role, the KEW->KIM integration
575            // transitions the requests from all approve to first approve
576            List<ActionRequest> actionRequests = KewApiServiceLocator
577                    .getWorkflowDocumentService().getRootActionRequests(document.getDocumentId());
578            assertEquals("Should have 3 action requests.", 3, actionRequests.size());
579            int numRoots = 0;
580            for (ActionRequest actionRequest : actionRequests) {
581                assertNotNull(actionRequest.getRequestPolicy());
582                assertEquals(ActionRequestPolicy.FIRST, actionRequest.getRequestPolicy());
583                if (actionRequest.getParentActionRequestId() == null) {
584                    numRoots++;
585                }
586            }
587            assertEquals("There should have been 3 root requests.", 3, numRoots);
588    
589            // let's approve as "user1" and verify the document does NOT go FINAL
590            document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user1"), document.getDocumentId());
591            document.approve("");
592            assertTrue("Document should still be enroute.", document.isEnroute());
593    
594            // verify that admin and user2 still have requests
595            document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("admin"), document.getDocumentId());
596            assertTrue("Approval should be requested.", document.isApprovalRequested());
597            document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user2"), document.getDocumentId());
598            assertTrue("Approval should be requested.", document.isApprovalRequested());
599    
600            // approve as "user2" and verify document is still ENROUTE
601            document.approve("");
602            assertTrue("Document should be ENROUTE.", document.isEnroute());
603    
604            // now approve as "admin", coument should be FINAL
605            document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("admin"), document.getDocumentId());
606            document.approve("");
607            assertTrue("Document should be FINAL.", document.isFinal());
608        }
609    
610        /**
611         * Tests that ActionRequests are regenerated when RoleResponsibilityActions are programmatically changes via the RoleService
612         * (Must be run before tests which alter delegate configuration)
613         */
614        @Test
615        public void testRoleRouteModule_RoleResponsibilityActionUpdate() throws Exception {
616    
617            WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), "RoleRouteModuleTest1");
618            document.route("");
619    
620            // in this case we should have a first approve role that contains admin and user2, we
621            // should also have a first approve role that contains just user1
622    
623            document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("admin"), document.getDocumentId());
624            assertTrue("Approval should be requested.", document.isApprovalRequested());
625            document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user1"), document.getDocumentId());
626            assertTrue("Approval should be requested.", document.isApprovalRequested());
627            document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user2"), document.getDocumentId());
628            assertTrue("Approval should be requested.", document.isApprovalRequested());
629    
630            // examine the action requests
631            List<ActionRequest> actionRequests = KewApiServiceLocator.getWorkflowDocumentService().getRootActionRequests(document.getDocumentId());
632            // there should be 2 root action requests returned here, 1 containing the 2 requests for "BL", and one containing the request for "IN"
633            assertEquals("Should have 3 action requests.", 3, actionRequests.size());
634            int numRoots = 0;
635            for (ActionRequest actionRequest : actionRequests) {
636                // each of these should be "first approve"
637                if (actionRequest.getRequestPolicy() != null) {
638                    assertEquals(ActionRequestPolicy.FIRST, actionRequest.getRequestPolicy());
639                }
640                if (actionRequest.getParentActionRequestId() == null) {
641                    numRoots++;
642                }
643            }
644            assertEquals("There should have been 3 root requests.", 3, numRoots);
645    
646            RoleService roleService = KimApiServiceLocator.getRoleService();
647            Role role = roleService.getRoleByNamespaceCodeAndName(NAMESPACE, ROLE_NAME);
648            assertNotNull(role);
649            Principal user1Principal = KimApiServiceLocator.getIdentityService().getPrincipalByPrincipalName("user1");
650            List<RoleMembership> members = roleService.getRoleMembers(Collections.singletonList(role.getId()), null);
651            // find user1principal
652            RoleMembership m = null;
653            for (RoleMembership rm: members) {
654                if (user1Principal.getPrincipalId().equals(rm.getMemberId())) {
655                    m = rm;
656                    break;
657                }
658            }
659            assertNotNull("Failed to find user1Principal role membership", m);
660            assertEquals(user1Principal.getPrincipalId(), m.getMemberId());
661            List<RoleResponsibilityAction> rras = roleService.getRoleMemberResponsibilityActions(m.getId());
662            assertEquals(2, rras.size());
663            RoleResponsibilityAction rra = rras.get(0);
664            RoleResponsibilityAction.Builder b = RoleResponsibilityAction.Builder.create(rra);
665            b.setActionTypeCode(ActionType.ACKNOWLEDGE.getCode());
666    
667            roleService.updateRoleResponsibilityAction(b.build());
668    
669            // action request should have changed!
670            document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user1"), document.getDocumentId());
671            assertFalse("Approval should NOT be requested.", document.isApprovalRequested());
672            assertTrue("Acknowledge should be requested.", document.isAcknowledgeRequested());
673            document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("admin"), document.getDocumentId());
674            assertTrue("Approval should be requested.", document.isApprovalRequested());
675            document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user2"), document.getDocumentId());
676            assertTrue("Approval should be requested.", document.isApprovalRequested());
677    
678            roleService.deleteRoleResponsibilityAction(rras.get(0).getId());
679    
680            // no actions should be requested of user1 now
681            document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user1"), document.getDocumentId());
682            assertTrue(document.getRequestedActions().getRequestedActions().isEmpty());
683    
684            document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("admin"), document.getDocumentId());
685            assertTrue("Approval should be requested.", document.isApprovalRequested());
686            document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user2"), document.getDocumentId());
687            assertTrue("Approval should be requested.", document.isApprovalRequested());
688    
689            // examine the action requests
690            actionRequests = KewApiServiceLocator.getWorkflowDocumentService().getRootActionRequests(document.getDocumentId());
691            // now should be only 2 requests
692            assertEquals("Should have 2 action requests.", 2, actionRequests.size());
693        }
694    
695        @Test
696        public void testDelegate() throws Exception{
697            this.createDelegate();
698    
699            WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("rkirkend"), "RoleRouteModuleTest2");
700            document.route("");
701    
702            String ewestfalPrincipalId = getPrincipalIdForName("ewestfal");
703    
704            // now our fancy new delegate should have an action request
705            document = WorkflowDocumentFactory.loadDocument(ewestfalPrincipalId, document.getDocumentId());
706            assertTrue("ewestfal should be able to approve", document.isApprovalRequested());
707    
708            // let's look at the action requests, there should be 3 root requests, each one should have a delegation to ewestfal
709            List<ActionRequest> actionRequests = document.getRootActionRequests();
710            assertEquals(3, actionRequests.size());
711    
712            for (ActionRequest actionRequest : actionRequests) {
713                // none of the root requests should be to ewestfal
714                assertFalse(ewestfalPrincipalId.equals(actionRequest.getPrincipalId()));
715                // but all of the delegate requests should!
716                assertEquals(1, actionRequest.getChildRequests().size());
717                ActionRequest delegateRequest = actionRequest.getChildRequests().get(0);
718                assertEquals(ewestfalPrincipalId, delegateRequest.getPrincipalId());
719                assertEquals("Delegation type should been PRIMARY", DelegationType.PRIMARY, delegateRequest.getDelegationType());
720            }
721        }
722    
723        @Test
724        public void testDelegateApproval() throws Exception{
725            this.createDelegate();
726    
727            WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("rkirkend"), "RoleRouteModuleTest2");
728            document.route("");
729    
730            // See if the delegate can approve the document
731            document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("ewestfal"), document.getDocumentId());
732            assertTrue("ewestfal should have an approval request", document.isApprovalRequested());
733            document.approve("");
734    
735            assertTrue("Document should have been approved by the delegate.", document.isFinal());
736        }
737    
738        @Test
739        public void testRoleWithNoMembers() throws Exception {
740            getTransactionTemplate().execute(new TransactionCallback<Object>() {
741                public Object doInTransaction(TransactionStatus status) {
742    
743                    try {
744    
745                        // first let's clear all of the members out of our role
746    
747                        Role role = KimApiServiceLocator.getRoleService().getRoleByNamespaceCodeAndName(NAMESPACE,
748                                ROLE_NAME);
749                        Map<String, String> criteria = new HashMap<String, String>();
750                        criteria.put("roleId", role.getId());
751                        List<RoleMemberBo> roleMembers = (List<RoleMemberBo>) KRADServiceLocator
752                                .getBusinessObjectService().findMatching(RoleMemberBo.class, criteria);
753                        assertFalse("role member list should not currently be empty", roleMembers.isEmpty());
754                        for (RoleMemberBo roleMember : roleMembers) {
755                            //String roleMemberId = roleMember.getRoleMemberId();
756                            //RoleMemberImpl roleMemberImpl = KRADServiceLocatorInternal.getBusinessObjectService().findBySinglePrimaryKey(RoleMemberImpl.class, roleMemberId);
757                            assertNotNull("Role Member should exist.", roleMember);
758                            KRADServiceLocator.getBusinessObjectService().delete(roleMember);
759                        }
760    
761                        List<RoleMembership> roleMemberInfos = KimApiServiceLocator.getRoleService().getRoleMembers(Collections.singletonList(role.getId()), Collections.<String, String>emptyMap());
762                        assertEquals("role member list should be empty now", 0, roleMemberInfos.size());
763    
764                        // now that we've removed all members from the Role, let's trying routing the doc!
765                        WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), "RoleRouteModuleTest1");
766                        document.route("");
767    
768                        // the document should be final now, because the role has no members so all nodes should have been skipped for routing purposes
769    
770                        assertTrue("document should now be in final status", document.isFinal());
771    
772                        // verify that the document went through the appropriate route path
773    
774                        List<RouteNodeInstance> routeNodeInstances = document.getRouteNodeInstances();
775                        assertEquals("Document should have 2 route node instances", 2, routeNodeInstances.size());
776    
777                        return null;
778                    } finally {
779                        status.setRollbackOnly();
780                    }
781                }
782            });
783        }
784    
785    }