Em algumas situações de projetos de automatização de processos de negócio utilizando o Oracle BPM 11g, somos questionados sobre a possibilidade de exibir a tela nativa de uma tarefa humana em outro ambiente, como por exemplo um software web externo do cliente.
A boa notícia!
Isto é possível através da invocação de APIs do produto, que podem capturar a URL específica de uma tarefa humana.
A mágica…
Precisamos estar autenticados no BPM para obter a URL que desejamos. Devemos fazer isso de forma programática, então através do uso de algumas classes de apoio (que falaremos a seguir), vamos realizar os seguintes passos:
- instanciar a factory linkada com o BPM
- criar dois contextos (de um usuário administrador e do usuário final)
- descobrir o processo correto
- criar/obter uma tarefa
- obter a URL da tarefa
As classes de apoio estão no bpm-services.jar, que está localizado dentro dos módulos SOA do JDeveloper. Este é o caminho padrão para o jar, que pode ser diferente conforme a instalação do JDeveloper:
C:\Oracle\Middleware\jdeveloper\soa\modules\oracle.soa.workflow_11.1.1\bpm-services.jar
Seguem os exemplos de código de cada passo:
Instanciar a BPMServiceClientFactory
public static BPMServiceClientFactory getBPMServiceClientFactory() { Map properties = new HashMap(); properties.put(IWorkflowServiceClientConstants.CONNECTION_PROPERTY.CLIENT_TYPE, WorkflowServiceClientFactory.REMOTE_CLIENT); properties.put(IWorkflowServiceClientConstants.CONNECTION_PROPERTY.EJB_PROVIDER_URL, "t3://yourhost:7001"); properties.put(IWorkflowServiceClientConstants.CONNECTION_PROPERTY.EJB_INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); return BPMServiceClientFactory.getInstance(properties, null, null); }
Criar os contextos
public static IBPMContext getIBPMContext(String adminUsername, String adminPassword, String processUserUsername) throws Exception { //first context IBPMContext adminContext = getBPMServiceClientFactory() .getBPMUserAuthenticationService() .authenticate(adminUsername, adminPassword.toCharArray(), null); //second and final context return getBPMServiceClientFactory() .getBPMUserAuthenticationService() .authenticateOnBehalfOf(adminContext, processUserUsername); }
Descobrir o processo e a tarefa corretos
public Task getTask(String compositeDN, String processName) throws Exception { IProcessMetadataService service = getBPMServiceClient().getProcessMetadataService(); IBPMContext bpmContext = getIBPMContext("admin", "senhaadmin", "zeca"); ListinitiableTasks = service.getInitiatableProcesses(bpmContext); ProcessMetadataSummary pms = null; for(ProcessMetadataSummary process :initiableTasks) { if(process.getProcessName().equals(processName)) { pms = process; break; } } IInstanceManagementService ims = getBPMServiceClient().getInstanceManagementService(); Task task = ims.createProcessInstanceTask( bpmContext, pms.getCompositeDN() + "/" + pms.getProcessName()); return task; }
Finalmente… Obter a URL da tarefa
private String getTaskDisplayURL(Task task) throws Exception { Map parameters = new HashMap(); parameters.put(Constants.BPM_WORKLIST_TASK_ID, task.getSystemAttributes().getTaskId()); parameters.put(Constants.BPM_WORKLIST_CONTEXT, getIBPMContext().getToken()); String url = WorklistUtil.getTaskDisplayURL( factory.getWorkflowServiceClient(), getIBPMContext(), task, null, "worklist", parameters); return url; }
Com estes pequenos passos é possível obter a URL de uma tarefa humana do Oracle BPM e invocar a tela nativa feita em ADF para exibir em pop-ups, janelas ou até mesmo dentro de algum site de negócio.
As assinaturas destes métodos são apenas uma sugestão de uso. Existem muitas outras opções nas classes da API que podem atender diversas necessidades de negócio, então o desenvolvedor pode modificar estes métodos ou criar outros conforme for mais conveniente.
Ficou alguma dúvida sobre este assunto ou gostaria de entender tecnicamente alguma outra peculiaridade do Oracle BPM? Escreva sua dúvida ou sugestão nos comentários!