• No se han encontrado resultados

Herramientas utilizadas

In document Generador de código para BBDD Oracle (página 51-100)

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 

In document Generador de código para BBDD Oracle (página 51-100)

Documento similar