1 Desarrollo de Software basado en Componentes en la Plataforma J2EE Julio Ariel Hurtado Alegría, Lina María Castillo Paredes Facultad de Ingeniería Electrónica y Telecomunicaciones, Universidad del Cauca, Popayán, Colombia Resumen. Este articulo define los temimos más usados en el área del Desarrollo de Software Basado en Componentes (DSBC) como “componentes”, “interfaces”, “contratos”, “patrones”, “modelos de componentes”, “arquitecturas software”, y “framework de componentes”. Basados en ellos, los modelos y plataformas de componentes proporcionan los mecanismos adecuados para tratar la complejidad de los problemas que aparecen en los sistemas abiertos y distribuidos, de allí la importancia de tratar de identificar cada uno de estos elementos en las plataformas mas destacadas en desarrollo de aplicaciones empresariales como son J2EE y .NET. Tomando como referencia la plataforma J2EE, se identifican todos los conceptos que involucra el DSBC terminando con algunas consideraciones especiales para el diseño de aplicaciones J2EE. componentes pueden ser construidos por distintos desarrolladores utilizando diferentes lenguajes y plataformas. A su vez, el DSBC, trata de sentar las bases para el diseño y desarrollo de aplicaciones distribuidas basadas en componentes software reutilizables. La motivación para el uso de componentes fue la reducción del costo de desarrollo, pero después fue más importante la reducción del tiempo de construcción. En la actualidad el uso de componentes está más motivado por las posibles reducciones en los costos de desarrollo. El DSBC está muy relacionado con el reuso. La idea del reuso de piezas de software se originó en los 60´s cuando el término de la crisis del software fue mencionado por primera vez. La reutilización en el desarrollo de software puede verse desde varios puntos de vista: Abstract. This paper defines commonly used terms within the area of the Component Based Software Development (CBSD) such as “components”, “interfaces”, “contracts”, “patterns”, “components models”, “software architectures” and “components frameworks ”. Based on them, the Components models and platforms provide the appropriated mechanisms to try the problems complexity that emerge in the open and distributed systems, thence the importance to try of identify each one of these elements in the most prominent platforms in the business applications development such as J2EE and .NET. Taking as reference the J2EE platform, all of the concepts that involve the DSBC are identified, ending with some special considerations for the applications J2EE design. - El punto de vista tecnológico: donde la reutilización puede ser de componentes software en el reuso o para el reuso, así como la generación automática de implementaciones a partir de una especificación dada, por ejemplo, un modelo de clases completamente especificado puede llevar de manera automática a código. - El punto de vista del objeto a reutilizar: aquí la reutilización puede darse para cualquier artefacto del proceso de desarrollo, a cualquier nivel de abstracción e incluso puede hablarse de la reutilización del conocimiento. Palabras Clave: J2EE, Arquitectura, Reutilización, Plataforma, Componentes, contratos, interfaz, frameworks, EJB, Patrones. Los sistemas basados en componentes resultan de la adopción de una estrategia de diseño basada en componentes y la tecnología de componentes software que incluye los productos y conceptos que soportan esta estrategia de diseño. La estrategia de diseño está muy relacionada con el estilo de arquitectura, es decir, patrones de diseño de alto nivel descritos por los tipos de componentes en un sistema y sus patrones de interacción. La tecnología de componentes software refleja estos patrones de diseño y esta reflexión es debido al hecho de que esta tecnología no existe solamente en herramientas de diseño, sino que se implementa como parte del sistema. Este patrón es encontrado en tecnologías de componentes de software comerciales tales como Enterprise JavaBeans de Sun Microsystems, y COM+ de Microsoft, así como prototipos de investigación tales como el SEI WaterBeans y otros. I. INTRODUCCIÓN Los continuos avances en la Informática y las Telecomunicaciones han cambiado la forma en la que se desarrollan actualmente las aplicaciones software. En particular, el continuo aumento de la potencia de los computadores personales, el abaratamiento de los costos del hardware y las comunicaciones, y la aparición de redes de datos globales han disparado el uso de los sistemas abiertos y distribuidos. Esto ha provocado que los modelos de programación existentes se vean excedidos, siendo incapaces de manejar de forma natural la complejidad de los requisitos para este tipo de sistemas. Una de las soluciones mas prometedoras es la estrategia del desarrollo software basado en componentes (DSBC), que se basa en la idea de que los sistemas software pueden ser desarrollados seleccionando los componentes apropiados que luego son ensamblados tomando como referencia arquitectura software bien definida. Estos II. CONCEPTOS Algunos de los conceptos que se manejan dentro del DSBCse exponen a continuación: 2 Un componente (1) es una implementación software que puede ser ejecutada en un dispositivo físico o lógico. Un componente implementa una o más interfaces (2) y satisfacen ciertas obligaciones o contratos (3). Un componente puede ser desplegado en ambientes estándares en tiempo de ejecución (4). Un sistema basado en componentes esta formado por diferentes tipos de componentes, que desempeñan un papel específico en el sistema (5). Un modelo de componentes (6) es el conjunto de tipos de componentes, sus interfaces y una especificación de los patrones de interacción permitidos entre los diferentes tipos de componentes. Un framework de componentes (7) provee una variedad de servicios en tiempo de ejecución (8) para soportar e implementar el modelo de componentes. La siguiente Ilustración presenta un modelo de referencia para estos conceptos. 3 2 1 C. Contratos 6 4 Son los puntos de acceso a un componente. Es una colección de operaciones que son utilizadas para especificar un servicio de un componente [3]. En una interfaz, cada semántica de una operación es especificada, para que los proveedores de componentes la implementen. Los componentes pueden implementar (exportar) una o mas interfaces y pueden utilizar (importar) interfaces de otros componentes. Así, interfaces exportadas corresponden a servicios que un componente proporciona, e interfaces importadas corresponden a servicios que un componente necesita para implementar los servicios a exportar [4]. Las interfaces de un componente deben proporcionar un contrato que declara los servicios que un componente ofrece y los servicios que este requiere para cumplir a cabalidad sus funciones. Es importante distinguir la interfaz abstracta, que es independiente de una implementación y la interfaz de frontera que está asociada con una implementación y por consiguiente debe exhibir propiedades que no son encontradas en las interfaces abstractas. 5 8 7 A. componentes Actualmente existe una gran discrepancia entre la mayoría de los ingenieros de software sobre el concepto de componente. La polémica suscitada recientemente entre Szyperski y Meyer [1] sobre el concepto de componente, sus propiedades y su naturaleza, podemos considerarla como uno de los ejemplos mas recientes y representativos sobre la confusión que genera el propio concepto de componente. En el contexto del DSBC, un componente es una unidad o elemento con propósito bien definido que, trabajando en conjunto con otros, puede ofrecer alguna funcionalidad compleja. En términos formales, un componente es una pieza de software que cumple con dos características: no depende de la aplicación que la utiliza y, se puede emplear en diversas aplicaciones [2]. Según los asistentes a la ECOOP961, un componente es una unidad de composición con interfaces contractualmente especificadas y dependencias explícitas con el contexto. Un componente software puede ser desplegado independientemente y estar sujeto a la composición por parte de terceros [1]. B. Interfaces 1 10th European Conference for Object-Oriented Programming. Linz, Austria, July 8-12, 1996. Especificación que se añade a la interfaz de un componente y que establece las condiciones de uso e implementación que ligan a los clientes y proveedores del componente. Los contratos cubren aspectos tanto funcionales (semántica de las operaciones de la interfaz) como no funcionales (calidad de servicio, prestaciones, fiabilidad o seguridad). Hay dos sentidos de contratos que son necesarios en el DSBC: los contratos de componentes y los contratos de interacción. Los contratos de componentes describen los patrones de interacción que tiene sus orígenes en un componente. Los contratos de interacción especifican las obligaciones recíprocas entre los tipos de interfaces que deben ser implementadas por componentes arbitrarios. Los modelos de componentes tales como EJB™ definen modelos de interacción (y por lo tanto contratos) entre, por ejemplo, contenedores y beans de sesión. D. Patrones Cuando hablamos de patrones nos ubicamos en la reutilización de experiencias y conocimientos adquiridos por el mismo desarrollador o por otros. Un patrón es una solución a un problema en un contexto dado, que puede ser repetida con éxito en problemas similares. La idea de los patrones es recoger las prácticas de soluciones que han dado mejores resultados, expresarlas de una manera general y ejemplarizada con el fin de que sirvan de esquema para que otros la solucionen de una manera más rápida y eficaz. De igual manera, las soluciones que llevan a malos resultados pueden esquematizarse y a estos esquemas se les denomina antipatrones. Los patrones en la construcción de software pueden ser de diferentes tipos dependiendo de la etapa dentro del proceso de desarrollo y dentro del proceso mismo. De esta manera tenemos: modelos de dominio, patrones arquitecturales (estilos), patrones de diseño, patrones de código específicos a una tecnología (idioms), patrones de 3 diseño implementados en una API (Frameworks), patrones de procesos, entre otros. E. Modelos de Componentes Un modelo de componentes especifica los estándares y convenciones impuestas en el desarrollo de componentes que pueden ser clasificados de la siguiente manera: - - - Tipos de Componentes. Un tipo de componente debe ser definido en términos de las interfaces que éste implementa. Un modelo de componentes requiere que los componentes implementen una o más interfaces y de esta forma un modelo de componentes puede ser visto para definir uno o más tipos de componentes. Esquemas de interacción. Los modelos de componentes deben especificar cómo son localizados los componentes, cuales protocolos de comunicación son utilizados y cómo las calidades de servicios asociadas a la seguridad y al manejo de transacciones son alcanzadas. El modelo de componentes debe describir cómo interactúan los componentes entre ellos o cómo éstos interactúan con el framework de componentes. Enlace de recursos. El modelo de componentes describe cuales recursos están disponibles para los componentes y cómo y cuando los componentes se enlazan a estos recursos. F. Arquitecturas Software Existen numerosas definiciones de arquitecturas software y el núcleo de todas ellas es la noción de que la arquitectura software de un sistema define su estructura en bruto. Esta estructura clarifica decisiones de alto nivel, incluyendo aspectos de cómo el sistema está compuesto de partes interactivas, donde están los principales caminos de interacción, y cuales son las propiedades claves de las partes. Adicionalmente una descripción de la arquitectura incluye suficiente información para permitir análisis de alto nivel y valoración crítica. Para proveer una descripción abstracta de un sistema, la arquitectura expone ciertas propiedades, mientras esconde otras. Idealmente, esta representación proporciona una guía para todo el sistema, permite a los diseñadores razonar acerca de la habilidad de un sistema para satisfacer ciertos requerimientos, y sugiere un plano para la construcción y composición del sistema. La documentación de la arquitectura describe la estructura de un sistema a través de una o más vistas, cada una de las cuales identifica una colección de componentes de alto nivel y las relaciones entre ellos. Un componente arquitectural representa una unidad coherente de funcionalidad. Las relaciones entre estos componentes arquitecturales indican que aspectos de un componente son usados por otros componentes y cómo la comunicación entre componentes procede sobre el tiempo. Algunos investigadores consideran que el estilo de arquitectura de las aplicaciones empresariales basadas en componentes debería ser en capas y modular. Las aplicaciones multicapa se dividen generalmente en 3 capas: - Una capa cliente, que incluye clientes basados en un navegador, otras aplicaciones empresariales y aplicaciones cliente. - Una capa media, que soporta módulos que proporcionan los servicios de la aplicación empresarial a los clientes y que implementan la lógica de negocios. - Una capa del sistema de información empresarial (EIS), que soporta los sistemas de información empresariales que gestiona y almacena las funciones y los datos críticos. Las tres plataformas empresariales más importantes en el momento son: J2EE, .NET y CORBA. G. Plataformas para aplicaciones distribuidas El disponer de componentes software no es suficiente para desarrollar aplicaciones, ya provengan estos de un mercado global o sean desarrollados a medida para la aplicación. Un aspecto crítico a la hora de construir sistemas complejos es el diseño de la arquitectura del sistema, y por ello el estudio de la Arquitectura Software se ha convertido en una disciplina de especial relevancia en la ingeniería del software [5]. La reutilización de arquitecturas software se realiza a través de un framework, que se puede definir como un diseño reutilizable de todo o parte de un sistema, representado por un conjunto de clases abstractas y la forma en la cual sus instancias interactúan. Un framework distribuido está diseñado para integrar componentes y aplicaciones software en ambientes distribuidos, permitiendo la modularidad y reutilización en el desarrollo de nuevas aplicaciones [6]. En la terminología de la programación orientada a componentes, este término es sinónimo de Plataforma de Componentes Distribuidos (PCD). Este tipo de marcos ofrecen un entorno de desarrollo y de ejecución de componentes software que permite aislar la mayor parte de las dificultades conceptuales y técnicas que conlleva la construcción de aplicaciones basadas en componentes. Cada plataforma se apoya en los estándares y mecanismos definidos por su modelo de componentes base; en este sentido, podemos definir una plataforma como una implementación de los mecanismos del modelo, junto con una serie de herramientas asociadas. Ejemplos de estas plataformas son .NET, J2EE y Bonobo, que se apoyan en los modelos de componentes COM, Enterprise JavaBeans y CORBA, respectivamente. H. Framework de componentes Es una implementación de servicios que soportan o implementan un modelo de componentes. Una buena forma de pensar en un framework de componentes es como un minisistema operativo. Con esta analogía, los componentes son a los frameworks lo que los procesos son a los sistemas operativos. El framework gestiona los recursos compartidos por los componentes, y proporciona los mecanismos fundamentales para permitir la comunicación entre componentes. Sin embargo, a diferencia de los sistemas operativos de propósito general como Unix, que soporta una 4 gran colección de mecanismos de interacción, los frameworks de componentes son especializados para soportar un rango limitado de tipos de componentes y sus interacciones. Algunos ejemplos de frameworks de componentes pueden ser vistos en la práctica. La especificación Enterprise JavaBeans™ (EJB), define un framework de servicios y contenedores para soportar el modelo de componentes EJB, con servidores responsables de proporcionar servicios de persistencia, transacción, seguridad, mientras los contenedores son responsables de gestionar el ciclo de vida de los componentes, el framework de componentes WaterBeans es especializado en interacciones de componentes para visualización de cadenas de datos en tiempo real y visualización de composición de componentes, el framework de VisualBasic, que es especializado en la composición visual de componentes, entre otros. parte de los contenedores es, junto con la independencia de plataforma, una de las ventajas más destacables de J2EE. III. LA PLATAFORMA J2EE Los contenedores que encontramos en la arquitectura J2EE son: Lo primero que hay que decir de la plataforma J2EE es que es una especificación para el desarrollo de aplicaciones empresariales basadas en web que corren en ambientes multicapa. J2EE proporciona un modelo de programación que consiste en un conjunto de APIs y dirige la manera de construir aplicaciones. Por otra parte, J2EE especifica cómo debe ser la infraestructura de la aplicación sobre la cual puedan correr las aplicaciones. Esta infraestructura de la aplicación es proporcionada por los contenedores de las implementaciones de J2EE. La plataforma J2EE es esencialmente un ambiente de servidor de aplicaciones distribuidas que proporciona: - - Un conjunto de API´s de extensión Java para construir aplicaciones y que definen un modelo de programación para aplicaciones J2EE. Una infraestructura en tiempo de ejecución hospedar y gestionar aplicaciones. La siguiente ilustración muestra la arquitectura J2EE en función de sus contenedores: Contenedor del applet APPLET APIs de J2EE A. Arquitectura de J2EE Las aplicaciones distribuidas requieren acceso a un conjunto de servicios empresariales como procesamiento de transacción, acceso a bases de datos, mensajería, etc. La arquitectura J2EE unifica el acceso a estos servicios en sus APIs de servicios empresariales y las aplicaciones acceden a estas APIs a través de un contenedor. Un contenedor es el software que en tiempo de ejecución permite que las aplicaciones J2EE accedan al conjunto de APIs de J2EE y gestiona los componentes de la aplicación desarrollados según las especificaciones. Esta gestión de los componentes por Base de Datos Contenedor web SERVLETS JSPs Contenedor de la aplicación cliente Contenedor EJB RMI EJB APIs de J2EE APIs de J2EE Aplicación Cliente APIs de J2EE RMI - Un contenedor web para hospedar Java Servlets y páginas JSP. - Un contenedor EJB para hospedar componentes Enterprise JavaBean. - Un contenedor de applet para hospedar los Java applets. Un contenedor de la aplicación cliente para hospedar aplicaciones Java estándar. - Cada uno de estos contenedores provee un ambiente en tiempo de ejecución para los componentes respectivos. En ésta arquitectura hay principalmente dos tipos de clientes: - Clientes Web, que normalmente corren en navegadores Web. Estos clientes usan HTTP para comunicarse con el contenedor Web. Los contenedores Web son responsables de aceptar las solicitudes de los clientes Web, y generar respuestas con la ayuda de los componentes de la aplicación. Los componentes de la aplicación en los contenedores Web incluyen servlets Java y páginas JSP. Estos componentes implementan la funcionalidad requerida por los clientes Web. - Clientes EJB. Son aplicaciones que acceden a componentes EJB en contenedores EJB. Hay tres tipos de clientes EJB: La primera categoría son los clientes de la aplicación, que son aplicaciones standalone que acceden a componentes EJB utilizando el protocolo RMI-IIOP. La segunda categoría, son los componentes en el contenedor Web, tales como Servlets Java y páginas JSP que también pueden acceder a los componentes EJB a través del protocolo RMI-IIOP. La categoría final son otros EJB corriendo en el contenedor EJB, que se comunican a través de llamadas al método de java estándar, por medio de una interfaz local [7]. para En términos Java, el framework para el desarrollo de aplicaciones distribuidas es J2EE. Las características y funcionalidad de la plataforma permiten la creación de aplicaciones basadas en componentes escalables, distribuidas y flexibles. HTTP SSL La arquitectura J2EE define dos tipos de contratos: 5 Contratos a nivel del sistema entre un servidor de aplicación y un adaptador de recursos y Contratos de aplicación entre un componente de aplicación y un adaptador de recursos. Contratos a nivel del sistema. Definen un estándar de conexión entre los servidores de aplicación y los sistemas de información empresariales (EIS). Los vendedores del EIS o proveedores de adaptadores de recursos implementan su parte del contrato a nivel del sistema en un adaptador de recursos. Un adaptador de recursos es una librería que es específica al EIS y es diseñada para proveer conectividad al EIS. El adaptador de recursos es el componente que se conecta al servidor de aplicación. Un ejemplo de adaptador de recursos es un driver JDBC que se conecta a una base de datos relacional. La interfaz entre un adaptador de recursos y su EIS particular es específica al tipo de EIS y debe ser una interfaz nativa o de cualquier otro tipo. Desde el punto de vista de los servidores de aplicación, los contratos a nivel de sistema son considerados una Service Provider Interface (SPI) que proporciona una forma estándar para que los vendedores extiendan los contenedores para que soporten conexión a múltiples EISs. Actualmente hay tres tipos de contratos a nivel del sistema (1) Contratos de gestión de conexión. Permiten al servidor de aplicación combinar conexiones para un EIS subyacente, mientras que al mismo tiempo permite a los componentes de la aplicación conectarse a un EIS. (2) Contratos de gestión de transacciones. Este contrato es entre el gestor de transacción que es provisto con el servidor de aplicación y un EIS que soporta transacciones externas y locales.(3) Contratos de seguridad. Permiten acceso seguro a un EIS. Contratos a nivel de aplicación. Son los contratos entre un componente de aplicación y un adaptador de recursos. Este contrato define la API cliente que un componente de aplicación utiliza para acceder a un EIS. Esta API debe ser una API específica para un tipo particular de adaptador de recursos y el EIS subyacente. JDBC es una API cliente específica para un tipo de adaptador de recurso específico, en este caso, una base de datos relacional. B. El modelo de componentes EJB El estándar Enterprise Java Bean (EJB) es una arquitectura de componentes para componentes desplegables del lado del servidor en Java. Es un acuerdo entre componentes y servidores de la aplicación que permite a cualquier componente correr en cualquier servidor de aplicación. Los componentes EJB son desplegables y pueden ser importados y cargados en un servidor de aplicación, que almacena estos componentes. Físicamente, un EJB es dos cosas en una: - Una especificación. Que define las reglas del acuerdo entre los componentes y los servidores de aplicación. - Un conjunto de interfaces Java. Los componentes y servidores de aplicación deben adaptarse a estas interfaces. Desde que todos los componentes sean escritos para las mismas interfaces ellos significan lo mismo para el servidor de aplicación. EJB es específicamente utilizado para resolver problemas empresariales, y debe realizar cualquiera de las siguientes tareas: - Hacer la lógica del negocio. Ejemplos de esto incluye: computarizar los impuestos de una tarjeta de compra, asegurarse de que el administrador tiene autorización para aprobar la orden de compra, etc. - Acceder a una base de datos: Por ejemplo, transferencia de dinero entre dos cuentas bancarias, llamadas a procedimientos almacenados para recuperar un tiquete en un sistema de soporte de ventas, etc. - Acceder a otros sistemas. Ejemplos incluyen, llamadas a sistemas heredados de alto desempeño escritos en COBOL que computariza el factor de riesgo para una nueva cuenta de seguro, etc. C. Tecnologías J2EE Las tecnologías J2EE proveen los mecanismos necesarios para la construcción de grandes aplicaciones empresariales distribuidas. Estas tecnologías pueden ser clasificadas de acuerdo a su uso en: - Tecnologías de servicios. Estas tecnologías proveen los componentes de la aplicación que soportan servicios para una funcionalidad eficiente. - Tecnologías de comunicaciones. Estas tecnologías proveen los mecanismos para la comunicación entre las diferentes partes de la aplicación, ya sean locales o remotas. - Tecnologías de componentes. Estas tecnologías son utilizadas para contener las lógicas de presentación, negocio y persistencia. Tecnologías de servicios Algunos de los servicios de J2EE para los componentes de la aplicación son gestionados por los mismos contenedores, permitiendo de esta manera a los desarrolladores concentrarse en la lógica de la aplicación. Sin embargo, algunas veces los desarrolladores ven necesario invocar algunos de estos servicios utilizando las diferentes tecnologías de servicios, como son: - Java Database Connectivity (JDBC). Esta API (un estándar para conectividad de bases de datos) permite al desarrollador conectarse a bases de datos relacionales. Además permite consultas transaccionales, recuperación y manipulación de datos desde una conexión JDBC. J2EE añade una extensión al núcleo de la API JDBC para dar características avanzadas tales como pooling de conexión2 y transacciones distribuidas. 2 Pooling de conexión= conjunto de conexiones 6 - Java transaction API (JTA). Esta API es un medio para trabajar con transacciones y especialmente con transacciones distribuidas, independiente de la implementación del gestor de transacción de Java, el Java Transaction Service (JTS). - Java Naming and Directory Interface (JNDI). EL papel de esta API dentro de la plataforma J2EE es proveer el medio estándar para - acceder a servicios de nombrado tales como: Servicios de directorio Novell, o servicios de directorio Netscape. Una aplicación J2EE utiliza JNDI para buscar interfaces utilizadas para crear, entre otras cosas, EJB´s y conexiones JDBC. - Java Message Service (JMS). Provee la funcionalidad para enviar y recibir mensajes a través del uso del middleware orientado a mensajes (MOM). - Java Conector Architecture (JCA). Es un estándar a través del cual las aplicaciones J2EE pueden acceder a una variedad de aplicaciones heredadas, especialmente sistemas de planeación de recursos empresariales tales como SAP R/3 y PeopleSoft. Esta especificación define una arquitectura simple en la cual los vendedores de servidores de aplicaciones J2EE y de sistemas heredados colaboran para producir componentes plug and play que permiten el acceso al sistema heredado sin tener que saber nada específico de cómo trabajar con éste. - Java Autentication and Autorization Service (JAAS). Esta API provee un mecanismo para conceder permisos basados en quien ejecuta el código. JAAS utiliza una arquitectura de conexión de módulos de autenticación. Tecnologías de comunicación Son las tecnologías que proporcionan los mecanismos para que varios componentes y servicios en una aplicación J2EE se comuniquen unos con otros. Entre estas tecnologías tenemos: Protocolos de Internet. Permiten la comunicación entre solicitudes de clientes y respuestas de servidores. Se destacan: - Hypertext Transfer Protocol (HTTP): es un protocolo genérico, del nivel de aplicación, el cual tiene muchos usos más allá de la simple capacidad de hipertexto. Este trabaja en la filosofía solicitud/respuesta. Un cliente envía una solicitud para el servidor, la cual incluye: un método de solicitud, un Uniform Resource Identifier (URI), la versión del protocolo, seguido por un MIME, información del cliente, y posible contenido del cuerpo sobre una conexión con un servidor. El servidor responde con una línea de estado seguida por un mensaje MIME, entidad de metainformación y posible contenido de la entidad cuerpo. - Transmisión Control Protocol over Internet Protocol (TCP/IP): actualmente son dos protocolos separados que están combinados en una entidad simple. IP es el protocolo que asegura que los datos sean recibidos por ambos puntos finales en una comunicación. TCP es el protocolo que sigue las huellas de los paquetes y se asegura que éstos sean ensamblados en el mismo orden en que fueron enviados y que estén libres de errores. Sin embargo, TCP e IP trabajan juntos para mover datos alrededor de Internet. - Secure sockets Layer (SSL): Este protocolo utiliza criptografía para dar seguridad al flujo de información entre el cliente y el servidor. Protocolos de objetos remotos. Son mecanismos que permiten la comunicación de componentes remotos. Entre estos tenemos: - Remote Method Invocation (RMI). Es uno de los mecanismos principales en las aplicaciones de objetos distribuidos propio de la plataforma Java. Este permite el uso de Interfaces para definir objetos remotos. Luego podemos llamar métodos de estos objetos remotos como si fueran locales. - RMI-Inter ORB Protocol (IIOP). Es una extensión de RMI sobre el protocolo IIOP, el cual permite definir una interfaz remota de cualquier objeto remoto para que pueda ser implementada en cualquier lenguaje que soporte mapeo OMG y ORB. - Java Interface Definition Language (IDL). A través del uso de esta, un cliente Java puede invocar llamadas a métodos sobre objetos CORBA. Estos objetos CORBA no necesitan estar escritos en Java, pero deben implementar una IDL. Tecnologías de componentes Las aplicaciones J2EE son construidas a partir de componentes. La especificación J2EE define los siguientes componentes J2EE: aplicaciones y applets que corren en el lado del cliente, las tecnologías de componentes Servlets y JSP, y los Enterprise Java Beans que corren del lado del servidor. El valor más importante que brinda la plataforma J2EE es que dentro del proceso de desarrollo se programe solamente lo que es particular de la aplicación, y los elementos comunes a la mayoría de aplicaciones Empresariales sean provistos por el contenedor. Así, el programador sede al contenedor la gestión de transacciones, seguridad, colas de mensajes, grupos de conexiones a bases de datos, y otros recursos. De esta manera, el desarrollo parte del contenedor y no del sistema operativo. Así, se facilita la implementación, y los diseños ganan flexibilidad al permitir descomponer lógicamente una aplicación en componentes altamente cohesivos y con un menor acoplamiento. La plataforma J2EE provee tres tecnologías para el desarrollo de componentes agrupadas en dos tipos: A. Componentes Web La plataforma J2EE define dos tipos de tecnologías web y sus componentes asociados: Los Java Servlets y las Java Server Pages (JSP). Los servlets son clases Java que en forma dinámica habilitan sus instancias para procesar peticiones y construir respuestas. Las páginas JSP son documentos basados en texto que se ejecutan como servlets, pero de una manera muy similar a la creación del contenido estático. Aunque los 7 servlets y las páginas JSP pueden ser usadas de forma indistinta, cada uno de estos tipos de componentes Web tiene sus fortalezas. Los servlets se ubican mejor manejando el control de funcionalidad de una aplicación, tales como despachar peticiones y manejar información no textual. Las páginas JSP son documentos apropiados para la generación de texto basado en Marcado como HTML, SGVL, WML y XML. Los Servlets Un servlet es una clase en el lenguaje de programación Java usado para extender las capacidades de servidores que hospedan aplicaciones cuyo acceso se realiza siguiendo el modelo de programación petición-respuesta. Aunque un servlet puede responder a cualquier tipo de petición, estos son comúnmente usados para extender las aplicaciones hospedadas en servidores Web. Para estas aplicaciones, la tecnología Java Servlet define clases servlets específicas al protocolo HTTP. Los servlets permiten extender la funcionalidad de servidor web para generar contenido dinámico en HTML, XML, WML u otros lenguajes de marcado. La API para trabajar los servlets se provee en los paquetes javax.servlet y javax.servlet.http. El servicio provisto por un servlet es implementado en el método service() de un GenericServlet, los métodos doMetodo(), donde Método puede tener el valor de Get, Delete, Options, Post, Put o Trace de un HttpServlet, o cualquier otro método específico a una clase definida para un protocolo en particular, la cual implementa la interface Servlet. El ciclo de vida de un servlet es controlado por el contenedor en el cual el servlet ha sido desplegado. La siguiente Ilustración muestra parte del paquete javax.servlet. servlet (from javax) GenericServlet (from servlet) service(ServletRequest req, ServletResponse res) Servlet Config (from servlet) ServletRequest Servlet (from servlet) (from servlet) ServletResponse (from servlet) http (from servlet) Los servlets HTTP son clases que heredan la clase HttpServlet y están diseñados específicamente para peticiones HTTP. Los dos tipos más comunes de peticiones son la petición GET y la petición POST. La petición GET adiciona la información de la petición a la cadena del URL, mientras que la petición POST encripta la información en el cuerpo de la petición. POST es considerado más seguro, pero GET permite hacer la solicitud desde la barra de dirección en el browser. Los componentes Web son colaborativos y comparten información vía objetos que se manipulan como atributos de diferentes tipos de alcance: aplicación, sesión, petición y página. De esta forma, un atributo con alcance de aplicación podrá ser visto por cualquier componente web que pertenezca a la aplicación, mientras que una atributo con alcance de sesión existirá y será visto únicamente por los componentes que sean involucrados en una misma sesión, así como los atributos con alcance de petición serán visto por aquellos componentes que se vean involucrados dentro de una misma petición del cliente. Los atributos de página sólo serán vistos en la página en los que son declarados. Dado que el protocolo HTTP es un protocolo sin estado, Los servlets permiten hacer el seguimiento de los clientes web mientras estos permanecen en el sitio web. Para ello puede usar Cookies o el seguimiento a la Sesión, entre otras opciones. Las Java Server Pages (JSP) Las Java Server Pages (JSP) proveen una forma de embeber componentes en una página, y generan de manera dinámica la página enviada al cliente. El objetivo que cumplen es el de simplificar la creación y gestión de páginas Web. Una página JSP puede contener elementos HTML, código Java, y componentes Java Beans. Las JSP son una extensión del modelo de programación de servlets. Cuando un usuario solicita una página JSP, el contenedor web compila la página JSP a un servlet. El contenedor web después invoca el servlet y retorna el contenido resultante al browser. Una vez el servlet ha sido compilado desde la página JSP, el contenedor web puede simplemente retornar el servlet sin tener que volverlo a compilar. De esta forma, las páginas JSP proveen un mecanismo poderoso y dinámico para ensamblado de páginas que se benefician de muchas ventajas de la plataforma Java. HttpServlet (from http) HttpServletRequest doGet() doPost() (f ro m ht tp) HttpServletResponse (from http) El patrón general para un método de servicio es extraer la información de la petición, acceder a recursos externos y luego producir la respuesta basada sobre esta información. Mientras los servlets son código java puro, las páginas JSP son documentos basados en texto hasta que el contenedor web los compila en los servlets correspondientes, lo que permite al programador concentrarse en la presentación de la aplicación. Los elementos para encapsular código Java en páginas JSP se clasifican en declaraciones, scriplets y expresiones. Una declaración permite definir elementos, un scriplet es un fragmento de expresión java, y una expresión es una expresión completa de código cuya respuesta es enviada como elemento de información de la página. 8 servidor termina. Estos beans son útiles para encapsular los procesos del negocio que maneja la aplicación. Estos se pueden clasificar en beans de sesión con estado o sin estado según manejen o no estado conversacional. En JSP cada elemento empieza con “<%”. La sintaxis para cada uno de ellos es la siguiente: <%! declaración %> <% scriptlet %> <%= expresión %> - Entity EJB: representan entidades de información persistente, las cuales deben ser almacenadas en una base de datos. Todos los clientes acceden a la misma información, de esta forma se puede decir que el bean es encontrado en lugar de creado. Según quién maneje la persistencia del bean, un Entity EJB se puede clasificar en Entity EJB con persistencia manejada por el contenedor ( CMP – Container Managment Persistent) y Entity EJB con persistencia manejada por el Bean(BMP – Bean Managment Persistent). - Message Driven Bean: representa componentes que responden a la llegada de mensajes provenientes de canales de eventos (Tópicos) o de colas de mensajes. Para el origen de los mensajes, el procesamiento se realiza de manera asincrónica de tal forma que no tiene que ceder el control y esperar a que se lo devuelvan. Los Enterprise Java Beans (EJB) Son las componentes del modelo de desarrollo de aplicaciones empresariales de Sun. Un Enterprise Java Beans es elemento de lógica o de persistencia, que acompañado de los componentes para armar la presentación, Servlets y Java Server Pages, forman lo que son los componentes java programables del modelo J2EE. Los EJB han ganado terreno con el surgimiento de servidores de aplicaciones y con el desarrollo de aplicaciones multi-nivel. Una de las grandes ventajas de esta arquitectura es el poder dividir a nivel de arquitectura el código, lo que da como resultado código más mantenible y menos propenso a errores. El EJB es la unidad de composición de una aplicación empresarial J2EE, el contexto en el que vive es el contenedor, sus interfaces son especificadas en el lenguaje Java y su dependencia con el contexto a través de un descriptor xml: entre las dos se forma el contrato entre el EJB y el contenedor que lo hospeda. El contenedor permite comunicar a los clientes con el EJB. El contenedor provee los siguientes servicios: - Soporte a transacciones - Seguridad - Persistencia Un EJB tiene al menos una clase y dos interfaces, la implementación del bean, la interfaces Home y la de los servicios que presta el bean. La interfaz de servicios puede ser de dos tipos desde la especificación EJB 2.0: remota o local. La diferencia es que la remota utiliza RMI/IIOP para hacer llamadas a los métodos, y la local no, obviamente la local necesita que los objetos estén en la misma máquina virtual. La interfaz home por un lado es una fábrica de objetos que permiten acceder al componente y por ello aquí se definen los métodos de creación, encontrado y destrucción del EJB. Existen tres clases de EJBs: sesión, entidad y los manejados por mensajes. Los de sesión implementan la lógica de la aplicación. Los de entidad son persistentes, por lo que representan elementos que corresponden a registros en las tablas de bases de datos. Los manejados por mensajes, son beans cuya ejecución ocurre mediante la llegada mensajes, permitiendo así interacciones asincrónicas. - Session EJB: normalmente representa objetos temporales dentro de una aplicación. Estos pueden o no tener estado. El objeto desaparece cuando el cliente se desconecta o el Las interfaces definidas para los EJBs en la especificación J2EE, y para su acceso, se presentan en la siguiente Ilustración. ejb javax.ejb E spec ific ación de los c om ponentes y s us tipos S es s ion B ean (fro m e j b ) E JB Local Home (fro m e j b ) E nterpris e B ean (fro m e j b ) E nt ity B ean (fro m e j b ) E JB Loc al Objec t (fro m e j b ) Int erfaces para el ac ces o al com ponent e de m anera remot a M es s age DrivenB ean (fro m e j b ) Interfaces para el acc es o al c om ponente de m anera local EJ BHom e E JB Objec t (fro m e j b ) (fro m e j b ) Para construir un EJB se debe: (1) Especificar sus interfaces de creación y de servicios, para ello debe heredar de las interfaces EJBHome y EJBObject. Si el acceso al EJB va a realizarse desde la misma máquina virtual, se recomienda usar EJBLocalHome y EJBLocalObject. (2) Construir la clase del bean, esto se realiza implementando una de las interfaces especificadas en la jerarquía de la ilustración anterior dependiendo del tipo de bean deseado. En el momento del 9 despliegue del EJB se debe seleccionar las interfaces de creación y de servicios y la clase del bean, junto con la información adicional del bean, tal como el manejo de estado, de persistencia y de transacciones. requieren que su información persista en el tiempo. Su persistencia puede ser manejada por el contenedor, en este caso el bean se conoce como un bean Entity CMP, o por el mismo bean en este caso se le conoce como un bean Entity BMP. Acceso a los servicios de los EJBs Un cliente utiliza el servicio de nombrado provisto por JNDI para alcanzar una instancia del objeto home el cual se especifica por medio de la interface home del componente. Este objeto permite alcanzar el objeto que maneja los servicios del bean, el cual se especifica por medio de las interface local o remota del componente. Ventajas de trabajar con EJBs: - División de trabajo: el contenedor es el encargado de ofrecer los servicios de modo que el diseñador del componente se centra exclusivamente en el desarrollo de la funcionalidad principal. La interoperabilidad entre servicios y componentes se define en las especificaciones correspondientes que forman parte del estándar J2EE. - Diversos vendedores: existen diversos vendedores tanto de contenedores, servidores de componentes, servidores web, así como de EJBs que resuelven algún tipo de lógica concreta. Si se cumple con la especificación, la compatibilidad está garantizada, y se puede ejecutar cualquier EJB en cualquier contenedor, aunque ambos hayan sido desarrollados por distintas empresas proveedoras. Procedimientos remotos: el diseño de los EJB gira alrededor de la tecnología RMI, lo que permite la operación en sistemas distribuidos. Diversos clientes: un EJB puede interactuar con una gran gama de clientes: servlets, sistemas de gestión, bases de datos, applets, sistemas heredados. El contenedor es responsable de gran parte de la programación, ya que de manera declarativa se puede manejar la persistencia y la participación en transacciones. - - Utilidad de los diferentes tipos de EJBs: Los EJBs de sesión son útiles para encapsular la lógica del negocio y para ello puede manejar procesos con estado conversacional con el cliente o sin estado. Se utilizan con estado cuando la respuesta a una petición depende de lo que haya sucedido en las peticiones anteriores, por ejemplo brindar el costo total de una reserva de hotel después de que se ha seleccionado entre varias peticiones el tipo de habitación, el número de personas y el número de días. Se utilizan EJB de sesión sin estado cuando cada petición se debe tratar siempre de la misma forma, independiente de que haya sucedido antes, por ejemplo, en un cálculo el proceso recibe a su inicio toda la información y con ella puede dar respuesta. Los EJBs de Entidad son útiles para manejar conceptos correspondientes al modelo del mundo del problema y que Los EJBs manejados para desacoplar el control entre componentes de aplicación, un componente puede enviar el mensaje a otro a través de una cola o un canal de eventos. Otro bean, el bean manejado por mensajes, tiene la posibilidad de ser un oyente de la cola o del canal de eventos, de esta forma se convierte en un suscriptor de mensajes. Esto puede resultar útil cuando cierta parte de una aplicación, por ejemplo en una tienda virtual cuando se realiza una venta y se necesita avisarle a inventario que se actualice, se requiere llamar a un proceso pero no se puede esperar a que de respuesta para continuar. Como solución se le puede avisar a inventario y este recibe la petición en un cola de espera y luego utiliza beans manejados por mensajes para avisar a inventario y este recibe la petición en un cola de espera y luego utiliza beans manejados por mensajes para realizar las actualizaciones dejadas en la cola. IV. CONSIDERACIONES ESPECIALES PARA EL DESARROLLO DE APLICACIONES J2EE Los componentes ingresan al mundo de la computación con el fin de brindar una forma de crear activos reutilizables de una granularidad mayor a las clases. Su objeto es permitir la construcción de componentes para el reuso y de aplicaciones con reuso, por ello está ligado a otros conceptos de la ingeniería del software tales como, Ingeniería de dominio, Arquitectura de Software, Líneas de Productos, Patrones de Diseño, Frameworks y Mecanos. Una de las principales soluciones para el trabajo con componentes la da J2EE para el desarrollo de aplicaciones empresariales en la Web, la cual es un claro ejemplo de construcción para reutilización en un gran dominio, el dominio empresarial. Para este dominio se trabaja un estilo arquitectónico en capas que permite desacoplar la presentación de la aplicación, que generalmente es dinámica y está en continua transformación de la capa de negocio la cual cambia con las políticas, reglamentos y normas que rigen a las organizaciones y esta a su vez de la capa de persistencia que generalmente se mantiene más estable a lo largo del ciclo de vida de la aplicación. De igual manera, los proveedores de soluciones en dominios empresariales más específicos, donde las empresas colombianas tienen una gran oportunidad, deberán recurrir a la reusabilidad para asegurar su supervivencia. Pero este trabajo con el reuso no puede ser a la ligera, debe estar asociado a unas políticas y compromisos de la empresa por facilitar este tipo de desarrollo, a un adecuado entrenamiento no sólo en tecnologías sino en ingeniería y lo más importante un proceso de desarrollo que se ajuste a las características particulares de la empresa. Para el proceso de desarrollo se debe realizar un trabajo de ingeniería de dos tipos: Ingeniería de Dominio e Ingeniería de Aplicación. La 10 ingeniería de dominio permite obtener para una línea de productos una arquitectura de referencia y un conjunto de activos reutilizables: componentes, frameworks, patrones, o combinaciones organizadas entre estos como lo son los mecanos. La Ingeniería de la aplicación sigue el proceso de desarrollo que normalmente se ha usado para una aplicación, pero utiliza, valida y actualiza la arquitectura de referencia, así como de componentes y demás elementos reutilizables. Con cada nueva aplicación se crece en experiencia, en arquitectura y en activos reutilizables, lo cual tiene implicaciones directas sobre la calidad y la productividad de la empresa. CMP o una herramienta de mapeo objeto-relacional convencional. - Los recursos utilizados deben ser reciclables con el fin de mejorar el desempeño, se debe manejar pooling de acceso a recursos, en muchos casos J2EE ya los tiene disponibles, por ejemplo pooling de conexiones a bases de datos, esto es muy útil para crear un conjunto pequeño de objetos de acceso y estarlos usando y liberando en lugar de crear un objeto de acceso a recurso cada vez que se necesita de él. Tanto el proceso de ingeniería de dominio, como el de aplicación debe tener los siguientes principios básicos: Iterativo e incremental y centrado en la Arquitectura. De manera particular para el proceso de Ingeniería de dominio se tienen los siguientes principios: guiado por los casos de uso de negocio, basado en el conocimiento y representación de un dominio y construcción para el reuso. Para el proceso de ingeniería de aplicación se tienen en cuanta adicionalmente los siguientes principios: guiado por los casos de uso de la aplicación y construcción con reuso. - Usar caché cuando se necesite optimizar el uso del ancho de banda. Un caso particular donde se puede utilizar es en el proceso de acceso a un EJB a través de JNDI, este proceso es costoso en desempeño ya que los clientes requieren de una conexión de red al servidor de JNDI y si se recurre a esto cada vez que se necesita el componente, esto resulta redundante y más costoso. Para solucionarlo se puede usar un componente del lado del cliente que permita localizar, acceder y mantener en caché objetos de servicios sin tener que recurrir frecuentemente a JNDI. A. Las mejore prácticas en el Diseño de aplicaciones Empresariales J2EE - Utilizar los patrones de diseño que brinda la experiencia industrial. Los patrones de diseño es una solución estándar para un problema en el diseño. Un patrón de diseño ofrece una solución abstracta a un problema de diseño que aparece muy frecuentemente, expresada mediante un conjunto de relaciones e interacciones entre componentes. Para las aplicaciones J2EE existe un repositorio de patrones en la página oficial de Sun Microystems. Se pueden aplicar patrones para diseñar el comportamiento, la estructura, y otras áreas funcionales y no funcionales de la aplicación. Entre los patrones principales descritos en el catálogo de Sun están: el de fachada con bean de sesión, objeto valor, objeto de acceso a datos, localizador de servicios, proxy de negocios, controlador frontal y vista compuesta. - Es recomendable automatizar los procesos de construcción, a través de scripts o herramientas de ayuda a la construcción y despliegue, ya que la cantidad de archivos y de descriptores puede generar grandes confusiones. - A través de cada iteración se debe integrar las nuevas funcionalidades con el fin de depurar y mantener lo más correcta posible la aplicación en desarrollo. Para ello debe realizarse pruebas de integración. - Es importante optimizar el uso del ancho de banda y mejorar el desempeño de la comunicación. Si el cliente del EJB está en la misma máquina se debe usar llamadas locales y no a través de la interfaz remota. Se recomienda minimizar el llamado a métodos remotos, para ello se debe usar objetos compuestos para formar una petición y/o retornar una respuesta. El desempeño puede mejorarse haciendo uso de una sola fachada del lado del servidor a través de un bean de sesión, minimizando el número de Uno de los elementos más críticos en el desarrollo de una aplicación es la metodología utilizada. Las metodologías para desarrollar aplicaciones empresariales J2EE son diversas. Sin embargo todas presentan unos pasos genéricos necesarios para soportar el desarrollo: captura de requerimientos, análisis, diseño, implementación, pruebas y despliegue. Las mejores prácticas están distribuidas a lo largo de estos pasos y se condensan a continuación particularmente sobre el diseño. - - - Se debe atacar el riesgo lo más pronto posible, hay que combinar las técnicas de modelado con las de prototipado. Se puede utilice como unidad de trabajo el caso de uso, deben ser definidos, priorizarlos. Es recomendable seguir los pasos básicos por grupos de casos de uso iniciando con los de más alta prioridad. Los casos de uso de alta prioridad son aquellos que presentan mayor riesgo y que tienen un impacto significativo sobre la arquitectura. Con esto se adelanta el riesgo a las fases tempranas del desarrollo. Es recomendable usar un lenguaje de modelado estándar, por ejemplo el UML – Unified Modeling Language, con el objeto de facilitar la comunicación del sistema entre los diferentes participantes del proyecto de desarrollo. El UML provee un lenguaje y una variedad de diagramas que arquitectos, diseñadores y demás participantes pueden fácilmente construir y entender. El diseño es un paso fundamental en el desarrollo, ya que contribuye a la calidad, la escalabilidad y la confianza de las aplicaciones. Debe ser hecho para soportar el cambio con un modelo conceptual dinámico y las principales formas de hacerlo es usando los beans de entidad de tipo 11 interacciones y dependencias del cliente con los EJBs del lado del servidor. También es útil en la optimización del desempeño usar del lado del cliente un proxy que le permita al cliente continuar con sus procesos sin esperar a que el servidor de una respuesta completa. - Los casos de prueba deben ser construidos antes de codificar. Al escribir los casos de prueba inicialmente se logra dar al programador más información sobre los requerimientos a satisfacer, se crea más cultura sobre el valor de la prueba y las pruebas de integración pueden darse de una manera más organizada. Adicionalmente, se puede incluir dentro del plan de trabajo del proyecto la planificación, el diseño y la ejecución de las pruebas. Es de gran utilidad un Framework de prueba con el fin de automatizar ciertos casos de pruebas y mejorar la productividad en este paso dentro del proceso de desarrollo. Una forma de hacerlo es utilizar JUnit, un framework de pruebas que brinda flexibilidad, consistencia, facilidad de implementación y de automatización, aunque presenta dificultades en el desempeño. JUnit es una herramienta de código abierto construido en Java, permite definir casos de pruebas, agruparlos en suites de pruebas y realizar aserciones acerca de los resultados. Los patrones de diseño de J2EE que se describen a continuación están basados en la información brindada por el Sun Java Center de J2EE, los cuales por estar orientados al estilo arquitectónico en capas, se clasifican según la capa a la que pertenece: presentación, de negocio o de integración a otros sistemas. 1) Patrón Controlador Frontal- patrón de la capa de presentación La presentación que se genera al usuario debe tener el mínimo código de lógica de negocio, de tal forma que este código sea compartido por múltiples vistas y además que pueda ser cambiado independientemente de la presentación. Los servicios comunes, tales como seguridad y gestión de estado, no deben ser replicados a mútiples vistas, esto traería problemas de mantenimiento e inconsistencias al usarlos. El control de un proceso que implica diferentes vistas puede dificultar el mantenimiento del código. El patrón controlador frontal aplica un componente que intercepta la petición del cliente y tiene una o varias de las siguientes responsabilidades: (1) Aplicar servicios comunes tales como autenticación y control de acceso, (2) Determinar la vista adecuada para atender la petición y (3) Iniciar las conexiones a otros recursos necesarias para atender la petición. El siguiente diagrama de clases muestra los participantes de la solución: <<ClientPage>> InicioPeticion Request <<Servlet>> Controladorfrontal Enruta Petición <<Java Server Page>> Vista1 <<Java Server Page>> Vista2 2) El patrón Sesión de Fachada – Patrón de la capa de Negocio Cuando el desarrollador usa EJBs como repositorios para la información y pequeños servicios de lógica de negocio, la mayoría de la lógica del negocio de grano grueso queda escrita del lado del cliente. Esto puede ser perjudicial debido a que el cliente queda fuertemente ligado a la lógica del negocio, puede sobrecargar la red con muchas peticiones a la hora de manejar un proceso de negocio y adicionalmente tiene que interactuar con muchos componentes de una manera remota para un mismo proceso, lo que genera gran dependencia entre las capas arquitectónicas. La solución es una variación del patrón Fachada. En el patrón fachada un objeto o componente, la fachada, se coloca entre el cliente y un subsistema complejo. El componente fachada expone los servicios requeridos por el cliente y agrega servicios de granularidad gruesa a partir de los servicios de granularidad fina. Para el patrón fachada J2EE, el componente de sesión de fachada se comporta como un componente de negocio que encapsula los servicios de varios EJBs. El siguiente diagrama muestra un componente sesión de fachada como un control de acceso a otros EJBs u otros recursos. Cliente 1..* <<Session EJB>> SessionFacade 1..* ObjetoNegocio <<Session EJB>> ComponenteSesion <<Entity EJB>> ComponenteEntidad ObjetoAccesoRecurso 3) Patrón localizador de servicios – Patrón de la capa de negocio En términos de programación, la sobrecarga del uso de métodos sobre una interface de un EJB es relativamente pequeña, tan solo es manejar excepciones remotas. Sin embargo, la creación de EJBs requiere específicamente, código basado en JNDI para descubrir la interface home y así crear el EJB requerido. Esto obliga al programador a incluir código que utiliza JNDI para manejar la creación de contexto, la búsqueda y la verificación de las referencias. 12 El patrón localizador de servicios define cómo un objeto puede desempeñar las tareas de búsqueda y creación asociadas a varios EJB desde distintos clientes. El cliente sólo tiene que encontrar el localizador de servicios y preguntar por la referencia al EJB requerido. Todas las interacciones con JNDI y las interfaces Home son delegadas al localizador de servicios. El siguiente diagrama de secuencia muestra la interacción entre el cliente, el localizador de servicios, la implementación home y la implementación de negocio: : Cliente : Service Locator : InitialContext fabrica : Fabrica oNegocio : ObjetoNegocio getInstancia() [3] Kruchten, P., Modeling Component Systems with the Unified Modeling Language In Proceedings of International Workshop on Component Based Engineering, Kyoto, Japan, April 25-26, 1998. [4] Bent, K., Patterns Generate Architectures In Proceedings of the 8th European Conference for Object-Oriented Programming, Bologna, Italy, July 48, 1994. [5] Shaw, M., Software Architecture: Perspectives on an Emerging Discipline, First Edition ed. New Jersey: Prentice Hall, 1996. [6] Fayad, M. E. and Schmidt, D. C., "Object-Oriented Application Frameworks," Communications of the ACM, vol. 40, no. 10, pp. 32-38, Oct.1997. new() getObjetoNegocio() lookup fabrica:=new() return fabrica oNegocio:=getObjetoNegocio() new() return oNegocio usa servivios de negocio V. CONCLUSIONES La tecnología de componentes surge como una necesidad de mejorar la calidad y la productividad de las empresas dedicadas al desarrollo de software. Sin embargo, este nuevo paradigma y sus soluciones tecnológicas traen consigo una serie de nuevas oportunidades y dificultades. La tecnología Java brinda una de las opciones para generar soluciones, pero no es por sí misma una solución, para lograrlo debe hacerse un uso adecuado de ella. Por tanto, es importante aprovechar sus oportunidades ubicadas del lado de la reutilización en un marco de ingeniería de dominio, en conjunto con el desarrollo de activos reutilizables como lo son las arquitecturas de referencia, los frameworks, patrones, entre otros. De otro lado, se deben vencer las debilidades que se ubican del lado de las limitantes que la tecnología Java presenta, y entre ellas, la más visible y que comparte con las otras tecnologías de componentes, es su problema en la eficiencia reflejado en el consumo de recursos, el cual se puede solventar con el uso de prácticas de diseño adecuadas que permitan mejorar el desempeño de las aplicaciones desarrolladas en la plataforma J2EE. VI. REFERENCIAS [1] Szyperski, C., Gruntz, D., and Murer, S., Component Software: Beyond Object-Oriented Programming Pearson Education, 2002. [2] Liskov, B., Program Development in Java: Abstraction, Specification, and Object-Oriented Design Pearson Education, 2000. [7] Allamaraju, S., Beust, C., Davies, J., Jewell, T., Johnson, R., Longshaw, A., Nagappan, R., O'Connor, D., Sarang, P. G., Toussaint, A., Tyagi, S., Watson, G., Wilcox, M., and Williamson, A., Professional Java Server Programming J2EE Wrox Press Inc., 2001.