20.02.2015 Views

ESTADO DEL ARTE - LITE - Universidad Rey Juan Carlos

ESTADO DEL ARTE - LITE - Universidad Rey Juan Carlos

ESTADO DEL ARTE - LITE - Universidad Rey Juan Carlos

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

INGENIERÍA INFORMÁTICA<br />

Curso Académico 2003/2004<br />

Proyecto de Fin de Carrera<br />

SerXML<br />

Serialización en XML de objetos Java<br />

Tutores: Víctor Fresno Fernández y<br />

Soto Montalvo Herranz<br />

Autor: David Arbona Navarro


This work is licensed under the Creative Commons Attribution-ShareAlike<br />

License. To view a copy of this license, visit http://creativecommons.org/licenses/bysa/2.0/<br />

or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford,<br />

California 94305, USA.


A Vane, por estar siempre a mi lado.<br />

A Víctor, por su apoyo y ayuda.<br />

A Soto, por su dedicación.<br />

A Mica, por aportarme sus conocimientos.<br />

A toda mi familia por comprenderme y darme todo su apoyo.<br />

Y a todos aquellos, que de una forma u otra<br />

han ayudado y colaborado en este proyecto.


II<br />

Índice general<br />

ÍNDICE DE TABLAS....................................................................................................................V<br />

ÍNDICE DE ILUSTRACIONES................................................................................................. VI<br />

1. INTRODUCCIÓN...........................................................................................................................1<br />

2. <strong>ESTADO</strong> <strong>DEL</strong> <strong>ARTE</strong>.....................................................................................................................6<br />

2.1. HERRAMIENTAS DE SERIALIZACIÓN EN XML DE OBJETOS JAVA ......................................7<br />

2.1.1. Criterios de evaluación de un serializador en XML de objetos Java.....................7<br />

2.1.2. Estudio comparativo ..............................................................................................9<br />

2.1.2.1. JSX 2.2.3.2 ..................................................................................................................... 12<br />

2.1.2.2. Castor XML 0.9.5.3........................................................................................................ 14<br />

2.1.2.3. XStream 1.0.2................................................................................................................. 16<br />

2.1.2.4. JOX 1.17......................................................................................................................... 17<br />

2.1.2.5. Koala KOML 1.21.......................................................................................................... 19<br />

2.2. CONCLUSIONES ..............................................................................................................21<br />

3. METODOLOGÍAS Y TECNOLOGÍAS.....................................................................................25<br />

3.1. METODOLOGÍA ...............................................................................................................25<br />

3.1.1. PUD .....................................................................................................................25<br />

3.2. TECNOLOGÍAS SOFTWARE...............................................................................................28<br />

3.2.1. Orientación a objetos ...........................................................................................28<br />

3.2.2. Java ......................................................................................................................30<br />

3.2.3. API JavaCET........................................................................................................31<br />

3.2.4. XML......................................................................................................................33<br />

3.2.5. SAX y DOM..........................................................................................................34<br />

3.2.6. DTD y XML Schema.............................................................................................36<br />

4. EJEMPLO DE USO......................................................................................................................38<br />

5. ESPECIFICACIÓN DE REQUISITOS......................................................................................45<br />

5.1. DESCRIPCIÓN GENERAL ..................................................................................................46<br />

5.1.1. Perspectiva del producto......................................................................................46<br />

5.1.2. Funciones del producto........................................................................................47<br />

5.1.3. Características del usuario ..................................................................................47


III<br />

5.2. REQUISITOS ESPECÍFICOS................................................................................................47<br />

5.2.1. Interfaces..............................................................................................................47<br />

5.2.1.1. Ventana de la aplicación................................................................................................. 48<br />

5.2.1.2. Diálogos.......................................................................................................................... 49<br />

5.2.2. Requisitos funcionales..........................................................................................52<br />

5.2.2.1. Requisitos para generar el documento Java para la serialización/deserialización........... 53<br />

5.2.2.2. Requisitos para generar el documento DTD ................................................................... 58<br />

5.2.2.3. Requisitos para generar el documento XML Schema..................................................... 58<br />

5.2.2.4. Requisitos para el manejo del documento de configuración........................................... 58<br />

5.2.2.5. Requisitos relativos al manejo de la interfaz.................................................................. 60<br />

5.2.3. Requisitos no funcionales.....................................................................................62<br />

5.2.3.1. Fiabilidad........................................................................................................................ 62<br />

5.2.3.2. Documentación............................................................................................................... 63<br />

5.2.3.3. Portabilidad..................................................................................................................... 63<br />

5.2.3.4. Prestación ....................................................................................................................... 63<br />

5.2.3.5. Recursos ......................................................................................................................... 64<br />

5.2.3.6. Seguridad........................................................................................................................ 64<br />

5.3. DIAGRAMAS DE CASOS DE USO .......................................................................................64<br />

5.3.1. Descripción textual del flujo principal y flujos alternativos ................................67<br />

5.3.2. Formalización de la descripción de casos de uso ................................................68<br />

6. ANÁLISIS......................................................................................................................................70<br />

6.1. ANÁLISIS DE LOS CASOS DE USO .....................................................................................71<br />

6.1.1. Caso de uso Abrir documento ..............................................................................71<br />

6.1.2. Caso de uso Generar Java2XML .........................................................................72<br />

6.2. DIAGRAMA DE PAQUETES ...............................................................................................73<br />

7. DISEÑO .........................................................................................................................................74<br />

7.1. DISEÑO DE LA INTERFAZ.................................................................................................75<br />

7.1.1. Obtención de los parámetros de configuración ...................................................76<br />

7.2. DISEÑO DE LA GENERACIÓN DE LOS DOCUMENTOS.........................................................78<br />

7.3. DISEÑO DE LA SERIALIZACIÓN Y DESERIALIZACIÓN........................................................80<br />

7.4. ARQUITECTURA <strong>DEL</strong> SISTEMA.........................................................................................82<br />

7.5. DISTRIBUCIÓN EN PAQUETES ..........................................................................................83<br />

8. IMPLEMENTACIÓN Y PRUEBAS...........................................................................................84<br />

8.1. RELACIÓN DE APROXIMACIONES UTILIZADAS EN LA IMPLEMENTACIÓN .........................85<br />

8.2. PRUEBAS ........................................................................................................................87<br />

9. CONCLUSIONES Y TRABAJOS FUTUROS...........................................................................90<br />

9.1. PRINCIPALES LOGROS ALCANZADOS...............................................................................90<br />

9.2. TRABAJOS FUTUROS .......................................................................................................91<br />

9.2.1. Integración de SerXML como plugin para los entornos de desarrollo ................92


IV<br />

9.2.2. Utilización de toda la riqueza semántica ofrecida en el lenguaje J2SE 1.5.........92<br />

9.2.3. Uso de SerXML en diversos programas reales ....................................................92<br />

9.2.4. Utilizar la metaprogramación para realizar la serialización ..............................93<br />

BIBLIOGRAFÍA ................................................................................................................................94<br />

ANEXO A............................................................................................................................................96<br />

UTILIZACIÓN DE LA APLICACIÓN.................................................................................................96<br />

FICHERO DE CONFIGURACIÓN......................................................................................................98


V<br />

Índice de tablas<br />

Tabla 1 : Clase Person.java ............................................................................................ 10<br />

Tabla 2 : Objeto Person a serializar................................................................................ 11<br />

Tabla 3: Serialización obtenida con JSX........................................................................ 14<br />

Tabla 4: Serialización obtenida con Castor XML .......................................................... 16<br />

Tabla 5: Serialización obtenida con XStream ................................................................ 17<br />

Tabla 6: Serialización obtenida con JOX ....................................................................... 19<br />

Tabla 7: Serialización obtenida con Koala KOML ........................................................ 21<br />

Tabla 8: Tabla Comparativa. .......................................................................................... 23<br />

Tabla 9: Relación de páginas web con información acerca de las herramientas<br />

analizadas........................................................................................................24<br />

Tabla 10: Ejemplo de documento XML......................................................................... 34<br />

Tabla 11: Ejemplo de XML Schema .............................................................................. 37<br />

Tabla 12: Ejemplo de serialización de listas .................................................................. 55<br />

Tabla 13: Ejemplo de serialización maps....................................................................... 55<br />

Tabla 14: Caso de uso “Abrir documento”..................................................................... 67<br />

Tabla 15: Caso de uso “Generar Java2XML” ................................................................ 68<br />

Tabla 16: Métodos de la InterfazConfiguración............................................................. 77<br />

Tabla 17: Ejemplo clase de prueba (Mesa.java)............................................................. 89


VI<br />

Índice de ilustraciones<br />

Figura 1: Proceso de generación de los documentos........................................................ 4<br />

Figura 2: Referencia circular en el objeto Java .............................................................. 11<br />

Figura 3: Flujos de trabajo.............................................................................................. 27<br />

Figura 4: Proceso generación ProgramaJava.................................................................. 32<br />

Figura 5: Abrir clase Java............................................................................................... 39<br />

Figura 6: Insertar nombre de la clase Java ..................................................................... 40<br />

Figura 7: Clase Java abierta............................................................................................ 40<br />

Figura 8: Obtención del nombre del nodo raíz............................................................... 41<br />

Figura 9: Generación de los archivos Java2XML.java................................................... 42<br />

Figura 10: Generado DTD.............................................................................................. 42<br />

Figura 11: Generado XML Schema................................................................................ 43<br />

Figura 12: Guardando todos los documentos ................................................................. 43<br />

Figura 13: Diagrama de casos de uso – Manejo de la interfaz gráfica........................... 65<br />

Figura 14: Diagrama de casos de uso – Generación del documento para la<br />

serialización/deserialización ...........................................................................66<br />

Figura 15: Diagrama de casos de uso – Generación del documento DTD..................... 66<br />

Figura 16: Diagrama de casos de uso – Generación del documento XML Schema ...... 66<br />

Figura 17: Diagrama de Estado de la interfaz gráfica .................................................... 69<br />

Figura 18: Diagrama de colaboración – Flujo principal (abrir documento)................... 71<br />

Figura 19: Diagrama de colaboración – Flujo alternativo (abrir documento)................ 71<br />

Figura 20: Diagrama de colaboración – Flujo principal (generar Java2XML) .............. 72<br />

Figura 21: Diagrama de colaboración – Flujo alternativo I (generar Java2XML)......... 72<br />

Figura 22: Diagrama de colaboración – Flujo alternativo II (generar Java2XML)........ 72<br />

Figura 23: Diagrama de paquetes de análisis ................................................................. 73<br />

Figura 24: Diagrama de clases – Interfaz ....................................................................... 76<br />

Figura 25: Diagrama de clases – Generación de los documentos .................................. 79<br />

Figura 26: Diagrama de clases – Serialización/deserialización...................................... 80<br />

Figura 27: Arquitectura .................................................................................................. 82


Capítulo 1. INTRODUCCIÓN 1<br />

1<br />

Capítulo 1<br />

INTRODUCCIÓN<br />

Se entiende por Sistema de Gestión de Información al conjunto de recursos físicos<br />

(hardware) y lógicos (software), que conjuntamente dan soporte informático a unos<br />

datos y permiten el proceso o gestión de los mismos.<br />

En estos sistemas la información se encuentra principalmente en dos estados: en<br />

memoria y almacenada en disco. La información en memoria se procesa en el momento,<br />

y se hace mediante las instrucciones del lenguaje de programación en el que está<br />

desarrollado el sistema. La información se almacena en disco para su posterior uso,<br />

para su transmisión o para que sea compartida entre varios sistemas.<br />

A grandes rasgos dos son las formas posibles de almacenar la información en<br />

disco: en un sistema de base de datos o en uno o varios ficheros. Las bases de datos se<br />

usan cuando hay gran cantidad de información, con acceso concurrente de varios<br />

usuarios y gran potencia de búsqueda. Por otro lado, el almacenamiento en ficheros se<br />

usa cuando no se requiere el acceso concurrente a partes de la información y/o cuando<br />

no se requiere una forma centralizada de gestionar la información, sino que cada fichero<br />

ha de ser tratado individualmente.<br />

Es habitual que la información que se procesa en memoria se almacene en disco<br />

para ser compartida o para guardarla una vez finalizada la ejecución del sistema. Al<br />

proceso de almacenamiento de la información de la memoria en un fichero se le<br />

denomina serialización. Al proceso inverso, obtener la información de un fichero y<br />

cargarla en memoria, se le denomina deserialización.<br />

Un lenguaje que permite almacenar la información en ficheros de forma<br />

estructurada es XML (Extensible Markup Language) [1], [2], [3], [4], [5]. La estructura<br />

se basa en el uso de etiquetas dispuestas en forma de árbol y que han de cumplir una


Capítulo 1. INTRODUCCIÓN 2<br />

serie de reglas de validación. Además, los documentos en formato XML pueden ser<br />

editados directamente por el usuario usando un editor de textos. Se ha consolidado<br />

definitivamente como un lenguaje estándar de información. Para definir la estructura de<br />

la información, el modelo de contenido y los tipos de elementos y atributos dentro de un<br />

documento XML, se pueden utilizar lenguajes de definición de documentos como el<br />

XML Schema, o el lenguaje DTD. La tecnología XML está avalada por el Consorcio<br />

para la World Wide Web (W3C) [6].<br />

Por otro lado, uno de los lenguajes más utilizados actualmente es Java [7], [8], [9],<br />

[10], que es un lenguaje de programación Orientado a Objetos. Una de sus<br />

características es que nos ofrece una API estándar de serialización que permite guardar<br />

o transmitir la información representada con objetos que están en memoria.<br />

Dadas las ventajas de la tecnología XML, sería deseable utilizarla como formato<br />

de almacenamiento para programas Java. La API estándar de almacenamiento de Java<br />

tiene unas características que la hacen menos adecuada que XML en ciertas ocasiones:<br />

• Cuando se necesita que el fichero tenga un formato que sea comprensible<br />

por una persona usando cualquier aplicación de texto, es más adecuado<br />

utilizar XML, ya que la serialización de Java se almacena con un formato<br />

binario.<br />

• Cuando se necesita que el fichero tenga un formato que pueda ser tratado<br />

por un aplicación que no esta escrita en Java, es necesario un formato<br />

estándar como XML, ya que el formato de Java sólo es entendible por sus<br />

aplicaciones.<br />

• Cuando se necesita saber si el fichero tiene el formato adecuado, XML<br />

proporciona un sistema de validación del fichero; ya que su estructura<br />

queda definida en un DTD o XML Schema. En cambio, el formato de<br />

serialización de Java no ofrece esta validación hasta el momento de la<br />

recuperación de la información.<br />

Existen formas de serializar objetos Java mediante XML [11], [12], [13], [14],<br />

usando diferentes APIs. Para serializar objetos en XML básicamente se siguen los<br />

siguientes pasos: se obtiene el valor de cada uno de los atributos del objeto y se<br />

representa su valor entre una etiqueta XML. En caso de que el valor no sea de un tipo<br />

primitivo sino de un objeto, habrá que representar también en el documento todos los


Capítulo 1. INTRODUCCIÓN 3<br />

atributos de este objeto. El proceso de deserialización es el inverso, se va leyendo el<br />

documento XML y el valor de las etiquetas se ha de asignar a los atributos.<br />

Además, estos documentos tendrán una estructura que se corresponde con las<br />

clases que definen esos objetos; dicha estructura se puede representar en un DTD o en<br />

un XML Schema.<br />

El proceso de serialización es un proceso mecánico, por lo que es posible generar<br />

automáticamente el código necesario para obtener el documento XML. De esta forma,<br />

se puede mantener sincronizado el objeto Java y el DTD o XML Schema, eliminando al<br />

desarrollador de este trabajo mecánico y propenso a errores.<br />

La finalidad de este Proyecto Fin de Carrera es facilitar al programador el<br />

mantenimiento de esta sincronización. Para ello se quiere conseguir una herramienta<br />

que pueda obtener de manera automática y/o asistida la definición en XML Schema o<br />

DTD de esa información, además del código necesario para obtener la serialización en<br />

XML.<br />

El objetivo no se limita simplemen te a conseguir una persistencia en XML de<br />

objetos Java, sino que los documentos XML que representen la información orientada a<br />

objetos de estos objetos Java, aprovechen toda la riqueza semántica de la tecnología<br />

XML; es decir, que no existan etiquetas y/o sintaxis que hagan ver que el documento<br />

XML parte de una transformación desde código Java. Por ejemplo, al modelar un<br />

atributo de una clase que implementa la interfaz java.util.List de Java, no debería<br />

aparecer en el documento XML el nombre cualificado de la clase (java.util.List) ni nada<br />

que represente al código de Java, sino que se debería utilizar en XML varias etiquetas<br />

que representen la cardinalidad que ofrece XML Schema para conjuntos de elementos<br />

con la misma etiqueta.<br />

Actualmente existen muchas tecnologías de serialización de objetos Java en<br />

XML, algunas de las más representativas se estudian en el capítulo 2 del presente<br />

documento. La mayoría de estas tecnologías, sin embargo, no persiguen el objetivo de<br />

utilizar toda la riqueza semántica de lenguaje XML Schema, como se ha comentado,<br />

sino que simplemente utilizan el documento XML como medida de persistencia,<br />

haciendo explícito el origen de los datos desde Java. Este hecho puede dificultar tanto la<br />

transformación de esta información a otros lenguajes o sistemas, como la comprensión<br />

de dicha información ante el ojo humano.<br />

El proceso de generación de la serialización en XML y el XML Schema,<br />

aprovechando toda su riqueza semántica, no es un proceso trivial, con lo que será


Capítulo 1. INTRODUCCIÓN 4<br />

necesario en algún momento la ayuda del usuario para poder decidir la forma de<br />

representar ciertas construcciones de Java con XML Schema.<br />

En la Figura 1 se puede ver, de forma general, la aplicación que pretendemos<br />

desarrollar, denominada SerXML. Se procesará una clase de Java (Clase.java) para<br />

generar, tanto el documento XML Schema como el DTD (Clase.dtd y Clase.xsd).<br />

Además de estos documentos también, para esta clase y todas aquellas que intervengan<br />

en la serialización (ya sea como tipo de atributos, en las listas, etcétera), se crearán los<br />

documentos Clase2XML.java, donde la palabra Clase es el nombre de la clase que se<br />

serializa.<br />

Clase.dtd / Clase.xsd<br />

Clase.java<br />

SerXML<br />

Clase2XML.java<br />

Figura 1: Proceso de generación de los documentos<br />

Para serializar la clase (Clase.java) se incorporarán las clases Clases2XML.java<br />

mencionadas al proyecto Java donde se encuentra Clase.java. Estas clases incorporadas,<br />

ofrecerán la posibilidad de, mediante una serie de métodos, poder serializar un objeto de<br />

dicha clase o deserializar un documento XML obteniendo el objeto en el mismo estado<br />

en el que se había serializado.


Capítulo 1. INTRODUCCIÓN 5<br />

El resto del contenido de esta memoria se estructura en diferentes capítulos. En el<br />

capítulo 2 se realiza un estado del arte, analizando y comparando las herramientas más<br />

representativas que existen en el mercado para serializar objetos Java en XML, a través<br />

de distintos criterios de evaluación, pudiendo comprobar que ninguna satisface todos<br />

ellos y concluyendo con la necesidad de generar una nueva herramienta que cumpla<br />

todos los objetivos y criterios perseguidos. En el tercer capítulo se presenta la<br />

metodología seguida y se introducen conceptos básicos acerca de las tecnologías<br />

utilizadas en el desarrollo. En el capítulo 4 se ofrece un ejemplo de uso de la aplicación<br />

SerXML, haciendo un seguimiento paso a paso gráfico de le generación de los distintos<br />

documentos, intentando de esta manera facilitar la comprensión del resto de esta<br />

memoria. En el capítulo 5, se muestra la especificación de todos los requisitos que<br />

incorporará la aplicación, así como de algunos de sus casos de uso. En el capítulo sexto<br />

presenta el análisis realizado, donde se muestran los diagramas de análisis<br />

correspondientes a los casos de uso presentados en el capítulo anterior. El séptimo<br />

presenta el diseño de la aplicación SerXML, estructurado en diferentes puntos<br />

correspondientes a diferentes bloques de la aplicación, como son la interfaz gráfica y del<br />

fichero de configuración y las generaciones de los distintos documentos. El capítulo 8<br />

corresponde a la implementación y pruebas realizadas. Y por último, el capítulo 9<br />

dedicado a la conclusión, donde se presentan los objetivos y logros alcanzados y los<br />

distintos trabajos futuros. Para finalizar, la memoria contiene la bibliografía usada como<br />

libros, apuntes de asignaturas y referencias a páginas Web y un anexo donde se describe<br />

la forma de utilizar la herramienta desarrollada.


Capítulo 2. <strong>ESTADO</strong> <strong>DEL</strong> <strong>ARTE</strong> 6<br />

2<br />

Capítulo 2<br />

<strong>ESTADO</strong> <strong>DEL</strong> <strong>ARTE</strong><br />

La creación de este proyecto tiene como principal objetivo serializar objetos Java<br />

utilizando las ventajas que proporciona XML. Para dicha creación es interesante<br />

estudiar otros trabajos, proyectos o herramientas existentes relacionadas con la<br />

serialización en XML de objetos Java o de JavaBeans [16]. Entre los diferentes<br />

enfoques que se ofrecen, la serialización en XML que generan algunos de ellos se<br />

caracteriza por mantener mucha similitud con Java; es decir, existen etiquetas y<br />

atributos que hacen ver que el documento XML parte de una transformación desde<br />

código Java. Debido a esto se pierde una importante faceta del XML: su legibilidad y<br />

portabilidad. Otros, en cambio, intentan ser más independientes de Java, pero para ello<br />

necesitan de una gran cantidad de información y configuración para poder serializar.<br />

La herramienta que se pretende realizar en este Proyecto Fin de Carrera tiene<br />

como finalidad facilitar, en todo lo posible, el trabajo del desarrollador en el proceso de<br />

serialización en XML de objetos Java. Para ello, no será necesario el conocimiento<br />

previo de XML, siendo además posible la modificación de algún aspecto del documento<br />

XML por dicho desarrollador (por ser éste totalmente legible), a diferencia de la<br />

serialización que ofrece la API de Java (que se realiza mediante un flujo de bytes sólo<br />

comprensible para Java).<br />

En este capítulo, en primer lugar, se muestran una serie de criterios para la<br />

evaluación de este tipo de herramientas. A continuación, se presenta un estudio


Capítulo 2. <strong>ESTADO</strong> <strong>DEL</strong> <strong>ARTE</strong> 7<br />

comparativo de dichas herramientas, observando su comportamiento para cada uno de<br />

los criterios. Finalmente, se presenta una breve conclusión acompañada con un resumen<br />

en forma de tabla con las principales características y el resultado obtenido para cada<br />

una ellas; así como las referencias a direcciones de Internet donde encontrar mayor<br />

información sobre las herramientas presentadas.<br />

2.1. Herramientas de Serialización en XML de objetos<br />

Java<br />

2.1.1. Criterios de evaluación de un serializador en XML de<br />

objetos Java<br />

Las herramientas de serialización de objetos Java en XML se pueden evaluar<br />

principalmente atendiendo a los siguientes aspectos:<br />

1. Características de las clases cuyos objetos se serializan: mediante este<br />

aspecto podemos comprobar si soporta cualquier tipo de clase Java; si han de<br />

tener alguna característica especial y cuál es esta; o, finalmente, si únicamente<br />

soporta JavaBeans. Las convenciones de formato son las siguientes:<br />

• Constructor sin argumentos.<br />

• No permitir campos públicos.<br />

• Atributos accesibles mediante métodos get/set/is.<br />

2. Dependencia del documento XML generado con Java: representa el grado<br />

de dependencia con Java que presenta el documento XML generado por la<br />

serialización. En el caso de que este grado sea alto, significa que el<br />

documento mantiene muchas etiquetas correspondientes de Java y, por ello,<br />

supone una mayor dificultad de lectura y comprensión, además de no tener la<br />

posibilidad de exportarlo a otros lenguajes. Si no existe tal dependencia, esto<br />

facilitará la portabilidad a otros lenguajes de programación y a otras<br />

arquitecturas que no utilicen Java.


Capítulo 2. <strong>ESTADO</strong> <strong>DEL</strong> <strong>ARTE</strong> 8<br />

3. Posibilidad de configuración: con ello podemos especificar ciertos aspectos<br />

de la serialización que serían muy complicados de detectar por la herramienta.<br />

En cierta medida va relacionado con el aspecto anterior porque, en el caso de<br />

que no exista tal configuración, hay más posibilidad de dependencia con Java,<br />

ya que hay ciertas características de las clases Java que son ambiguas y no nos<br />

ofrecen toda la información necesaria para su serialización. Por ejemplo, no se<br />

puede obtener en tiempo de compilación las clases de los objetos que albergan<br />

las estructuras de datos que se describirán en el punto 5, ya que el código de<br />

una clase de Java no contiene esta información, que únicamente se puede<br />

obtener en tiempo de ejecución, por lo que es necesario obtenerlo mediante<br />

una cierta configuración.<br />

4. Soporta referencias circulares: un aspecto muy importante es que en los<br />

objetos a serializar, se nos ofrezca la posibilidad de referenciar, mediante los<br />

atributos, a objetos cuyas clases no pertenezcan a la API estándar de Java o a<br />

una API externa y de las cuales tenemos el código Java. En el caso de que<br />

esto no fuera soportado, nos restringiría totalmente la libertad de realizar<br />

clases de Java. Además, puede darse el caso de que algunos atributos de los<br />

objetos Java hagan referencia a otros objetos, y así sucesivamente, hasta<br />

cerrarse la referencia con el objeto inicial (referencia circular) formando<br />

grafos de objetos.<br />

5. Soporta estructura de datos: algo que ha de soportar toda serialización son<br />

las estructuras de objetos pertenecientes al Collection Framework [17] de<br />

Java. Es una característica muy común y que se suele utilizar mucho en todos<br />

los objetos Java. Las estructuras de datos que ofrece el Collection Framework<br />

de Java son las siguientes interfaces:<br />

• java.util.List<br />

• java.util.Map<br />

• java.util.Set<br />

6. Construye DTD y/o XML Schema: algunas herramientas ofrecen la<br />

posibilidad de crear un DTD y/o XML Schema de la clase del objeto que se<br />

va a serializar y, con ello, permiten validar el documento XML creado en la<br />

serialización de un objeto de dicha clase.


Capítulo 2. <strong>ESTADO</strong> <strong>DEL</strong> <strong>ARTE</strong> 9<br />

7. Tecnología que emplea para leer XML: en el proceso de deserialización en<br />

el que se lee el documento XML para transformarlo en un objeto Java, se<br />

pueden utilizar distintas APIs para el procesado de este XML. Las más<br />

conocidas son SAX [18] y DOM, aunque algunas herramientas puedan<br />

utilizar APIs propias.<br />

2.1.2. Estudio comparativo<br />

Para comparar las características de las herramientas, se ha utilizado siempre la<br />

misma clase: Person.java. Esta clase contiene tanto atributos públicos como privados,<br />

de tipos primitivos y de clases de la API estándar de Java de las que no tenemos el<br />

código fuente. También tiene un constructor sin parámetros y otro con un parámetro, así<br />

como métodos get y set, pero no para todos los atributos, para así poder comprobar<br />

como se comportan las herramientas a evaluar en distintas situaciones. En la Tabla 1 se<br />

muestra la clase que se acaba de comentar.<br />

import java.util.Date;<br />

import java.util.ArrayList;<br />

public class Person {<br />

private String nombre;<br />

public int peso;<br />

public Boolean casado;<br />

private Date cumple;<br />

//Es un ArrayList de la clase Person<br />

private ArrayList amigos;<br />

public Person() {<br />

}<br />

public Person(String nombre) {<br />

this.nombre = nombre;<br />

}<br />

public String getNombre() {<br />

return nombre;


Capítulo 2. <strong>ESTADO</strong> <strong>DEL</strong> <strong>ARTE</strong> 10<br />

}<br />

public void setNombre(String string) {<br />

nombre = string;<br />

}<br />

public ArrayList getAmigos() {<br />

return amigos;<br />

}<br />

public void setAmigos(ArrayList list) {<br />

amigos = list;<br />

}<br />

public Date getCumple() {<br />

return cumple;<br />

}<br />

public void setCumple(Date date) {<br />

cumple = date;<br />

}<br />

}<br />

Tabla 1 : Clase Person.java<br />

Se ha utilizado otra clase (Prueba.java) que es ejecutable, para poder realizar las<br />

pruebas de serialización y guardarlas en fichero. Mediante esta clase se ha utilizado un<br />

objeto de la clase anterior (Person.java), con referencias a otro objeto Person, pero que<br />

a su vez hace referencia al objeto original, por lo que se produce referencia circular,<br />

siendo esta característica la más “delicada” a la hora de serializar.<br />

El objeto al que se hace mención se presenta a continuación en la Tabla 2, y el<br />

grafo cíclico del objeto se muestra en la Figura 2.<br />

Person personVane = new Person("Vane");<br />

personVane.peso = 50;<br />

personVane.casado = new Boolean(false);<br />

personVane.setCumple(new Date(1979, 5, 9));<br />

Person personMauri = new Person("Mauri");<br />

personMauri.peso = 80;


Capítulo 2. <strong>ESTADO</strong> <strong>DEL</strong> <strong>ARTE</strong> 11<br />

personMauri.setCumple(new Date(1979,5,12));<br />

Person personSergio = new Person("Sergio");<br />

personSergio.peso = 75;<br />

personSergio.setCumple(new Date(1979,8,3));<br />

ArrayList amigosSergio = new ArrayList();<br />

amigosSergio.add(personVane);<br />

personSergio.setAmigos(amigosSergio);<br />

ArrayList amigosVane = new ArrayList();<br />

amigosVane.add(personMauri);<br />

amigosVane.add(personSergio);<br />

personVane.setAmigos(amigosVane);<br />

Tabla 2 : Objeto Person a serializar<br />

personSergio<br />

personVane<br />

personMauri<br />

Figura 2: Referencia circular en el objeto Java<br />

La clase Person.java, junto con un objeto de la misma, se han realizado teniendo<br />

en cuenta las características expuestas en el apartado 2.1.1., pudiéndose comprobar cada<br />

uno de los aspectos descritos en ella.<br />

A continuación se muestran las herramientas más representativas para la<br />

serialización en XML de objetos Java, junto con una breve descripción de las mismas y<br />

de los resultados obtenidos para cada una de las características comentadas<br />

anteriormente. Destacar, por último, que también se incluye el documento XML<br />

generado tras la serialización.


Capítulo 2. <strong>ESTADO</strong> <strong>DEL</strong> <strong>ARTE</strong> 12<br />

2.1.2.1. JSX 2.2.3.2<br />

Esta herramienta permite almacenar objetos Java en un fichero, para poder leerlo<br />

más tarde y reproducir una copia del objeto original (deserialización).<br />

Características:<br />

1. Es capaz de serializar cualquier objeto de Java, tanto si tienen atributos<br />

públicos como privados, y realiza correctamente la serialización de listas.<br />

2. Se aprecia una clara influencia de Java en la serialización generada, por lo que<br />

su dependencia es alta. Ej: java.lang.String ó . En estos dos ejemplos observamos el resultado de la<br />

serialización de un String y de la clase Person, respectivamente. La influencia<br />

es clara, ya que en el primer ejemplo la serialización de un String no tendría<br />

que mostrar, en ningún momento, el paquete al que pertenece, serializándolo<br />

como una cadena de caracteres únicamente. En el segundo ejemplo se ha<br />

serializado una clase Java especificando claramente que proviene de una clase,<br />

hecho que dificultaría la portabilidad de la serialización generada a un<br />

programa que no comprendiera la programación orientada a objetos.<br />

3. Las pocas posibilidades de configuración que tiene se centran en poder evitar<br />

incluir algún atributo u objeto en la serialización, por motivos diversos como<br />

puede ser la seguridad.<br />

4. Soporta tanto referencias a otras clases como referencias circulares, ya que<br />

serializa un grafo dirigido de objetos y, para ello, utiliza identificadores como<br />

atributo de los elementos.<br />

5. Soporta sin problemas las listas de objetos, aunque el XML resultante no es<br />

claro, provocando así dificultad en su comprensión.<br />

6. No ofrece la posibilidad de generar el DTD o el XML Schema.<br />

7. La tecnología para la lectura del documento XML es propia de la herramienta.


Capítulo 2. <strong>ESTADO</strong> <strong>DEL</strong> <strong>ARTE</strong> 13<br />

En la Tabla 3 se muestra parte (por ser excesivamente extenso) del resultado de la<br />

serialización.<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />


Capítulo 2. <strong>ESTADO</strong> <strong>DEL</strong> <strong>ARTE</strong> 14<br />

… (Omitida el objeto Person de Mauri)<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

…(Omitido el objeto Date)<br />

<br />

…(Omitidas las declaraciones de las clases padres de ArrayList)<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

…(Omitidas clausulas de cierre de los elementos)<br />

<br />

Tabla 3: Serialización obtenida con JSX<br />

2.1.2.2. Castor XML 0.9.5.3<br />

Castor XML es una herramienta que permite mapear objetos tanto a documentos<br />

XML como a bases de datos relacionales. Tiene una funcionalidad muy amplia, por lo<br />

que para casos sencillos puede resultar excesivo.<br />

Características:<br />

1. Únicamente es capaz de serializar objetos de Java cuyas clases sean<br />

JavaBeans, esto se ha podido comprobar en el serialización del ejemplo, en la<br />

que sólo ha añadido aquellos atributos que tuvieran set y get (tomando el<br />

nombre para el elemento XML a partir de estos métodos); los atributos


Capítulo 2. <strong>ESTADO</strong> <strong>DEL</strong> <strong>ARTE</strong> 15<br />

públicos no los ha incluido. Además únicamente ha soportado el constructor<br />

público por defecto (sin argumentos). Estructuras, todas ellas, que<br />

corresponden a las convenciones de formato de los JavaBeans.<br />

2. Se aprecia alguna influencia de Java en la serialización generada, pero en una<br />

mucho menor medida que en el caso anterior. Ej.: xsi:type="Java:Person", en<br />

él se observa que ha serializado una clase introduciendo la palabra Java en<br />

ella.<br />

3. Tiene posibilidades de configuración, los cuales se realizan especificando<br />

determinadas propiedades en el archivo castor.properties (convenciones del<br />

nombre, especificar si los tipos primitivos son tratados como atributos o<br />

elementos, etcétera).<br />

4. Soporta referencias a otras clases pero no referencias circulares, ya que en<br />

nuestro ejemplo vemos claramente que no ha realizado bien la referencia,<br />

además de no mostrar ningún error al encontrarse con una.<br />

5. Soporta sin problemas las listas de objetos.<br />

6. Permite construir el XML Schema a partir de la clase Java y viceversa.<br />

7. Emplea tecnología propia para la lectura del documento XML a través de un<br />

modelo de objeto que representa la información.<br />

Muchas de las características explicadas se pueden apreciar en el resultado de la<br />

serialización del objeto de la clase Person con esta herramienta (Tabla 4).<br />

<br />

<br />

<br />

Mauri<br />

1979-06-09T00:00:00.000+02:00<br />

<br />

<br />

Sergio<br />

1979-09-03T00:00:00.000+02:00<br />


Capítulo 2. <strong>ESTADO</strong> <strong>DEL</strong> <strong>ARTE</strong> 16<br />

Vane<br />

1979-10-13T00:00:00.000+02:00<br />

<br />

Tabla 4: Serialización obtenida con Castor XML<br />

2.1.2.3. XStream 1.0.2<br />

XStream es una simple librería que permite tanto pasar de documentos XML a<br />

objetos Java (de forma muy sencilla), como realizar el proceso inverso; es decir,<br />

serializar objetos Java en formato XML.<br />

Características<br />

1. Es capaz de serializar cualquier objeto Java; en nuestro ejemplo ha introducido<br />

correctamente todos los atributos del objeto sin distinguir la visibilidad ni la<br />

existencia de los métodos get y set, además de soportar cualquier tipo de<br />

constructor.<br />

2. Se ha podido comprobar que no incluye dependencia con Java de ningún tipo.<br />

3. No tiene la posibilidad de configurar la serialización.<br />

4. Soporta referencias a otras clases pero no referencias circulares, ya que en<br />

nuestro ejemplo vemos claramente que no ha realizado bien la referencia. En<br />

este caso, no da ningún error al encontrarse con una, pero en lugar de escribir<br />

correctamente la referencia pone lo siguiente:<br />

.<br />

5. Soporta sin problemas la serialización de listas de objetos con un resultado,<br />

además, muy comprensible.<br />

6. No es posible construir el DTD o el XML Schema.<br />

7. Emplea tecnología propia para la lectura del documento XML.


Capítulo 2. <strong>ESTADO</strong> <strong>DEL</strong> <strong>ARTE</strong> 17<br />

El resultado de la serialización se muestra en la Tabla 5.<br />

<br />

<br />

<br />

1979-06-09 00:00:00.0 AM<br />

Mauri<br />

80<br />

<br />

<br />

<br />

<br />

<br />

1979-09-03 00:00:00.0 AM<br />

Sergio<br />

75<br />

<br />

<br />

false<br />

1979-10-13 00:00:00.0 AM<br />

Vane<br />

70<br />

<br />

Tabla 5: Serialización obtenida con XStream<br />

2.1.2.4. JOX 1.17<br />

Al igual que el resto de herramientas, que facilitan la transformación entre<br />

documentos XML y objetos Java, JOX, además, puede aceptar como entrada un DTD<br />

para escribir el documento XML valido.


Capítulo 2. <strong>ESTADO</strong> <strong>DEL</strong> <strong>ARTE</strong> 18<br />

Características:<br />

1. Únicamente es capaz de serializar objetos Java cuyas clases sean JavaBeans,<br />

ya que para poder realizar la serialización necesita para todos los atributos sus<br />

métodos set y get, por lo que los atributos públicos que no presentaban estos<br />

métodos no han sido incluidos. Además de existir un constructor sin<br />

argumentos para que realice bien la serialización.<br />

2. Se aprecia alguna influencia de Java en la serialización generada pero en una<br />

mucho menor medida que en el caso de JSX. Ej.: ,<br />

se observa claramente la introducción de la palabra Java y<br />

class.<br />

3. No ofrece la posibilidad de configurar la serialización.<br />

4. Soporta referencias a otras clases pero no referencias circulares, ya que en<br />

nuestro ejemplo al encontrarse con una referencia circular ha fallado y<br />

finalizado bruscamente la ejecución. Por ello, ha sido necesario modificar la<br />

clase de Prueba para eliminar estas referencias. En la especificación de esta<br />

herramienta se comenta que si se usa DTD cuando se escriba el XML son<br />

posibles las referencias circulares.<br />

5. Soporta sin problemas la serialización de listas de objetos.<br />

6. No soporta la generación de DTD o XML Schema.<br />

7. Emplea SAX y DOM para la lectura del documento XML.<br />

El resultado de la serialización del objeto de la clase Person se puede ver en la<br />

Tabla 6.<br />

<br />

<br />

<br />

09-06-1979 00:00:00 CEST<br />

Mauri<br />

<br />

<br />

03-09-1979 00:00:00 CEST<br />

Sergio


Capítulo 2. <strong>ESTADO</strong> <strong>DEL</strong> <strong>ARTE</strong> 19<br />

<br />

13-10-1979 00:00:00 CEST<br />

Vane<br />

<br />

Tabla 6: Serialización obtenida con JOX<br />

2.1.2.5. Koala KOML 1.21<br />

Es esta herramienta ha sido necesaria la modificación de las clases de prueba:<br />

Person.java y Prueba.java para poder obtener un documento correcto XML, ya que no<br />

finalizaba correctamente la ejecución. Se ha modificado para eliminar las listas y las<br />

referencias circulares que no lo soportaba.<br />

Características:<br />

1. Es capaz de serializar cualquier objeto de Java, incluso no tratándose de<br />

JavaBean, aunque con algunas restricciones, como por ejemplo, el<br />

impedimento de poner colecciones de objeto (listas).<br />

2. Se aprecia bastante influencia de Java en la serialización generada. Ej.: class<br />

name='java.lang.Boolean', donde la etiqueta java.lang.Boolean es claramente<br />

obtenido de la clase del objeto serializado.<br />

3. La serialización no es configurable con esta herramienta.<br />

4. Soporta referencias a otras clases pero no referencias circulares, ya que en<br />

nuestro ejemplo al encontrarse con una referencia circular ha fallado y<br />

finalizado la ejecución.<br />

5. No ha soportado la serialización de listas de objetos.<br />

6. Es posible construir XML Schema.<br />

7. Emplea SAX para la lectura del documento XML.<br />

la Tabla 7.<br />

El resultado de la serialización realizada mediante esta herramienta se muestra en<br />

<br />


Capítulo 2. <strong>ESTADO</strong> <strong>DEL</strong> <strong>ARTE</strong> 20<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

70<br />

<br />

75<br />

<br />

<br />

<br />

60263388000000<br />

<br />

Sergio<br />

<br />

<br />

false<br />

<br />

<br />

60266844000000<br />

<br />

Vane


Capítulo 2. <strong>ESTADO</strong> <strong>DEL</strong> <strong>ARTE</strong> 21<br />

<br />

<br />

Tabla 7: Serialización obtenida con Koala KOML<br />

2.2. Conclusiones<br />

El análisis realizado de las distintas herramientas revela que, en función de las<br />

necesidades de cada proyecto, se han desarrollado herramientas con unas características<br />

específicas. Sin embargo, en el desarrollo de una herramienta de serialización en XML,<br />

dicha serialización debería ser independiente a Java, ya que en caso contrario, se pierde<br />

toda la portabilidad y compresión que nos ofrece el lenguaje XML. Ante todo, es<br />

importante que soporte cualquier tipo de objeto Java y numerosas opciones de<br />

configuración.<br />

Además, es aconsejable que la tecnología empleada para procesar documentos<br />

XML sea SAX, debido, entre otros aspectos, a la poca utilización de memoria que<br />

necesita (a diferencia, por ejemplo, de la API DOM que carga todo el árbol del<br />

documento XML en memoria).<br />

En el estudio comparativo, se ha podido observar que la única que no soporta<br />

estructuras de datos en la serialización ha sido Koala KOML. En esta herramienta y en<br />

JOX ha sido necesario (debido a la interrupción brusca del programa) modificar las<br />

clases de prueba para poder obtener la serialización.<br />

Se ha podido observar que JSX utiliza identificadores para resolver las referencias<br />

circulares, además JOX sí que da la posibilidad de procesar estas referencias<br />

especificándolo en la DTD. A diferencia de las demás herramientas que no lo soportan.<br />

De todas las herramientas, en base a las características analizadas, las que mejores<br />

resultados han dado han sido JSX y XStream, la primera de ellas soporta referencias<br />

circulares sin necesidad de configurar la serialización, pero por el contrario, el<br />

documento XML generado es ilegible e incomprensible por cualquier persona que no<br />

entienda de XML o de Java, ya que es el que más dependencia ha mantenido con Java.<br />

El resultado de la serialización de la otra herramienta destacada es comprensible y<br />

fácilmente modificable (sin ninguna dependencia con Java), aunque no ha sido capaz de<br />

resolver las referencias circulares que se ha encontrado. En estas dos herramientas la<br />

tecnología empleada para procesar XML es propia, por lo que no se ha podido


Capítulo 2. <strong>ESTADO</strong> <strong>DEL</strong> <strong>ARTE</strong> 22<br />

comprobar la utilización de memoria de la misma, además, aceptan cualquier tipo de<br />

objeto Java, lo que implica: que debe existir un constructor por defecto, que los<br />

atributos tengan una visibilidad determinada o que exista métodos get y set; facilitando<br />

de esta forma el trabajo al desarrollador.<br />

Por tanto, viendo las conclusiones obtenidas, ninguna de las herramientas<br />

satisface ampliamente todas las características deseables para una herramienta de<br />

serialización:<br />

1. Serializar cualquier característica de las clases de los objetos Java.<br />

2. No mostrar ninguna dependencia con el lenguaje Java.<br />

3. Dar distintas opciones de configuración.<br />

4. Soportar referencias circulares entre los objetos.<br />

5. Soportar cualquier estructura de datos de Java.<br />

6. Construcción tanto del DTD como del XML Schema.<br />

7. Utilización de SAX para la lectura del documento XML.<br />

De esta manera, surge la necesidad de desarrollar SerXML. En la que se ha<br />

querido soportar todos los criterios de evaluación comentados, para obtener una<br />

herramienta íntegra. Para ello, serán necesarias ciertas restricciones, como la existencia<br />

de un fichero de configuración para poder obtener aquellas opciones que son ambiguas<br />

en una clase Java. Por ejemplo, en el caso de las estructuras de datos en Java, es<br />

necesario saber las clases que manejan, ya que en tiempo de compilación no es posible.<br />

En este estudio del estado del arte, se ha observado que muchas herramientas no daban<br />

la posibilidad de configuración, limitando enormemente la serialización.<br />

Además, ninguna de ellas da la opción de generar el documento DTD, y pocas el<br />

XML Schema; la herramienta que se va a desarrollar va a permitir generar tanto uno<br />

como el otro, con las grandes ventajas que esto aporta a la validación de la serialización<br />

generada y, sus posteriores modificaciones realizadas por el usuario.<br />

La tecnología que se va ha emplear en la lectura de los documentos XML será<br />

SAX, que como ya se comentará en el capítulo siguiente, se caracteriza por su eficiencia<br />

y poca utilización de memoria, a diferencia de DOM que resulta menos eficiente con<br />

documentos extensos.<br />

Otra característica muy importante es la dependencia con Java del XML generado.<br />

Que como ya se ha comentado, XStream ha sido la única que no ha tenido tal


Capítulo 2. <strong>ESTADO</strong> <strong>DEL</strong> <strong>ARTE</strong> 23<br />

dependencia; en la herramienta a desarrollar se tomará el ejemplo de esta aplicación y<br />

no se incluirá ninguna dependencia, aprovechando toda la potencia semántica que nos<br />

permite el lenguaje XML.<br />

En la Tabla 8 se muestra un resumen comparativo de las características para cada<br />

herramienta.<br />

Más información sobre cada una de las herramientas se puede obtener accediendo<br />

a las páginas web de la Tabla 9.<br />

Herramientas<br />

Características<br />

1. Características de<br />

las clases cuyos<br />

objetos se serializan<br />

2. Dependencia del<br />

XML generado con<br />

Java<br />

3. Posibilidad de<br />

configuración<br />

4. Soporta referencias<br />

circulares<br />

5. Soporta estructura<br />

de datos<br />

6. Construye DTD y/o<br />

XML Schema<br />

7. Tecnología que<br />

emplea para leer<br />

XML<br />

JSX<br />

2.2.3.2<br />

Cualquier<br />

objeto Java<br />

Castor<br />

XML<br />

0.9.5.3<br />

Sólo<br />

objetos<br />

JavaBean<br />

XStream<br />

1.0.2<br />

Cualquier<br />

objeto Java<br />

JOX 1.17<br />

Sólo<br />

objetos<br />

JavaBean<br />

Koala<br />

KOML<br />

1.21<br />

Cualquier<br />

objeto Java<br />

Muy alta Baja Ninguna Baja Alta<br />

Baja Media Ninguna Ninguna Ninguna<br />

Si No No No No<br />

Si Si Si Si No<br />

No<br />

XML<br />

Schema<br />

No<br />

Propia Propia Propia<br />

Tabla 8: Tabla Comparativa.<br />

No<br />

SAX y<br />

DOM<br />

XML<br />

Schema<br />

SAX


Capítulo 2. <strong>ESTADO</strong> <strong>DEL</strong> <strong>ARTE</strong> 24<br />

Herramientas<br />

JSX 2.2.3.2<br />

Castor XML 0.9.5.3<br />

Xstream 1.0.2<br />

JOX 1.17<br />

Koala KOML 1.21<br />

Referencias<br />

- http://jsx.org<br />

- http://www.castor.org<br />

- http://xstream.codehaus.org/<br />

- http://sourceforge.net/projects/jox<br />

- http://www.wutka.com/jox.html<br />

- http://koala.ilog.fr/koml/<br />

Tabla 9: Relación de páginas web con información acerca de las herramientas analizadas.


Capítulo 3. METODOLOGÍAS Y TECNOLOGÍAS 25<br />

3<br />

Capítulo 3<br />

METODOLOGÍAS Y TECNOLOGÍAS<br />

En el presente capítulo se va a justificar la metodología seguida en la definición e<br />

implementación de la herramienta desarrollada, así como las tecnologías software<br />

empleadas.<br />

3.1. Metodología<br />

La metodología elegida en la especificación, análisis, diseño e implementación del<br />

sistema ha sido la del Proceso Unificado de Desarrollo de Software (PUD), cuya<br />

descripción se muestra a continuación.<br />

3.1.1. PUD<br />

Se trata de una metodología para acometer el desarrollo de sistemas informáticos,<br />

propuesta por Ivar Jacobson, Grady Booch y James Rumbaugh.<br />

Se ha elegido principalmente por tres razones:<br />

• Se trata de un estándar avalado por OMG (Object Management Group),<br />

consorcio de alrededor de 800 miembros (compañías de la industria del<br />

software) que buscan el desarrollo de especificaciones que sean técnicamente<br />

excelentes, comercialmente viables e independientes del vendedor. OMG<br />

define object management como el desarrollo software que modela el mundo<br />

real mediante su representación como objetos. Estos objetos no son más que el


Capítulo 3. METODOLOGÍAS Y TECNOLOGÍAS 26<br />

encapsulamiento de atributos, relaciones y métodos de componentes software<br />

identificables.<br />

• Recoge la experiencia de tres grandes metodologías anteriores:<br />

- OMT (Object Modeling Technique) de Rumbaugh.<br />

- OOAD (Object-Oriented Analysis and Design) de Booch.<br />

- Objectory de Jacobson.<br />

• Actualmente, se usa en la mayoría de las empresas para grandes proyectos y se<br />

imparte por muchas instituciones.<br />

El PUD es un proceso de desarrollo de software, definido como un conjunto de<br />

actividades necesarias para transformar los requisitos de un usuario en un sistema<br />

software. Sin embargo, el proceso unificado es más que un proceso de trabajo; es un<br />

marco de trabajo genérico que puede especializarse para una gran variedad de sistemas<br />

software, para diferentes áreas de aplicación, diferentes tipos de organizaciones y<br />

diferentes niveles de aptitud.<br />

El Proceso Unificado está basado en componentes y utiliza el Lenguaje Unificado<br />

de Modelado (Unified Modeling Language, UML) [19], [20], [21], [22].<br />

Está dirigido por casos de uso, porque con éstos se especifican las funcionalidades<br />

que el sistema proporciona al usuario. Los casos de uso representan los requisitos<br />

funcionales y fuerzan a pensar en términos de importancia para el usuario y no sólo en<br />

términos de funciones que serían bueno tener. Los casos de uso no sólo son una<br />

herramienta para especificar los requisitos del sistema, sino que también guían su<br />

diseño, implementación y prueba, es decir, guían el desarrollo software.<br />

El PUD está centrado en la arquitectura, pues la manera en que se organiza el<br />

sistema depende de los casos de uso clave y debe tener en cuenta la comprensibilidad, la<br />

facilidad de adaptación al cambio y la reutilización. Los casos de uso clave son aquéllos<br />

que dotan al sistema con la funcionalidad fundamental para los usuarios y, sin los<br />

cuales, los demás casos de uso no tienen sentido.


Capítulo 3. METODOLOGÍAS Y TECNOLOGÍAS 27<br />

Es iterativo e incremental. El trabajo se divide en partes más pequeñas o llamadas<br />

iteraciones. En cada iteración se recorren los flujos de trabajo 1 y se obtiene una versión<br />

interna, ver Figura 3.<br />

Análisis<br />

Diseño<br />

Codific.<br />

Figura 3: Flujos de trabajo<br />

Pruebas e<br />

Integración<br />

En síntesis, en cada iteración se amplía el sistema con nuevos casos de uso, se<br />

identifican nuevos riesgos y se mitigan los ya conocidos. Las iteraciones se agrupan en<br />

fases, que por orden secuencial son las siguientes: inicio, elaboración, construcción y<br />

transición. Cada una centra sus esfuerzos más en unos flujos de trabajo que en otros. La<br />

etapa de inicio se centra en la captura de requisitos y el análisis. La etapa de elaboración<br />

lo hace en el análisis y el diseño. Las etapas de construcción y transición se centran en<br />

el diseño, implementación y pruebas.<br />

El trabajo de los requisitos se hace fundamentalmente durante la fase de inicio y la<br />

de elaboración. Durante la fase de inicio se identifican la mayoría de los casos de uso<br />

que delimitan el sistema y el alcance del proyecto, se detallan los más importantes<br />

(menos del 10 por ciento). Durante la fase de elaboración se capturan la mayoría de los<br />

requisitos restantes (el 80 por ciento). En la fase de construcción se capturan e<br />

implementan los requisitos que restan, mientras que en la fase de transición<br />

prácticamente no hay captura a menos que haya requisitos que cambien.<br />

Dadas las limitaciones de esta memoria, se van a presentar conjuntamente los<br />

requisitos obtenidos en las fases de inicio, elaboración y construcción. De la misma<br />

manera, los distintos modelos de casos de uso, modelos de análisis, clases, paquetes,<br />

modelos de despliegue, etcétera, de los flujos de trabajo de requisitos, análisis, diseño,<br />

1 Flujos de trabajo: Requisitos, análisis y diseño, implementación y pruebas. El modelado del<br />

negocio y la implantación no forman parte del desarrollo propiamente dicho. Un flujo de trabajo es un<br />

conjunto de actividades.


Capítulo 3. METODOLOGÍAS Y TECNOLOGÍAS 28<br />

implementación y pruebas, se expondrán conjuntamente sin reflejar su evolución a<br />

través de las iteraciones.<br />

Debido a las dimensiones del proyecto, existen otras actividades de la<br />

metodología que no tienen cabida, como por ejemplo la gestión de los recursos<br />

humanos, ya que el autor de esta memoria asume todos los roles de un sistema:<br />

arquitecto, jefe de proyecto, analista, diseñador, etcétera. De la misma forma no se hará<br />

un control de versiones, ya que el desarrollo se corresponde con una primera versión.<br />

Tampoco se abordan actividades propias de los sistemas distribuidos como por ejemplo<br />

diagramas de despliegue, ya que no se trata de un sistema distribuido.<br />

3.2. Tecnologías software<br />

A continuación, se enumeran las tecnologías software empleadas en el desarrollo<br />

de este trabajo. En los siguientes párrafos se describen dichas tecnologías desde un<br />

punto de vista general y, posteriormente se presentan las características más relevantes<br />

de las herramientas concretas empleadas en la realización de este proyecto de fin de<br />

carrera:<br />

• Orientación a Objetos.<br />

• Java.<br />

• API JavaCET.<br />

• XML<br />

• DTD y XML Schema<br />

• SAX y DOM<br />

3.2.1. Orientación a objetos<br />

La orientación a objetos es el paradigma de programación más utilizado<br />

actualmente en el desarrollo de aplicaciones. Esto se debe a la existencia de lenguajes<br />

como Java, C# y otros, que aportan otras muchas características que los hacen fáciles de


Capítulo 3. METODOLOGÍAS Y TECNOLOGÍAS 29<br />

usar, potentes, compatibles con muchas plataformas y, sobre todo, seguros y fáciles de<br />

depurar.<br />

El paradigma de programación orientada a objetos establece una asociación entre<br />

la información y las sentencias encargadas de gestionar dicha información. Desde un<br />

punto de vista de la programación procedimental, la orientación a objetos se puede ver<br />

como la asociación entre funciones y procedimientos a los tipos de datos que manejan.<br />

En programación orientada a objetos una clase es el conjunto formado por la<br />

definición de la estructura de la información y las sentencias que la gestionan. A los<br />

subprogramas que gestionan los datos, se les denomina métodos. A cada uno de los<br />

ítems de información que definen la estructura de la información se les denomina<br />

atributos o campos. En esta forma de organizar el código el módulo mínimo de<br />

programación es la clase.<br />

Cuando ejecutamos un programa orientado a objetos, a la entidad que tiene los<br />

valores de los ítems definidos en una clase se le denomina objeto.<br />

Además de esta organización del código existen primitivas de encapsulamiento,<br />

de forma que los atributos existentes en una clase quedan ocultos a los usuarios de esa<br />

clase. Para comunicar esa información se utilizan los métodos. Al conjunto de métodos<br />

de una clase que pueden ser usados por otras clases se le denomina interfaz pública.<br />

Las principales aportaciones de este paradigma al desarrollo de sistemas software<br />

son:<br />

• Herencia: característica que permite construir una clase (conocida como clase hija)<br />

basándose o teniendo como plantilla otra clase construida previamente (conocida<br />

como clase padre). Al utilizar una clase padre como base para definir una clase<br />

hija, los atributos y métodos definidos en la clase padre están disponibles en la<br />

clase hija. Es decir, los objetos de la clase hija tendrán valores para los atributos<br />

definidos en la clase hija y también tendrán valores para los atributos definidos en<br />

la clase padre. Esta característica permite una mayor reutilización del código, ya<br />

que si dos clases de un programa tienen ciertas características en común, se puede<br />

construir una clase que sea clase padre de las dos clases albergando los atributos y<br />

métodos que sean comunes a ambas.<br />

• Polimorfismo: característica de la programación orientada a objetos, muy<br />

relacionada con la herencia, que solventa un conjunto de problemas típicos que


Capítulo 3. METODOLOGÍAS Y TECNOLOGÍAS 30<br />

aparecían en la programación procedimental. En multitud de aplicaciones es<br />

necesario gestionar información con distinta estructura de una forma homogénea.<br />

Por ejemplo, en un programa de diseño gráfico hay que gestionar figuras<br />

geométricas de distintos tipos como rectángulos, círculos, triángulos,... En algunos<br />

casos, estas figuras han de gestionarse de forma homogénea, si se quiere cambiar su<br />

color o moverlas por el área de dibujo. En otras ocasiones, cada tipo de figura<br />

tendrá que responder de una forma particular. Si se quiere calcular su área, para<br />

cada tipo de figura hay que usar una expresión distinta. Para tratarlas de forma<br />

homogénea, se crea una clase padre, llamada Figura. En esta clase se definen los<br />

métodos comunes a todas las figuras: cambiar el color o cambiar su posición. En<br />

cambio, el área no se puede definir de una forma común y, por tanto, cada uno de<br />

los tipos de figuras definen su propio método para el cálculo del área. En la clase<br />

padre hay que definir un método que no tiene implementación, llamado abstracto.<br />

La implementación de este método será establecido en cada una de las clases hijas<br />

que representan a cada tipo de figura.<br />

Si declaramos una variable de la clase Figura, puede contener objetos de cada una<br />

de las clases hijas. Cuando sobre el valor de esta variable se ejecuta el método de<br />

cálculo del área, se usa el polimorfismo y se ejecuta la implementación del método<br />

que corresponde a la clase concreta de la figura. Es decir, el código que se va a<br />

ejecutar cuando se llame a un método, depende de la clase del objeto concreto que<br />

reciba el mensaje y no de la clase de la variable en que se llame.<br />

3.2.2. Java<br />

El lenguaje de programación utilizado en el desarrollo de este proyecto ha sido<br />

Java. A continuación, se presentan algunas de las características que han llevado a la<br />

elección de este lenguaje:<br />

• Orientado a objetos: Java trabaja con sus datos como objetos y con interfaces a<br />

esos objetos. Soporta las características propias del paradigma de la orientación a<br />

objetos: abstracción, encapsulamiento, herencia y polimorfismo. Encaja<br />

perfectamente con el proceso unificado de desarrollo, visto anteriormente.


Capítulo 3. METODOLOGÍAS Y TECNOLOGÍAS 31<br />

• Simple: Posee una curva de aprendizaje muy rápida. Ofrece toda la funcionalidad<br />

de un lenguaje potente, pero sin las características menos usadas y más confusas de<br />

éstos.<br />

• Robusto: Java realiza verificaciones en busca de problemas, tanto en tiempo de<br />

compilación como en tiempo de ejecución. La comprobación de tipos en Java ayuda<br />

a detectar errores lo antes posible, en el ciclo de desarrollo. Java obliga a la<br />

declaración explícita de los tipos de los ítems de información, reduciendo así las<br />

posibilidades de error. Maneja la memoria para eliminar las preocupaciones por<br />

parte del programador de la liberación o corrupción de la misma.<br />

• Portable: La indiferencia de la arquitectura representa sólo una parte de su<br />

portabilidad. Además, Java especifica los tamaños de sus tipos de datos básicos y el<br />

comportamiento de sus operadores aritméticos, de manera que los programas son<br />

iguales en todas las plataformas. Estas dos últimas características se conocen como<br />

la Máquina Virtual Java (JVM).<br />

• Orientado a aplicaciones: Dispone de muchas bibliotecas orientadas al desarrollo<br />

de múltiples aplicaciones, por ejemplo, existen librerías para gestionar bases de<br />

datos, para XML, gráficos, etcétera.<br />

3.2.3. API JavaCET<br />

La API JavaCET alberga un conjunto de clases que permiten analizar el código<br />

fuente de un programa escrito en Java y controlar su ejecución en otra máquina virtual.<br />

Esta API no tiene como objetivo gestionar el ciclo de desarrollo de una aplicación Java,<br />

sino que está preparada para gestionar código Java sin errores de compilación, que<br />

represente una aplicación correcta y permitiendo gestionar todos los aspectos de un<br />

programa escrito en el lenguaje de programación Java.<br />

Esta API representa un programa Java desde dos puntos de vista: su definición,<br />

formada por código y librerías; y su ejecución, la cual se puede ejecutar paso a paso,<br />

consultando el estado del sistema, o bien, permitiendo registrar una traza de la misma.<br />

Está definida e implementada también en lenguaje Java y sus principales ventajas son:


Capítulo 3. METODOLOGÍAS Y TECNOLOGÍAS 32<br />

• Facilidad de comprensión y manejo.<br />

• Ortogonalidad al representar los conceptos.<br />

• Tratamiento integrado de la definición y la ejecución.<br />

JavaCET hace uso de los principios de la programación orientada a objetos, por<br />

otro lado, es independiente de la implementación, lo que permite que se puedan<br />

desarrollar implementaciones diferentes que obedezcan a distintos criterios.<br />

Como ejemplo de su funcionamiento, para poder analizar y gestionar el código<br />

fuente de un programa y su ejecución desde otro programa Java, existe la clase llamada<br />

ProgramaJava, que en su constructor recibe como parámetro el directorio donde se<br />

encuentran los ficheros fuente del programa Java, las librerías usadas y la ruta del SDK<br />

usado para compilar y ejecutar dicho programa. En dicho constructor se realiza todo el<br />

reconocimiento léxico, sintáctico y semántico de los ficheros fuente y toda esta<br />

información se guarda como atributos de dicho objeto en memoria. En la Figura 4 se<br />

muestra esta transformación.<br />

ClaseA.java<br />

ClaseB.java<br />

:ProgramaJava<br />

ClaseLibreriaA.class<br />

fuentes<br />

ClaseLibreriaC.class<br />

Libreria.jar<br />

librerías<br />

Analisis<br />

léxico<br />

sintáctico<br />

semántico<br />

C:\j2sdk1.4.2_01<br />

sdk<br />

ficheros fuente, librerias<br />

externas y librerias estándar<br />

que componen un programa java<br />

Proceso de<br />

reconocimiento<br />

Estructura de datos<br />

orientada a objetos que representa<br />

al programa java<br />

Figura 4: Proceso generación ProgramaJava.


Capítulo 3. METODOLOGÍAS Y TECNOLOGÍAS 33<br />

3.2.4. XML<br />

XML o Lenguaje de Marcado Extensible (Extensible Markup Language), fue<br />

creado por el Consorcio para la World Wide Web en 1996 para superar las limitaciones<br />

de HTML (el Lenguaje de Marcado de HiperTexto que es la base para todas las páginas<br />

Web), ya que permite crear etiquetas propias. A pesar de que SGML ha sido usado<br />

durante décadas en la industria para publicación, su complejidad ha intimidado a mucha<br />

gente.<br />

La versión 1.0 de XML proporciona su especificación y los estándares adoptados.<br />

XML utiliza el conjunto de caracteres UNICODE, lo que permite su portabilidad entre<br />

sistemas y herramientas. UNICODE incluye los caracteres existentes en la mayoría de<br />

las lenguas que se utilizan en el mundo.<br />

A continuación se enumeran varias de las características más importantes de<br />

XML:<br />

• Separa el contenido de la presentación.<br />

• Asigna una estructura lógica a la información permitiendo crear un código más<br />

ligero.<br />

• Extensible.<br />

• Facilita el intercambio de documentos entre usuarios y aplicaciones.<br />

• Admite enlaces avanzados entre documentos.<br />

• Admite búsquedas avanzadas, consiguiendo búsquedas más rápidas.<br />

• Permite validar el contenido contra una gramática.<br />

• Da soporte a la Web semántica (extensión de la Web actual en la que el<br />

significado de la información queda bien-definido).<br />

• Es independiente de la plataforma sobre la que trabaja, con lo que simplifica el<br />

intercambio de datos.<br />

Hay dos tipos de documentos XML:


Capítulo 3. METODOLOGÍAS Y TECNOLOGÍAS 34<br />

• Documento bien/mal formado: en el caso de que sigua las reglas de sintaxis<br />

definidas por la especificación XML el documento se considera bien formado,<br />

en el caso contrario es mal formado.<br />

• Documentos válidos/no válidos: si un documento bien formado sigue las<br />

reglas definidas en un DTD o esquema, ese documento es válido; en el caso de<br />

que no siga las reglas será no válido.<br />

En la Tabla 10 se muestra un ejemplo de documento XML en el que vemos que se<br />

puede asignar algún significado a las etiquetas en el documento; más importante aún,<br />

resulta fácil para una máquina procesar la información, ya que se puede extraer el<br />

código postal de un documento simplemente localizando el contenido rodeado por las<br />

etiquetas y , técnicamente conocido como el<br />

elemento “codigo-postal”.<br />

<br />

<br />

Mrs.<br />

<br />

Mary<br />

<br />

<br />

McGoon<br />

<br />

<br />

<br />

1401 Main Street<br />

<br />

Anytown<br />

NC<br />

<br />

34829<br />

<br />

<br />

Tabla 10: Ejemplo de documento XML<br />

3.2.5. SAX y DOM<br />

Para acceder al contenido de los documentos XML se puede utilizar alguna de las<br />

dos interfaces de programación más empleadas actualmente:<br />

• SAX: API Simple para XML


Capítulo 3. METODOLOGÍAS Y TECNOLOGÍAS 35<br />

• DOM: Modelo de Objetos de Documento<br />

SAX y DOM utilizan dos enfoques muy diferentes. Ninguno de los dos enfoques<br />

ofrece soluciones para todos los casos que se pueden dar en las aplicaciones que<br />

trabajan con XML. Por tanto, se debe adoptar uno u otro dependiendo del caso<br />

particular del que se trate.<br />

SAX permite analizar documentos XML de forma secuencial, lo que permite que,<br />

aunque los documentos sean de gran tamaño, prácticamente no consuma memoria. Pero<br />

por otra parte, este tipo de procesamiento impide tener una visión global del documento<br />

por la que navegar.<br />

Un analizador que soporta esta interfaz recorre el documento XML que se está<br />

analizando de forma secuencial. Este analizador, según va detectando la ocurrencia de<br />

determinados eventos (comienzo/fin del documento, comienzo/fin de una etiqueta,<br />

etcétera), va realizando llamadas a funciones de retorno predefinidas. Son estas<br />

funciones de retorno en las que el programador introduce el código encargado de<br />

procesar los datos que contiene el documento XML.<br />

En cambio, DOM es una interfaz de programación que permite analizar y<br />

manipular dinámicamente, y de manera global, el contenido, el estilo y la estructura de<br />

un documento. Tiene su origen en el W3C.<br />

Para trabajar con un documento XML, primero se almacena en memoria en forma<br />

de árbol con nodos padre, nodos hijo y nodos finales, que son aquéllos que no tienen<br />

descendientes. En este modelo todas las estructuras de datos del documento XML se<br />

transforman en algún tipo de nodo, organizándose jerárquicamente en forma de árbol<br />

para representar la estructura descrita por el documento XML. Una vez creado el árbol<br />

en memoria, se van recorriendo los diferentes nodos y se analiza a qué tipo particular<br />

pertenecen. En función del tipo de nodo, la interfaz ofrece una serie de funcionalidades<br />

u otras para poder trabajar con la información que contienen.<br />

Para este proyecto, en el que se van a manejar documentos XML de diferentes<br />

tamaños, normalmente bastante grandes y complejos, es conveniente no cargarlos<br />

totalmente en memoria, ya que se reduciría enormemente la eficiencia. En este caso, la<br />

mejor herramienta para procesarlos es de manera secuencial mediante SAX, ya que para<br />

este proyecto no es necesario insertar, borrar, modificar,... estos documentos,<br />

únicamente es necesario su lectura.


Capítulo 3. METODOLOGÍAS Y TECNOLOGÍAS 36<br />

3.2.6. DTD y XML Schema<br />

Actualmente hay dos tipos posibles de gramáticas:<br />

• DTD, Document Type Declaration<br />

• XML Schema<br />

DTD es un lenguaje de definición de documentos concebido para SGML<br />

(Standard Generalized Markup Language), se puede usar para definir el modelo de<br />

contenido y los tipos de elementos y atributos dentro de un documento. Sin embargo<br />

tiene ciertas limitaciones, como puede ser su sintaxis, el hecho de que no es XML, sino<br />

que es específica y poco clara y no soporta espacios de nombres; su tipado de datos es<br />

extremadamente limitado y sus únicas cardinalidades posibles: 0, 1, infinito.<br />

Por otra parte XML Schema, que al igual que las DTDs describe la estructura de<br />

la información, sí tiene sintaxis XML y ofrece nuevas características sobre las DTDs.<br />

Soporta el tipado de datos, importando todos los tipos de datos de los lenguajes<br />

convencionales y proveyendo al desarrollador de la posibilidad de crear los suyos<br />

propios. También soporta validación de espacios de nombres, de forma que pueden<br />

coexistir múltiples esquemas sin que haya conflictos de nombres entre ellos. Ofrece<br />

características de orientación a objetos. Permite una reutilización sencilla de código y<br />

presenta menor rigidez a la hora de definir cardinalidades para elementos.<br />

Las DTD son una solución parcial a una de las principales carencias de XML: la<br />

posibilidad de definir vocabularios de fabricación propia destinados a cubrir las<br />

necesidades particulares. Se prevé que las DTDs en pocos años desaparezcan o queden<br />

relegadas en un segundo plano, debido sobre todo al trabajo que se está llevando a cabo<br />

en los XML Schema y a todas las ventajas que presentan éstos sobre las DTDs.<br />

Para la aplicación que se va a desarrollar se ha apostado por dar la posibilidad de<br />

generar tanto DTD como XML Schema a partir de una clase Java; este documento<br />

generado con cualquiera de los dos lenguajes nos servirá para validar el fichero XML a<br />

obtener en la serialización, con lo que también aprovechar las posibilidades que ofrecen<br />

multitud de herramientas de edición XML.<br />

De este modo se tendrán dos opciones: crear un XML Schema o un DTD.<br />

A continuación en la Tabla 11 se muestra un ejemplo de un XML Schema.


Capítulo 3. METODOLOGÍAS Y TECNOLOGÍAS 37<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

Tabla 11: Ejemplo de XML Schema


Capítulo 4. EJEMPLO DE USO 38<br />

4<br />

Capítulo 4<br />

EJEMPLO DE USO<br />

En este capítulo se va a simular una sesión con la herramienta desarrollada<br />

(SerXML). Lo que se pretende es hacer un seguimiento, paso a paso, del proceso de<br />

generación de los archivos para serializar/deserializar.<br />

Puede parecer que este capítulo rompe el orden lógico de la memoria, sin<br />

embargo, la idea es mostrar cómo es la herramienta cuyo desarrollo se explica en los<br />

siguientes capítulos. De esta forma, el lector puede obtener una idea global del resultado<br />

final, y el resto de la memoria le será más comprensible.<br />

Se irán enumerando distintos pasos a seguir en la edición de un documento, con<br />

sus respectivas pantallas y explicaciones. La interfaz ofrece diferentes caminos o formas<br />

de realizar una misma acción, por ejemplo a través de botones, opciones de menús o<br />

menús contextuales, etcétera. Este ejemplo de uso no se va a detener en contar todas las<br />

diferentes posibilidades, ya que eso se explicará en el siguiente capítulo. Una<br />

descripción más detallada de la aplicación, así como el formato del fichero de<br />

configuración se puede consultar en el Anexo A.<br />

1. Antes de abrir la clase Java, se ha de especificar el directorio o ruta donde se<br />

encuentra el Java SDK y, la ruta o directorio raíz del proyecto Java donde se<br />

encuentra la clase a abrir. Estas rutas se pueden especificar en las opciones<br />

“Especificar Ruta Java SDK” y “Especificar Ruta Proyecto” del menú<br />

“Opciones”, también, en el caso de no especificarse de esta forma y pulsar el botón<br />

“Abrir” o la opción “Abrir” del menú “Archivo” (Figura 5), se mostrarán las<br />

distintas ventanas donde seleccionar estos dos directorios. Los ficheros de<br />

configuración han de residir en el mismo directorio que las clases a las que


Capítulo 4. EJEMPLO DE USO 39<br />

corresponden, aunque es posible especificar un directorio distinto mediante la<br />

correspondiente opción en el menú “Opciones”, de esta forma el programa irá a<br />

buscarlas ahí<br />

Figura 5: Abrir clase Java<br />

Una vez especificados los directorios, el botón de apertura se encargará de<br />

preguntar el nombre de la clase, a partir de la cual, se quieren obtener todos los<br />

documentos, tal y como se puede ver en la Figura 6.<br />

El resultado de esta acción se muestra en la Figura 7, donde en el área de texto<br />

superior izquierdo se puede ver el contenido de la clase Java abierta; si ésta es<br />

correcta y no tiene errores de compilación, se activarán los tres botones de<br />

generación de documentos.


Capítulo 4. EJEMPLO DE USO 40<br />

Figura 6: Insertar nombre de la clase Java<br />

Figura 7: Clase Java abierta


Capítulo 4. EJEMPLO DE USO 41<br />

2. Generar los documentos necesarios para serializar/deserializar, pulsando el botón<br />

“Generar Java2XML” o seleccionando la opción “Generar archivos Java2XML”<br />

del menú “Generar”. Únicamente en el caso de que existan referencias circulares,<br />

se preguntará al usuario el nombre del nodo raíz, tal y como se puede apreciar en la<br />

Figura 8. Realizando esto, se generarán todos los documentos (necesarios para la<br />

serialización de la clase abierta), con el nombre Clase2XML, donde Clase es la<br />

clase que serializa. En la Figura 9 se observa el resultado de la ejecución de esta<br />

instrucción.<br />

Figura 8: Obtención del nombre del nodo raíz<br />

3. Generar el documento XML Schema, pulsando el botón “Generar XML Schema” o<br />

seleccionando la opción “Generar XML Schema” del menú “Generar”. Realizando<br />

esto, se generará el documento XML Schema correspondiente a la clase abierta. En<br />

la Figura 11 se observa el resultado de la ejecución de esta instrucción.<br />

4. Una vez generados todos los documentos, es posible guardarlos de distinta forma:<br />

seleccionando uno de la lista y eligiendo el directorio, guardándolos todos en un<br />

directorio elegido o guardándolos todos en el directorio de la clase abierta<br />

inicialmente. En la Figura 12 se puede observar el diálogo abierto una vez se pulsa<br />

el botón o la opción “Guardar Todo” del menú “Archivo”.


Capítulo 4. EJEMPLO DE USO 42<br />

Figura 9: Generación de los archivos Java2XML.java<br />

Figura 10: Generado DTD


Capítulo 4. EJEMPLO DE USO 43<br />

Figura 11: Generado XML Schema<br />

Figura 12: Guardando todos los documentos


Capítulo 4. EJEMPLO DE USO 44<br />

5. Finalmente, una vez guardados todos los documentos, en la Tabla 12 se observa el<br />

resultado de serializar un objeto de la clase Person.java (Tabla 1) que corresponde<br />

con el de la Tabla 2. Se puede apreciar, por un lado, cómo la serialización obtenida<br />

es totalmente independiente de Java y, por otro, la manera de resolver las<br />

referencias circulares, listas, etc.; además, es posible compararlo con los distintos<br />

resultados obtenidos en el capítulo dedicado al Estado del Arte (Capítulo 2), ya que<br />

se corresponde con el mismo ejemplo.<br />

<br />

<br />

Vane<br />

50<br />

false<br />

1979-06-09T00:00:00<br />

<br />

<br />

<br />

<br />

<br />

<br />

Mauri<br />

80<br />

1979-06-12T00:00:00<br />

<br />

<br />

Sergio<br />

75<br />

1979-09-03T00:00:00<br />

<br />

<br />

<br />

<br />

<br />

Tabla 12: Serialización ejemplo con SerXML


Capítulo 5. ESPECIFICACIÓN DE REQUISITOS 45<br />

5<br />

Capítulo 5<br />

ESPECIFICACIÓN DE REQUISITOS<br />

El objetivo de la captura de los requisitos es recopilar, clasificar e interpretar<br />

aquella información que debe ser registrada sobre el sistema y que el cliente espera<br />

como solución a sus necesidades, plasmándolo en requisitos claros, concretos y<br />

diferenciados. De esta manera, se mejora la calidad del software y la satisfacción del<br />

usuario, reduciendo los errores y el tiempo de desarrollo.<br />

El resultado de esta actividad es una lista clasificada en categorías, de todos y<br />

cada uno de los requisitos que el sistema debe satisfacer.<br />

Los desarrolladores de software profesionales habitualmente no crean código para<br />

sí mismos, sino para usuarios de software u otros desarrolladores. Los usuarios finales,<br />

con frecuencia, no saben cuáles son los requisitos ni tampoco cómo especificarlos de<br />

una forma precisa, con lo que es importante la tarea de especificar correctamente los<br />

requisitos para abarcar todas las necesidades de éstos. Sirviendo, por un lado al usuario,<br />

para conocer las características del sistema que va a recibir, y por otro lado al grupo de<br />

desarrollo, para el diseño y prueba del sistema.<br />

En este proyecto los clientes o usuarios son los integrantes del departamento y, en<br />

especial, los tutores de dicho proyecto, de esta forma se han podido establecer, mediante<br />

reuniones, los requisitos del sistema.<br />

En cuanto a los requisitos a considerar se pueden distinguir a grandes rasgos entre:<br />

funcionales, aquéllos que especifican las acciones que debe ser capaz de realizar el<br />

sistema; y no funcionales, aquéllos que especifican propiedades del sistema.<br />

La técnica inmediata para identificar los requisitos del sistema se basa en los casos<br />

de uso, los cuales capturan tanto los requisitos funcionales como los no funcionales, que


Capítulo 5. ESPECIFICACIÓN DE REQUISITOS 46<br />

son específicos de cada caso de uso. Por otra parte, están los requisitos adicionales, que<br />

son aquellos requisitos no funcionales que no se asocian a un caso de uso concreto.<br />

Un caso de uso especifica el comportamiento de un sistema o una parte del<br />

mismo, y es una descripción de un conjunto de secuencias de acciones, incluyendo<br />

variantes, que ejecuta un sistema para producir un resultado, de valor, observable por un<br />

actor (el cual representa a uno o más usuarios del sistema al que pertenece).<br />

En los siguientes apartados se describe de una forma general la herramienta y se<br />

especifican los requisitos según el estándar IEEE 830-1998. Posteriormente, dentro de<br />

este mismo capítulo, se realiza un estudio de los requisitos mediante la realización de<br />

diagramas de casos de uso y la formalización de dos de los más importantes.<br />

5.1. Descripción general<br />

5.1.1. Perspectiva del producto<br />

Interfaces del sistema<br />

La aplicación es totalmente independiente en cuanto a que no pertenece a ningún<br />

sistema complejo mayor que se sitúe por encima de él.<br />

Interfaces de usuario<br />

La aplicación dispondrá de una interfaz gráfica de usuario a través de la cual se<br />

podrá abrir una clase Java (que se situará en el área de texto de la parte izquierda) y<br />

generar el fichero Java, DTD o XML Schema a través de los menús o botones que se<br />

ofrecen. Una vez creados, se van añadiendo a una lista con todos los demás ficheros<br />

creados y, según la selección, se mostrarán en el área de texto de la parte derecha con la<br />

posibilidad de guardarlo en cualquier unidad.<br />

Interfaces hardware<br />

La aplicación se definirá teniendo en cuenta la tecnología Java. No se consideran<br />

requisitos software adicionales a los que impone la propia tecnología Java.


Capítulo 5. ESPECIFICACIÓN DE REQUISITOS 47<br />

Interfaces software<br />

La aplicación se definirá teniendo en cuenta la tecnología Java. No se consideran<br />

requisitos software adicionales a los que impone la propia tecnología Java.<br />

5.1.2. Funciones del producto<br />

Las principales funciones de la aplicación son abrir clase Java; crear una nueva<br />

clase Java, que se utilizará para serializar/deserializar en XML; crear la DTD y/o XML<br />

Schema; guardar la nueva clase Java y cerrar los documentos. En cuanto a la<br />

visualización del documento se muestran dos áreas de texto: la de la izquierda, con la<br />

clase Java abierta y la de la derecha, mostrando el documento seleccionado de una lista<br />

con los documentos generados, que está situada en la parte inferior izquierda.<br />

5.1.3. Características del usuario<br />

Los usuarios que usen la aplicación deberán conocer el lenguaje de programación<br />

Java. Además, si se desea manipular los ficheros XML, DTD o XML Schema, en caso<br />

de generarse, se deberán conocer sus distintos lenguajes a un nivel medio.<br />

5.2. Requisitos específicos<br />

5.2.1. Interfaces<br />

La aplicación se acoge al estándar tradicional de ventanas GUI. La interfaz gráfica<br />

de usuario (GUI, Graphical User Interface), es una alternativa moderna a la E/S por la<br />

terminal que permite a la aplicación comunicarse con su usuario. En una GUI se crea<br />

una aplicación de ventanas.


Capítulo 5. ESPECIFICACIÓN DE REQUISITOS 48<br />

5.2.1.1. Ventana de la aplicación<br />

La interfaz gráfica de la aplicación contiene los siguientes elementos:<br />

• Barra de título: con el nombre de la aplicación, llamada serXML, y con<br />

botones para minimizar, restaurar y cerrar la aplicación.<br />

• Barra de menú: con las siguientes opciones y submenús:<br />

o Archivo: opciones para manejar los documentos.<br />

• Abrir: abre una clase Java (después de introducir su nombre) y<br />

lo añade en el área de texto izquierdo. En el caso de que no se<br />

hubieran especificado las rutas de Java SDK y la ruta del<br />

proyecto (donde buscar esta clase), se preguntarán.<br />

• Guardar Seleccionado: guarda el documento seleccionado de la<br />

lista que está contenido en el área de texto derecho, en el<br />

directorio específico.<br />

• Guardar Todo: guarda todos los documentos generados en el<br />

directorio donde se encuentra la clase abierta.<br />

• Guardar Todo en…: guarda todos los documentos generados<br />

en el directorio seleccionado por el usuario.<br />

• Cerrar: cierra todos los documentos, tanto abiertos como<br />

generados.<br />

• Salir: cierra la aplicación.<br />

o Generar: opciones para las distintas generaciones de documentos a<br />

partir del fichero Java abierto.<br />

• Generar archivo Java2XML: genera la clase Java necesaria<br />

para la serialización/deserialización.<br />

• Generar DTD: genera el DTD correspondiente.<br />

• Generar XML Schema: genera el XML Schema.<br />

o Opciones: para especificar las rutas necesarias donde el programa<br />

obtendrá todas la clases y APIs necesarias.<br />

• Especificar Ruta Java SDK: especifica la ruta donde el<br />

programa ha de buscar el Java SDK.


Capítulo 5. ESPECIFICACIÓN DE REQUISITOS 49<br />

• Especificar Ruta Proyecto: especifica la ruta del directorio raíz<br />

donde se encuentra la clase para la cual se generarán los<br />

documentos.<br />

• Especificar Ruta Ficheros Configuración: especifica la ruta<br />

donde se encuentran los ficheros de configuración de todas las<br />

clases a procesar.<br />

o Ayuda: ayuda de la aplicación<br />

• Ayuda de SerXML: se muestra una ayuda para el manejo de la<br />

herramienta.<br />

• Acerca de: muestra información acerca de la aplicación.<br />

• Botones: con las mismas funcionalidades que sus correspondientes opciones<br />

de menú. Dispone de los siguientes botones por orden de aparición de<br />

izquierda a derecha y de arriba a abajo:<br />

o Abrir<br />

o Guardar Todo<br />

o Generar Java2XML<br />

o Generar DTD<br />

o Generar XML Schema<br />

• Vistas: la aplicación contiene dos áreas de texto verticales y una lista en la<br />

parte inferior izquierda.<br />

o Área de texto izquierda: vista de texto plano que presenta el contenido<br />

del documento abierto con anterioridad.<br />

o Área de texto derecha: vista de texto plano que presenta el contenido<br />

del documento seleccionado de la lista que se detalla a continuación.<br />

o Lista: vista con la lista de los documentos generados.<br />

5.2.1.2. Diálogos<br />

La aplicación presenta en su ejecución una serie de cuadros de diálogo para llevar<br />

a cabo distintas funcionalidades. Se presentan en las siguientes líneas de forma<br />

esquematizada:


Capítulo 5. ESPECIFICACIÓN DE REQUISITOS 50<br />

• Diálogo de apertura<br />

o Barra de título<br />

Contiene el texto “Seleccione Directorio de Java SDK” o “Selección<br />

Directorio Raíz del Proyecto (donde se encuentra la clase Java)” y un<br />

botón de cerrar ventana.<br />

o Descripción<br />

Muestra las distintas unidades de disco y directorios donde poder<br />

seleccionar un directorio.<br />

o Origen<br />

Aparece al seleccionar el usuario la opción “Especificar Ruta SDK” o<br />

“Especificar Ruta Proyecto” del menú “Opciones”, y en el caso de no<br />

haber introducido anteriormente estos datos, al seleccionar “Abrir” del<br />

menú “Archivo” o al pulsar el botón “Abrir”.<br />

o Formato/organización de la ventana<br />

Dentro del marco principal de la ventana contiene, en la parte<br />

superior, el texto “Buscar en” junto con una lista desplegable, para<br />

seleccionar la unidad de disco o directorio donde se encuentra el<br />

directorio a abrir, y una serie de botones con opciones para navegar,<br />

crear y visualizar los distintos directorios. En el centro de la ventana<br />

presenta un área de texto, cuyo contenido es seleccionable, con una<br />

barra de desplazamiento horizontal (en caso de ser necesaria) donde se<br />

muestran todas las carpetas dentro de la unidad o carpeta seleccionada<br />

anteriormente. En la parte inferior presenta un campo de texto donde<br />

aparecerá el nombre del directorio que se seleccione para su apertura;<br />

un campo con una lista desplegable indicando “Todos los<br />

documentos” y por último dos botones para confirmar (“Abrir”) o<br />

cancelar (“Cancelar”) la operación.<br />

• Diálogo de guardar<br />

o Barra de título<br />

Contiene el texto “Guardar Archivo” o “Guardar Todo en…<br />

(seleccione directorio)” y un botón de cerrar ventana.<br />

o Descripción


Capítulo 5. ESPECIFICACIÓN DE REQUISITOS 51<br />

Muestra las distintas unidades de disco y directorios donde poder<br />

guardar un documento o clase Java, o todos ellos.<br />

o Origen<br />

Aparece al seleccionar el usuario la opción “Guardar Seleccionado” o<br />

“Guardar Todo en…” del menú “Archivo”.<br />

o Formato/organización de la ventana<br />

Este diálogo, en cuanto a organización, es igual al de apertura, salvo<br />

cambios mínimos como el texto “Buscar en” que se sustituye por<br />

“Guardar en” y el propósito del diálogo simplemente.<br />

• Dialogo de entrada de datos<br />

o Barra de título<br />

Contiene el texto “SerXML” y un botón de cerrar ventana.<br />

o Descripción<br />

Presenta un texto descriptivo y un área donde introducir el nombre de<br />

la clase.<br />

o Origen<br />

Aparece al querer abrir una clase de Java para crear los documentos.<br />

o Formato/Organización de la ventana<br />

Dentro de la ventana contiene únicamente un icono de pregunta, junto<br />

con un mensaje y un área donde introducir el nombre de la clase Java<br />

a abrir, un botón “Aceptar” para confirmar y otro de “Cancelar” para<br />

anular la apertura.<br />

• Diálogo de error<br />

o Barra de título<br />

Contiene el texto “SerXML” y un botón de cerrar ventana.<br />

o Descripción<br />

Presenta un mensaje de error informando de la imposibilidad de<br />

realizar una acción determinada y por qué.<br />

o Origen<br />

Aparece al intentar realizar el usuario una acción concreta y no ser<br />

posible o al haberse encontrado con un error de algún tipo en la<br />

generación de alguno de los documentos.


Capítulo 5. ESPECIFICACIÓN DE REQUISITOS 52<br />

o Formato/Organización de la ventana<br />

Dentro de la ventana contiene únicamente un icono asociado al tipo de<br />

mensaje, en este caso de prohibición, junto con el mensaje informativo<br />

y un botón “Aceptar” para confirmar su lectura.<br />

• Diálogo de acerca de<br />

o Barra de título<br />

Contiene el texto “Acerca de SerXML” y un botón de cerrar ventana.<br />

o Descripción<br />

Muestra información general de la aplicación, como es su nombre,<br />

versión, desarrolladores, etcétera.<br />

o Origen<br />

Aparece al seleccionar la opción de menú “Acerca de”.<br />

o Formato/organización de la ventana<br />

Presenta la información típica de una ventana de estas características.<br />

En la parte inferior contiene un botón “Aceptar”.<br />

5.2.2. Requisitos funcionales<br />

Los requisitos funcionales definen qué debe hacer el sistema, incluyendo los<br />

requisitos relativos a la funcionalidad específica del sistema y los relativos a los<br />

servicios generales del sistema.<br />

Para este proyecto, los requisitos funcionales se pueden dividir en cinco bloques,<br />

tres son para el documento que generan:<br />

- Documento Java.<br />

- Documento DTD.<br />

- Documento XML Schema.<br />

Y de los otros dos, uno es para el manejo de la interfaz gráfica y el otro para el<br />

manejo del fichero de configuración.


Capítulo 5. ESPECIFICACIÓN DE REQUISITOS 53<br />

5.2.2.1. Requisitos para generar el documento Java para la<br />

serialización/deserialización<br />

REQ.FUN.1. – Generación de la clase Java para serializar<br />

Ofrecer la posibilidad de generar una clase Java que será utilizada para serializar<br />

un objeto Java en un documento en XML. Dicha clase tendrá el nombre de la<br />

clase del objeto Java a serializar más 2XML.java.<br />

REQ.FUN.1.1. – Contener el método toXML<br />

Contener la clase Java a generar el método: toXML, dando la posibilidad de,<br />

con este método y pasándole como parámetros un objeto y un OutputStream,<br />

crear un documento XML correspondiente a la serialización del objeto anterior<br />

y devolverlo a través del flujo de salida (OutputStream).<br />

REQ.FUN.1.2. – Serializar todas las partes de una clase Java<br />

Mediante el fichero generado se serializarán todos los aspectos de la clase Java,<br />

así como de las clases que son atributos y así sucesivamente.<br />

REQ.FUN.1.2.1. – Independiente de Java<br />

La serialización generada será completamente independiente de Java, dando<br />

la posibilidad de exportarla a otros lenguajes de programación.<br />

REQ.FUN.1.2.2. – Serializar atributos<br />

Serializar los atributos de una clase como etiquetas XML.<br />

REQ.FUN.1.2.3. – Serializar el valor de los atributos como caracteres<br />

Serializar el valor del atributo del objeto como valor de la etiqueta<br />

especificado en el requisito REQ.FUN.1.2.2., para dicho atributo, se<br />

almacenará como caracteres.<br />

REQ.FUN.1.2.4. – No serializar los atributos nulos<br />

Los atributos cuyo valor todavía no haya sido inicializado y sean nulos, no<br />

se añadirán a la serialización, con lo que no se incluirá ninguna etiqueta<br />

XML para este.<br />

REQ.FUN.1.2.5. – Clases para la transformación a String<br />

Para clases importadas desde una API externa o de la API de Java, de las<br />

que no tenemos el código y que aparecen como tipos de atributos, será


Capítulo 5. ESPECIFICACIÓN DE REQUISITOS 54<br />

necesario que exista una clase Java con el nombre de dicha clase importada<br />

que se va a serializar más 2String, de la forma nombreClase2String.<br />

REQ.FUN.1.2.5.1. – Transformar a caracteres con el método toString<br />

Utilizar de la clase nombreClase2String, mencionada en el requisito<br />

padre (REQ.FUN.1.2.5.), el método toString. Mediante este método se<br />

transformará una clase, de la cual no tenemos el código (importada de<br />

otra API o de la API de Java), a String para poder insertarlo como valor<br />

de una etiqueta XML. A este método se le pasará como atributo un<br />

Object de la clase correspondiente, para poder devolver un<br />

java.lang.String.<br />

REQ.FUN.1.2.6. – Referencias entre clases mediante atributos (incluidas<br />

circulares)<br />

Aquellas referencias entre clases que quieran ser representadas mediante un<br />

atributo identificador en la etiqueta XML, se definirán en el fichero de<br />

configuración (REQ.FUN.1.2.7). Estas referencias serán necesarias en el<br />

caso de referencias circulares, y si éstas no existen, se tomará por defecto<br />

sin el atributo identificador, por lo que en caso de haber referencias se<br />

anidarán las etiquetas XML.<br />

Al identificar una referencia en un atributo a una determinada clase, se<br />

utilizará el fichero (al igual que en REQ.FUN.1) con el nombre de la clase<br />

de dicho atributo más 2XML. De esta forma se serializará el objeto de este<br />

atributo.<br />

REQ.FUN.1.2.7. – Serializar listas<br />

Serializar las listas de una clase como etiquetas XML, tantas como objetos<br />

tenga la lista. Dichas etiquetas tendrán el nombre de la clase que alberga la<br />

lista, y estarán incluidas en una etiqueta con el nombre del atributo de dicha<br />

lista. En la Tabla 13 se muestra un ejemplo, donde coches es el nombre del<br />

atributo y Coches el nombre de la clase que alberga la lista.<br />

Entenderemos como listas aquellas clases que implementan el interfaz<br />

java.util.List o java.util.Set.<br />

En el fichero de configuración será necesario especificar la clase de los<br />

objetos que va a albergar la lista.


Capítulo 5. ESPECIFICACIÓN DE REQUISITOS 55<br />

<br />

<br />

M-4567-CH<br />

<br />

…<br />

<br />

Tabla 13: Ejemplo de serialización de listas<br />

REQ.FUN.1.2.8. – Serializar maps<br />

Serializar las clases que implementan la interfaz java.util.Map, identificando<br />

cada par key/value dentro de una etiqueta denominada MapEntry, todas<br />

estas etiquetas MapEntry se incluirán dentro de una etiqueta XML con el<br />

nombre del atributo (cuya clase implementa la interfaz java.util.Map). Los<br />

pares key y value se serializarán como cualquier otro atributo cuyo tipo no<br />

sea primitivo.<br />

En la Tabla 14 se muestra un ejemplo en el que se puede ver su<br />

funcionamiento.<br />

<br />

<br />

<br />

M-4567-CH<br />

<br />

<br />

SEAT Leon<br />

<br />

<br />

<br />

…<br />

<br />

…<br />

<br />

Tabla 14: Ejemplo de serialización maps<br />

Será necesario especificar en el fichero de configuración la clase de los<br />

objetos que va a albergar tanto el key como el value.<br />

REQ.FUN.1.2.9. – Serializar tanto atributos privados como públicos<br />

Se deberán soportar tanto atributos públicos como no públicos. En el caso<br />

de encontrar un atributo que sea no público, deberá existir en la clase el<br />

método get seguido del nombre del atributo con la primera letra mayúscula<br />

(Ej.: para el atributo numLibros el método sería: getNumLibros()). Dicho<br />

método devolverá el valor del atributo.


Capítulo 5. ESPECIFICACIÓN DE REQUISITOS 56<br />

Esto no será necesario en el caso de que se vaya a integrar el código<br />

generado en la clase.<br />

REQ.FUN.2. – Generación de la clase Java para deserializar<br />

Dar la posibilidad de generar una clase Java que será utilizada para deserializar un<br />

objeto Java a partir de un documento XML, al igual que en el requisito<br />

REQ.FUN.1., la clase tendrá el nombre del objeto Java a deserializar junto con<br />

2XML.<br />

REQ.FUN.2.1. – Contener el método fromXML<br />

Contener la clase Java a generar el método fromXML, dando la posibilidad de,<br />

con este método y pasándole como parámetro un InputStream, devolver un<br />

objeto que corresponde a la deserialización del documento XML pasado<br />

mediante dicho flujo de entrada (InputStream).<br />

REQ.FUN.2.2. – Deserializar todas las etiquetas y atributos del documento XML<br />

Mediante el fichero generado se deserializarán todas las etiquetas y atributos<br />

del documento XML, a través del método comentado en REQ.FUN.2.1.<br />

REQ.FUN.2.2.1 – Etiquetas XML<br />

Mediante el nombre de la etiqueta se sabrá a qué atributo se hace referencia,<br />

y con el valor de dicha etiqueta asignar el valor al atributo anterior.<br />

REQ.FUN.2.2.2. – Atributos de las etiquetas XML<br />

El atributo en una etiqueta XML tiene la función de identificar el objeto al<br />

que representa la etiqueta para posibles referencias futuras, si estas<br />

referencias no existen, no se añadirá el atributo.<br />

REQ.FUN.2.2.3. – Atributos sin valor en el documento XML<br />

Aquellos atributos para los cuales no existan etiquetas en el documento<br />

XML tendrán valor nulo, de la misma forma que cuando se serializó.<br />

REQ.FUN.2.2.4. – Clases para la transformación desde String<br />

Para clases importadas desde una API externa o de la API de Java, de las<br />

que no tenemos el código y que aparecen como tipos de atributos, será<br />

necesario que exista una clase Java con el nombre de dicha clase importada<br />

que se va a serializar más 2String, de la forma nombreClase2String.


Capítulo 5. ESPECIFICACIÓN DE REQUISITOS 57<br />

REQ.FUN.2.2.4.2. – Transformar a caracteres con el método fromString<br />

Utilizar de la clase nombreClase2String, mencionada en el requisito<br />

padre (REQ.FUN.2.2.4.), el método fromString, pasándole como atributo<br />

un java.util.String (caracteres obtenidos del valor de la etiqueta XML),<br />

para poder devolver un objeto de la clase correspondiente.<br />

REQ.FUN.2.2.5. – Referencias entre clases mediante atributos (incluidas<br />

circulares)<br />

En el caso de encontrar una etiqueta XML que haga referencia a un atributo<br />

de otra clase de nuestro proyecto, se utilizará el fichero (al igual que en<br />

REQ.FUN.2) con el nombre de la clase de dicho atributo más 2XML. De<br />

esta forma se deserializará el objeto de este atributo.<br />

REQ.FUN.2.2.6. – Deserializar listas<br />

En el caso de obtener más de una etiqueta XML con el mismo nombre o que<br />

corresponda a la implementación de java.util.List, se procederá a crear el<br />

objeto añadiendo los objetos deserializados en cada etiqueta.<br />

REQ.FUN.2.2.7. – Deserializar maps<br />

Si hay más de una etiqueta XML que corresponde a una serialización de una<br />

clase que implementa la interfaz java.util.Map, se procederá a añadir todos<br />

los objetos mediante el key y value que están dentro de cada etiqueta<br />

MapEntry.<br />

REQ.FUN.2.2.8. – Deserializar tanto atributos privados como públicos.<br />

Se deberán soportar tanto atributos públicos como no públicos. En el caso<br />

de encontrar un objeto cuyo atributo sea no público, deberá existir en la<br />

clase el método set seguido del nombre del atributo con la primera letra<br />

mayúscula (Ej.: para el atributo numLibros el método sería: setNumLibros).<br />

A este método se le debe pasar como parámetro el valor del atributo.<br />

Esto no será necesario en el caso de que se vaya a integrar el código<br />

generado en la clase.<br />

REQ.FUN.2.3. – Utilizar SAX<br />

Para la lectura del documento XML se utilizará SAX, como ya se ha<br />

comentado en el presente documento en el capítulo 3 (apartado 3.2.5. SAX y<br />

DOM).


Capítulo 5. ESPECIFICACIÓN DE REQUISITOS 58<br />

REQ.FUN.3. – Fichero de configuración<br />

En caso de querer especificar alguna de las opciones a configurar en la<br />

serialización, será posible utilizar un fichero de configuración, los requisitos para<br />

este fichero se especifican en la sección: Requisitos para leer el documento de<br />

configuración de esta sección.<br />

5.2.2.2. Requisitos para generar el documento DTD<br />

REQ.FUN.4. – Generar DTD<br />

Dar la posibilidad de generar el documento DTD de la clase original Java<br />

transformando las distintas partes de ésta.<br />

5.2.2.3. Requisitos para generar el documento XML Schema<br />

REQ.FUN.5. – Generar XML Schema<br />

Dar la posibilidad de generar el documento XML Schema de la clase original Java<br />

transformando las distintas partes de ésta.<br />

5.2.2.4. Requisitos para el manejo del documento de configuración<br />

REQ.FUN.6. – Utilizar un documento de configuración<br />

A través de un documento de configuración, obtener especificadas claramente las<br />

opciones para la generación de los distintos documentos (Java, DTD y XML<br />

Schema). Acceder al documento de configuración mediante el nombre de la clase<br />

original más 2XML.config, de la forma: nombreClaseOriginal2XML.config.<br />

REQ.FUN.6.1. – Obtener de la configuración el constructor a utilizar para la<br />

deserialización (opcional)<br />

Tomar para la deserialización del objeto Java el constructor que se desea<br />

utilizar y los parámetros de entrada de éste, a los cuales se les asigna valor. Si<br />

no se encuentra esta opción en el documento, tomar el constructor por defecto<br />

(sin parámetros).


Capítulo 5. ESPECIFICACIÓN DE REQUISITOS 59<br />

REQ.FUN.6.2. – Obtener de la configuración si el documento generado será<br />

integrado o no en la clase Java original (opcional)<br />

En la configuración se especificará mediante la opción integrado. En el caso de<br />

querer introducir el código Java que se genera, a partir de la clase abierta,<br />

dentro de esta misma clase, sin la necesidad de generar otra nueva clase, esta<br />

opción tendrá el valor de si; y en el caso de querer generar una nueva clase de<br />

nombre: nombreClaseAbierta.java, donde introducir el código generado, el<br />

valor de integrado será no.<br />

REQ.FUN.6.3. – Obtener de la configuración las clases de los objetos que<br />

albergan los tipos java.util.List o java.util.Set (obligatorio)<br />

Para cada uno de los atributos que aparezcan en la clase abierta, que<br />

implementen la interfaz java.util.List o java.util.Set, obtener la clase Java de<br />

los objetos que albergan. Mostrar un mensaje de error en caso de no obtener tal<br />

configuración en el fichero.<br />

REQ.FUN.6.4. – Obtener de la configuración las clases o tipos para los tipos<br />

java.util.Map (obligatorio)<br />

Para cada uno de los atributos que aparezcan en la clase abierta, que<br />

implementen la interfaz java.util.Map, obtener la clase Java de los objetos que<br />

albergan, tanto para la clave como para su valor. Mostrar un mensaje de error<br />

en caso de no obtener tal configuración en el fichero.<br />

REQ.FUN.6.5. – Obtener de la configuración si la clase a procesar ha de soportar<br />

referencias circulares (opcional)<br />

Se podrá definir en el documento de configuración si la clase abierta ha de<br />

soportar referencias circulares, esto ocurre cuando desde otra clase algún<br />

atributo hace referencia circular sobre esta, en este caso se ha de especificar<br />

también el atributo a tener en cuenta en las referencias circulares.<br />

REQ.FUN.6.6. – Obtener de la configuración las referencias circulares existentes<br />

(opcional)<br />

Se podrá definir en el documento de configuración, aquellos atributos que<br />

realizan referencia circular hacia una clase que no pertenezca a la API estándar<br />

de Java o a una API externa (por lo que tenemos su código fuente que se<br />

encuentra en el proyecto). Además se tendrá que configurar la clase a la que<br />

hace referencia este atributo para que soporte la referencia circular.


Capítulo 5. ESPECIFICACIÓN DE REQUISITOS 60<br />

REQ.FUN.6.7. – Obtener de la configuración el paquete donde residen las clases<br />

para transformar las clases a String (opcional)<br />

En el documento se podrá identificar el paquete donde residen las clases para<br />

transformar las clases importadas de Java a y desde String (requisitos<br />

REQ.FUN.2.2.4 y REQ.FUN.1.2.5.)<br />

REQ.FUN.6.8. – Obtener de la configuración el paquete donde residirá la clase<br />

(opcional)<br />

En el documento se podrá identificar el paquete donde residirá la clase<br />

Java2XML a generar (requisito REQ.FUN.1.)<br />

5.2.2.5. Requisitos relativos al manejo de la interfaz<br />

REQ.FUN.7. – Abrir documento<br />

Ocurrirá cuando el usuario pulse el botón de abrir documento o seleccione la<br />

opción “Abrir” del menú “Archivo”. En el caso de no haber seleccionado la Ruta<br />

de Java SDK y/o la Ruta Raíz del Proyecto (donde se encuentra la clase a abrir),<br />

se preguntará mediante diálogos de apertura (ver apartado 5.2.1.2, para todas las<br />

referencias a diálogos). Una vez especificadas las rutas, se mostrará un diálogo de<br />

entrada de datos donde se especificará el nombre de la clase a abrir. Antes de abrir<br />

se comprobará que no tenga ningún error de compilación o no existe dicha clase,<br />

en el caso de que tuviera algún error, se avisará con un diálogo de error. Si todo es<br />

correcto, se añadirá al área de texto izquierdo, donde se podrá visualizar su<br />

contenido.<br />

REQ.FUN.8. – Guardar documento<br />

El usuario podrá seleccionar la opción “Guardar Seleccionado” del menú<br />

“Archivo”. Una vez se ejecuta esta acción, se procederá a guardar aquel<br />

documento que estuviera seleccionado en la lista de ficheros generados y<br />

apareciera en el área de texto derecha.<br />

REQ.FUN.9. – Guardar todo<br />

El usuario podrá seleccionar la opción “Guardar Todo” del menú “Archivo” o<br />

pulsar el botón con éste nombre. Una vez se ejecuta esta acción, se procederá a<br />

guardar todos los documentos con su correspondiente nombre, en el directorio<br />

donde se encuentra la clase inicialmente abierta.


Capítulo 5. ESPECIFICACIÓN DE REQUISITOS 61<br />

REQ.FUN.10. – Guardar todo en…<br />

El usuario podrá seleccionar la opción “Guardar Todo en…” del menú “Archivo”.<br />

Una vez se ejecuta esta acción, se procederá a guardar todos los documentos con<br />

su correspondiente nombre, en el directorio donde el usuario especifique mediante<br />

una diálogo de guardar.<br />

REQ.FUN.11. – Cerrar documento<br />

La aplicación cerrará el documento abierto y todos los documentos generados tras<br />

seleccionar la opción “Cerrar” del menú “Archivo”. Antes de cerrarlo, se<br />

inicializarán todas las variables del programa, se limpiarán las áreas de texto y la<br />

lista con los ficheros generados.<br />

REQ.FUN.12. – Generar Java2XML<br />

Mediante este botón se generarán todos los documentos necesarios para la<br />

serialización/deserialización, tanto de la clase abierta como de sus referencias a<br />

otras.<br />

REQ.FUN.13. – Generar DTD<br />

Generará mediante este botón el DTD correspondiente a la clase abierta.<br />

REQ.FUN.14. – Generar XML Schema<br />

Generará mediante a este botón el XML Schema correspondiente a la clase<br />

abierta.<br />

REQ.FUN.15. – Especificar ruta donde se encuentra el Java SDK<br />

Mostrará un diálogo de apertura, donde seleccionar el directorio donde se<br />

encuentra el Java SDK necesario.<br />

REQ.FUN.16. – Especificar ruta raíz del proyecto<br />

Mostrará un diálogo de apertura, donde seleccionar el directorio raíz del proyecto<br />

en el que se encuentra la clase a abrir.<br />

REQ.FUN.17. – Especificar ruta ficheros configuración<br />

Mostrará un diálogo de apertura, donde especificar la ruta en la que se encuentran<br />

los ficheros de configuración de todas las clases a procesar.<br />

REQ.FUN.18. – Listado de ficheros generados<br />

En la parte inferior izquierda aparecerá una lista con todos los ficheros generados<br />

(ya sean Java, dtd o xsd). Cada vez que se genere un fichero se añadirá a esta lista,<br />

y en cualquier momento se podrá seleccionar uno para ver su contenido reflejado<br />

en el área de texto derecho.


Capítulo 5. ESPECIFICACIÓN DE REQUISITOS 62<br />

REQ.FUN.19. – Área de texto izquierda.<br />

Este área de texto aparecerá en la parte superior izquierda y será posible ver la<br />

clase Java abierta.<br />

REQ.FUN.20. – Área de texto derecha<br />

En el área de texto de la parte derecha de la aplicación aparecerá el contenido del<br />

documento seleccionado en la lista.<br />

REQ.FUN.21. – Mostrar ayuda del manejo de la aplicación<br />

Cuando el usuario pulse la opción “Ayuda de SerXML” del menú “Ayuda”, se<br />

mostrará la información necesaria para la utilización de la aplicación<br />

REQ.FUN.22. – Mostrar información de la aplicación<br />

Una vez el usuario pulsa la opción “Acerca de” del menú “Ayuda”, se le mostrará,<br />

a través del diálogo de acerca de, información sobre de la aplicación.<br />

REQ.FUN.23. – Salir de la aplicación<br />

El usuario dispondrá de dos alternativas para cerrar la aplicación: pulsando el<br />

botón de cerrar de la barra de título o bien seleccionando la opción “Salir” del<br />

menú “Archivo”. En cualquier caso, todas las ventanas de la aplicación se<br />

cerrarán.<br />

5.2.3. Requisitos no funcionales<br />

Una vez especificados los requisitos funcionales del sistema, se especifican los no<br />

funcionales:<br />

5.2.3.1. Fiabilidad<br />

Estos requisitos establecen el tiempo medio entre fallos. Pueden especificar el<br />

tiempo mínimo aceptable así como categorías de fallos permitidos. También<br />

pueden especificar el grado de disponibilidad ante la ocurrencia de fallos en los<br />

componentes del sistema (tolerancia a fallos simples o múltiples).<br />

Para este proyecto no existen requisitos de esta clase.


Capítulo 5. ESPECIFICACIÓN DE REQUISITOS 63<br />

5.2.3.2. Documentación<br />

Estos requisitos definen condiciones específicas del proyecto para algún tipo de<br />

documento (por ejemplo, Guía de Usuario o Manual de Operación) además de las<br />

normas estándar de realización de proyectos.<br />

Para este proyecto se ha creado el presente documento, donde se explica<br />

claramente las distintas fases que se han seguido para la realización de dicho<br />

proyecto.<br />

5.2.3.3. Portabilidad<br />

Estos requisitos establecen la posibilidad de exportar la herramienta a otros<br />

sistemas o lenguajes.<br />

REQ.POR.1. Portabilidad de Java<br />

Al ser desarrollada la aplicación mediante Java, facilita la exportación de la<br />

aplicación a otras máquinas y/o sistemas operativos. Ha de ser necesario que<br />

esté disponible la máquina virtual de Java.<br />

REQ.POR.2. Portabilidad de XML<br />

Al realizarse la serialización mediante XML, facilita la exportación de los<br />

documentos generados en la serialización a otras aplicaciones (lenguajes de<br />

programación, procesador de texto,…), sistemas operativos y/o máquinas.<br />

5.2.3.4. Prestación<br />

Estos requisitos especifican valores numéricos para variables del sistema que se<br />

puedan medir (por ejemplo, capacidad, tiempo de respuesta, velocidad).<br />

Cada prestación corresponde a una constante numérica asociada a una función del<br />

sistema y se puede incluir en la especificación de cada función o en este apartado<br />

en sentencias separadas. Los requisitos no han de ser cualitativos sino<br />

cuantitativos (Ej.: respuesta en 10 segundos).<br />

Para este proyecto no existen requisitos de este tipo.


Capítulo 5. ESPECIFICACIÓN DE REQUISITOS 64<br />

5.2.3.5. Recursos<br />

Este tipo de requisito especifica restricciones sobre equipamiento hardware y<br />

software sobre el que debe funcionar el sistema. También se especifican los<br />

límites superiores de recursos físicos necesarios para el sistema, tales como<br />

potencia de proceso, memoria principal, espacio en disco, etc.<br />

REQ.REC.1. – Potencia de proceso<br />

La aplicación no necesita de una potencia de proceso elevada, únicamente la<br />

necesaria para poder manejar la máquina virtual de Java.<br />

REQ.REC.2. – Utilización de memoria<br />

La utilización de memoria queda limitada a las necesidades de la máquina<br />

virtual de Java.<br />

5.2.3.6. Seguridad<br />

Estos requisitos especifican condiciones de protección contra intrusismo,<br />

alteración de datos o alteración de las instalaciones. Especifican niveles de acceso,<br />

palabras de paso (password), inhibición de comandos, etc. También definen las<br />

condiciones de seguridad física y las operaciones de mantenimiento preventivo<br />

(backups, pruebas rutinarias, etcétera).<br />

Para este proyecto no existen requisitos de esta clase ya que no se maneja<br />

información importante.<br />

5.3. Diagramas de casos de uso<br />

En esta sección se presentan los distintos casos de uso que forman el sistema (de<br />

la Figura 13 a la Figura 16), que ayudan a una mayor comprensión de los requisitos<br />

descritos en los apartados anteriores.<br />

El primero de ellos es el manejo de la interfaz gráfica, pudiendo observar las<br />

distintas opciones que ofrece al usuario.<br />

En segundo lugar, aparecen 3 diagramas de casos de uso correspondientes a las<br />

distintas generaciones de documentos: generación de la clase Java para la serialización;


Capítulo 5. ESPECIFICACIÓN DE REQUISITOS 65<br />

generación del DTD y generación del XML Schema. En estos diagramas se pueden ver<br />

los distintos pasos que realiza la aplicación para obtener los documentos.<br />

Debido a las restricciones de tamaño de esta memoria, únicamente se describirán<br />

los casos de uso más representativos del sistema: Abrir documento y Generar<br />

Java2XML, incluyendo sus descripciones textuales del flujo principal y alternativo<br />

(apartado 5.3.1.). Uno de ellos especifica una funcionalidad del manejo de la interfaz<br />

gráfica y el otro pertenece a la funcionalidad de la generación del documento para la<br />

serialización y deserialización.<br />

Figura 13: Diagrama de casos de uso – Manejo de la interfaz gráfica


Capítulo 5. ESPECIFICACIÓN DE REQUISITOS 66<br />

Figura 14: Diagrama de casos de uso – Generación del documento para la<br />

serialización/deserialización<br />

Figura 15: Diagrama de casos de uso – Generación del documento DTD<br />

Figura 16: Diagrama de casos de uso – Generación del documento XML Schema


Capítulo 5. ESPECIFICACIÓN DE REQUISITOS 67<br />

5.3.1. Descripción textual del flujo principal y flujos<br />

alternativos<br />

A continuación, en la Tabla 15 y Tabla 16 se van a describir los flujos principales<br />

y alternativos de los casos de uso: Abrir documento y Generar Java2XML, en los que,<br />

además, se especifica una breve descripción, precondiciones, poscondiciones y actores<br />

que participan.<br />

Caso de Uso:<br />

Descripción:<br />

Actor iniciador:<br />

Actores secundarios:<br />

Precondiciones:<br />

Poscondiciones:<br />

Flujo de eventos:<br />

Prioridad:<br />

Estado de desarrollo:<br />

Flujos alternativos:<br />

Abrir documento<br />

El caso de uso se ejecuta cada vez que el usuario desea<br />

abrir un documento Java.<br />

Usuario.<br />

Ninguno.<br />

El usuario ha pulsado el botón de abrir documento de la<br />

aplicación o ha seleccionado la opción “Abrir” del<br />

menú “Archivo”.<br />

El documento Java abierto se añade al área de texto<br />

correspondiente.<br />

1. A través de un diálogo de entrada de datos, se<br />

introducirá el nombre de la clase a abrir.<br />

2. El usuario pulsa el botón “Aceptar” del cuadro del<br />

diálogo.<br />

3. Si el archivo que se quiere abrir no tiene errores de<br />

compilación entonces se abre el documento<br />

mostrando en el área de texto superior izquierda el<br />

contenido de éste.<br />

Alta<br />

Análisis<br />

3.1. Si el usuario pulsa el botón “Cancelar” no se abrirá<br />

la clase introducida.<br />

4.1. Si el documento que se desea abrir tiene errores de<br />

compilación, entonces no se abre, mostrando un<br />

diálogo de error para informar al usuario.<br />

Tabla 15: Caso de uso “Abrir documento”


Capítulo 5. ESPECIFICACIÓN DE REQUISITOS 68<br />

Caso de Uso:<br />

Descripción:<br />

Actor iniciador:<br />

Actores secundarios:<br />

Precondiciones:<br />

Poscondiciones:<br />

Flujo de eventos:<br />

Prioridad:<br />

Estado de desarrollo:<br />

Flujos alternativos:<br />

Generar Java2XML<br />

El caso de uso se ejecuta cada vez que el usuario desea<br />

generar las clases Java necesarias para la serialización y<br />

deserialización en XML.<br />

Usuario.<br />

Ninguno.<br />

El usuario ha abierto un documento Java anteriormente<br />

y ha pulsado el botón de “Generar Java2XML” de la<br />

aplicación o ha seleccionado la opción “Generar<br />

Java2XML” del menú “Generar”.<br />

La lista de documentos Java generados se añade a la<br />

lista situada en el marco inferior izquierdo.<br />

1. El sistema lee el archivo de configuración,<br />

obteniendo las opciones necesarias para la creación<br />

de las clases Java.<br />

2. Se genera las clases necesarias para la serialización<br />

y deserialización.<br />

Alta<br />

Análisis<br />

1.1. Si no se encuentra el archivo de configuración se<br />

cargan los valores por defecto.<br />

2.1. En el caso de encontrarse algún error en la<br />

generación de los documentos, se mostrará un<br />

diálogo de error para informar al usuario.<br />

Tabla 16: Caso de uso “Generar Java2XML”<br />

5.3.2. Formalización de la descripción de casos de uso<br />

Se pueden utilizar técnicas de modelado visual para describir los casos de uso,<br />

éstas ayudan a mejorar su comprensión y pueden ser:


Capítulo 5. ESPECIFICACIÓN DE REQUISITOS 69<br />

• Diagramas de estado, para describir los estados de los casos de uso y las<br />

transiciones entre éstos. Pueden asociarse a clases, casos de uso, o a<br />

sistemas completos.<br />

• Diagramas de actividad, para describir las transiciones entre estados con<br />

más detalle como secuencias de acciones.<br />

• Diagramas de interacción, para describir cómo interactúa una instancia de<br />

caso de uso con la instancia de un actor.<br />

Para este proyecto se presenta un diagrama de estado asociado a la interfaz gráfica<br />

del sistema, Figura 17.<br />

Figura 17: Diagrama de Estado de la interfaz gráfica


Capítulo 6. ANÁLISIS 70<br />

6<br />

Capítulo 6<br />

ANÁLISIS<br />

Durante este flujo de trabajo se analizan los requisitos que se describieron en la<br />

captura de requisitos, refinándolos y estructurándolos, y para ello se hace uso del<br />

modelo de análisis, que ofrece un mayor poder expresivo y una mayor formalización.<br />

El modelo de análisis es una jerarquía de paquetes de análisis que contienen clases<br />

de análisis y realizaciones de casos de uso. Para entender esta definición es necesario<br />

también definir: un paquete de análisis como el mecanismo para organizar los elementos<br />

del análisis; una clase de análisis como una abstracción de una o varias clases y/o<br />

subsistemas del diseño del sistema; una realización de caso de uso como una<br />

colaboración que describe cómo se lleva a cabo y se ejecuta un caso de uso<br />

determinado, en términos de las clases de análisis y de sus objetos de análisis en<br />

interacción.<br />

Las clases de análisis siempre encajan en uno de tres estereotipos básicos: de<br />

interfaz, de control o de entidad. Las clases de interfaz se utilizan para modelar la<br />

interacción entre el sistema y sus actores (es decir, usuarios y sistemas externos). Las<br />

clases de entidad se utilizan para modelar información que posee una larga vida y que es<br />

a menudo persistente. Por último, las clases de control representan coordinación,<br />

secuencia, transacciones y control de otros objetos, y se usan con frecuencia para<br />

encapsular el control de un caso de uso en concreto.<br />

En los siguientes apartados se presenta un análisis de algunos casos de uso y un<br />

diagrama de paquetes que ayuda a organizar lo analizado hasta el momento.


Capítulo 6. ANÁLISIS 71<br />

6.1. Análisis de los casos de uso<br />

A continuación, de la Figura 18 hasta la Figura 22, se presentan los diagramas de<br />

colaboración correspondientes a los casos de uso descritos en el capítulo anterior.<br />

6.1.1. Caso de uso Abrir documento<br />

Figura 18: Diagrama de colaboración – Flujo principal (abrir documento)<br />

Figura 19: Diagrama de colaboración – Flujo alternativo (abrir documento)


Capítulo 6. ANÁLISIS 72<br />

6.1.2. Caso de uso Generar Java2XML<br />

Figura 20: Diagrama de colaboración – Flujo principal (generar Java2XML)<br />

Figura 21: Diagrama de colaboración – Flujo alternativo I (generar Java2XML)<br />

Figura 22: Diagrama de colaboración – Flujo alternativo II (generar Java2XML)


Capítulo 6. ANÁLISIS 73<br />

6.2. Diagrama de paquetes<br />

Los paquetes de análisis proporcionan un medio para organizar los artefactos del<br />

modelo de análisis en piezas manejables. Un paquete de análisis puede constar de clases<br />

de análisis, de realizaciones de casos de uso y de otros paquetes de análisis.<br />

A continuación se presenta, en la Figura 23, un diagrama de paquetes que<br />

organiza algunas de las clases recapituladas hasta el momento.<br />

Figura 23: Diagrama de paquetes de análisis


Capítulo 7. DISEÑO 74<br />

7<br />

Capítulo 7<br />

DISEÑO<br />

En este capítulo se van a describir los diferentes aspectos que se han tenido en<br />

cuenta para diseñar la aplicación. En dicho diseño se modela el sistema y se encuentra<br />

su forma, incluida la arquitectura, para que soporte todos los requisitos especificados en<br />

el capítulo anterior. El resultado de este diseño es el modelo de clases que sirve como<br />

esquema para la implementación.<br />

El modelo de clases es un modelo que describe la realización física de los casos de<br />

uso centrándose en cómo los requisitos funcionales y no funcionales, junto con otras<br />

restricciones relacionadas con el entorno de implementación, tienen impacto en el<br />

sistema a considerar.<br />

En este capítulo no se va a definir ninguna implementación, sino que simplemente<br />

se van a determinar las interfaces que proporciona dicha implementación y, con ello,<br />

obtener los servicios de las mismas. Para la generación de dichas interfaces del diseño,<br />

se ha tenido que realizar varias iteraciones de las fases de elaboración y construcción,<br />

dentro del ciclo de vida. Aunque, debido al tamaño de este documento, únicamente se<br />

va a mostrar el resultado final de dichas iteraciones.<br />

En primer lugar, se va a especificar el diseño, mediante diagramas de clases,<br />

referente a la interfaz que la aplicación ofrece al usuario, más adelante se especificará el<br />

referente a la generación de los documentos, tanto los necesarios para la serialización<br />

(que los denominaremos Java2XML, ya que transforman un objeto Java a XML), como<br />

para la generación del DTD y el XML Schema. También se explica el diseño de las<br />

clases que son utilizadas para obtener la serialización y la deserialización una vez<br />

generados todos los documentos. Finalmente, se detalla la arquitectura del sistema.


Capítulo 7. DISEÑO 75<br />

7.1. Diseño de la interfaz<br />

Para la realización del diseño de esta parte de la aplicación se han tenido en cuenta<br />

los requisitos funcionales de la sección Requisitos relativos al manejo de la interfaz<br />

dentro del apartado 5.2.2.5.<br />

Se ha hecho uso, para el diseño de la interfaz, de la librería gráfica que ofrece<br />

Java: java.swing, la cual presenta muchas comodidades a la hora de construirla. Dentro<br />

de este paquete de Java se pueden observar numerosos componentes como: áreas de<br />

texto, listas, barras de desplazamiento, botones, diálogos, menús, frames, etc., que han<br />

sido de gran ayuda a la hora de desarrollar la aplicación.<br />

También, como ya se ha comentado en el capítulo 3, la clase Generador ha<br />

empleado la librería JavaCET, que permite el acceso detallado a cada una de las partes<br />

que componen un fichero fuente de Java (clase), un ejemplo de dichas partes son:<br />

• Atributos: nombre, tipo (incluyendo referencias a otras clases, listas,<br />

etcétera), visibilidad, …<br />

• Métodos: get y set.<br />

• Constructores que ofrece, etcétera.<br />

Gracias a la obtención de la estructura de la clase, es posible conocer<br />

completamente todos aquellos aspectos a serializar y, de esta forma, obtener una<br />

serialización completa y portable mediante XML.<br />

En la Figura 24 se puede observar como la clase SerXMLGrafico hace uso de la<br />

librería comentada, y también utiliza la clase ManejarFichero para generar los diálogos<br />

de abrir y guardar con sus correspondientes filtros, tanto de apertura como de guardado<br />

(FiltroFicheros).<br />

Además, mediante la clase Generador la aplicación obtiene los distintos<br />

documentos. El diagrama de las diferentes generaciones se podrá ver en el apartado 7.2.<br />

Se puede también apreciar en la Figura 24 como esta clase utiliza la interfaz<br />

InterfazConfiguracion, que se explica detalladamente en el apartado siguiente (7.1.1.<br />

Obtención de los parámetros de configuración).


Capítulo 7. DISEÑO 76<br />

Figura 24: Diagrama de clases – Interfaz<br />

7.1.1. Obtención de los parámetros de configuración<br />

Para la gestión de los parámetros de configuración se ha definido una interfaz<br />

(InterfazConfiguracion) que contiene los métodos que se muestran en la Tabla 17.<br />

public interface InterfazConfiguracion {<br />

public abstract void inicilizarConstructor();<br />

public abstract boolean perteneceConstructor(String nombre);<br />

public abstract boolean integrarCodigo();<br />

public abstract void vaciarConstructorParams();<br />

public abstract int getConstructor();<br />

public abstract boolean correspondeNumParams(int numParams);<br />

public abstract Vector getConstructorParams();<br />

public abstract String getClasefromLista(String nameLista);<br />

public abstract String getClaseCualifFromLista(String nameLista);<br />

public abstract boolean isLista(String nameAtributo);<br />

public abstract String getClaseKeyfromMap(String nameMap);<br />

public abstract String getClaseKeyCualifFromMap(String nameMap);<br />

public abstract String getClaseValuefromMap(String nameMap);


Capítulo 7. DISEÑO 77<br />

}<br />

public abstract String getClaseValueCualifFromMap(String nameMap);<br />

public abstract boolean isMap(String nameAtributo);<br />

public abstract String getPackage_class();<br />

public abstract String getPackageClases2String();<br />

public abstract Properties getProp();<br />

public abstract String getSoportarRefCirc();<br />

public abstract String refCircAtributo(String nameAtributo);<br />

Tabla 17: Métodos de la InterfazConfiguración<br />

Mediante esta interfaz se ofrece la posibilidad de obtener parámetros adicionales<br />

gracias a un fichero de configuración, que se ha diseñado teniendo en cuenta los<br />

requisitos funcionales de la sección Requisitos para el manejo del documento de<br />

configuración en el apartado 5.2.2.4., dicho fichero ofrecerá lo posibilidad de<br />

especificar diversas opciones, tales como:<br />

• El paquete al que pertenecerán las clases creadas, (opcional).<br />

• La clase cualificada de los objetos que alberga cada atributo cuya clase<br />

implementa la interfaz java.util.List o java.util.Set,(obligatorio).<br />

• Las clases cualificadas de los objetos (del key y del value), que alberga<br />

cada atributo, cuya clase implementa la interfaz Java.util.Map,<br />

(obligatorio).<br />

• La integración o no del código en la clase de los objetos a serializar,<br />

(opcional, por defecto no se integra).<br />

• La posición del constructor a utilizar para inicializar el objeto en la<br />

deserialización, al igual que los atributos que inicializa, (opcional, por<br />

defecto se toma el constructor sin parámetros).<br />

• Si la clase a procesar ha de soportar referencias circulares sobre ella.<br />

• Los atributos que intervienen en referencias circulares.<br />

• Paquete en el que aparecen las clases que transformarán las clases que<br />

pertenecen a la API de Java a String, (opcional).


Capítulo 7. DISEÑO 78<br />

7.2. Diseño de la generación de los documentos.<br />

En el diseño realizado para la generación de documentos se han utilizado los<br />

requisitos funcionales que aparecen en las secciones Requisitos para generar el<br />

documento Java para la serialización/deserialización (Java2XML), Requisitos para<br />

generar el documento DTD y Requisitos para generar el documento XML Schema,<br />

presentes en las secciones 5.2.2.1., 5.2.2.2. y 5.2.2.3. del anterior capítulo,<br />

respectivamente<br />

En la Figura 25 se puede comprobar que la clase Generador, también presente en<br />

el anterior diagrama, sirve de enlace entre la interfaz gráfica y la generación de los<br />

diferentes documentos. Mediante esta clase la aplicación genera los documentos, ya que<br />

se encarga de llamar a las correspondientes clases, según la petición de dicha interfaz,<br />

para generar uno u otro documento. Una vez la clase Generador ha obtenido los<br />

resultados, se plasman tanto en la lista gráfica como en las áreas de texto.<br />

Todas las clases que generan los diferentes documentos obtienen las opciones de<br />

configuración a través de Generador, así, por ejemplo, si aparece un atributo cuyo tipo<br />

es una clase que implementa la interfaz java.util.List, entonces necesitará obtener de la<br />

configuración la clase los objetos que van a ser insertados en dicha lista; con lo que, a<br />

través de la clase Generador, la clase JavaWriter obtendrá dicha opción de<br />

configuración (el nombre de la clase, cualificado).<br />

En el diagrama de la Figura 25 se puede observar que existen principalmente tres<br />

clases las cuales se utilizan para generar los tres tipos de documentos:<br />

• GeneradorJava2XM: clase encargada de generar un documento para la clase<br />

Java (que ha sido abierta y va ha ser serializada) mediante la clase JavaWriter.<br />

En el caso de ser necesario generar otra clase, porque existe algún atributo<br />

cuyo tipo es una clase que no pertenece al estándar de Java (con lo que<br />

proviene de la clase que va a ser serializada), entonces se volverá a llamar a la<br />

clase GeneradorJava2XML, que se encargará de generar la correspondiente<br />

clase Java2XML (donde Java es el nombre de la clase).<br />

La clase JavaWriter utiliza otras tres (ClaseSimple, ClaseList y ClaseMap):<br />

- la primera de ellas procesa todos los atributos en los que su tipo es<br />

primitivo o una clase que no pertenece al Collection Framework de<br />

Java; es decir, que contiene un único objeto.


Capítulo 7. DISEÑO 79<br />

- Mediante ClaseList se procesan los atributos cuyo tipo implementa la<br />

interfaz java.util.List o java.util.Set, y que contiene un conjunto de<br />

objetos, con lo que se ha deserializar mediante más de una etiqueta.<br />

- La última clase se utiliza para procesar los atributos cuyo tipo<br />

implementa la interfaz Java.util.Map, con lo que contiene más de un<br />

objeto y se serializa mediante más de una etiqueta, al igual que la clase<br />

anterior.<br />

• GeneradorDTD: se encarga de generar el documento DTD a partir de la clase<br />

abierta.<br />

• GeneradorXMLSchema: al igual que la anterior, a partir de la clase abierta<br />

genera el documento XML Schema.<br />

Figura 25: Diagrama de clases – Generación de los documentos


Capítulo 7. DISEÑO 80<br />

7.3. Diseño de la serialización y deserialización<br />

Una vez se han generado las clases necesarias para realizar la serialización<br />

(Java2XML.java, donde Java es el nombre de la clase), éstas se han de situar en un<br />

paquete del proyecto donde se va a proceder a la serialización del objeto. Una vez en<br />

ese paquete, es necesario que importen o estén en ese mismo paquete una serie de clases<br />

necesarias para la serialización (creación del documento XML), o deserialización<br />

(lectura del documento XML mediante SAX); además de las ya generadas.<br />

En la siguiente Figura 26 se observa el diagrama de clases correspondiente para<br />

serializar o deserializar. Para poder entender claramente éste, se ha de tener en cuenta<br />

que existen tres clases: Clase, UtilizaObjectsClase y Clase2XML, donde la palabra<br />

“Clase” depende de la clase del objeto que se va a serializar. Si por ejemplo tuviéramos<br />

que serializar una clase denominada Mesa, Clase sería Mesa y la clase Clase2XML sería<br />

Mesa2XML y, finalmente, la clase UtilizaObjectsClase se podría llamar de cualquier<br />

manera y sería aquella desde la que se instanciaría un objeto de la clase Mesa, y se<br />

serializaría o deserializaría mediante la utilización de los métodos estáticos toXML y<br />

fromXML de la clase Mesa2XML.<br />

Figura 26: Diagrama de clases – Serialización/deserialización


Capítulo 7. DISEÑO 81<br />

Para realizar la serialización, desde la clase UtilizaObjectsClase se llama al<br />

método estático toXML de la clase Clase2XML, a este método se le pasa como<br />

parámetros un objeto de la clase a serializar (Clase) y un flujo de salida donde se<br />

almacenará el documento XML a generar. La clase Clase2XML utilizará el XMLWriter<br />

para escribir las distintas etiquetas y atributos del XML con su valor. La clase<br />

XMLGeneralPersistenceManager será utilizada para serializar el contenido de una<br />

etiqueta XML (correspondiente a un objeto de una clase que no pertenece a la API<br />

estándar de Java o a otra API externa y de la que sí tenemos el código fuente de Java),<br />

delegándola a otra clase cuyo nombre será buscada mediante el nombre de la clase<br />

seguido por 2XML. Por ejemplo, si estamos serializando una clase Mesa mediante la<br />

clase Mesa2XML y, en un momento dado, nos encontramos con un atributo que alberga<br />

objetos de la clase Silla, entonces se buscará la clase Silla2XML para que, al delegar a<br />

esta, generase la serialización de su etiqueta.<br />

En el caso de la deserialización, desde la clase UtilizaObjectsClase se llama al<br />

método estático fromXML de la clase Clase2XML (Figura 26), este método devolverá el<br />

objeto de la clase correspondiente que proviene de la deserialización del documento<br />

XML, el cual se pasa como parámetro en un flujo de entrada. Para la lectura del<br />

documento XML se utiliza SAX, como ya se ha comentado, redefiniendo en la clase<br />

SAXParserManager los métodos startElement(…), endElement(…), characters(…), etc.<br />

que llamarán a los métodos con el mismo nombre de Clase2XML. De esta manera, para<br />

cada nueva aparición de una etiqueta se procesará como corresponda, almacenando su<br />

valor en el atributo correspondiente del objeto a deserializar.<br />

Al igual que en el caso de la serialización, si se obtiene una etiqueta XML de un<br />

atributo delegado en la serialización, se procederá a delegar (mediante el método<br />

delegateParsing(…)) la lectura del documento XML a la correspondiente clase<br />

Clase2XML (obtenida de la misma forma que en la serialización) de ese atributo. Al<br />

terminar su procesado, esta clase devolverá el control a la clase padre mediante la<br />

instrucción finishedParsing(), y el padre obtendrá el valor del objeto creado en la<br />

delegación mediante el método getObject(), para luego asignar el valor al atributo del<br />

objeto que estamos deserializando.<br />

Gracias a esta delegación del proceso, la serialización y deserialización se realizan<br />

de una forma más simple y estructurada, ya que se organizan por módulos que pueden<br />

ser utilizados en otras serializaciones donde intervengan las clases.


Capítulo 7. DISEÑO 82<br />

7.4. Arquitectura del sistema<br />

La arquitectura es un conjunto de decisiones significativas acerca de la<br />

organización de un sistema software, la selección de los elementos estructurales a partir<br />

de los cuales se compone el sistema, y las interfaces entre ellos, junto con el<br />

comportamiento.<br />

Se necesita la arquitectura para:<br />

• Comprender el sistema. Todos los que intervengan en el sistema deben<br />

comprenderlo.<br />

• Organizar el desarrollo. A más organización en el desarrollo, más<br />

comunicación entre los desarrolladores del proyecto.<br />

• Fomentar la reutilización. Una buena arquitectura ofrece a los desarrolladores<br />

un andamio estable sobre el que trabajar.<br />

• Hacer evolucionar el software. Todo sistema software evoluciona, por lo tanto<br />

debe ser fácil de modificar, y eso se consigue con una buena arquitectura.<br />

La arquitectura se desarrolla durante iteraciones, principalmente durante la fase de<br />

elaboración, donde su resultado final es una línea base de la arquitectura.<br />

La línea base es una versión interna del sistema, centrada en la descripción de la<br />

arquitectura, la cual debe mantenerse actualizada a lo largo de la vida del sistema para<br />

reflejar los cambios y adiciones relevantes para la arquitectura.<br />

Nuevamente y, debido a la limitación de tamaño de esta memoria, se presenta la<br />

arquitectura resultante, de manera muy simple (Figura 27), sin describir su evolución a<br />

través de las distintas iteraciones y flujos de trabajo.<br />

Figura 27: Arquitectura


Capítulo 7. DISEÑO 83<br />

7.5. Distribución en paquetes<br />

Para una mejor organización y estructuración de las clases, se han creado distintos<br />

paquetes y se han distribuido las clases en éstos, facilitando su modularidad al utilizar<br />

las estructuras definidas en el diseño:<br />

• interfaz.interfazGrafica: paquete donde se encuentran todas las clases e<br />

interfaces que son necesarios para crear la interfaz gráfica.<br />

• interfaz.interfazgenerador: paquete donde están las clases e interfaces<br />

para organizar la generación de todos los documentos.<br />

• generador.java2XML: paquete donde se encuentran todas las clases e<br />

interfaces necesarias para generar el documento para serializar.<br />

• generador.dtd: paquete donde se encuentran todas las clases e interfaces<br />

necesarias para generar el DTD.<br />

• generador.xmlSchema: paquete donde se encuentran todas las clases e<br />

interfaces necesarias para generar el XML Schema.


Capítulo 8. IMPLEMENTACIÓN Y PRUEBAS 84<br />

8<br />

Capítulo 8<br />

IMPLEMENTACIÓN Y PRUEBAS<br />

En el presente capítulo se van a explicar las distintas aproximaciones seguidas<br />

para realizar la completa implementación de la aplicación. Éstas han ayudado a<br />

disminuir la dificultad en la implementación y poder así avanzar de manera correcta en<br />

el desarrollo.<br />

La implementación de la aplicación SerXML ha producido 7103 líneas de código,<br />

distribuido en 35 clases organizadas en diferentes bloques dedicados a la creación de la<br />

interfaz, de los generadores y del procesador SAX para la serialización/deserialización.<br />

El lanzamiento de la aplicación hace uso de unos 26 MB de memoria. Durante la<br />

ejecución, este tamaño varía dependiendo del tamaño del proyecto donde se encuentra<br />

la clase abierta y de los documentos generados.<br />

Lo más destacable de este flujo de trabajo se resume en lo siguiente:<br />

• Se han respetado los paradigmas de: la programación orientada a objetos<br />

(abstracción, encapsulación, modularidad y jerarquía); de la programación<br />

orientada a eventos (cada componente reacciona ante los eventos producidos<br />

cuando el usuario interactúa con la aplicación, con métodos asociados para cada<br />

evento) y de la programación estructurada dentro de los métodos de las clases.<br />

• Se ha cuidado la codificación, las normas de estilo de la comunidad Java:<br />

nombres de clases comienzan en mayúsculas, nombres de variables y métodos<br />

en minúsculas,…<br />

• Sin disponer de las herramientas necesarias, se ha cuidado por parte del autor, el<br />

cumplir los umbrales recomendados por las métricas del software en cuanto al


Capítulo 8. IMPLEMENTACIÓN Y PRUEBAS 85<br />

tamaño de clases y métodos, relaciones entre clases, amplitud y profundidad de<br />

las jerarquías de herencia . . .<br />

• Existe un predominio de estructuras de clase y algoritmos de los métodos<br />

eminentemente recursivos, consiguiendo así una mayor limpieza de código.<br />

En los apartados siguientes se describen las distintas aproximaciones tomadas, se<br />

explican las pruebas realizadas y la manera de utilizar la herramienta de manera<br />

correcta.<br />

8.1. Relación de aproximaciones utilizadas en la<br />

implementación<br />

Se ha decidido realizar la implementación de la aplicación en distintas fases, que<br />

denominaremos aproximaciones. La decisión de dividir la implementación en fases es<br />

debido al enorme número de aspectos a tener en cuenta al serializar, con lo que de esta<br />

forma se consigue facilitar la implementación y conseguir un desarrollo más óptimo.<br />

Las aproximaciones a las que se ha hecho referencia son:<br />

• Primera aproximación, realización de las siguientes implementaciones:<br />

- Inicio del desarrollo de la interfaz gráfica.<br />

- Solo se crea un único fichero Clase2XML.java, donde Clase es el<br />

nombre de la clase Java (Ej.: para la clase Coche, sería<br />

Coche2XML.java).<br />

- Procesar el documento XML mediante SAX.<br />

Únicamente se ha contemplado para la serialización y la creación del fichero<br />

arriba nombrado clases con determinadas características:<br />

- Sólo atributos públicos.<br />

- Sin constructores.<br />

- Sin métodos.<br />

- Sólo tipos primitivos: int, doble, char,…<br />

- Admitir tipo String.<br />

• Segunda aproximación, se implementó la posibilidad de procesar clases<br />

además de con las características anteriores, con las siguientes:


Capítulo 8. IMPLEMENTACIÓN Y PRUEBAS 86<br />

- Atributos no públicos.<br />

- Utilizar los métodos get y set para los anteriores atributos.<br />

- Cualquier Clase que pertenezca o no a la API estándar de Java (o a una<br />

externa); en el primer caso no tendremos el código fuente y en el<br />

segundo sí.<br />

- En el caso de tener que serializar una clase que pertenece a la API<br />

estándar de Java o a una externa (por lo que no tendremos su código<br />

fuente), es necesario de la existencia de una clase para transformar a y<br />

desde un String (ver en el capítulo 5 los requisitos REQ.FUN.1.2.5. y<br />

REQ.FUN.2.2.4.).<br />

Debido a las nuevas características, se introdujo la posibilidad de generar más<br />

de un fichero Clase2XML.java, generándose tantos como clases intervengan<br />

en la serialización y que no pertenezcan a una API externa o estándar de Java<br />

(del que sí tenemos el código fuente).<br />

- Mejorar la funcionalidad de la interfaz gráfica, añadiendo entre otras<br />

cosas el listado de documentos generados.<br />

• Tercera aproximación, se añadieron grandes mejoras, entre ellas:<br />

- Añadir la posibilidad de utilizar un fichero de configuración para cada<br />

clase con las siguientes opciones para la serialización:<br />

• Paquete del proyecto en el que se va a añadir la clase generada.<br />

• Paquete del proyecto en el que aparecen las clases que<br />

transformarán las clases que pertenecen a la API de Java a<br />

String (ver en el capítulo 5 los requisitos REQ.FUN.1.2.5. y<br />

REQ.FUN.2.2.4.).<br />

• Constructor a utilizar y atributos a los que asigna valor. Por<br />

defecto se utiliza el constructor sin parámetros.<br />

• Si se integra el código o no. Por defecto no se integra.<br />

• Clase de los objetos que serán utilizados en las Listas (atributos<br />

cuya clase implementa la interfaz java.util.List).<br />

• Clase de los objetos que serán utilizados en los Maps (atributos<br />

cuya clase implementa la interfaz Java.util.Map).<br />

• Si la clase a procesar ha de soportar referencias circulares sobre<br />

ella.


Capítulo 8. IMPLEMENTACIÓN Y PRUEBAS 87<br />

• Los atributos que intervienen en referencias circulares<br />

Gracias al fichero de configuración expuesto, se pudieron introducir las<br />

siguientes mejoras a las clases Java a serializar:<br />

- Aceptar constructores a parte del de por defecto.<br />

- Admitir como tipos de atributos clases que implementen la interfaz<br />

java.util.List.<br />

- Admitir como tipos de atributos clases que implementen la interfaz<br />

Java.util.Map.<br />

• Cuarta aproximación y última, en la que se terminó de desarrollar la<br />

aplicación, con las siguientes mejoras:<br />

- Generación del DTD de la clase.<br />

- Generación del XML Schema de la clase.<br />

- Capacidad de procesar clases que mantengan entre sí referencias<br />

circulares.<br />

8.2. Pruebas<br />

A medida que se ha ido realizando la implementación de la aplicación en cada una<br />

de sus aproximaciones, se han ido probando las nuevas características implementadas<br />

con todas las diversas variantes que podía ofrecer una clase Java, tal y como se ha<br />

detallado en la sección anterior. De esta manera, cualquier error o problema que pudiera<br />

surgir se ha ido solucionando y, en el caso de ser necesario, se han ido modificando<br />

pequeños detalles del análisis y/o diseño.<br />

Las pruebas consistían en generar manualmente una clase a serializar con distintos<br />

atributos, constructores, etcétera; según el nivel de implementación alcanzado hasta el<br />

momento, y se creaba otra clase que era la encargada, una vez generados los<br />

documentos, de instanciar la clase anterior y llamar a las funciones toXML y fromXML<br />

(de estos documentos generados). El objeto correspondiente a la instancia ha sido<br />

creado con distintas características, albergando en las estructuras de datos tanto clases<br />

de la API de Java como del proyecto, de las que sí tenemos su código y podemos<br />

serializar.


Capítulo 8. IMPLEMENTACIÓN Y PRUEBAS 88<br />

En el ejemplo de la Tabla 18 se observan los distintos tipos de atributos utilizados<br />

en este ejemplo de prueba, intentando abarcar todas las posibles variantes: atributos<br />

públicos y privados, estos últimos con sus correspondientes métodos get y set;<br />

constructor por defecto y constructor con un parámetro de entrada; así como dos<br />

estructuras de datos representadas como ArrayList y Hashmap. También se ha<br />

comprobado el correcto funcionamiento con atributos primitivos (char, byte,…);<br />

atributos de la API de Java (String y Date) y atributos del proyecto de los que sí<br />

tenemos su código Java (Silla), utilizados en la estructura de datos ArrayList.<br />

import java.util.Date;<br />

import java.util.ArrayList;<br />

import java.util.HashMap;<br />

public class Mesa{<br />

public String nombre;<br />

public Date fecha;<br />

public char material;<br />

private byte altura;<br />

public short profundidad;<br />

public long anchura;<br />

public int numeroPatas;<br />

public HashMap existe;<br />

private ArrayList sillas;<br />

public Mesa()<br />

{<br />

}<br />

public Mesa(String nom)<br />

{<br />

this.nombre = nom;<br />

}<br />

public byte getAltura() {<br />

return altura;<br />

}<br />

public void setAltura(byte altura) {


Capítulo 8. IMPLEMENTACIÓN Y PRUEBAS 89<br />

}<br />

this.altura = altura;<br />

}<br />

public ArrayList getSillas() {<br />

return sillas;<br />

}<br />

public void setSillas(ArrayList sillas) {<br />

this.sillas = sillas;<br />

}<br />

Tabla 18: Ejemplo clase de prueba (Mesa.java)<br />

El ejemplo anterior se ha ido modificando incorporando nuevas funcionalidades<br />

implementadas y comprobando a lo largo de la implementación el correcto<br />

funcionamiento de todas ellas. Por ejemplo, poner estructuras de datos privadas o<br />

públicas, introducir todos los atributos primitivos de Java, incluir referencias circulares,<br />

introducir estructuras de datos que alberguen distintos tipo de objetos, etc.


Capítulo 9. CONCLUSIONES Y TRABAJOS FUTUROS 90<br />

9<br />

Capítulo 9<br />

CONCLUSIONES Y TRABAJOS FUTUROS<br />

Este capítulo se evalúa los resultados de todo el desarrollo, se divide en dos<br />

partes: por un lado se enumeran los logros alcanzados y, por otro lado, se tratan los<br />

posibles trabajos futuros.<br />

Cabe mencionar que este proyecto se ha publicado como código abierto bajo<br />

licencia GPL y se encuentra disponible en la dirección http://vido.escet.urjc.es/serxml/.<br />

9.1. Principales logros alcanzados<br />

A lo largo del presente documento se han expuesto los objetivos, así como la<br />

especificación de requisitos que la herramienta debía cumplir. Una vez desarrollada y<br />

probada la herramienta, en este punto se puede decir que se cumplen todos los requisitos<br />

especificados.<br />

Se cumple la posibilidad de serializar cualquier objeto Java, aceptando los<br />

siguientes aspectos o características en las clases:<br />

- Cualquier visibilidad y tipo de los atributos, se aceptan atributos tanto privados<br />

como públicos. También es posible que el tipo del atributo sea primitivo, de<br />

una API o de una clase del proyecto y de la cual tenemos su código fuente.<br />

- Constructores sin parámetros, o con algún parámetro que correspondan a<br />

atributos de la clase.<br />

- Cualquier estructuras de datos del Collection Framework de Java<br />

(java.util.List, java.util.Set, java.util.Map).


Capítulo 9. CONCLUSIONES Y TRABAJOS FUTUROS 91<br />

- Referencias circulares entre objetos, identificándolas mediante los atributos<br />

que las realizan.<br />

Otra característica del documento XML que se genera es su total independencia<br />

con Java, donde no se aprecian etiquetas que hagan ver que el documento proviene de la<br />

serialización de un objeto Java.<br />

La aplicación desarrollada permite, a través de un fichero de configuración,<br />

definir características particulares para cada serialización, lo cual es un valor añadido de<br />

cara a una serialización más flexible.<br />

Se ofrece la posibilidad de generar el documento XML Schema, transformando la<br />

clase Java de manera estructurada. Aprovechando la riqueza semántica que ofrece el<br />

XML Schema se han podido representar los tipos de datos de cada atributo primitivo,<br />

así como las referencias circulares. Además es posible generar el documento DTD de la<br />

clase Java.<br />

Mediante SerXML se han mejorado en ciertos aspectos las distintas aplicaciones<br />

analizadas en el capítulo 2; es decir, de los requisitos estudiados para cada aplicación en<br />

dicho capítulo, SerXML cumple todos, mientras que las herramientas analizadas sólo<br />

cumplían parte de ellos.<br />

En definitiva, se ha obtenido una herramienta que hace uso de dos tecnologías<br />

totalmente portables como son Java y XML, eliminando el trabajo de la serialización al<br />

desarrollador y ofreciéndole la posibilidad de utilizar la serialización con cualquier<br />

aplicación, lenguaje de programación o sistema.<br />

9.2. Trabajos futuros<br />

La herramienta desarrollada es una primera versión. En los trabajos futuros a<br />

realizar se pretenderá mejorarla y completarla añadiendo más funcionalidades. La<br />

aplicación SerXML se puede mejorar en ciertos aspectos, tanto en su implementación<br />

como en su definición. Este Proyecto Fin de Carrera es el comienzo de una serie de<br />

proyectos que están siendo desarrollados dentro del grupo ViDo 2 . Por tanto seguirá<br />

desarrollándose hasta que se consiga proporcionar todas las funcionalidades requeridas.<br />

2 Grupo ViDo: Grupo de Visualización y Documentación electrónica de la ESCET en la<br />

<strong>Universidad</strong> <strong>Rey</strong> <strong>Juan</strong> <strong>Carlos</strong>, Área de Lenguajes y Sistemas Informáticos. http://vido.escet.urjc.es.


Capítulo 9. CONCLUSIONES Y TRABAJOS FUTUROS 92<br />

En los siguientes apartados se describen cada una de las líneas en las que se tiene<br />

previsto seguir trabajando en SerXML.<br />

9.2.1. Integración de SerXML como plugin para los entornos<br />

de desarrollo<br />

Uno de los mayores objetivos en la construcción de software es la reutilización, la<br />

cual es necesaria para no tener que reinventar la rueda cada vez que se necesite<br />

introducir alguna funcionalidad adicional. En nuestro caso, uno de los trabajos futuros<br />

que se pueden llevar a cabo consistiría en implementar SerXML como un plugin de un<br />

entorno de desarrollo, de forma que las aplicaciones que usen SerXML puedan<br />

desarrollarse en dicho entorno de desarrollo, facilitando el trabajo al desarrollador. En<br />

concreto, se está pensando en implementar SerXML como plugin para el entorno de<br />

desarrollo de código abierto Eclipse 3 .<br />

9.2.2. Utilización de toda la riqueza semántica ofrecida en el<br />

lenguaje J2SE 1.5<br />

SerXML es una aplicación diseñada para el lenguaje de programación Java versión<br />

1.4 de la tecnología Java 2 Standard Edition. No obstante, al finalizar este Proyecto de<br />

Fin de Carrera la nueva versión 1.5 está en fase beta. Esta nueva versión incorporará<br />

modificaciones en el lenguaje de programación, por lo tanto, es muy recomendable<br />

incluirla y utilizar todas las nuevas posibilidades semánticas que ofrecerá esta versión.<br />

9.2.3. Uso de SerXML en diversos programas reales<br />

En SerXML se han tomado decisiones acerca de cómo serializar las construcciones<br />

Java desde un punto de vista teórico, ideando ejemplos prototípicos para cada una de<br />

dichas construcciones. Sin embargo, el uso de la herramienta en programas reales<br />

3 Eclipse: http://www.eclipse.org.


Capítulo 9. CONCLUSIONES Y TRABAJOS FUTUROS 93<br />

mostrará las necesidades concretas de serialización de cada uno de ellos. Las diferentes<br />

formas de serializar en XML dependen del uso concreto que se hace de cada una de las<br />

construcciones de Java. Por tanto, usando la herramienta con programas reales se<br />

podrán tener mejores criterios a la hora de determinar cuál es la mejor serialización<br />

posible; es decir, la que está semánticamente más ajustada a las necesidades de la<br />

aplicación concreta.<br />

9.2.4. Utilizar la metaprogramación para realizar la<br />

serialización<br />

Para realizar la serialización en SerXML se han de generar unas clases en Java que<br />

ofrecen, mediante métodos, la posibilidad de serializar objetos Java. Se quiere también<br />

ofrecer la posibilidad de serializar sin la necesidad de generar este código intermedio.<br />

Para evitar la generación de este código puede usarse la metaprogramación.


94<br />

Bibliografía<br />

[1] Aaron Skonnard, Martin Gudgin. Essential XML Quick Reference, Ed.:<br />

Addison-Wesley, 2002.<br />

[2] Cliff Binstock, Dave Peterson, Mitchell Smith, Mike Wooding, Chris Dix,<br />

Chris Galtenberg. The XML Schema Complete Reference, Ed.: Addison-<br />

Wesley, 2002.<br />

[3] http://www.osmosislatina.com/xml/. Osmosis Latina - XML, último acceso:<br />

19-8-2004.<br />

[4] http://www.xml.com/. O’REILLY XML.com, XML from de inside out,<br />

último acceso: 10-9-2004.<br />

[5] Apuntes asignatura Ofimática Avanzada, URJC.<br />

[6] http://www.w3c.org. World Wide Web Consortium, último acceso: 1-9-<br />

2004.<br />

[7] Joshua Bloch. Effective Java: Programming Language Guide, Ed.:<br />

Addison Wesley, 2001.<br />

[8] Eckel, B. Thinking in Java, Ed.: Prentice Hall 1998.<br />

[9] http://www.programacion.com/java/. Programación en Castellano, Java.<br />

[10] http://www.javahispano.org/. javaHispano, último acceso: 6-9-2004.<br />

[11] Brett McLaughlin. Java & XML 2nd Edition, Ed.: O’Reilly, 2001.<br />

[12] Brett McLaughlin. Java and XML Data Binding, Ed.: O’Reilly, 2002.<br />

[13] http://java.sun.com/j2se/1.4.2/docs/guide/serialization/. Serialización de<br />

objetos en Java, último acceso: 28-7-2004.<br />

[14] http://java.sun.com/xml/. Java Technology XML, último acceso: 10-9-<br />

2004.<br />

[15] http://vido.escet.urjc.es/javacet/. JavaCET, último acceso: 11-9-2004.


95<br />

[16] http://java.sun.com/products/javabeans/. JavaBeans, último acceso: 2-9-<br />

2004.<br />

[17] http://java.sun.com/j2se/1.4.2/docs/guide/collections/. The Collection<br />

Framework, último acceso: 4-9-2004.<br />

[18] http://www.saxproject.org. The oficial website for SAX, último acceso: 4-<br />

8-2004.<br />

[19] Pierre-Alain Muller. Instant UML, Ed.:Wrox Press, 2001.<br />

[20] http://www.omg.org/uml. UML, último acceso: 2-8-2004.<br />

[21] Booch G., Jacobson I., Rumbaugh J. El lenguaje Unificado de Modelado,<br />

Ed.: Addison-Wesley, 1999.<br />

[22] Booch, G; Jacobson, I; Rumbaugh, J, El Proceso Unificado de Desarrollo<br />

de Software, Ed.: Addison-Wesley, 2000.


96<br />

Anexo A<br />

En este anexo se describe la utilización de la aplicación con los distintos pasos<br />

que hay que seguir para poder utilizarla correctamente y el fichero de configuración que<br />

se encarga de obtener distintas opciones de serialización.<br />

Utilización de la aplicación<br />

Para realizar la instalación y el correcto uso de la aplicación se han de seguir los<br />

siguientes pasos:<br />

1. Lanzar la aplicación.<br />

2. Una vez se hayan introducido los directorios de la ruta del Java SDK y del<br />

directorio raíz del proyecto donde se encuentra la clase a abrir (mediante el<br />

menú “Opciones” o al pulsar “Abrir”), se ha de introducir el nombre de la clase<br />

Java de la que se quiera obtener los documentos para la serialización.<br />

3. En caso de no desear que se aplique la configuración por defecto o de que<br />

existan atributos cuyo tipo implementa la interfaz java.util.List o Java.util.Map,<br />

se tendrá que crear un fichero con el nombre de la clase anterior más<br />

2XML.config (Ej.: si la clase se llama Coche el fichero se llamará<br />

Coche2XML.config), donde se especificarán las distintas opciones de<br />

configuración. El fichero de configuración ha de tener un determinado formato<br />

que se explica en el apartado siguiente.<br />

4. Si existieran atributos cuyo tipo es de una clase que no pertenece a nuestro<br />

proyecto, entonces habrá que generar (si no se ha realizado todavía) una clase,<br />

para cada clase distinta que exista, con el nombre de la clase más 2String.java<br />

(Ej.: Date2String.java). Ésta ha de ofrecer de modo público y estático los


97<br />

métodos: toString y fromString. Mediante estos métodos será posible<br />

transformar una clase de este tipo a String, para poderla añadir a la serialización,<br />

y desde un String a la clase de nuevo (deserialización). Todo esto se realiza ya<br />

que el documento XML sólo trabaja con etiquetas cuyo valor ha de ser<br />

únicamente de caracteres, para poder serializarlo y mejorar su comprensión.<br />

5. Generar el fichero para la serialización (Java2XML), con ello aparecerán los<br />

ficheros generados en la lista gráfica de la parte inferior izquierda; habrá un<br />

fichero con el nombre de la clase abierta más 2XML (Ej.:Clase2XML.java).<br />

Además de otros ficheros dependiendo de la relación de algunos atributos de la<br />

clase abierta con otras clases de nuestro proyecto, por lo que se generarán tantas<br />

nuevas clases de Java como relaciones diferentes existan.<br />

6. En caso de querer obtener el DTD y/o XML Schema, se tendrá que pulsar el<br />

correspondiente botón de generación, tras el cual aparecerá el documento en la<br />

lista gráfica.<br />

7. Una vez generados los documentos se pueden guardar de diferentes formas:<br />

seleccionando cualquiera de ellos de la lista antes mencionada y pulsar la opción<br />

“Guardar” del menú “Archivo”, guardarlos todos en un directorio determinado<br />

mediante el opción “Guardar Todo en” del menú “Archivo”, o guardarlos todos<br />

en el directorio donde reside la clase abierta pulsando “Guardar Todo” tanto del<br />

menú “Archivo” como del botón.<br />

Una vez generados los ficheros y almacenados en nuestro proyecto Java, se va a<br />

proceder a explicar cómo, mediante éstos, obtener la serialización:<br />

8. Añadir las clases Java generadas al correspondiente paquete del proyecto al que<br />

pertenece la clase abierta inicialmente.<br />

9. Añadir justo en el punto donde se quiere serializar el objeto Java (de la clase<br />

abierta) la instrucción siguiente: Clase2XML.toXML(…), donde la palabra Clase<br />

corresponde a la clase abierta inicialmente y desde donde se han generado todos<br />

los ficheros. Además, al método toXML se le ha de pasar como primer parámetro<br />

un objeto de dicha clase y como segundo un objeto de la clase OuputStream<br />

donde se almacenará el objeto serializado.<br />

En el caso de querer deserializar el objeto, se ha de ejecutar la siguiente<br />

instrucción: Clase2XML.fromXML(…), donde Clase tiene el mismo significado que en


98<br />

el punto anterior. Además, al método se le ha de pasar por parámetro un objeto de la<br />

clase InputStream, desde donde se leerá el documento XML de la serialización anterior;<br />

este método devolverá un objeto de la clase Clase que será el objeto tal y como se<br />

serializó anteriormente.<br />

Fichero de configuración<br />

El nombre del fichero de configuración ha de ser el nombre de la clase a la que<br />

pertenece concatenado con 2XML.config (Ej.: Person2XML.config). Las diferentes<br />

configuraciones se insertan mediante el nombre de la opción asignando el valor que se<br />

desea (Ej.: integrado=si). A continuación se muestran todas las posibles configuraciones<br />

que se pueden realizar a la serialización:<br />

• Definir paquetes y otras opciones:<br />

- package: Especifica el package al que va a pertenecer la clase creada<br />

(opcional).<br />

- packageClases2String: Especifica el package donde se encuentran los<br />

Clases2String para realizar las transformaciones (opcional).<br />

- integrado: Especifica si el código generado será integrado en una clase ya<br />

existente (si) o se creara una nueva clase (no), por defecto “no” (opcional).<br />

• Definir constructor:<br />

- constructor: posición en la clase del constructor que se tomara para la<br />

creación de la clase serializada, por defecto constructor sin parámetros<br />

(opcional).<br />

- constructorParamsi: atributos que se usan el la llamada al constructor. El<br />

valor de i va de uno hasta el número de parámetros (opcional).<br />

• Definir Listas: se utiliza obligatoriamente en el caso de que exista algún atributo<br />

que implementa la interfaz java.util.List o java.util.Set, y sirve para asociar el<br />

nombre de una lista a la clase de los objetos que alberga.<br />

- NombreListai: El valor de i es un entero que va de uno hasta el número de<br />

atributos cuyo tipo es una lista o conjunto. Se especifica el nombre del<br />

atributo.


99<br />

- ClaseListai: El valor de i es un entero que va de uno hasta el número de<br />

atributos cuyo tipo es una lista o conjunto. Se especificará la clase<br />

cualificada de los elementos que alberga la lista.<br />

• Definir Maps: se utiliza obligatoriamente en el caso de que exista algún atributo<br />

que implementa la interfaz java.util.Map, y sirve para asociar el nombre de una<br />

Map a la clase de los objetos que alberga el key y el value.<br />

- NombreMapi: El valor de i es un entero que va de uno hasta el número de<br />

atributos de tipo map. Se especifica el nombre del atributo.<br />

- ClaseKeyMapi: El valor de i es un entero que va de uno hasta el número de<br />

atributos de tipo map. Se especificará la clase cualificada de las claves que<br />

alberga el map.<br />

- ClaseValueMapi: El valor de i es un entero que va de uno hasta el número de<br />

atributos de tipo map. Se especificará la clase cualificada de los valores que<br />

alberga el map.<br />

• Definir referencias circulares:<br />

- soportarRefCirc: define si soporta referencias, por defecto “no”.<br />

- nombreAtributoi: atributos con referencias.<br />

Los comentarios en el fichero de configuración se especifican mediante una #<br />

delante del texto. En la Tabla 19 se muestra como ejemplo un fichero de configuración<br />

para la clase Mesa.java.<br />

package=pruebasMesa<br />

packageClases2String=clases2String<br />

integrado=no<br />

constructor=1<br />

constructorParams1=nombre<br />

#Lists<br />

NombreLista1=sillas<br />

ClaseLista1=Silla<br />

#Maps<br />

NombreMap1=existe<br />

ClaseKeyMap1=java.lang.String<br />

ClaseValueMap1=Silla<br />

Tabla 19: Ejemplo de fichero de configuración

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!