DSL 3 - Uso de una función de dominio
|
Comenzando
Este paso del tutorial utiliza como punto de partida la solución "initial" del proyecto. Si en cualquier momento quieres ver la solución de este paso, la encontrarás en "add_domain_function" dentro de solutions. |
¿Qué es una función de dominio?
Una "Función de dominio" es cualquier proceso que necesites realizar dentro de los límites de tu dominio. Puede ser un conjunto de cosas como cálculos sencillos, mapeos o invocación de reglas de negocio.
Objetivo
Queremos que nuestro flujo realice una comprobación de duplicados usando una función de dominio. Enviaremos nuestro pacs.008 a la comprobación de duplicados y esperamos que devuelva o bien un éxito (no es duplicado) o un fallo (es duplicado).
Configuración del DSL
Añadir la función de dominio
Primero creemos una nueva biblioteca de funciones de dominio donde alojaremos nuestra función. Desde el navegador de la izquierda, haz clic derecho sobre el modelo:
Luego haz clic derecho y selecciona New > v2Flo > Domain Function Library. Cuando se te solicite, introduce un nombre y descripción para la biblioteca así:
Ahora pulsa el botón "Add Domain Function"; esto añadirá una nueva fila a la tabla.
Para empezar, añadamos el nombre y la descripción de nuestra función de dominio; son simples campos de texto libre:
-
Name - Duplicate Check
-
Description - A simple duplicate check
A continuación debemos elegir los datos de negocio que enviaremos a nuestra función de dominio. En este caso enviaremos la transferencia de crédito del cliente (pacs.008) en sí. Para hacerlo, usaremos la capacidad de selección de MPS pulsando "CTRL + SPACE"; esto presentará una lista de posibles elementos de datos disponibles. Selecciona "Customer Credit Transfer".
|
Tras usar "CTRL+SPACE" para mostrar las opciones, puedes empezar a escribir y esto reducirá las opciones a aquellas que coincidan con lo que has escrito. |
Ahora necesitamos definir la respuesta a nuestra función de dominio. Para ello simplemente pulsa "RETURN" en la casilla de respuesta para generar una nueva respuesta y, para las propiedades de nuestra respuesta:
-
Para el nombre usaremos "Duplicate Check Response"
-
Para la descripción usaremos "A response from the duplicate check"
-
Para nuestra comprobación de duplicados, no esperamos que devuelva datos de negocio, así que podemos dejarlo en blanco; pero aquí podrías añadir datos de negocio pulsando de nuevo "CTRL + SPACE" en la casilla y seleccionando de entre las opciones de datos de negocio.
-
Para los códigos de respuesta, como solo necesitamos una respuesta positiva y otra negativa, podemos usar los códigos incorporados "AcceptOrReject". Así que aquí también usamos "CTRL + SPACE" para mostrar las opciones y elegimos "AcceptOrReject".
-
Para nuestra comprobación de duplicados, no necesitamos preocuparnos por códigos de razón, así que los ignoraremos por ahora.
-
Para la marca de finalización, dejaremos el valor por defecto.
Volverás sobre las marcas de finalización en un tutorial posterior.
Si has introducido todo correctamente, la definición de tu función de dominio debería verse así:
Ya tenemos definida nuestra función de dominio, así que ¿cómo la usamos dentro de nuestro flujo?
Llamar a la función de dominio
Actualmente, en nuestro flujo, en la iniciación simplemente pasamos directamente al estado de completo:
Ahora cambiaremos esto para llamar a nuestra función de dominio y, si tiene éxito, pasar al estado de completo, pero en caso de fallo, pasar a un nuevo estado de rechazado.
Así que primero crearemos dos estados nuevos:
-
Duplicate Checking: será el estado en el que se encuentra el flujo mientras se realiza la comprobación de duplicados.
-
Rejected: será nuestro estado de fallo cuando la comprobación de duplicados haya fallado.
Añadámoslos al flujo pulsando el botón "Add State" dentro de la sección de estados del flujo y configurándolos como sigue:
Comentemos brevemente los otros valores que hemos configurado aquí:
En nuestro caso:
-
El estado de comprobación de duplicados está a mitad del flujo mientras el proceso aún está en curso y se espera más trabajo; por ello seleccionamos el estado global
PENDINGy marcamos el estado como no terminal. -
El estado de rechazado ocurre cuando el flujo ha terminado sin éxito, así que usamos el estado global
REJECTEDy, como no se espera más trabajo, lo marcamos como un estado terminal.
Otra cosa que quizá notes en la captura anterior (y en tu implementación) es que los dos nuevos estados aparecen subrayados en rojo. Esto es algo común en MPS: los errores se marcan con subrayado rojo; si pasamos el ratón sobre el subrayado veremos que ambos errores se deben a que los estados aún no se usan en el flujo. Corregirás esto a continuación.
|
A veces puede ser difícil situar el cursor sobre el error; en esos casos hay otras dos opciones: En el lado derecho del flujo habrá pequeñas líneas rojas indicando dónde están los errores; pasa el ratón por encima para ver el error. Si pulsas "ALT+ENTER" en cualquier lugar del flujo aparecerá la ventana emergente de intenciones; una de las opciones será "Validate Flow". Si la seleccionas, aparecerá la ventana de validación del flujo mostrando claramente los errores como:
|
Eventos
Puesto que tenemos dos posibles resultados (pasar o fallar la comprobación), añadiremos dos nuevos eventos:
-
Duplicate Check Passed
-
Duplicate Check Failed
Haz esto pulsando el botón "Add Event" y completando los detalles.
Comportamientos de entrada
Ahora añadiremos los comportamientos de entrada para manejar las respuestas de la función de dominio. Pulsa el botón "Add Input Behaviour" y configura:
-
Un comportamiento que, cuando reciba la respuesta con código Accepted, genere el evento "Duplicate Check Passed".
-
Otro comportamiento que, cuando reciba la respuesta con código Rejected, genere el evento "Duplicate Check Failed".
Comportamientos de evento
Finalmente, conectemos todo en los comportamientos de evento del flujo. En la iniciación, en lugar de completar inmediatamente, pasaremos al estado "Duplicate Checking" y realizaremos la acción de llamar a la función de dominio "Duplicate Check".
Luego, cuando ocurra "Duplicate Check Passed", moveremos el flujo al estado Complete.
Y cuando ocurra "Duplicate Check Failed", moveremos el flujo al estado Rejected.
Con esto, la definición del flujo queda completa para esta parte.
Implementación en Java
Cambiemos ahora a IntelliJ y veamos cómo enchufamos esto en nuestro código de implementación. Como de costumbre, empezaremos ejecutando una build desde una ventana de terminal en la raíz del proyecto:
mvn clean install
Una vez construido, podremos ver el puerto generado para nuestra función de dominio junto con las interfaces necesarias para su implementación e invocación en el código de la aplicación.
A continuación, añade una implementación de ejemplo en la configuración de tu aplicación (por ejemplo, en IpfTutorialConfig), retornando Accepted para simplificar mientras pruebas el flujo.
Comprobación de nuestra solución
Arranca la aplicación como antes (puedes ver recordatorios en Revisión de la aplicación inicial del tutorial).
Envía un pago y comprueba, en la GUI del desarrollador, que se generan los eventos de comprobación de duplicados y que el flujo progresa al estado correcto en función del resultado.