lunes, 11 de enero de 2016

Creación de Perfiles UML con Papyrus


UML es el lenguaje de modelado más extendido y utilizado en la especificación y documentación de cualquier sistema informático. Pero como UML tiene una notación genérica muchas veces es necesario contar con un lenguaje más específico para modelar  determinados conceptos particulares. Los perfiles UML (UML Profiles) son mecanismos que permiten extender la sintaxis y semántica de UML con el objetivo de expresar conceptos específicos de un dominio de aplicación.

En este artículo analizaremos los mecanismos de extensión que permiten definir un perfil UML, estudiaremos los elementos que conforman los perfiles y  de manera práctica elaboraremos el perfil EJB para extender clases Java con la finalidad de modelar elementos y componentes de la tecnología Enterprise Java Beans utilizando la herramienta de modelado Papyrus.

Perfiles UML

Como mencionamos previamente UML incluye un mecanismo de extensión en el propio lenguaje que permite definir lenguajes de modelado que son derivados de UML. De forma más precisa, el paquete “Profiles” de UML 2.0 define una serie de mecanismos para extender y adaptar las metaclases de un metamodelo cualquiera a las necesidades concretas de una plataforma (como puede ser .NET o J2EE) o de un dominio de aplicación (tiempo real, modelado de procesos de negocio, etc.).  

Existen varias razones para que un diseñador de sistemas quiera extender un metamodelo entre las cuales podemos citar las siguientes:

  • Disponer de una terminología y vocabulario propio de un dominio de aplicación o de una plataforma de implementación concreta (por ejemplo, poder manejar dentro del modelo del sistema terminología propia de EJB como “sesión bean”, “entity bean”, “remote interface”, “local interface”, etc.). 
  • Definir una sintaxis para construcciones que no cuentan con una notación propia. 
  • Definir una nueva notación para símbolos ya existentes, más acorde con el dominio de la aplicación objetivo (poder usar, por ejemplo, una figura con un ordenador en lugar del símbolo para representar un nodo que por defecto ofrece UML para representar ordenadores en una red). 
  • Añadir cierta semántica que no aparece determinada de forma precisa en el metamodelo (por ejemplo, la incorporación de prioridades en la recepción de señales en una máquina de estados de UML). 
  • Añadir cierta semántica que no existe en el metamodelo (por ejemplo relojes, tiempo continuo, etc.).
  • Añadir restricciones a las existentes en el metamodelo, restringiendo su forma de utilización (por ejemplo, impidiendo que ciertas acciones se ejecuten en paralelo dentro de una transición, o forzando la existencia de ciertas asociaciones entre las clases de un modelo). 
  • Añadir información que puede ser útil a la hora de transformar el modelo a otros modelos, o a código.
Un Perfil se define en un paquete UML, estereotipado con la etiqueta «profile». En un perfil se definen un conjunto de restricciones o “constraints” a través  del uso de “metaclases” definidos en el paquete. Para extender una metaclase se utiliza el elemento estereotipo o “stereotype”.

Los estereotipos son clases que contienen un conjunto de atributos que se conocen como valores etiquetados o “tagged values”.

Finalmente un perfil UML puede definir clases, estereotipos, data types, primitive types y enumerations. La siguiente figura ilustra la definición de un paquete Profile.

Descripción de un paquete UML Profile.

Desde la versión UML 2.4 el paquete Profile, tiene el atributo URI, que sirve como identificador único del paquete, este concepto se introdujo con la finalidad de poder intercambiar perfiles usando XMI. El formato URI para definir el identificador del Profile es el siguiente:

uri ::= http://qualified-profile-parent /profile-version /profile-name.xmi

El siguiente diagrama muestra un ejemplo de identificación de un Profile con URI:


Profile UML con identificador URI

Metaclases

Una Metaclase es una clase del paquete Profile de tipo “packageable element” la cual puede ser extendida por uno o más estereotipos utilizando una asociación especial.

Una metaclase puede ser mostrada con el estereotipo «metaclass» en la parte superior o antes del nombre de la metaclase.

Estereotipo con una extensión especial a una metaclase

Estereotipo

Un estereotipo es una clase del Profile la cual se define como una metaclase existente que puede ser extendida como parte del Profile. Permite su uso en la definición de una plataforma, o en un dominio específico o como notación de adición a un elemento.

Un estereotipo no puede usarse por sí solo, debe ser utilizado extendiendo  de una metaclase en particular.

Un estereotipo usa la misma notación de una clase, con la palabra «stereotype» mostrándose antes o por encima de su nombre.

Un estereotipo  puede cambiar la apariencia gráfica del modelo extendido usando iconos relacionados, representados por la clase Profile “Image”.

Estereotipo con icono relacionado

Ya que un estereotipo es una clase, la misma puede tener “propiedades”, las propiedades de un estereotipo son conocidas como “Tag definitions”. Cuando el estereotipo se aplica a un elemento del modelo, los valores de sus propiedades son conocidas como “Tagged values”.


Estereotipo con propiedades e icono relacionado.

Aplicación de Estereotipos

Una vez definido un estereotipo, este puede ser aplicado o utilizado en diagramas de Casos de Uso, diagramas de Clases, diagramas de Despliegue, etc.

Cuando el estereotipo se aplica a un elemento del modelo, se enlaza una instancia del estereotipo a la instancia de la metaclase. El nombre del estereotipo aplicado se muestra por encima o al lado del elemento. Si se aplican múltiples estereotipos al mismo elemento, los nombres de los estereotipos aplicados se muestran como una lista separada por comas. Cuando un estereotipo incluye la definición de un icono, el icono se grafica al lado del elemento del modelo extendido por el estereotipo. Todo elemento del modelo que tiene una representación gráfica puede tener atachado un icono.

Diferentes aplicaciones de Estereotipos que incluyen iconos

Generalización de Estereotipos

Un estereotipo debe ser utilizado en conjunción con la metaclases que la extiende. Una metaclase puede ser extendida por uno o más estereotipos. Cada estereotipo puede extender una o más metaclases. Un estereotipo puede generalizarse o especializarse solo de otro estereotipo.

Generalización de un estereotipo

Propiedades de un estereotipo

Las propiedades de un estereotipo se conocen como metapropiedades o “tag definitions”.

Esterotipo con Metapropiedades

Cuando un esterotipo se aplica a un elemento del modelo, los valores de sus propiedades se conocen como “tagged values”. Un tagged value es un par llave-valor que puede ser atachado a cualquier clase de elementos del modelo. La clase se la conoce como “tag”, cada tag representa a una clase particular de propiedad, el tag y su valor se codifican como cadenas de strings.

Desde la especificación UML 1.x los tagged values tienen la forma: nombre = valor, si existe más de un tagged value, se forman listas de pares nombre=valor separados por comas  por ejemplo:  {author="Joe Smith", deadline=31-March-1997, status=analysis}.

Para representar tags de tipo booleano, estas propiedades deben tener la forma {isPropiedad=boolean}, por ejemplo para representar la propiedad es abstracto se deberá aplicar el tag de la forma: {isAbstract=true}, la misma propiedad es equivalente a usar únicamente el nombre de la propiedad: {abstract}.

Aplicación de estereotipo con tagged-values

Los tagged values también pueden ser mostrados en un compartimiento debajo del nombre del estereotipo.

Aplicación de un estereotipo con tagged-values en un compartimiento

También es válido mostrar los tagged values atachados a un comentario al lado del estereotipo aplicado.

 Aplicación de un estereotipo con tagged-values en un comentario

Perfil UML para la Plataforma Enterprise Java Beans

Según la definición de Wikipedia los Enterprise JavaBeans o EJB son una de las interfaces de programación de aplicaciones que forman parte del estándar de construcción de aplicaciones empresariales J2EE. 

Los EJB proporcionan un modelo de componentes distribuido estándar del lado del servidor.  El objetivo de los EJB es dotar al programador de un modelo que le permita abstraerse de los problemas generales de una aplicación empresarial (concurrencia, transacciones, persistencia, seguridad, etc.) para centrarse en el desarrollo de la lógica de negocio.

Tipos de EJB

Existen tres tipos de EJB:

EJB de Entidad (Entity EJB): su objetivo es encapsular los objetos del lado del servidor que almacena los datos. Los EJB de entidad presentan la característica fundamental de la persistencia.

EJB de Sesión (Session EJB): gestionan el flujo de la información en el servidor. Generalmente sirven a los clientes como una fachada de los servicios proporcionados por otros componentes disponibles en el servidor. Puede haber dos tipos:

  • Con estado (stateful): en un bean de sesión con estado, las variables de instancia del bean almacenan datos específicos obtenidos durante la conexión con el cliente.
  • Sin estado (stateless): los beans de sesión sin estado son objetos distribuidos que carecen de estado asociado permitiendo por tanto que se los acceda concurrentemente.
EJB dirigidos por Mensajes (Message-driven EJB): son los únicos beans con funcionamiento asíncrono. Usando el Java Messaging System (JMS), se suscriben a un tema (topic) o a una cola (queue) y se activan al recibir un mensaje dirigido a dicho tema o cola.

Interfaces EJB

Un Session Bean puede ser declarado de tipo local o remoto. Un Session Bean declarado como local estará destinado a servir solicitudes de otros componentes dentro de la misma Java Virtual Machine (JVM - Máquina Virtual Java) donde está desplegados (dicho con otras palabras, dentro del contenedor donde se ejecuta la aplicación). El contenedor pasará la referencia que apunta al objeto en cuestión al cliente, pues dentro de la misma JVM está referencia es válida. 

Por otro lado, un Session Bean declarado como remoto está destinado a servir peticiones de clientes externos al propio contenedor.

Perfil EJB

La definición formal del Metamodelo y perfil UML para Java y Especificación EJB puede encontrarse en el documento titulado “UML Profile for Java and EJB Version 1.0”, escrito por la OMG.

La especificación EJB 3.0 define sesión beans de tipo stateful y stateless, también define clientes de session beans de tipo local y remoto. Además define los tres tipo de EJB’s Session Beans, Entity Beans y Message Driven Beans. Adicionalmente se define un descriptor de despliegue (META-INF/ejb-jar.xml) que define el almacenamiento de los componentes EJB en un archivo Jar.

A continuación se ilustra el perfil EJB 3.0 de manera simplificada.

Perfil UML simplificado para EJB 3.0

Creación del Perfil EJB con Papyrus

A continuación desarrollaremos un tutorial para crear el Perfil EJB utilizando la herramienta de modelado de Eclipse Papyrus.

Papyrus se considera una herramienta de diseño integrado a la plataforma Eclipse capaz de editar cualquier clase de modelos EMF y UML 2, además está relacionado con el lenguaje de modelado SysML. Papyrus ofrece  al desarrollador editores de diagramas para modelado de lenguaje EMF y por supuesto UML 2 y SysML, también ofrece soporta para editar Perfiles  UML y también permita a los usuarios definir editores para lenguajes DSL’s basados en el estándar UML.

Para instalar Papyrus en Eclipse puede hacerlo desde esta URL .

Creación del Proyecto Papyrus ProfileEJB

Una vez instalado Papyrus, debemos crear un proyecto Papryrus que lo denominaremos ProfileEJB. Seleccione la opción “New” → “Other…” → “Papyrus → Papyrus Project” → “Next”.


Ingrese el nombre del proyecto “ProfileEJB” y presione “Next”.


Seleccione el lenguaje de los Diagramas a “Profile”, presione “Next”.


Ingrese el nombre del diagrama “ProfileEJB”  y seleccione la opción “A UML profile with basic primitive types…” y presione “Finish”.



Papyrus, habilitara una ventana de edición para el Perfil UML, al lado derecho se habilitara una paleta de herramientas disponible para crear los componentes del Profile.


Creación del Paquete Profile

Por lo general, los componentes del Profile deberán registrarse en un paquete, a continuación crearemos dicho paquete en el diagrama.

Selección la opción “Profile” de la paleta de herramientas y arrástrela hacia el diagrama, luego en la ventana de propiedades seleccione la opción “Advanced” e ingrese en la propiedad “Name” el valor “EJB” y en la propiedad “URI” el valor “http://ProfileEJB/1.0/ProfileEJB.xmi”


Creación de los Estereotipos

Para crear un estereotipo se utilizara la opción “Stereotype” de la paleta de herramientas y la arrastraremos dentro del paquete Profile, luego introducimos el nombre del estereotipo.


Importación de Metaclases

Una vez creados los estereotipos, se necesitara importar las metaclases UML las cuales serán extendidas por el Profile. Primero se selecciona la opción “Import Metaclass” de la paleta de herramientas, se arrastra hasta el paquete y al soltar la opción, Papyrus desplegara un cuadro de dialogo en el cual se especifica la metaclase que se desea importar. En nuestro caso para el estereotipo EJB se importara la Metaclase “Class”.


Para los estereotipos “Remote Bussines Interface”, “Local Bussines Interface” y “Message Listener Interface”, se importara la metaclase “Interface”.


El diagrama deberá quedar de la siguiente forma:


Creación de las Extensiones

Una vez que se crearon los estereotipos y se importaron las metaclases, se deberá modelar las relaciones de extensión entre el estereotipo y la metaclase. Estas relaciones se crean utilizando la opción “Extension” de la paleta de herramientas. A continuación se definirán las extensiones entre la metaclase “Class” al estereotipo “EJB” y de los estereotipos “Remote”, “Local” y “Message Listener Interface” a la metaclase “Interface”, quedando el diagrama como sigue:


Generalización de Estereotipos

Cuando se diseña un Profile, es posible la reutilización de estereotipos existentes definidos en el mismo profile o en otros profiles. Estereotipos pueden ser generalizados permitiendo la creación de estereotipos hijos que heredan las características de uno o más estereotipos generalizados definidos localmente en el profile o externamente en otros profiles.

Para crear la generalización de un estereotipo se utiliza la opción “Generalization” de la paleta de herramientas. Para nuestro ejemplo generalizaremos los esterotipos “EntityEJB”, “SessionEJB” y “MessageEJB” del estereotipo “EJB”, y los estereotipos “StatelessEJB” y “StatefulEJB” de “SessionEJB”, el diagrama quedara de la siguiente forma.


Al grabar el diagrama Papyrus le preguntara si  quiere definir el Profile, seleccione la opción “Yes”.


Papryus le mostrara una ventana para definir el Profile, llene la información necesaria y presione “Ok”.


Creación de un Proyecto de aplicación del Profile EJB

A continuación crearemos un proyecto que ilustre el uso y aplicación del Profile EJB. Seleccione la opción “New” → “Other…” → “Papyrus → Papyrus Project” → “Next”, ingrese como nombre del proyecto “Demo”, seleccione el lenguaje del proyecto como “UML”, luego seleccione un diagrama de clases inicial del proyecto “UML Class Diagram”, seleccione la opción “A UML with basic primitive types (ModelWithBasic Types)”, ingrese como nombre del diagrama “EJB Demo”, presione “Finish” para terminar. Deberá tener un editor para diagrama de clases como sigue:


Ahora importaremos el profile EJB al diagrama de clases creado. De la ventana de propiedades  “Properties” del editor, seleccione la página “Profile” y presione el botón “Apply Profile” (botón +).


En la ventana “Apply Profiles”, seleccione del proyecto ProfileEJB el archivo “model.profile.uml” y presione Ok.


De la ventana “Choose profile(s) to apply”, seleccione “Profile” y “EJB” y presione “Ok”.


Aplicación de los Estereotipos del Profile EJB a los elementos del Diagrama.

Finalmente crearemos una clase y una interface (Persona y PersonaService) en el diagrama, a las cuales aplicaremos los estereotipos del Profile EJB, una representara un Entity Bean y la otra un Session Bean sin estado. El diagrama deberá quedar como sigue:


Para aplicar el estereotipo Entity Bean, seleccione la clase “Persona”, seleccione la ventana “Properties”, seleccione el tabpage “Profile”, presione a opción “Apply Stereotipe” (botón +), en la ventana “Apply Stereotype” seleccione el estereotipo EntityEJB y presione el botón “Ok”.


Finalmente realizamos a misma operación para aplicar el estereotipo Local Bussines Interface a la interface “PersonaService”.

El diagrama deberá quedar como sigue:


Puede descargar el proyecto completo de aquí.

Conclusiones

La aplicación de Perfiles a MDA es una práctica adecuada, para modelar sistemas de plataforma específica, si bien existen herramientas paga que permiten este uso, se puede constatar que con la herramienta de software libre Papyrus, se logra la misma experiencia.

En próximos artículos, analizaremos transformaciones Model-To-Text que permitan generar código a partir de modelos realizados con Papyrus y Perfiles UML.

Hasta la próxima…