2.5. Discussion
2.5.2. Assessing the variability of Phragmites aboveground biomass using RapidEye imagery
El lenguaje OCL sirve para agregar restricciones a modelos UML y para hacer que el modelo de la aplicación sea más específico. Por lo que no es adecuado para usar en esta tesis, ya que los modelos que se usan ya son lo suficientemente detallados y no se necesita más especificación. Otra de las razones es que no es propiamente un lenguaje de transformación. Sin embargo lenguajes como ATL y QVT están basados en algunos conceptos de OCL.
Los lenguajes ATL y QVT están enfocados a realizar transformaciones de modelo a modelo. Para este trabajo, no se pretende realizar un modelo de los documentos WSDL y BPEL. Y por lo tanto estos dos lenguajes no son los indicados para ser usados en la transformación. El lenguaje XSLT realiza transformaciones de documentos XML a XML. Esto no es lo que se busca, debido a que nuestro objetivo no es transformar archivos XML y darles formato.
En base a los lenguajes descritos, se ha concluido que el lenguaje adecuado para aplicar en esta tesis es MOFScript. Ya que este lenguaje y herramienta se ajusta a las características deseadas del producto resultante de la tesis (descripciones de los servicios Web en WSDL y la composición en BPEL).
MOFScript como lenguaje proporciona la sintaxis para crear las reglas de transformación y como herramienta permite convertir un modelo basado en un metamodelo MOF en un archivo de texto.
3.3.1 Lenguaje MOFScript
A continuación se describen las construcciones del lenguaje MOFScript.
3.3.1.1 Transformación de texto
Un Texttransformation define el nombre del módulo. El nombre puede ser cualquiera y es independendiente del nombre de archivo. Para definirlo se puede usar indistintamente
texttransformation o textmodule.
Define el metamodelo de entrada en términos de un parámetro.
texttransformation transformacionUML (in uml:"http://www.eclipse.org/uml2/1.0.0/UML"))
Puede tener varios modelos como entrada y estos deben de separarse por comas.
3.3.1.2 Reglas del punto de entrada
Las reglas del punto de entrada definen donde empieza la ejecución de la transformación. Puede tener un contexto (en el ejemplo uml.Model), el cual define que tipo de elemento del
Capítulo 3 Lenguajes de transformación
34
metamodelo será el punto de inicio para la ejecución. El cuerpo de la regla contiene declaraciones.
uml.Model::main () {
self.ownedMember->forEach(p:uml.Package) {
p.mapPackage() }
}
Un punto de entrada puede tener un tipo de contexto con varias instancias. En ese caso el punto de entrada será ejecutado para cada instancia del tipo.
uml.Class::main () {
‘class: ’ self.name }
Tanto las reglas generales como las reglas del punto de entrada puede ser especificadas sin tipo de contexto. Un punto de entrada de este tipo será ejecutada una vez. La declaración se hace usando la palabra module o sin ninguna palabra. Para recuperar el modelo de entrada usando este enfoque, el parámetro del modelo para la transformación debe ser usado (en este caso uml), combinado con la operación objectsOfType para recuperar los objetos contenidos en el modelo.
module::main () {
uml.objectsOfType (uml.Package) }
main () {
uml.objectsOfType (uml.Package) }
3.3.1.3 Reglas
Las reglas son como funciones. Pueden tener un tipo de contexto, el cual es un tipo de metamodelo. También pueden retornar un valor. El cuerpo de una regla contiene un conjunto de declaraciones.
uml.Package::mapPackage () {
self.ownedMember->forEach(c:uml.Class) c.mapClass()
}
uml.Class::mapClass(){
file (package_dir + self.name + ext)
self.classPackage()
self.standardClassImport ()
self.standardClassHeaderComment () ‘
Capítulo 3 Lenguajes de transformación 35 self.classConstructor() ‘ /* * Attributes */ ‘
self.ownedAttribute->forEach(p : uml.Property) { p.classPrivateAttribute()
}
newline(2) ‘}’ }
Una regla puede regresar un valor, el cual puede ser reutilizado en expresiones en otras reglas. La declaración result es usada para regresar un valor.
uml.Package::getFullName (): String {
if (self.owner != null)
result = self.owner.getFullName() + "."
elseif (self.ownerPackage != null)
result = self.ownerPackage.getFullName() + "."
result += self.name.toLower().replace(" ", "_"); }
Una regla puede tener parámetros.
uml.Model::testParameters2 (s1:String, i1:Integer) {
stdout.println("testParameters2: " + s1 + ", " + i1)}
uml.Model::testParameters3 (s1:String, r2:Real, b1:Boolean, package:uml.Package) {
stdout.println("Package:" + package.name)
stdout.println ("testParameters3: " + s1 + ", " + r2 + ", " + b1 + " " + package.name)}
3.3.1.4 Propiedades y variables
Una propiedad es una constante, una variable puede cambiar su valor durante el tiempo de ejecución.
property nombrePaquete:String = “org.mypackage”
var miEntero=7
3.3.1.5 Archivos
La palabra clave file permite la generación de un archivo de salida. Se puede especificar la ruta de la salida.
file (c.name + “.java”)
file (“c:\tmp\” + c.name + “.java”)
file f2 (“test.java”)
Capítulo 3 Lenguajes de transformación
36
3.3.1.6 Declaración de impresión
Las declaraciones de impresión proporcionan salida a un dispositivo de salida, el cual puede ser un archivo o la salida en pantalla.
println (“public class” + c.name)
3.3.1.7 Otras opciones
MOFScript permite hacer uso de iteradores (while, forEach), condicionales (if, else if). El iterador forEach puede iterar cadenas, enteros, listas. Además se pueden invocar métodos externos de java. Se pueden manipular cadenas, realizar operaciones con enteros e igualmente con listas. Además, cuenta con operaciones de utilidad y del sistema.
3.3.2 Herramienta MOFScript
La herramienta MOFScript es una implementación del lenguaje de transformación de modelo a texto MOFScript. Soporta el análisis sintáctico, verificación y ejecución de scripts MOFScript. Fue desarrollado por Sintef ICT en el proyecto MODELWARE soportado por la Unión Europea [OLDE06b].
MOFScript es implementado como un conjunto de plug-ins de Eclipse, los cuales necesitan ser instalados para funcionar dentro de este ambiente. La versión de Eclipse en la que se ha probado que funciona MOFScript y que se está usando es Eclipse 3.3.2. Los plug- ins usados son: ANTLR 4.1.1, EMF 2.3.2, UML2 2.1.1 y por último MOFScript 1.3.3.
Los archivos que usa la herramienta MOFScript para guardar y ejecutar las reglas de transformación tienen la extensión “*.m2t”.
37