Introducción
El presente tutorial pretende mostrar el uso de la herramienta RdnStatemachine que permite modelar Reglas y Lógica de Negocio y generar código fuente Java en función de la tecnología Enterprise JavaBeans (EJB).RdnStatemachine es una herramienta de diseño que se encuentra en fase experimental, programada bajo estándares de modelado MDA y el Eclipse Modeling Framework (EMF). Este prototipo puede contener errores en su ejecución.
Como condición previa se recomienda ver el artículo titulado ARQUITECTURA DE REGLAS DE NEGOCIO BASADA EN MDA.
Ámbito del Tutorial
En el tutorial se modelaran reglas de negocio de tipo validación para una tabla de ejemplo (RECURSOS_CIP) y se generara código fuente EJB para Entity Beans y Session Beans.Pre-requisitos
Los siguientes puntos son pre-requisitos necesarios para ejecutar el tutorial sin mayores inconvenientes:- Conexión a una Base de Datos ORACLE 11g o superior, puede instalarse la versión Express Edition para Windows.
- Tener instalado el esquema HR o crear uno con permisos de CONNECT y RESOURCE en la Base de Datos Oracle, ya que crearemos en este esquema unas tablas de ejemplo. Por mi parte se creó el esquema HR2.
- Tener instalado JDK 1.8 de 64 Bits para Windows también de 64 bits (ejemplo Windows 8).
- Descargar el archivo rdnstatemachine.product-win32.win32.x86_64.zip
- Descargar el archivo scriptRdn.sql
- Descargar el archivo RecursosCipVal.java
- Ejecutar el script scriptRdn.sql, que crea las tablas demo con algunos registros:
- MONEDAS
- DOCUMENTOS_RESPALDO
- CATALOGOS_PROYECTOS
- DIRECCIONES_ADMIN_VER
- ENTIDADES_VER
- RECURSOS_CIP
Como verán todas las tablas tiene los campos API_ESTADO y API_TRANSACCION, estos campos nos sirven para almacenar el último estado y transición ejecutada en la máquina de estados.
Nota.- Se trabajara sobre la tabla RECURSOS_CIP en la misma se crearan las Reglas de Negocio.
Detalle Paso a Paso
1. Descomprima el archivo rdnstatemachine.product-win32.win32.x86_64.zip, en un directorio por ejemplo D:\RdnStatemachine y ejecute rdnstatemachine.exe.2. Confirme el espacio de trabajo (workspace) en el directorio donde instaló RdnStatemachine y presione el botón “Launch”.
3. Maxime la ventana y habilite la ventana de propiedades: Window > Show View > Properties.
4. Crear el proyecto de modelado utilizando: File > New > Project, de la carpeta RDN Statemachine Wizards, seleccione: Nuevo Proyecto RDN y presione el botón Next.
5. Ingrese el nombre del proyecto en Project name: RecursosCip, presione el botón Next.
6. Define los datos para el Modelo, seleccione el checkbox Crear RDN por Defecto (esta opción permitirá crear una máquina de estados básica), presione el botón Next.
7. Ingrese los datos para conectarse a la Base de Datos Oracle: Servidor, Base de Datos, Puerto, Usuario y Password, presione el botón Next.
8. Seleccione una tabla de la Base de Datos, presionando en el botón “Buscar” y luego marcando la tabla “RECURSOS_CIP”, presione el botón “Next”.
9. Al seleccionar la tabla “RECURSOS_CIP”, el programa revisara posibles relaciones de la tabla de una a muchos y de uno a uno, a partir de los foreing keys que contiene la tabla, en nuestro caso no hay relaciones 1 a muchos, por lo tanto presionamos Next.
10. Seleccione las relaciones 1 a 1 de la tabla (este tipo de relaciones nos permitirá crear relaciones del tipo @OneToOne en EJB), marque todas las tablas y presione Next.
11. Introduzca los datos para crear el Session Bean, nombre: RecursosCipService de tipo STATELESS, presione “Next”.
12. Defina los métodos DML que se implementaran en el Session Bean, déjelos marcados todos, presione Next.
13. Defina las clases e interfaces locales y remotas del Session Bean, nombre del Session Bean: RecursosCipService, interfaz local: RecursosCipLocal, interfaz remota: RecursosCipRemote, clase de máquina de estados: StateMachine, presione Next.
14. Finalmente seleccione el viewpoint de Sirius que se creó para el programa y presione Finish.
15. Espere unos minutos, hasta que el programa cree el proyecto y lo configure adecuadamente. En el explorador del proyecto, deberá configurarse con:
- Una carpeta lib que contiene el jar “javaee-api-7.0.jar”
- El archivo de gráficos de Sirius graficos.aird
- El archivo de la máquina de estados recursosCip.statemachine. Ojo no borre estos archivos.
16. También se habilitaran dos editores gráficos uno para la máquina de estados “recursosCip_Estados” que contiene la máquina de estados básica, y el otro un editor para el modelado de clases Java, para mejorar la apariencia de estos gráficos puede utilizar el botón Arrange All de la toolbar de cada editor y mejorar su apariencia manualmente, tal como se muestra a continuación:
Nota.- Todos los cambios realizados a los gráficos tienen que ser grabados.
17. A continuación se explican algunos elementos del modelado creado por el programa:
- Se crearon las siguientes clases para administrar la persistencia de datos:
- RecursosCip de tipo Entity Bean, que representa al tabla RECURSOS_CIP con todos sus atributos y tipos de datos mapeados a clases Java
- RecursosCipPK clase que representa a la llave primaria de la tabla, nótese que existe una relación entre el Entity Bean y la llave Primaria (Entity – Primary Key).
- Serializable clase heredable o super clase, de la cual se implementan las clases RecursosCip y RecursosCipPK.
- Se crearon las siguientes clases para administrar la lógica de negocio:
- RecursosCipService clase de tipo Session Bean, donde se definen atributos propios (como ser el atributo “em” de tipo EntityManager), métodos DML o métodos que permiten emular las operaciones DML sobre la tabla (INSERT, UPDATE, DELETE y la operación CREATE que emula la creación de un registro vacío), métodos propios que pueden tener una lógica particular, métodos RDN o métodos con Lógica o Regla de Negocio asociados automáticamente al crearse una diagrama de Regla de Negocio. Adicionalmente nótese que existe una relación entre esta clase y el Entity Bean (Session – Entity) y otra relación con la clase que representa a la máquina de estados (Session – Statemachine).
- RecursosCipServiceRemote interface remota implementada por el Session Bean RecursosCipService, expone automáticamente métodos DML y métodos propios del Session Bean.
- RecursosCipServiceLocal interface local implementada por el Session Bean RecursosCipService, de manera similar expone automáticamente métodos DML y métodos propios del Session Bean.
- Statemachine clase que representa a la máquina de estados detallada en el diagrama de estados (recursosCip_Estados), en esta clase se definen los estados y las transiciones de la máquina y diferentes métodos que permiten ejecutar y validar una transición, esta clase es creada automáticamente por el programa mediante una templeta Acceleo.
18. En el diagrama de Estados, añada el estado APROBADO y la transición APROBAR, luego grabar el diagrama.
19. A continuación, en el diagrama de Clases se completaran los Entity Beans para representar las tablas de relación uno a uno a la tabla RECURSOS_CIP. En la toolbar del editor hago click en el botón “Importar DB Table”:
20. El programa abrirá un Wizard para importar una tabla de la Base de Datos, en el primer paso ya tendrá llena la información de la conexión a la Base, si quiere puede cambiarle o presionar Next.
21. En la siguiente pantalla, seleccione la tabla ENTIDADES_VER, presionando el botón Buscar y luego marcando la tabla, presione Next.
22. Como la tabla no tendrá una representación de una relación 1 a muchos ni de 1 a 1, presione Finish. El programa le añadirá las clases EntidadesVer y EntidadesVerPK.
23. Repita el proceso para las tablas MONEDAS, DOCUMENTOS_RESPALDO, CATALOGOS_PROYECTOS y DIRECCIONES_ADMIN_VER, luego acomode el gráfico adecuadamente y grabelo.
24. Ahora está en condiciones de generar código Java que represente a los Entity Beans de la aplicación, presione el botón “Generar Entity Beans” de la toolbar y luego revise la carpeta src-gen del proyecto, donde se almacenan los archivos generados por el programa en el paquete bo.com.entities, edite los archivos para ver su contenido.
25. Hasta el momento no hay una gran novedad en el programa, ya que existen muchas herramientas que logran el mismo objetivo y con mejores prestaciones.
26. A continuación, lo que haremos será elaborar lógica de negocio para la clase RecursosCip, algo no muy complicado como por ejemplo validaciones de ciertos atributos de la clase que se ejecuten al momento de insertar un registro. Para ello descarguese el archivo RecursosCipVal.java en una carpeta de su disco, este archivo contiene dos métodos de validación:
- f_entver_es_valida(pa_id_entidad, pa_version, pa_fecha), este método permite validar si un Id de Entidad y versión a una fecha determinada es válida o aprobada en la tabla ENTIDADES_VER.
- f_daver_es_valida(pa_id_da, pa_fecha, pa_version), permite validar si un Id de DA y versión a una fecha dada es válida o aprobada en la tabla DIRECCIONES_ADMIN_VER.
- Nótese que existe el método getConnection() el cual realiza un lookup al DataSource jdbc/recDS del servidor donde se desplegara la aplicación EJB.
27. En el diagrama de Clases, presione el botón “Importar Clase Java Normal al Modelo” de la toolbar.
28. Seleccione el archivo RecursosCipVal.java con el botón Buscar, y luego presione Finish.
29. El programa leerá la clase Java desde el archivo y la incorporara al modelo como una clase Java Normal (incluido el código fuente), reubique la clase en el diagrama y complete la propiedad Paquete a bo.com.services, luego grabe el diagrama.
30. Ahora, crearemos un diagrama de Reglas de Negocio asociado a la transición CREAR de la máquina de Estados, en el explorador de Proyectos ubique “Transition CREAR”, presione click derecho, seleccione New RepresentationReglas de Negocio para Transicion CREAR, puede cambiar el nombre del diagrama y luego presionar botón OK.
31. El programa creara un diagrama vacío. En la paleta de herramientas se habilitaran varios iconos para crear un tipo de Regla o Lógica de negocio a ejecutar en la transición, para nuestro ejemplo crearemos cuatro RDN’s, además cada RDN tendrá asociado 2 parametros del mismo tipo del Entity Bean estos tienen los nombres precNew (representa a un registro con valores nuevos) y precOld (representa al registro con los valores antes de aplicar la transición).
32. Primera Regla, se creara una regla de tipo Comparación que valide que la gestión sea mayor o igual a 1900 (precNew.gestion>=1900), el ámbito de ejecución de la regla será BEFORE INSERT, presione el botón “Compare”, hagla click en un lugar vacío del diagrama y edite la regla como sigue, luego presione Next.
33. Defina el atributo gestión del Entity Bean que se va a comparar su operador y valor de comparación, luego presione next:
34. Escriba el mensaje de error si la regla falla y presione el boton Finish.
35. Segunda Regla, se creara una regla de tipo Lista, que valide que el atributo tipoDeDocumento contenga los valores 'NOR', 'REV', 'CDD' y 'ADD' (precNew.tipoDeDocumento IN ('NOR', 'REV', 'CDD' y 'ADD')), presione el botón “List”, haga click en un lugar vacío del diagrama y edite la regla como sigue, luego presione OK.
36. En el grupo de propiedades Semantic de la regla agregue un mensaje de error adecuado cuando falle la ejecución de la regla: “El valor para el Tipo de Documento no está comprendido en los valores NOR, REV, CDD y ADD”, luego grabe el diagrama.
37. Tercera regla, esta regla de tipo Call Method, ejecutara el método f_entver_es_valida de la clase RecursosCipVal, para esto presione el botón “Call Method”, haga click en un lugar vacío del diagrama y edite la regla como sigue, luego presione Next.
38. Ahora defina la clase y el método que se va a ejecutar desde el modelo y con qué valor se va a comparar el resultado del método, en nuestro caso el método devuelve un valor boolean y su resultado puede ser true or false, si es true el método corrió bien si el false hubo un error, defina esta parte cómo sigue y luego presione Next.
39. Escriba el mensaje de error si la regla falla y presione el botón Finish.
40. Ahora especificaremos los parámetros con los cuales se va a ejecutar el método, en el grupo de propiedades “Parametros para ejecutar método”, seleccione pa_id_entidad y presione el botón Editar, ingrese el parámetro precNew y el atributo identidad, presione OK.
41. De manera similar proceda con los parámetros pa_version y pa_fecha, quedando definido los parámetros como sigue:
42. Cuarta regla, esta regla es de tipo Method, es decir que el desarrollador podrá definir una regla programáticamente, en nuestro caso ejecutara el método f_daver_es_valida de la clase RecursosCipVal, para esto presione el botón “Method”, haga click en un lugar vacío del diagrama y edite la regla como sigue, luego presione Next.
43. Ahora se define el código del método, que se lo puede hacer en dos partes, en la primera se definen las variables locales al método y en la segunda parte el cuerpo en si del método, defina como sigue el código del método y presione Finish.
44. El diagrama de Reglas de Negocio para la transición CREAR debería quedar como sigue, si desea cambiar el orden de ejecución de cada regla puede hacerlo cambiando el numero asociado a la misma.
45. Ahora está en condiciones para generar código Java que represente al Session Bean y la máquina de estados de la aplicación, seleccione el diagrama de Clases, presione el botón “Generar Session Beans” de la toolbar y luego revise la carpeta src-gen del proyecto, donde se almacenan los archivos generados por el programa en el paquete bo.com.services, edite los archivos para ver su contenido.
46. También deberá generar las clases Java normales como RecursosCipVal, presionando el botón “Generar Clases Java Normales”. En el explorar del proyecto los archivos generados deberán quedar como sigue.
47. Examine los archivos generados y analice como se crearon las reglas de negocio en el código. Puede que haya algunos problemas de importación de clases, en el modelo puede añadir a la clase RecursosCipService las importaciones faltantes y luego volver a generar código fuente que es lo recomendable.
48. Finalmente con los archivos generados en src-gen puede construir una aplicación EJB, por ejemplo en NetBeans y testearlo.
Para finalizar, espero les haya parecido interesante la herramienta RdnStatemachine y como mencione al comienzo, está en etapa de prototipo experimental, pueden encontrar varios bugs.
A futuro la intención es añadirle modelado de Reglas mediante Tablas de Decisión utilizando el estándar OMG Decision Model Notation (DMN).
Espero sus comentarios, hasta la próxima.