Autor: Cuyum
Fecha: 30 de Agosto, 2013
Aplicación web que permite on the fly leer un formulario definido en formato XML (xform) y transformarlo/renderizarlo en un HTML. Incluye la funcionalidad de upload de Formularios (XML) y también de archivos formato XSL que aplicará al realizar la transformación.
Presentar una visión general de las características de la aplicación FormRender y sus aspectos técnicos de mayor relevancia, especificando las características técnicas y de arquitectura que tiene la plataforma, entre ellos los requerimientos de sistema necesarios para poder instalar y ejecutar la aplicación.
La función principal de FormRender es poder generar formularios HTML a partir de una especificación basada en el estandar xForms. Los documentos xForms son documentos XML los cuales a través de una pantalla administrativa se cargan un con un identificador para luego ser recuperados e integrados a otras aplicaciones. FormRender internamente utiliza un procesador XSL para a través de un XSLT (Procesador de Transformación XSL) generar el código HTML correspondiente con sus correspondientes estilos CSS y funcionalidad JavaScript.
Es un sistema transaccional cuya interface a usuario es facilitada mediante el uso de tecnología web compatible con las últimas versiones de los Browsers de Internet (Internet Explorer, Firefox, Chrome). El uso de esta tecnología permitirá al sistema ser accesible desde cualquier lugar que cuente con conexión a Internet, podrá ser instalado y desplegado en servidores propios, externos o en “Clouds” lo que facilita la escalabilidad de la aplicación en caso de ser necesaria mayor carga de trabajo.
El sistema está construido utilizando plataforma y estándares de desarrollo JEE 6 (Java Enterprise Edition). Como implementación de este estándar se utiliza el stack tecnológico porvisto por JBoss 7.1.0 https://www.jboss.org/jbossas/ cuyas implementaciones principales son las siguientes:
Technología/Especificación | JBoss 7.1 |
---|---|
Java EE[JSR-151,244,316] | 6.0 |
Java Servlet [JSR-154, 315] | 3.0 |
JavaServer Faces (JSF) [JSR-252, 314] | 2.0 |
JavaServer Pages & Expression Language (JSP) [JSR-245] | 2.2 |
Java Transaction API (JTA) [JSR-907] | 1.1 |
Enterprise JavaBeans with Interceptors 1.1 (EJB) [JSR-153, 220, 318] | 3.1 |
Enterprise JavaBeans with Interceptors 1.1 (EJB) [JSR-153, 220, 318] | 3.1 |
Java EE Connector Architecture [JSR-112, 322] | 1.6 |
JavaMail [JSR-919 ] | 1.4 |
Java Message Service (JMS) [JSR-914] | |
Java Persistence (JPA) [JSR-220, 317] | 2.0 |
Java API for XML Web Services (JAX-WS) [JSR-224] | 2.2 |
Common Annotations for the Java Platform [JSR-250] | 1.1 |
Java API for RESTful Web Services (JAX-RS) [JSR-311] | 1.1 |
Contexts and Dependency Injection for Java (CDI) [JSR-299] | 1.0 |
Bean Validation [JSR-303] | 1.0 |
Como tecnología de soporte para el mantenimiento de la información se utiliza base de datos relacional PostgreSQL
Se pueden detallar 2 puntos de vista generales, la vista Lógica, que representa el stack de tecnologías utilizadas para desarrollar la plataforma, y la vista física, que representa la distribución física de los componentes
El siguiente diagrama representa una vista conceptual de la Arquitectura por capas de la aplicación, donde se puede ver para cada una de ellas la tecnología primaria utilizada para llevar a cabo la funcionalidad.
Web Servlet/JSF2 | |||
Servicios CDI/POJO | |||
JPA2 Transaccional | Procesador XSLT | Integración JAX-WS/JAX-RS |
Seguridad Conector POJO |
El objetivo de la capa web es proveer una interfaz de acceso al sistema para el usuario final. En esta capa se utiliza la implementación de JSF2 Primefaces para construir las interfaces a usuarios y Servlet para resolver la función principal del sistema que es devolver un formulario especificado en HTML.
Esta capa brinda un nivel de abstracción para acceso a la lógica de la aplicación, proveyendo así un conjunto de servicios uniformes y transparentes a los clientes mediante el uso CDI. Esta tecnología permite ofrecer POJOs como servicios y brinda facilidades de integración entre la capa de presentación, los servicios de negocio y los módulos restantes.
Representa el corazón de la aplicación, tiene la responsabilidad de transformar, leyendo de una base de formularios, la especificación de un formulario xForm en un HTML con sus estilos CSS y librerías JavaScript. Se está utilizando Saxon como engine XSLT para realizar la transformación.
Esta capa brinda una interface para que la aplicación pueda resolver sus necesidades de autorización y autenticación. Existe una implementación default que resuelve estas cuestiones accediendo a un repositorio Redis.
Su objetivo es brindar de una manera homogénea y transparente, mediante el uso del estándar de persistencia JPA2, el acceso a la información al resto de la aplicación independizándolo de la base de datos física con la que interactúa.
Provee interfaces para acceder a datos externos a la aplicación que necesiten los formularios. Las implementaciones de estas interfaces se realizan mediante WebServices SOAP (JAX-WS) o Rest Services (JAX-RS)
Los navegadores de Internet son el medio por el cual los usuarios interactúan con la aplicación. Ejemplo de ellos son Internet Explorer, Firefox y Google Chrome, deben tener soporte para AJAX. Se comunican a través del protocolo HTTP y renderizan las paginas HTML que visualizará el usuario.
Este nodo, o mejor dicho instancias de este nodo, ya que se podría tener más de un Application Server brindando servicios esta, compuesto por instancias de JBoss 7 el cual contiene un EJB Container y un Mojarra embebido (Servlet Container) el cual brindaran los servicios de middleware (protocolos de comunicación entre componentes, control de transacciones locales y/o distribuidas, mecanismos de intercepción de eventos para control de seguridad y auditoria, manejos de excepciones y servicios de logging) al software a construir, el cual contiene diferentes módulos con responsabilidades bien definidas. Este servidor contendrá un Redis (motor de base de datos de memoria) para mantener información de contexto que el modulo de Seguridad utilizará para resolver sus servicios.
Estos nodos contienen distintas fuentes de información con las que interactuará el sistema. Podemos distinguir dos tipos: Base de Datos: el sistema deberá interactuar con una base de datos PostgreSQL que servirá de información al modulo Transaccional, de Procesamiento y de Integración. Almacenamiento: utilizado por lo general para guardar imágenes, logs y archivos con información de operaciones.
En ésta sección se detalla todo lo necesario para compilar, instalar o deployar y ejecutar la plataforma. Se asume que los siguientes componentes, necesarios para dichas tareas, se encuentran instalados y corriendo normalmente en el sistema operativo.
Es necesario tener instalados (al menos) 2Gb de ram.
Agregar al archivo
En la sección
<datasources>
<datasource jta="true" jndi-name="java:jboss/datasources/FormRenderDS" pool-name="FormRenderDS" enabled="true" use-java-context="true" use-ccm="true">
<connection-url>jdbc:postgresql://localhost:5432/formrender</connection-url>
<driver-class>org.postgresql.Driver</driver-class>
<driver>postgresql</driver>
<security>
<user-name>${username}</user-name>
<password>${password}</password>
</security>
</datasource>
<drivers>
<driver name="postgresql" module="org.postgresql">
<xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
</driver>
</drivers>
</datasources>
Deberemos instalar primero el driver de la base de datos relacional a la plataforma del Application Server, para esto deben crear 2 carpetas (postgres y main):
<jboss-as-7.1.0.Final>/modules/org (debiendo quedar la siguiente estructura)
<jboss-as-7.1.0.Final>/modules/org/postgresql/main
Dentro de la carpeta main copiar el archivo postgresql-9.1-902.jdbc4.jar y crear un archivo module.xml cuyo contenido debe ser:
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="org.postgresql">
<resources>
<resource-root path="postgresql-9.1-902.jdbc4.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
</dependencies>
</module>
Crear base de datos BD "formrender" utilizando el cliente de preferencias, si el esquema (base de datos) no se encuentra creado, la aplicación no levantará correctamente.
Ejecutar los scripts de estructura y datos en la BD creada, estos están ubicados en FormRender/sql/ y son:
Este proyecto usa git para control de versiones y esta disponible en github. Para bajarse el proyecto, ejecutar
git clone git@cluster.softwarepublico.gob.ar:cnc2220.git
Realizar una copia del archivo de configuración base (FormRender/src/main/resources/formrender.properties) y completar las variables con la información correcta:
Configurar path destino de los archivos de especificacion de formularios (.xml) en archivo de propiedades
xmlForms.destination (Ej. xmlForms.destination=/var/cnc)
Configurar ip/port server de donde se tomarán listas externas tales como geográficas y prestadores en archivo de propiedades. Se debe tener en cuenta si usa o no encriptación y si este tiene un contexto habilitado diferente al / (ROOT)
FormRender/src/main/resources/formrender.properties
list.remote.host (Ej. list.remote.host=54.232.16.128) list.remote.port (Ej. list.remote.port=8080) list.remote.secure (Ej. list.remote.secure=false) list.remote.context (Ej. list.remote.context=/)
Estos mismos pasos deben realizarse para configurar también el servidor de persistencia de persistencia bajo el prefijo submit.remote.
El archivo formrender.properties modificado se deberá pegar en el directorio de configuración de Jboss (
Situarse en la raíz del directorio del código y ejecutar
$>mvn clean package
Esto genera un archivo war en "FormRender/target/FormRender.war"
Deployar el archivo "FormRender.war" generado, para ello en JBoss 7.1.0 copiar el archivo al directorio
Iniciar el server (standalone.bat en windows o standalone.sh unix)
Acceder desde un browser a la dirección.
http://
La página de inicio muestra un listado de los formularios xml y html (columnas URL y XML respectivamente). Haciendo click en cada uno de ellos se pueden visualizar.