lunes, 19 de mayo de 2014

Serie: Oracle BPM 11g - Organización - Parte 2: Roles Paramétricos y Propiedades Extendidas de Usuario

Esta entrada es la segunda parte de una serie de entradas relacionadas al uso de los componentes de Organización dentro de proyectos implementados con Oracle BPM.

Parte 1: Unidades Organizacionales

Los Roles Paramétricos, como su nombre indica, nos permiten parametrizar, según diversos criterios, los roles que podemos utilizar para asignar una tarea a uno o varios usuarios.

Para poder definir los criterios que parametrizan un rol, Oracle BPM se integra con el sistema de LDAP usado, para gestionar identidades, para obtener información relacionada. Por ejemplo: número telefónico, correo electrónico, dirección, jefe, etc.



Normalmente los sistemas LDAP no contienen toda la información que podrían y esta información no siempre es consistente.

Ante este tipo de problemas, Oracle BPM Workspace incluye una funcionalidad llamada "User Extended Properties", que no son más que datos relacionados a los usuarios que pueden ser utilizados por el proceso, por Roles Paramétricos o pueden ser obtenidos a través de la API de BPM.

Propiedades Extendidas de Usuario

En esta entrada, mostraré como crear, mantener y utilizar las propiedades extendidas de usuario para utilizarlas dentro de un proyecto con Oracle BPM.

Crear Propiedades

Para crear una propiedad existe un espacio dentro de la aplicación Business Process Workspace donde se pueden crear propiedades y asignarlas a los usuarios, grupos o roles de aplicación.



Este modo tiene una gran limitación (o bug): No se pueden crear propiedades de tipo "FREE STRING" o texto libre, ni fecha, que constan en la documentación de Oracle (Link: "Value—The value field is meaningful only when the property is assigned the data type string because only string typed properties can be assigned enumerations of values. For all other data types (number, date and freeform text) no values can be assigned to the property")

Si bien es una limitante el no poder crear este tipo de propiedades por medio del BPM Workspace, aquí brindo un proyecto en JDeveloper para conectarse al servidor de procesos (BPM) y agregar nuevas propiedades a través de la API de BPM. No soporta crear propiedades del tipo String porque requiere agregar valores. Pueden descargar el proyecto de GitHub y mejorarlo :-)

    public void createUserExtendedProperty(String propertyName,
                                           PropertyType propertyType) {
        try {
            beginConnection();

            IBPMServiceClient bpmServiceClient =
                clientFactory.getBPMServiceClient();

            IBPMOrganizationService bpmOrganizationService =
                bpmServiceClient.getBPMOrganizationService();

            ParticipantProperty participantProperty =
                new ParticipantProperty();

            participantProperty.setName(propertyName);
            participantProperty.setPropertyType(propertyType.name());

            bpmOrganizationService.createParticipantProperty(bpmContext,
                                                             participantProperty);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeConnection();
        }
    }




Utilizar Propiedades

El uso más común de las propiedades extendidas de usuario es para definir las condiciones de los roles paramétricos, pero y que si queremos utilizar esta información desde nuestra aplicación? 
Utilizando la misma API de BPM podemos obtener la información. Está en el mismo proyecto de GitHub.

    public List<ParticipantProperties> getParticipantsProperties(List<String> participantsNames) {

        List<ParticipantProperties> participantsProperties =
            new ArrayList<ParticipantProperties>();

        try {
            beginConnection();

            IBPMServiceClient bpmServiceClient =
                clientFactory.getBPMServiceClient();

            IBPMOrganizationService bpmOrganizationService =
                bpmServiceClient.getBPMOrganizationService();

            List<Participant> participantes = new ArrayList<Participant>();

            for (String participantName : participantsNames) {
                PrincipleRefType principleRef = new MemberType();
                principleRef.setName(participantName);
                principleRef.setRealm("jazn.com");
                principleRef.setType(ParticipantTypeEnum.USER);

                Participant participante = new Participant(principleRef);

                participantes.add(participante);
            }

            participantsProperties =
                    bpmOrganizationService.getPropertiesOfParticipants(bpmContext,
                                                                       participantes);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeConnection();
        }

        return participantsProperties;
    }


Git: JDeveloper Project

Tomar en cuenta que las librerías como API de BPM son (dentro de una instalación de SOA Suite)


  • [ORACLE_SOA_SUITE_HOME]\soa\modules\oracle.bpm.client_11.1.1\oracle.bpm.bpm-services.client.jar
  • [ORACLE_SOA_SUITE_HOME]\soa\modules\oracle.bpm.client_11.1.1\oracle.bpm.bpm-services.interface.jar
  • [ORACLE_SOA_SUITE_HOME]\soa\modules\oracle.bpm.client_11.1.1\oracle.bpm.client.jar
  • [ORACLE_SOA_SUITE_HOME]\soa\modules\oracle.bpm.client_11.1.1\oracle.bpm.web-resources.jar
  • [ORACLE_SOA_SUITE_HOME]\soa\modules\oracle.soa.workflow_11.1.1\bpm-services.jar
  • [ORACLE_SOA_SUITE_HOME]\soa\modules\oracle.soa.workflow_11.1.1\bpm-workflow-datacontrol.jar
  • [ORACLE_SOA_SUITE_HOME]\soa\modules\oracle.soa.workflow_11.1.1\oracle.soa.workflow.jar
  • [ORACLE_SOA_SUITE_HOME]\soa\modules\oracle.soa.workflow_11.1.1\oracle.soa.workflow.wc.jar
  • [ORACLE_SOA_SUITE_HOME]\soa\modules\oracle.soa.worklist_11.1.1\adflibTaskListTaskFlow.jar
  • [ORACLE_SOA_SUITE_HOME]\soa\modules\oracle.soa.worklist_11.1.1\adflibWorklistComponents.jar
  • [ORACLE_SOA_SUITE_HOME]\soa\modules\oracle.soa.worklist_11.1.1\adflibWorkspaceFramework.jar
  • [ORACLE_SOA_SUITE_HOME]\soa\modules\oracle.soa.worklist_11.1.1\oracle.soa.worklist.jar
  • [ORACLE_SOA_SUITE_HOME]\soa\modules\oracle.bpm.runtime_11.1.1\oracle.bpm.metadata.jar
Modificar las rutas en la librería BPMClient del proyecto de JDeveloper.

Roles Paramétricos

Los Roles Paramétricos son ideales cuando existen factores muy puntuales para asignar una tarea, por ejemplo: La tarea de aprobación debe ser asignada al supervisor especializado en maquinaria pesada. En esta caso, la especialización del supervisor es muy rara encontrarla en el LDAP o base de datos, normalmente es información que se encuentra conoce entre los propios empleados. Para esto podemos utilizar las Propiedades Extendidas y luego crear un Rol Paramétrico con las condicionales de Rol: Supervisor, y especialización : Maquinarias Pesadas.

Una vez definidas las propiedades extendidas de usuario, podemos crear roles paramétricos con propiedades que no provengan del LDAP. 

A continuación se muestra como definir los roles paramétricos desde BPM Workspace, enlazarlos desde el modelo de procesos BPMN y probar la asignación utilizando el mismo proceso que el post anterior:

1. Crear un nuevo Rol Paramétrico en BPM Workspace, crear un parámetro y asignar los siguientes valores:


Con el grupo definido y la variable creada hay que guardar los cambios para modificar la Human Task:

2. En la definición de la Human Task, desde BPM Studio, hay que buscar el Rol Paramétrico creado, y definir que variable del proceso va a contener el valor de la variable:


Desplegar y probar la asignación de usuario: