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 }