Oracle BPM 11g: Disponibilizando uma tarefa humana fora do workspace

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!

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>