4. Creación del lenguaje de modelado para los servicios declarativos
4.3. Perfil UML para los servicios declarativos
4.3.1. Resumen de los elementos del perfil
Los estereotipos de este perfil se resumen a continuación:
Nombre Clase Base
<<Component>> Class <<Service>> Class <<Properties>> Class <<Property>> Class <<Provide>> Assocation <<Reference>> Association <<Declares>> Association Tabla 4: Elementos del perfil
4.3.2. <<Component>>
Descripción
Un componente contiene una descripción que es interpretada en tiempo de ejecución para crear y desechar objetos dependiendo de la disponibilidad de otros servicios, la necesidad de dicho objeto o los datos de configuración del mismo. Dichos objetos pueden de manera opcional además proveer un servicio.
Representación UML para <<Component>>
Elemento del metamodelo Nombre del estereotipo Clase Base de UML Superclase (del metamodelo)
Component, Implementation, Service <<Component>> Class NA
Definición de valores etiquetados para <<Component>>
Nombre del estereotipo Valor Etiquetado Tipo del valor etiquetado Valor por omisión Definición del valor etiquetado
<<Component>> name String requerido Especificado por el usuario
enabled Boolean true
factory String no requerido Especificado por el usuario
immediate Boolean no requerido
delayed Boolean no requerido
implementationClass String requerido Especificado por el usuario
serviceFactory Boolean no requerido
Restricciones de <<Component>>
OCL :
package DeclarativeServices context Component
inv:
self.connection -> select(isStereotyped('Provide'))->size() >= 0
Existe cero o muchas asociaciones «Reference» para cada <<Component>>:
self.connection -> select(isStereotyped('Reference'))->size() >= 0
Existe cero o varias asociaciones «Declares» para cada <<Component>>:
self.connection -> select(isStereotyped('Declares'))->size() >= 0
Si immediate es verdadero entonces factory debe estar vacío y delayed debe ser falso
self.immediate = true implies self.factory -> isEmpty() and self.delayed = false
Si delayed es verdadero entonces factory debe estar vacío e immediate debe ser falso
self.delayed = true implies self.factory->isEmpty() and self.immediate = false
Si el componente es de tipo factory entonces immediate y delayed deben ser falsos
self.factory -> NotEmpty() implies self.immediate = false and self.delayed = false
endpackage
4.3.3. <<Service>>
Descripción
Especifica las interfaces que ofrece un componente para ofrecer o referenciar un servicio. Representación UML para <<Service>>
Elemento del metamodelo Nombre del estereotipo Clase Base de UML Superclase (del metamodelo)
Provide,Service <<Service>> Class NA
Definición de valores etiquetados para <<Service>>
Nombre del
estereotipo Valor Etiquetado Tipo del valor etiquetado Valor por omisión Definición del valor etiquetado
<<Service>> interface String requerido Especificado por el usuario
Restricciones de <<Service>>
OCL :
package DeclarativeServices context Service
inv:
Existe una asociación «Provide» para cada «Service»:
Existe una o más asociaciones «Reference» para cada «Service»:
self.connection -> select(isStereotyped('Reference'))->size() >= 0 endpackage
4.3.4. <<Properties>>
Descripción.
Un componente puede definir una serie de propiedades, que serán utilizadas para su configuración. En este caso las propiedades están en un archivo dentro del bundle
Representación UML para <<Properties>>
Elemento del metamodelo Nombre del estereotipo Clase Base de UML Superclase (del metamodelo)
Properties <<Properties>> Class NA
Definición de valores etiquetados para <<Properties>>
Nombre del
estereotipo Valor Etiquetado Tipo del valor etiquetado Valor por omisión Definición del valor etiquetado
<<Properties>> entry String requerido Especificado por el usuario
Restricciones de <<Properties>>
package DeclarativeServices context Properties inv:
Existe sólo una asociación «Requires» para cada Properties:
self.connection -> select(isStereotyped('Requires'))->size() = 1 endpackage
4.3.5. <<Property>>
Definición
Un componente puede definir una serie de propiedades, que serán utilizadas para su configuración. En este caso las propiedades se definen en la misma descripción del componente.
Representación UML para <<Property>>
Elemento del metamodelo Nombre del estereotipo Clase Base de UML Superclase (del metamodelo)
Property <<Property>> Class NA
4.3.5.1.Definición de valores etiquetados para Property.
Nombre del
estereotipo Valor Etiquetado Tipo del valor etiquetado Valor por omisión Definición del valor etiquetado
value String no requerido Especificado por el usuario
type javaTypes ‘String’ ‘String’, ‘Long’, ‘Double’, ‘Float’, ‘Integer’, ‘Byte’, ‘Char’, ‘Boolean’, ‘Short’
body String no requerido Especificado por el usuario
Restricciones de <<Property>>
package DeclarativeServices context Property
inv:
Existe sólo una asociación «Requires» para cada Property:
self.connection -> select(isStereotyped('Requires'))->size() = 1
Si value esta vacío implica que body debe de tener asignado un valor.
self.value->isEmpty() implies not self.content -> isEmpty() endpackage
4.3.6. <<Reference>>
Definición
La mayor parte de los bundles requerirá de otros servicios del registro de servicios. Estas dependencias son definidas vía referencias a los servicios requeridos.
Representación UML para <<Reference>>
Elemento del metamodelo Nombre del estereotipo Clase Base de UML Superclase (del metamodelo)
Reference <<Reference>> Association NA
4.3.6.1.Definición de valores etiquetados para Reference.
Nombre del
estereotipo Valor Etiquetado Tipo del valor etiquetado Valor por omisión Definición del valor etiquetado
<<Reference>> name String requerido Especificado por el usuario
targetFilter String no requerido Especificado por el usuario
bind String no requerido Especificado por el usuario
unbind String no requerido Especificado por el usuario
cardinality Cardinality ‘1..1’ ‘1..1’, ‘1..n’, ‘0..1’, ‘0..n’
policy Policy ‘static’ ‘static’, ‘dinamic’
Restricciones de <<Reference>>
OCL :
package DeclarativeServices context Reference inv:
self.isStereotyped('Reference')
La asociación es de tipo binario
self.connection->size() = 2
Una relación de tipo «Reference» tendrá una entidad «Component» de un lado y una entidad «Service» del otro:
self.connection -> exists(participant.isStereotyped('Component')) and self.connection-> exists(participant.isStereotyped('Service'))
La cardinalidad del lado «Component» es 1
self.connection -> exists(participant.isStereotyped('Component')) and multiplicity.min = 1 and multiplicity.max = 1
La cardinalidad del lado «Service» es 1
self.connection -> exists(participant.isStereotyped('Service')) and multiplicity.min = 1 and multiplicity.max = 1
endpackage
4.3.7. <<Provide>>
Definición
Un componente puede ofrecer un servicio, para establecer que interfaces de servicios proveerá un componente se utilizará la relación <<Provide>>.
Representación UML para <<Provide>>
Elemento del metamodelo Nombre del estereotipo Clase Base de UML Superclase (del metamodelo)
Provide <<Provide>> Association NA
Definición de valores etiquetados para <<Provide>>
Nombre del
estereotipo Valor Etiquetado
Tipo del valor etiquetado
Valor por omisión
Definición del valor etiquetado
Provide NA NA NA NA
Restricciones de <<Provide>>
OCL : package DeclarativeServices context Provide
inv:
La relación debe estereotiparse «Provide»
self.isStereotyped('Provide')
self.connection->size() = 2
Una relación de tipo «Provide» tendrá una entidad «Service» de un lado y una entidad «Component» del otro:
self.connection -> exists(participant.isStereotyped('Provide')) and self.connection-> exists(participant.isStereotyped('Component'))
La cardinalidad del lado «Service» es 1
self.connection -> exists(participant.isStereotyped('Provide')) and multiplicity.min = 1 and multiplicity.max = 1
La cardinalidad del lado «Provide» es 1
self.connection -> exists(participant.isStereotyped('Component')) and multiplicity.min = 1 and multiplicity.max = 1
endpackage
4.3.8. <<Declares>>
Definición
Algunas veces la instancia del componente requiere ser parametrizada por medio de propiedades definidas por el usuario, estas propiedades serán agregadas a un componente vía la relación <<Declares>>.
Representación UML para <<Declares>>
Elemento del metamodelo Nombre del estereotipo Clase Base de UML Superclase (del metamodelo)
Property, Properties, specifies,
parametrizes <<Declares>> Association NA
4.3.8.1.Definición de valores etiquetados para Declares
Nombre del
estereotipo Valor Etiquetado Tipo del valor etiquetado Valor por omisión Definición del valor etiquetado
Declares NA NA NA NA
Restricciones de <<Declares>>
OCL : package DeclarativeServices context Declares
inv:
La relación debe estereotiparse «Declares»
self.isStereotyped('Declares')
La asociación es de tipo binario
Una relación de tipo «Declares» tendrá una entidad «Component» de un lado y una entidad «Properties» o «Property» del otro:
self.connection ->
exists(participant.isStereotyped('Component')) and
( self.connection-> exists(participant.isStereotyped('Property')) or self.connection-> exists(participant.isStereotyped('Properties')) )
La cardinalidad del lado «Component» es 1
self.connection -> exists(participant.isStereotyped('Component')) and multiplicity.min = 1 and multiplicity.max = 1
La cardinalidad del lado «Properties» es 1 o la cardinalidad del lado «Property» es 1
self.connection -> exists(participant.isStereotyped('Properties')) and multiplicity.min = 1 and multiplicity.max = 1 or
self.connection -> exists(participant.isStereotyped('Property')) and multiplicity.min = 1 and multiplicity.max = 1
endpackage
La figura 26 muestra los elementos del perfil UML de los servicios declarativos de OSGi. En ésta se puede apreciar además de las clases del perfil tres clases adicionales estereotipadas como
Enumeration. Estas se utilizan para definir nuevos tipos de datos y el conjunto de valores que pueden
tomar, por ejemplo se puede notar que en la clase Reference existe un valor etiquetado llamado policy, que recordando es la forma en que el Componente de servicio manejará el ligado con otros servicios, que puede ser de dos formas: estático y dinámico, estos valores son listados en una enumeración para permitir que el valor etiquetado sólo pueda tomar cualquiera de los dos. También existen enumeraciones para listar los valores que pueden tomar la cardinalidad y el tipo de dato de una propiedad.