Google Drive
Google Drive es un servicio de almacenamiento de archivos en internet, el cual es accesible desde casi cualquier plataforma (Android, Windows, Mac, Linux…), siendo tan sólo necesario una conexión a internet [11].
Dentro de esta herramienta desarrollada por Google, se encuentra Google Docs, que es un procesador de texto online y gratuito, que guarda los documentos generados en el propio Google Drive siendo posible acceder a ellos al igual que con Google Drive desde cualquier plataforma. Estos documentos pueden ser compartidos y observar los cambios entre diferentes versiones.
Para el desarrollo del proyecto se va a utilizar Google Drive, tanto para almacenar el código fuente de la herramienta a desarrollar, como para guardar y editar los diferentes documentos necesarios del trabajo fin de carrera, como son la memoria, el sprint backlog, pruebas de integración, etc.
Draw.io
Es un programa de dibujo desarrollado por JGraph que se integra en Google Docs que permite hacer de diagramas tipo UML, diagramas de flujo, diagramas de entidad relación, etc [12].
Ilustración 7
Debido a su buena integración con Google Drive en el proyecto va a utilizar para realizar los diferentes diagramas y así integrarlos dentro de los documentos.
Web sequence diagrams
Al igual que las anteriores herramientas, esta herramienta también es una herramienta gratuita y online que se utiliza, como indica su nombre, para la generación de diagramas de secuencia. La utilización de esta herramienta es sencilla, tan sólo se debe escribir en la parte izquierda de la pantalla los diferentes pasos del diagrama de secuencia utilizando una nomenclatura propia y el diagrama se va generando en la parte de la derecha de la pantalla [13].
Ilustración 8
Se decidió utilizar esta herramienta debido a su facilidad de uso, que se podía utilizar en cualquier plataforma y que los datos estaban guardados en la nube por lo que se podía utilizar en cualquier momento.
Eclipse
Un entorno de desarrollo integrador o IDE (sigla en inglés de integrated Development
Environment) es un programa compuesto por diferentes herramientas de programación que las centralizan en el mismo programa facilitando así la programación. Normalmente está compuesto como mínimo por un editor de texto, un compilador y depurador, aunque en la actualidad los IDEs han ido añadiendo muchas más funcionalidades desde la generación de un web service a través de un wsdl como la creación de la interfaz gráfica de una página web [14]. Para este proyecto se ha decidido usar como IDE Eclipse, que es un entorno de desarrollo de propósito general.
Desarrollado por IBM, en sus orígenes nació como el sucesor de Visual Age, pero al cabo de los años se creó una organización sin ánimo de lucro para que se encargara de ella y a la vez promoviera el software libre.
Actualmente está bajo la licencia Eclipse Public License, que es una licencia de software libre aunque incompatible con GPL.
Posiblemente sea el IDE más extendido en la actualidad, debido a que ya no es sólo un entorno de desarrollo para Java sino que también existe la posibilidad de desarrollar en otros lenguajes como C, Ruby, PHP, etc.
Una de sus principales características son los plugins, que son complementos independientes que se acoplan a Eclipse para darle una funcionalidad extra que antes no tenía. Esto hace que Eclipse sea muy versátil pudiéndose adaptar a cualquier circunstancia con tan sólo instalar los plugins necesarios para ese desarrollo.
Desarrollo
Como se indicó anteriormente se va a utilizar la metodología de desarrollo Scrum, pero al ser un trabajo fin de carrera, los diferentes actores que intervienen en esta metodología no están presentes, por lo que todos serán representados por la misma persona.
Primera iteración
Reunión de planificación (Sprint Planning)
En esta primera reunión el Product Owner define el product backlog que indicará los requisitos iniciales del producto:
Requisito Descripción Estado
REQ1 Recolección de los metadatos de la BBDD Pendiente
REQ2 Creación de la clase de negocio Pendiente REQ3 Generación de xsd de una tabla Pendiente REQ4 Generación de un bean java Pendiente
Tabla 22
REQ1: Se deberá generar una estructura en memoria que almacene toda la información de la antigua base de datos, sus tablas, sus columnas, los tipos de éstas, sus claves primarias y sus claves foráneas.
REQ2: Se deberá generar una clase de negocio, por cada tabla. Esta clase de negocio estará vacía de contenido y se generará para que las personas que vayan a utilizar toda esta estructura de clases metan ahí la lógica de su negocio.
REQ3: Se deberá generar un xsd por cada tabla que representará a esta. Estos xsd definirán las columnas con sus tipos de datos y sus claves.
REQ4: Se deberá de generar una clase java que represente a cada una de las tablas. Esa clase tendrá como atributos las columnas y claves, y serán del tipo correspondiente con la Base de datos.
Después de definir el product backlog se procede a decidir con el product owner qué requisitos se realizarán en este primer sprint.
El primer requisito que se debe realizar es la obtención de los metadatos de la base de datos ya que los demás requisitos dependen de él.
En esta segunda parte de la reunión, el equipo tiene que definir las diferentes tareas que serán necesarias para poder realizar el requisito antes de finalizar el sprint. Estas tareas quedarán plasmadas en el sprint backlog.
Tarea Descripción Fecha prevista de fin Fecha de fin Estado
T1 Creación de Máquina Virtual con una BBDD Oracle 1/11/2013 1/11/2013 Finalizado T2 Creación de la estructura de clases donde van a ser almacenados los metadatos 7/11/2013 7/11/2013 Finalizado T3 Obtención de los datos de las tablas 15/11/2013 15/11/2013 Finalizado T4 Pruebas de integración 17/11/2013 18/11/2013 Tabla 23
T1 ‐ Máquina Virtual Windows XP y Oracle Database Express Edition
Debido a que entorno en el que se va a trabajar es un ordenador MAC y no existe para ése sistema operativo Oracle Database Express Edition, es necesario crear una máquina virtual para poder virtualizar una máquina con el sistema operativo Windows XP y en él instalado esa base de datos. El primer paso es instalar el sistema operativo para posteriormente, instalar la base de datos. Al no necesitar ninguna opción especial la base de datos, ya que su uso va a ser simplemente para consultar su catálogo de datos, se dejan todas las opciones que vienen por defecto en el wizard. Una vez instalada, se procede a instalar el SQL Developer y a activar la base de datos que viene de ejemplo, ya que inicialmente está deshabilitada.
T2 ‐ Creación de la estructura de clases donde van a ser almacenados los metadatos Diagrama de clases donde se almacenarán los metadatos de la base de datos:
Ilustración 9
Table
La clase Table representará a las tablas de la base de datos y tendrá como atributos tanto sus columnas como sus constraint.
Constraint
Representa a las constraint. Contendrá su nombre, alias y tipo, también el nombre de la columna a la que pertenece la constraint.
T3 Obtención de los datos de las tablas
En esta tarea se deberá diseñar y desarrollar el módulo que obtenga los datos de la base de datos y los guarde en la estructura de clases diseñada en la tarea anterior. El diagrama de secuencia a alto nivel es el siguiente:
Ilustración 10
Los pasos serán los siguientes:
1. El Generador obtendrá la configuración de éste. Entre los datos obtenidos, uno de ellos será las tablas que se quieren tratar.
2. El generador por cada tabla llamará al GeneradorTablas para obtener todos los datos de esa tabla.
3. El GeneradorTablas en primer lugar obtendrá las columnas.
4. Éste consultará en la tabla ALL_TAB_COLUMNS, las columnas de la tabla. 5. Devolverá un Resultset con los datos de todas las columnas.
6. Se creará un objeto Column por cada fila del Resulset y se devolverá una lista de columnas.
7. Ahora el GeneradorTablas obtendrá las constraint.
8. Éste consultará la tabla ALL_CONSTRAINTS para obtener todas las constraint de esa tabla.
9. Devolverá un Resultset con las constraint.
10. Se creará un objeto Constraint por cada fila del Resulset y se devolverá una lista de constraint.
11. Devolverá un objeto Table con todos sus datos.
Pruebas unitarias
Para las pruebas unitarias se utilizará el framework junit como se indicó anteriormente, creando las siguiente pruebas con sus resultados:
Test de configuración:
Arrancar la aplicación con unos argumentos de configuración correctos. Arrancar la aplicación con unos argumentos de configuración incorrectos. Arrancar la aplicación sin argumentos de configuración.
Test de obtención de datos de una tabla.
Obtención de datos de una tabla con una columna de tipo numérico. Obtención de datos de una tabla con una columna de tipo texto. Obtención de datos de una tabla con una columna de tipo fecha.
Obtención de datos de una tabla con varias columna de tipo numérico, texto y fecha.
T4 Pruebas de integración
Para las pruebas de integración se generaron los siguientes test.
ID Titulo Descripción Resultado esperado
1 Configuración correcta Arrancar la aplicación con la configuración: ‐properties /Users/prueba/Google\\ Drive/TFC/JCelsig/properties/generador.propert ies ‐fileTables /Users/prueba/Google\\ Drive/TFC/JCelsig/plantillas/ListadoTablas.txt Siendo los path correctos
La aplicación arranque y se pare sin producir ningún error
2 Configuración incorrecta
Arrancar la aplicación con la configuración: ‐propert iuasdiuf
La aplicación al arrancar muestra un error indicando que la configuración es incorrecta y se detiene
3 Configuración vacía
Arrancar la aplicación sin ningún argumento. La aplicación al arrancar muestra un mensaje indicando que es necesaria indicar una configuración y se detiene 4 Obtención de
datos de una tabla
Arrancar la aplicación indicando en el fichero de las tablas a exportar que se deben extraer los datos de la tabla COUNTRIES de la base de datos de test.
La aplicación obtendrá los datos de la tabla y mostrará por el log las columnas y sus constraint: COUNTRY_ID COUNTRY_NAME REGION_ID COUNTRY_C_ID_PK
5 Obtención de datos de varias tabla
Arrancar la aplicación indicando en el fichero de las tablas a exportar que se deben extraer los datos de las tablas COUNTRIES y EMPLOYEES de la base de datos de test.
La aplicación obtendrá los datos de las tablas y mostrará por el log las columnas y sus constraint: COUNTRIES: COUNTRY_ID COUNTRY_NAME REGION_ID COUNTRY_C_ID_PK EMPLOYEES: EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL PHONE_NUMBER HIRE_DATE JOB_ID SALARY COMMISSION_PCT MANAGER_ID DEPARTMENT_ID Tabla 24
Segunda iteración
Reunión de planificación (Sprint Planning)
En esta segunda reunión, el Product Owner da por terminado el primer requisito y decide cuál es el siguiente requisito a realizar según sus prioridades, y como ya todos son independientes y no dependen unos de otros, no hay ningún tipo de restricción. Se decide que el siguiente requisito será el REQ2 ya que parece el más sencillo de los tres y así será más fácil comenzar con la generación de archivos.
Requisito Descripción Estado
REQ1 Recolección de los metadatos de la BBDD Realizado
REQ2 Creación de la clase de negocio Pendiente
REQ3 Generación de xsd de una tabla Pendiente REQ4 Generación de un bean java Pendiente
Tabla 25
En la segunda parte de la reunión el equipo discute cuáles son las tareas a realizar en este segundo sprint para poder tener terminado el requisito al finalizar el mismo. Estas tareas quedarán plasmadas en el sprint backlog como se hizo anteriormente.
Tarea Descripción Fecha prevista de fin Fecha de fin Estado
T5 Búsqueda de una librería de templates para la generación de los diferentes formatos de salida 12/20/2013 12/20/2103 Finalizado T6 Utilización de templates en la generación de las clases de business object 1/9/2014 1/14/2014 Finalizado T7 Generación de las plantillas para las clases business object 1/15/2014 1/21/2014 Finalizado T8 Pruebas de integración 1/17/2014 1/31/2014 Finalizado Tabla 26
T5 ‐ Búsqueda de una librería de templates para la generación de los diferentes formatos de
salida
La tarea consiste en elegir una librería java que genere ficheros de texto plano, los cuales serán la salida de nuestro programa (xsd, java, …). Se tienen diferentes opciones con sus pros y sus contras que se resumen en la siguiente tabla.
Librería Pros Contras Licencia
Ninguna Control total sobre el código No dependencia de ningún software de terceros. Mayor tiempo de desarrollo Menor estabilidad Menor testeo del software Velocity Proyecto muy estable Apache está detrás del proyecto
Motor muy potente
Lleva años sin ser evolucionado.
Es algo más lento que los demás templates.
Apache License 2.0
StringTemplate El equipo de desarrollo ya conoce esta librería
Ligero
Multiplataforma
Menor documentación La comunidad que lo mantiene es pequeña
BSD
FreeMaker Motor de propósito general Proyecto vivo, su última versión estable es del 2013 Muy rápido procesando los templates
El tamaño del motor es bastante grande para las pretensiones del proyecto
BSD
Tabla 27
Teniendo en cuenta los pros y contras de cada uno de los motores de plantillas se elige StringTemplate, ya que para el propósito de este proyecto no se necesita un motor muy potente y el equipo de desarrollo ya conoce ese motor, por lo que no será necesario aprender el funcionamiento de uno nuevo y será más eficiente.
T6 ‐ Utilización de templates en la generación de las clases de business object Esta plantilla tendrá los siguientes parámetros de entrada:
package: este parámetro indica en qué paquete se encuentra la clase. Esto sería en caso de java, pero si el lenguaje que se va a generar es c# por ejemplo, el package sería su namespace. En caso de que el lenguaje a generar no tuviera package, simplemente con dejarlo vacío sería suficiente. Este parámetro se proporcionaría a través del fichero de configuración ya que es decisión de la persona que ejecuta el programa a qué package quiere que pertenezca.
entity: este parámetro es el nombre de la clase. Este nombre será el nombre de la tabla siguiendo las guías de estilo de java, primera letra en mayúsculas, en caso de ser varias palabras, la primera letra de la siguiente palabra será también en mayúsculas, etc [15].
imports: este parámetro es una lista de clases o paquetes a importar. Al igual que el package, esto también vendrá definido por el fichero de configuración, ya que el encargado de generar el código sabrá qué clases son necesarias importar en su clase de negocio. En caso de generar el código para otro lenguaje como c#, en ese parámetro irán los namespace que se vayan a usar con la directiva using.
sup: este último parámetro es la clase padre. Al igual que el package y los imports, será definido en el fichero de configuración.
Plantilla
class(package,entity, imports, sup="Object")::= <<package <package>;
<imports:generateImports()>
public class <entity> extends <sup> {
} >>
generateImports(paquete)::= "import <paquete>; <\n>" Tabla 28
Ésta sería la plantilla para generar la clase de negocio. A continuación explico cada una de sus partes:
<imports:generateImports()>
public class <entity> extends <sup> {
} >>
A continuación se define el template, donde se sustituyen las palabras que vienen entre los símbolos de < y > por sus parámetros. Este template también tiene una llamada a otro template, generateImports. La forma de llamar a este template es diferente, es una operación map, por cada elemento del array se llama al template generateImports pasando como primer argumento ese elemento del array, formando así los imports de la clase. generateImports(paquete)::= "import <paquete>; <\n>"
T7 Generación de las plantillas para las clases business object
En esta tarea se deberá diseñar y desarrollar el módulo que generará las clases de negocio de cada tabla, llamando al motor de templates y posteriormente guardando la clase generada en un fichero aparte. El diagrama de secuencia a alto nivel es el siguiente:
Ilustración 11
Los pasos serán los siguientes:
1. El Generador obtendrá la configuración de éste. Entre los datos obtenidos, uno de ellos será las tablas que se quieren tratar.
2. Se obtienen los datos de las tablas a exportar (como se indicó en el diagrama de secuencia anterior).
3. El objeto tabla es devuelto.
4. Se llama al generador de clases para que generé el Business Object. 5. Éste a su vez, llama al GeneradorBusiness para que cree la clase.
6. El GeneradorBusiness rellena el template con los valores obtenidos de la bbdd y llama al renderizado del motor de templates para que genere la clase.
7. La clase es devuelta.
Pruebas unitarias
Test del GeneradorBusiness:
Crear una clase Business Object sin imports ni clase padre. Crear una clase Business Object con imports pero sin clase padre. Crear una clase Business Object sin imports pero con clase padre. Crear una clase Business Object con imports y con clase padre.
T8 Pruebas de integración
Para las pruebas de integración se generaron los siguientes test.
ID Titulo Descripción Resultado esperado
6 Creación clases Business Object de una tabla Arrancar la aplicación indicando en el fichero de configuración que la clase Business Object tendrá las siguientes propiedades: business.imports=com.tmp.*;org.apache.* business.package=tmp business.parent=Object business.template=/Users/prueba/Dropbox/tfc/pl antillas/PlantillaBusinessObject.stg pathBusinessObjects=/Users/prueba/tmp/ Y en el fichero de las tablas a exportar que se exportará la tabla COUNTRIES La aplicación creará un fichero Countries.java en el directorio indicado en el fichero de configuración en la propiedad pathBusinessObjects y teniendo las propiedades indicadas ese fichero, clase padre Object, paquete tmp, imports com.tmp.*, org.apache.* 7 Creación clases Business Object de varias tabla Arrancar la aplicación indicando en el fichero de configuración que la clase Business Object tendrá las siguientes propiedades: business.imports=com.tmp.*;org.apache.* business.package=tmp business.parent=Object business.template=/Users/prueba/Dropbox/tfc/pl antillas/PlantillaBusinessObject.stg pathBusinessObjects=/Users/prueba/tmp/ Y en el fichero de las tablas a exportar que se exportarán las tablas COUNTRIES, EMPLOYEES Y DEPARTMENTS La aplicación creará un fichero Countries.java, otro Employess.java y otro Departments.java en el directorio indicado en el fichero de configuración en la propiedad pathBusinessObjects y teniendo las propiedades indicadas ese fichero, clase padre Object, paquete tmp, imports com.tmp.*, org.apache.*
8 Creación clases Business Object de una tabla sin clase padre Arrancar la aplicación indicando en el fichero de configuración que la clase Business Object tendrá las siguientes propiedades: business.imports=com.tmp.* business.package=tmp business.parent= business.template=/Users/prueba/Dropbox/tfc/pl antillas/PlantillaBusinessObject.stg pathBusinessObjects=/Users/prueba/tmp/ Y en el fichero de las tablas a exportar que se exportará la tabla COUNTRIES La aplicación creará un fichero Countries.java en el directorio indicado en el fichero de configuración en la propiedad pathBusinessObjects y teniendo las propiedades indicadas ese fichero, paquete tmp, imports com.tmp.*. La clase padre será Object porque en caso de no venir ninguna clase padre se pone ésa por defecto 9 Creación clases Business Object de una tabla con una clase padre diferente a Object Arrancar la aplicación indicando en el fichero de configuración que la clase Business Object tendrá las siguientes propiedades: business.imports=com.tmp.* business.package=tmp