GUÍA DE DESARROLLO SISTEMA WEB EIA. Trytton Tecnologías website www.trytton.com email
[email protected] Mayo 2008 San José, Costa Rica
Tel: (506) 2227-2250 Cel: (506) 8859-5656
2
Guía de Desarrollo El objetivo de esta guía es proveer un medio de inducción en el desarrollo componentes para la aplicación “Web-EIA”; de modo que cada desarrollador posea independencia en cuanto al conocimiento mínimo y necesario para implementar bajo la arquitectura del sistema. Puede existir distintos escenarios bajos los cuales un desarrollador pueden enfrentarse a desarrollador nueva funcionalidad o bien dar mantenimiento correctivo y evolutivo a la aplicación; sin embargo, en el contexto de esta guía se asume que es una misma persona que se encargará de dicho desarrollo. Para esto se brinda una guía de cómo desarrollar una nueva funcionalidad implementando los componentes necesarios en cada una de las capas en las que se compone la arquitectura del sistema: interfase de s, servicios, lógica de negocio y datos (persistencia). Para las siguientes secciones se asume que el proceso de construcción iniciará en la capa de interfase de hasta llegar a la capa inferior de a datos; el modelo de base de datos se asume completo y no es parte de esta guía los cambios que deban realizarse.
Página 2 de 9 Tel: (506) 2227-2250 www.trytton.com email:
[email protected] San Francisco de Dos Ríos, San José, Costa Rica
3
Interfase de En esta capa se definen dos tipos elementos prioritarios: las páginas Java Server Faces (JSF) y los Backing Beans que dan soporte a los eventos ocurridos en las páginas dinámicas.
Creación de Páginas Inicialmente al construir una aplicación utilizando las herramientas es de suma importancia que los elementos a utilizar en las páginas sean controles JSF, tal y como se muestra en la siguiente figura (no utilice elementos HTML estandard):´
Página 3 de 9 Tel: (506) 2227-2250 www.trytton.com email:
[email protected] San Francisco de Dos Ríos, San José, Costa Rica
4
Ilustración 1 Paleta JSF-MyEclipse Sin embargo, la aplicación utiliza la distribución JSF del grupo Apache MyFaces de modo que las mayoría de elementos no se encuentran disponibles en dicha paleta y por la tanto deben ser accedidos mediante su incorporación en la vista de edición de código. Para esto debe agregar el siguiente marcador a la página por crear: <%@ taglib uri="http://myfaces.apache.org/tomahawk" prefix="t"%>
De modo que los elementos son accedidos mediante el marcador
Nota: las páginas deben ser creadas según la estructura de directorios definidos para los grupos funcionales, en la siguiente figura se muestra la estructura actual del sitio Web:
Ilustración 2 Estructura del sitio Página 4 de 9 Tel: (506) 2227-2250 www.trytton.com email:
[email protected] San Francisco de Dos Ríos, San José, Costa Rica
5
Backing Beans Al crear un bean istrado en JSF ese se crea en el paquete ccad.eia.vistas esto debido a que su responsabilidad es la mantener los mecanismos de control de interfase de s siguiendo el patrón J2EE Front Controller. Recuerde agregar para cada una de las páginas un Backing Bean que brinde soporte al JSF. Estos elementos deben quedar reflejados como en el archivo de configuración faces-config.xml, por ejemplo: <managed-bean> <managed-bean-name>RegistroFase <managed-bean-class> ccad.eia.vistas.RegistroFase <managed-bean-scope>session
Ilustración 3 Backing Beans en archivo de configuración
Herencia y Acciones En el caso que un backing bean de istración estilo CRUD recuerde que está debe de heredar de la clase VistaCRUD la cual posee el esquema básico para dichas operaciones, sino esta debe heredar de la clases VistaWeb. En este backing bean debe agregar el código requerido para: inicializar listas de selección, campos predefinidos, lista de selección múltiples, árboles y tablas. Recuerde agregar los métodos para manejar las acciones requeridas: refrescar listas, actualizar datos, consultas, etc. Por ejemplo, el botón agregar dispara el comando agregarFase del backing bean RegistroFase:
Ilustración 4 Acción en botón
Página 5 de 9 Tel: (506) 2227-2250 www.trytton.com email:
[email protected] San Francisco de Dos Ríos, San José, Costa Rica
6
Entonces, el backing bean debe contener el elemento necesario para soportar dichos eventos, siguiendo el ejemplo anterior, RegistroFase debería contener el siguiente método: public String agregarFase(){ this.setEnRegistro(true); return "agregarFase"; } Ilustración 5 Manejo de acción
Manejo de Estado Normalmente es necesaria la istración del estado de los elementos que el Backing Bean debe soportar, para esto debe útil-izarla las entidades del dominio que se encuentran mapeadas en el mecanismo de persistencia, por ejemplo la clase RegistroFase contiene el siguiente atributo para mantener el estado de fase que se encuentra actualmente en edición: /**Fase que se agrega o edita**/ private
FaseEstudio
faseEstudio;
De modo que la fase que se edita es la que se mapea a los elementos de edición para mantener el estado de los elementos HTML-JSF, por ejemplo: El campo de calendario posee su atributo mapeado al atributo RegistroFase.faseEstudio.fechaInicio (Con CTRL-Barra Espaciadora es posible acceder cada atributo de cada clase mapeada):
Ilustración 6 Referencia a atributo Página 6 de 9 Tel: (506) 2227-2250 www.trytton.com email:
[email protected] San Francisco de Dos Ríos, San José, Costa Rica
7
Lógica de Negocio Las clases de lógica de negocio se encargan de brindar los servicios que externamente son ofrecidos por la aplicación. Adicionalmente posee la responsabilidades de los siguiente requerimientos no funcionales: manejo de bitácoras, transacciones, seguridad por roles del . Como regla se ha definido que toda clase de lógica de negocio debe estar definido para implementar una interfase, y la instanciación de dicha clase debe ser implementada en la clase utilitaria ccad.eia.ServiceLocator, en el caso del ambiente de desarrollo el ServiceLocator retorna instancias locales de dichas interfases tal y como se muestra a continuación: public class ServiceLocator implements Serializable { /** * Campo serialVersionUID que contiene el estado para */ private static final long serialVersionUID = 1L; ServiceLocator(){ super(); } public static IEIA getIEIA(){ return new EIA(); }…
En el ejemplo anterior se muestra el retorno de la implementación de la interfase IEIA utilizando la instancia local, esto puede variarse en ambiente de producción para implementar EJB de Session en un ambiente distribuido. En caso de que la interfase requerida no se encuentre creada esta se debe crear en el proyecto EIA-LN en el paquete de interfases y su implementación en el paquete de implementación tal y como se muestra en la siguiente figura:
Paquete de implementación de interfases Paquete de definición de interfases Ilustración 7 Estructura del proyecto de lógica de negocio Página 7 de 9 Tel: (506) 2227-2250 www.trytton.com email:
[email protected] San Francisco de Dos Ríos, San José, Costa Rica
8
En caso de que la interfase y su implementación existan pero que el método requerido no se encuentre implementado, este debe implementarse ya que se asumen que es parte de los pendintes del proyecto. Como regla de arquitectura se ha definido que toda invocación a la capa de (DAO) a datos debe realizarse mediante las clases de lógica de negocio y además deben coordinar el inicio y fin de transacciones como en el siguiente ejemplo:
/* (non-Javadoc) * @see ccad.eia.ln.interfases.IEIA#crearEvaluacion(ccad.eia.dal.Evalu acionImpactoAmbiental) */ public void crearEvaluacion(EvaluacionImpactoAmbiental evaluacion) throws EIAExcepcion { Transaction t = this.evaluacionImpactoAmbientalDAO.getSession().beginTransaction(); evaluacion.setFechaRegistro(new Date()); this.evaluacionImpactoAmbientalDAO.save(evaluacion); t.commit(); }
a Datos La capa de a datos ha sido parcialmente delegada al mecanismos de generación de código del MyEclipse para Hibernate en donde existirá un objeto de transferencia para cada tabla del modelo relacional así como una clase DAO por cada tabla, dicho código es generado por la herramienta y no debe ser modificado bajo ninguna circunstancia.
Página 8 de 9 Tel: (506) 2227-2250 www.trytton.com email:
[email protected] San Francisco de Dos Ríos, San José, Costa Rica
9
Métodos de búsqueda Para implementar el mecanismo de búsquedas requeridas por lógica de negocio u otras clases se ha definido el pseudo-patrón Finder para el cual existe la clases base Finder de la cual el resto de clases de búsqueda heredan. Por ejemplo, en el caso de necesitar realizar búsquedas para estudios EIA se ha definido la siguiente clase Zinder: public class FinderEstudiosEIA extends FinderBase
La cual contiene un método de búsqueda findFasesPorTipoEstudio basado en HQL (Hibernate Query Language) que se define de la siguiente forma:
@SuppressWarnings("unchecked") public List
findFasesPorTipoEstudio(String codTipoAccionHumana){ Query query = getSession().createQuery("from FaseTipoEstudio fte where fte.tipoAccionHumana.codigo = :codTipoAccionHumana order by fte.idFase"); query.setString("codTipoAccionHumana", codTipoAccionHumana); return (List
)query.list(); }
En el ejemplo anterior se muestra claramente como se define el método de búsqueda, cómo se definen los parámetros de dicho método y como deben retornarse sus resultados. A nivel de regla se ha definido que deben utilizarse listas fuertemente tipificadas utilizando Generics de Java por ejemplo: List
. Los Finder específicos deben ser implementados en el paquete ccad.eia.dal.finders. La lógica de negocio en muchos casos implementa su funcionalidad haciendo explícitamente invocación a los Finder y no haciendo ningún procesamiento adicional, por ejemplo el siguiente método: public List obtenerEstudios() { return finderEstudiosEIA.findEvaluaciones();
} La implementación definida lo que hace es retornar una búsqueda del Finder que ha sido definido para tal fin. Página 9 de 9 Tel: (506) 2227-2250 www.trytton.com email:
[email protected] San Francisco de Dos Ríos, San José, Costa Rica