Download Descargar

Document related concepts
no text concepts found
Transcript
Framework de Desarrollo de Justicia
Versión 1.2
FRAMEWORK JUSTICIA
ARQUITECTURA
APLICACIONES WEB
Versión 1.2.2
Octubre 2009
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 1
Framework de Desarrollo de Justicia
Versión 1.2
CONTROL DE CAMBIOS
Fecha
Versión
22/02/2008 1.2
Cambios
Modificado apartados:
1. Requisitos Generales
2.2 Entorno de desarrollo
3.3 Estructura de directorios (2 nuevos directorios)
3.12 Modelo de seguridad
3.14 Capa presentación
10 Referencias
Eliminado apartados por encontrarse en el documento
Desarrollo en Java:
2.2 Base de Datos
3.10 Test de pruebas
3.11 Documentación
3.2 Uso de convenciones en los proyectos
03/10/2008
1.2.1
29/10/2009
1.2.2
Nuevo apartado:
8 Otras cuestiones a tener en cuenta
Indicamos la página en la que se encuentran actualizadas las
librerias de JAXB
3.13.1 DATOS: Añadido el uso de JDBC para
procedimientos almacenados.
4, Compositor de documentos: Se sube a la versión 1.5 de
Velocity.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 2
Framework de Desarrollo de Justicia
Versión 1.2
INDICE
1
2
REQUISITOS GENERALES .............................................................................. 4
REQUISITOS DEL ENTORNO.......................................................................... 5
2.1
ARQUITECTURA DE SISTEMAS ................................................................ 5
2.2
ENTORNO DE DESARROLLO ..................................................................... 7
2.3
NAVEGADORES Y POB ............................................................................... 9
2.4
REQUISITOS ARQUITECTURA J2EE ....................................................... 10
3
CARACTERISTICAS DE LAS APLICACIONES........................................... 11
3.1
ESTRUCTURA DE DIRECTORIOS ............................................................ 11
3.2
ESTRUCTURA DE PAQUETES JAVA....................................................... 13
3.3
CONFIGURACIÓN ....................................................................................... 14
3.4
GENERACION DE TRAZAS DE LOG........................................................ 18
3.5
GESTION DE EXCEPCIONES..................................................................... 20
3.5.1
Reglas y recomendaciones...................................................................... 20
3.5.2
Uso excesivo de excepciones explícitas ................................................. 23
3.5.3
Resumen práctico ................................................................................... 23
3.6
SOPORTE INTERNACIONALIZACIÓN .................................................... 24
3.7
TAREAS ASINCRONAS (SCHEDULING)................................................. 24
3.8
AUDITORIA .................................................................................................. 25
3.9
MODELO DE SEGURIDAD......................................................................... 26
3.10 ARQUITECTURA DE LAS APLICACIONES ............................................ 28
3.11 CAPA PRESENTACION .............................................................................. 29
3.12 CAPA LOGICA DE NEGOCIO .................................................................... 31
3.13 CAPA PERSISTENCIA................................................................................. 31
3.13.1
DATOS................................................................................................... 32
3.13.2
DOCUMENTOS .................................................................................... 36
4
COMPOSITOR DE DOCUMENTOS ............................................................... 39
5
TRATAMIENTO DE FICHEROS XML........................................................... 41
6
GENERACION DE INFORMES....................................................................... 42
7
INTEROPERABILIDAD CON SISTEMAS EXTERNOS ............................... 43
8
OTRAS CUESTIONES A TENER EN CUENTA ............................................ 43
9
RESUMEN ......................................................................................................... 44
10
REFERENCIAS ................................................................................................. 45
11
ANEXOS............................................................................................................ 47
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 3
Framework de Desarrollo de Justicia
REQUISITOS
1
Versión 1.2
REQUISITOS GENERALES
La presente guía establece un marco de trabajo común a todas las aplicaciones que
configuran el nuevo Sistema de Información Judicial de la Comunidad de Madrid. Para
ello, define una serie de requisitos de obligado cumplimiento por cada una de las
aplicaciones, desglosado en los diferentes elementos que configuran la arquitectura de las
mismas.
Adicionalmente a los requisitos explícitamente expuestos se deben cumplir los requisitos
especificados en la normativa general para el Desarrollo de aplicaciones Java y el
siguiente requisito:

El uso de cualquier nueva tecnología, producto, librería o componente, no incluido
en la presente guía, que se desee incorporar a las aplicaciones deberá ser
consensuado previamente por ICM.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 4
Framework de Desarrollo de Justicia
2
2.1
Versión 1.2
REQUISITOS DEL ENTORNO
ARQUITECTURA DE SISTEMAS
Las aplicaciones deberán desarrollarse teniendo en cuenta que en el entorno de
producción podrán ser desplegadas en modo cluster, tanto en varias instancias de un
mismo o diferentes servidores de aplicaciones. Ver anexo de Arquitectura de las
Aplicaciones de Justicia.
De esta arquitectura se desprenden los siguientes requisitos a tener en cuenta en el
desarrollo de las aplicaciones:

Minimizar el uso de la sesión. Como ya sabemos, cada petición al servidor recibe
su objeto Session, donde la aplicación puede guardar y recuperar información
específica para cada usuario haciendo uso de las variables de sesión.
REQUISITOS
Aunque parece una gran idea guardar grandes objetos, como la conexión a una
base de datos en una variable de sesión y así utilizarla en todas las páginas
mejorando (en teoría) el rendimiento, esto es absolutamente falso, por varias
razones.
Cada usuario que entra en la aplicación recibe su propio objeto Session personal.
Los objetos ocupan una gran cantidad de memoria del servidor. Almacenarlos en
una variable de sesión significa que rápidamente el servidor se va a quedar sin
memoria y la ejecución de los procesos va a ser mucho más lenta. Este deterioro
además, afectaría a cualquier tipo de petición, y además si un usuario entra y sale
a los 15 segundos de la aplicación, su copia del objeto permanecerá en memoria
hasta que termine el tiempo de caducidad de sesión, perjudicando y penalizando
sin justificación al sistema.
Reducir el tiempo de caducidad de sesión para evitar el problema anterior no es
buena solución, es más, sería un error, ya que la caducidad de la sesión obligaría
probablemente a realizar un nuevo registro en la aplicación a aquellos usuarios
que permanecieran inactivos durante un tiempo mayor a ese pequeño intervalo
establecido. Hablaríamos de que la sesión ha expirado y no es posible continuar
el proceso abierto sin comenzar de nuevo.
El otro extremo contrario es mucho peor: poner un TimeOut muy elevado por si
acaso, y así mantendremos el estado 100% seguro. Esto significa que si 100
usuarios llegan al mismo tiempo y se van en 10 minutos, tienes 100 objetos
Session malgastando memoria durante el resto de tiempo, lógicamente esto es
inaceptable.
Las variables de sesión son justificables sólo en ciertos aspectos puntuales. La
mayoría de las cosas se pueden hacer sin ellas, y evitamos todos los problemas
que conlleva, con cookies, formularios y querystrings.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 5
Framework de Desarrollo de Justicia
Versión 1.2
Además, otro de los errores más comunes es guardar en variables de sesión
cosas que no son específicas para cada usuario, como cadenas de conexión a
bases de datos, algún HTML que imprimimos siempre, como pie de página... Las
variables de sesión no están pensadas para eso.
Nunca se deben incluir en sesión colecciones de objetos ya que se desconoce su
tamaño.
El tamaño de la sesión nunca podrá exceder los límites que ICM defina en base a
la arquitectura de sistemas, este limite dependerá del nº de usuarios
concurrentes.

Los ficheros generados por las aplicaciones y que se necesiten dejar en disco se
ubicarán según se indique en un parámetro del fichero de configuración, como se
verá en el apartado configuración. Esta ubicación corresponderá con un directorio
compartido por las distintas maquinas que compongan el cluster. Además hay
que tener en cuenta que cada aplicación va a tener un único directorio de trabajo
exclusivo para uso de dicha aplicación.

Las aplicaciones se van a ejecutar en varias maquinas virtuales por lo tanto los
objetos que se dejen en la memoria de la maquina virtual no estarán replicados
en las diferentes instancias.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 6
Framework de Desarrollo de Justicia
2.2
Versión 1.2
ENTORNO DE DESARROLLO
El entorno de desarrollo Java recomendado por ICM se compone de los siguientes
elementos:





Eclipse 3.1
MyEclipse Enterprise Workbench 4.1
Apache Maven 2
Checkstyle
PMD
REQUISITOS
Los proveedores podrán utilizar cualquier entorno de desarrollo aunque deberán tener en
cuenta los siguientes requisitos a la hora de realizar las entregas software:

Dado que el entorno de mantenimiento de ICM utiliza Eclipse, el software
entregado deberá incluir los ficheros de proyecto que este entorno utiliza a fin de
facilitar su compilación, depuración, etc.

Las aplicaciones deberán incluir un proyecto Maven 2 o en su defecto scripts
compatibles con la librería Apache Ant 1.6.5 que permitan realizar las operaciones
básicas como: compilación del proyecto y generación del fichero ear.
Maven es una herramienta de gestión de información de proyectos. Maven está basado en el
concepto de un modelo de objetos del proyecto POM (Project Object Model) en el que todos los
productos (artifacts) generados por Maven son el resultado de consultar un modelo de proyecto
bien definido. Compilaciones, documentación, métricas sobre el código fuente y un
innumerable número de informes son todos controlados por el POM.
Maven tiene muchos objetivos, pero resumiendo Maven intenta hacer la vida del desarrollador
sencilla proporcionando una estructura de proyecto bien definida, unos procesos de desarrollo
bien definidos a seguir, y una documentación coherente que mantiene a los desarrolladores y
clientes informados sobre lo que ocurre en el proyecto. Maven aligera en gran cantidad lo que
la mayoría de desarrolladores consideran trabajo pesado y aburrido y les permite proseguir con
la tarea. Esto es esencial en proyectos de gran alcance donde hay que realizar una labor
importante de documentación y propagación de la información crítica sobre el proyecto que es
necesaria para atraer potenciales nuevos desarrolladores y clientes.
La ambición de Maven es hacer que el desarrollo interno del proyecto sea altamente manejable
con la esperanza de proporcionar más tiempo para el desarrollo entre proyectos. Se puede
llamar polinización entre proyectos o compartir el conocimiento sobre el desarrollo del proyecto.
Características:

El modelo de objetos del proyecto POM es la base de cómo Maven trabaja. El
desarrollo y gestión del modelo está controlado desde el modelo del proyecto.

Un único conjunto de métodos son utilizados para todos los proyectos que se
gestionan. Ya no hay necesidad de estar al tanto de innumerables sistemas de
compilación. Cuando las mejoras se hacen en Maven todos los usuarios se benefician.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 7
Framework de Desarrollo de Justicia
Versión 1.2

Integración con Gump, una herramienta usada en el proyecto Jakarta para ayudar a los
proyectos a mantener compatibilidad con versiones anteriores.

Publicación del sitio web basado en el POM. Una vez el POM es exacto los
desarrolladores pueden publicar fácilmente el contenido del proyecto, incluyendo la
documentación personalizada más el amplio conjunto de documentación generada por
Maven a partir del código fuente.

Publicación de distribuciones basada en el POM.

Maven alienta el uso de un repositorio central de librerías, utilizando un mecanismo que
permite descargar automáticamente aquellas necesarias en el proyecto, lo que permite
a los usuarios de Maven reutilizar librerías entre proyectos y facilita la comunicación
entre proyectos para asegurar que la compatibilidad entre distintas versiones es
correctamente tratada.

Guías para la correcta disposición de los directorios. Maven contiene documentación
sobre como disponer los directorios de forma que una vez es aprendida se puede ver
fácilmente cualquier otro proyecto que use Maven.
Más información en el Anexo de Apache Maven 2.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 8
Framework de Desarrollo de Justicia
REQUISITOS
2.3
Versión 1.2
NAVEGADORES Y POB
La aplicación debe funcionar correctamente con el POB de Justicia 5.7.2 y superior. En el
apartado de anexos se incluyen los requisitos de dicho POB.
Además debe de ser compatible con la versiones de Navegador Internet Explorer 6.0 o
superior y Mozilla Firefox 1.4 o superior.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 9
Framework de Desarrollo de Justicia
2.4
Versión 1.2
REQUISITOS ARQUITECTURA J2EE
Las aplicaciones que componen el nuevo Sistema de Información Judicial de la
Comunidad de Madrid deberán desarrollarse según la especificación J2EE (Java 2
Enterprise Edition) deberán cumplir los siguientes requisitos:

Deben ser compatibles con la especificación J2EE en su versión 1.4, lo cual fija
las especificaciones que deben cumplirse a nivel de las diferentes tecnologías
subyacentes, entre ellas:
REQUISITOS
Especificación
J2EE (Java 2 Enterprise Edition )
Java Servlet Specification
JavaServer Pages Specification
JDBC (Java Database Connectivity)
Java Transaction API Specification
Java Transaction Service
Specification
SOAP with Attachments API for Java
Specification
JavaMail API Specification
Java Message Service Specification
Versión
1.4
2.4
2.0
Specifications, 3.0, 2.1, and
Optional Package API (2.0)
1.0.1B
1.0
1.2
1.3
1.1

Las aplicaciones no deben usar funcionalidades propietarias del servidor de
aplicaciones, sin la previa aprobación de ICM, para garantizar al máximo la
portabilidad entre servidores de aplicaciones certificados J2EE 1.4.

Las aplicaciones no deben usar funcionalidades o tecnologías dependientes del
sistema operativo sin la previa aprobación de ICM. En concreto, las aplicaciones
deberán soportar los sistemas operativos Linux (RedHat 3.0), Solaris y
Windows2000, aunque en producción las aplicaciones se ejecutarán sobre Linux
(RedHat 3.0).
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 10
Framework de Desarrollo de Justicia
3
Versión 1.2
CARACTERISTICAS DE LAS APLICACIONES
3.1
ESTRUCTURA DE DIRECTORIOS
La estructura de directorios en todo proyecto ICM debe de colgar de una carpeta con el nombre
del proyecto “/proyecto/”, este nombre se corresponde con el nombre de Midax (4 letras). Esta
será la ruta raíz del árbol de proyecto. Como dentro de un proyecto podemos tener varios
módulos para cada módulo vamos a tener la estructura de directorios que se muestra a
continuación:
Path
Descripción
/modulo/
/doc/
/api/
Contiene los ficheros de configuración XML para el despliegue
automático con ANT. En esta estructura se desarrolla el
módulo de un proyecto. También contendrá los ficheros
.classpath y .project de Eclipse.
Toda aquella información que no se pueda catalogar en la
estructura subyacente.
Javadoc del aplicativo.
/gui/
TODA la información generada por el equipo de diseño gráfico:
archivos de photoshop, de freehand, de flash, jpeg, …
/man/
TODOS los manuales: de usuario, de operación e instalación.
/req/
Documento de especificaciones (contiene los requisitos
generales, información del modelo de datos y la arquitectura
del sistema). Todas las fichas de los requisitos y las fichas de
las tareas.
Toda la documentación referente con pruebas del aplicativo:
de aceptación, de carga, checklist de errores…
Todo el modelo UML recogido en los trabajos de diseño, es el
directorio en el cual trabajo la herramienta CASE de modelado.
TODAS las librerías que necesita el aplicativo (.jar, .zip, …),
estas librerías deben de estar clasificadas en directorios según
el tipo de servicio que prestan.
Contiene todo el código fuente (.java) sin incluir el interfaz
gráfico de usuario (.jsp, .html, …).
Estructura de paquetes con el código fuente del aplicativo
(.java). Se sustituye [package] por el paquete raíz que se
defina para el sistema.
De este directorio cuelga toda la estructura de pruebas
unitarias del aplicativo (.java). Se sustituye [package] por el
paquete raíz que se defina para el sistema.
De este directorio cuelgan todos los elementos necesarios
para la ejecución de las pruebas de selenium
De este directorio cuelgan todos los elementos necesarios
para la ejecución de las pruebas de jmeter
Ficheros para el despliegue de la aplicación web
/test/
/uml/
/lib/
/src/
/java/[package]
/test/[package]
/selenium
/jmeter
/WebRoot/
/css/
Hojas de estilo del aplicativo.
/html/
Directorio contenedor de páginas HTML.
/img/
Almacén de las imágenes del proyecto. Pueden almacenarse
en directorios contenidos en este principal.
/js/
Ficheros de javascript.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 11
Framework de Desarrollo de Justicia
Versión 1.2
/estandar /
Directorio para nuestros scripts de validación y utilidades que
no hacen uso de AJAX.
/librerias/
Directorio para incluir los ficheros de la librería DWR o
cualquier otra de la que se mantenga una dependencia.
Aquí se incluyen scripts generales usados por el resto de
scripts AJAX
/ajax/
/msg/
Ficheros de traducciones (xml) para i18n.
/ WEB-INF /
Toda la información de configuración del aplicativo, que es
necesaria, para los distintos contenedores de infraestructura:
Servidor web, servidor de aplicaciones, …
Lugar para dejar las clases compiladas para que el
Classloader (en el caso de Tomcat) los pueda localizar.
/classes/
/conf/
Ficheros de configuración
/dtd/
Ficheros de DTD
/jsp/
Directorio contenedor de páginas JSP.
/lib/
Directorio de despliegue de las librerías.
/tld/
Ficheros de TLD
[url + path]/temp/
Directorio auxiliar para contener los ficheros temporales,
intermedios de las operaciones de ANT, etc... Este directorio
podrá localizarse en cualquiera de las máquinas del cluster y
podrá ser compartido por otras aplicaciones. Existirá un
procesado automático para vaciar el contenido de este
directorio en base a unas políticas temporales.
[url + path]/log/
Ficheros de log del aplicativo. Este directorio podrá localizarse
en cualquiera de las máquinas del cluster. Existirá un
procesado automático para vaciar el contenido de este
directorio en base a unas políticas temporales.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 12
Framework de Desarrollo de Justicia
3.2
Versión 1.2
ESTRUCTURA DE PAQUETES JAVA
Para los paquetes de la aplicación se empleará la siguiente estructura haciendo uso de
los caracteres en minúscula y en ningún caso podrá utilizarse el nombre del proveedor
en tal estructura:
/[nombreproyecto]/
/unidadnegocio1/
Nombre de la aplicación o proyecto
Contenedor de la unidad organizativa de negocio.
Será una agrupación lógica de una funcionalidad a
desarrollar. (opcional, si no hay diferente unidades )
/acciones/
...
Contenedor para todas
ActionForm y de Struts.
las
clases
Action
y
/negocio/
...
Contenedor para las clases de negocio (DAO,
servicios y auxiliares) correspondientes a la
implementación del patrón propuesto.
/modelo/
...
/unidadnegocio2/
...
*
/unidadnegocio3/
...
*
/util/
...
...
Contenedor para los bean de datos y los ficheros de
mapping de hibernate, (hbm).
Contendor de clases auxiliares de utilidades de
alcance global y reutilizables.
Conjunto de clases y ficheros reutilizables,
resultado de la sobrecarga de struts para adaptarlos
a las necesidades del proyecto, control de
seguridad, etc…
* La estructura de la unidad de negoció se repetirá tantas veces como unidades organizativas de
funcionalidad se presenten.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 13
Framework de Desarrollo de Justicia
3.3
Versión 1.2
CONFIGURACIÓN
REQUISITOS
Los requisitos de configuración a cumplir por las aplicaciones son:

Las aplicaciones deberán centralizar su configuración/parametrización en un
único fichero de configuración XML.

Las aplicaciones dispondrán de mecanismos para aplicar los cambios en el
fichero de configuración sin necesidad de desplegar de nuevo la aplicación o
rearrancar el servidor de aplicaciones.

Los ficheros de configuración asociados a las diferentes librerías / tecnologías
utilizadas por la aplicación deberán centralizarse, siempre que sea posible, en un
único directorio, p. e. WEB-INF/conf siempre y cuando sea posible.

La gestión del fichero de configuración se realizará mediante la librería Apache
Jakarta Commons Configuration
Además de estos requisitos se deben cumplir los requisitos en cuanto a configuración
indicados en el documento de información general para desarrollos java.
A la hora de desarrollar una aplicación siempre nos encontramos con constantes y valores por
defecto. Incluirlos en el código es un grave error. Cada modificación implicaría una
recompilación del código. Un buen código no puede permitirse esos lujos y se hace
imprescindible utilizar mecanismos que nos permitan modificar la configuración de nuestros
programas de manera cómoda y efectiva. Tampoco es cuestión de hacer nada complejo: basta
con usar un fichero de configuración.
Debe existir un único fichero de configuración por aplicación, es decir un único punto de acceso
a la personalización del comportamiento de la aplicación, si bien esto no significa que solo haya
un fichero. En el directorio contenedor de los ficheros de configuración se recogerá el fichero
descriptor de la aplicación y el resto de ficheros de configuración requeridos por terceros:
librerías, servidores, etc…
Recordamos que los ficheros de configuración deben residir en el siguiente directorio dentro de
la estructura del proyecto ya propuesto con anterioridad en este documento.
/WebRoot/
/ WEB-INF /
/conf/
Ficheros para el despliegue de la aplicación web
Toda la información de configuración del aplicativo, que es
necesaria, para los distintos contenedores de infraestructura:
Servidor web, servidor de aplicaciones, …
Ficheros de configuración
En realidad el formato general de un fichero de configuración debiera ser muy simple, tanto
como sea posible ya que no solo debe de ser accesible mediante algún mecanismo desde la
aplicación, sino que debe poder interpretarse fácilmente con una lectura rápida del mismo.
Cada línea de una sección contiene palabras clave con uno o más argumentos, estos serán los
valores que parametrizarán la aplicación.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 14
Framework de Desarrollo de Justicia
Versión 1.2
Para tal propósito vamos a recurrir a describir este conjunto de parámetros y valores en un
fichero XML teniendo en cuenta las siguientes consideraciones.
1. Los nombres de los ficheros y parámetros deben seguir las mismas consideraciones
que las explicadas en el apartado de convenciones a seguir.
2. Los comentarios introducidos, deben aportar claridad, no abusar de ellos intentando
que el propio fichero sea auto descriptivo. Para ello ayudará la selección adecuada de
los nombre de los parámetros.
3. Los parámetros de configuración globales de la aplicación deberán ser los primeros en
aparecer en el fichero descritos como parámetros. Ejemplo de esto son datos como el
nombre de la aplicación, la versión, el idioma por defecto, directorio para temporales,
etc….
4. Los parámetros que hacen referencia a una misma funcionalidad deben ser incluidas
en un grupo de elementos adecuadamente comentados. Como ejemplo podemos
hacer referencia a los parámetros que configuran el comportamiento del gestor de
trazas.
5. Cuando existan grupos funcionales deben indicarse introduciendo un nivel de
anidamiento más en esa estructura para agrupar claramente los valores propios para
cada instancia. Esta es la situación que se puede presentar cuando configuramos las
conexiones a base de datos, donde existen más de un datasource o cuando
trabajamos con correo electrónico, donde los datos de conexión y cuantas pueden ser
diferentes.
6. Cualquier grupo funcional debe poder ser accedido fácilmente por su id, luego este
debe de estar siempre presente y ser léxicamente significativo.
7. Introducir atributos de comentario es útil y ayuda a la comprensión del elemento. Para
ello se utilizara desc=”comentarios”.
8. Las contraseñas deben aparecer SIEMPRE encriptadas.
Seguidamente se muestra lo que podría considerarse como un fichero de configuración válido
para cumplir con estas consideraciones y puede ser utilizado como modelo inicial para llegar a
cubrir las necesidades del proyecto, ampliando el mismo en la medida que sea preciso.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 15
Framework de Desarrollo de Justicia
Versión 1.2
<?xml version="1.0" encoding="ISO-8859-1"?>
<system>
<param id="application.name" value="mi proyecto"/>
<param id="version" value="1.0"/>
<param id="default.locale" value="es,ES"/>
<param id="temp.url" value="/"/>
<param id="temp.dir" value="/usr/……./temp/8829"/>
<!-- log -->
<log id="log" desc="configuración de log4j">
<param id="path" value="/usr/………/log"/>
<param id="file" value="nombrelog"/>
<!-- active appenders -->
<param id="log4j.rootLogger" value="warn, stdout, file"/>
<!-- console appender setup -->
<paramid="log4j.appender.stdout" value="org.apache.log4j.ConsoleAppender"/>
<param id="log4j.appender.stdout.layout" value="org.apache.log4j.PatternLayout"/>
<param id="log4j.appender.stdout.layout.ConversionPattern" value="%5p [%t] (%F:%L) –
%m%n" desc="show filename and line number"/>
<!-- file appender setup -->
<param id="log4j.appender.file" value="org.apache.log4j.RollingFileAppender"/>
<param id="log4j.appender.file.File" value="${log.file}"/>
<param id="log4j.appender.file.MaxFileSize" value="100KB"/>
<param id="log4j.appender.file.MaxBackupIndex" value="4" desc="support four backup"/>
<param id="log4j.appender.file.layout" value="org.apache.log4j.PatternLayout"/>
<param id="log4j.appender.file.layout.ConversionPattern" value="%d{HH:mm:ss.SSS} %-5p
[%t] - %m\n"/>
<!—- notification mail -->
<param id="log4j.notification.enabled" value="true" desc="notificaciones de error"/>
<param id="log4j.notification.mail" value="[email protected]" desc="administrator mail"/>
</log>
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 16
Framework de Desarrollo de Justicia
Versión 1.2
<!-- mail -->
<mail id="mail" desc="configuracuión de e-mail">
<param id="smtp.host" value="smtp.myserver.es" desc="smtp mail protocol"/>
<param id="pop3" value="pop3" desc="reveive protocol param"/>
<param id="pop3.host" value="mail.myserver.es" desc="reveive protocol param"/>
<param id="imap" value="imap" desc="imap protocol param"/>
<param id="imap.host" value="" desc="imap protocol param"/>
<param id="receiver.protocol" value="pop3" desc="receive param"/>
<param id="receiver.enabled" value="false" desc="receive param"/>
<param id="freq" value="5000" desc="general param"/>
<param id="flag.debug" value="false" desc="general param"/>
<group id="accounts" desc="group of mail accounts">
<group id="acc1">
<param id="address" value="[email protected]"/>
<param id="username" value="j8dkdma1"/>
<param id="password" value="DKKS02824K2LEKD902K2M3902M2E232"/>
<param
id="flag.authentication"
value="true"
desc="authentication
param"/>
</group>
</group>
</mail>
<!-- data base -->
<database id=”database” desc="configuración de las conexiones a BBDD">
<datasource id=”datasource1” desc="Conexión con el primer datasource">
<param id="nombre" value="nombre del datasource"/>
<param id="usuario" value="userlogin"/>
<param id="password" value="ALKASM093232MDSZ89023429023K42"/>
</datasource>
</database/>
...
</system>
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 17
Framework de Desarrollo de Justicia
3.4
Versión 1.2
GENERACION DE TRAZAS DE LOG
Una traza es una descripción real de la evolución temporal de un sistema. Para generar esta
descripción se debe disponer de acceso a los parámetros del sistema que sean relevantes. La
generación de trazas se ha realizado generalmente por medio de librerías o unidades
dedicadas a ese efecto, tal como LOG4J.
En ocasiones, estas unidades deben combinarse con el código del programa o aplicación a
monitorizar y en otras puede hacerse por medio de una conexión al canal de comunicación o al
sistema hardware. Tanto de una forma como de otra, la traza deberá mantener la
correspondiente coherencia y homogeneidad en su creación.
La monitorización del sistema no deja de ser un método que pueda interferir en el
funcionamiento del mismo y en algunos casos si no se presta la debida atención a su
tratamiento, esta interferencia de la observación puede resultar problemática, dado que la
generación de la traza y el almacenado en un archivo es una tarea más en el sistema.
Las aplicaciones deberán tener presente el cumplimiento de los siguientes requisitos de
trazabilidad:

Las aplicaciones utilizarán la librería Log4j como mecanismo de trazado.

Existirá un único archivo log por aplicación, utilizándose los mecanismos de Log4j
para gestionar su tamaño.

Las trazas de las aplicaciones deberán indicar como mínimo:
o
o
REQUISITOS
o

Las trazas no podrán mostrar cierto tipo de información como:
o
o

Instante en el que es lanzada la traza.
Descripción del punto exacto del lanzamiento de la traza: [Módulo / Clase
/ Método].
Mensaje de la traza.
Información que suponga un riesgo de seguridad como claves utilizadas
por los usuarios, claves de acceso a otros sistemas como bases de datos,
etc.
Información que viole la Ley Orgánica de Protección de Datos (LOPD)
como datos que identifiquen menores, intervinientes, etc.
Mediante parámetros de configuración las aplicaciones podrán activar un nivel de
trazado de acciones de BBDD que permita:
o
Trazar las consultas SQL lanzadas incluyendo:
 Consulta SQL completa y en el caso de sentencias
precompiladas o invocaciones a procedimientos almacenados se
deberán indicar los parámetros asociados a las mismas.
 Tiempos de preparación y/o ejecución de las consultas.
o
Trazar el ciclo de vida de las transacciones: inicio y fin (commit y
rollback).
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 18
Framework de Desarrollo de Justicia
o

Versión 1.2
Auditar el estado del pool de conexiones: tamaño, conexiones libres,
transacciones y asignación de conexiones a consultas/transacciones.
En función de diferentes niveles de trazado se deberá trazar a fin de facilitar la
depuración ante posibles problemas:
o
o
o
o
Inicio-fin de acciones y uso de componentes/servicios,
Volcado de errores con nivel, número y descripción,
Volcado de los parámetros de configuración a fin de certificar que la
aplicación está aplicando la configuración deseada,
Adicionalmente mandar un correo al administrador ante cierto tipo de
errores.
Para más información consultar el anexo Generación de Trazas con Log4J.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 19
Framework de Desarrollo de Justicia
3.5
Versión 1.2
GESTION DE EXCEPCIONES
La gestión de excepciones es un aspecto integrado en el lenguaje Java. El concepto de gestión
de errores con excepciones está previsto para crear código más fiable y fácil de mantener.
Java proporciona tres clases principales para el manejo de condiciones excepcionales:
excepciones explícitas (checked), excepciones en tiempo de ejecución (runtime) y errores
(errors).
Los errores indican un serio problema que una aplicación no debe capturar. La mayoría de
estos errores son condiciones anormales que se producen durante la ejecución del programa.
Existe cierta confusión entre programadores en lo referente a elegir el tipo apropiado de
excepción. Aunque la decisión no siempre es clara, hay reglas generales que ayudan bastante
a facilitar la elección.
3.5.1
Reglas y recomendaciones
La regla principal es “Usar excepciones explícitas para condiciones excepcionales de las
que el método cliente puede razonablemente recuperarse”. Al lanzarse una excepción
comprobada, se fuerza al método cliente a manejar la excepción o a propagarla. Obviamente,
el método cliente puede capturar la excepción e ignorarla, lo cual es normalmente una mala
decisión (ver segunda recomendación abajo).
Los errores y las excepciones en tiempo de ejecución son idénticos en comportamiento: No se
deben capturar. Si un programa lanza una excepción explícita o un error, generalmente no es
posible la recuperación de dicho error y continuar la ejecución puede causar más daños que
beneficios. Normalmente, el proceso en cuestión se detiene mostrando un mensaje aclaratorio.
La segunda regla es “Usar excepciones en tiempo de ejecución para indicar errores de
programación”. La gran mayoría de excepciones en tiempo de ejecución indica que se está
incumpliendo una precondición. Esto significa que el método cliente de una función no está
cumpliendo las precondiciones establecidas en la especificación de la función. Por ejemplo,
para acceder a un elemento de un array se establece que el índice debe estar comprendido
entre cero y la longitud del array menos uno. La excepción ArrayIndexOutOfBoundsException
indica que esta precondición no se ha cumplido.
Aunque la especificación del lenguaje Java no lo requiere, por convenio los errores están
reservados para que la máquina virtual pueda indicar deficiencias de recursos, fallos de
invariantes u otras condiciones que hacen imposible continuar la ejecución. Dada la casi
universal aceptación de este convenio, es mejor no implementar una nueva subclase de Error.
Todas las excepciones en tiempo de ejecución deberían ser subclase de RuntimeException
(directa o indirectamente).
En resumen, se deben usar excepciones explícitas para condiciones recuperables y
excepciones en tiempo de ejecución para errores de programación.
Para centrar este apartado, el constructor completo para el manejo de excepciones es:
try {
//
} catch
//
} catch
//
Código que puede lanzar una excepción
(Exception1 e) {
Código para manejar una condición excepcional
(Exception2 e) {
Código para manejar la siguiente condición excepcional
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 20
Framework de Desarrollo de Justicia
Versión 1.2
} finally {
// Código que se ejecuta incondicionalmente
}
El código que puede lanzar una excepción va dentro de un bloque try. Un bloque catch se
ejecutará sólo si la excepción identificada ocurre (o una subclase de ésta). Sin embargo, el
código que va en el bloque finally se ejecutará siempre.
El bloque try es obligatorio. Adicionalmente, uno de los dos bloques, catch o finally, deben estar
presentes, o el compilador lo considerará error. Dado que puede haber varios bloques catch, el
sistema encontrará el primero que coincida con la condición excepcional. Por tanto, si hay un
bloque catch para una excepción IOException, y se produce una excepción
FileNotFoundException, se recogerá por el bloque que captura IOException.
Esto sugiere una primera recomendación para la gestión de excepciones: Se debe trabajar
siempre con la excepción más específica que sea posible. Por ejemplo, si se crea un método
que podría generar una excepción FileNotFoundException, no declarar que lanza una
IOException. Si esto se hace, se fuerza al método cliente a que maneje todas las excepciones
IOException posibles, no sólo FileNotFoundException.
La segunda recomendación es evitar bloques catch vacíos. En otras palabras, no ignorar
excepciones cuando ocurren. Por ejemplo:
// Este código no es aceptable. Se ignora la excepción
try {
...
} catch (Exception e) {}
Los diseñadores de librerías lanzan excepciones por una razón: Para señalar que sucedió una
condición excepcional. Ignorar una excepción es análogo a ignorar una alarma de fuego – si no
se hace nada, el resultado puede ser desastroso. Como mínimo, se debe guardar en una traza
(log) el mensaje.
Si se quiere ignorar una excepción, quizá porque se hace un reintento automático que ocurre
cada uno o dos minutos, lo recomendable es poner un comentario en el bloque catch para
aclarar que la condición excepcional se está ignorando.
// Recomendado
try {
...
} catch (Exception e) {
// El sistema reintenta automáticamente cada minuto. No se hace
nada hasta
// el próximo reintento
}
La tercera recomendación es documentar todas las excepciones lanzadas por cada método.
Una descripción de las excepciones lanzadas por un método supone una parte importante de la
documentación requerida para el uso adecuado del método. Por tanto, es crítico que se
documenten cuidadosamente todas las excepciones lanzadas por cada método.
La forma correcta de documentar excepciones es con el tag javadoc @throws. Lo
recomendable es documentar todas las excepciones “explícitas” (checked exceptions) para
cada método. Por ejemplo, en la siguiente declaración se documenta la excepción lanzada y la
causa que provoca la excepción. No se recomienda poner sólo el fragmento @throws
NombreDeExcepción, ya que no añade más información que la proporcionada por la
declaración del método:
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 21
Framework de Desarrollo de Justicia
Versión 1.2
/**
* Carga la clase
*
* @param name
*
Nombre de clase
*
* @return Objeto <tt>Class</tt> resultante
*
* @throws ClassNotFoundException
*
Si la clase no se encuentra
*/
public Class loadClass(String name)
throws ClassNotFoundException {
...
}
La cuarta recomendación es usar encadenamiento y traducción de excepciones.
El encadenamiento de excepciones permite volver a lanzar una excepción, proporcionando
información adicional sin perder la causa originaria de la excepción. El encadenamiento de
excepciones fue introducido en la versión 1.4 de java.
El siguiente ejemplo muestra cómo usar encadenamiento de excepciones:
try {
...
} catch (IOException e) {
throw new EjemploDeExcepcion("Otra excepción IOException",
e);
}
Tal como se muestra, al capturar una excepción IOException, se crea una nueva excepción
EjemploDeExcepcion con la causa originaria adjuntada – la excepción IOException,
propagándose la cadena de excepciones al siguiente manejador de excepciones.
Este ejemplo también muestra la técnica denominada “traducción de excepciones”. El
objetivo de esta técnica es evitar que un método lance una excepción que no tenga nada que
ver en apariencia con la tarea realizada. Esto ocurre frecuentemente cuando un método
propaga una excepción que viene de otro método de una capa inferior. Además de
desconcertar, contamina el API de la capa superior con detalles de implementación. Si alguna
vez se cambia la implementación de la capa superior, la excepción que se lanza también puede
cambiar, afectando a los programas cliente.
Cuando sea posible, la mejor manera de tratar excepciones de capas inferiores será evitarlas,
asegurando que las llamadas a métodos de más bajo nivel siempre tengan éxito antes de
invocarlos. Esto se puede conseguir comprobando explícitamente la validez de los argumentos
de los métodos de alto nivel antes de pasarlos a capas inferiores. Si no se pueden evitar las
excepciones de bajo nivel, lo siguiente que se debe hacer es aislar al cliente de la capa
superior de los problemas en capas inferiores. En estas circunstancias, es apropiado guardar la
excepción en un log para su posterior investigación.
Hasta aquí se han enumerado las pautas principales recomendadas por SUN. El problema de
las pautas y reglas de SUN es que no siempre funcionan en la práctica. Al final, se impone el
criterio del usuario (el programador, en este caso). Muchos autores reconocidos como Bruce
Eckel abogan por usar como norma las excepciones en tiempo de ejecución, e incluso llegan a
cuestionarse la propia existencia de excepciones explícitas, considerándolas un experimento
fallido. (http://www.mindview.net/Etc/Discussions/CheckedExceptions). Eckel comenta que,
cuando uno examina pequeñas cantidades de código, las excepciones explícitas parecen una
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 22
Framework de Desarrollo de Justicia
Versión 1.2
idea brillante y prometen evitar muchos errores. La experiencia, sin embargo, indica lo contrario
para grandes cantidades de código.
3.5.2
Uso excesivo de excepciones explícitas
El uso excesivo de excepciones explícitas provoca algunos problemas:
 Demasiado código
El usuario del método está obligado a capturar excepciones explícitas que no se pueden
manejar (del tipo “algo fue muy mal”) y puede acabar escribiendo código que las ignora (ver
segunda recomendación).
 Código ilegible
Capturar excepciones que no pueden ser apropiadamente manejadas y relanzarlas
(envueltas en otro tipo de excepción) ayuda poco y puede llegar a despistar.
 Nunca se termina de traducir excepciones
Una excepción explícita debe ser capturada o declarada en la cláusula throws del método
que la encuentra. Esto permite elegir entre relanzar un número creciente de excepciones, o
capturar las excepciones de bajo nivel y relanzarlas traducidas en una nueva de mayor
nivel, algo deseable si se añade información útil. Si por el contrario, la excepción de bajo
nivel es irrecuperable, no se consigue nada con traducirla.
 Signaturas frágiles de métodos
Cuando varias clases usan un método, añadir una nueva excepción explícita al interfaz
requerirá muchos cambios de código.
 Las excepciones explícitas no siempre funcionan bien con interfaces
Si se abusa de las excepciones explícitas en el diseño de interfaces, podemos crear
dependencias que no son deseables. Un ejemplo de esto sería un interfaz de acceso a
datos que lanza una excepción IOException. Si la clase que implementa el interfaz no
accede a ficheros y accede a una base de datos, esta excepción no tiene sentido, pero
está obligando al cliente a capturarla.
3.5.3
Resumen práctico
Lo recomendado es seguir las pautas que se han dado en este documento, pero teniendo
en cuenta que el abuso de excepciones explícitas puede acarrear problemas. También se
ha comentado que usar excepciones explícitas o no es algo que se debe decidir
cuidadosamente. Por ello, es muy importante documentar las decisiones que se tomen.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 23
Framework de Desarrollo de Justicia
REQUISITOS
3.6
Versión 1.2
SOPORTE INTERNACIONALIZACIÓN
Las aplicaciones de Justicia deberán utilizar los mecanismos de internacionalización
soportados por la arquitectura J2EE y en concreto por las diferentes librerías que
compondrán el marco tecnológico de las aplicaciones. De esta forma, todas las cadenas
de texto utilizadas en la capa de presentación (etiquetas de los componentes de los
formularios, mensajes de error, aviso, etc) se extraerán a ficheros de propiedades.
El requisito de internacionalización no aplica a mensajes incluidos en trazas al no ser
directamente visualizados por los usuarios.
La ubicación de los ficheros de recursos se realizará según la estructura definida en el
apartado 3.1.
3.7
TAREAS ASINCRONAS (SCHEDULING)
Las aplicaciones deberán tener en cuenta que ciertas operaciones como la generación de
informes complejos, pueden suponer un enorme perjuicio de rendimiento si se realizan de
forma síncrona.
REQUISITOS
Para evitar estos problemas, las aplicaciones ante este tipo de operaciones deberán
cumplir los siguientes requisitos:

Las aplicaciones deberán proporcionar los mecanismos para impedir que un
usuario puede invocar de forma repetida una operación que suponga mucho
tiempo de procesamiento.

Las aplicaciones deberán gestionar de forma asíncrona este tipo de operaciones,
de tal forma que el usuario siempre reciba una pronta respuesta a su operación,
pero tenga mecanismos para saber cuando ésta ha concluido y el estado de éxito
o error de la misma.

La gestión asíncrona de las operaciones se realizará mediante el mecanismo que
ICM especifique.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 24
Framework de Desarrollo de Justicia
REQUISITOS
3.8
Versión 1.2
AUDITORIA
Dada la sensibilidad de los datos que manejarán las aplicaciones del Sistema de
Información Judicial deberán cumplir los requisitos de auditoria especificados por la Ley
Orgánica de Protección de Datos.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 25
Framework de Desarrollo de Justicia
3.9
Versión 1.2
MODELO DE SEGURIDAD
Las aplicaciones implementarán el modelo de seguridad que define ICM. Dicho modelo
incluirá las siguientes especificaciones:
-
Identificación
o acceso a repositorio único de usuarios
o obtención del DNI como identificación de accesos
-
Autorización
o contenedor de permisos que posibilite el acceso por DNI
o permitir que un usuario pueda tener distintos perfiles bajo una aplicación.
El control de acceso a las aplicaciones se realizará del siguiente modo:
Usuario
Contraseña
REQUISITOS
Certificado Digital
LDAP
ASF
DNI
DNI
B.D. Centralizada
USUJ
Autenticación
El usuario se podrá identificar en el sistema mediante dos posibilidades:
a).- Certificado Digital
b).- Usuario y contraseña
Para el caso a) el aplicativo ha de validar que el certificado digital utilizado para la
conexión es válido y no está revocado, estas acciones se realizarán a través de la
plataforma multiPKI ASF disponible en ICM.
A partir del certificado digital se obtendrá el DNI del usuario.
Para el caso b) el aplicativo ha de validar que el usuario/contraseña exista en el directorio
LDAP correspondiente.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 26
Framework de Desarrollo de Justicia
Versión 1.2
A partir del acceso a LDAP se obtendrá el DNI del usuario.
Autorización
Hasta que no tengamos el sistema RBAC definitivo, como alternativa a este, utilizaremos
el repositorio de usuarios USUJ centralizado en una única base de datos donde se
almacenará toda la información respecto a la gestión de perfiles de usuarios para las
distintas aplicaciones.
El sistema USUJ será creado para que permita asociar a un usuario con varios perfiles
ante una aplicación ubicada en una base de datos determinada.


Protocolos de acceso seguro basados en HTTPS (SSL v2-v3 /TSL v1)
Firma digital de documentos a través de la plataforma multiPKI de ASF.
Para la implementación de los mecanismos indicados anteriormente de autenticación y
autorización de usuarios se ha desarrollado un webservice denominado usuj_ws que
todas las aplicaciones tienen que utilizar en lugar de implementar su propia gestión de
usuarios. En ningún caso las aplicaciones podrán acceder directamente a las tablas de
usuj.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 27
Framework de Desarrollo de Justicia
Versión 1.2
3.10 ARQUITECTURA DE LAS APLICACIONES
REQUISITOS
Las aplicaciones deberán desarrollarse basando su capa de presentación en el
Framework Apache Struts 1.2, el cual obliga implícitamente a utilizar patrones de diseño
recomendados por la especificación J2EE (J2EE Patterns) entre los que destacan:

Model-View-Controller: El modelo vista controlador (MVC) permite independizar la
presentación, de la lógica de navegación y de los datos de la aplicaciones.

Front-Controller: El procesamiento de la peticiones es gestionado de manera
centralizada, unificando y facilitando el desarrollo de políticas de seguridad,
trazabilidad entre otras.

Composite View: Permite gestionar la capa de presentación como la composición
de múltiples vistas (encabezado, pie de página, menús, contenido, etc).
Para más información consultar el anexo Struts.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 28
Framework de Desarrollo de Justicia
Versión 1.2
3.11 CAPA PRESENTACION
REQUISITOS
La capa de presentación de las aplicaciones utilizará las librerías de etiquetas y
funcionalidades proporcionadas por Struts 1.2. De ellas se deducen los siguientes
requisitos:

Las aplicaciones utilizarán la extensión Tiles para definir las estructura principal
de las aplicaciones (encabezado, menú, pie de página, etc) así como cualquier
otra estructura que sea reutilizada en diferentes páginas.

Cualquier validación que realice la aplicación en el navegador (cliente) deberá
replicarse de lado servidor para garantizar la robustez de la misma.

Las validaciones básicas se realizarán usando la extensión Struts Validator,
definiéndose nuevos tipos de validación en caso de ser necesario.

Las validaciones que sean muy específicas de un determinado formulario podrán
realizarse directamente en Javascript en lado cliente y en Java en lado servidor,
sin necesidad de usar la extensión Struts Validator.

Las funciones Javascript que sean propias de la aplicación deberán ser extraídas
a un único fichero Javascript (fichero con extensión .js).

Los componentes gráficos avanzados requeridos por las aplicaciones: menus,
calendarios, pestañas, etc, deberán ser validados previamente por ICM.

En las páginas jsp nuncan se podrá incluir código de acceso a base de datos.
A fin de proporcionar un interfaz rico y evitar refrescos de página innecesarios, se propone
el uso de la tecnología AJAX (Asynchronous JavaScript And XML) como mecanismo de
refresco de componentes de una página.
REQUISITOS
En el caso de uso de esta tecnología se deberán cumplir los siguientes requisitos:

Se utilizará la implementación DWR (Direct Web Remoting) de AJAX.

La invocación de funcionalidad AJAX debe ser siempre consecuencia de una
interacción con el usuario, por ejemplo, al seleccionar el valor de un combo, se
carga de manera dinámica los valores de otro. En concreto, la carga inicial de una
página no debe implicar la ejecución de funcionalidad AJAX.

Se debe limitar la cantidad de información intercambiada mediante AJAX. Es
preferible recargar la página a intercambiar mediante AJAX gran cantidad de
información.

Se deberá simplificar el número de clases Java de lado servidor cuyos
servicios/métodos sean exportados a la capa de presentación mediante AJAX, de
esta forma se facilitará la depuración y se reducirá el código Javascript
autogenerado por la librería DWR.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 29
Framework de Desarrollo de Justicia
Versión 1.2

El código javascript estará siempre en ficheros JS que además se dividirán en
aquellos que hace uso de AJAX y los que son utilidades comunes, validaciones
de campos, etc.

El contenido en nuestro caso será generado por nuestras clases de negocio,
estas nunca deben ocuparse del formateo de datos para su presentación o de la
generación de código HTML.

Crear cada script y objeto con una funcionalidad concreta en distintos ficheros .js,
de esta forma podremos incluir solo los ficheros necesarios en las distintas
páginas, conseguimos una mayor reutilización de nuestros componentes AJAX,
optimizamos el rendimiento de la aplicación y facilitando el mantenimiento de los
mismos.

Nunca se utilizará AJAX para actualización de datos en base de datos.

Mantener una estructura de directorios adecuada dentro de nuestra carpeta JS
para un fácil mantenimiento de los scripts, la opción propuesta para un uso de
AJAX como el mencionado anteriormente es la siguiente:
Directorio de despliegue de la aplicación
/WebRoot/
/js/
Contendor del javascript.
/estandar /
...
Directorio para nuestros scripts de validación y
utilidades que no hacen uso de AJAX.
/librerias/
...
Directorio para incluir los ficheros de la librería
DWR o cualquier otra de la que se mantenga
una dependencia.
/ajax/
...
Aquí se incluyen scripts generales usados por
el resto de scripts AJAX
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 30
Framework de Desarrollo de Justicia
Versión 1.2
3.12 CAPA LOGICA DE NEGOCIO
Las aplicaciones deberán implementar la lógica de negocio atendiendo a los siguientes
requisitos:
REQUISITOS

La lógica se implementará en clases Java normales, comúnmente conocidas
como POJOs (Plain Old Java Object), de lo cual se deduce las siguientes normas:
o
Se prohíbe el uso de EJBs (Enterprise Java Beans).
o
Las clases serán independientes de cualquier framework usado en la
capa de presentación, es decir, deben ser clases independientes de las
acciones de Struts.
o
Estas clases accederán a las clases de las capa de persistencia para
acceder a los datos de la base de datos.
3.13 CAPA PERSISTENCIA
En la capa de persistencia se va a distinguir dos casuísticas:


Persistencia de datos entendida como la información que se va a almacenar en la base
de datos Oracle.
Persistencia de documentos referida a los documentos gestionados por las
aplicaciones, sean o no generados en el compositor de documentos.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 31
Framework de Desarrollo de Justicia
Versión 1.2
3.13.1 DATOS
La persistencia de los datos almacenados en la base de datos se realizará siguiendo el
patrón DAO (Data Access Object) y utilizando el motor de persistencia Hibernate.
El patrón DAO permite encapsular y ocultar el acceso a base de datos a la capa de lógica,
consiguiéndose independizar al máximo el desarrollo de las aplicaciones de la
implementación concreta de la persistencia.
REQUISITOS
El patrón DAO es uno de los patrones de diseño Standard de J2EE. DAO permite
encapsular el acceso y manipulación de datos en una capa separada. Esta capa gestiona
la conexión con la fuente de datos (bases de datos relacionales, ficheros planos, sistema
de ficheros remotos, etc) para obtener y almacenar dichos datos, ya que implementa el
mecanismo de acceso necesario. Independientemente del tipo de fuente de datos
empleada, la capa DAO siempre proporciona un API uniforme a sus clientes, ocultando
los detalles de implementación a sus clientes. Esencialmente, la capa DAO actúa como
adaptador.
La capa DAO se implementa sin estado. No almacena en caché resultados de ninguna
consulta ni datos que el cliente pueda necesitar posteriormente. Esto provoca que los
objetos DAO sean simples y evita problemas potenciales de concurrencia. La capa DAO
encapsula los detalles de persistencia subyacentes. Por ejemplo, cuando la capa DAO
accede por JDBC, todo el código desarrollado sobre JDBC queda ocultado por la propia
capa DAO y no se proporciona a clientes ni excepciones, estructuras de datos, objetos ni
interfaces que pertenezcan a los paquetes java.sql.* o javax.sql.*.
Diagrama de clases (extraído de “Core J2EE Patterns, Best Practices and Design
Strategies” por Deepak Alur, John Crupi y Dan Malks)
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 32
Framework de Desarrollo de Justicia
Versión 1.2
Estás ideas generales se concretan en los siguientes requisitos:

Todos los accesos a base de datos realizados por las aplicaciones se deberán
encapsular en clases DAO.

Deberá realizarse una utilización cuidadosa del motor de persistencia Hibernate
evitándose la carga en memoria de estructuras complejas fruto del mapeo entre el
modelo de datos relacional y el modelo orientado a objetos de Java.

En el caso de que el rendimiento de la aplicación se vea afectado en
determinadas consultas por la utilización del motor de persistencia, se podrá
utilizar el API JDBC directamente. Este uso requiere de autorización previa por
parte de ICM.

Excepcionalmente se puede hacer uso de la API JDBC desde la capa de
persistencia, sin que se requiera autorización previa por parte de ICM. Siempre
que se cumplan las siguientes condiciones:
1. Para llamada a procedimientos almacenados.
2. La conexión a BBDD se obtendrá de la sesión de Hibernate.
3. La llamada al procedimiento almacenado debe estar mapeado en una entidad
de Hibernate.
4. El acceso a los parámetros será por nombre y no por índice.
La forma de implementarlo esta publicado en el anexo sobre Hibernate.

La configuración de Hibernate relativa a la correlación entre el modelo de datos
relacional y el de objetos podrá fragmentarse en diferentes XMLs (en función de
módulos o entidades) a fin de facilitar su mantenimiento.

Todos los DAO deberán lanzar excepciones con significado. No deberán lanzar
java.lang.Exception, ya que es demasiado genérica y no transmite ninguna
información acerca de la raíz del problema. No deberán lanzar
java.sql.SQLException, es una excepción JDBC de bajo nivel. Un DAO deberá
esforzarse para encapsular el JDBC antes que mostrar el JDBC al resto de la
aplicación.

Si el código de acceso a datos captura una excepción, que no sea ignorada. Los
DAO's que ignoran una excepción capturada son problemáticos.

Usar chained exceptions para cambiar excepciones de bajo nivel a excepciones
de alto nivel.
Se activarán los mecanismos de trazabilidad de Hibernate integrados con Log4j,
extendiéndose en caso de ser necesarios, a fin de cumplir los requisitos de trazabilidad de
las aplicaciones del Sistema de Información Judicial especificados previamente.
Hibernate es un potente mapeador objeto/relacional y servicio de consultas para Java. Es la
solución ORM (Object-Relational Mapping) más popular en el mundo Java.
Hibernate permite desarrollar clases persistentes a partir de clases comunes, incluyendo
asociación, herencia, polimorfismo, composición y colecciones de objetos. El lenguaje de
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 33
Framework de Desarrollo de Justicia
Versión 1.2
consultas de Hibernate HQL (Hibernate Query Language), diseñado como una mínima
extensión orientada a objetos de SQL, proporciona un puente elegante entre los mundos de
objetos y relacional. Hibernate también permite expresar consultas utilizando SQL nativo o
consultas basadas en criterios.
Soporta todos los sistemas gestores de bases de datos SQL y se integra de manera elegante y
sin restricciones con los más populares servidores de aplicaciones J2EE y contenedores web, y
por supuesto también puede utilizarse en aplicaciones standalone.
Características clave:
o
Persistencia transparente: Hibernate puede operar proporcionando persistencia de
una manera transparente para el desarrollador.
o
Modelo de programación natural: Hibernate soporta el paradigma de orientación a
objetos de una manera natural: herencia, polimorfismo, composición y el framework de
colecciones de Java.
o
Soporte para modelos de objetos con una granularidad muy fina: Permite una
gran variedad de mapeos para colecciones y objetos dependientes.
o
Sin necesidad de mejorar el código compilado (bytecode): No es necesaria la
generación de código ni el procesamiento del bytecode en el proceso de compilación.
o
Escalabilidad extrema: Hibernate posee un alto rendimiento, tiene una caché de dos
niveles y puede ser usado en un cluster. Permite inicialización perezosa (lazy) de
objetos y colecciones.
o
Lenguaje de consultas HQL: Este lenguaje proporciona una independencia del SQL
de cada base de datos, tanto para el almacenamiento de objetos como para su
recuperación.
o
Soporte para transacciones de aplicación: Hibernate soporta transacciones largas
(aquellas que requieren la interacción con el usuario durante su ejecución) y gestiona la
política optimistic locking automáticamente.
o
Generación automática de claves primarias: Soporta los diversos tipos de
generación de identificadores que proporcionan los sistemas gestores de bases de
datos (secuencias, columnas autoincrementales,...) así como generación independiente
de la base de datos, incluyendo identificadores asignados por la aplicación o claves
compuestas.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 34
Framework de Desarrollo de Justicia
Versión 1.2
Para más información consultar el anexo Hibernate.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 35
Framework de Desarrollo de Justicia
Versión 1.2
REQUISITOS
3.13.2 DOCUMENTOS
Para la persistencia de los documentos se utilizará el repositorio de Centera, teniendo en
cuenta que Centera es un repositorio final de documentos. El uso de Centera para
documentos de carácter temporal no es el adecuado ya que Centera mantiene estos
documentos durante largos periodos de tiempo según la configuración realizada en el
repositorio donde estos se alojen.
Para el almacenado y recuperación de documentos en este repositorio se dispone de un
API java.
En el caso de que sea necesaria la utilización de un gestor documental o que sea preciso
localizar documentos en base al contenido del mismo, se estudiará una solución en ICM.
Como funciona CENTERA - Perspectiva de la aplicación
Centera 3G
Servidor/es
El Objeto se envía
a Centera vía API
sobre IP
El Objeto es creado o
utilizado por la
aplicación
Se devuelve la
dirección por
Contenido a la
aplicación
Centera genera
una dirección
única por
contenido
La Dirección por
Contenido se retiene para
futuras referencias de la
aplicación
© 2005 EMC Corporation. All rights reserved.
9
Centera es un buen gestor documental, robusto y con altas prestaciones para el
almacenamiento de grandes volúmenes de información. Es adecuado para entornos que
requieran un alto grado de seguridad ya que garantizan la estabilidad de los datos y buena
respuesta frente a operaciones de escritura y recuperación de documentos.
También cabe destacar que paralelo a este sistema de almacenamiento es necesario disponer
de un control de identificadores de documentos y dotarle de algún mecanismo de seguridad a
este registro, ya que el único punto de entrada para recuperar un documento es a través de
este número de identificador que se le asigna de forma automática al almacenar el documento,
y en caso de perder esta referencia sería imposible recuperar ese documento.
Existe una consola de administración para realizar ciertas operaciones de mantenimiento del
gestor, si bien es poco elaborada y el gestor en si no permite muchas operaciones.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 36
Framework de Desarrollo de Justicia
Versión 1.2
Para conectar con el gestor documental se requiere el EMC Centera API, que nos facilitará la
funcionalidad necesaria para realizar operaciones de almacenado y recuperación de ficheros,
así como llegar a poder trabajar con ciertos metadatos asociados al fichero con el que se está
trabajando.
La implementación del API de Centera es dependiente del sistema operativo y esta disponible
para los siguientes:
o
o
o
o
o
o
o
AIX
HP-UX
Iris
Linux
Solaris
Windows
z/OS
En Centera se trabajara con el objeto C-Clip para almacenar ficheros y es recomendable añadir
información específica del fichero en forma de metadatos para poder posteriormente
consultarlos. Esto lo obtenemos mediante el uso de FPClip_SetDescriptionAttribute()
y de FPClip_GetDescriptionAttribute().
Centera almacena internamente los ficheros junto con sus metadatos o por separado
dependiendo del valor del parámetro embeddedBlobsize. EL valor de este parámetro
indicará el tamaño para el cual los ficheros de menor tamaño se almacenarán conjuntamente y
los mayores por separado. Para obtener un mejor rendimiento es aconsejable que el valor de
este parámetro sea 10000.
En resumen, lo más importante a tener en cuenta quizás sea el tratamiento del id asociado al
fichero que nos devuelve el API cuando guardemos el fichero y entender Centera como un gran
repositorio con operaciones de grabado, lectura y borrado siendo estas realmente sencillas
como se muestra en el siguiente ejemplo que acompaña al empaquetado del API.
/**
* almacenaFichero
*
* @param filename
* @return clipID
* @throws FPLibraryException
*/
private static String almacenaFichero(String filename)throws FPLibraryException {
long retentionPeriod = 0;
String clipID = "";
String CLIP_NAME = "store-content-file";
String VENDOR_NAME = "EMC";
String APP_NAME = "storeContentExample";
String APP_VERSION = "2.3";
String TAG_NAME = "StoreContentObject";
try { // crea un nuevo C-Clip
FPClip theClip = new FPClip(thePool, CLIP_NAME);
theClip.setDescriptionAttribute("app-vendor", VENDOR_NAME);
theClip.setDescriptionAttribute("app-name", APP_NAME);
theClip.setDescriptionAttribute("app-version", APP_VERSION);
theClip.setRetentionPeriod(retentionPeriod);
FPFileInputStream inputStream = new FPFileInputStream(new File(filename));
FPTag topTag = theClip.getTopTag();
FPTag newTag = new FPTag(topTag, TAG_NAME);
topTag.Close();
newTag.setAttribute("filename", filename);
newTag.BlobWrite(inputStream);
clipID = theClip.Write();
System.out.println("Clip almacenado con id: " + clipID + ".");
inputStream.close();
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 37
Framework de Desarrollo de Justicia
Versión 1.2
newTag.Close();
theClip.Close();
} catch (FileNotFoundException e) {
throw new IllegalArgumentException("No se puede abrir el fichero " + filename);
} catch (IOException e) {
System.err.println("Error leyendo del fichero " + filename);
e.printStackTrace();
}
return (clipID);
}
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 38
Framework de Desarrollo de Justicia
4
Versión 1.2
COMPOSITOR DE DOCUMENTOS
Para la composición de documentos se va a utilizar Velocity 1.5.
Velocity 1.5 es un motor de plantillas basado en Java que incluye un lenguaje de script, el
Lenguaje de Plantillas de Velocity (VTL por sus siglas en inglés). El Lenguaje de Plantillas
de Velocity (VTL) nos permite incorporar contenido dinámico dentro de un documento de
tipo texto de una manera fácil y sencilla. Este lenguaje se utilizará para la creación de las
plantillas.
Desde la parte del Modelo de la aplicación es dónde se va a realizar la fusión de las
plantillas utilizando el API Java de Velocity 1.5. Se trata de que la fusión del documento se
realice en el lado del servidor. El uso del API en java básicamente consiste en definir un
contexto con las variables a mapear en el documento, aplicar este contexto a la plantilla y
generar el nuevo documento.
REQUISITOS
En el desarrollo del compositor de documentos hay que tener en cuenta los siguientes
requisitos:

Las plantillas se crearan en formato RTF y los documentos generados
también va a ser RTF

Tanto las plantillas como los documentos se almacenarán en Centera. Este
punto se explica en el apartado correspondiente a persistencia de datos .

Se deberán utilizar los mecanismos que incorpora Velocity para que utilice
Log4J para los logs que se generen en el uso de esta librería.

Utilizar nombres significativos en las variables, y notaciones sencillas al hacer
uso de las etiquetas que dote de claridad a la plantilla y sea fácilmente
inteligible mediante una lectura rápida. Esto ayudará a realizar un buen
mantenimiento de la misma cuando sea necesario aplicarla modificaciones.

Utilizar sintaxis de etiquetas simple, escapando de notaciones más complejas
a no ser que esté justificada claramente su utilización.

No anidar bucles en la medida de lo posible. Estos procesos interactivos
complican los procesos de renderizado.

Hacer uso de las estructura de datos estándar: string, list y map. Su
procesado es rápido y eficaz.

Incorporar macros a las plantillas cuando se prevea una reutilización del
mismo en varios puntos del documento o cuando la operación de renderizado
se presuponga compleja. En este último caso el macro deberá mostrar una
interfaz clara en su llamada que aporte la máxima claridad a la plantilla.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 39
Framework de Desarrollo de Justicia
Versión 1.2

Escapar de utilizar llamadas a macros de manera recursiva.

Delegar el menor trabajo posible al generador de documentos. A pesar de que
incorporan cierta potencia de calculo, operaciones y operadores, manejo
avanzado de estructuras de datos, etc… prescindir cuando sea posible de
ello, delegando esos cálculos a nuestra aplicación y dejando que en
compositor de documentos solo realice la tarea de renderizado, la de
“dibujar” el documento.

Complementando a la anterior cabe insistir en la necesidad de que los datos
que alimentan la plantilla, deben de ir adecuadamente tratados y
formateados.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 40
Framework de Desarrollo de Justicia
5
Versión 1.2
TRATAMIENTO DE FICHEROS XML
Cuando las aplicaciones necesiten trabajar con ficheros XML, tanto para generarlos como
para leerlos, se utilizará el JAXB (Java Architecture for XML Binding ) que nos
proporciona un modo de mapear un esquema de un fichero xml con su representación en
clases Java.
REQUISITOS
.
Partiendo de un fichero de esquema de definición de xml se compilara y se generan las
correspondientes clases Java de la estructura definida en el esquema. Estas clases Java
se incorporan al proyecto.
Cuando se quiere leer un documento XML hay que realizar un unmarshal del fichero.
Cuando se quiere generar un documento XML hay que realizar un marshal del fichero.
Además nos permite validar los documentos XML.
Las versiones actualizadas de JAXB se encuentra la página web
https://jaxb.dev.java.net/
Va a realizar el mapeo de un fichero de datos en formato XML a un modelo de objeto, a
un bean de Java. La ventaja del objeto java es la facilidad de uso que presenta su
interfaz, muy conocido y posibilidad de serial izarlo para propagarlo en un entorno
clusterizado.
Para pasar al modelo de objetos (creación del bean), se requerirá de la definición de un
esquema XML para definir un mapeo en el que figurará la correlación entre el fichero de
datos y el objeto.
Este fichero de mapeo no soporta un DTD pero si incorpora la comprobación de la sintaxis
que nos garantizará su corrección. Esto es una gran ventaja.
La implementación de referencia utiliza SAX para parsear el documento lo que aporta un
menor consumo de memoria. El bean construido de XML ocupa menos que un árbol de
DOM.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 41
Framework de Desarrollo de Justicia
Versión 1.2
Una gran ventaja es la gran variedad de documentación disponible en castellano y con
muchos ejemplos.
Una amplia documentación puede encontrarse en las siguientes direcciones:
http://java.sun.com/webservices/jaxb/
http://java.sun.com/webservices/jaxb/faq.html
http://java.sun.com/webservices/docs/1.4/tutorial/doc/index.html
6
GENERACION DE INFORMES
La solución que se ha de utilizar para la generación de informes o listados es Crystal
Reports XI utilizando el Java Reporting Component. El Java Reporting Component (JRC)
se proporciona con las distribuciones de Crystal Reports XI Developer y Advanced
Developer.
El JRC es una solución de reporting en Java que procesa informes para ser visualizados o
exportados. Este componente debe ser utilizado en un servidor de aplicaciones Java y
puede ser usado para añadir funcionalidad de informes a aplicaciones Java sin la
necesidad de desplegar componentes como BusinessObjects Enterprise.
REQUISITOS
Aspectos del Java Reporting Component

Solución 100% Java que se ejecuta completamente dentro de un servidor de
aplicaciones Java.

Visualizador de informes en DHTML.

Visualizador de partes de un informe.

Soporta la capacidad enviar dinámicamente información a un report.

Soporta la capacidad de desde programación de cambiar la base de datos del
informe.

Soporta exportación a formatos RTF y PDF.
A la hora de utilizar el JRC hay que tener en cuenta los siguientes requisitos:



Los reports definidos deberán tener la extensión .rpt.
Serán incluidos en una carpeta que se encontrará dentro del ear de la
aplicación.
El api del JRC se utilizará en las clases Java del modelo y no en las jsp de la
capa de presentación.
Para más información consultar el anexo Crystal Reports XI.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 42
Versión 1.2
INTEROPERABILIDAD CON SISTEMAS EXTERNOS
Para comunicarse con Sistemas Externos se desarrollaran webservices apoyándose en el
la implementación SOAP del servidor de aplicaciones.
8
OTRAS CUESTIONES A TENER EN CUENTA
REQUISITOS
7
REQUISITOS
Framework de Desarrollo de Justicia
Además deberán cumplir los requisitos de seguridad que ICM defina en el modelo de
seguridad a adoptar para el Sistema de Información Judicial, es decir la firma del mensaje
SOAP se realizará a través de la plataforma multipki ASF utilizando el estandar XMLDSig.

En el caso de almacenar la sesión en Base de Datos no se debe utilizar la
variable JSESSION ID ya que el valor de esta variable no es único para los
dos nodos del cluster. La aplicación deberá generar un identificador único
cada vez que se cree una nueva sesión. Este identificador se debería meter
como una cookie de sesión para que se replique en todos los nodos del
cluster. El valor de esta cookie es el que va a identificar la sesión.

Se debe utilizar el fichero WEBLOGIC.XML que ICM suministre para los
desarrollos. (Este fichero estará disponible en la web de soja.
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 43
Framework de Desarrollo de Justicia
9
Versión 1.2
RESUMEN
REQUISITO
SOLUCIÓN BASE
VERSION
AJAX
Direct Web Remoting (DWR)
1.0 ó 1.1 beta
Almacenamiento de
Documentos
Centera
3.0
Build tool
Maven 2 ó
Apache Ant 1.6.5
Compositor de
documentos
Apache Velocity
1.5
Configuración
Apache Jakarta Commons
Configuration
1.1
Documentación
Javadoc
Entrega del proyecto
Eclipse
Eclipse 3.1
Informes
Crystal Reports Java Reporting
Component
Crystal Reports
Developer
Devoloper XI
Modelo-VistaControlador
Apache Struts
1.2.x
Persistencia de
Datos
Hibernate
3.1.1
Test de pruebas
JUnit
StructsTestCase
Pruebas de carga y
stress
Apache JMeter
Tratamiento de
ficheros xml
JAXB (Java JWDP)
2.0
Trazabilidad
Apache Log4j
1.2.13 ó 1.2.x
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 44
Framework de Desarrollo de Justicia
Versión 1.2
10 REFERENCIAS
PRODUCTO
URL
Ant
http://ant.apache.org/
Apache Maven
2
http://maven.apache.org/
Centera
http://www.emc.com/products/systems/centera.jsp
http://lighthouse.emc.com/portal/index.php
Crystal Reports
http://www.businessobjects.com/products/dev_zone/java/
DWR
http://getahead.ltd.uk/dwr/
Eclipse
http://www.eclipse.org/
Especificaciones
J2EE























J2EE Platform Specification 1.4
J2EE Connector Specification 1.5
J2EE Deployment API Specification 1.1
J2EE Management Specification 1.0
ECperf 1.1
Enterprise JavaBeans Specification 2.1
Enterprise JavaBeans to CORBA Mapping 1.1
Java API for XML Processing Specification 1.2
Java API for XML Registries Specification 1.0
Java API for XML-based RPC Specification 1.1
Java Authorization Contract for Containers 1.0
Java IDL API
Java Naming and Directory Interface Specification 1.2.1
Java Message Service Specification 1.1
Java Servlet Specification 2.4
Java Transaction API Specification 1.0.1B
Java Transaction Service Specification 1.0
JDBC Specifications, 3.0, 2.1, and Optional Package API
(2.0)
JavaBeans Activation Framework Specification 1.0.2
JavaMail API Specification 1.3
JavaServer Pages Specification 2.0
RMI over IIOP
SOAP with Attachments API for Java Specification 1.2
Hibernate
http://www.hibernate.org/
JAXB
http://java.sun.com/webservices/jaxb/
http://java.sun.com/webservices/jaxb/about.html
http://java.sun.com/webservices/jwsdp/index.jsp
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 45
Framework de Desarrollo de Justicia
PRODUCTO
Versión 1.2
URL
JMeter
http://jakarta.apache.org/jmeter/
Selenium
http://selenium.openqa.org/
JUnit
http://junit.sourceforge.net/
Log4j
http://logging.apache.org/log4j/
MyEclipse
http://www.myeclipseide.com/
Struts
http://struts.apache.org/
StrutsTestCase
http://strutstestcase.sourceforge.net/
Tiles
http://struts.apache.org/struts-tiles/index.html
Velocity
http://jakarta.apache.org/velocity
Ckechstyle
http://checkstyle.sourceforge.net/index.html
PMD
http://pmd.sourceforge.net/
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 46
Framework de Desarrollo de Justicia
Versión 1.2
11 ANEXOS













Guía de Estilo (PPT)
Nomenclatura de Oracle
Plantillas Word de Documentos del Área de Proyectos de Desarrollo. (carpeta Oficina
de Proyectos)
Guía de Erwin (GuiaDiseñoERWIN.DOC)
Detalle requisitos del POB
Arquitectura de Sistemas (Arquitectura.doc)
Apache Maven 2
Convenciones
Generación de trazas en Log4J
Test de pruebas
Struts
Hibernate
Crystal Reports XI
Subdirección General de Desarrollo, Tecnología e Infraestructuras.
Página: 47