Universidad de Belgrano Las de tesinas Belgrano Facultad de Tecnología Informática Ingeniería en Informática Generación de código fuente en aplicaciones Web. Nº 226 Leonardo F. Tomé Tutor: Alejandro A. Vaisman Departamento de Investigaciones Agosto 2008 Tesinas Estilo decisionista matizado de gobierno. Agradecimientos “A mi hermano Pablo; a Enrique Molinari y a quienes de una u otra manera ayudaron a que este trabajo sea posible”. Tesinas Generación de código fuente en aplicaciones Web. Tesinas Generación de código fuente en aplicaciones Web. Índice Índice..................................................................................................................................................... 5 Resumen............................................................................................................................................... 7 Capítulo 1 – Introducción...................................................................................................................... 7 1.1 Contexto........................................................................................................................................ 7 1.2 Motivación..................................................................................................................................... 8 1.3 Contribución.................................................................................................................................. 8 1.4 Organización del documento......................................................................................................... 8 Capítulo 2 – Estado del arte.................................................................................................................. 8 2.1 Genexus........................................................................................................................................ 8 Modelo de desarrollo..................................................................................................................... 9 Tecnologías involucradas.............................................................................................................. 9 2.2 BackEnd Wizard.......................................................................................................................... 10 Modelo de desarrollo................................................................................................................... 10 Tecnologías involucradas............................................................................................................ 10 2.3 Otras herramientas...................................................................................................................... 10 ASPRunner Profesional............................................................................................................... 10 SQL2JAVA....................................................................................................................................11 Evolve...........................................................................................................................................11 Brightsword...................................................................................................................................11 2.4 Resumen......................................................................................................................................11 Capítulo 3 – La herramienta propuesta: Balmod..................................................................................11 3.1 Modelo de desarrollo................................................................................................................... 12 Lectura de metadatos.................................................................................................................. 12 Configuración de presentación.................................................................................................... 12 Generación de código................................................................................................................. 12 3.2 Tecnologías involucradas............................................................................................................ 13 3.3 Comparación de Balmod con herramientas similares................................................................. 13 3.4 Resumen..................................................................................................................................... 15 Capítulo 4 – Diseño de Balmod........................................................................................................... 15 4.1 Esquema general de Balmod...................................................................................................... 15 4.2 Técnica de generación “in-line code expansion”......................................................................... 15 4.3 Modelo de datos y procesos........................................................................................................ 16 Lector de Metadatos.................................................................................................................... 16 Generador de Código.................................................................................................................. 17 4.4 Ejemplos de funcionamiento....................................................................................................... 18 Funcionamiento general.............................................................................................................. 18 Generación de código................................................................................................................. 20 4.5 Resumen..................................................................................................................................... 21 Capítulo 5 – Ejemplo de uso............................................................................................................... 21 5.1 Caso de estudio........................................................................................................................... 21 Configuración.............................................................................................................................. 21 Lectura de metadatos.................................................................................................................. 22 Especificación.............................................................................................................................. 22 Generación de código................................................................................................................. 24 5.2 Análisis del código generado con Balmod................................................................................... 26 5.3 Resumen..................................................................................................................................... 27 Capítulo 6 – Trabajos futuros y conclusiones...................................................................................... 27 6.1 Trabajos futuros........................................................................................................................... 27 6.2 Conclusiones............................................................................................................................... 28 Tesinas Generación de código fuente en aplicaciones Web. Apéndice A – Ejemplo de una aplicación web..................................................................................... 28 Solicitud de datos al usuario............................................................................................................... 28 Validación de datos ingresados por el usuario.................................................................................... 29 Registro en la base de datos de la información ingresada................................................................. 29 Información del resultado de la operación.......................................................................................... 30 Apéndice B – Configuración de Balmod.............................................................................................. 30 Apéndice C – Conectividad de Balmod con motores de bases de datos............................................ 31 Apéndice D – Componentes Auxiliares............................................................................................... 33 Glosario:.............................................................................................................................................. 33 Bibliografía.......................................................................................................................................... 34 Tesinas Generación de código fuente en aplicaciones Web. Resumen Este trabajo presenta Balmod, una herramienta de software generadora de código fuente orientada al desarrollo de aplicaciones web que utilicen bases de datos. El principal objetivo de la aplicación consiste en acelerar el proceso de desarrollo de módulos de uso habitual en diferentes aplicaciones; básicamente altas, bajas y modificaciones. La generación automática de código fuente permite que las tareas que habitualmente son realizadas por un programador se realicen automáticamente generando archivos con código fuente destinado a resolver un determinado tipo de problemas de aparición recurrente. Se logra así disminuir los recursos de desarrollo necesarios, evitando el origen de errores de programación y aumentando la productividad. Una de las características distintivas de la herramienta aquí propuesta es la capacidad de operar independientemente del tipo de tecnología específica que desee utilizarse; ya sea en herramientas relativas a motores de bases de datos, lenguajes de programación o plataformas de ejecución. Capítulo 1 – Introducción 1.1 Contexto Actualmente no existen dudas de que el manejo de información automatizado proporciona beneficios deseados por cualquier clase de organización como lo son por ejemplo persistencia de información, búsquedas ágiles y eficientes de información, óptimo mantenimiento de datos y duplicación de datos instantánea entre otros. Con el desarrollo de internet; la utilidad de los sistemas informáticos se potenció considerablemente debido a la posibilidad de acceso a la información mediante cualquier computadora conectada a la red con un navegador (browser) instalado. En sus inicios la totalidad de la información publicada en internet estaba compuesta por páginas en formato HTML completamente estáticas lo que no hacía posible personalizar información publicando datos del interés de algún usuario en particular de acuerdo a las necesidades y/o posibilidades del mismo. Esa fue la causa en la que se originan los lenguajes de desarrollo de aplicaciones web. Los lenguajes de desarrollo de aplicaciones web permiten publicar en la red información de manera dinámica generando páginas HTML mediante el procesamiento de información concreta; esto permite, por ejemplo, que un usuario se conecte a un sitio web y que solicite información específica, luego el servidor web recibe esa solicitud, busca la información en alguna fuente de datos (por ejemplo una base de datos relacional), genera una página HTML que contenga la información solicitada y finalmente envía la página al usuario. En la figura 1.1 puede observarse un ejemplo tradicional de la arquitectura de una aplicación web. Figura 1.1 – Arquitectura de una aplicación web Tesinas Generación de código fuente en aplicaciones Web. El desarrollo de una aplicación web básicamente debe contemplar 3 componentes: un modelo de datos, una aplicación que envía información al cliente desde el servidor web y finalmente una aplicación que envíe información al servidor web desde el cliente. Para el modelo de datos mayoritariamente se utiliza un Sistema Administrador de Base de Datos Relacionales mediante el cual es posible manipular datos de una manera efectiva y eficiente. La aplicación que envía información al cliente desde el servidor puede ser implementada utilizando un lenguaje de programación de aplicaciones web como por ejemplo ASP, PHP o JSP. La aplicación que envía información al servidor desde el cliente puede ser implementada en lenguaje HTML. Dado que HTML básicamente se trata de un lenguaje orientado a la presentación de información y no al procesamiento de esta; se extendieron sus capacidades mediante el lenguaje Javascript para tal fin; para especificar la apariencia de la información presentada se le incluyó el procesamiento de archivos de estilos denominados CSS (Cascade Style Sheet). En el apéndice A se encuentra un simple ejemplo de una aplicación web en el que puede observarse como interactúan las tecnologías involucradas. 1.2 Motivación La aplicación descripta en el apéndice A muestra que son muchas las tecnologías necesarias para un desarrollo web; esta variedad de tecnologías provoca que la complejidad de un sistema de este tipo aumente provocando así el incremento de tiempos y costos de desarrollo. En todo proceso de desarrollo de software resulta de gran utilidad identificar previamente tareas recurrentes utilizadas en otros desarrollos. Considerando que toda aplicación que incluya un repositorio de datos debe proveer una vía para administrarlo y de acuerdo a la arquitectura expuesta en la figura 1.1 puede inferirse que una de las tareas presente en desarrollos web es el desarrollo de una aplicación que permita la administración de la información almacenada en las bases de datos del sistema web. A este tipo de aplicaciones tradicionalmente se los conoce como ABMs debido a que las operaciones básicas propias de la administración de información almacenada en bases de datos son Altas, Bajas y Modificaciones de datos. 1.3 Contribución La herramienta aquí presentada permite la generación automática de código fuente para aplicaciones ABMs independientemente del motor de base de datos de soporte con capacidad de generación en distintos lenguajes orientados a plataformas web. Su utilización permite generar aplicaciones con un esfuerzo considerablemente menor al necesario en la programación íntegramente manual en cualquier plataforma de ejecución compatible con Java Virtual Machine. 1.4 Organización del documento Inicialmente, en el Capítulo 2, serán descriptas herramientas similares a Balmod que reflejan el estado del arte en el campo de generación de código fuente. En el Capítulo 3 se describirá la funcionalidad de Balmod y se comparará con las herramientas presentadas anteriormente para establecer las similitudes, diferencias y contribuciones proporcionadas por cada herramienta focalizándose especialmente en Balmod. El Capítulo 4 presenta y describe el diseño de Balmod. En el Capítulo 5 se presenta un ejemplo de uso de Balmod sobre la generación de un ABM del que ya se encuentra desarrollada una versión mediante programación tradicional. En el capítulo 6 se proponen trabajos futuros y se formulan conclusiones. El Apéndice A presenta y describe un ejemplo práctico de una aplicación web. Los Apéndices B, C y D contienen información técnica que ejemplifica el funcionamiento de la aplicación. Capítulo 2 – Estado del arte En este capítulo se describen las principales herramientas de generación de código existentes. En particular fueron seleccionadas Genexus y Back End Wizard para estudiarlas en forma detallada. 2.1 Genexus Genexus es una herramienta desarrollada en Uruguay por ARTech que en 15 años en el mercado tecnológico comercializó más de 15000 licencias brindando servicios a 4500 clientes en 26 países de 4 continentes; su objetivo es asistir al analista y a los usuarios en todo el ciclo de vida de las aplicaciones. El paradigma de Genexus consiste en automatizar todo lo automatizable, lo que implica en el ciclo de vida de un sistema informático diseñar automáticamente una base de datos normalizada y generar y mantener la base de datos, los programas de aplicación y documentación autosuficiente. Tesinas Generación de código fuente en aplicaciones Web. Modelo de desarrollo El modelo de desarrollo utilizado por Genexus es el modelo de desarrollo incremental basado inicialmente en tres etapas; diseño, prototipación e implementación; posteriormente a la ejecución completa de estas etapas pueden desarollarse tareas de mantenimiento y de documentación. El ambiente de realización y prueba de diseño y prototipo utilizado es Windows NT/2000/XP. En la etapa de diseño el analista junto con el usuario elaboran una base de conocimientos en la que se incluyen reglas de negocio las cuales se representan mediante diferentes objetos propios de Genexus como pueden ser por ejemplo el objeto transacción mediante el cual es posible que un usuario pueda crear, modificar o eliminar información de la base de datos. Una vez finalizada esta etapa puede diseñarse en forma abstracta (independientemente del motor de bases de datos) un modelo de datos con base en la teoría de Bases de Datos Relacionales obteniéndose una base de datos en tercera forma normal. La siguiente etapa es la de prototipación y consiste en probar el modelo diseñado en un prototipo de Genexus. El prototipo de Genexus es una aplicación completa funcionalmente equivalente a la aplicación de producción. Durante esta etapa probablemente se detecten fallas en el diseño de la aplicación por lo que es posible regresar a la etapa anterior para corregir esas fallas. La tercera y última etapa dentro del modelo de desarrollo es la de implementación la cual se divide en dos subetapas: especificación y generación. En la subetapa de especificación se determinan tecnologías y características particulares propias de la tecnología seleccionada. En la subetapa de generación se produce y compila en código fuente. Debido a que Genexus utiliza una base de conocimientos para cumplir con su propósito es posible actualizar aplicaciones actualizando la base de conocimientos. Si se realizan cambios en la base de conocimientos de una aplicación ya implementada Genexus efectúa un análisis de impacto de los cambios realizados y ofrece la posibilidad de generar programas de conversión para la aplicación implementada o bien implementar nuevamente toda la aplicación. Debido a esta característica es de suma importancia no modificar manualmente el código fuente generado por Genexus porque de esta manera se producirían inconsistencias entre la base de conocimientos y la aplicación final lo que puede causar un nivel de inutilidad absoluto de la funcionalidad de mantenimiento de Genexus. Durante todo el proceso de desarrollo y mantenimiento de aplicaciones, Genexus elabora y mantiene un repositorio con documentación acerca de aplicación en cuestión. No solamente incluye la información propia de la base de conocimientos sino que además incluye toda la información inferida lógicamente. Tecnologías involucradas Actualmente existe una gran variedad de posibilidades para generar aplicaciones con Genexus; a continuación se enumeran todas las tecnologías con las que esta herramienta puede implementar aplicaciones. Las aplicaciones generadas por Genexus pueden ejecutarse en una gran variedad de plataformas: · Sistemas operativos: o IBM OS/400 o Linux o Uníx o Windows NT/2000/2003 Servers o Windows NT/2000.XP/CE · Plataformas web: o Java o ASP.NET o Visual Basic Script (ASP) o c/SQL o HTML o Web Services · Plataformas de ejecución: o JAVA o Microsoft .NET Los motores de bases de datos soportados por esta herramienta son: · IBM DB2 UDB · Informix · Miscrosoft SQL Server · MySQL Tesinas Generación de código fuente en aplicaciones Web. · Oracle · PostgreSQL. El código generado puede producirse en los siguientes lenguajes: · Java · C# · C/SQL · COBOL · RPG · Visual Basic · Embedded Visual Basic · Visual Fox Pro Las aplicaciones web pueden ejecutarse en los siguientes servidores: · Microsoft IIS · Apache · Web Sphere 2.2 BackEnd Wizard El húngaro Attila Zsigmond es el creador de BackEnd Wizard, una herramienta desarrollada unipersonalmente; la última versión de este producto data del año 2004, su principal objetivo es generar páginas web que permitan listar, buscar, insertar, modificar y eliminar registros en bases de datos. La herramienta se encuentra implementada en una arquitectura cliente/servidor en lenguaje PHP y si bien es una herramienta comercial puede utilizarse parcialmente de manera gratuita ingresando a www. backend-wizard.com . Modelo de desarrollo Backend Wizard genera scripts PHP que permiten administrar tablas soportadas en MySQL; su funcionamiento íntegramente basado en una aplicación web consiste en crear las tablas necesarias enviando a la herramienta los comandos SQL correspondientes, indicar características de presentación de cada uno de los campos de las tablas en cuestión (por ejemplo, seleccionar si un determinado campo se presentará como casilla de texto o como lista desplegable) y finalmente generar el script. Una vez que se genera el script es posible visualizarlo, utilizarlo y testearlo sin costo alguno; si el usuario lo desea puede descargar el script generado a cambio del pago de una subscripción temporal. El proceso de creación de scripts resulta ser realmente ágil con el uso de esta herramienta sin embargo Backend Wizard posee dos restricciones sobre el modelo de datos a utilizarse que disminuyen significativamente su utilidad; la primera restricción es que no recomienda el uso de campos que admitan valores nulos debido a que pueden generar fallas en la funcionalidad de búsqueda de registros; la segunda restricción establece que todas las tablas del modelo de datos deben poseer como clave primaria un campo autonumérico, esta restricción impacta significativamente sobre la variedad de modelos de bases de datos posibles de utilizar ya que restringe la cantidad de campos propios de la clave primaria impidiendo además que sea posible establecer claves foráneas de más de un campo. Tecnologías involucradas Como ya se mencionó anteriormente Backend Wizard genera scripts en código PHP y como motor de bases de datos utiliza MySQL; actualmente los scripts PHP pueden ejecutarse en servidores web Apache o Miscrosoft Internet Information Server bajo los sistemas operativos Windows, Linux y Unix. Los scripts PHP generan información en el servidor Web y la presentan al cliente en lenguaje HTML. 2.3 Otras herramientas La oferta de herramientas generadoras de código fuente es muy variada. En la página web www. codegeneration.net puede encontrarse un listado con aproximadamente 200 aplicaciones de este tipo; cada una posee características particulares que enriquecen o empobrecen su utilidad; a continuación se describen brevemente algunas de ellas. ASPRunner Profesional · Lenguaje de generación de código: ASP · Motores de bases de datos: Oracle, SQL Server, MS Access, DB2, MySQL 10 Tesinas · · · · · Generación de código fuente en aplicaciones Web. Genera base de datos: no Plataforma de ejecución: Windows 95/NT o superior Licencia: comercial Creador: Universal Data Solutions, Inc (USA) Pagina web: http://www.xlinesoft.com/asprunnerpro/ SQL2JAVA · Lenguaje de generación de código: Java · Motores de bases de datos: Oracle, MYSQL, HSQL y cualquier motor de base de datos que soporte JDBC · Genera base de datos: no · Plataforma de ejecución: compatible con JVM · Licencia: GPL · Creador: desarrollo conjunto de código abierto · Pagina web: http://sql2java.sourceforge.net/ Evolve · Lenguaje de generación de código: ASP.NET · Motores de bases de datos: Microsoft SQL Server 2000 o superior · Genera base de datos: no · Plataforma de ejecución: Windows 98 o superior · Licencia: Freeware · Creador: Joseph Cooney (USA) · Pagina web: http://www.dcooney.com/evolve/ Brightsword · Lenguaje de generación de código: ASP, PHP, JSP, ASP.NET · Motores de bases de datos: Microsoft Access™, MySQL, Oracle y Microsoft SQL Server · Genera base de datos: no · Plataforma de ejecución: .NET · Licencia: comercial · Creador: BrightSword Technologies Private Limited (India) · Pagina web: http://www.brightsword.com/ 2.4 Resumen En este capítulo se presentaron herramientas similares a Balmod. Se describieron en detalle Genexus y Backend Wizard detallando el modelo de desarrollo que utiliza cada una y las tecnologías con las que trabajan. También se describieron brevemente otras herramientas similares. En el capítulo 3 se describirá en detalle el modelo de desarrollo y las tecnologías incluidas en Balmod para luego comparar las tres herramientas descriptas en detalle. Capítulo 3 – La herramienta propuesta: Balmod Siempre que se implementa un modelo de datos relacional utilizando un motor de bases de datos es posible ingresar, modificar y eliminar datos en la base de datos mediante sintaxis SQL. Sin embargo, esta sintaxis no resulta práctica para el común de los usuarios finales por lo que en la mayoría de los casos en los que se utiliza una base de datos relacional también debe desarrollarse una aplicación que permita al usuario final administrar los datos de la base de datos sin que el mismo deba acudir a los tecnicismos de la sintaxis SQL. A este tipo de aplicaciones se los conoce como ABMs. Balmod es un software que permite agilizar el proceso de desarrollo de aplicaciones web focalizándose en la generación del código fuente de aplicaciones destinadas a administrar los contenidos de bases de datos relacionales lo que implica la generación del código fuente de un software que permita realizar altas, bajas y modificaciones en las diferentes tablas del modelo de datos en cuestión. En otras palabras; Balmod genera código fuente para ABMs. Para cumplir con su objetivo Balmod se basa en utilizar la información disponible del modelo de datos; a la información del modelo de datos (metadatos). El análisis de los metadatos permite deducir el formato 11 Tesinas Generación de código fuente en aplicaciones Web. de la información que será almacenada. Por ejemplo; si en el modelo de datos contamos con la tabla T1 que posee los campos A, B y C siendo A un campo que contiene caracteres, B un campo numérico y C un campo que almacena fechas es posible inferir que para realizar altas es necesario el ingreso de una cadena de caracteres, un número y una fecha por lo que automáticamente es posible generar un formulario que permita dar altas sobre la tabla T1 validando que la información ingresada por el usuario contenga el formato necesario. En este capítulo se presenta una descripción general de Balmod y se lo compara con las herramientas descriptas en el capítulo 2. En el capítulo 4 se describirá detalladamente el producto. 3.1 Modelo de desarrollo El desarrollo de una aplicación mediante Balmod consta de tres etapas: lectura de metadatos, configuración de presentación y generación de código. Lectura de metadatos En esta etapa se indica el modelo de datos que se utilizará junto con información necesaria para acceder al mismo (usuario de la base de datos, contraseña, etc.); una vez que Balmod se conecta a la base de datos presenta una lista con las tablas del modelo de datos en la que debe indicarse cuáles serán administradas mediante la aplicación a generar; posteriormente se procederá a la extracción de información de cada una de las tablas seleccionadas elaborando internamente un esquema que contempla características de los diferentes campos de las tablas y sus relaciones. En el Apéndice C se indican los metadatos requeridos por Balmod para interpretar el modelo de datos. Balmod considera por cada campo: · Pertenencia a clave primaria · Pertenencia a clave foránea · Tipo de dato · Tamaño · Admisión de valores nulos · Autonumeración del valor Configuración de presentación Una vez especificada la información que debe ser considerada para la generación de la aplicación el usuario tiene la posibilidad de seleccionar diferentes características de presentación de la información a publicar como por ejemplo la etiqueta de identificación de cada campo y tabla y el modo de selección de valores de claves foráneas, entre otros. Generación de código Finalmente se procede a la generación del código fuente, para ello el usuario debe indicar parámetros como la ubicación de los archivos generados, datos para la conexión a la base de datos por parte de la aplicación y ubicación de archivos que pudieran ser referenciados por el código generado como por ejemplo archivos de imágenes gráficas. Figura 3.1 – Flujo de datos en Balmod 12 Tesinas Generación de código fuente en aplicaciones Web. 3.2 Tecnologías involucradas La actual versión de Balmod está desarrollada con tecnología Java bajo su versión JRE 1.4.2 lo que permite su ejecución en múltiples plataformas; los parámetros de configuración deben indicarse mediante lenguaje XML permitiendo una configuración simple, precisa y portable. Balmod y el código fuente que produce realizan conexiones a bases de datos mediante el uso de objetos ODBC; actualmente todos los motores de bases de datos utilizados masivamente soportan conexiones mediante objetos ODBC como es el caso de MS SQL Server, MySQL, PostgreSQL, Informix, IBM DB2 y Oracle. En el apéndice C se detallan las características de conectividad de Balmod con los diferentes motores de bases de datos. Balmod genera código fuente en lenguaje PHP, puede ser ejecutado en cualquier servidor web que soporte esta tecnología como por ejemplo Linux, Uníx, Microsoft Windows, Novell NetWare, OS/2, AS/400 y Solaris. Además, Balmod está diseñado para generar código en lenguajes de desarrollo de aplicaciones web como por ejemplo ASP y JSP; si bien internamente no implementa métodos que soporten la generación de código en estos lenguajes contiene una especificación para generación de código mediante la cual es posible implementar métodos que soporten la generación de código en lenguajes ASP y JSP. En el capítulo 4 se describe el funcionamiento del generador de código de Balmod. Resumiendo: · Plataformas de ejecución de la herramienta: o Cualquiera compatible con JRE 1.4.2 (MS Windows, Linux, Uníx, entre otros) · Motores de bases de datos soportados: o Cualquiera compatible con ODBC (MS SQL Server, MySQL, DB2 entre otros) · Lenguajes del código fuente generado: o PHP o Posibilidad de extensión a ASP y JSP. 3.3 Comparación de Balmod con herramientas similares A continuación se presenta un cuadro comparativo en el que se incluyen características de las tres herramientas presentadas y descriptas en los capítulos 2 y 3. Las características consideradas son: · Arquitectura de aplicación generada: indica la disposición física y lógica de los componentes de la aplicación a ser generada. · Funcionalidad de las aplicaciones generadas: representa el universo de problemas que la aplicación generada es capaz de resolver. · Lenguajes: enumera los lenguajes de programación en los que puede generarse el código fuente. Solamente son considerados lenguajes de programación web. · Motores de bases de datos: enumera aquellos motores con los que la herramienta es compatible. · Plataforma de ejecución: indica la compatibilidad de la herramienta con software de base (sistemas operativos). · Generación de modelos de datos: indica si la herramienta genera automáticamente modelos de datos. Esta característica puede considerarse como una ventaja o una desventaja dependiendo de cada caso en particular. En aquellos casos en los que no se posea una base de datos generada es un ahorro de esfuerzo generarla automáticamente. En los casos en los que ya se posea una base de datos que quiera ser reutilizada en una nueva aplicación la generación automática impediría la reutilización generando un modelo que probablemente sea diferente al que se desea reutilizar. · Orientado a modificaciones manuales sobre el código generado: indica si los componentes generados automáticamente por la herramienta soportan modificaciones manuales. Si la herramienta utilizada está orientada al programador es porque se pretende que éste perfeccione y/o modifique el código generado en caso de que sea necesario por lo tanto el código fuente generado debe ser lo más simple, breve y conciso posible para permitir una clara interpretación del mismo; si el programador puede modificar el código fuente generado con un esfuerzo relativamente bajo tiene la posibilidad de explotar al máximo las capacidades del lenguaje de programación en cuestión adaptándolo a sus necesidades particulares. En el caso en el que la herramienta esté orientada al analista lo que debe cambiarse para perfeccionar una aplicación generada es el modelo lógico de la aplicación (en Genexus el modelo lógico es la base de conocimientos) y luego se genera nuevamente o se actualiza el código fuente pero el usuario en ningún momento entra en contacto con el código fuente por lo que no es necesario que posea conocimientos específicos del lenguaje de programación utilizado · Restricciones sobre el modelo de datos utilizado: indica si la herramienta es compatible o no con cualquier modelo de datos. · Modificación del modelo de aplicaciones generadas: indica si es posible generar nuevas aplicaciones 13 Tesinas Generación de código fuente en aplicaciones Web. modificando el modelo de una aplicación generada anteriormente. · Documentación de la aplicación generada: indica si la herramienta genera algún tipo de documentación de la aplicación generada. Genexus Backend-Wizard Balmod Arquitectura de stand alone y web aplicaciones generadas web web Funcionalidad de las general aplicaciones generadas ABM ABM Lenguajes (web) Java, ASP.NET, ASP, c/SQL PHP PHP extensible a ASP y JSP Motores de bases de datos IBM DB2 UDB, Informix, Miscrosoft SQL Server, MySQL, Oracle, PostgreSQL. My SQL Cualquiera compatible con ODBC Plataforma de ejecución MS Windows Entorno web Compatible con Java VM Genera modelo de datos SI NO NO Orientado a modificaciones manuales sobre el código generado NO SI SI Restricciones sobre el modelo de datos -- Claves primarias simples autonuméricas Modelo en 3º forma normal Modificación del modelo de aplicaciones generadas SI NO NO Documentación de la aplicación generada SI NO NO Del cuadro anterior, con respecto a Genexus, se destaca que: · Es la herramienta más poderosa de las presentadas. · Su aplicación no se limita solamente a la generación de ABMs orientados a web sino a la generación de aplicaciones en general. · Posee una amplia variedad en soporte a bases de datos y los lenguajes de generación de código. · No genera código en PHP. · Ejecuta solamente bajo plataforma MS Windows. · Genera automáticamente el modelo de base de datos. No permite utilizar modelos de datos ya generados. · No está orientado al programador; sino al analista. · Soporta la generación de código fuente sobre aplicaciones generadas anteriormente. · Genera documentación de la aplicación producida. Con respecto a Backend Wizard se destaca que: · Su aplicación se limita a la generación de ABMs orientados a web. · Soporta bases de datos MySQL y genera código fuente en PHP · Al funcionar en un entorno web puede considerarse que se trata de una herramienta que ejecuta en cualquier plataforma (si bien la aplicación ejecuta en un servidor un usuario puede acceder a la herramienta mediante cualquier navegador que se encuentre ejecutándose en cualquier sistema operativo). · Utiliza bases de datos existentes. No genera modelos de datos. · Está orientado al programador. · Las restricciones sobre el modelo de datos condicionan considerablemente su utilidad. 14 Tesinas Generación de código fuente en aplicaciones Web. Con respecto a Balmod se destaca que: · Posee una amplia variedad en soporte a bases de datos y a lenguajes de desarrollo de aplicaciones web. · Es multiplataforma. · Está orientado al programador. · Facilidad y rapidez de uso. 3.4 Resumen En este capítulo se presentó Balmod describiendo su modelo de desarrollo y las tecnologías que utiliza. También se comparó a Balmod con Backend Wizard y con Genexus destacando las características de cada una de las herramientas presentadas. Capítulo 4 – Diseño de Balmod Tal como se mencionó anteriormente, un ABM posee 3 funciones básicas: altas, bajas y modificaciones. Las operaciones de altas, bajas y modificaciones implican una serie de procedimientos comunes independientemente del modelo de datos utilizado. Por ejemplo, para realizar una alta en una tabla siempre deben realizarse como mínimo los siguientes pasos: · Solicitar los datos a cargar. · Validar los datos a cargar. · Cargar los datos en la tabla correspondiente. · Informar al usuario el resultado de la operación. Ese tipo de operaciones recurrentes posibilitan la generación automática de código fuente y en base a estas Balmod cumple con su propósito. 4.1 Esquema general de Balmod En el capítulo 4 de “Code Generation in Action” ([1]), Jack Herrington propone diferentes técnicas para generar código fuente. Tomando como referencia teórica esas técnicas Balmod implementa la denominada “inline code expansion”. La razón de su elección se basa justamente en la similitud de las operaciones recurrentes mencionadas anteriormente; durante el desarrollo de un ABM se cuenta principalmente con dos elementos: el modelo de datos y la lógica funcional. El resultado final se logra adaptando la lógica funcional al modelo de datos y ese es justamente el propósito de la técnica “inline code expansion”. 4.2 Técnica de generación “in-line code expansion” Esta técnica consiste en tomar una porción de código fuente base y adaptarla a requerimientos específicos. El código fuente base soluciona un problema específico en un entorno general identificando en su interior aquellos componentes que varían en cada caso particular mediante palabras clave o marcas especiales en el texto; este podría ser considerado un pseudocódigo. El generador de código debe analizar cada porción de código fuente base para luego modificarla de acuerdo a necesidades específicas reemplazando las marcas especiales por porciones de texto que se correspondan con los componentes específicos del caso particular de aplicación. En el ejemplo expuesto en [1] se presenta una caso en el que se desea generar automáticamente una porción de código en C++ que retorne en pantalla el resultado de una consulta SQL específica; esto implica conectarse a la base de datos, preparar la sentencia SQL, ejecutar la consulta, formatear el resultado de la consulta y mostrarlo en pantalla. Los subprocesos de conexión a la base de datos, ejecución de una consulta SQL, formateo de resultado de una consulta y presentación en pantalla básicamente realizan las mismas operaciones en casos diferentes independientemente de la forma de la consulta SQL es por eso que estos subprocesos pueden incluirse en el código fuente base. El código fuente base en este caso es: void main( int argc, char *argv[] ) { struct { char *first; char *last; } *sql_output_1; { 15 Tesinas Generación de código fuente en aplicaciones Web. db_connection *db = get_connection(); sql_statement *sth = db->prepare( “CONSULTASQL” ); sth->execute(); sql_output_1 = malloc( sizeof( *sql_output_1 )*sth->count()); for( long index = 0; index < sth->count(); index++ ) { // código para mostrar datos } } return; } Los requerimientos específicos en este caso se corresponden con una consulta SQL: SELECT first, last FROM names El resultado final es el siguiente: void main( int argc, char *argv[] ) { struct { char *first; char *last; } *sql_output_1; { db_connection *db = get_connection(); sql_statement *sth = db->prepare( “SELECT first, last FROM names” ); sth->execute(); sql_output_1 = malloc( sizeof( *sql_output_1 )*sth->count()); for( long index = 0; index < sth->count(); index++ ) { // código para mostrar datos } } return; } Nótese que la porción del código base que contenía el texto CONSULTASQL en el código generado fue reemplazada por SELECT first, last FROM names. El modelo de Herrington emplea archivos de texto plano como elementos de entrada al proceso de generación de código lo cual implica que deben ser interpretados mediante un parser; en Balmod tanto el modelo de datos como las porciones de código fuente base son representadas en clases para evitar el uso de un parser, obtener valores específicos de una forma más simple y además contar con las ventajas proporcionadas por el paradigma de programación orientada a objetos es por esa razón que se optó por Java como lenguaje para su implementación. 4.3 Modelo de datos y procesos De acuerdo a la técnica “inline code expansion” para la generación del código fuente son necesarios dos componentes: el código fuente base y los requerimientos específicos. Como ya se mencionó anteriormente, en el desarrollo de un ABM el código fuente base se corresponde con la lógica funcional y los requerimientos específicos se corresponden con el modelo de datos; estos dos componentes son representados en Balmod mediante dos módulos; un módulo que permite reconocer e interpretar el modelo de datos que utiliza una determinada base de datos denominado Lector de Metadatos y un módulo denominado Generador de Código que basándose en el modelo de datos obtenido genera el código fuente. Lector de Metadatos El lector de metadatos a partir de una conexión a una base de datos y de una serie de consultas SQL genera una colección de objetos que representan metadatos de la base de datos en cuestión. 16 Tesinas Generación de código fuente en aplicaciones Web. Figura 4.1 – Entradas y salidas del Lector de Metadatos El mecanismo es el siguiente: · Identifica las consultas SQL necesarias para el motor de base de datos en cuestión. · Se conecta a la base de datos. · Realiza las consultas correspondientes · Genera los objetos correspondientes con los resultados obtenidos En la figura 4.2 puede observarse en notación UML reducida el diagrama de clases que representa el modelo de datos; no se incluyen atributos y métodos de cada clase para simplificar el esquema. Los objetos correspondientes al modelo de datos se corresponden con este diagrama. Figura 4.2 – Diagrama de clases del modelo de datos Las clases involucradas son: · ModeloBDD: contiene la colección de tablas propias de la base de datos en cuestión. · MetadatosTabla: representa una tabla, contiene una colección de campos. · Campo: es una clase abstracta que representa el campo de una tabla; contiene atributos comunes a los campos como el nombre y el tamaño entre otros. · Tipos de datos: por cada tipo de datos existe una subclase que hereda de la clase Campo. Por ejemplo, para el tipo de dato entero (habitualmente conocido como int o integer) existe una subclase de Campo denominada CampoEntero que considera particularidades de este tipo de dato. · Clave: esta superclase considera restricciones de un campo. · ClavePrimaria y ClaveForanea: consideran restricciones de clave primaria y clave foránea respectivamente; la relación de composición con un objeto de la clase Clave existe para contemplar casos de campos que posean restricciones de clave primaria y foránea. Cada objeto que representa un componente del modelo de datos posee un conjunto de parámetros que pueden ser editados por el usuario permitiendo personalizar aspectos de la aplicación a generarse. Por ejemplo, la clase Campo posee un atributo denominado etiqueta mediante el cual el usuario puede asignar la etiqueta de identificación de cada campo en la aplicación generada. Generador de Código El generador de código toma como entradas el modelo de datos representado sobre objetos que genera el lector de metadatos y una serie de componentes auxiliares (ver Apéndice D) para producir los archivos de código fuente. 17 Tesinas Generación de código fuente en aplicaciones Web. Figura 4.3 – Entradas y salidas del Generador de Código Su funcionamiento consiste en generar por cada tabla del modelo de datos el grupo de archivos de código fuente necesario para realizar el ABM de esa tabla. También se encarga de generar archivos de código fuente de uso general como por ejemplo el menú principal de la aplicación o la librería de conexión a la base de datos. En la figura 4.4 puede observarse el diagrama de clases involucradas en el módulo generador de código. Figura 4.4 – Diagrama de clases del Generador de Código Los componentes involucrados son: · ModeloBDD: explicada anteriormente. · GeneradorArchivos: se encarga de crear archivos y directorios con el nombre y la ubicación correspondientes. Además, introduce en los archivos el código fuente proporcionado por algún objeto que implemente la interfaz GeneradorCodigo. · GeneradorCodigo: establece la interfaz que debe implementar una clase para poder producir código fuente en Balmod. En la siguiente sección se describe su funcionamiento. · Generadores: son clases que implementan la interfaz GeneradorCodigo proporcionando código fuente en un determinado lenguaje de programación. 4.4 Ejemplos de funcionamiento Funcionamiento general Se utilizará un ejemplo para aclarar el funcionamiento general de Balmod. Un caso concreto puede producirse en la elaboración de un sistema de registro de ventas. Es requisito del sistema que para registrar la venta de un artículo debe ingresarse un registro en la tabla VENTAS; la cual contiene los siguientes campos: · artículo: campo de texto que registra el artículo vendido. · monto: campo numérico que refleja el monto de la venta. · fecha: campo que almacena la fecha en la que ocurrió la venta. El modelo de datos está compuesto solamente por la tabla VENTAS; recopilando información sobre 18 Tesinas Generación de código fuente en aplicaciones Web. esta tabla estaremos en conocimiento de los requerimientos específicos de la aplicación. Una vez que el Lector de Metadatos interpreta la información del modelo de datos obtiene el siguiente diagrama de objetos: Figura 4.5 – Diagrama de objetos El diagrama representa a la tabla VENTAS y a los tres campos que la conforman; cada campo es un objeto perteneciente a una clase representante de un tipo de dato particular, en este caso existen instancias de las clases CampoTexto, CampoNumero y CampoFecha. Por otra parte tenemos conocimiento de la lógica funcional de un ABM; ésta debe contemplar: · Formularios de carga de datos. · Validación de los datos cargados y posterior registro según corresponda. · Listados de datos cargados. · Mecanismos para baja y modificación de datos. Los componentes de la lógica funcional de un ABM se corresponden con los métodos contenidos en la interfaz GeneradorCodigo. Así, por ejemplo, en la elaboración de un formulario para la carga de datos se dispone de un método que recibe como parámetro la tabla en cuestión y de acuerdo a la naturaleza de cada uno de los campos de la tabla genera el código correspondiente; si el campo es un número genera el código necesario para permitir el ingreso de números, si el campo es una fecha genera el código necesario para permitir el ingreso de una fecha y así sucesivamente. El pseudocódigo básico del método mencionado es el siguiente: funcion generarFormulario (MetadatosTabla mt) por cada campo c existente en mt imprimir (campo c) fin loop fin funcion El método imprimir(campo c) se ejecuta de acuerdo a la naturaleza del campo en cuestión. Cada tipo de dato contiene una implementación particular de este método, no es igual el código correspondiente a un campo numérico que el correspondiente a un campo de fecha. La aplicación determina en tiempo de ejecución - utilizando polimofirsmo - cual de todos los métodos ejecutar de acuerdo al tipo de objeto instanciado por el Lector de Metadatos. Si se une la lógica funcional general de un ABM junto con los requerimientos específicos particulares de la aplicación es posible determinar concretamente la lógica funcional para la aplicación particular. La misma en este caso sería: · Presentar un formulario para registrar ventas. El formulario debe permitir la carga de un artículo, el precio y la fecha correspondientes. · Evaluar que la información ingresada por el usuario se encuentre en el formato correcto. Es decir, que el campo artículo esté completado con una cadena de caracteres, que el campo precio contenga un número y que el campo fecha contenga una fecha válida. Si los datos son correctos debe procederse al registro de la venta, caso contrario deberá indicársele al usuario que dato debe corregir y como hacerlo. · Presentar al usuario un listado de las ventas registradas. · Proveer las herramientas necesarias para que el usuario pueda eliminar o modificar las ventas en las que detecte algún error en la información registrada. 19 Tesinas Generación de código fuente en aplicaciones Web. Generación de código El módulo de generación de código fuente en Balmod consiste en la implementación de una interfase en lenguaje Java denominada GeneradorCodigo; en esta interfase se incluyen los prototipos de una lista de métodos mediante los cuales es posible indicar la manera en la que un lenguaje en particular realiza una operación; todos los métodos retornan una cadena de caracteres o un conjunto de cadenas de caracteres y la gran mayoría recibe como argumento uno o varios objetos que representan componentes del modelo de datos como por ejemplo tablas, campos y claves primarias entre otros. Balmod incluye una implementación de la interfase GeneradorCodigo mediante la clase GeneradorCodigoPHP de la cual a continuación se expone la implementación de uno de los métodos propios de la interfase en el que se retorna un conjunto de cadenas de caracteres que contienen el código PHP necesario para conectarse a una base de datos. public ArrayList conexionBaseDeDatos() { ArrayList codigo = new ArrayList(); codigo.add(“<?php”); codigo.add(“// Conexión a la base”); codigo.add(“include(\”../includes/conexionODBC.php\”);”); codigo.add(“// Objeto de la base de datos”); codigo.add(“$baseDeDatos = new baseODBC();”); codigo.add(“$link_id = $baseDeDatos->conectar() or die(\”Se produjo el siguiente error al intentar conectarse a la base de datos:\” . $baseDeDatos->sqlError());”); codigo.add(“?>”); return codigo; } A continuación se presenta otro ejemplo de implementación de un método de la interfase GeneradorCodigo en el que se genera el código PHP para imprimir en formato HTML una lista de selección de valores correspondientes a una clave foránea compuesta por un campo (ClaveForaneaSimple); nótese que en este caso el método recibe como argumento un objeto que representa una clave foránea. public ArrayList imprimirSelectClaveForaneaCombo(ClaveForaneaSimple cf) { ArrayList codigo = new ArrayList(); String[] campos_a_mostrar = cf.getParametrosEditables().ArregloDeColumnas(); codigo.add(“<TR>” + this.etiquetaCampo(cf.campo) + “<TD>”); codigo.add(“<SELECT name=\”” + cf.campo.nombreEtiquetaHTML() + “\”>”); codigo.add(“<?php”); codigo.add(“//rellenado del SELECT”); codigo.add(“$resultado = $baseDeDatos->comandoSQL(\”select “ + cf.getColumnaForanea() + “,” + MetodosAuxiliares.unirStrings(campos_a_mostrar, “, “) + “ from “ + cf.getNombreTablaForanea() + “\”) or die(\”</select>Se produjo el siguiente error al intentar realizar una consulta a la base de datos:\”. $baseDeDatos->sqlError());”); codigo.add(“while ($linea = $baseDeDatos->generarLinea($resultado))”); codigo.add(“\techo \”<option value=$linea[“ + cf.getColumnaForanea() + “]>$linea[“ + MetodosAuxiliares.unirStrings(campos_a_mostrar, “] - $linea[“) + “]</option>\”;”); codigo.add(“\t$baseDeDatos->liberarRecordset($resultado)”); codigo.add(“?>”); codigo.add(“</SELECT>”); codigo.add(“</TD></TR>”); return codigo; } La interfase GeneradorCodigo está compuesta por 50 métodos y fue diseñada para soportar la implementación de generadores de código en lenguajes de desarrollo de aplicaciones web por lo que análogamente a la implementación del generador de código PHP pueden implementarse generadores para otros lenguajes como por ejemplo JSP o ASP. 20 Tesinas Generación de código fuente en aplicaciones Web. 4.5 Resumen El presente capítulo describió como Balmod cumple con su objetivo presentando la técnica “inline code expansion” y detallando el funcionamiento del Lector de Metadatos y del Generador de Código; sus dos principales componentes. Capítulo 5 – Ejemplo de uso En este capítulo se presenta un ejemplo de uso de Balmod para desarrollar un ABM sobre un modelo de datos sobre el que ya se encuentra desarrollado otro ABM de manera tradicional. Una vez finalizado el ejemplo serán comparados los resultados obtenidos desarrollando el ABM mediante la generación de código manual y mediante la generación de código automática utilizando Balmod. 5.1 Caso de estudio La aplicación desarrollada manualmente consiste en un ABM de componentes de hardware que permite administrar un inventario proporcionando información acerca del estado, ubicación y características de cada componente. Esta aplicación es un caso real desarrollado para el Departamento de Sistemas de la Universidad de Belgrano en el año 2003. En la figura 5.1 se presenta una porción del modelo relacional utilizado; para simplificar la presentación de la figura solamente se incluyen seis de los catorce componentes propios del modelo original. Figura 5.1 – Modelo Relacional Configuración Una vez definido el modelo de datos es necesario vincularlo a un origen de datos ODBC; la operatoria de este proceso puede variar dependiendo del sistema operativo utilizado pero en todos los vínculos 21 Tesinas Generación de código fuente en aplicaciones Web. ODBC debe indicarse un nombre para la conexión ODBC, un usuario y una contraseña. Con esos tres parámetros es suficiente para crear un vínculo ODBC, pero ese vínculo representa una conexión a una instancia de un motor de bases de datos y no a una base de datos específica almacenada en ese motor. Para un correcto funcionamiento de Balmod es necesario además indicar la base de datos que inicialmente será utilizada por el vínculo ODBC. Lectura de metadatos Al disponer de un vínculo ODBC ya se cuenta con la principal fuente de datos para utilizar Balmod. En la figura 5.2 puede observarse la primera pantalla que se presenta al iniciar la ejecución de la aplicación; en ella debe indicarse el archivo XML que contiene información de acceso al catálogo de la base de datos utilizada (en el Apéndice C se describe este tipo de archivos) y los datos del enlace ODBC. En el presente ejemplo se utiliza un modelo de datos implementado en SQL Server con un componente ODBC denominado inventario. Figura 5.2 – Conexión a base de datos Especificación El siguiente paso consiste en seleccionar las tablas del modelo de datos para las que se desea generar el código fuente; la figura 5.3 describe este paso. 22 Tesinas Generación de código fuente en aplicaciones Web. Figura 5.3 - Selección de tablas Luego puede observarse la estructura de cada tabla seleccionada en el paso anterior tal como puede apreciarse en la figura 5.4 en la que se presenta la composición de la tabla dispositivos. En esta pantalla también es posible definir el texto (etiqueta) mediante el cual se identificará a la tabla en cuestión en los títulos e identificadores del código generado y por cada campo de la tabla puede indicarse si el mismo será incluido en los listados de presentación de los datos cargados en el código generado. Figura 5.4 - Detalle de tablas 23 Tesinas Generación de código fuente en aplicaciones Web. También es posible visualizar y configurar información específica de cada campo. En la figura 5.5 se observa el detalle del campo idubicacion de la tabla dispositivos; en este caso es posible indicar la etiqueta de identificación del campo (como en todos los campos) y al tratarse de un campo que forma parte de una clave foránea también pueden indicarse formas de selección de los valores almacenados en las tablas referenciadas por la clave foránea durante una operación de alta o modificación. De acuerdo a la configuración indicada en la figura 5.5 la etiqueta para el campo idubicacion de la tabla dispositivos será ubicación de dispositivos y la selección de los valores almacenados en tablas referenciadas por claves foráneas se realizará mediante listas desplegables que por cada opción disponible indicarán el sector y la ubicación de la opción en cuestión. Figura 5.5 - Detalle de campo Generación de código Finalizada la configuración de la presentación y el funcionamiento de las tablas y campos solamente restan indicar unos pocos parámetros antes de generar el código fuente. Como puede observarse en la figura 5.6 los parámetros que deben indicarse son los siguientes: · Parámetros ODBC (ODBC, usuario, password): son parámetros similares a los de la primera pantalla pero en este caso se especifican aquellos que serán utilizados para conectarse a la base de datos desde la aplicación web generada. · Directorio destino: es el directorio en el que se ubicarán los archivos generados. · Archivos de código fuente: es el directorio en el que se encuentran archivos auxiliares (estos archivos se describen en el Apéndice D). · Disposición de marcos (frames): es la disposición en pantalla de los marcos HTML presentados por el código generado. Es posible colocar el marco con el menú general en el extremo superior de la pantalla o en el extremo izquierdo de esta. En la figura 5.7 se presenta el cuadro de diálogo desplegado por esta opción. 24 Tesinas Generación de código fuente en aplicaciones Web. Figura 5.6 - Generación de código Figura 5.7 - Disposición de marcos Posteriormente se generan los archivos con código fuente mediante el botón generar archivos; Balmod como mínimo genera cuatro archivos por cada tabla del modelo de datos seleccionada, un archivo administra altas, otro administra modificaciones, un tercero administra bajas y presenta listados y finalmente el cuarto contiene los marcos HTML incluyendo a los tres archivos anteriores; de acuerdo a parámetros 25 Tesinas Generación de código fuente en aplicaciones Web. específicos de cada tabla podrían generarse más archivos, como el caso en el que se opta por definir valores de claves foráneas mediante un buscador. También se generan archivos de uso global como el archivo que contiene el menú de opciones o el archivo que contiene información de conexión a la base de datos. En la figura 5.8 puede observarse la administración de la tabla dispositivos durante la ejecución de la aplicación generada en el navegador Mozilla Firefox utilizando Microsoft Internet Information Server como servidor web. Figura 5.8 - Ejemplo de ABM 5.2 Análisis del código generado con Balmod En la reproducción del ABM de administración de inventario se generaron automáticamente 138 archivos con código fuente que en total tienen un tamaño de 342 Kbytes (aproximadamente 350.000 caracteres) en 15 minutos; el desarrollo del proyecto original mediante programación manual demandó aproximadamente 150 horas. Existen factores que pueden incrementar el tiempo de desarrollo de un ABM con Balmod como por ejemplo la definición de aspectos estéticos diferentes a los utilizados por defecto pero las operaciones íntegramente ligadas a la lógica funcional de la aplicación decididamente son menos costosas y más rápidas de implementar utilizando Balmod en lugar de programarlas manualmente y este tipo de operaciones son recurrentes en cualquier ABM. La cantidad de archivos generados es directamente proporcional a la cantidad de entidades que se administrarán mediante el ABM dado que se genera un directorio con al menos cuatro archivos por cada entidad. El directorio lleva el nombre de la entidad correspondiente. Los archivos generados en cada uno de estos directorios son: · alta_[nombre de la entidad].php: contiene el formulario para dar de alta registros de la entidad correspondiente; este formulario se encuentra vinculado a las funciones de validación de los campos y si los datos ingresados son correctos realiza el registro de datos mediante el archivo listado_[nombre de la entidad].php. · modificacion_[nombre de la entidad].php: contiene el formulario para modificar registros de la entidad correspondiente; este formulario se encuentra vinculado a las funciones de validación de los campos y si los datos ingresados son correctos realiza la modificación de datos mediante el archivo listado_[nombre de la entidad].php. · listado_[nombre de la entidad].php: presenta un listado con todos los registros correspondientes 26 Tesinas Generación de código fuente en aplicaciones Web. cargados. En este archivo, además, se incluye la funcionalidad para dar de alta registros o realizar modificaciones de acuerdo a la información recibida de los dos archivos mencionados anteriormente. También almacena las instrucciones necesarias para dar de baja registros. · index.html: este archivo es un frameset en lenguaje HTML que contiene los tres archivos mencionados anteriormente. Por cada ABM generado, además, se producen una serie de directorios cuya cantidad no varía de acuerdo a la cantidad de entidades utilizadas que contienen información general para toda la aplicación. Estos directorios son: · JS: contiene funciones en lenguaje javascript; principalmente son funciones de validación. · CSS: contiene hojas de estilo para determinar el aspecto visual de la aplicación. · IMG: contiene las imágenes utilizadas en la aplicación. · includes: contiene librerías de uso común en los diferentes componentes de la aplicación como por ejemplo las librerías con las que la aplicación interactúa con el motor de base de datos. Finalmente, también son generados 3 archivos independientemente de la cantidad de entidades del modelo de datos y generales para toda la aplicación: · index.html: Contiene la página web inicial de la aplicación. · Encabezado.html: Contiene el menú general de la aplicación. · Reporte.log: contiene información acerca de los archivos generados automáticamente. De acuerdo a la estructura de archivos generados el usuario puede realizar modificaciones que afecten a toda la aplicación o solamente a una parte de esta. Si desea modificar la administración de una entidad en particular deberá modificar los archivos almacenados en el directorio correspondiente a la entidad en cuestión. Si desea realizar un cambio general puede hacerlo modificando aquellos archivos que no se encuentran dentro de un directorio propio de una entidad; es decir, aquellos archivos que contienen información general para toda la aplicación. 5.3 Resumen En este capítulo se presentó un ejemplo de uso de Balmod en el que se describen uno a uno los pasos necesarios para generar un ABM automáticamente. Capítulo 6 – Trabajos futuros y conclusiones En este capítulo se mencionan posibilidades acerca de futuros trabajos a realizar tomando como punto de partida la versión actual de Balmod y se presentan conclusiones finales. 6.1 Trabajos futuros Balmod fue cuidadosamente diseñado para adaptarse fácilmente futuros cambios; su diseño se ajusta al uso de patrones de diseño orientado a objetos. Esto se debe a que desde su concepción se propuso desarrollar una herramienta dinámica que tenga la capacidad de poder adaptarse con el paso del tiempo a la mayor cantidad de necesidades que pudieran surgir de los diferentes usuarios. La primera propuesta a trabajos futuros consiste en realizar un estudio estadístico en el que se contemplen cuales son las funcionalidades comúnmente requeridas a sistemas ABM que no sean satisfechas por Balmod. Una vez clasificadas esas necesidades se tiene un punto de partida para contemplar futuros cambios en la herramienta. Basándose en la propuesta anterior pueden surgir cambios que seguramente impactarán en alguno de los dos principales módulos de Balmod: el lector de metadatos y el generador de código. Actualmente lector de metadatos reconoce cinco formatos de campos (en el Apéndice C se los menciona y describe); un futuro cambio podría consistir en ampliar la cantidad de formatos de campos reconocidos por Balmod. Con respecto al generador código surge una serie de numerosas posibilidades entre las que se destacan: · Implementación de generación de código en otros lenguajes de desarrollo de aplicaciones web: actualmente Balmod genera código en lenguaje PHP pero soporta la generación de código fuente en otros lenguajes similares como ASP y JSP. · Diseño e implementación de generación de código en cualquier lenguaje de programación: reutilizando el lector de metadatos utilizado en Balmod existe la posibilidad de generar código en cualquier lenguaje de programación. 27 Tesinas Generación de código fuente en aplicaciones Web. · Diseño e implementación de módulos generadores de consultas a la base de datos: Balmod genera código fuente para aplicaciones ABMs pero no genera código que pueda utilizarse para realizar consultas específicas sobre el modelo de datos en cuestión; esta sería una funcionalidad de gran utilidad. 6.2 Conclusiones De acuerdo a lo expuesto en los capítulos anteriores, se concluye en que Balmod es una herramienta que facilita considerablemente el desarrollo de aplicaciones web que utilizan bases de datos mediante la reducción de tiempo y esfuerzo de producción, lo que se traduce en decremento de costos. No cuenta con la totalidad de las posibilidades brindadas por otras herramientas de vanguardia similares (como por ejemplo Genexus) pero una oferta de posibilidades más reducida implica en este caso mayor facilidad de uso. Al tratarse de una herramienta que define y acota claramente cual es su fin para el usuario resulta ser una herramienta de uso simple y rápido. El paso del tiempo y futuras evoluciones de Balmod determinarán si se sacrifica o no practicidad y facilidad de uso a favor de una mayor oferta de posibilidades que contemplen situaciones o funciones más específicas u orientadas a ámbitos diferentes a la generación de ABMs. Apéndice A – Ejemplo de una aplicación web En una aplicación web la mayor parte de la lógica de negocio se encuentra implementada en el servidor web; éste interactúa con un motor de bases de datos para generar información y presentarla en el cliente web. Se tomará como ejemplo una aplicación web que se encargue de insertar registros en una base de datos. Las funciones que debe cumplir la aplicación son: · Solicitar datos al usuario. · Validar los datos ingresados por el usuario. · Registrar en la base de datos los datos ingresados por el usuario. · Informar al usuario el resultado de la operación. Solicitud de datos al usuario Para esta función se utiliza un archivo HTML; en este caso se lo denominará form.html y su contenido es el siguiente: <HTML> <HEAD> <TITLE> Alta de registros </TITLE> </HEAD> <BODY> <FORM METHOD=POST ACTION=”alta.php” NAME=”formulario”> <CENTER>Ingrese el nombre que desea registrar: <INPUT TYPE=”text” NAME=”nombre”><BR> <INPUT TYPE=”submit” value=”grabar”></CENTER> </FORM> </BODY> </HTML> El aspecto visual del archivo es el siguiente: Figura F.1 – Aspecto visual de form.html En la operación de la aplicación se le presenta al usuario el formulario para ingresar datos y al hacer clic sobre el botón grabar se procede a registrar el nombre ingresado; la función de registro es realizada por el código contenido en el archivo alta.php tal como se indica en el parámetro ACTION de la etiqueta FORM. 28 Tesinas Generación de código fuente en aplicaciones Web. La apariencia de la página HTML puede especificarse mediante un archivo CSS; en este caso se utiliza estilos.css que contiene lo siguiente: BODY { color: red; } El código indica que todo el texto que se encuentre dentro de la etiqueta BODY debe ser de color rojo. Con la siguiente instrucción dentro del código HTML es posible incluir el archivo CSS dentro del archivo HTML: <link href=”estilos.css” rel=”stylesheet” type=”text/css”> Validación de datos ingresados por el usuario En la mayoría de los casos es deseable validar la información ingresada por el usuario para asegurar que esta cuenta con la forma adecuada. En este caso no se procederá al registro de la información si el usuario no completa con ningún nombre el casillero correspondiente Teóricamente este tipo de funcionalidades debería ejecutarse en el servidor web pero en la práctica por razones de performance es preferible que la ejecución se realice en el cliente para disminuir el procesamiento en el servidor web; recordemos que un servidor web puede estar respondiendo a solicitudes de múltiples usuarios simultáneamente. Para validar los datos ingresados se utilizará código Javascript que en este caso se almacena en el archivo validar.js que contiene lo siguiente: function validar() { if (document.formulario.nombre.value==””) { alert(“Debe ingresar un nombre”); return false; } return true; } En el archivo form.html deben realizarse alguno ajustes para incluir la funcionalidad proporcionada por el archivo javascript; su contenido pasa a ser el siguiente (se resalta el código ingresado): <HTML> <HEAD> <TITLE> Alta de registros </TITLE> </HEAD> <SCRIPT LANGUAGE=”JavaScript” src=”validar.js”></SCRIPT> <BODY> <FORM METHOD=POST ACTION=”alta.php” NAME=”formulario” onsubmit=”return validar()”> <CENTER>Ingrese el nombre que desea registrar: <INPUT TYPE=”text” NAME=”nombre”><BR> <INPUT TYPE=”submit” value=”grabar”></CENTER> </FORM> </BODY> </HTML> Si el usuario no completa el casillero adecuadamente la aplicación no envía información al servidor web y se advierte al usuario con la leyenda ”Debe ingresar un nombre”. Registro en la base de datos de la información ingresada En el caso en el que el usuario complete correctamente el casillero con el nombre a registrar se procederá a la grabación del nombre en la base de datos (en este caso un motor de bases de datos MySQL); esta operación es realizada por el código fuente PHP almacenado en el archivo alta.php que debe ubicarse en el servidor web y contiene lo siguiente: <?php var $conexion; $conexion = mysql_connect(“host”,”usuario”,”password”); mysql_query(“insert into nombres values(‘$_POST[nombre]’)”, $ conexion); mysql_close($conexion); ?> 29 Tesinas Generación de código fuente en aplicaciones Web. Lo que hace el código es conectarse a la base de datos; realizar la consulta SQL para registrar el nombre y cerrar la conexión abierta anteriormente. Información del resultado de la operación Finalmente, es deseable que se le informe al usuario del resultado de la operación realizada; para ello es necesario incluir código HTML en el archivo que contiene código PHP de la siguiente manera: <?php var $conexion; $conexion = mysql_connect(“host”,”usuario”,”password”); mysql_query(“insert into nombres values(‘$_POST[nombre]’)”, $conexion) or die(“<H1>Se produjo un error.</H1>”); mysql_close($conexion); ?> <HTML> <BODY> <H1>La operación finalizó exitosamente</H1> </BODY> <HTML> El servidor web en ningún momento le envía al cliente código fuente que no sea HTML; de esta manera en el caso anterior el cliente puede recibir: <HTML> <BODY> <H1>La operación finalizó exitosamente</H1> </BODY> <HTML> O bien puede recibir: <HTML> <BODY> <H1>Se produjo un error.</H1> </BODY> </HTML> Apéndice B – Configuración de Balmod Previo a la ejecución de la aplicación es necesario configurar una serie de parámetros, algunos son de vital importancia para el correcto funcionamiento de Balmod. La configuración general se realiza mediante un archivo en formato XML llamado configuración.xml; la definición del documento XML se encuentra en el archivo configuración.dtd. Ambos archivos se encuentran almacenados en el directorio principal de la aplicación. A continuación se describen cada uno de los parámetros contenidos en el archivo de configuración: · Pathdestino: ubicación por defecto en la que se creará el directorio con los archivos de código fuente generado (puede modificarse durante la ejecución del programa). · Proyecto: nombre del directorio en el que se ubicarán todos los archivos generados. · Fuentes: ubicación de archivos que deben incluirse dentro de la aplicación web generada (en el Apéndice D se describe la naturaleza de estos archivos). · MotoresBDD: ubicación donde se encuentran los archivos con información de lectura de los metadatos de las bases de datos (en el Apéndice C se describen estos archivos) · DTDs: ubicación donde se encuentran archivos con definición de tipos de datos para documentos XML (DTD); en este directorio se encuentra el archivo InterfaceBDD.dtd (ver Apéndice C). · ODBC: nombre por defecto del objeto ODBC (puede modificarse durante la ejecución del programa). · Usuario: nombre por defecto del usuario con permiso de acceso a la base de datos (puede modificarse durante la ejecución del programa) · Password: contraseña por defecto utilizada para acceder a la base de datos con el usuario indicado en el parámetro anterior (puede modificarse durante la ejecución del programa). 30 Tesinas Generación de código fuente en aplicaciones Web. Ejemplo de la información que debe contener un archivo de configuración de Balmod. <?xml version=”1.0”?> <!DOCTYPE configuracion SYSTEM “configuracion.dtd”> <configuracion> <pathdestino>C:\inetpub\wwwroot\</pathdestino> <proyecto>generado</proyecto> <fuentes>d:\archivos autoABM\Archivos fuente</fuentes> <motoresBDD>D:\archivos autoABM\motores</motoresBDD> <DTDs>D:\archivos autoABM\DTDs</DTDs> <ODBC>sis</ODBC> <usuario>sa</usuario> <password>123456</password> </configuracion> Apéndice C – Conectividad de Balmod con motores de bases de datos Tanto Balmod como el código que genera efectúan todas las conexiones a bases de datos mediante componentes ODBC lo que garantiza que cualquier motor de bases de datos que cumpla con ese estándar de acceso funcione sin inconvenientes. Las consultas SQL realizadas por el código generado por Balmod utilizan el estándar ANSI SQL lo que garantiza que sean interpretadas por cualquier motor de bases de datos que respete ese estándar. Tanto el estándar ODBC como el estándar ANSI SQL son implementados por todos los motores de bases de datos que dominan el mercado; por otra parte, la mayoría de los lenguajes de programación (y en particular PHP, ASP y JSP) soportan conectividad mediante componentes ODBC. Para que Balmod interprete correctamente los diagramas de datos almacenados en cada base de datos es necesario indicarle mediante un archivo escrito en lenguaje XML la manera de acceder a la información que contiene la estructura de la base de datos a ser utilizada; tradicionalmente esta información se encuentra en lo que se denomina catálogo de la base de datos. Por otra parte también es necesario indicarle en el mismo archivo XML la identificación que utiliza el motor de base de datos en cuestión para cada tipo de dato correspondiente a un campo de una tabla. Para conocer la estructura de la base de datos son necesarias las siguientes consultas (el orden de los datos devueltos por cada consulta debe respetarse): · Tablas: por cada tabla debe retornar un registro que indique nombre e identificador de cada una de las tablas de la base de datos. · Campos: dada una tabla (dentro de la consulta debe indicarse la tabla mediante la constante ##TABLA##, al momento de procesarse la consulta la constante es reemplazada por el valor correspondiente) por cada campo que contenga debe retornar un registro que indique nombre, identificación, longitud, admisión de nulos y propiedad de autonumeración del mismo. · claves_primarias: dada una tabla debe retornar por cada campo perteneciente a la clave primaria un registro que contenga el identificador correspondiente al campo en cuestión. · claves_foráneas: dada una tabla debe retornar por cada campo perteneciente a una clave foránea un registro indicando nombre del campo local, identificador del campo local, identificador de la tabla foránea, identificador de la columna foránea, nombre de la tabla foránea y nombre de la columna foránea. · columnas_tabla_clave_foranea_foranea: dada una tabla retorna por cada campo foráneo a cada una de los campos foráneos de la tabla dada un registro con el nombre del campo. · foraneas_inversas: dada una tabla por cada campo que se relaciona como campo foráneo de la tabla dada retorna un registro que contiene nombre del campo referenciado, identificador del campo referenciado, identificador de la tabla referenciadora, identificador de la columna referenciadora, nombre de la tabla referenciadora y nombre de la columna referenciadora. Balmod trabaja con seis tipos de datos diferentes; si en el modelo de datos se utilizara un tipo de datos no contemplado por Balmod el mismo será ignorado. Para indicar la identificación que utiliza el motor de base de datos en cuestión para cada tipo de dato se utilizan las instrucciones: · entero: números enteros · racional: números racionales 31 Tesinas Generación de código fuente en aplicaciones Web. · · · · cadenacaracteres: cadenas de caracteres de longitud fija. Cadenacaracteresvariable: cadenas de caracteres de longitud variable. Fecha: campos de fecha Booleano: campos booleano (si/no, verdadero/falso, etc.). No todos los motores de bases de datos permiten el acceso a su catálogo mediante consultas SQL; un ejemplo son las versiones antiguas del motor de base de datos MySQL (la versión 5.0 de reciente lanzamiento si permite el acceso al catálogo mediante consultas SQL). No obstante con Balmod es posible ingresar el modelo de datos creando tablas que simulen el catálogo para posteriormente cargarlas con los datos deseados y posteriormente realizar las consultas SQL sobre esas tablas. A continuación se presenta un ejemplo con la información que debe contener un archivo de configuración para utilizar el motor de base de datos MS SQL Server. <?xml version=”1.0”?> <!DOCTYPE InterfaceBDD SYSTEM “../DTDs/interfaceBDD.dtd”> <InterfaceBDD motor=”SQLServer”> <consultas> <tablas>select name as tabla, id as id from sysobjects where xtype=’u’ and name!=’dtproperties’ order by name</tablas> <campos>select c.name,c.colid,t.xtype,c.length,c.isnullable,c.colstat from syscolumns c, systypes t where t.xtype=c.xtype and c.id=##TABLA## order by colid</campos> <claves_primarias>select ik.colid, ik.colid from sysobjects o join sysindexes i on i.id=o. parent_obj and i.name=o.name join sysindexkeys ik on ik.id=o.parent_obj and ik.indid=i.indid where o.xtype=’PK’ and o.parent_obj=##TABLA##</claves_primarias> <claves_foraneas>select c.name as columna, c.colid, o.id as idtablaforanea, cf.colid as idcolumnaforanea, o.name as tablaforanea, cf.name as columnaforanea from sysforeignkeys f join syscolumns c on c.id=f.fkeyid and f.fkey=c.colid join sysobjects o on o.id=f.rkeyid join syscolumns cf on cf.id=f. rkeyid and f.rkey=cf.colid where f.fkeyid=##TABLA##</claves_foraneas> <columnas_tabla_clave_foranea>select cf.name, cr.name, o.name from sysobjects o,syscolumns cf, syscolumns cr, sysforeignkeys f where f.fkeyid=cf.id and f.fkey=cf.colid and f.fkeyid=cr. id and f.fkey=cr.colid and o.id=f.rkeyid and fkeyid=##FORANEAS##</columnas_tabla_clave_foranea> <foraneas_inversas>select c.name as columna, c.colid, o.id as idtablareferenciadora, cf.colid as idcolumnareferenciadora, o.name as tablareferenciadora, cf.name as columnareferenciadora from sysforeignkeys f join syscolumns c on c.id=f.rkeyid and f.rkey=c.colid join sysobjects o on o.id=f.fkeyid join syscolumns cf on cf.id=f.fkeyid and f.fkey=cf.colid where f.rkeyid=##TABLA##</foraneas_inversas> </consultas> <tipos_campos> <entero>56</entero> <racional>62</racional> <cadenacaracteres>167</cadenacaracteres> <cadenacaracteresvariable>175</cadenacaracteresvariable> <fecha>61</fecha> <booleano>104</booleano> </tipos_campos> </InterfaceBDD> 32 Tesinas Generación de código fuente en aplicaciones Web. Apéndice D – Componentes Auxiliares El código fuente producido por Balmod no es generado en su totalidad; existen componentes que son necesarios y reutilizables prácticamente en cualquier proyecto; por ejemplo, las funciones de validación en lenguaje Javascript pueden reutilizarse sin sufrir alteraciones, la validación de un número entero solamente contemplará que el usuario ingrese mediante su teclado uno o varios dígitos y no cualquier otro carácter; esa validación no debería cambiar su funcionalidad en otros sistemas. A este tipo de componentes se los denomina componentes auxiliares. Los componentes auxiliares son archivos que contienen determinada información que en el momento en el que Balmod genera el código fuente son copiados dentro de directorios propios del proyecto en construcción. Existen tres tipos de componentes auxiliares: · Imágenes: son archivos que contienen imágenes gráficas · Hojas de estilo: archivos que contienen información de presentación en formato CSS · Funciones Javascript: archivos que contienen funciones Javascript Las imágenes deben incluirse dentro de un directorio denominado IMG, las hojas de estilo dentro de uno denominado CSS y las funciones Javascript dentro de uno denominado JS. Los tres directorios deben tener la misma ubicación. Balmod implementa los tres tipos de componentes pero el usuario si lo desea puede modificar la información de éstos para personalizar su aplicación. Glosario: · Aplicación Stand Alone (auto soportada): Es una aplicación que –a excepción de software base- no depende de otras aplicaciones o componentes para funcionar. · Aplicación web: Es aquella que los usuarios usan desde un servidor web a través de internet o de una Intranet. Las aplicaciones web son populares debido a la ubicuidad del navegador (browser) como un cliente. La habilidad para actualizar y mantener aplicaciones web sin distribuir e instalar software en miles de potenciales clientes es otra razón de su popularidad. · ASP (Active Server Pages): es un producto de Microsoft lanzado al mercado en 1996; funciona solamente bajo plataformas Windows. Actualmente forma parte de la plataforma de desarrollo .NET mediante su versión ASP.NET 2.0. · Base de Datos Relacional: es un modelo de base de datos en la que se especifican relaciones entre registros de diferentes tablas. Actualmente es el modelo más utilizado para modelar problemas reales y administrar datos dinámicamente; fue propuesto por Edgar Frank Codd en 1970. · C++: es un lenguaje de programación diseñado a mediados de los años ochenta por Bjarne Stroustrup como extensión del lengueje de programación C. · Catálogo de base de datos: Es un repositorio de información en el que se especifican metadatos de una base de datos, es decir información específica acerca de la naturaleza de los datos contenidos en la base de datos. · Código fuente: es un conjunto de líneas de caracteres que conforman un bloque de texto que genera un programa mediante un compilador o intérprete para ser ejecutado por una computadora. · CSS (Cascade Style Sheet – Hojas de Estilo en cascada): es un lenguaje formal usado para definir la presentación de un documento estructurado escrito en HTML o XML (y por extensión en XHTML). El W3C (World Wide Web Consortium) es el encargado de formular la especificación de las hojas de estilo que servirá de estándar para los agentes de usuario o navegadores. · GPL (General Public License): es una licencia orientada principalmente a los términos de distribución, modificación y uso de software. Su propósito es declarar que el software cubierto por esta licencia es software libre. · HTML (HyperText Markup Language – Lenguaje de Marcas de HiperTexto): es un lenguaje diseñado para estructurar textos y presentarlos en forma de hipertexto, que es el formato estándar de las páginas web. Gracias a Internet y a los navegadores como Explorer, Mozilla, Firefox o Netscape, el HTML se ha convertido en uno de los formatos más populares que existen para la construcción de documentos. · Javascript: es un lenguaje interpretado orientado a las páginas web, con una sintaxis semejante a la del lenguaje Java. Fue creado por Brendan Eich en la empresa Netscape Communications. Se utiliza en páginas web HTML para realizar tareas y operaciones en el marco de la aplicación cliente. · JDBC (Java Database Connectivity): Es una herramienta mediante la cual es posible realizar opera33 Tesinas Generación de código fuente en aplicaciones Web. ciones sobre una base de datos en el lenguaje de programación Java. · JRE (Java Runtime Environment): es básicamente la máquina virtual de Java sin las herramientas de desarrollo mediante la cual es posible ejecutar aplicaciones Java. · JSP (Java Server Pages): es un lenguaje creado por Sun Microsystems a fines de 1999 como adaptación para simplificar el uso de la tecnología de Servlets creada en 1995; existe una equivalencia entre un servlet y un script JSP pero los scripts JSP son mucho más simples de desarrollar. Tal cual establece la filosofía de la tecnología Java el lenguaje es multiplataforma; actualmente JSP forma parte de la plataforma de desarrollo J2EE (Java 2 Enterprise Edition) la cual se encuentra disponible en versiones comerciales y en versiones de código libre. · JVM (Java Virtual Machine): La máquina virtual de Java es un programa ejecutable en una plataforma específica capaz de interpretar y ejecutar instrucciones expresadas en código generado por un compilador del lenguaje Java. · Marco HTML (Frame): el uso de marcos es una técnica propia del lenguaje HTML mediante la cual es posible incluir dentro de una página HTML otras páginas HTML. · Parser: es un analizador sintáctico. Un analizador sintáctico es un programa que reconoce si una o varias cadenas de caracteres forman parte de un determinado lenguaje. · PHP (Personal Home Page): fue creado en 1995 por Rasmus Lerdorf quien al corto plazo de haber creado el lenguaje decidió liberar el código fuente para que cualquiera pudiese utilizarlo, reparar errores y mejorar el código; de esta manera PHP se convierte en una herramienta de fuente abierta capaz de operar en diferentes plataformas incluyendo Linux/Uníx, Microsoft Windows, Novell NetWare, OS/2, AS/400 y Solaris entre otros; actualmente se encuentra en desarrollo la versión 5.0 de esta herramienta. · Servlet: aplicación escrita en lenguaje Java que se ejecuta en un servidor dentro de una arquitectura cliente-servidor. · Tercera Forma Normal: es una propiedad que puede o no cumplir un modelo de datos relacional. El cumplimiento de esta forma normal garantiza un óptimo mantenimiento de datos, integridad de la información y evita la redundancia de datos almacenados en una base de datos. · XML (eXtended Markup Language – Lenguaje de Marcado Extensible): Es un lenguaje sintácticamente similar a HTML aunque una de las principales funciones con las que nace sería sucederlo, separando la estructura del contenido y permitiendo el desarrollo de vocabularios modulares, compatibles con cierta unidad y simplicidad del lenguaje, tiene otras aplicaciones entre las que destaca su uso como estándar para el intercambio de datos entre diversas aplicaciones o software con lenguajes privados como en el caso del SOAP. Bibliografía · [1] - Code Generation in Action – Jack Herrington – Manning Publications - 2003 · [2] - The desgn Patterns - James W Cooper - Addison-Wesley – 1998 · [3] - Design Patterns: Elements of Reusable Object-Oriented Software – Erich Gamma , Richard Helm, Ralph Johnson, John Vlissides - Addison-Wesley Professional Computing Series - 1994 · [4] - Documento comercial de Genexus – “Genexus: Visión General “ · [5] - www.genexus.com · [6] - www.backend-wizard.com · [7] - www.dofactory.com · [8] - www.php.net · [9] - java.sun.com · [10] - www.abiglime.com/webmaster/articles/asp/122297.htm · [11] - fenix.dcaa.unam.mx/servidores/docs/bd/ANSI%20SQL.pdf · [12] - www.wikipedia.org · [13] - www.webopedia.com · [14] - www.codegeneration.net 34 Tesinas Generación de código fuente en aplicaciones Web. 35 Tesinas 36 Generación de código fuente en aplicaciones Web.