8 de julio de 2013

Front Controller

Es un patrón de diseño que se basa en usar un controlador como punto inicial para la gestión de las peticiones. El controlador gestiona estas peticiones, y realiza algunas funciones como: comprobación de restricciones de seguridad, manejo de errores, mapear y delegación de las peticiones a otros componentes de la aplicación que se encargarán de generar la vista adecuada para el usuario. La siguiente figura muestra un esquema de ello:
Este elemento provee un controlador centralizado para gestionar las peticiones webs a la aplicación. Un controlador frontal recibe todas las peticiones entrantes de los clientes, remitiendo a su vez cada petición al gestor de peticiones (Dispatcher) adecuado, que se encargar· de gestionar la construcción de una respuesta adecuada al cliente. Son los puntos ideales para implementar servicios de seguridad, tratamiento de errores, y la gestión del control para la generación de contenidos.

El sistema requiere un punto de acceso centralizado para que el manejo de peticiones de la capa de presentación soporte la integración de los servicios del sistema, recuperación de contenidos, control de vistas, y navegación. Cuando el usuario accede a la vista directamente sin pasar un mecanismo centralizado, podrían ocurrir dos problemas:
-       Se requiere que cada vista proporcione sus propios servicios del sistema, lo que normalmente resulta en duplicación de código.
-       La vista de navegación se deja a los visores. Esto podría resultar en una mezcla de contenidos y navegación.

·         Ventajas:

-       Tenemos centralizado en un único punto la gestión de las peticiones
-       Aumentamos la reusabilidad de código
-       Mejoramos la gestión de la seguridad
·         Desventajas:

-       La velocidad de respuesta disminuye al tener que ser procesadas las peticiones primero por el controlador.

Al usar un controlador como el punto inicial de contacto para manejar las peticiones. El controlador maneja las peticiones, incluyendo la invocación de los servicios de seguridad como la autentificación y autorización, delegar el procesamiento de negocio, controlar la elección de una vista apropiada, el manejo de errores, y el control de la selección de estrategias de creación de contenido.

Un controlador se coordina con un componente dispatcher. Los dispatchers son responsables del control de la vista y de la navegación. Así, un dispatcher elige la siguiente vista por el usuario y dirige el control al recurso. Los dispatchers podrían encapsularse directamente dentro del controlador o se puede extraer en un componente separado.

Aunque el patrón Front Controller sugiere la centralización del manejo de peticiones, no limita el número de manejadores en el sistema.

·         Estructura (diagrama de clases)


·         Diagrama de secuencia



·         Participantes
1)    Controller
El controlador es el punto de contacto inicial para manejar todas las peticiones en el sistema. El controlador podría delegar a un helper  para completar la autentificación y la autorización de un usuario o para iniciar la recuperación de un contacto.
2)    Dispatcher
Un dispatcher es el responsable del manejo de la vista y de la navegación, controlando la elección de la siguiente vista que se le presentará al usuario, y proporcionando el mecanismo para dirigir el control a ese recurso.
El dispatcher utiliza un objeto RequestDispatcher (soportado en la especificación Servlet) y encapsula algún procesamiento adicional.
3)    Helper
Un helper es el responsable de ayudar a la vista o al controlador a completar su procesamiento. Los helpers tienen muchas responsabilidades, incluyendo la recopilación de los datos requeridos por la vista y el almacenamiento en el modelo intermedio. Además, los helpers pueden adaptar este modelo de datos para usarlo en la vista.
Una vista podría trabajar con cualquier número de helpers, que normalmente son componentes JavaBeans
4)    View
Una Vista representa y muestra información al cliente. La vista recupera información desde el modelo. Los helpers soportan las diferentes vistas encapsulando y adaptanto el modelo de datos subyacente para usarlo en el display.

Fast Lane Reader

Este patrón propone un mecanismo para obtener grandes cantidades de información utilizando un acceso directo sobre la base de datos. También conocido como JDBC for Reading
Se implementa en casos que corresponden a búsquedas que devuelven una colección de objetos
Cuando se tienen casos de uso que corresponden a búsquedas múltiples y la eficiencia es un factor importante
·         Estructura

·         Participantes
-       Business Delegate
Delega las operaciones de búsqueda múltiple en un Session Facade (que usa un DAO) o directamente en un DAO
-       SessionFacade
Un Session Bean que implementa las operaciones de búsqueda múltiple delegando en un DAO
-       DAO
Proporciona las operaciones de búsqueda accediendo directamente a la BD
·         Riesgos y beneficios de su implementación
Beneficios
-       Alternativa más eficiente que operaciones find en interfaces
-       Home que devuelven múltiples Entity Beans
Riesgos
-       Información obsoleta (Idem Value Object)

·         Implementación
Se usa con el patrón Page-By-Page Iterator cuando las operaciones de búsqueda pueden devolver colecciones grandes (más de lo que se puede presentar en una pantalla de resultados)
Core J2EE Patterns describe el patrón Value List Handler (FastLane Reader + Page-by-Page Iterator)
Si los Entity Beans son de tipo CMP, los DAOs sólo necesitan tener las operaciones de búsqueda correspondientes
Business Delegate  accede directamente al DAO
Se evita una invocación remota
No es una arquitectura en 3 capas pura
La implementación de las búsquedas reside en el cliente
Necesita drivers para la BD
·         Patrones relacionados

-       Data Access Object
-       Page-by-Page Iterator
-       Session Facade
-       Business Delegate
·         Uso de Fast Lane Reader en un bean de sesión


Value List Handler

Se utiliza para controlar la búsqueda y hacer caché de resultados que se proporcionan al cliente con un tamaño y desplazamiento que cumpla con los requisitos. Se utiliza un Iterator que nos ofrece una interfaz estándar para recorrer una estructura de datos sin que nos tengamos que preocupar por la representación interna de los datos y proporcionando a nuestro código independencia de la estructura de los datos.
Puede ayudar a acceder a una gran lista de Transfer Objects (patrón que representa los objetos de negocios) de manera eficiente. Este patrón controla la funcionalidad de la ejecución de consulta y el caché de resultados. Puede acceder directamente a un objeto de acceso a datos (implementación del patrón Data Access Object, DAO) y almacenar los resultados obtenidos como una colección de Transfer Objects.
Este patrón, al solicitar objetos por bloques, proporciona una mayor flexibilidad de consulta y mejora el rendimiento de la red.

 

La mayoría de las aplicaciones de la plataforma J2EE tienen un requerimiento de búsqueda y consulta para buscar y listar ciertos datos. En algunos casos, dichas operaciones de búsqueda y consulta podrían traer resultados que pueden ser bastante grandes. No es práctico devolver toda la hoja de resultados cuando los requerimientos del cliente son moverse por los resultados, en vez de procesar el conjunto completo.

Muchas veces el cliente sólo ve los primeros registros que devuelve la búsqueda, y podría descargar los registros restantes e intentar otra nueva consulta. La práctica de obtener una lista de valores representados en un bean de entidad llamando al método ejbFind(), que devuelve una collection de objetos remotos, y luego llamar a cada bean de entidad para obtener el valor, consume muchos recursos de red y se considera una mala práctica.

La aplicación cliente necesita una facilidad de consulta eficiente para evitar tener que llamar al método ejbFind() de cada bean e invocar a cada objeto remoto devuelto.

Se necesita una mecanismo de caché en la capa-servidor para servir a los clientes que no pueden recibir y procesar el cojunto de resultados completo.

Se puede optimizar una consulta que se ejecuta repetidamente sobre unos datos razonablemente estáticos para proporcionar resultados más rápidos. Esto depende de la aplicación y de la implementación de este patrón.


Utilizar un Value List Handler para controlar la búsqueda, hacer un caché con los resultados, y proporcionar los resultados al cliente en una hoja de resultados cuyo tamaño y desplazamiento cumpla los requerimientos del cliente es una de las mejores opciones para mejorar el rendimiento
Este patrón crea un ValueListHandler para controlar la funcionalidad de la ejecución de la consulta y el caché de resultados. El ValueListHandler accede directamente a un DAO que puede ejecutar la consulta requerida. El ValueListHandler almacena los resultados obtenidos del DAO como una colección de Transfer Objects. El cliente le pide al ValueListHandler que proporcione resultados de la consulta según los necesite.
·         Estructura (diagrama de clases)


·         Diagrama de secuencia

Transfer Object

Es uno de los patrones más utilizado. Se utiliza para la comunicación, transporte e intercambios de datos negocio especialmente útil en aplicaciones distribuidas.
Se implementa con un objeto que extiende la interfaz Serializable. Es una representación estado/valor de un objeto y se utiliza para encapsular datos de negocio. Se trata de un JavaBeans, con los atributos propios del objeto de dominio con carácter privado, y métodos get y set para acceder y modificar sus valores.
Existen varios enfoques de este patrón. Cuando el Transfer Object modela una tabla relacional y los atributos de la clase son los campos de la tabla, se está utilizando un Domain Value Object. Si se encapsulan atributos de varias tablas, creando una clase que combine sólo los atributos requeridos, se está utilizando un Custom Value Object.
Este patrón, en el contexto JDBC, nos permite representar un conjunto de atributos procedentes de uno o varios objetos de dominio; en el contexto EJB representa eficiencia. Sin embargo, hay que tener cuidado en el diseño porque hay casos en el que puede contener información obsoleta.

Las aplicaciones de la plataforma J2EE implementan componentes de negocio del lado del servidor como beans de sesión y de entidad. Algunos métodos expuestos por los componentes de negocio devuelven datos al cliente. Algunas veces, el cliente invoca a los métodos get de un objeto de negocio varias veces para obtener todos los valores de los atributos.
Los beans de sesión representan los servicios de negocio y no se comparten entre usuarios. Un bean de sesión proporciona métodos de servicios genéricos cuando se implementan para el patrón Session Facade.
Por otro lado, los beans de entidad, son objetos transacionales, multiusuario que representan datos persistentes. Un bean de entidad expone los valores de los atributos proporcionando un método accesor (también referidos como métodos get) por cada atributo que desea exponer.
Toda llamada a método hecha al objeto de servicio de negocio, ya sea a un bean de entidad o a un bean de sesión, potencialmente es una llamada remota. Así, en una aplicación de JavaBeans Enterprise (EJB) dichas llamadas remotas usan la capa de red sin importar la proximidad del cliente al bean, creando una sobrecarga en la red. Las llamadas a métodos de beans enterprise podría penetrar las capas de red incluso si tanto el cliente como el contenedor EJB que mantiene el bean de entidad se están ejecutando en la misma JVM (Máquina Virtual Java), el mismo Sistema Operativo o máquina física. Algunos vendedores podrían implementar mecanismos para reducir esta sobrecarga utilizando una aproximación de acceso más directa pasando por encima de la red.
Según se incrementa la utilización de estos métodos remotos, el rendimiento de la aplicación se puede degradar significativametne. Por lo tanto, utilizar varias llamadas a métodos get que devuelven simples valores de atributos es ineficiente para obtener valores de datos desde un bean enterprise.

Todos los accesos a un bean enterprise se realizan mediante interfaces remotas. Cada llamada a un bean enterprise potencialmente es una llamada a un método remoto con sobrecarga de red.
Normalmente, las aplicaciones tienen transacciones de lectura con mayor frecuencia que las de actualización. El cliente solicita los datos desde la capa de negocio para su presentación, y otros tipos de procesamientos de sólo-lectura. El cliente actualiza los datos de la capa de negocio con mucha menos frecuencia con la que los lee.
El cliente normalmente solicita valores que son algo más que un atributo o que son dependientes del objeto de un bean enterprise. Así, el cliente podría invocar varias llamadas remotas para obtener los datos necesarios.
El número de llamadas que un cliente hace al bean enterprise impactan en el rendimiento de la red.
Al utilizar un Transfer Object que encapsula los datos de negocio, se utiliza una única llamada a un método para enviar y recuperar el Transfer Object. Cuando el cliente solicita los datos de negocio al bean enterprise, éste puede construir el Transfer Object, rellenarlo con sus valores de atributos y pasarlo por valor al cliente.
Los clientes normalmente solicitan más de un valor a un bean enterprise. Para reducir el número de llamadas remotas y evitar la sobrecarga asociada, es mejor el Transfer Objects para transportar los datos desde el bean enteprise al cliente.
Cuando un bean enterprise utiliza un Transfer Object, el cliente hace una sola llamada a un método remoto del bean enterprise para solicitar el Transfer Object en vez de numerosas llamadas remotas para obtener valores de atributos individuales. Entonces el bean enterprise construye un nuevo ejemplar Transfer Object, copia dentro los valores del objeto y lo devuelve al cliente. El cliente recibe el Transfer Object y puede entonces invocar los métodos accesores (o get) del Transfer Object para obtener los valores de atributos individuales del objeto Transfer Object. O, la implementación del Transfer Object podría hacer que todos los atributos fueran públicos. Como el Transfer Object se pasa por valor al cliente, todas las llamadas al ejemplar Transfer Object son llamadas locales en vez de invocaciones de métodos remotos.
·         Estructura (diagrama de clases)


·         Diagrama de secuencia




Service Locator

En sistemas distribuidos se utiliza para abstraer la utilización de JNDI y ocultar las complejidades asociadas a la creación del contexto, búsquedas de objetos y creación de objetos tipo EJB.
Consiste en utilizar un objeto Service Locutor para abstraer toda la utilización JNDI y para ocultar las complejidades de la creación del contexto inicial, de búsqueda de objetos home EJB y recreación de objetos EJB. Varios clientes pueden reutilizar el objeto Service Locutor para reducir la complejidad del código, proporcionando un punto de control.
·         Contexto
La búsqueda y creación de servicios implican interfaces complejos y operaciones de red.
·          Problema
Los clientes interactúan con componentes de servicio, que proporcionan servicios de negocio y capacidades de persistencia. Para interactuar con estos componentes, los clientes deben localizar el componente de servicio (referido como una operación de búsqueda) o crear un nuevo componente. 
Todos los clientes de aplicaciones J2EE utilizan la facilidad JNDI para buscar y crear componentes EJB o JMS. El API JNDI permite a los clientes obtener un objeto.
Por eso, localizar un objeto servicio administrado JNDI es un tarea común para todos los clientes que necesiten acceder al objeto de servicio. Por ejemplo, es fácil ver que muchos tipos de clientes utilizan repetidamente el servicio JNDI, y que el código JNDI aparece varias veces en esos clientes. Esto resulta en una duplicación de código innecesaria en los clientes que necesitan buscar servicios.
También, crear un objeto de contexto JNDI inicial y realizar una búsqueda para objeto home EJB utiliza muchos recursos. Si varios clientes requieren de forma repetitiva el mismo objeto home de un bean, dicha duplicación de esfuerzos puede impactar de forma negativa en el rendimiento de la aplicación.
La búsqueda y creación de Beans Enterprise trata sobre lo siguiente:
Una correcta configuración del entorno JNDI para que se conecte con el servicio de nombrado y directorio utilizado por la aplicación. Esta configuración proporciona la localización del servicio de nombrado y las credenciales de autentificaciones necesarias para acceder a ese servicio.
Entonces el servicio JNDI puede proporcionar al cliente un contexto inicial que actúa como un almacén para las uniones de componentes nombre-a-objeto. El cliente solicita a este contexto inicial que busque el objeto EJBHome del bean enterprise requerido proporcionando un nombre JNDI para ese objeto EJBHome.
Encontrar el objeto EJBHome utilizando el contexto de búsqueda inicial
Después de obtener el objeto EJBHome, crea, elimina o encuentra el bean enterprise utilizando los métodos create, move o find (solo para beans de entidad) del objeto EJBHome..
·         Causas
Los clientes EJB necesitan utilizar el API JNDI para buscar objetos EJBHome utilizando el nombre registrado del bean enterprise.
Los clientes JMS necesitan utilizar el API JNDI para buscar componentes JMS utilizando los nombres registrados en JDNI para esos componentes JMS.
La factoría de contextos utilizada para la creación del contexto inicial JNDI la proporciona el vendedor del proveedor del servicio y por lo tanto es dependiente del vendedor. La factoría de contexto también es dependiente del tipo de objeto que se está buscando. El contexto para una JMS es diferente que el contexto para EJBs, con diferentes proveedores.
La búsqueda y creación de componentes de servicio podría ser compleja y se podría utilizar repetidamente en múltiples clientes en la aplicación.
La creación del contexto inicial y el servicio de búsqueda de objetos, si se utiliza frecuentemente, pueden consumir muchos recursos e impactar en el rendimiento de la aplicación. Esto es especialmente cierto si los clientes y los servicios están localizados en diferentes capas.
Los clientes EJB podrían necesitar reestablecer conexiones a un ejemplar de bean enterprise al que se ha accedido previamente, teniendo solamente su objeto Handle.
·         Solución
Utilizar un objeto Service Locator para abstraer toda la utilización JNDI y para ocultar las complejidades de la creación del contexto inicial, de busqueda de objetos home EJB y de re-creación de objetos EJB. Varios clientes pueden reutilizar el objeto Service Locator para reducir la complejidad del código, proporcionando un punto de control, y mejorando el rendimiento proporcionando facilidades de caché.
Este patrón reduce la complejidad del cliente que resulta de las dependencias del cliente y de la necesidad de realizar los procesos de búsqueda y creación, que consumen muchos recursos. Para eliminar estos problemas, este patrón proporciona un mecanismo para abstraer todas las dependencias y detalles de red dentro del Service Locator.

·         Estructura (diagrama de clases)



·         Diagrama de secuencias



-       Client
Este es el cliente del Service Locator. El cliente es un objeto que normalmente requiere acceder a objetos de negocio como un Business Delegate.
-       Service Locator
El Service Locator abstrae el API de los servicios de búsqueda (nombrado), las dependencias del vendedor, las complejidades de la búsqueda, y la creación de objetos de negocio, y proporciona un interface simple para los clientes. Esto reduce la complejidad del cliente. Además, el mismo cliente y otros clientes pueden reutilizar el Service Locator.
-       InitialContext
El objeto InitialContext es el punto de inicio para los procesos de búsqueda y creación. Los proveedores de servicio proporcionan el objeto context, que varía dependiendeo del tipo de objetos de negocio proporcionados por el servicio de búsqueda y creación del Service Locator. Un Service Locator que proporciona los servicios para varios tipos de objetos de negocio (como beans enterprise, componentes JMS, etc.) utiliza varios tipos de objetos context, cada uno obtenido de un proveedor diferente (por ejemplo, el proveedor de contexto para un servidor de aplicaciones EJB podría ser diferente del proveedor de contexto para un servicio JMS).
-       ServiceFactory
El objeto ServiceFactory representa un objeto que proporciona control del ciclo de vida para objetos BusinessService. El objeto ServiceFactory para beans enterprise es un objetoEJBHome.
El ServiceFactory para componentes JMS puede ser un objetoConnectionFactory, como un TopicConnectionFactory o un  QueueConnectionFactory.
-       BusinessService

BusinessService es un rol que cumple el servicio que el cliente ha solicitado. El objetoBusinessService se crea, se busca o se elimina mediante el objeto ServiceFactory. El objeto BusinessService en el contexto de una aplicación EJB es un vean} enterprise. El objetoBusinessService en el contexto de una aplicación JMS puede ser un TopicConnection o un QueueConnection. TopicConnection y QueueConnection se pueden entonces utilizar para producir un objeto JMSSession, como un TopicSession o un QueueSession