UNIVERSIDAD DE CHILE FACULTAD DE CIENCIAS FÍSICAS Y MATEMÁTICAS DEPARTAMENTO DE CIENCIAS DE LA COMPUTACIÓN SISTEMA GENERADOR DE APLICACIONES WEB MULTICAPA - CODEV TESIS PARA OPTAR AL GRADO DE MAGÍSTER EN TECNOLOGÍAS DE INFORMACIÓN DAVID ALBERTO MEZA GIRALDO PROFESOR GUÍA: SERGIO FABIÁN OCHOA DELORENZI MIEMBROS DE LA COMISIÓN: MARIA CECILIA BASTARRICA PIÑEYRO LUIS GUERRERO BLANCO YADRAN ETEROVIC SOLANO SANTIAGO DE CHILE JUNIO 2008 Resumen En el mundo de hoy, la tendencia a acortar el tiempo de desarrollo y la inversión en la construcción de sistemas de información provoca muchos problemas como que una gran cantidad de estos sistemas no lleguen a terminarse. Al iniciar un proyecto se requiere una buena cantidad de tiempo para establecer un ambiente de trabajo y el esqueleto de una aplicación Web que sea mantenible y estándar. En general estas son tareas repetitivas y pueden generar muchos errores y pérdida de tiempo. CodEv (Code Evolution) es un generador de código fuente para aplicaciones Web Java orientadas a base de datos con una arquitectura de sistemas multicapa. Este generador aportará a la solución de estos problemas al reducir el tiempo de desarrollo por medio de la automatización de las tareas repetitivas del proyecto. Además, facilitará y acelerará la definición de requerimientos y funcionalidad del sistema para un dominio específico de aplicaciones que son los sistemas de información Web en Java, reforzando una arquitectura multicapa que ha sido probada por su mantenibilidad, extensibilidad y escalabilidad en aplicaciones Web. El desarrollo de CodEv se realizó con prácticas ágiles y con una metodología iterativaincremental apoyada por prototipos evolutivos, lo que permitió que durante el tiempo de desarrollo de la tesis las definiciones de la herramienta fueran cambiando y evolucionando hasta establecerse la herramienta resultante, con un proceso sencillo, amigable y rápido. Además, permite la evolución de la aplicación generada por medio de la regeneración de código siguiendo un proceso no destructivo. Está fuertemente integrado con la plataforma Eclipse que es un ambiente de desarrollo robusto y poderoso. La validación de la herramienta se realizó con varios proyectos, pero principalmente por medio de un proyecto ficticio para la creación de un sistema académico, en donde se midieron los tiempos de desarrollo. Además, CodEv fue usado como base para la construcción de SIMPLe que es una herramienta para el soporte al proyecto de mejora de calidad de procesos con modelos CMMI e IDEAL. Agradecimiento El agradecimiento más grande y especial para mi esposa Jesi por su incondicional apoyo, pero especialmente por su gran amor y paciencia. Todas las metas que nos marcamos se van logrando porque estamos juntos. Segundo a nuestras familias y amigos por motivarnos a alcanzar este titulo. Un agradecimiento especial para Sergio Ochoa por su ayuda para la realización de este trabajo. ÍNDICE DE CONTENIDO 1. INTRODUCCIÓN...................................................................................................................................1 1.1. PROBLEMA A RESOLVER ..................................................................................................................4 1.2. SOLUCIÓN PROPUESTA ....................................................................................................................5 1.3. OBJETIVOS DEL SISTEMA .................................................................................................................6 1.3.1. Objetivo general........................................................................................................................6 1.3.2. Objetivos específicos................................................................................................................6 2. MARCO TEÓRICO................................................................................................................................7 2.1. HERRAMIENTAS PARA ASISTIR EN EL DESARROLLO DE SISTEMAS ........................................................7 2.2. PROTOTIPOS DE SISTEMAS...............................................................................................................9 2.3. ARQUITECTURA DE SISTEMAS W EB.................................................................................................11 2.4. ARQUITECTURA DE LA PLATAFORMA ECLIPSE ..................................................................................13 2.5. AMBIENTES DE DESARROLLO..........................................................................................................16 2.5.1. Visual Studio Express Edition C# ...........................................................................................16 2.5.2. Eclipse IDE RCP/Plug-in Development Enviroment (PDE)....................................................17 2.6. TRABAJOS RELACIONADOS .............................................................................................................19 3. ANÁLISIS DEL SISTEMA...................................................................................................................23 3.1. REQUISITOS DEL SISTEMA .............................................................................................................23 3.1.1. Descripción general ................................................................................................................23 3.1.2. Requisitos funcionales............................................................................................................24 3.1.3. Atributos de Calidad ...............................................................................................................25 3.2. PLAN DEL PROYECTO ....................................................................................................................26 3.2.1. Metodología ............................................................................................................................26 3.2.2. Planificación............................................................................................................................27 4. ARQUITECTURA Y DISEÑO DEL SISTEMA ....................................................................................30 4.1. DESCRIPCIÓN GENERAL .................................................................................................................30 4.2. ARQUITECTURA DEL GENERADOR CODEV .......................................................................................30 4.3. DISEÑO DETALLADO DE COMPONENTES IMPORTANTES DE CODEV....................................................33 4.3.1. Representación del modelo de datos .....................................................................................34 4.3.2. Manejador de Presentación....................................................................................................36 4.3.3. Manejador de BD....................................................................................................................38 4.3.4. Manejador de Generación ......................................................................................................40 4.4. ARQUITECTURA DE LAS SOLUCIONES GENERADAS...........................................................................41 4.4.1. Data Transfer Objects (DTO) .................................................................................................42 4.4.2. Capa de Presentación ............................................................................................................42 4.4.3. Capa de Negocio ....................................................................................................................43 4.4.4. Capa de Persistencia..............................................................................................................44 4.5. DISEÑO DETALLADO DE LAS SOLUCIONES GENERADAS .....................................................................46 5. CONSTRUCCIÓN DEL SISTEMA ......................................................................................................50 5.1. AMBIENTE DE DESARROLLO............................................................................................................50 5.2. PROTOTIPOS REALIZADOS..............................................................................................................51 5.2.1. Prototipo 1 ..............................................................................................................................51 5.2.2. Prototipo 2 ..............................................................................................................................51 5.2.3. Prototipo 3 ..............................................................................................................................52 5.3. METODOLOGÍA DE DESARROLLO APLICADA......................................................................................52 5.3.1. Iteración 1 ...............................................................................................................................53 5.3.2. Iteración 2 ...............................................................................................................................53 5.3.3. Iteración 3 ...............................................................................................................................54 5.3.4. Iteración 4 ...............................................................................................................................54 6. FUNCIONAMIENTO DE CODEV ........................................................................................................56 6.1. INSTALACIÓN Y CONFIGURACIÓN.....................................................................................................56 6.1.1. Pre-requisitos..........................................................................................................................56 6.1.2. Instalación de Codev ..............................................................................................................56 6.2. PROCESO DE GENERACIÓN ............................................................................................................59 6.2.1. Generación inicial ...................................................................................................................60 6.2.2. Regeneración – Evolución de la aplicación............................................................................67 6.2.3. Proceso de desarrollo recomendado......................................................................................67 6.3. BOSQUEJO DE LA SOLUCIÓN GENERADA..........................................................................................69 7. CASO PRÁCTICO - VALIDACIÓN DE LA HERRAMIENTA .............................................................75 8. CONCLUSIONES................................................................................................................................81 8.1. 8.2. 8.3. 9. CONCLUSIONES.............................................................................................................................81 RECOMENDACIONES ......................................................................................................................83 MEJORAS A FUTURO ......................................................................................................................83 BIBLIOGRAFÍA...................................................................................................................................85 APÉNDICE A – ESTIMACIÓN DE LA INVERSIÓN MUNDIAL EN TI Y CANTIDAD DE PROYECTOS DE TI ..................................................................................................................................................................87 ÍNDICE DE ILUSTRACIONES Y TABLAS Figura 1. Arquitectura típica para sistemas Web .........................................................................................11 Figura 2. Arquitectura de la plataforma Eclipse ...........................................................................................14 Figura 3. Elementos y proceso típico de MDA.............................................................................................21 Figura 4. Casos de uso para la generación .................................................................................................24 Figura 5. Representación en el tiempo del desarrollo Iterativo....................................................................26 Figura 6. Cronograma de actividades para la creación del sistema ............................................................28 Figura 7. Funcionamiento propuesto para el sistema..................................................................................31 Figura 8. Integración de CodEv y las aplicaciones generadas con Eclipse ................................................32 Figura 9. Arquitectura de CodEv ..................................................................................................................33 Figura 10. Modelo de clases que representan el modelo de datos a generar.............................................34 Figura 11. Modelo de clases de la implementación de los puntos de integración del Wizard de CodEv para generación de aplicaciones..........................................................................................................................37 Figura 12. Modelo de clases de la implementación de los puntos de integración del Editor de CodEv para regeneración de aplicaciones.......................................................................................................................38 Figura 13. Modelo de clases del componente manejador DB .....................................................................39 Figura 14. Modelo de clases del componente manejador de Generación ..................................................40 Figura 15. Componentes y conexiones de la capa de presentación basada en Struts...............................41 Figura 16. Componentes y conexiones de la capa de presentación basada en Struts2.............................43 Figura 17. Componentes y conexiones de la capa de negocio en un sistema multicapas .........................43 Figura 18. Componentes y conexiones de la capa de negocio en un sistema multicapas .........................44 Figura 19. Componentes y conexiones de la capa de persistencia basada en Hibernate ..........................45 Figura 20. Vista de alto nivel de la arquitectura de Hibernate .....................................................................46 Figura 21. Diagrama de clases para el soporte de servicio de filtros en consultas en la capa de negocio 47 Figura 22. Diagrama de clases para el soporte de ordenamiento en consultas en la capa de negocio .....48 Figura 23. Diagrama de clases de un DAO de ejemplo con sus métodos y relaciones ..............................49 Figura 24. Opción de menú para instalación de plug-ins en Eclipse ...........................................................57 Figura 25. Pantalla de instalación de un plug-in desde un sitio local ..........................................................58 Figura 26. Pantalla de selección de Features a instalar ..............................................................................59 Figura 27. Opción de menú para listar los tipos de archivos y proyectos....................................................61 Figura 28. Opción de menú para crear un nuevo proyecto CodEv..............................................................61 Figura 29. Pantalla de captura de opciones de configuración de CodEv ....................................................62 Figura 30. Pantalla de configuración de tablas y datos de log in de CodEv................................................63 Figura 31. Pantalla de configuración de campos por tabla..........................................................................64 Figura 32. Pantalla de avance de generación de CodEv.............................................................................65 Figura 33. Estructura de un proyecto Web Java creado con CodEv ...........................................................66 Figura 34. Editor para la regeneración de un proyecto CodEv....................................................................67 Figura 35. Modelo iterativo de desarrollo con generación de código ..........................................................68 Figura 36. Página de login del sistema generado........................................................................................69 Figura 37. Mensajes de error que presentará el sistema ............................................................................70 Figura 38. Menú generado para el sistema .................................................................................................70 Figura 39. Página con listado de datos ........................................................................................................71 Figura 40. Cabecera para filtrar el listado de elementos .............................................................................71 Figura 41. Página flotante para seleccionar elementos de una relación padre...........................................72 Figura 42. Página para seleccionar un elemento de tipo fecha...................................................................72 Figura 43. Paginación para los listados .......................................................................................................73 Figura 44. Página para agregar un nuevo elemento....................................................................................73 Figura 45. Página para modificar un elemento ............................................................................................74 Figura 46. Página para modificar un elemento ............................................................................................74 Figura 47. Modelo Físico inicial del esquema de BD para el caso práctico ................................................76 Figura 48. Modelo Físico final del esquema de BD para el caso práctico ...................................................77 Figura 49. Pantalla de login única para todos los usuarios del sistema ......................................................77 Figura 50. Pantalla de edición de datos personales y de usuario ...............................................................78 Figura 51. Pantalla de ingreso de notas por materia ...................................................................................78 Figura 53. Pantalla de visualización de notas para alumno.........................................................................79 1. Introducción El desarrollo de software es un proceso máximamente laborioso, altamente complejo y calificado, probablemente más que cualquier otra actividad profesional humana. El diseño y programación de software es tan complejo y propenso a errores que es subestimado por la mayoría. El grupo para el que se está tratando de desarrollar el software generalmente no tiene idea del tamaño o complejidad o cómo el software es diseñado, construido o inclusive cómo funciona. El desarrollo ocurre en una frágil matriz de aplicaciones, usuarios, exigencias del cliente, leyes, políticas internas, presupuestos, dependencias organizacionales y de proyecto que cambian constantemente. 1 En el mundo de hoy, sigue creciendo la necesidad de soportar un modelo de empresa con distribución geográfica del trabajo con flexibilidad y seguridad, además de obtener ventajas competitivas por medio de la mejora de procesos y cambios constantes. Estas son algunas de las razones por las que las empresas siguen optando por utilizar o desarrollar sistemas de información que ayuden a automatizar sus procesos y a soportar la distribución geográfica. Esto ha hecho que siga creciendo al mismo ritmo la demanda por sistemas de información Web, y que además estos sistemas requieran ser flexibles y mantenibles al igual que lo son los procesos de las empresas. El valor estimado de inversión en proyectos de tecnología de información mundialmente para el año 2006 fue de más o menos 900,000 millones de USD para un aproximado de 1’000.000 proyectos [StG94], [StG03]. (Ver apéndice A). Todos estos valores se producen a pesar de que muchos de estos sistemas se terminen tarde o que ni siquiera lleguen a terminarse [InfQ06]. El proceso de desarrollo de sistemas es un proceso netamente manual, es decir que requiere ser realizado por personas que sean altamente calificados, como son los ingenieros de software (analistas, arquitectos, diseñadores, programadores, ingenieros de calidad, etc.). Y es el salario de los ingenieros o consultores donde está uno de los rubros más grandes de desarrollar un sistema de software de mediano o gran tamaño. Otro dato muy importante es que la mayor cantidad de sistemas computacionales que se producen están relacionados con sistemas de información, es decir son sistemas 1 Construido de la lógica de varios autores e ideas propias 1 computacionales organizados para facilitar el manejo (captura, almacenamiento, procesamiento y presentación) de información importante de la empresa, ya sea de sus procesos, productos, servicios, clientes y las relaciones entre ellos. Estos sistemas computacionales generalmente almacenan su información en bases de datos relacionales. En un proyecto de desarrollo de software se tienen al menos dos visiones de lo que debe ser y hacer el sistema resultante: la de los clientes o usuarios de la aplicación (visión de negocios) y la de los ingenieros de software (visión técnica). Estas visiones del sistema, aunque pueden coincidir, generalmente son muy diferentes, puesto que es difícil para los usuarios tratar de comunicar a los ingenieros de software, a través del lenguaje natural, el complejo funcionamiento de procesos, procedimientos, reglamentos e ideas que el sistema tendrá que automatizar. La visión de la parte de negocios de las empresas generalmente es que necesitan los sistemas implantados rápidamente y en la mayoría de ocasiones no entienden por qué el proceso de desarrollar sistemas es tan complejo y costoso. En muchos casos se quejan de la alta inversión y del ritmo demasiado lento de implantación tecnológica. Por otro lado se encuentra la visión de las personas de tecnología encargados del desarrollo e implantación de estos sistemas que están restringidos por varios aspectos tecnológicos y no tecnológicos como son: - la tecnología para el desarrollo de sistemas Web y las herramientas disponibles para hacerlo son altamente cambiantes. - restricciones en funcionalidad del sistema, ambiente de ejecución y en tiempo y dinero. - se debería seguir los estándares y mejores prácticas de la empresa y del mercado. - por último, una de las restricciones o características más importantes que deben resolver los ingenieros de software, es que los sistemas deben ser flexibles y mantenibles, ya que se espera que sean usados por un largo periodo de tiempo y por lo tanto, lo más probable es que sean modificados muchas veces durante su tiempo de vida. Como consecuencia de todas estas razones anteriormente mencionadas y la oposición entre los puntos de vista generalmente se crean problemas de comunicación entre el cliente o usuario y los ingenieros de software y esto crea problemas en la definición de los requerimientos del 2 sistema. Además, se ha creado un fenómeno en que los sistemas se tratan de realizar con inversiones y tiempos demasiado acotados para la realidad del proyecto que resultan en que lo que se sacrifica, en la mayoría de casos, es una buena definición de requerimientos, parte de la funcionalidad requerida del sistema final y/o la calidad del producto final [Gla02]. Durante mucho tiempo se ha buscado la manera de reducir el tiempo empleado en la producción de sistemas, y se han tratado de implementar distintas soluciones al problema. Una de las soluciones más exitosas y masificadas en el tiempo se dio en el apogeo de las aplicaciones cliente-servidor, en que los lenguajes y herramientas de desarrollo para crear cierto tipo de aplicaciones específicas, como sistemas orientados a datos, habían evolucionado y madurado hasta el punto de tener capacidad de generación de código y el uso de asistentes (wizards), en la década de los 90 [Mic01]. Esto facilitaba las tareas repetitivas, evitando los errores de programación o lógica en estas tareas que pueden costar gran cantidad de tiempo al programador. Un ejemplo de este tipo de herramientas son Visual Basic 6.0, Access u Oracle Forms. Los generadores de código y asistentes facilitan el trabajo y reducen el tiempo de desarrollo permitiendo a los desarrolladores concentrarse en las reglas de negocio y en realizar una mejor solución, puesto que no se requiere de un conocimiento tan profundo del lenguaje y sus estructuras para crear las aplicaciones, sino más bien de la herramienta y sus asistentes. Con este tipo de herramientas se facilitó la construcción de aplicaciones pequeñas y de prototipos de aplicaciones, simplificando el trabajo de la toma de requerimientos y evolucionándolos a sistemas completos. En este trabajo se pretende resolver los siguientes problemas para un dominio específico de aplicaciones que son los sistemas de información Web en Java: 1) facilitar y acelerar la definición de requerimientos y funcionalidad del sistema, 2) reducir el tiempo de desarrollo por medio de la automatización de las tareas repetitivas iniciales del proyecto, y 3) ayudar a crear una arquitectura de sistemas multicapa para que sea escalable, extensible y mantenible. Todo esto por medio de la creación rápida de prototipos evolutivos de aplicaciones Web multicapa. 3 Los generadores de aplicaciones orientados a manejo de datos, generan aplicaciones CRUD (Create, Read, Update and Delete), de manera simple y repetitiva. Lo que se quiere hacer es generar el mismo tipo de aplicaciones CRUD para aplicaciones Web con una arquitectura multicapa, ya que no existe una herramienta similar para Web que nos pueda ayudar a generar prototipos evolutivos. A continuación se presenta el problema a resolver, se detalla brevemente la solución propuesta, posteriormente se detallan los objetivos que se plantearon alcanzar con la construcción de la herramienta propuesta en esta tesis. 1.1. Problema a resolver Como se dijo anteriormente, la tendencia a cortar el tiempo e inversión en la construcción de sistemas provoca muchos problemas, generando que una gran cantidad de sistemas no lleguen a terminarse o no sean usados puesto que no satisfacen los requerimientos originales. Estos sistemas contienen errores causados por fallas en la toma de requerimientos, fallas en la comunicación o entendimiento de estos requerimientos por parte los ingenieros de software. Aun con todos los esfuerzos presentados para mejorar las técnicas y herramientas disponibles para los ingenieros, no se ha logrado que exista una comunicación ágil con el cliente y por tanto la definición clara de requerimientos. También por falta de tiempo se deja de lado, en muchos casos, lo que sería una buena arquitectura de sistemas con flexibilidad, capacidad de cambio y crecimiento; muchos de estos sistemas presentan importantes problemas por la reducción de calidad, específicamente problemas de mantenibilidad, extensibilidad y escalabilidad. Los métodos ágiles son un esfuerzo por ayudar a reducir el riesgo de construir el sistema equivocado ya que promueven una fuerte participación del cliente y la asimilación de los cambios al sistema por medio de la utilización de pequeñas iteraciones [Hem06]; pero cuando el cliente no puede o quiere participar tan cercanamente en el proyecto estos métodos no son aplicables. Esto se da especialmente cuando los ingenieros de software y el cliente no se encuentran en el mismo lugar, por ejemplo que se encuentren en diferentes ciudades o países y la comunicación no es eficiente. Todos estos problemas se presentan igualmente para el desarrollo de sistemas de información Web y en muchos casos en mayor medida puesto que es el ámbito tecnológico en 4 que más avances se realiza actualmente, se crean nuevos frameworks, mayores capacidades de las herramientas y lenguajes, nuevas capas de abstracción y funcionamiento. Todos estos avances y cambios tecnológicos dificultan aún más el poder establecer la infraestructura inicial para un proyecto Web y que el tiempo se utilice en aprender a usar estas tecnologías y no necesariamente en la toma de requerimientos o entendimiento del negocio del cliente. 1.2. Solución propuesta Este proyecto plantea la creación de un generador de aplicaciones Web Java orientadas a base de datos para operaciones CRUD con una arquitectura de sistemas multicapa que se lo ha denominado CodEv. Con esta herramienta se puede generar un esqueleto funcional de la aplicación en muy corto tiempo, evitando los errores comunes, y permitiendo tener ciclos de desarrollo más cortos o realizar prototipos rápidos ayudando de esta manera a tener una mejor interacción y trabajo con el cliente. El motivo para crear este generador es que como sabemos se requiere una buena cantidad de tiempo al iniciar un proyecto para establecer un ambiente de trabajo y el esqueleto de una aplicación Web que sea mantenible y estándar. En general estas son tareas repetitivas que generalmente requieren la revisión de proyectos pasados y la documentación de arquitectura de referencia para la empresa. Son estas actividades en donde se pueden generar muchos errores y pérdida de tiempo. Como se ha definido, el generador ayudará a crear esqueletos de aplicaciones Web Java muy rápidamente, acelerando también el proceso de creación de prototipos, ayudando de esta manera a definir los requerimientos más clara y rápidamente. Al interactuar con una aplicación funcional, el prototipo evolutivo se convierte en un puente de comunicación entre el usuario y el ingeniero de software. Con esto se ayuda a reducir el tiempo de desarrollo con necesidades claras de usuario y una aplicación con una arquitectura escalable y mantenible que puede ser evolucionada fácilmente, lo cual, visto de manera general, también ayudará a reducir costos. El generador está orientado a un dominio muy específico que son los sistemas de información para el Web con lenguaje Java; y por lo tanto, es en proyectos nuevos dentro de este dominio donde se podrán ver los beneficios planteados y podrá tener mayor utilidad y aporte, que es en donde podrá ahorrar mayor tiempo de set-up y programación. 5 En resumen, la ventaja de crear este proyecto es que permitirá reducir el tiempo de desarrollo creando un esqueleto funcional de la aplicación. De esta manera se eliminarán los posibles errores que se puedan cometer y reforzará una arquitectura multicapas que promueve la extensibilidad, escalabilidad y mantenibilidad [SEI00]. Esto permitirá crear prototipos evolutivos rápidamente y facilitará el manejo de requerimientos. 1.3. 1.3.1. Objetivos del sistema Objetivo general El objetivo general de este trabajo de tesis es diseñar e implementar una herramienta para la generación rápida de aplicaciones Web basadas en Java, las cuales son usadas principalmente como sistemas de información. Esta herramienta permitirá la creación de la funcionalidad necesaria para manejar operaciones CRUD (Create, Read, Update and Delete), con una arquitectura de sistemas multicapa, de forma de ayudar a crear prototipos evolutivos rápidamente y acelerar el tiempo de desarrollo. Se plantea que los prototipos generados sean esqueletos de aplicaciones totalmente funcionales, que se podrán poner en funcionamiento con mínimo esfuerzo, y estarán hechas para que puedan ser fácilmente adaptables y extensibles. Además dichas aplicaciones tendrán puntos de extensión para soportar múltiples bases de datos. 1.3.2. Objetivos específicos De lo anteriormente expuesto, se desprenden los siguientes objetivos específicos: • Garantizar que el código generado siga los lineamientos de una arquitectura multicapa. • Que la herramienta permita crear, con mínimo esfuerzo, la funcionalidad necesaria para manejar operaciones CRUD. • Que la herramienta pueda ejecutarse en múltiples sistemas operativos. • Permitir que la herramienta pueda generar las aplicaciones utilizando múltiples bases de datos. 6 2. Marco Teórico Dadas las condiciones anteriormente expuestas, a continuación se presentarán algunos de los conceptos que servirán de introducción y que se utilizarán extensamente en el desarrollo de esta tesis. 2.1. Herramientas para asistir en el desarrollo de sistemas La comunidad científica y tecnológica ha propuesto varias maneras de disminuir los riesgos y eliminar los problemas de crear sistemas a través de los años, tratando de que se puedan producir sistemas más rápidamente y que puedan ser mantenibles y escalables. Se ha atacado el problema desde varios frentes como son: Mejoras en lenguajes de programación. El concepto de orientación a objetos y lenguajes seguros son los aportes más grandes realizados para los lenguajes modernos. Son varios los lenguajes que han contribuido a la evolución de los lenguajes orientados a objetos desde la década de los 60 como son Simula I, Simula 67 y Beta, más tarde SmallTalk, Eiffel, Modula, Ada, Prolog. Posteriormente C++ y Pascal orientado a objetos [Bru02]. Estos lenguajes tenían un problema grave que era que permitían al programador cometer errores difíciles de encontrar causados en muchos casos por los punteros y el acceso a la memoria compartida. Estos podían causar daño a los archivos del sistema operativo. Con la aparición de Java a mediados de los 90, se eliminan muchos de estos problemas puesto que Java elimina el uso de punteros, agrega recolección de basura automática (eliminación de objetos que no están en uso de la memoria) y garantiza la seguridad restringiendo el acceso al sistema por medio de la eliminación del acceso directo a la memoria y la programación de bajo nivel. Java es un lenguaje, como C++, auto extensible, es decir que se pueden escribir clases y librerías para extender la funcionalidad del propio lenguaje. Con estas características, el trabajo del programador se hizo más fácil y se empezó a realizar una reutilización real de componentes. Posteriormente a inicios del 2000, se dio la adopción masiva de Java como tecnología empresarial, que fue una evolución basada en la orientación de Java hacia el Web y a arquitecturas empresariales robustas y escalables. 7 Ahora que Java ha madurado considerablemente y que existen otros lenguajes orientados a objetos como son C#, Ruby, Phyton, etc; se está buscando que los lenguajes y frameworks de desarrollo sean más ágiles y rápidos como son Ruby-on-Rails y un esfuerzo similar para Java llamado JRuby, que trata de atacar la facilidad y velocidad de desarrollo. Últimamente se ha hablado mucho sobre los lenguajes dinámicos o de scripting que permiten extender los programas en tiempo de ejecución por medio de la adición de nuevo código o por medio de la extensión de objetos y sus definiciones o modificando el sistema de tipos. Un ejemplo de este tipo de lenguajes es Ruby o Groovy. Evolución en las Metodologías de Desarrollo. Aunque no existe una metodología de desarrollo perfecta, se ha probado que los modelos evolutivos e iterativos son los más exitosos para sistemas de información Web, puesto que reducen el riesgo del proyecto al dividirlo en partes más pequeñas e ir aprendiendo del dominio de la aplicación y de las necesidades del cliente conforme avanza el desarrollo, permitiendo flexibilidad de las 2 partes [BS06]. También se crearon metodologías ágiles, con varios matices, que promueven la facilidad de cambios en los requerimientos y a la alta participación del cliente en el proceso de desarrollo, ya que se ha visto que es una de las características más importantes para el éxito de proyectos de software. Consenso en las abstracciones del sistema. Uno de los grandes problemas en el desarrollo de sistemas es el de comunicación con los clientes y entre personas técnicas encargadas del desarrollo de sistemas. Se trata de encontrar un lenguaje común y entendimiento de las abstracciones de un sistema. UML (Unified Modeling Lenguaje) es un esfuerzo por estandarizar el modelamiento para el análisis y diseño orientado a objetos. UML es un lenguaje estándar para especificar, visualizar, construir y documentar los artefactos de sistemas de software, así como para modelamiento de negocio [Fow03B]. Aunque UML sigue evolucionando y cambiando, logra en gran medida resolver el problema de comunicación entre personas técnicas encargadas del desarrollo de sistemas, pero no así la comunicación con el cliente ya que al no ser técnicos, en su gran mayoría, no comprenden al detalle este tipo de representaciones gráficas. Elementos de Arquitecturas de Sistemas. Para resolver los temas de atributos de calidad dentro de los sistemas de software y reducir el riesgo, se usan elementos que forman parte de los temas de “Arquitecturas de Sistemas”, “Frameworks” y “Patrones de Diseño” [GHJV98]. Estos elementos tratan de facilitar la construcción de sistemas presentando soluciones para problemas tipo, que pueden ser resueltos de la misma manera, garantizando así que se pueda resolver el problema en menor tiempo de desarrollo y aplicando una solución que anteriormente 8 fue implementada y funcionó. Aunque es un tema muy frecuente, el gran abanico de herramientas y la gran cantidad de documentación que existe al respecto ha llevado a la especialización de las personas en arquitecturas de dominio específico o en segmentos de la arquitectura como es la seguridad, haciendo que se requiera aún mayor cantidad de gente experta en las diferentes áreas para construir un sistema robusto. Esto ha llevado a que generalmente, se trate de estandarizar una arquitectura de referencia a nivel de cada empresa en base a la cual todos los sistemas deben ser desarrollados para facilitar su construcción, mantenimiento y extensibilidad sea quien sea que tenga que realizar los cambios al sistema. Como otros esfuerzos para facilitar el trabajo de la creación de sistemas están la creación de estándares de programación, mejores prácticas, etc. Todos estos esfuerzos se centran en mejorar las herramientas disponibles para comunicar, documentar y crear los sistemas pero aún con todo este abanico de herramientas se sigue teniendo grandes problemas en la creación de sistemas. 2.2. Prototipos de sistemas Una técnica muy usada para eliminar los riesgos en la fase de requerimientos es el realizar prototipos de sistemas, que es el proceso de crear un modelo incompleto pero funcional de lo que será el sistema de software final y que puede ser usado para permitir a los usuarios tener una idea inicial de lo que será el sistema completo y permitirles evaluarlo. El realizar prototipos tiene algunas ventajas y desventajas que pueden ser tangibles o abstractas. Algunas de las ventajas: - Reducción de tiempos y costos - realizar prototipos puede ayudar a mejorar la calidad de los requerimientos y especificaciones que se proveen a los desarrolladores, puesto que cualquier cambio cuesta exponencialmente más de implementar mientras más tarde se detectan en el ciclo de desarrollo; la determinación temprana de lo que el usuario realmente quiere, puede resultar en software menos costoso y hecho más rápidamente. El diseñador e implementador del software puede obtener retroalimentación de los usuarios temprano en el proyecto. - Incremento y mejora en la manera que se involucra el usuario – realizar prototipos requiere participación del usuario, los usuarios pueden ver e interactuar con el prototipo, permitiéndoles proveer una mejor y más completa retroalimentación y especificaciones. Ya 9 que los usuarios son los que conocen el dominio del problema mejor que cualquiera en el equipo de desarrollo, el incremento en la interacción puede resultar en un producto final que tiene mayor calidad tangible e intangible, ya que el producto final es más probable que satisfaga los deseos del usuario en los aspectos visual, emocional y de rendimiento. La comunicación alrededor del prototipo permite eliminar malos entendidos y errores de comunicación que ocurren con la interpretación y visión de lo que debe hacer del sistema. - Mejora en las estimaciones - permite al ingeniero de software tener una visión más clara del tamaño del proyecto y del nivel de conocimiento, compromiso y participación de los usuarios y así poder realizar una mejor estimación en tiempo y costo. No usar o mal usar prototipos, también puede tener algunas desventajas: - Análisis insuficiente – el enfocarse en un prototipo limitado puede distraer a los desarrolladores de realizar un análisis completo del proyecto. Esto puede llevar a ignorar mejores soluciones, realizar pobre ingeniería y arquitectura que hace un sistema difícil de mantener. Más aun si el prototipo no es una representación real del sistema puede que no escale bien cuando se realice el proyecto completo. - Confusión del usuario entre prototipo y sistema final – los usuarios pueden pensar que un prototipo construido para validar requerimientos e ideas, es el producto final casi listo y que solo necesita retoques. Este no siempre es el caso ya que puede que la arquitectura usada no sea escalable o siquiera válida o el sistema requiera aun mucho trabajo interno. - Exceso de costo y tiempo de desarrollo en el prototipo – una característica importante de la realización de prototipos es que deben ser realizados rápidamente, si el desarrollador pierde esta noción puede tratar de desarrollar un prototipo que es demasiado complejo y por lo tanto el costo se eleva proporcionalmente al tiempo invertido. Existen dos tipos de prototipos de software: desechables y evolutivos. Los desechables son prototipos que se crean rápidamente para probar teorías y después se descartan para iniciar el desarrollo de manera correcta desde el principio sin incluir el prototipo como parte del desarrollo final. Los prototipos evolutivos se realizan de una manera más robusta y estructurada y van evolucionando hasta convertirse en el producto final [AABN07]. 10 En general las metodologías evolutivas, iterativas y ágiles son una combinación de prototipos evolutivos con otras técnicas; ya que tratan de aclarar los requerimientos del sistema creando partes funcionales del sistema que el usuario puede utilizar, revisar y criticar. 2.3. Arquitectura de sistemas Web La arquitectura de sistemas de un programa o sistema computacional es la estructura o estructuras del sistema que está compuesta de elementos de software, las propiedades externamente visibles de esos elementos y las relaciones entre ellos, es decir la distribución de funciones a nivel de frontera dentro del sistema, y la definición precisa de esa frontera. La frontera en arquitectura de sistemas se define como la línea que separa las funciones o subcomponentes que forman parte de un componente y cuales no. La disciplina de la arquitectura de software está centrada en la idea de reducir la complejidad a través de la abstracción y la separación de las responsabilidades [Bus96]. Client Presentation Layer Business Layer Persistence Layer Any convencional DB Figura 1. Arquitectura típica para sistemas Web Uno de los tipos de arquitectura de sistemas son las arquitecturas multicapa o de n-capas (ver Figura 1). Cada capa es una partición lógica (no necesariamente física) de los componentes de la aplicación y que al ser lógica involucra la disciplina por parte del programador de mantener el encapsulamiento de las capas y las invocaciones en el orden adecuado en base a la definición de la jerarquía de capas de la arquitectura. 11 La partición multicapa es el modelo natural para aplicaciones Web, ya que es una arquitectura que ha sido probada por ser escalable, extensible y mantenible. Aunque el uso de esta arquitectura puede producir tiempos de respuesta más lentos que otras arquitecturas, las aplicaciones Web tienen un tiempo de respuesta inherentemente más lento que otro tipo de aplicaciones, pues dependen en gran medida de la latencia de la red. Además, una aplicación Web multicapa bien diseñada y programada generalmente podrá mejorar sus tiempos de respuesta en base a hardware. Se recomienda separar la aplicación en un mínimo de 3 capas: presentación, negocio y persistencia [Fow03A], ya que son el mínimo de componentes básicos de separación de responsabilidades de un sistema de información en el Web. La capa de presentación se encarga de toda la lógica de despliegue y envío de información a los clientes. La capa de negocio se encarga de aislar y centralizar la lógica de validaciones y restricciones de la aplicación. La capa de persistencia se encarga del acceso y manejo de datos sean locales o remotos. Dentro de estas capas podrán implementar otros patrones o tener varias capas que la componen y es por esto que esta arquitectura es llamada multicapa o de n-capas. Se dice que esta arquitectura es inherentemente más mantenible y escalable ya que cada una de las capas es independiente y de esta manera se aísla los detalles de implementación específicos de cada una de ellas. Cualquier cambio que se requiera realizar estará focalizado y aislado a esa capa o a la inmediatamente superior, haciendo más fácil y simple el cambio posterior de lógica o, inclusive, de capas completas. Se puede escalar las aplicaciones con arquitectura multicapa por medio de hardware al poder colocar las diferentes capas en servidores separados y colocar varios servidores para cada capa. Esto se logra al agregar Wrappers a cada capa para que funcionen por medio de Corba (Common Object Request Broker Architecture) [Omg07] u otra tecnología similar de acceso remoto. Por ejemplo en el caso de Java serian los Session Beans [Sun07] que implementan internamente Corba transparentemente para la aplicación. La anterior explicación está simplificada ya que existen otros requerimientos de implementación para lograr esta distribución de capas en diferentes servidores. 12 2.4. Arquitectura de la plataforma Eclipse Eclipse es una plataforma extensible de desarrollo de software de código abierto y gratuita (http://www.eclipse.org/). Está orientada a construir ambientes de desarrollo integrados (IDEs – Integrated Development Enviroment). Es desarrollada y mantenida por el “Eclipse Foundation” bajo licencia “Eclipse Public License” que garantiza su extensibilidad y gratuidad y su ultima versión para producción es la 3.3.1.1 del 23 de Octubre del 2007 con nombre código Europa. Eclipse es la plataforma de desarrollo y ejecución de aplicaciones Java más popular en la actualidad, con más de 50’000.0000 de descargas al año. Eclipse está soportado por muchas organizaciones como son Borland Software Corp., Merant Internation Ltd., Oracle, Rational Software Corp., Red Hat Inc., SuSe Inc., y TogetherSoft Corp., además de muchos constructores de herramientas que contribuyen a la plataforma Eclipse al empaquetar sus herramientas como plug-ins de Eclipse. La plataforma entrega una arquitectura extensible, con puntos de extensión claramente definidos y documentados llamados plug-ins de Eclipse, que está soportado por la arquitectura del ambiente de desarrollo de plugins (PDE – Plugin Development Enviroment) [ML05]. El mecanismo básico de extensibilidad en Eclipse es que los nuevos plug-ins pueden añadir nuevos elementos de procesamiento al ambiente y/o a los plug-ins existentes. Cada plug-in tiene que estar de acuerdo con el contrato o API definido para los plug-ins de Eclipse para que pueda funcionar y trabajar con el ambiente. Todo su ambiente, excepto una pequeña porción de código para ejecución inicial, está escrito y configurado como un plug-in de Eclipse. Es decir, la plataforma está compuesta por un núcleo y un grupo de plug-ins que extienden el núcleo para el inicio y ejecución estándar de los procesos de otros plug-ins y de esta manera se puede extender y personalizar el ambiente de ejecución. El núcleo de servicios está para controlar el ambiente, las herramientas y componentes acoplables que están trabajando juntos para soportar las tareas de programación o trabajo en general. La arquitectura de la plataforma Eclipse incluye muchos de los patrones de diseño de GUI (Interfaz Gráfica de Usuario), por ejemplo, provee el versionamiento de plug-in y un sistema de ayudas integrado. También puede ser usado como una arquitectura de IDE de propósito general. Como el IDE está basado en una arquitectura genérica de plug-ins, se hace fácil 13 soportar otros lenguajes como C/C++, PHP, Ruby. A través de su infraestructura definida, plugins de varios proveedores pueden comunicarse entre ellos de manera fácil y sencilla. Se puede extender la parte visual de IDE por medio de Vistas, Editores, Perspectivas, Asistentes (Wizards) y Ayudas. Cada plugin está empaquetado de manera estándar y es configurado por medio de un archivo XML (eXtensible Markup Language) que es el que contiene la definición de qué clases son los puntos de integración con el IDE para cada una de las funcionalidades visuales y no visuales. Figura 2. Arquitectura de la plataforma Eclipse Como se puede apreciar en la Figura 2, la base para la arquitectura de Eclipse es el RCP – Rich Client Platform (Plataforma de cliente enriquecido) que es el mínimo grupo de plug-ins requeridos para construir aplicaciones de cliente enriquecido y está constituida por los siguientes componentes: - Plataforma principal – inicio de Eclipse, ejecución de plug-ins. - Equinox - un framework de componentes basado en el estándar OSGi que es una plataforma para empaquetamiento estándar de componentes. - El SWT (Standard Widget Toolkit) – Un widget toolkit visual portable y que puede ser ejecutado fuera de la plataforma. 14 - JFace – capa de GUI intermedia para manejo de archivos, editores de texto y manejo de texto. - El Workbench de Eclipse – vistas, editores, perspectivas y asistentes (ayudas) La librería SWT (The Standard Widget Toolkit) entrega funcionalidad nativa de componentes de presentación para la plataforma Eclipse de manera independiente del sistema operativo. La librería SWT puede ser usada para proveer un look and feel nativo al usuario final, así no sabrán si la aplicación es una aplicación nativa o Java. Eclipse dispone de varias características y funcionalidades, pero las básicas y más importantes para este proyecto son: - Editor de texto - Resaltado de sintaxis - Compilación en tiempo real - Integración con Ant - Asistentes (wizards): para creación de proyectos, clases, tests, etc. - Refactorización - Pruebas unitarias con JUnit - Control de versiones con CVS - Integración con servidores de aplicaciones Java como: Tomcat Asimismo, a través de "plugins" libremente disponibles es posible añadir: - Control de versiones con Subversion, vía Subclipse. - Integración con Hibernate, vía Hibernate Tools. Eclipse viene empaquetado en varias versiones para los diferentes IDEs de programación, como son: - Eclipse IDE para desarrolladores Java - Eclipse IDE para desarrolladores Java Enterprise Edition (Web) - Eclipse IDE para desarrolladores C/C++ - Eclipse para desarrolladores de RCP/Plug-ins (PDE) - Otros empaquetamientos de terceros. 15 2.5. Ambientes de desarrollo En el desarrollo de la presente tesis se utilizarán dos ambientes de desarrollo: Visual Studio Express Edition C# para lenguaje C# [Lho06] y la plataforma Eclipse IDE RCP/Plug-in Development Enviroment para el lenguaje Java. Los dos lenguajes tienen grandes similitudes en sus construcciones, sintaxis y uso de librerías. Y, dado que se utilizará un paradigma de componentes, se ha decidido que será bastante reutilizable el esfuerzo de diseño y codificación; además, de rápida y transparente la migración del trabajo realizado en C# hacia Java, excepto por los componentes visuales. Lo anteriormente expuesto ha sido comprobado por los varios frameworks que han cruzado desde el mundo Java a C# como Hibernate a NHibernate, Velocity y NVelocity, JUnit a NUnit, etc. También, existen herramientas que automatizan la migración de código de un lenguaje al otro, como por ejemplo el proyecto de código abierto NET2Java (https://net2java.dev.java.net/) de aplicaciones .Net (C#, Visual Basic.Net) a Java y el Microsoft Java Language Conversion Assistant (JLCA - http://msdn.microsoft.com/vstudio/java/migrate/jlca/default.aspx) que migra desde Java a C# o J#. A continuación se presenta en detalle los dos ambientes de ejecución que se utilizarán durante el desarrollo de la presente tesis. 2.5.1. Visual Visual Studio Express Edition C# Studio Express Edition C# (VS Express C#) (http://www.microsoft.com/express/vcsharp/) es un IDE de desarrollo gratuito para lenguaje C# que tiene todo el soporte de diseñador visual del Windows Presentation Foundation (WPF) para crear aplicaciones de Windows Forms. Esta versión está restringida sólo para este tipo de aplicaciones, pero tiene las ventajas de contar con las herramientas completas para crear, desarrollar, probar, depurar y empaquetar este tipo de aplicaciones de una manera sencilla y rápida. Dado que la versión de VS EE C# es restringida en su funcionalidad no cuenta con integración con otras herramientas. Es por esto que para la planificación, control y avance de las tareas se utilizará Mantis (Issue tracker - http://www.mantisbt.org/). También, se utilizará 16 Subversión para el manejo de versiones junto con TortoiseSVN (http://tortoisesvn.net/) que es un cliente de SVN para Windows. 2.5.2. Eclipse IDE RCP/Plug-in Development Enviroment (PDE) Existe una versión del IDE Eclipse para desarrolladores de RCP/Plug-in llamada Plug-in Development Enviroment (PDE) especialmente empaquetada con una serie de plug-ins que proveen herramientas para crear, desarrollar, probar, depurar y poner en producción plug-ins de Eclipse. Dentro del PDE se tiene disponibles wizards, plantillas y otros elementos para proyectos de plug-ins de Eclipse. Básicamente todos estos elementos ayudan al programador, que está creando un plug-in de Eclipse, a que pueda definir los diferentes parámetros de configuración y los puntos de extensión de manera visual sencilla. Los proyectos pueden ser de tipo: Plug-in (fragment), Feature, Update site y RCP product, que se los describe a continuación. La idea general de la separación y composición de proyectos para construir plug-ins de la plataforma Eclipse es dar más flexibilidad de distribución y de reutilización de componentes y proyectos. - Plug-In (Fragment) – este tipo de proyecto es el que contendrá la funcionalidad en sí del plug-in que se desea crear. También puede ser sólo un proyecto que contenga un fragmento de la funcionalidad de un plug-in (Fragment). Contiene una definición de los puntos de extensión a la interfaz de usuario de Eclipse como pueden ser wizards, editores, vistas, ayudas, etc. Este tipo de proyecto contiene un archivo XML llamado plugin.xml que tiene la definición del proyecto y está asociado con un editor visual para facilitar el ingreso de los valores de configuración para este archivo. Entre los parámetros de configuración, además de los puntos de extensión a la interfaz de usuario en la instalación, se puede ingresar valores de los que depende el plug-in que se está construyendo para su correcta ejecución, como son: dependencias de otros plug-ins de eclipse, parámetros para el ambiente de ejecución del Java Virtual Machine(JVM) como el Classpath, los puntos de extensión que expondrá este plug-in y si se debe incluir el código fuente como parte del empaquetamiento. - Feature – este tipo de proyecto agrupará a varios plug-in o fragmentos y se encarga de empaquetarlos y colocar un conjunto información para la instalación como son: descripción de empaquetamiento, derechos de autor, licenciamiento e información extra en el Web. Un feature es el grupo de funcionalidades que en conjunto presentan las herramientas completas para que el usuario pueda realizar un trabajo. Se pueden seleccionar todas o solo algunas características de los plug-ins para ser empaquetadas 17 como funciones configurables dentro de Eclipse. También se puede definir parámetros de instalación para sistemas operativos específicos. Este tipo de proyecto contiene un archivo XML llamado feature.xml que tiene la definición del proyecto y esta asociado un editor visual para facilitar el ingreso de los valores de configuración para este archivo. - Update Site – este tipo de proyecto agrupa Features para su fácil empaquetamiento para distribución masiva. Un Update site es un lugar ya sea local (en disco o recursos compartidos) o remoto (red local o Web) desde donde se podrá instalar el plug-in en Eclipse. Los Update Site son la manera estándar y fácil de instalar plug-ins dentro de Eclipse, ya que se lo hace por medio de un wizard y Eclipse se encarga del proceso de descarga, instalación y notificación de progreso al usuario. Este tipo de proyecto contiene un archivo XML llamado site.xml que tiene la definición del proyecto y está asociado un editor visual para facilitar el ingreso de los valores de configuración para este archivo. - RPC product - este tipo de proyecto es una aplicación de Rich Client Aplication que permite crear aplicaciones con la misma interfaz visual de Eclipse para usuarios finales. Para los propósitos de esta tesis, no se requerirá el uso de este tipo de proyecto. Para el apoyo en la planificación, diseño y desarrollo de esta tesis se utilizarán algunos plugins de Eclipse que no vienen integrados directamente con la distribución y de los que se presentará una descripción detallada a continuación: - eUML2 para Java – Diagramas UML – (http://www.soyatec.com/update) - es un modelador de diagramas UML completamente integrado con el ambiente Eclipse y que permite la sincronización de código / modelo en tiempo real, además la creación de modelos de clases desde código automáticamente y la exportación de modelos a imágenes. Existen 2 versiones una gratuita y una comercial. Esta herramienta será utilizada principalmente en el diseño y modelamiento UML de CodEv. - Mylyn – Manejo de tareas – (http://www.eclipse.org/mylyn/) - es un grupo de extensiones a la interfaz de usuario de Eclipse enfocadas al manejo de tareas y que ayuda a monitorear y manejar el contexto de las tareas por medio de información relevante. Tiene capacidad de edición fuera de línea para repositorios de tareas como Jira, Bugzilla, Mantis o Trac. En este caso se utilizará Mantis (Issue tracker http://www.mantisbt.org/) para el trabajo en equipo. Mylyn facilita: el trabajo en multitarea al permitir manejar el contexto de la tarea ocultando información irrelevante, la planificación al poder registrar las fechas de ejecución, inicio y fin de las tareas, además de poder sincronizarlas con un repositorio de tareas, además de compartir el conocimiento ya que permite compartir la tarea y su contexto de edición y archivos. 18 - Subversive – Integración con Subversion (SVN) - (http://www.polarion.org/index.php?page=overview&project=subversive) es un plug-in que ayuda a la integración de Eclipse con repositorios de versiones Subversion (SVN http://subversion.tigris.org/). SVN es un sistema para el control de versiones que es de código abierto y que apunta a ser un reemplazo del muy conocido Concurrent Versioning System (CVS) al mejorarlo en varios aspectos. 2.6. Trabajos relacionados Se encontraron muchos sitios con información sobre productos para generación de código, pero un sitio que destaca fue Code Generation Network (http://www.codegeneration.net/). En este sitio se puede encontrar un listado bastante completo sobre las herramientas existentes para generación de código, comerciales y de código abierto, creados en y para generación de varios lenguajes de programación. Entre las herramientas listadas en el sitio, se encontró herramientas con una variedad de características que los hacen mejores para ciertas tareas específicas o en cierto dominio concreto de generación. Dado el gran número de herramientas listadas en este sitio, se decidió filtrar a los sistemas a ser analizados por un criterio simple, se analizaron los generadores para Java, específicamente, y de esta clasificación se eliminaron los generadores que no eran de código abierto por limitar la capacidad de extensión que se le puede dar a los productos que se quiere generar. La clasificación de los generadores de código abierto que se encontraron y se evaluaron se divide en: - Generadores orientados a una función específica como la generación de persistencia y que no generan una aplicación funcional completa. - Generadores que tienen su lógica de generación mezclada o integrada con el código que no usan plantillas y por lo tanto son difíciles de extender. Muchos de estos generadores, crean capas de persistencia o negocio ad-hoc y sin muchos estándares. - Herramientas con funciones similares a la propuesta de este trabajo, pero que no cumplen con todos los requisitos para poder generar prototipos rápidos y evolutivos. - Generadores basados en MDA (detallados más adelante). - Muchas otras herramientas que ya no han sido mantenidas en el tiempo, se han transformado en comerciales o ya no existen los sitios de referencia, por lo tanto no fueron valoradas. 19 A continuación se presenta una descripción más detallada del funcionamiento de algunos de los tipos de generadores que se encontraron valiosos en esta clasificación, y que algunos de ellos han sido usados por el autor o se probaron para revisar su funcionamiento. XDoclet (http://xdoclet.sourceforge.net/xdoclet/index.html) – Es un motor de generación de código que permite realizar programación orientada a atributos para Java. Funciona por medio de plantillas y de la adición de meta-datos al código fuente por medio de etiquetas de JavaDoc. Las etiquetas de JavaDoc se deben colocar por atributo por archivo por componente, permitiendo flexibilidad y control muy granular sobre lo que se quiere generar. Fue creado especialmente para generación de código de EJB (Enterprise Java Beans) facilitando la creación de los múltiples archivos que requiere cada EJB, que pueden llegar a ser hasta 7, facilitando el mantenimiento de un solo un archivo por EJB. Aunque originalmente ese fue su propósito, XDoclet permite generar cualquier tipo de archivos basados en las plantillas que se utilice. Las limitaciones de XDoclet en relación a lo propuesto en esta tesis, es que se requiere de un tiempo de programación considerable para tener un prototipo funcional, puesto que se debe establecer el proyecto inicial con las plantillas y crear cada clase y sus etiquetas para los elementos que se quiera generar. Además, se requiere un conocimiento bastante profundo del API de XDoclet, Java, JavaDoc y de Ant que es la única manera de realizar el proceso de generación y construcción por el momento. El generador propuesto en esta tesis podría ser usado en conjunto con XDoclet para generar la definición y configuración inicial del proyecto y de ahí tomar XDoclet para generar otro tipo de archivos. Generadores basados en MDA® (Model Driven Architecture®) (http://www.omg.org/mda/) – MDA® es una manera de desarrollar aplicaciones basados en modelos independientes de la plataforma (PIM), más uno o más modelos específicos de la plataforma (PSM) para su transformación (ver Figura 3). Especialmente, se basa en el uso de UML estándar y la transformación de modelos de meta-datos en XML para intercambio independientes de la plataforma (XMI). Es decir, separa el modelamiento de la lógica del negocio y de la aplicación de la plataforma tecnológica. 20 Figura 3. Elementos y proceso típico de MDA Un ejemplo de un generador MDA es la herramienta Sculptor de la plataforma Fornax (http://fornax-platform.org/), que permite que en base a un Lenguaje de Dominio Específico (DSL) se construya modelos válidos para la generación y generar el código basado en cartuchos (plantillas) de lo que se quiere generar. Una de las características muy útiles de esta herramienta es que permite código generado sea modificado y sea regenerado. La diferencia más grande entre el generador propuesto en esta tesis y los generadores basados en MDA, es que parten de diferentes premisas para la generación de código. Es decir MDA basa su generación en modelos exportados a XML (generalmente XMI) obtenidos a partir de un modelo UML y de un DSL, y el generador propuesto en esta tesis, basa su generación en un modelo de datos almacenado en una base de datos relacional. Otra de las ventajas del generador propuesto en esta tesis es su facilidad de uso, ya que permitirá realizar la generación en poco tiempo y con bajo conocimiento de la herramienta. AppFuse (http://appfuse.org/) – fue creado originalmente para eliminar el tiempo de inicio o establecimiento de un nuevo proyecto cuando se construyen nuevas aplicaciones web. Esta aplicación genera un esqueleto de proyecto funcional pero sin relación a un modelo de datos, similar a los que se crean en un IDE de desarrollo cuando se hace a través de un asistente para crear un nuevo proyecto. También permiten la generación de otros archivos del proyecto, tipo CRUD, pero su generación es bastante especializada y se requiere un conocimiento y 21 configuración de la herramienta bastante profundos. Otro proyecto muy similar a AppFuse y que está creciendo es J2EE Spider (http://www.j2eespider.org/features/en/). Las principales diferencias del generador propuesto con este tipo de generadores es que generan solo archivos generales para la definición estándar (el esqueleto) del proyecto, en cambio el generador propuesto toma el modelo de datos y genera mantenedores CRUD Web para cada uno de las tablas en el modelo. Como se detalló anteriormente existe una gran cantidad de generadores para múltiples propósitos y con gran variedad de capacidades, y se ha encontrado que la gran diferencia con el generador que se desarrolló como parte de esta tesis está en su facilidad de uso al poder generar una aplicación funcional basada en el modelo de datos en pocos minutos, amigabilidad ya que su operación es sencilla e intuitiva e integrada totalmente con un ambiente de desarrollo robusto, además tiene la capacidad de evolucionar la aplicación generada por medio de la regeneración de código. Todas estas características anteriormente descritas justificaron, a criterio del autor, la creación del generador CodEv. 22 3. Análisis del Sistema En este capítulo se identifican los requisitos que satisfacen los objetivos planteados, el cómo se llegó a estos requisitos y posteriormente se presenta la metodología que se utilizó para la realización de CodEv, la planificación inicial y su evolución en el tiempo. 3.1. Requisitos del Sistema Los requisitos que serán presentados a continuación para el desarrollo de CodEv fueron cambiando y evolucionando en el tiempo con el conocimiento adquirido por el autor con la investigación de técnicas y tecnologías usadas para la generación de código, la creación de prototipos evolutivos de puntos críticos del generador y con cada incremento de funcionalidad en cada iteración. 3.1.1. Descripción general Como ya se ha definido, CodEv es una herramienta orientada a acelerar y facilitar la creación de aplicaciones Web Java orientadas a base de datos con una arquitectura de sistemas multicapa, por medio de la generación de código fuente para operaciones CRUD para cada una de las tablas seleccionadas del esquema de datos. Su funcionamiento se basará en un modelo de datos del cual se desea crear la aplicación Web, y el generador tomará las definiciones de las tablas, campos y sus relaciones y generará la persistencia, la capa de negocio y la presentación para cada una de sus tablas seleccionadas para que se pueda hacer el mantenimiento CRUD de cada tabla con sus respectivas relaciones. Cuando el generador se ejecute contra el modelo de datos seleccionado, lo que se obtendrá será una aplicación Web multicapa con código Java estándar lista para hacer deploy (ejecutar). La herramienta debe permitir al usuario varios parámetros de configuración para la generación con un proceso sencillo y amigable, que además esté fuertemente integrado con un ambiente de desarrollo robusto y poderoso y que permita la evolución de la aplicación generada por medio de la regeneración de código siguiendo un proceso no destructivo. Estos son los requisitos de manera general que deberá cumplir la aplicación y aunque parecen ser simples y claros, la mayoría del trabajo es altamente técnico y se encuentra en las decisiones arquitectónicas y en los atributos de calidad. 23 3.1.2. Requisitos funcionales Los parámetros de configuración para la generación son capturados en forma organizada (asistente - Wizard) y son los siguientes: - Datos generales del proyecto de generación: nombre del proyecto, paquete java para marcar el namespace en el que se organizará el código fuente de la aplicación. - Datos de la conexión a la BD: nombre o IP del servidor, puerto de conexión, usuario, password y esquema de datos. - Selección de tablas a ser generadas en base al esquema de datos seleccionado. - Selección de tabla de manejo de usuarios y de campos de usuario y password dentro de esta tabla y que serán usados para tener una autenticación básica de usuarios a la aplicación generada. - Selección de campos a generar, esta será una selección por tabla. Además, se podrá especificar el campo de búsqueda que será usado por las tablas hijo relacionadas a la tabla que se está configurando. - Pre-visualización de la plantilla de presentación de aplicación generada. - Al ejecutar la generación se presentarán una serie de mensajes de avance del proceso de generación. Figura 4. Casos de uso para la generación Después de observaciones realizadas y de la creación de los primeros prototipos se encontró que para que las aplicaciones generadas sean realmente útiles, deberían tener ciertas funcionalidades ya generadas, como son: 24 - Autenticación de usuarios por medio de usuario y password que deberán ser validados contra una tabla en el esquema de base de datos. - Menú de navegación para acceso a la administración CRUD de cada tabla. Para la administración CRUD de cada tabla: - Presentación descriptiva de relaciones padre - cuando exista una clave foránea perteneciente a una tabla padre, se deberá presentar el campo de búsqueda o descripción de la tabla padre a cambio del identificador. Esto permitirá que sea mucho más descriptiva y clara la información que se presenta como parte de cada registro. - Filtrado de resultados - en los listados existirá filtrado de resultados por todos los campos, excepto por la clave primaria. En el caso de la búsqueda de relaciones padre, se deberá tener la capacidad de búsqueda y selección fácil del resultado. - Paginación de resultados - los resultados de los listados podrán ser paginados, con una administración de la paginación que permita definir el número de resultados por página y la página a la que se desea ir. 3.1.3. Atributos de Calidad Entre los atributos de calidad más importantes que se ha definido que deberá tener el generador y su ambiente de ejecución, son los siguientes: - Usabilidad, que permita la instalación del generador y del ambiente de manera sencilla y que además el proceso de generación sea rápido y sencillo (tiempo de generación menor a 5 minutos) para alguien con experiencia media en el ambiente de desarrollo. - Portable, es decir que pueda ser ejecutado en múltiples sistemas operativos. - Mantenibilidad, que se puedan realizar modificaciones y aumentos de funcionalidad al generador con mínimo esfuerzo. - Extensibilidad, que se pueda agregar al proceso de generación de manera sencilla nuevas bases de datos desde donde se obtiene el modelo de datos. Como atributos no funcionales, se tomó en cuenta los puntos críticos o áreas de riesgo para el desarrollo como son: - Integración del generador con un ambiente de desarrollo robusto, que permita al usuario del generador poder editar los archivos generados con ayudas visuales y probar la aplicación generada con pasos simples y en poco tiempo. - Creación de una abstracción del modelo de datos y sus relaciones. Esta abstracción debe ser simple, pero a la vez lo suficientemente completa y robusta para que se pueda 25 generar una serie de elementos de código en base a este modelo de datos y sus relaciones. - Generación de código en base a plantillas de archivos a ser generados, para hacer que el resultado de la generación pueda ser mantenible y editable de manera más sencilla. - Regeneración de código de la aplicación, permitirá que siguiendo un proceso no destructivo, se pueda actualizar la aplicación generada con los cambios hechos al esquema de base de datos. - Proceso de generación y regeneración configurable en base a parámetros. 3.2. 3.2.1. Plan del Proyecto Metodología Para la realización del proyecto se utilizó una metodología iterativa-incremental en la cual se realizaron 4 iteraciones y en cada una de ellas se agregó al sistema parte de la funcionalidad requerida y se realizaron mejoras. El desarrollo Iterativo dice que se deben hacer repeticiones que pasan por todas las actividades del desarrollo como son: análisis, arquitectura, diseño, implementación, pruebas e instalación, etc. Se dice que un proceso es iterativo incremental cuando en cada iteración se añade algo nuevo de valor que nos acerca cada vez más al objetivo final del desarrollo [BS06]. Figura 5. Representación en el tiempo del desarrollo Iterativo En la Figura 5 se puede ver una representación en el tiempo de lo que es desarrollo iterativo incremental y el esfuerzo empleado en cada una de las actividades del desarrollo conforme avanza el proyecto. 26 Para el desarrollo de CodEv además del uso de incrementos se usó prototipos evolutivos, lo que permitió que la definición de los requisitos y necesidades de la herramienta fueran madurando y evolucionando, durante el tiempo de desarrollo, hasta convertirse en el producto funcional y deseado. También, se tomó en cuenta los puntos críticos o áreas de riesgo para el desarrollo, para valorar los elementos que requerían ser parte de un prototipo o serían implementados en las primeras iteraciones; de esta manera se logró reducir el riesgo de la construcción de la herramienta en las etapas más tempranas del desarrollo. Todos estos elementos serán descritos en mayor detalle en los capítulos de requerimientos, diseño y construcción. 3.2.2. Planificación Las actividades y plazos definidos originalmente para alcanzar los objetivos planteados para la creación del proyecto fueron las siguientes: 1. Investigar sistemas similares existentes en el mercado (3 semanas) 2. Especificar los requisitos de la solución (3 semanas) 3. Diseño de la solución que permita alcanzar el objetivo (1 mes) 4. Iteración 1: Pantallas del sistema, conexión a BD (3 semanas) 5. Pruebas Iteración 1 (1 semana) 6. Iteración 2: Capacidad de generación de: Capa de Persistencia, Negocio y Presentación – MVC (2 meses) 7. Pruebas Iteración 2 (2 semanas) 8. Iteración 3: Capacidad de generación de: scripts de ANT y archivos de proyecto de eclipse (1 mes) 9. Pruebas Iteración 3 (2 semanas) 10. Pruebas finales y generación del caso de estudio (3 semanas) 27 El cronograma de actividades asociado a este plan de trabajo es el siguiente: Tarea 1 Mes 1 Mes 2 Mes 3 Mes 4 Mes 5 Mes 6 Mes 7 Mes 8 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 2 3 4 5 6 7 8 9 10 Figura 6. Cronograma de actividades para la creación del sistema Aunque el proyecto se terminó en el tiempo estimado, la planificación se alteró en gran medida en base a las necesidades y avance del proyecto. Muchas de las actividades fueron variando conforme el proyecto avanzó y se encontraron prioridades más altas de ciertos componentes y dependencias entre componentes y tareas, además del cambio de algunos requerimientos y nuevos requerimientos, que sirvieron para alcanzar los objetivos planteados para el proyecto. El proyecto final usó 4 iteraciones y cambió las actividades que se realizaron en cada iteración. Este fue el plan de ejecución del producto final: 1. Investigar sistemas similares existentes en el mercado (3 semanas) 2. Especificar los requisitos de la solución (3 semanas) 3. Diseño de la solución que permita alcanzar el objetivo (1 mes) 4. Iteración 1: Prototipos 1 y 2 de validación de conceptos de generación y capacidad de generación de la aplicación completa en base a plantillas (1 mes) 5. Iteración 2: Pruebas de generación de varios proyectos de prueba y evolución de la generación en base al uso en un proyecto real aplicado, mejoras sustanciales al proceso de generación (1 mes) 28 6. Iteración 3: Capacidades de regeneración (1 mes y 2 semanas) 7. Iteración 4: Integración de la herramienta con ambiente de desarrollo (1 mes y 2 semanas) Pruebas finales y generación del caso de estudio (1 semana) 29 4. Arquitectura y Diseño del Sistema En el capítulo de arquitectura y diseño se presenta una descripción general que servirá de introducción a las decisiones que se tomaron como parte de la arquitectura y el diseño. Posteriormente se describirán 3 de los niveles importantes de la arquitectura que son: el ambiente de ejecución del generador, la arquitectura del generador en sí y, por último, la arquitectura que tendrán las soluciones a ser generadas. También, se presentará el diseño detallado de los componentes más importantes que componen el generador y las soluciones generadas. 4.1. Descripción general Para el desarrollo de CodEv, además del uso de incrementos, se usó prototipos evolutivos lo que permitió que la definición de los requisitos, el diseño y la arquitectura de la herramienta fueran madurando y evolucionando, durante el tiempo de desarrollo, hasta convertirse en el producto funcional deseado. También, se tomaron en cuenta los puntos críticos o áreas de riesgo para el desarrollo, para valorar los elementos que requerían ser parte de un prototipo o serían implementados en las primeras iteraciones; de esta manera se logró reducir el riesgo de la construcción de la herramienta en las etapas más tempranas del desarrollo. Una de las decisiones más importantes para poder satisfacer los atributos de calidad y los requisitos no funcionales planteados para CodEv, es la del ambiente de ejecución que debe ser una plataforma completa que permita ser extensible, flexible y que se pueda ejecutar en múltiples plataformas (sistemas operativos). Se seleccionó la plataforma Eclipse (como se describió en la sección 2.4) por cumplir con todas estas características. 4.2. Arquitectura del generador CodEv El contexto en el cual funciona el sistema generador se basa en tomar los meta-datos del esquema de BD que se quiere generar directamente desde el repositorio de datos. El generador toma las definiciones de las tablas, campos, tipos de datos, sus relaciones, claves primarias y foráneas, etc [Par07]. Con esto construye una representación en memoria de estas definiciones y genera los elementos necesarios en base a las plantillas para que se pueda hacer el mantenimiento CRUD de cada tabla con sus respectivas relaciones. Se crearán elementos generales de la aplicación y elementos específicos por tabla. 30 A continuación se presenta, en la Figura 7, un esquema de frontera del funcionamiento de CodEv en donde se puede apreciar el funcionamiento básico del generador. Toma los metadatos del esquema de datos que se desea generar desde el motor de base de datos y en base a plantillas crea archivos físicos, que en conjunto componen el sistema generado. Meta-Data de la BD seleccionada DB Sistema Generador de Aplicaciones Web Multicapa. Plantillas Archivos Generados Figura 7. Funcionamiento propuesto para el sistema CodEv fue creado con una arquitectura y diseñado como plug-in de Eclipse para poder obtener todas las ventajas de la plataforma Eclipse como son fácil instalación, configuración y ejecución. Las aplicaciones que son generadas también están integradas dentro de Eclipse como proyectos Web Java, lo cual hace que las aplicaciones generadas también puedan tener todas las ventajas de la plataforma y sea transparente el proceso de generación y edición para el usuario. Los factores que más influyeron en la decisión para el uso de la plataforma Eclipse como ambiente de ejecución, en el que se integra CodEv, fueron la robustez y extensibilidad de la plataforma, que se pueda ejecutar en múltiples plataformas (Portabilidad), la necesidad de facilidad de uso para la instalación, generación y edición (Usabilidad) y la necesidad de que sea fácilmente extensible. En la Figura 8 se ve en un esquema de alto nivel como se integran CodEv y las aplicaciones generadas dentro del contexto de la plataforma Eclipse. El desarrollador instala, ejecuta y 31 configura Codev dentro de Eclipse para acceder a la información de metadatos del esquema del que se desea generar la aplicación Web Java. La aplicación generada también funciona dentro de la plataforma Eclipse y es modificada y ejecutada por el desarrollador para manejar los datos del esquema de datos seleccionado en la generación. Configura Modifica / Ejecuta Sistema Generador de Aplicaciones Web Multicapa - CodEv Genera Metadatos DB Maneja Datos Aplicación Web Java generada Figura 8. Integración de CodEv y las aplicaciones generadas con Eclipse CodEv está compuesto por 3 grandes componentes que son: - Manejador de Presentación: es el componente que se encarga de la integración con la plataforma Eclipse; es decir contiene la implementación de los elementos visuales específicos de la plataforma para que el desarrollador pueda interactuar y realizar la generación de manera sencilla. Se encarga de la captura de información, de las notificaciones al desarrollador y de las actualizaciones necesarias a la plataforma Eclipse. El tener un solo componente como punto de integración con la plataforma Eclipse hace más fácil la extensión y cambio de CodEv. - Manejador de BD: es el componente que se encarga de proveer el manejo de la conexión al motor de base de datos y la creación del modelo de abstracción o representación de metadatos (tablas, campos, tipos de datos, relaciones, claves primarias y foráneas, etc) que será usado por CodEv para que el desarrollador configure cuáles de estos elementos desea generar y para la generación en sí. Por medio de este componente se logra desacoplar el generador del lugar que se obtiene la representación de los metadatos, pudiendo tener varias fuentes de datos e implementaciones de acceso a datos. - Manejador de Generación: es el componente que se encarga de la generación de los archivos físicos en base a plantillas. En este componente se encuentra la 32 implementación de la creación de todos los archivos necesarios para tener una aplicación Web Java multicapa en base a la representación de metadatos y parámetros de configuración. Este componente tiene lógica para controlar la generación y regeneración de la aplicación, creación o sobre-escritura de archivos y directorios seleccionados. Figura 9. Arquitectura de CodEv En la Figura 9 se pueden apreciar los 3 grandes componentes de CodEv y su relación con la plataforma Eclipse al ser un plugin y también la relación de la aplicación generada y sus capas como componentes de presentación, de negocio y de persistencia. 4.3. Diseño detallado de componentes importantes de CodEv Al igual que con los requerimientos, el diseño detallado de CodEv fue evolucionando con la construcción de los diferentes prototipos evolutivos que ayudaron a validar algunos de los puntos de riesgo que se encontraron para la construcción del generador. A continuación se presenta el diseño detallado de CodEv, presentando el modelo de objetos que se usa para la 33 representación del modelo de datos en memoria, además de los modelos de clases de los 3 grandes componentes de CodEv. 4.3.1. Representación del modelo de datos Uno de los puntos de riesgo importantes era el poder crear una abstracción o representación del modelo de metadatos (tablas, campos, tipos de datos, relaciones, etc) [Par07] que sea lo suficientemente completo para tener una funcionalidad rica en relaciones y características, pero que sea lo suficientemente simple y liviana para que pueda ejecutarse rápidamente la generación, sin el uso de muchos recursos computacionales. Para solucionar esto se crearon clases que representan el modelo de datos en memoria que se pueden apreciar en la Figura 10. En estas clases se cargan las tablas, sus campos y sus relaciones. Estas clases están relacionadas para que se pueda navegar desde una tabla (TableInfo) hacia sus campos (FieldInfo) y hacia sus relaciones padre e hijo (FKInfo). Figura 10. Modelo de clases que representan el modelo de datos a generar El Manejador de base de datos (DB) está encargado del proceso de carga de esta representación en objetos de los metadatos del esquema. Esta representación es pasada al Manejador de presentación para desplegarla al usuario y permitir seleccionar las tablas y 34 campos que desea generar. Finalmente, esta representación modificada es pasada al Manejador de Generación para que genere la aplicación Web Java con los mantenedores CRUD para cada una de las tablas y campos seleccionados. Cada tabla a ser generada es cargada en un objeto de tipo TableInfo y tiene algunos atributos, entre los que se destacan: el nombre de la tabla, de la clase, listado de sus campos, el campo que es la clave primaria, listado de las claves foráneas y el campo de búsqueda de la tabla. También, tendrá un atributo con el nombre de la clase transformado a notación de camello (Camel notation), que es la notación normalmente usada en Java donde el nombre de la clase se escribe seguido, sin espacios, ni guiones, en minúsculas excepto las primeras letras de cada palabra que van en mayúsculas. El campo de búsqueda es el campo que será desplegado en vez de la clave foránea de la tabla padre en los listados de tablas hijo. Es decir en una relación de 1-N donde se está mostrando un registro del lado N (hijo) en vez de mostrar la clave foránea del lado 1 (padre), se mostrará el campo de búsqueda obtenido desde el registro de la tabla padre. Cada campo a ser generado es cargado en un objeto de tipo FieldInfo que contendrá principalmente el nombre del campo y el tipo de dato del campo. También tendrá un atributo que es el nombre del campo transformado a notación de camello. El nombre del campo se escribe bajo las mismas reglas explicadas para los nombre de clases excepto la primera letra de todo el nombre que también deberá estar en minúsculas. Cada relación padre en una relación 1-N será cargada en un objeto de tipo FKInfo, el que tendrá una referencia al objeto que contiene la definición de la tabla padre (TableInfo), una referencia al campo que representa la clave primaria de la tabla padre (FieldInfo) y una referencia al campo que representa la clave foránea de la tabla hijo (FieldInfo). Aquí no se cargan relaciones padre de las cuales la tabla padre o el campo de clave foránea no estén seleccionados para generación. El objeto CodevProject es donde se carga los valores de los datos de configuración ingresados por el usuario para la generación y que son capturados por medio de la interfaz gráfica. Posteriormente en este objeto también se cargarán los valores de configuración almacenados en el archivo .codev para la regeneración. 35 4.3.2. Manejador de Presentación Como ya se ha dicho, el punto crítico de la integración con un ambiente robusto fue solucionado por medio de la integración con la plataforma Eclipse, y tanto CodEv como las aplicaciones generadas, se ejecutan dentro del mismo ambiente de la plataforma Eclipse. Por la parte de CodEv, se tiene un asistente para la creación de un nuevo proyecto y un editor para el archivo de proyecto CodEv para la regeneración del proyecto, los cuales están integrados con el Workbench IDE UI por medio de los puntos de extensión. Los puntos de extensión en la plataforma Eclipse están definidos por clases que son extendidas y donde se implementa la funcionalidad visual y otras que se desea dar a la extensión. La mayor cantidad de funcionalidad del componente de presentación está construida en base a la clase GeneradorView que es usada por los puntos de extensión específicos para Eclipse. GeneradorView extiende el elemento visual org.eclipse.swt.Composite, que es un elemento de posicionamiento (layout) para contener otros elementos visuales y de esta manera es fácil de componer con los otros elementos visuales de los puntos de extensión. Además, GeneradorView implementa la interfaz INotifiable que es usada por el Manejador de BD y de Generación para realizar paso de mensajes a la presentación y para notificar del avance de tareas. De esta manera se logra desacoplar de la implementación específica de Eclipse hacia los componentes no visuales. GeneradorView es el que se encarga de obtener la representación del modelo de metadatos desde el manejador de BD y presentar al usuario las opciones de configuración que se indicaron en los requisitos funcionales, capturar estas opciones y pasarlas al manejador de generación junto con la representación del modelo de datos para la generación. 36 Figura 11. Modelo de clases de la implementación de los puntos de integración del Wizard de CodEv para generación de aplicaciones En la Figura 11 se puede observar el modelo de clases que representa las implementaciones específicas de CodEv para los puntos de integración del Wizard para generación de aplicaciones. La clase CodevWizard, que es una implementación de un Wizard de Eclipse, tiene una o más páginas que en el caso de CodEv está implementado por medio de CodevNewWizardPage y está compuesta en su parte visual por GeneradorView. En la Figura 12 se puede observar el modelo de clases que representa las implementaciones específicas de CodEv para los puntos de integración del Editor para regeneración de aplicaciones. La clase CodevPageEditorContributor, que es una implementación de un MultiPageEditor de Eclipse, tiene una o más páginas que en el caso de CodEv está implementado por medio de CodevPageEditor y está compuesta en su parte visual por GeneradorView. 37 Figura 12. Modelo de clases de la implementación de los puntos de integración del Editor de CodEv para regeneración de aplicaciones 4.3.3. Manejador de BD El Manejador de BD es el componente que se encarga de proveer todo el manejo de conexión y recuperación de información desde el motor de base de datos. Sus dos métodos públicos disponibles son la recuperación de los esquemas disponibles en el motor de base de datos por medio del método getSchemaNames y el obtener la representación del modelo de metadatos (tablas, campos, tipos de datos, relaciones, claves primarias y foráneas, etc) por medio del método getDBStructure. Internamente se encarga de la conexión al motor de base de datos, de ejecutar selects para una sola columna o múltiples columnas en diferentes esquemas como el esquema de metadatos. Por medio de este componente se logra aislar en un solo lugar la lógica de manejo de datos y el como se obtiene la representación de los metadatos, pudiendo tener varias fuentes de datos e implementaciones de acceso a datos. 38 Figura 13. Modelo de clases del componente manejador DB En la Figura 13 se puede observar el modelo de clases del manejador DB que se basa en una interfaz IDBConnector que establece el contrato para nuevas implementaciones. La clase abstracta DBConnector implementa la interfaz IDBConnector y sólo tiene un método de conveniencia que ayuda a buscar el objeto del campo (FieldInfo) de un objeto tabla (TableInfo). Una implementación concreta de IDBConnector, y que extiende DBConnector, es MysqlConnector que se encarga de todos los manejos de conexión y datos explicados para un motor de base de datos Mysql. Como se ha podido observar la función más importante del manejador de DB es el cargar la representación de metadatos como objetos y el método encargado de esta función es getDBStructure al que se le pasa los datos para conexión al motor de base de datos como son: nombre y puerto del servidor, usuario y password para la conexión, esquema de la base de datos del que se quiere obtener la representación. Este método retorna una colección de objetos TableInfo representados por List<TableInfo>. Esta colección contiene un listado de todas las tablas del esquema con sus campos y relaciones. El proceso de carga de la representación de metadatos, puede llegar a ser un proceso largo, dependiendo de la cantidad de tablas, campos y relaciones que existan en el esquema de datos, por lo que el Manejador de DB notifica de su avance a quien lo ha invocado por medio de la referencia a un objeto de tipo INotifiable que es pasado a él en la invocación del método getDBStructure. 39 4.3.4. Manejador de Generación En este componente se encuentra la implementación de la creación de todos los archivos necesarios para tener aplicaciones Web Java multicapa en base a la representación de metadatos y parámetros de configuración; la generación de los archivos físicos se la realiza en base a plantillas. Este componente tiene lógica para controlar la generación y regeneración de la aplicación, creación o sobre-escritura de archivos y directorios seleccionados. El riesgo de la generación en base a plantillas fue reducido con el uso de un framework de plantillas llamado Velocity, que es un framework de código abierto creado por el Apache Software Foundation (http://velocity.apache.org/). Velocity es un motor de plantillas hecho en Java que permite el uso de un lenguaje de plantillas, simple pero poderoso, para referenciar objetos Java en las plantillas. Velocity puede ser usado para generar en base a plantillas cualquier tipo de archivos de texto o planos. Figura 14. Modelo de clases del componente manejador de Generación En la Figura 14 se puede observar el modelo de clases del manejador de generación que aísla la implementación del proceso de generación por medio de la clase Generator en el método generate al que se le pasa los datos de configuración ingresados por el usuario (CodevProject) y la colección de tablas (List<TableInfo>). La clase Generator recorre el grupo de archivos plantilla a ser generados, carga los parámetros para Velocity e invoca los métodos necesarios para realizar la generación o reemplazo de variables en los archivos. El proceso de generación de los archivos físicos de la aplicación Web Java es generalmente un proceso largo, dependiendo de la cantidad de tablas, campos y relaciones que existan en 40 representación de metadatos, por lo que el manejador de Generación notifica de su avance a quien lo ha invocado por medio de la referencia a un objeto de tipo INotifiable que es pasado a él en la invocación del método generate. Una vez finalizada la generación de la aplicación Web Java el manejador de generación almacena la representación de metadatos y la configuración de la generación en un archivo con formato XML con extensión .codev. El propósito de este archivo es poder recuperar los datos de configuración ingresados por el usuario y que se usaron para la generación inicial y presentárselos al usuario para poder regenerar la aplicación y evolucionarla. 4.4. Arquitectura de las Soluciones generadas Client * Código genérico multi-browser Presentation Layer * MVC con Struts2 + JSP’s + Javascript (AJAX) Business Layer * Manejadores > reglas de negocio Persistence Layer * Persistores + Hibernate Any convencional DB * Mysql, Oracle y PostgreSQL Figura 15. Componentes y conexiones de la capa de presentación basada en Struts Lo que será presentado a continuación es una visión de las tecnologías utilizadas en cada una de las capas que se genera para las aplicaciones Web Java. Especificaremos cada una de las capas con una explicación detallada de la arquitectura de referencia final de las tecnologías involucradas en cada una de ellas. Para mantener la independencia de las diferentes capas se utilizan varios patrones de diseño muy conocidos que serán explicados a continuación y que son: Data Transfer Object (DTO), MVC (Model-View-Controller), Facade (Manager) y Data Access Object (DAO) [GHJV98]. 41 4.4.1. Data Transfer Objects (DTO) En el caso de la aplicación generada, los DTOs representan al dominio de la aplicación o a las tablas que existen en el modelo de datos. Existirá un DTO con atributos por cada una de las tablas y campos seleccionados para ser generados como parte de la aplicación Web Java. Data Transfer Object (DTO) es un patrón de diseño usado para transferir datos (información) a través de subsistemas o capas de una aplicación para de esta manera mantener el bajo acoplamiento entre los subsistemas y/o las capas. Los DTOs son livianos puesto que no contienen ningún comportamiento (funcionalidad) excepto el encapsulamiento (set y get) de sus propios datos. Son Plain Old Java Objects (POJOs), que como se dijo no tienen dependencias en otras clases o datos, excepto en otros DTOs u objetos básicos de java. Generalmente los DTOs representan a los objetos del dominio de la aplicación ya que estos son los datos que la aplicación requiere que se muevan entre capas para su presentación, operación sobre ellos y recuperación o almacenamiento. También pueden ser objetos que no son parte del dominio pero que requieren transportar información entre capas y que por lo tanto han sido compuestos por conveniencia para ese propósito. Los DTOs representan al mismo patrón de diseño que los Value Objects (VA) o Transfer Objects (TO) que tienen la responsabilidad del transporte información. 4.4.2. Capa de Presentación Esta capa será implementada por medio de JSP’s y Struts2 que es un framework que incentiva el uso del clásico patrón de diseño Model-View-Controler (MVC) que es una buena manera de manejar la capa de presentación para aplicaciones Web Java [Rou07]. La arquitectura de la capa de presentación de la aplicación basada en MVC se puede ver en la Figura 16. Struts2 implementa su propio componente controlador y se integra con otras tecnologías para proveer el modelo y la vista, de esta manera facilita la separación entre elementos de presentación (vista): páginas JSP (o cualquier otro elemento de presentación que se desee), elementos de lógica de flujo y navegación (controlador): filtro de control y archivo XML de configuración y la lógica de acceso al negocio y datos (modelo). Struts es un proyecto del grupo Apache y es open source. (http://struts.apache.org/) 42 Client 1 - Request Struts Filter 4 – Forward to view and display data 5 - Response 2 - Load Struts XML Configuration File 3 – Execute model and load data JSP Java Bean Business layer Figura 16. Componentes y conexiones de la capa de presentación basada en Struts2 4.4.3. Capa de Negocio La capa de negocio es implementada por medio de Managers que siguen las reglas del patrón de diseño Facade que provee una interfaz unificada a un grupo de funcionalidades de un subsistema. El Facade define una interfaz de acceso de alto nivel que hace que el subsistema sea más fácil de usar. En nuestro caso los Managers generados son Facades que formarán la capa de negocio y darán acceso a la capa de presentación a los servicios o funcionalidad requerida. Estos Managers son los que acceden a los DAO para la administración por tabla. Se pueden crear muchos otros Managers que agrupen lógica de negocio y que hagan uso de de otros managers y DAOs. Figura 17. Componentes y conexiones de la capa de negocio en un sistema multicapas En la Figura 17 se puede apreciar los beneficios de usar el patrón de diseño facade para desacoplar subsistemas o componentes centralizando las invocaciones en un solo componente y haciendo más sencillo el mantenimiento y evolución de la aplicación. 43 Es a este nivel en donde se deben realizar los cambios necesarios para implementar las reglas de negocio para cálculos, operaciones, validaciones u otros. En esta capa también se podrá realizar la conexión con otras aplicaciones que se requieran. Web Front End WS Exposed Fat Clients Business Layer Persistence Legacy Systems WS consumed Figura 18. Componentes y conexiones de la capa de negocio en un sistema multicapas Por ejemplo, si se requiere la conexión con una aplicación legada, se puede crear un Manejador para esa lógica y se lo colocaría en esta capa. Otro ejemplo sería, si se quiere presentar algunos servicios de la aplicación como servicios Web se debe cambiar la capa de presentación por (o aumentar) una capa de Servicios Web sin tener que cambiar la capa de negocio o persistencia. Esta capa se ha implementado por medio de clases regulares de Java ver Figura 18. 4.4.4. Capa de Persistencia Esta capa es implementada por medio de clases que siguen las reglas del patrón de diseño DAO (Data Access Objects). Los objetos que implementan el patrón DAO hacen transparente, para los objetos que los usan, el cómo son almacenados los datos y cómo se realizan los accesos a estos datos. Maneja u obtiene la conexión a la fuente de datos para obtener y almacenar datos. Aquí se implementan las operaciones CRUD (Create, Read, Update and Delete). En nuestro caso los DAO´s ocultarán el uso de Hibernate para el acceso a la información almacenada en la base de datos. Hibernate es un framework para persistencia relacional para Java y .Net que es un poderoso servicio de consulta y persistencia objeto-relacional de alta capacidad, y es el que se encarga de realizar las operaciones requeridas para mapear los objetos de la aplicación para reflejar el modelo de base de datos [BK06] - ver Figura 19. 44 Business Layer Hibernate Persistor Table 2 Persistor Table N DB Table 1 Persistent Object Table 2 XML Mappings Persistor Table 1 Persistent Object Table 1 Persistent Object Table N Table 2 : : : Table N Figura 19. Componentes y conexiones de la capa de persistencia basada en Hibernate Hibernate realiza el “mapeo objeto-relacional” (ORM) que se refiere a la técnica de mapear una representación de datos desde un modelo de objetos a un modelo relacional de datos con un esquema basado en SQL. Hibernate es un proyecto open source de JBoss, que es una división de RedHat. (http://www.hibernate.org) En la Figura 20 se puede ver una vista de alto nivel de la arquitectura de Hibernate. El diagrama muestra como Hibernate usa la DB y los datos de configuración para proveer servicios de persistencia (y objetos persistentes) a la aplicación. Además del código de la aplicación se generarán archivos de ayuda para el proyecto. Se generarán todos los archivos necesarios para que el proyecto pueda ser editado como una aplicación Java Web dentro de Eclipse y también scripts de Ant para que se pueda compilar y empaquetar el proyecto automáticamente, así como poder hacer deploy directamente en Tomcat o en cualquier contenedor de Servlets. 45 Figura 20. Vista de alto nivel de la arquitectura de Hibernate Ant es una herramienta de build automático hecha en Java y que sus scripts se escriben en XML, muy similar a “make”, “jam” u otros. Su función es el automatizar la ejecución de tareas como son las de: creación de directorios, reemplazo de variables, compilación, empaquetamiento, distribución, etc. Ant es parte del grupo Apache y es open source. (http://ant.apache.org/) 4.5. Diseño detallado de las soluciones generadas Las soluciones generadas tienen una serie de servicios y consultas genéricas que están disponibles para ser usadas por el programador en la capa de negocio. Para esto se ha creado un API de consulta de objetos donde se puede recuperar listados de objetos en base a un filtro específico, y si se desea, con ordenamiento y paginación. Todos estos servicios creados facilitan el trabajo del programador. El API de consultas de objetos fue creado para permitir los filtros por múltiples campos que maneja la aplicación y también para permitir realizar consultas con condiciones y ordenamiento, manteniendo la independencia de la capa de negocio y de la implementación de estos filtros, condiciones y ordenamientos de la capa de persistencia. Ya en la parte de implementación, aunque Hibernate tiene su propio lenguaje de consultas, el API creado para el generador nos independiza de esta implementación específica y abre las puertas a nuevas implementaciones. Además le permite al programador concentrarse en los cambios de la capa de negocio y no en 46 tener que realizar cambios en la capa de persistencia, sólo si se requirieran servicios o consultas demasiado específicas o avanzadas. Figura 21. Diagrama de clases para el soporte de servicio de filtros en consultas en la capa de negocio La Figura 21 muestra el diagrama de clases que es usado para la implementación de filtros y condiciones en consultas en la capa de negocio. Cada instancia de la clase Filtro contendrá un filtro, con su condición, para la consulta a realizar. Esta clase tiene como atributos el campo que se desea filtrar, los valores inicial y/o final (si aplican), también el tipo de filtro (TipoFiltro) que nos indica qué tipo de condición se aplicará para este filtro. Filtro es suficiente para contener la mayoría de condiciones básicas de consulta, pero para filtros más avanzados se ha implementado una serie de clases que extienden de Filtro y que tienen otros atributos necesarios para implementar sus consultas. 47 Figura 22. Diagrama de clases para el soporte de ordenamiento en consultas en la capa de negocio La Figura 22 muestra el diagrama de clases para el soporte de ordenamiento de consultas en la capa de negocio. Cada instancia de la clase Orden contendrá una opción de ordenamiento, una dirección del ordenamiento (TipoOrden). Como se comentó, las consultas (filtros, condiciones y ordenamientos) son codificadas por el desarrollador en la capa de negocio para acceder a listados de datos específicos que se desea obtener y por lo tanto serán pasadas a la capa de persistencia para ser ejecutadas y que retorne el listado de datos. La capa de persistencia ya tiene creados los servicios para obtener listados de datos filtrados y ordenados que pueden estar paginados o no. Por ejemplo, en la Figura 23 se muestra un DAO implementado, AlumnoDAO, que cuenta con métodos básicos que implementan las operaciones CRUD para el manejo datos de la tabla ALUMNO. Y además cuenta con varios métodos para obtener listados de datos desde la tabla ALUMNO por medio de consultas que cumplen con todas la combinaciones que van desde un solo Filtro sin ordenamiento ni paginación, hasta múltiples filtros con múltiples ordenamientos y paginación. Esto hace que se facilite la obtención de listados de datos desde la capa de persistencia. 48 Figura 23. Diagrama de clases de un DAO de ejemplo con sus métodos y relaciones 49 5. Construcción del Sistema Esta sección describe las herramientas que se utilizaron para construir CodEv, los prototipos evolutivos realizados y por último especifica la metodología de desarrollo aplicada detallando las iteraciones realizadas. 5.1. Ambiente de desarrollo A continuación se detalla los elementos de los dos ambientes de desarrollo utilizados para crear CodEv; esto porque en los tres prototipos evolutivos creados para llegar a la aplicación final se utilizó dos diferentes lenguajes, ambientes de desarrollo y configuraciones. El primer ambiente es VS Express Edition C# para crear la primera versión de CodEv programado en lenguaje C# (como se describió en la sección 2.5.1) y el segundo es el Eclipse RCP/IDE Plug-in Development Enviroment (PDE) para crear la versión final del sistema programado en lenguaje Java, que en general es el ambiente más completo e importante (como se describió en la sección 2.5.2). El enfoque principal de los prototipos fue el reducir los riesgos de la generación de la aplicación, sin poner mayor énfasis en los atributos de calidad. Dadas las facilidades que brinda Visual Studio para la creación de aplicaciones de escritorio en Windows (Windows Forms), con un ambiente visual, rápido, de fácil instalación y configuración para el desarrollo de este tipo de aplicaciones, se decidió usar esta plataforma para la creación de los primeros prototipos evolutivos de CodEv. El énfasis principal en esta primera etapa no era el tener un ambiente robusto e integrado, sino el poder crear los prototipos evolutivos de manera rápida y así poder demostrar las teorías de diseño de la aplicación y reducir los riesgos. El énfasis en la segunda etapa del proyecto, ya con la mayoría de los riesgos reducidos, se enfocó en alcanzar todos los objetivos del proyecto y los atributos de calidad planteados. Es por esto que CodEv, en su versión final y como herramienta, está diseñado y empaquetado como plug-in de Eclipse para tener todas las ventajas de la plataforma. En su construcción también se usó el IDE Eclipse en su versión para desarrolladores de RCP/Plug-in para poder hacer uso de las mismas ventajas que entrega la plataforma. 50 Para crear el plug-in de CodEv se tuvo que crear un proyecto de Plug-in que contiene la funcionalidad en sí y que está contenido dentro de un proyecto de Feature que define los derechos de autor, licencia y otras características de CodEv en el momento de la instalación dentro de Eclipse. Este a su vez está contenido dentro de un proyecto de Update Site que es el que tiene los jars y directorios como los requiere Eclipse para que CodEv pueda ser instalado de manera estándar, como un plug-in regular, dentro de Eclipse desde un sitio remoto o local. 5.2. Prototipos realizados A continuación se presenta una descripción detallada de los 3 grandes prototipos realizados los que permitieron que la definición de los requisitos y necesidades de la herramienta fueran madurando y evolucionando. 5.2.1. Prototipo 1 El primer prototipo fue creado en C# como aplicación Windows Forms y su objetivo principal fue el tomar las definiciones del modelo de metadatos desde un motor de BD Mysql y construir la representación del modelo de metadatos en memoria. En este prototipo sólo se tiene la captura de algunos parámetros de conexión a la Base de datos como parte de la interfaz gráfica y un proceso de generación bastante básico con el contenido de los archivos a ser generados quemados (mezclados) en código. Con el primer prototipo se eliminó el riesgo de la generación en base a un modelo de metadatos, se creó una abstracción o representación del modelo de metadatos (tablas, campos, tipos de datos, relaciones, etc). Esta representación fue bastante básica inicialmente y fue mejorando con el uso de la herramienta en los siguientes prototipos e iteraciones. Este prototipo genera aplicaciones Windows Forms multicapa con NHibernate como capa de persistencia. Las aplicaciones generadas pueden ser importadas en el mismo VS Express para poder ser editadas y ejecutadas. 5.2.2. Prototipo 2 El segundo prototipo atacó el riesgo de la generación en base a plantillas con el prototipo hecho en C#. El lenguaje de plantillas utilizado fue NVelocity que es una versión portada a .Net de Velocity. Tiene un asistente (wizard) de configuración y generación de una aplicación Windows Forms que se debe importar manualmente en VS Express para poder ser editado y ejecutado. Este prototipo se construyó para validar la generación en base a plantillas y en base 51 a esto separar la aplicación (generador) de los archivos que se generan, por medio de los parámetros de reemplazo. Para crear este prototipo se tomó la versión del generador creado en el prototipo 1 y se lo extendió para que tenga el uso de plantillas para la generación. Cuando estuvo lista la funcionalidad de generación en base a plantillas, se probó que el modelo de metadatos y la generación en base a plantillas funcionaran con un ejemplo de validación por medio de la creación de plantillas para generar aplicaciones Java Web. Al realizar estas pruebas se realizó mejoras al modelo de metadadatos y los valores de reemplazo disponibles a las plantillas para la generación. 5.2.3. Prototipo 3 El último prototipo realizado atacó el punto crítico de la integración con un ambiente robusto que se redujo por medio de la integración con plataforma Eclipse. En este prototipo se creó un proyecto de Plug-in de eclipse en Java con el cual se demostraba el uso de algunos elementos visuales que son específicamente un asistente para la creación de un archivo de texto dentro del IDE por medio de un asistente (wizard) y también el crear un editor para este archivo de texto los cuales están integrados con el Workbench IDE UI por medio de los puntos de extensión. Se tuvo que realizar este prototipo para validar que era posible crear, en un tiempo restringido, un plug-in de Eclipse con las características deseadas. Se estaban evaluando 2 plataformas en ese momento que eran Eclipse y NetBeans, pero dada las facilidades y extensibilidad de Eclipse, se decidió continuar con esta plataforma. Antes de iniciar el desarrollo de este prototipo se realizó el trabajo de migración de la aplicación de generación existente de C# a Java, y por lo tanto este prototipo también incluyó una llamada a la ejecución de esa aplicación que genera aplicaciones Java Web que se deben importar manualmente en la plataforma Eclipse para ser editadas y ejecutadas. 5.3. Metodología de desarrollo aplicada Para el desarrollo del sistema se utilizó una metodología iterativa incremental en donde se realizaron 4 iteraciones y en cada una de ellas se agregó al sistema parte de la funcionalidad requerida y se realizaron mejoras, a continuación se detalla el trabajo realizado en ellas. 52 5.3.1. Iteración 1 La iteración uno de la construcción de CodEv comprendió la creación de los prototipos 1 y 2, además de su evolución hasta que se obtuvo una aplicación Windows Forms funcional para generación de aplicaciones Java Web que pudieran ser importadas como proyectos de Eclipse, editados y evolucionados. El objetivo de esta primera iteración fue el reducir la mayor cantidad de riesgos posibles para la generación de aplicaciones, pero además que se pudiera tener una primera versión de CodEv que pudiera ser probada y usada. Es por esto que se atacó los 2 puntos críticos que son complementarios, que son: el de creación de la representación del modelo de metadatos y el de generación de la aplicación en base a plantillas. Esta primera versión era visualmente muy rústica para el usuario y además requería de varios procesos manuales de importación y actualización de archivos y proyectos para poder usar las aplicaciones generadas. Esto porque al estar hecho en C# y generar código que seria importado en Eclipse requería de varios cambios de contexto y de mucho cuidado. Pero aun así se vio el potencial que tendría el generador final y se vio una buena reducción del tiempo de desarrollo. También, el contar con plantillas hace que sea más fácil de mantener, ya que los cambios para el producto final generado se los realizaba en las plantillas, sin tener que tocar el código de la aplicación. 5.3.2. Iteración 2 La primera versión totalmente funcional de CodEv se usó como una de las herramientas para la creación del sistema SIMPLe - Sistema de Implementación de Mejora de Procesos, con lo cual se pudo obtener retroalimentación sobre las limitaciones y necesidades del sistema de generación deseado. Uno de los hallazgos más importantes de la validación realizada (para el autor de esta tesis), fue que existe la necesidad de regeneración de las aplicaciones generadas, para que puedan ser evolucionadas o de otra manera la utilidad de CodEv sería muy limitada y marginal. El objetivo de la segunda iteración fue el poder corregir algunas de las limitaciones y necesidades encontradas por el uso de CodEv en el proyecto real. Estas limitaciones se enfocaron principalmente en mejorar las plantillas para la generación de aplicaciones Web Java y también en la representación del modelo de metadatos en el que se basan, ya que se 53 requería de funciones CRUD más ricas hacia los usuarios, como son las de búsqueda (filtrado) por varios campos, ordenamiento, paginación y búsqueda de relaciones de clases padre. En esta iteración se hizo un trabajo conjunto y cercano con el proyecto SIMPLe para que este proyecto fuera utilizando los avances que se realizaban en CodEv para seguir construyendo la herramienta. La capacidad de poder contar con una validación casi al instante aceleró la evolución de las plantillas para aplicaciones Java Web y de la representación de modelos de metadatos, hasta llegar a un punto donde el autor las consideró bastante maduras para poder crear otras aplicaciones. 5.3.3. Iteración 3 La Iteración tres implicó la migración de la aplicación desde C# a Java, ya que aunque la aplicación de generación era bastante robusta, no cumplía con todos los objetivos planteados en la tesis, ni con todos los atributos de calidad planteados. El primer paso en el proceso de migración fue, en una etapa inicial, a una aplicación de escritorio Java no integrada con Eclipse. En este paso se realizó una migración de uno a uno de los componentes de la aplicación, como son el componente de BD y la representación de modelo de metadatos, el componente de generación y también el cambio de plantillas de NVelocity a Velocity. Este último cambio se lo realizó ya que se requirió el reemplazo de algunos valores en las plantillas, más por una cuestión de notación y correctitud. El proceso más largo de la migración fue el paso de los componentes visuales, ya que es lo que difiere mucho entre las implementaciones del lenguaje C# y Java, los componentes visuales fueron realizados en JFace y SWT para que la integración con Eclipse pueda ser más fácil. Una vez terminada la migración de CodEv a Java, se realizó el prototipo 3 para la integración con la plataforma Eclipse para poder reducir este riesgo. Una vez finalizado el prototipo, se procedió a la integración completa de CodEv con el IDE Eclipse, esto implicó la refactorización de algunos de los componentes para poder ajustarse de mejor manera a los puntos de extensión de Eclipse. 5.3.4. Iteración 4 La última iteración se centró en la capacidad de regeneración de los proyectos generados, dado que este es uno de los puntos más valiosos de CodEv. Se refactorizó la aplicación para 54 que se pueda reutilizar muchos de los elementos visuales que se usan en el Wizard de generación para el Editor de regeneración, también se creó la funcionalidad para almacenar los valores ingresados por el usuario en la generación en el archivo .codev que sirven para la regeneración. En esta iteración se trató de cerrar todos los pequeños cambios pendientes para finalizar el proyecto, como por ejemplo parámetros de configuración faltantes. Otra funcionalidad importante que se realizó como parte de esta iteración fue la creación del proyecto de Feature y del proyecto de Update site para poder empaquetar y distribuir CodEv de manera estándar para su instalación como plug-in en Eclipse. En todas las iteraciones y prototipos se realizaron pruebas generando aplicaciones de ejemplo; pero al final de esta iteración se creó un ejemplo de validación final de CodEv que es presentado como parte de esta tesis en el capítulo 8. 55 6. Funcionamiento de Codev En el siguiente capítulo se presenta los requisitos para la instalación y configuración de CodEv, cómo usar la herramienta para generación y regeneración junto con un proceso de desarrollo recomendado. Por último se presentará una guía de los elementos que componen las soluciones generadas y cómo usarlas. 6.1. 6.1.1. Instalación y configuración Pre-requisitos Los pre-requisitos para la instalación de CodEv y ejecución de los sistemas generados por medio de CodEv son los siguientes: - Java 2 Platform, Standard Edition – J2SE 5.0 – distribución básica 51.76 MB (http://java.sun.com/javase/downloads/index_jdk5.jsp) (también conocido como JDK 1.5) - Eclipse IDE para Java EE Developers versión Europa 3.3 o superior – 126 MB (http://www.eclipse.org/downloads/) - Apache Tomcat 5.5 o superior distribución Core – 6.6MB (http://tomcat.apache.org/) - Mysql Comunity Server o Enterprise Database 5.0 o superior – 42.4.MB (http://dev.mysql.com/downloads/mysql/5.0.html) 6.1.2. Instalación de Codev A continuación se presentará los pasos a seguir para la instalación del plug-in de CodEv dentro de la plataforma Eclipse. El proceso de instalación es el proceso estándar de Eclipse para la instalación de plug-ins. Se debe tener J2SE y Eclipse IDE instalados previamente, con las versiones descritas en la sección de pre-requisitos, para proceder con la instalación de CodEv. Se debe ejecutar el IDE Eclipse y acceder al menú “Help” ubicado en la parte superior de la herramienta, seleccionar “Software Updates” y de ahí “Find and Install…”, como se muestra en la Figura 24. 56 Figura 24. Opción de menú para instalación de plug-ins en Eclipse En la siguiente pantalla se selecciona “Search for new features to install” y se presiona el botón “Next”. Aparece una pantalla en la que se debe seleccionar “New Remote Site…” si se desea instalar CodEv desde un sitio remoto (red local o Web) o “New Local Site…” si se instalará desde un sitio local (en disco o recursos compartidos), de aquí se ingresa el URL o se selecciona el directorio donde de encuentra CodEv y se ingresa el nombre con el que se desea registrar el instalador del plug-in de CodEv dentro de Eclipse, como en la Figura 25. Aparece seleccionado CodEv para su instalación y se presiona el botón “Finish”. 57 Figura 25. Pantalla de instalación de un plug-in desde un sitio local Si la instalación se la está realizando desde un sitio remoto, Eclipse se encargará de descargar los archivos, ir notificando al usuario del avance de esta descarga y colocarlos en un lugar temporal para su instalación. Este proceso tomará alrededor de 10 a 30 minutos dependiendo de la velocidad de la conexión a Internet que se esté usando y el tráfico en la red. El plug-in CodEv tiene alrededor de 18.87MB. La siguiente pantalla presenta los Features de CodEv y su versión a ser instalados, se debe seleccionar todos y presionar el botón “Next”, como en la Figura 26. 58 Figura 26. Pantalla de selección de Features a instalar En la siguiente pantalla se presenta la licencia definida para CodEv, aquí se debe seleccionar “I accept the terms in the license agreement” y presionar el botón “Next” para continuar con la instalación. Se presentará una pantalla de confirmación final de la instalación donde se muestra el nombre, versión, tamaño del plug-in a instalarse y el directorio desde donde se está instalando, se debe presionar el botón “Finish” para proceder con la instalación. Se presentará una pantalla donde se muestra la confirmación de instalación de cada Feature. Aquí se puede instalar uno por uno por medio del botón “Install” o instalar todos de una vez por medio del botón “Install All”. Eclipse notificará al desarrollador del avance de la instalación que podrá tomar unos minutos. Una vez finalizada la instalación, Eclipse recomendará al usuario reiniciar la plataforma Eclipse para que se reflejen los cambios de esta instalación. Se debe presionar el botón “Yes” o cerrar y abrir la plataforma manualmente. Y con esto ya se tiene una copia de CodEv dentro de Eclipse totalmente funcional. 6.2. Proceso de generación El proceso de generación de aplicaciones Web Java se lo puede realizar una vez que se tiene instalado CodEv dentro de Eclipse y también se han instalado Mysql y Tomcat, con las versiones descritas en la sección de pre-requisitos. Los procesos de generación o regeneración son guiados y bastante simples por lo que, dependiendo de las opciones de configuración deseadas, pueden durar tan poco como 5 minutos para generar la aplicación Web Java completa. Después de esto se puede editar o ejecutar la aplicación generada directamente desde Eclipse. Como se comentó anteriormente, uno de los puntos importantes que se obtuvo de la retroalimentación con el uso de CodEv es que se requiere que tenga capacidad para 59 regeneración de código para que sea realmente útil en un contexto de desarrollo evolutivo o iterativo de aplicaciones. Esto se lo logró implementar por medio de la investigación de los modelos de generación usados en otras herramientas. Existen dos modelos conocidos para la regeneración de código, el primero se basa en la comparación de archivos, es decir que se compara archivo por archivo para ver si hay diferencias, permitiendo al desarrollador combinar los cambios. El segundo se basa en la herencia o extensión de clases base, en el cual las clases base no son modificadas por el desarrollador y pueden ser regeneradas en cualquier momento, el desarrollador puede modificar las clases extendidas sin riesgo de perder sus cambios por el proceso de regeneración. La herramienta ha sido construida para permitir la evolución de la aplicación generada por medio de regeneración de código siguiendo un proceso no destructivo en base a herencia. Para esto se tienen que respetar una serie de lineamientos y prácticas de modificación de la aplicación generada, pero que permitirán el realizar la evolución y la regeneración de la aplicación en cualquier momento. La restricción se basa en que la primera vez que se genera la aplicación, se generarán los archivos completos de la aplicación Web Java para las tablas y campos seleccionados, además de los archivos de proyecto Web Java de Eclipse y queda listo el proyecto en el IDE Eclipse, pero en las siguientes regeneraciones sólo se generarán un grupo de archivos base. Si el programador desea tener la capacidad de regenerar sin perder los cambios, deberá respetar estos archivos base sin realizar modificaciones, pero tendrá la libertad total de extender la funcionalidad del sistema por medio de los archivos de extensión, u otros que él cree, que heredan de la funcionalidad base y que no serán reescritos al regenerar la aplicación. 6.2.1. Generación inicial Para ejecutar los procesos de generación y regeneración de CodEv se debe tener el motor de BD Mysql corriendo al igual que el IDE Eclipse en el cual se instaló el plug-in de CodEv. También se debe haber creado previamente el esquema de datos del cual se quiere generar la aplicación. Para generar un nuevo proyecto Web Java con CodEV se debe ir al menú en la parte superior a la opción “File” >> “New” >> “Other”, como en la Figura 27. 60 Figura 27. Opción de menú para listar los tipos de archivos y proyectos Se presentará una pantalla con el listado de todos los tipos de archivos y proyectos que se pueden crear en Eclipse, se debe seleccionar el tipo “Codev” >> “Codev Project” y presionar el botón “Next”, como se muestra en la Figura 28. Figura 28. Opción de menú para crear un nuevo proyecto CodEv Se presenta la primera pantalla del wizard para crear el proyecto CodEv que es la pantalla de captura de opciones de configuración, ver Figura 29, en donde se debe ingresar los siguientes valores: - Nombre del Proyecto (Project Name) – es el nombre con el que se creará el proyecto dentro de Eclipse y en todas las referencias de la generación de código. - Nombre del Paquete (Package Name) – es el paquete java para marcar el namespace en el que se organizará el código fuente de la aplicación, este paquete es el que se coloca en cada una de las clases java generadas. Para representar este paquete físicamente en disco se crean directorios que contendrán este código fuente. Por ejemplo com.altura.notas, crea la estructura de directorios com/altura/notas/ y dentro de ella estarán las carpetas de código fuente. - Nombre del Servidor (Server) – IP del servidor o nombre del recurso de red donde se encuentra corriendo el servidor de BD Mysql que contiene el esquema de datos del que se desea generar la aplicación Web Java. 61 - Puerto del Servidor (Port) – puerto del servidor donde se encuentra corriendo el servidor de BD Mysql. - Usuario (User) – usuario de conexión al servidor de BD Mysql. - Password – password de conexión al servidor de BD Mysql. Una vez ingresada la información anteriormente descrita se debe presionar el botón “Load Schemas” para cargar la lista de esquemas disponibles en el servidor de BD Mysql y se debe proceder a seleccionar el esquema de datos del que se desea generar la aplicación Web Java. Luego de seleccionado el esquema se activará el botón “Next” el cual debe ser presionado para continuar. Figura 29. Pantalla de captura de opciones de configuración de CodEv 62 En la siguiente página del wizard es donde se permite seleccionar que tablas se van a generar. Inicialmente CodEv tiene marcadas para generación todas las tablas del esquema, pero se pueden seleccionar sólo las tablas que se desea generar. En esta pantalla también se permite seleccionar la tabla que servirá para autenticación de usuarios de la aplicación, además de los campos de usuario y password en los que se realizará la autenticación en sí, ver Figura 30. Figura 30. Pantalla de configuración de tablas y datos de log in de CodEv Los campos a ser generados en cada una de las tablas podrán ser configurados presionando el botón “Edit…” que está al lado derecho del nombre de cada tabla y aparece una ventana como en la Figura 31 que muestra todos los campos para esa tabla, su tipo de dato y si el campo es clave primaria (PK), clave foránea (FK) o ninguno. Inicialmente CodEv tiene marcados para generación todos los campos, pero se pueden seleccionar sólo los campos que se desea generar. En esta pantalla también se permite seleccionar el campo de búsqueda (Search) para esta tabla. 63 El campo de búsqueda es el campo que será desplegado en vez de la clave foránea de la tabla padre en los listados de tablas hijo. Es decir en una relación de 1-N donde se está mostrando un registro del lado N (hijo) en vez de mostrar la clave foránea del lado 1 (padre), se mostrará el campo de búsqueda obtenido desde el registro de la tabla padre. Figura 31. Pantalla de configuración de campos por tabla En este punto se debe aclarar que CodEv no genera código para la administración de relaciones para tablas o campos foráneos que no se hayan seleccionado para su generación. Es decir, en una relación de 1-N donde se está mostrando un registro del lado N (hijo) y no se ha seleccionado para generación la clave foránea dentro de esta tabla no se mostrará el campo y por lo tanto la relación con la tabla 1 (padre). En el caso que no se haya seleccionado la tabla del lado 1 (padre) para generación, sólo se mostrará el valor del campo de clave foránea desde la tabla N (hijo), sin obtener el valor del campo de búsqueda desde la tabla 1 (padre). Una vez que se ha configurado las tablas y campos que se desea generar se presiona el botón “Next” y se presenta la pantalla de generación. Hasta este momento se puede regresar a las pantallas anteriores y modificar cualquiera de las opciones de configuración. Una vez que el desarrollador está listo para generar la aplicación deberá presionar el botón “Generar” y el sistema irá notificando del avance de la generación por medio de mensajes y de una barra de avance (status bar), ver Figura 32. El proceso de generación puede demorar algunos minutos dependiendo de la cantidad de tablas, campos y relaciones que exista en el esquema de datos seleccionado. Una vez finalizado el proceso de generación se presentará un mensaje de confirmación y al presionar el botón “Finish” se cerrará el wizard de generación y se habrá completado el proceso. 64 Figura 32. Pantalla de avance de generación de CodEv El proceso de generación crea un proyecto Web Java dentro de Eclipse con el nombre de proyecto ingresado y el cual tiene todos los componentes necesarios y está listo para ser probado. El proyecto generado tiene la estructura presentada en la Figura 33, en cual se resaltan la carpeta “src” que contendrá todas las clases Java del proyecto, sean estas clases base “static” o extendidas y editables por el usuario “modificable”. También, se debe notar que las clases son creadas dentro del directorio que representa al paquete Java, ingresado en las opciones de configuración. 65 Figura 33. Estructura de un proyecto Web Java creado con CodEv Otra de las carpetas que resalta es la carpeta “WebContent” que contiene todos los recursos web de la aplicación, como son archivos de Java Server Pages (jsp), css, javascript, además de las imágenes y otros directorios requeridos para que el proyecto sea una aplicación Web Java. Por último vale resaltar el archivo .codev, que es donde se almacena la definición de los parámetros de configuración ingresados por el usuario para la generación y que nos da la capacidad de regeneración de la aplicación. 66 6.2.2. Regeneración – Evolución de la aplicación La regeneración de la aplicación Web Java por medio de CodEv tiene las mismas restricciones que la generación inicial y tiene pantallas muy similares. El proceso se inicia haciendo doble click sobre el archivo .codev, lo que abre un editor para la regeneración del proyecto, como en la Figura 34. Este editor tiene los datos de configuración ya cargados, es decir los valores de la primera generación. Aquí también se presentarán las nuevas tablas y campos para que el usuario los pueda seleccionar para la regeneración de la aplicación. Figura 34. Editor para la regeneración de un proyecto CodEv De aquí en adelante el proceso de generación es el mismo que ya ha sido descrito, sólo que, como ya se ha dicho, sólo se sobrescribirán los archivos de extensión o crearán los archivos completos para las nuevas tablas. 6.2.3. Proceso de desarrollo recomendado CodEv podrá ser usado en conjunto con cualquier metodología de desarrollo, con sus concebidas limitaciones y ajustes, pero en el caso que se obtendrá su mejor aprovechamiento para la creación de prototipos o de programas funcionales finales, será con una metodología 67 evolutiva o iterativa-incremental, dado que de esta manera se podrá ir aumentando y refinando los requerimientos del cliente. Figura 35. Modelo iterativo de desarrollo con generación de código Como se muestra en la Figura 35, primeramente se debe realizar un análisis y diseño del dominio y de la solución, para posteriormente crear un modelo de datos en base al dominio de aplicación y crear el esquema de base de datos. El generador se ejecutará contra este esquema de datos para obtener la aplicación funcional, se alterará esta aplicación generada para obtener la funcionalidad de acuerdo a las necesidades del cliente. Una vez finalizados estos cambios se revisa la aplicación con el cliente y se reinicia el ciclo de análisis y diseño de las modificaciones o aumentos a la aplicación. Se altera el modelo de datos y se ejecuta el generador el cual no dañará la programación ya realizada en el sistema, sino que se generará la aplicación y sus cambios, en base al nuevo modelo de datos. En este punto puede ser necesario refactorizar partes de la aplicación para que funcionen con el nuevo modelo de datos generado y realizar los nuevos cambios. Esto formará un ciclo de iteraciones y evolución de la aplicación que ayudará al desarrollador a cumplir sus objetivos de aclarar y satisfacer las necesidades del cliente de una manera rápida, al poder presentar elementos funcionales que dan al cliente una visión mucho más clara de lo que desea y lo que obtendrá. 68 El proceso descrito se asimila al modelo espiral creado por Barry W. Bohem, que basa sus características en sucesivas iteraciones (ciclos) que contienen una serie de pasos, los cuales permiten la evolución del producto deseado [Boh88]. Por el lado del equipo de desarrollo, el uso de CodEv también debe ir acompañado de un proceso de capacitación al personal en las tecnologías que son generadas y en el mejor uso del generador como herramienta y como proceso. Esto ayudará a asegurar el éxito del proceso y el mejor aprovechamiento de la herramienta. 6.3. Bosquejo de la solución generada Las descripciones y pantallas que se presentan a continuación son un listado de las páginas (elementos de presentación) que son generados y que serán los puntos de interacción del usuario con el sistema. Todos estos elementos son páginas Web estándar (XHtml, CSS y Javascript) que serán procesados en el servidor dinámicamente por medio de páginas JSP. Se generan elementos de presentación que serán generales para la aplicación y otros que serán para la visualización y administración de datos por tabla. El sistema generará una pantalla de login en base a una tabla que es seleccionada por el usuario, Figura 36. Esta será la página principal que será el punto de ingreso al sistema desde donde se podrá acceder a las funcionalidades del sistema. Figura 36. Página de login del sistema generado El sistema contará con control y validación de datos para todas las pantallas del sistema por medio de validaciones de Struts2 en el servidor. En la Figura 37, encerrados en un círculo rojo, se encuentran el tipo de mensajes que se presentan en pantalla para los errores de validación que ocurran en el sistema: 69 Figura 37. Mensajes de error que presentará el sistema Además, se generará un menú que contendrá el listado de tablas que fueron seleccionadas para generación, como en la Figura 38, las cuales tendrán mantenimiento CRUD. El menú también tendrá la opción para logout del sistema: Figura 38. Menú generado para el sistema A continuación se presentan los elementos que son generados por cada una de las tablas con sus respectivas relaciones en el modelo de datos. Para cada tabla se genera una página de listado de elementos de datos de la tabla. Esta pantalla tendrá acceso a funciones para: crear, modificar y eliminar datos de la tabla listada, además tendrá capacidad de búsqueda (filtrado) y de paginación. Al hacer click en un elemento de menú para la tabla que se desea revisar, se presentará la página de listado de elementos para esa tabla (Figura 39). A continuación se describen los elementos que componen esta página en mayor detalle: 70 Figura 39. Página con listado de datos La página de listado cuenta con la capacidad de búsqueda o filtrado de datos por cada uno de los campos de la tabla, excepto por la clave primaria, como en la Figura 40. Se podrá colocar todas las opciones por las que se desee filtrar el listado de elementos y este filtro se mantendrá para las siguientes interacciones y se presentará el listado de resultados paginado. Figura 40. Cabecera para filtrar el listado de elementos Se generarán varios tipos de elementos de filtrado dependiendo del tipo de dato en la base de datos que se esté filtrando. A continuación se presenta una descripción detallada de estos elementos de filtrado: Para los elementos de búsqueda que representan una relación padre, lado 1 en una relación 1-N desde la tabla que se está listando hacia otra, existe la capacidad de búsqueda de estos elementos padre. Al hacer click en “Buscar”, aparecerá una pantalla flotante con el listado de elementos padre (Figura 41) que pueden ser filtrados por nombre y paginados, para posteriormente, al hacer click en el enlace de la clave primaria, seleccionar el elemento deseado. Una vez seleccionado el elemento se cierra la ventana flotante y se actualiza la caja de selección de listado con el nombre del elemento padre seleccionado. 71 Figura 41. Página flotante para seleccionar elementos de una relación padre Para los elementos de filtro de tipo texto o numérico se crea un cajón de texto en donde se debe llenar el texto que se desea filtrar. Para todos los campos que sean de tipo fecha se crea un cajón de texto en el que, al seleccionarlo, aparece un calendario (figura 42) en una ventana flotante para la selección de la fecha. Figura 42. Página para seleccionar un elemento de tipo fecha La opción de paginación del listado (Figura 43) permite ir hacia la página inicial, anterior, posterior, final o ir a una página determinada; además se permite cambiar el número de elementos que se están mostrando por página y muestra el número total de filas que existen en el listado. 72 Figura 43. Paginación para los listados Al hacer click en el enlace para la creación de un nuevo elemento, se presentará la página para agregar un nuevo elemento de datos a la tabla, con capacidad de búsqueda de las relaciones padre, de funcionamiento igual al que se detalló en el literal 1.1. Esta página contiene validaciones para cada uno de sus datos, basadas en validaciones en el servidor de Struts2, ver Figura 44. Figura 44. Página para agregar un nuevo elemento Al hacer click en el enlace para la modificación del elemento seleccionado, se presenta la página de modificación del elemento con los datos del registro de la tabla cargados al igual que los datos de las relaciones con tablas padre, ya seleccionados, como en la Figura 45. Esta página funciona igual que la página de creación con validaciones y capacidad de búsqueda de las relaciones padre. 73 Figura 45. Página para modificar un elemento Al hacer click en el enlace (x) para eliminar el elemento seleccionado, se presentará el siguiente mensaje de confirmación antes de ser eliminado, ver Figura 46. El generador realizará eliminación física de los datos y no solamente lógica. Figura 46. Página para modificar un elemento 74 7. Caso Práctico - Validación de la herramienta A continuación se presenta uno de los casos prácticos en el que se ha usado el generador para crear una aplicación bastante completa y el que se usó para registrar los tiempos de codificación. No se tomaron en cuenta para la comparación el tiempo de las actividades de: análisis, diseño de aplicación, de interfaces o pruebas funcionales, sólo las tareas de codificación. Estos ítems mencionados no se ven afectados por la generación de código y deberían ser muy similares en el caso de desarrollo sin el generador y usando el generador, tomando en cuenta que se utilizan metodologías de desarrollo y equipos de personas con habilidades y conocimiento similares. La lógica de negocio a ser implementada es bastante simple y nos permitirá hacer una evaluación y comparación básica del generador y de sus capacidades. A continuación se presentará información relevante para dar un contexto lo más completo posible del alcance del sistema creado para validar la herramienta. Se presenta información sobre el proceso, los requerimientos, modelos de datos usados y pantallas de sistema. El proceso de desarrollo que se siguió para el desarrollo de este ejemplo de validación, se basó en 2 iteraciones que fueron el tomar un modelo de datos inicial, generar la aplicación con CodEv y modificar el código generado de la aplicación en base a los requerimientos. Posteriormente modificar el modelo de datos, regenerar la aplicación con CodEv y refactorizar la aplicación para soportar los cambios en el modelo de datos y requerimientos. Los requerimientos del sistema se detallan a continuación. Este será un sistema Web para la gestión académica y estas serán sus funcionalidades: - Login para tres tipos de usuarios: Administrador, Profesores y Alumnos; que tendrán diferentes menús y funcionalidades. - El profesor podrá editar sus datos personales y de usuario, además podrá ingresar notas para los alumnos que se encuentren registrados en las materias que él dicta. - El alumno podrá editar sus datos personales y de usuario, además podrá tomar materias que estén disponibles y ver sus notas para las materias en las que se encuentra inscrito. - El administrador podrá gestionar todas las tablas, es decir podrá crear nuevos profesores, alumnos, materias y usuarios para el sistema. 75 A continuación se presenta el modelo de datos inicial y el modelo de datos modificado. En la Figura 47 se presenta el modelo de datos inicial para soportar este sistema, donde tendremos que un profesor podrá dictar una o más materias las cuales tendrán notas para los alumnos registrados en esas materias. Además, se tendrá usuarios en el sistema con sus respectivos roles. Figura 47. Modelo Físico inicial del esquema de BD para el caso práctico En la Figura 48 se presenta el modelo de datos modificado con algunos cambios de normalización. Se manejan los conceptos básicos del modelo inicial, el cambio grande es que en un curso se dicta una materia en fechas específicas por un profesor en un aula determinada. De esta manera se normaliza el que se dicten varios cursos de una misma materia y que se dicten varios cursos en la misma aula, sin tener redundancia de datos. 76 Figura 48. Modelo Físico final del esquema de BD para el caso práctico A continuación se presentan las interfaces gráficas más importantes que componen el sistema: - pantalla de login única para todos los usuarios: Figura 49. Pantalla de login única para todos los usuarios del sistema 77 - pantalla de edición de datos personales y de usuario para los usuarios profesor y alumno: Figura 50. Pantalla de edición de datos personales y de usuario - Ingreso de notas por materia por parte del profesor que dicta la materia: Figura 51. Pantalla de ingreso de notas por materia 78 - Pantalla de toma de materias o registro de materias por parte del alumno: Figura 52. Pantalla de toma de materias para alumno - Pantalla de visualización de notas por materia para las materias del alumno: Figura 53. Pantalla de visualización de notas para alumno Como se mencionó en capítulos anteriores, el generador redujo las tareas repetitivas del proyecto y creó funcionalidades CRUD para cada tabla. Esto prestó una base de funcionalidad para poder modificar el sistema y presentar los datos ajustados a los requerimientos de la 79 interfaz y poder evolucionarlos, posteriormente refactorizarlos, para que se ajusten al nuevo modelo de datos, lo cual nos permitió hacer un desarrollo ágil y evolutivo de la aplicación. El tiempo de desarrollo de este prototipo, con la evolución de datos y refactorización al sistema final, fue de 15 horas. El tiempo estimado de desarrollo de la manera tradicional, sin usar el generador, se estimó en 40 horas (5 días laborables de 8 horas), es decir el tiempo de desarrollo se redujo en un 62.5% en relación al tiempo de desarrollo tradicional. 80 8. Conclusiones A continuación se presentan las conclusiones a las que se llegaron con el desarrollo de la presente tesis, las recomendaciones y mejoras a futuro. 8.1. Conclusiones Los objetivos principales planteados como parte de esta tesis de diseñar e implementar una herramienta para la generación rápida de aplicaciones Web Java con una arquitectura multicapa para la administración CRUD de un modelo de datos, se cumplieron. CodEv permite la generación de aplicaciones Web Java ricas en funcionalidad en un tiempo muy corto. Además, apoya al desarrollador para crear prototipos evolutivos o aplicaciones completas que pueden evolucionar de manera sencilla, y que funcionan dentro de un ambiente de desarrollo integrado y que se pueden poner en funcionamiento con mínimo esfuerzo. Se cumplieron todos los requisitos funcionales y no funcionales, como son la generación en base a plantillas, la integración con una plataforma robusta, abstracción del modelo de metadatos y capacidad de regeneración de las aplicaciones. También, se logró alcanzar en gran medida los atributos de calidad como son: - el de usabilidad, donde la instalación del ambiente y del generador son sencillas y rápidas. Y el proceso de generación es muy fácil, guiado y puede tomar menos de 5 minutos, dependiendo de la configuración de la generación deseada por el usuario. - que se pueda ejecutar en múltiples sistema operativos (portable), ya que la plataforma Eclipse está desarrollada en Java y se ejecuta en todos los sistemas operativos para los que exista un J2SE 5.0. - se cumplió la extensibilidad y mantenibilidad por medio de la componentización de la aplicación, ya que el sistema está diseñado para que cada componente aísle su propia lógica y función (separación de responsabilidades) por medio de interfaces claras de comunicación entre componentes. También por medio de la generación en base a plantillas, ya que esto hace más fácil de cambiar y extender la aplicaciones que son generadas. El objetivo que no se pudo cumplir, por restricción de tiempo, es que la herramienta pueda conectarse a múltiples motores de BD. Sólo se llego a implementar la conexión al motor de BD 81 Mysql, pero la herramienta ha sido arquitecturada y diseñada para que pueda ser extendida y pueda soportar múltiples motores de BD. Se concluyó que las herramientas de generación de código son mejores y/o peores en ciertos ámbitos de generación específicos, por ejemplo: más fáciles de usar, mayores capacidades de generación, fácilmente configurables; pero será muy difícil el poder crear una herramienta que pueda cumplir con todas estas características y por lo tanto esperar que sea útil en todos los contextos de generación. La mayoría de generadores son usados por un grupo reducido de personas que incluye a sus creadores, empresa en la que trabajan y grupo con conocimientos similares, dado que los generadores generalmente son creados para un dominio y un proceso específico de desarrollo, que no es fácilmente trasladable a otras empresas o contextos sin cambios o amplia capacitación. Es relativamente sencillo el crear o usar una herramienta de generación de código, dado que se tenga una base de conocimiento sólida; el gran problema, como con todo cambio organizacional es el poder lograr el equilibrio entre las herramientas, las personas y los procesos. En el caso del generador creado como parte de esta tesis, se empezó con el plan de crear un generador genérico, y se terminó realizando un generador muy ajustado al proceso de trabajo de la empresa en la que trabaja el autor, realizando procesos de capacitación y entrenamiento, modificando los procesos de análisis y diseño para incluir prototipos evolutivos y en general una metodología más ágil de interacción con el cliente. También, se incorporaron algunas herramientas nuevas como plug-ins de eclipse y otras herramientas de soporte al trabajo de la empresa. No se ha logrado probar la herramienta en un contexto externo a la empresa, por lo que, por el momento, todos los resultados presentados de uso son de proyectos realizados en un ambiente controlado y de soporte por parte del autor de la herramienta, lo cual hace que estos resultados puedan variar grandemente en otros contextos. Por ultimo, una de las observaciones realizadas es que será mucho más fácil incorporar un ambiente de generación de código dentro de una empresa con procesos maduros, dado que los proyectos se llevarán de manera similar y la capacitación será más sencilla y de esta manera 82 las experiencias en un proyecto con la generación de código pueden ser usadas en los siguientes. Además, el uso del generador en proyectos reales crea retroalimentación necesaria y, como para todo software, un generador de código y sus plantillas de generación requerirán mantenimiento y mejoras que involucran un tiempo no despreciable o se corre el riesgo de que la herramienta de generación llegue a desactualizarse rápidamente sin mantenimiento. 8.2. Recomendaciones Por lo dicho anteriormente, es muy importante seleccionar o crear herramientas de generación de código que vayan en la línea de conocimiento del personal y del funcionamiento de la empresa en sí. No se puede esperar, en la mayoría de los casos, que la empresa de un vuelco de 180º para ajustarse al uso de una herramienta. También, para que sea en cierta medida exitoso el crear o usar una herramienta de generación de código, debe venir acompañado de ajustes en la metodología de trabajo, en la capacitación al personal y en las otras herramientas complementarias usadas por la empresa, para poder aprovechar de mejor manera los beneficios del generador de código; de lo contrario se corre el riesgo de que la generación de código se convierta en una traba más que en una ayuda. Por el lado del uso de la herramienta, se recomienda realizar pruebas con el uso de la herramienta por parte de personas externas a la empresa, para poder validar si la herramienta sería usable en un contexto diferente y menos controlado que el actual. Al ser usado el generador en un contexto externo, se debería empezar por capacitar a las personas que participarán en el proyecto en el cual se desea usar la herramienta, para que conozcan adecuadamente sobre el uso de la herramienta y realizar el ajuste necesario al proceso de desarrollo usado, para obtener mayores beneficios de la herramienta. 8.3. Mejoras a futuro Existen muchas mejoras que se pueden realizar a la herramienta, pero entre las más importantes, en la opinión del autor, están: - Incorporar nuevos motores de base de datos de las que se pueda realizar generación, por ejemplo: Oracle y SQLServer, que son de los más populares en el mercado. Por el momento sólo se tiene soporte para Mysql. 83 - Crear nuevas plantillas de presentación, con colores y menús, para que se pueda seleccionar variedad de estilos. Por el momento sólo existe una plantilla de presentación. - Incorporar capacidades de internacionalización para Struts2. Esto permitiría que el generador sea usado para generar aplicaciones para múltiples idiomas y extendería la base de usuarios de la herramienta. La aplicación generada está en español. - Incorporar capacidades de generación de Spring, que es un framework de Inversión de Control (IoC) y otros servicios que es muy popular en aplicaciones Java empresariales. Esto para que las aplicaciones generadas sean más fácilmente configurables y mantenibles, haciéndolas más cercanas a nivel empresarial. - Incorporar capacidad de comparación de cambios para los archivos base que son regenerados y que pueden ser alterados por el usuario del generador. - Permitir mejor control de generación por medio de la selección de campos de relación y de tablas que rompen relaciones de muchos a muchos (M-N). 84 9. Bibliografía [AABN07] Arnowitz Jonathan, Arent Michael, Berger Nevin, NetLibrary Inc, Effective Prototyping for Software Makers. Elsevier, 2007 [BK06] Bauer Christian, King Gavin, Java Persistence with Hibernate. USA, Manning, 2006 [BS06] Bittner Kurt, Spence Ian, Managing Iterative Software Development Projects. Addison-Wesley, 2006 USA, [Boh88] Bohem Barry. Paper. A Spiral Model of Software Development and Enhancement, 1988 [en línea] <http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?tp=&arnumber=59&isnumber=6> [consulta: 05 junio 2008] [Bru02] Bruce Kim B., Foundations of Object-oriented Languages: Types and Semantics. En su: Varieties of Object-Oriented Programming Languages. Londres, Inglaterra, MIT Press, 2002, pp.124-132. [Bus96] Buschmann, F., Meunier, R., Rohnert, H., Sommerlad, P., Stal, S. Pattern-oriented software architecture: a system of patterns. New York, USA, John Wiley & Sons, 1996. [Fow03A] Fowler Martin, Patterns of Enterprise Application Architecture. Boston, USA, AddisonWesley, 2003. [Fow03B] Fowler Martin, UML Distilled: A Brief Guide to the Standard Object Modeling Language Third edition. Boston, USA, Addison-Wesley, 2003 [GHJV98] Gamma Erich, Helm Richard, Johnson Ralph, Vlissides John, Elements of Reusable Object-Oriented Software. USA, Addison-Wesley, 1998 [Gla02] Glass Robert L., Facts and Fallacies of Software Engineering. USA, Addison-Wesley, 2002 [Har06] Hartmann, D. Interview: Jim Johnson of the Standish Group. InfoQueue, 2006 [en línea]. <http://www.infoq.com/articles/Interview-Johnson-Standish-CHAOS> [consulta: 20 Mayo 2007] [Hem06] Hemrajani Anil , Agile Java Development with Spring, Hibernate and Eclipse. USA, Sams, 2006 [InfQ06] InfoQueue. Article. Interview: Jim Johnson of the Standish Group, 2006 [en línea] <http://www.infoq.com/articles/Interview-Johnson-Standish-CHAOS> [consulta: 13 junio 2007] [Lho06] Lhotka Rockford, Expert C# 2005 Business Objects Second Edition. USA, Apress, 2006 [Mad08] Madrid Jesica. SIMPLe - Sistema de Implementación de Mejora de Procesos con modelos CMMI e IDEAL. Tesis de Magíster en Tecnologías de Información. Santiago, Chile. Universidad de Chile, Facultad de Ciencias Físicas y Matemáticas, 2008. [Mic01] Microsoft. Microsoft Hails 10 Years 85 of Publisher, 2001 [en línea] <http://www.microsoft.com/presspass/press/2001/oct01/1015TenYearsPublisherPR.mspx> [consulta: 09 junio 2008] [ML05] Mcaffer Jeff, Lemieux Jean-michel, Eclipse Rich Client Platform: Designing, Coding, And Packaging Java Applications. USA, Addison-Wesley, 2005 [Omg07] OMG (Object Management Group), CORBA® BASICS, 2007 <http://www.omg.org/gettingstarted/corbafaq.htm> [consulta: 08 junio 2008] [en línea] [Par07] Parsian Mahmoud, JDBC Metadata, MySQL, and Oracle Recipes: A Problem-Solution Approach. NYC, USA, Apress, 2006 [Rou07] Roughley Ian. Starting Struts 2, 2007 <http://www.infoq.com/minibooks/startingstruts2> [consulta: 5 agosto 2007] [Sch01] Schmidt, H. Trusted Components- Towards Automated Assembly with Predictable Properties. Proceedings of ICSE 2001. ACM & IEEE Press. 2001. [SEI00] SEI, Three Tier Software Architectures, 2000 [en <http://www.sei.cmu.edu/str/descriptions/threetier.html> [consulta: 15 junio 2007] línea] [StG94] Standish Group. The CHAOS Report, 1994 [en línea]. <http://www.standishgroup.com/sample_research/chaos_1994_1.php> [consulta: 5 Mayo 2007] [StG03] Standish Group. Press Release. Latest Standish Group CHAOS Report Shows Project Success Rates Have improved by 50%, 2003 [en línea]. <http://www.standishgroup.com/press/article.php?id=2> [consulta: 16 mayo 2007] [Sun07] Sun Microsystems, The Java EE Tutorial. 2007 [en línea] <http://java.sun.com/javaee/5/docs/tutorial/doc/bnbly.html> [consulta: 08 junio 2008] [Wik06] Wikipedia. Lista de países ordenados por PIB (Producto Interno Bruto), 2006 [en línea]. <http://en.wikipedia.org/wiki/List_of_countries_by_GDP_%28nominal%29> [consulta: 20 Abril 2007] 86 Apéndice A – Estimación de la inversión mundial en TI y cantidad de proyectos de TI La estimación de la inversión mundial en TI y la cantidad de proyectos de TI para el año 2006, se realizó utilizando resultados del “CHAOS report” para los años 1994 y 2004. El “CHAOS report” es realizado por el Standish Group y busca las razones para la falla de proyectos de Tecnologías de Información en los EEUU (Estados Unidos) basados en encuestas realizadas. A continuación se presenta como se realizó la extrapolación a valores mundiales, todos estos valores son solo un supuesto para analizar estos datos y no deben ser tomados como datos reales. Con el total de inversión mundial en TI presentado por el “CHAOS report” se calculó el valor a la fecha actual proyectando el crecimiento anual y multiplicado por el número de años. Luego se tomó el PIB (Producto Interno Bruto) nominal por país y se lo comparó al PIB de EEUU, y se extrapoló estos resultados a los de inversión en SW basado en el tamaño de las economías de cada país. El PIB de un país se define como el valor de mercado de todos los productos y servicios producidos dentro de un país en periodo de tiempo determinado. También es considerado como la suma de valor agregado en cada paso de la producción de todos los productos terminados o servicios producidos dentro de un país en un periodo de tiempo determinado. El acercamiento más común para medir y entender el PIB es el método de gastos: PIB = consumos + inversiones + (gasto gubernamental) + (exportaciones – importaciones) El PIB de una región es una de las maneras de determinar el tamaño de su economía y es una visión económica usada por los países de primer mundo. Aunque el PIB puede no ser el mejor reflejo de una economía, son valores usados por el FMI (Fondo Monetario Internacional) y BM (Banco Mundial) y de los cuales existen valores disponibles y nos permite hacer una comparación a gran escala del tamaño de las economías y por lo tanto una estimación aproximada de la inversión económica en TI por país. En el rubro de inversión en TI, el “CHAOS report” presenta los resultados para los años 1994 y 2004, y se obtiene un crecimiento promedio anual de: ((255000* – 250000*) / (2004 - 1994)) = 500* Inversión en TI en US (millones de USD) * en millones de USD 1994 2004 2006 250000* 255000* 256000* En el rubro número de proyectos de TI, el “CHAOS report” presenta los resultados para los años 1994 y 2004, y se obtiene un crecimiento promedio anual de: ((280000 – 175000) / (2004 1994)) = 10500 No. de Proyectos de TI 1994 2004 2006 175000 280000 301000 87 Las proyecciones por país son las siguientes: Rank ing — 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 País World United States Japan Germany China United Kingdom France Italy Spain Canada Brazil South Korea India Mexico Russia Australia Netherlands Switzerland Belgium Turkey Sweden Saudi Arabia Austria Poland Indonesia Norway Denmark South Africa Greece Ireland Iran Finland Argentina Hong Kong, PRC Thailand Portugal Venezuela Malaysia Israel Czech Republic Colombia Singapore Chile Pakistan Hungary New Zealand PIB (millones de USD) según BM 44,384,871 12,455,068 4,505,912 2,781,900 2,228,862 2,192,553 2110185 1,723,044 1,123,691 1,115,192 794,098 787,624 785,468 768,438 763,720 700,672 594,755 365,937 364,735 363,300 354,115 309,778 304,527 299,151 287,217 283,920 254,401 240,152 213,698 196,388 196,343 193,176 183,309 177,722 176,602 173,085 138,857 130,143 123,434 122,345 122,309 116,764 115,248 110,732 109,154 109,041 88 % relación US 356.36% 100.00% 36.18% 22.34% 17.90% 17.60% 16.94% 13.83% 9.02% 8.95% 6.38% 6.32% 6.31% 6.17% 6.13% 5.63% 4.78% 2.94% 2.93% 2.92% 2.84% 2.49% 2.45% 2.40% 2.31% 2.28% 2.04% 1.93% 1.72% 1.58% 1.58% 1.55% 1.47% 1.43% 1.42% 1.39% 1.11% 1.04% 0.99% 0.98% 0.98% 0.94% 0.93% 0.89% 0.88% 0.88% Inversión en TI (millones de USD) 912,281 256,000 92,614 57,179 45,812 45,065 43,372 35,415 23,096 22,922 16,322 16,189 16,144 15,794 15,697 14,402 12,225 7,521 7,497 7,467 7,278 6,367 6,259 6,149 5,903 5,836 5,229 4,936 4,392 4,037 4,036 3,971 3,768 3,653 3,630 3,558 2,854 2,675 2,537 2,515 2,514 2,400 2,369 2,276 2,244 2,241 No de Proyectos de TI 1,072,643 301,000 108,894 67,230 53,865 52,987 50,997 41,641 27,156 26,951 19,191 19,034 18,982 18,571 18,457 16,933 14,373 8,844 8,815 8,780 8,558 7,486 7,359 7,230 6,941 6,861 6,148 5,804 5,164 4,746 4,745 4,668 4,430 4,295 4,268 4,183 3,356 3,145 2,983 2,957 2,956 2,822 2,785 2,676 2,638 2,635 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 United Arab Emirates Algeria Nigeria Romania Philippines Egypt Ukraine Peru Kuwait Bangladesh Kazakhstan Vietnam Morocco Slovakia Libya Croatia Ecuador Slovenia Luxembourg Guatemala Belarus Tunisia Qatar Dominican Republic Angola Sudan Serbia and Montenegro Bulgaria Syrian Arab Republic Lithuania Oman Sri Lanka Lebanon Costa Rica Kenya Cameroon El Salvador Uruguay Côte d'Ivoire Latvia Panama Cyprus Iceland Trinidad and Tobago Yemen Uzbekistan Estonia Bahrain Jordan Iraq Azerbaijan Tanzania Ethiopia 104,204 102,257 98,951 98,559 98,306 89,336 81,664 78,431 74,658 59,958 56,088 52,408 51,745 46,412 38,756 37,412 36,244 34,030 33,779 31,683 29,566 28,683 28,451 28,303 28,038 27,699 27059 26,648 26,320 25,495 24,284 23,479 22,210 19,432 17,977 16,985 16,974 16,792 16,055 15,771 15,467 15,418 15,036 14,762 14,452 13,667 13,107 12,995 12,861 12,602 12,561 12111 11,174 89 0.84% 0.82% 0.79% 0.79% 0.79% 0.72% 0.66% 0.63% 0.60% 0.48% 0.45% 0.42% 0.42% 0.37% 0.31% 0.30% 0.29% 0.27% 0.27% 0.25% 0.24% 0.23% 0.23% 0.23% 0.23% 0.22% 0.22% 0.21% 0.21% 0.20% 0.19% 0.19% 0.18% 0.16% 0.14% 0.14% 0.14% 0.13% 0.13% 0.13% 0.12% 0.12% 0.12% 0.12% 0.12% 0.11% 0.11% 0.10% 0.10% 0.10% 0.10% 0.10% 0.09% 2,142 2,102 2,034 2,026 2,021 1,836 1,679 1,612 1,535 1,232 1,153 1,077 1,064 954 797 769 745 699 694 651 608 590 585 582 576 569 556 548 541 524 499 483 457 399 369 349 349 345 330 324 318 317 309 303 297 281 269 267 264 259 258 249 230 2,518 2,471 2,391 2,382 2,376 2,159 1,974 1,895 1,804 1,449 1,355 1,267 1,251 1,122 937 904 876 822 816 766 715 693 688 684 678 669 654 644 636 616 587 567 537 470 434 410 410 406 388 381 374 373 363 357 349 330 317 314 311 305 304 293 270 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 Ghana Jamaica Bosnia and Herzegovina Botswana Bolivia Uganda Albania Senegal Paraguay Gabon Honduras Nepal Zambia Afghanistan Democratic Republic of Congo Turkmenistan Mozambique Mauritius Georgia Namibia Republic of Macedonia Malta Bahamas, The Chad Cambodia Burkina Faso Mali Republic of Congo Madagascar Nicaragua Armenia Papua New Guinea Benin Haiti West Bank and Gaza Niger Zimbabwe Equatorial Guinea Barbados Moldova Laos Fiji Swaziland Guinea Kyrgyz Republic Tajikistan Isle of Man Togo Rwanda Malawi Mauritania Mongolia 10,695 9,696 9,369 9,350 9,334 8,712 8,379 8,318 8,152 8,055 7,976 7,346 7,257 7,168 0.09% 0.08% 0.08% 0.08% 0.07% 0.07% 0.07% 0.07% 0.07% 0.06% 0.06% 0.06% 0.06% 0.06% 220 199 193 192 192 179 172 171 168 166 164 151 149 147 258 234 226 226 226 211 202 201 197 195 193 178 175 173 6,974 6,774 6,630 6,447 6,395 6,126 5,762 5,570 5,502 5,469 5,391 5,171 5,098 5,091 5,040 4,911 4,903 4,731 4,287 4,245 3,454 3,405 3,364 3,231 2,976 2906 2,855 2,810 2,731 2,689 2,441 2,326 2,265 2,203 2,131 2,072 1,888 1,880 0.06% 0.05% 0.05% 0.05% 0.05% 0.05% 0.05% 0.04% 0.04% 0.04% 0.04% 0.04% 0.04% 0.04% 0.04% 0.04% 0.04% 0.04% 0.03% 0.03% 0.03% 0.03% 0.03% 0.03% 0.02% 0.02% 0.02% 0.02% 0.02% 0.02% 0.02% 0.02% 0.02% 0.02% 0.02% 0.02% 0.02% 0.02% 143 139 136 133 131 126 118 114 113 112 111 106 105 105 104 101 101 97 88 87 71 70 69 66 61 60 59 58 56 55 50 48 47 45 44 43 39 39 169 164 160 156 155 148 139 135 133 132 130 125 123 123 122 119 118 114 104 103 83 82 81 78 72 70 69 68 66 65 59 56 55 53 51 50 46 45 90 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 Lesotho Central African Republic Suriname Sierra Leone Belize Cape Verde Eritrea Antigua and Barbuda Bhutan St. Lucia Maldives Burundi Guyana Djibouti Seychelles Liberia Gambia, The Grenada St. Kitts and Nevis St. Vincent and the Grenadines Samoa Comoros Timor-Leste Vanuatu Guinea-Bissau Solomon Islands Dominica Tonga Micronesia, Fed. Sts. Palau Marshall Islands Kiribati São Tomé and Príncipe 1,453 1,369 1,342 1,193 1,105 1,024 986 905 840 825 817 800 783 702 694 548 461 454 453 0.01% 0.01% 0.01% 0.01% 0.01% 0.01% 0.01% 0.01% 0.01% 0.01% 0.01% 0.01% 0.01% 0.01% 0.01% 0.00% 0.00% 0.00% 0.00% 30 28 28 25 23 21 20 19 17 17 17 16 16 14 14 11 9 9 9 35 33 32 29 27 25 24 22 20 20 20 19 19 17 17 13 11 11 11 428 399 382 349 341 301 286 279 244 232 145 144 76 57 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% Totales : 9 8 8 7 7 6 6 6 5 5 3 3 2 1 900,516 10 10 9 8 8 7 7 7 6 6 4 3 2 1 1,058,810 91