воскресенье, 8 ноября 2015 г.

Пользовательские задачи Oracle BPM 12c: пример реализации ограничения перечня пользователей для операции "Делегирование"

По умолчанию задачу в Oracle BPM можно переназначить или делегировать на любого пользователя, роль и группу. Но можно ограничить этот перечень создав класс в BPM-проекте (в терминах JDeveloper), который реализует интерфейс oracle.bpel.services.workflow.task.IRestrictedAssignmentCallback.

Рассмотрим пример в котором нужно ограничить перечень пользователей для операции "Делегирование" следующим образом:
  • Если исполнителем задачи является группа или роль, то делегировать можно только пользователям из состава этой группы или роли;
  • Если исполнителем задачи является пользователь, то делегировать нельзя (пустой перечень доступных для делегирования пользователей).
Пример кода:
 import java.util.ArrayList;  
 import java.util.Collections;  
 import java.util.List;  
 import java.util.Map;  
   
 import oracle.bpel.services.workflow.IWorkflowConstants;  
 import oracle.bpel.services.workflow.task.IRestrictedAssignees;  
 import oracle.bpel.services.workflow.task.IRestrictedAssignmentCallback;  
 import oracle.bpel.services.workflow.task.impl.RestrictedAssignees;  
 import oracle.bpel.services.workflow.task.impl.TaskAssignee;  
 import oracle.bpel.services.workflow.task.model.Task;  
   
 import oracle.tip.pc.services.common.ServiceFactory;  
 import oracle.tip.pc.services.identity.BPMAppRole;  
 import oracle.tip.pc.services.identity.BPMAuthorizationService;  
 import oracle.tip.pc.services.identity.BPMGroup;  
 import oracle.tip.pc.services.identity.BPMIdentityService;  
 import oracle.tip.pc.services.identity.BPMUser;  
   
 import oracle.bpel.services.workflow.task.model.IdentityType;  
   
 public class RestrictedAssignmentCallbackImpl implements IRestrictedAssignmentCallback {  
   
   public IRestrictedAssignees getPermittedAssignees(Task task, Map map, String currentUser, String identityContext,  
                            String operation) {  
     List assignees = new ArrayList();  
     if (operation.equals(IRestrictedAssignmentCallback.OperationType.REASSIGN.toString())) {  
       //TODO реализовать логику для операции "Переназначение"  
     } else if (operation.equals(IRestrictedAssignmentCallback.OperationType.DELEGATE.toString())) {  
       try {  
         BPMIdentityService idenService = getIdentityServiceInstance(identityContext);  
         List<IdentityType> assigneesList = task.getSystemAttributes().getAssignees();  
         for (IdentityType assignee : assigneesList) {  
           if (IWorkflowConstants.IDENTITY_TYPE_GROUP.equals(assignee.getType())) {  
             List<BPMUser> usersInGroup =  
               idenService.getParticipantsToGroup(assignee.getDisplayName(), true);  
             for (BPMUser user : usersInGroup) {  
               assignees.add(new TaskAssignee(user.getName(), IWorkflowConstants.IDENTITY_TYPE_USER));  
             }  
           } else if (IWorkflowConstants.IDENTITY_TYPE_APPLICATION_ROLE.equals(assignee.getType())) {  
             List<BPMUser> usersInGroup =  
               idenService.getParticipantsToAppRole(assignee.getDisplayName(),  
                                  task.getApplicationContext(), false);  
             for (BPMUser user : usersInGroup) {  
               assignees.add(new TaskAssignee(user.getName(), IWorkflowConstants.IDENTITY_TYPE_USER));  
             }  
           } else if (IWorkflowConstants.IDENTITY_TYPE_USER.equals(assignee.getType())) {  
             // Пустой список  
             return new RestrictedAssignees(new ArrayList(), true);  
           }  
         }  
   
       } catch (Exception ex) {  
         ex.printStackTrace();  
       }  
     }   
   
     if (!assignees.isEmpty()) {  
       return new RestrictedAssignees(assignees, true);  
     }  
   
     return null;  
   }  
   
   public List<IRestrictedAssignmentCallback.OperationType> getRestrictedOperations(Task task, Map map,  
                                            String currentUser,  
                                            String identityContext) {  
     return Collections.emptyList();  
   }  
   
   private BPMAuthorizationService getAuthorizationService(String realmName) {  
     return ServiceFactory.getAuthorizationServiceInstance(realmName);  
   }  
   
   private BPMIdentityService getIdentityServiceInstance(String realmName) {  
     return ServiceFactory.getIdentityServiceInstance(realmName);  
   }  
 }  
   


Комментариев нет:

Отправить комментарий