i
Agente Basado en “Clase Java”
Para la creación de un agente de tipo Java se deben realizar los siguientes pasos:
•Crear la clase Java a utilizar por el agente.
•Copiar la clase al contexto. Ubicarla en su paquete dentro del WEB-INF.
•Definir el Agente en Deyel.
A continuación se detalla cómo realizar la creación de un agente para determinar un rol a partir de un campo del formulario.
Creación de la regla Java
Procederemos a crear el agente en una clase Java que llamaremos: BTAgenteEjemplo.
La misma debe extender de la superclase BTWorkflowAgentExecutor y debe pertenecer al paquete com.consist.workflow.common.agents.
La funcionalidad del agente del ejemplo va a ser la de devolver un rol para ser utilizado en un proceso determinado. El rol va a ser elegido a partir de un valor almacenado en un campo del formulario a considerar. En este ejemplo utilizaremos un formulario llamado Z88, y el campo cdCircunscripcion del mismo.
Implementación de la clase Java
Dentro de la clase creada, deberemos sobrescribir uno de los métodos de la superclase especificada:
executeAgent(WorkflowAgentExecutorContext pContext).
Los agentes devuelven como resultado un participante, este puede ser un usuario, una unidad organizacional o un rol.
La lógica del agente se implementa para resolver quien es el participante a partir de una situación dada del caso, como por ejemplo un valor de un campo del formulario (mencionado anteriormente).
Dentro de este método especificaremos la lógica necesaria para determinar el valor del campo en cuestión. Para eso va a ser necesario obtener el caso correspondiente, luego obtener el formulario, y finalmente el valor de su campo.
Una vez obtenido el valor del campo, dependiendo del mismo, definiremos que rol va a retornar el agente.
Por ejemplo: si tiene valor 002 se le va a asignar al Rol CONT003, caso contrario al CONT001.
En el código siguiente se explican métodos utilizados del api del motor de workflow que recuperan los datos del caso y del formulario:
Esto se realiza utilizando estos métodos dado que la clase del agente (que extiende de los agentes del workflow) heredan los métodos que permiten acceder a los valores “contextuales” del caso.
Por ejemplo:
Para obtener el caso:
BODocument xBODocument = pContext.getBtEngine().getCurrentDocument();
String xNroCaso = xBODocument.getDocumentKey();
Lectura de un formulario:
BTDigitalDocument xBTZ88 = new BTDigitalDocument(pContext.getPoolIdentifier());
BODigitalDocument xBOZ88 = xBTZ88.readDocument("Z88", "idForm", xIdZ88);
Retorna el participante
addParticipant(xBORole);
Código del ejemplo:
package com.consist.workflow.common.agents;
import com.consist.commonFunctions.jdbc.JDBCPoolAccess;
import com.consist.frameworks.businessTask.accessLayer.PoolIdentifier;
import com.consist.workflow.server.BO.BODocument;
import com.consist.workflow.server.BO.BOStandardActivity;
import java.util.ArrayList;
import java.util.List;
import com.consist.commonFunctions.log.BT.BTSystemLog;
import com.consist.seguridad.server.BO.role.BORole;
import com.consist.seguridad.server.BT.role.BTRole;
import java.sql.Connection;
import xmlGenerator.validation.BODigitalDocument;
import xmlGenerator.validation.BTDigitalDocument;
/**
*
* @author Cristian
*/
public class BTAgenteEjemplo extends BTWorkflowAgentExecutor {
@Override
public void executeAgent(WorkflowAgentExecutorContext pContext) throws Exception {
BTSystemLog.println("-->EJECUCIÓN DE AGENTE DE EJEMPLO");
/**
* Obtenemos la actividad actual
*/
BOStandardActivity xActivity = pContext.getIdAgent().getBOStandardActivityAssigned();
if (xActivity != null) {
/*Obtenemos el caso*/
BODocument xBODocument = pContext.getBtEngine().getCurrentDocument();
String xNroCaso = xBODocument.getDocumentKey();
/*Consultamos la tabla anexo para identificar el formulario*/
Connection xConnection = ((JDBCPoolAccess) pContext.getPoolIdentifier().getJDBCPoolIdentifier().getPoolAccess()).getSession();
String xQuery = "select ID_ANEXO FROM documento_anexo where DOCUMENT_KEY = ? AND TP_ANEXO = 'Z88'";
BTSystemLog.println("-->El nro de caso a buscar es: " + xNroCaso);
java.sql.PreparedStatement pst = xConnection.prepareStatement(xQuery);
pst.setString(1, xNroCaso);
java.sql.ResultSet rs = pst.executeQuery();
Integer xIdZ88 = 0;
if (rs.next()) {
String id = rs.getString("ID_ANEXO");
String[] partes = id.split("@");
xIdZ88 = Integer.parseInt(partes[2]);
BTSystemLog.println("-->El id del formulario Z88 es: " + xIdZ88);
}
rs.close();
if (xIdZ88 != 0) {
/**
* Obtenemos el BO y BT correspondiente para obtener el valor
* del campo
*/
BTDigitalDocument xBTZ88 = new BTDigitalDocument(pContext.getPoolIdentifier());
BODigitalDocument xBOZ88 = xBTZ88.readDocument("Z88", "idForm", xIdZ88);
if (xBOZ88 != null) {
/*Obtenemos el valor del campo cdCircunscripcion*/
String xValue = (String) xBTZ88.getAttribute(xBOZ88, "cdCircunscripcion");
/*Establecemos un participante: ROL como default*/
String xCdParticipant = "CONT001";
if (xValue != null && !"".equals(xValue) && "002".equals(xValue)) {
xCdParticipant = "CONT003";
}
/*Obtenemos el Rol y lo agregamos como participante para el Lane que se usa en el proceso*/
BORole xBORole = new BORole();
xBORole.setCdRole(xCdParticipant);
BTRole xBTRole = new BTRole(pContext.getPoolIdentifier());
xBORole = xBTRole.readRole(xBORole);
if (xBORole != null) {
addParticipant(xBORole);
}
}
}
}
}
}
Copiar la Clase y el .class
Se deben copiar ambos archivos al directorio del contexto del sistema:
WEB-INF\classes\com\consist\workflow\common\agents\
Se recomienda copiar el .java junto al .class para que quede el fuente disponible para futuros cambios, siendo necesario únicamente el .class para la ejecución del agente.
Una vez copiada la clase debe reiniciarse el contexto (esto depende de la configuración del APP_SERVER)
Definir el Agente
Para agregar un agente al sistema debemos dirigirnos al menú Configuraciones > Agentes > Crear.
Allí ingresaremos un código para el agente el cual es único. Para ese ejemplo utilizaremos Ejemplo.
En la siguiente actividad deberemos especificar que se trata de un agente del tipo Clase Java. Deberemos completar una descripción para identificar al agente más fácilmente y completar el campo ejecutor: este campo almacena el nombre de la clase que implementa al agente.
El ejecutor deberá ser: com.consist.workflow.common.agents.nombreDeMiAgente
Para nuestro ejemplo la pantalla quedaría de la siguiente manera: