Liferay 6 2 Desarrollo de Plugins Parte 1

  • Slides: 83
Download presentation
Liferay 6. 2 Desarrollo de Plugins (Parte 1)

Liferay 6. 2 Desarrollo de Plugins (Parte 1)

Instalación Instalar JDK 1. 7 URL Bundle y SDK: • https: //sourceforge. net/projects/lportal/files/Liferay%20 Portal/

Instalación Instalar JDK 1. 7 URL Bundle y SDK: • https: //sourceforge. net/projects/lportal/files/Liferay%20 Portal/ 6. 2. 5%20 GA 6/ Descargar: • liferay-plugins-sdk-6. 2 -ce-ga 6 -20160112152609836. zip • liferay-portal-tomcat-6. 2 -ce-ga 6 -20160112152609836. zip URL Liferay IDE: • https: //sourceforge. net/projects/lportal/files/Liferay%20 IDE/2. 2. 4% 20 GA 5/ Descargar: • liferay-ide-eclipse-windows-x 64 -2. 2. 4 -ga 5 -201507230603. zip

Instalación Descomprimir el archivo de eclipse: liferay-ide-eclipsewindows-x 64 -2. 2. 4 -ga 5 -201507230603.

Instalación Descomprimir el archivo de eclipse: liferay-ide-eclipsewindows-x 64 -2. 2. 4 -ga 5 -201507230603. zip Descomprimir el archivo liferay-plugins-sdk-6. 2 -ce-ga 620160112152609836. zip en el directorio del eclipse

Instalación Descomprimir el archivo: liferay-portal-tomcat-6. 2 -cega 6 -20160112152609836. zip

Instalación Descomprimir el archivo: liferay-portal-tomcat-6. 2 -cega 6 -20160112152609836. zip

Instalación Configurar Plugin SDK

Instalación Configurar Plugin SDK

Instalación Configurar Runtime Environment

Instalación Configurar Runtime Environment

Instalación Configurar Nuevo Servidor

Instalación Configurar Nuevo Servidor

Instalación Ajustes finales: • Editar: <PLUGIN_SDK_PATH>build. properties • Cambiar el valor del parámetro "ivy.

Instalación Ajustes finales: • Editar: <PLUGIN_SDK_PATH>build. properties • Cambiar el valor del parámetro "ivy. jar. url", para que apunte a la siguiente URL: ivy. jar. url=https: //repository. liferay. com/nexus/content/repo sitories/liferay-publicsnapshots/com/liferay/org. apache. ivy/${ivy. version}/org. apa che. ivy-${ivy. version}. jar

Plugins Actualmente existen 6 tipos de plugins: • • • Portlets Themes Layout Templates

Plugins Actualmente existen 6 tipos de plugins: • • • Portlets Themes Layout Templates Web Modules Hooks Ext Plugins

Plugins SDK: • Entorno simple para el desarrollo de plugins de Liferay • El

Plugins SDK: • Entorno simple para el desarrollo de plugins de Liferay • El desarrollo de portlets, themes y layouts se llevaba a cabo en el ambiente Ext. • Desde Liferay 6. 0, el EXT environment no es soportado, ya que fue reemplazado por los hot-deployables portlets, themes y layouts. • Plugins SDK requiere que un bundle de Liferay Portal esté presente para compilar contra los jars incluidos en el portal. Plugins SDK Developer’s Hot Deploy Folder Liferay Portal + App Server Bundle

Plugins SDK: Componente Directorio Portlets /portlets Themes /themes Layouts /layouttpl Web applications /web Hooks

Plugins SDK: Componente Directorio Portlets /portlets Themes /themes Layouts /layouttpl Web applications /web Hooks /hooks Ext plugins /ext Ant scripts / (scripts para la generación de los componentes)

Plugins Portlets Los portlets desarrollados en el plugin SDK solamente pueden importar clases desde:

Plugins Portlets Los portlets desarrollados en el plugin SDK solamente pueden importar clases desde: <LIFERAY_BUNDLE>tomcat-7. 0. 62libextportal-service. jar y otros jars contenidos en el directorio WEB-INF/lib del portlet Archivo <nombre_proyecto>/docroot/WEB-INF/liferay-pluginpackage. properties permite referenciar (importar) librerías de Liferay, para importar librerías externas o propias, se deben copiar al directorio <nombre_proyecto>/docroot/WEB-INF/lib Los portlets pueden hacer uso de cualquier framework de aplicaciones que soporte Liferay

Portlets Hay dos estándares que gobiernan el comportamiento de portal/portlet JSR-168 -> Especificación de

Portlets Hay dos estándares que gobiernan el comportamiento de portal/portlet JSR-168 -> Especificación de la versión 1. 0 de portlets, creada con el fin de permitir desplegar múltiples aplicaciones en una sola página JSR-286 -> En la segunda versión de portlets, se agregaron características como: • Manejo de eventos (se aumentó el ciclo de vida del portlet) • Inter-portlet communication

Portlets Los portlets deben proveer un archivo web. xml válido, a pesar de que

Portlets Los portlets deben proveer un archivo web. xml válido, a pesar de que el proceso hot deploy de Liferay hace la mayoría del trabajo de configuración de este archivo Además del archivo web. xml, los portlets necesitan el archivo descriptor: portlet. xml El archivo portlet. xml le dice al contenedor: • Qué portlets están incluidos en la aplicación • Qué roles soportan • Qué portlet modes soportan

Portlets Características claves de los portlets: • Sólo son responsables de renderizar un fragmento

Portlets Características claves de los portlets: • Sólo son responsables de renderizar un fragmento de la página total, por lo tanto ciertos tags no son permitidos: <html>, <head>, <body> • El lugar correcto donde debe ir inserto un portlet es en el BODY • Los portlets podrían necesitar ser re-renderizados, inclusive si un usuario no interactúa con el • En tiempo de diseño, no hay forma de saber qué página desplegará un portlet, y qué otros portlets podrían estar en esa página, por lo tanto es impráctico crear URLs de portlets directamente • La API de portlets provee métodos para crear todo lo necesario de URLs de portlets

Portlets Diferencias con los Servlets: • Los servlets tienen acceso al objeto Servlet. Request,

Portlets Diferencias con los Servlets: • Los servlets tienen acceso al objeto Servlet. Request, los portlets no tienen acceso a este objeto, sino que al objeto Portlet. Request • Debido a lo anterior, los portlets no son capaces de leer query parameters directamente desde la URL. • La especificación solo provee un mecanismo para que los portlets puedan leer sus propios parámetros de URL, u otros que hayan sido declarados como Public Renders Parameters • Liferay de todas formas provee métodos utilitarios para acceder al Servlet. Request y consultar parámetros.

Portlets Fases de los portlets: Portlet init() render() process. Action() process. Event() -> (JSR-286)

Portlets Fases de los portlets: Portlet init() render() process. Action() process. Event() -> (JSR-286) server. Resource() -> (JSR-286) destroy() Cuando se ejecuta Se ejecuta al deployarlo. Inicializa el portlet Al agregarlo a la página, pintarlo, y también al realizar acciones (al pasar por el process. Action()) se renderiza nuevamente (refresca el portlet completo). Renderiza el contenido Diferentes acciones que podría realizar el usuario al usar el portlet. Llamado cuando el usuario realiza una acción Llamado cuando un evento ha sido gatillado Llamado cuando una Resource. URL es solicitada Al remover el portlet del servidor de aplicaciones. Libera el objeto portlet, de manera que sea elegible por el garbage collector

Portlets Los portlets están diseñados para coexistir en la misma página con otros portlets,

Portlets Los portlets están diseñados para coexistir en la misma página con otros portlets, por lo que una interacción de un usuario con un portlet directamente, podría generar una solicitud sobre otro portlet con el que el usuario no estaba interactuando Por lo tanto, los portlets poseen más de un tipo de método para procesar las solicitudes, y estos métodos se corresponden con las fases del portlet

Portlets Fases de los Portlets INIT PHASE: • Llamado por el contenedor durante el

Portlets Fases de los Portlets INIT PHASE: • Llamado por el contenedor durante el despliegue del portlet • Durante esta fase típicamente se inicializan recursos, o se realizan actividades que se requieren una sola vez • Los portlets típicamente usan el método init() para leer parámetros de inicialización desde el archivo portlet. xml

Portlets Fases de los Portlets RENDER PHASE: • En esta fase el portlet genera

Portlets Fases de los Portlets RENDER PHASE: • En esta fase el portlet genera contenido basado en su estado actual • Esta fase es llamada en todos los portlets de la página cuando la página es renderizada • También es llamada cuando cualquiera de los portlets en esa página completan las fases Action, o Event Processing • Aquí también se pueden ejecutar acciones (es mas rápido que el Process Action, ya que solo renderiza, el Process Action ejecuta dos métodos Process Action y Render)

Portlets Fases de los Portlets RENDER PHASE: • Los portlets típicamente ingresan a la

Portlets Fases de los Portlets RENDER PHASE: • Los portlets típicamente ingresan a la fase Render cuando se recarga la página, después de completar una acción • Es posible gatillar la fase Render directamente, invocando la URL Render de la siguiente forma: Ø <a href=”<portlet: render. URL/>”>Click to invoke Render Phase</a> • URL Generada: Ø <a href="http: //localhost: 8080/group/guest/parts? p_p_id=jsr 286 demoportlet_ WAR_jsr 286 demoportlet_INSTANCE_A 2 Gc 9 ca. IEGIx& p_p_lifecycle=0& amp; p_p_state=normal& p_p_mode=view& p_p_col_id=column 1& p_p_col_count=1">Click to invoke Render Phase</a>

Portlets Fases de los Portlets RENDER PHASE:

Portlets Fases de los Portlets RENDER PHASE:

Portlets Fases de los Portlets ACTION PHASE: • Se ingresa a esta fase como

Portlets Fases de los Portlets ACTION PHASE: • Se ingresa a esta fase como resultado de la interacción de un usuario con el portlet • Específicamente, la interacción del usuario debería resultar en el cambio del estado en el portlet • Una vez que la Action Phase ha finalizado, el portlet procesa cualquier evento que haya sido gatillado por la Action Phase • Una vez que los eventos han sido procesados , o si no fue lanzado ningún evento, el portal llama a la Render Phase en todos los portlets de la página

Portlets Fases de los Portlets ACTION PHASE: Los portlets ingresan a la Action Phase

Portlets Fases de los Portlets ACTION PHASE: Los portlets ingresan a la Action Phase mediante la invocación de una URL, que puede generarse de la siguiente forma: Ø <a href="<portlet: action. URL/>">Click to invoke Action Phase</a>

Portlets Fases de los Portlets ACTION PHASE: • URL Generada: Ø <a href="http: //localhost:

Portlets Fases de los Portlets ACTION PHASE: • URL Generada: Ø <a href="http: //localhost: 8080/group/guest/parts? p_auth=Dcc. EXRw. N& p_ p_id=jsr 286 demoportlet_WAR_jsr 286 demoportlet_INSTANCE_A 2 Gc 9 ca. IEG Ix& p_p_lifecycle=1& p_p_state=normal& p_p_mode=view&a mp; p_p_col_id=column-1& p_p_col_count=1">Click to invoke Action Phase</a> • Ej:

Portlets Fases de los Portlets EVENT PHASE: • Fase utilizada para procesar cualquier evento

Portlets Fases de los Portlets EVENT PHASE: • Fase utilizada para procesar cualquier evento que haya sido lanzado durante la Action Phase del ciclo de vida del portlet • Los eventos son utilizados por Inter Portlet Communication (IPC) • Los eventos a su vez pueden lanzar eventos adicionales • Una vez que todos los eventos han sido procesados, el portal llamará a la Render Phase en todos los portlets de la página

Portlets Fases de los Portlets RESOURCE SERVING PHASE: • Esta fase permite a los

Portlets Fases de los Portlets RESOURCE SERVING PHASE: • Esta fase permite a los portlets servir contenido dinámico sin necesidad de llamar a la Render Phase en todos los portlets en la página • En Portlet 1. 0, las solicitudes de los portlets siempre retornaban una página de portal completa • Un recurso es solicitado vía una Resource. URL • Los bytes escritos en la respuesta son enviados directamente al cliente

Portlets Fases de los Portlets RESOURCE SERVING PHASE: • Útil para: § Crear imágenes

Portlets Fases de los Portlets RESOURCE SERVING PHASE: • Útil para: § Crear imágenes y otros binarios dinámicamente § Retornar XML, JSON, fragmentos HTML de llamadas Ajax, etc. • Los portlets entran en la fase invocando una Resource URL que puede generarse de la siguiente forma: Ø <a href="" onclick="load. XMLDoc('<portlet: resource. URL/>'); return false">Click to invoke Resource Serving Phase</a>

Portlets Fases de los Portlets RESOURCE SERVING PHASE: • URL Generada: Ø <a onclick="load.

Portlets Fases de los Portlets RESOURCE SERVING PHASE: • URL Generada: Ø <a onclick="load. XMLDoc('http: //localhost: 8080/group/guest/parts? p_ p_id=jsr 286 demoportlet_WAR_jsr 286 demoportlet_INSTANCE_A 2 G c 9 ca. IEGIx& p_p_lifecycle=2& p_p_state=normal& p_p _mode=view& p_p_cacheability=cache. Level. Page& p_p_co l_id=column-1& p_p_col_count=1'); return false" href="">Click to invoke Resource Serving Phase</a>

Portlets Fases de los Portlets RESOURCE SERVING PHASE:

Portlets Fases de los Portlets RESOURCE SERVING PHASE:

Portlets Fases de los Portlets DESTROY PHASE: • El método destroy() es llamado por

Portlets Fases de los Portlets DESTROY PHASE: • El método destroy() es llamado por el contenedor de portlets cuando el portlet es removido de servicio • Está diseñada para permitir al portlet liberar cualquier recurso, y guardar el estado si es necesario • Para gatillar el método destroy() es necesario undeployar el portlet

Portlets Características de los Portlets Portlet Modes Windows States Portlet Preferences Standard Inter Portlet

Portlets Características de los Portlets Portlet Modes Windows States Portlet Preferences Standard Inter Portlet Communication (IPC) • Public Render Parameters • Events Resource Serving • AJAX Support • Binary Data Support

Portlets Características de los Portlets Portlet Modes • Cada portlet tiene un modo actual,

Portlets Características de los Portlets Portlet Modes • Cada portlet tiene un modo actual, el cual indica la función que está realizando • Todos los portales compatibles con Java deben soportar los modos View, Edit y Help • Los portlet modes son definidos en el archivo portlet. xml En el Edit Mode, las configuraciones son representadas como un set persistente de pares nombre-valor, y son llamadas «portlet preferences» .

Portlets Características de los Portlets Portlet Modes • Look and Feel Mode (Liferay Extension)

Portlets Características de los Portlets Portlet Modes • Look and Feel Mode (Liferay Extension) • Configuration Mode (Liferay Extension)

Portlets Características de los Portlets Windows States • Indican la cantidad de espacio que

Portlets Características de los Portlets Windows States • Indican la cantidad de espacio que ocupará el portlet en la página • Todos los portales compatibles deben soportar los estados: minimizado, maximizado y normal

Portlets Características de los Portlets Remove Window • Liferay provee la opción de remover

Portlets Características de los Portlets Remove Window • Liferay provee la opción de remover el portlet de la página mediante la opción “Remove”

Portlets Desarrollo de Portlets Liferay Portlet • Liferay agrega dos descriptores más que extienden

Portlets Desarrollo de Portlets Liferay Portlet • Liferay agrega dos descriptores más que extienden las opciones de portlet. xml: § liferay-portlet. xml § liferay-display. xml • Estos archivos son opcionales, y permiten implementar características propias de Liferay

Portlets Desarrollo de Portlets § liferay-portlet. xml § liferay-display. xml

Portlets Desarrollo de Portlets § liferay-portlet. xml § liferay-display. xml

Portlets Desarrollo de Portlets Liferay Portlet También es posible agregar el archivo liferay-pluginpackage. properties,

Portlets Desarrollo de Portlets Liferay Portlet También es posible agregar el archivo liferay-pluginpackage. properties, para describir las versiones de Liferay que son compatibles con el portlet, como así también otras opciones.

Portlets Desarrollo de Portlets Ejercicio: Creación de Portlet Básico • Crear un portlet que

Portlets Desarrollo de Portlets Ejercicio: Creación de Portlet Básico • Crear un portlet que despliegue una página de saludo (modo View). • El nombre de la persona a saludar deberá poder ser configurado en el modo Edit (portlet preferences).

Portlets Desarrollo de Portlets • • • Ejercicio, pasos a seguir: Crear proyecto de

Portlets Desarrollo de Portlets • • • Ejercicio, pasos a seguir: Crear proyecto de tipo Liferay Plugin Project Nombre del proyecto: hello-world Crear Portlet con framework Liferay MVC, con superclase javax. portlet. Generic. Portlet • El portlet debe definir los modos View y Edit • Debemos implementar el método process. Action para procesar el formulario • Utilizar los snippets: Portal. Dev-01 -Standard Portlet Exercise

Portlets Desarrollo de Portlets Tip: También es posible configurar múltiples métodos que procesan acciones

Portlets Desarrollo de Portlets Tip: También es posible configurar múltiples métodos que procesan acciones (no solo process. Action), de la siguiente forma: Llamada: Es importante eliminar el método “process. Action”, ya que si está presente siempre pasará por éste, y no por los métodos configurados.

Portlets Inter Portlet Communication (IPC) Es introducido en Portlet 2. 0 (JSR-286), y define

Portlets Inter Portlet Communication (IPC) Es introducido en Portlet 2. 0 (JSR-286), y define dos diferentes métodos de IPC Es importante para Portlet Applications, las cuales son aplicaciones que están compuestas de más de un portlet para su funcionamiento Ej. : Una aplicación que muestra facturas, y que requiera un portlet de búsqueda de clientes en su cabecera, que al seleccionar el cliente despliega las facturas en otro portlet mas abajo). Con IPC lo descrito anteriormente es posible hacerlo en forma estándar, e incluso no requiere que los portlets estén en la misma página.

Portlets Inter Portlet Communication (IPC) Método 1: Public Render Parameters • Son el método

Portlets Inter Portlet Communication (IPC) Método 1: Public Render Parameters • Son el método estándar simple para IPC • Es posible declarar una lista de parámetros públicos para una portlet application en el archivo portlet. xml • Los nombres de los parámetros deben ir con namespace para evitar conflictos • Ej. :

Portlets Inter Portlet Communication (IPC) Método 1: Public Render Parameters • Los portlets deben

Portlets Inter Portlet Communication (IPC) Método 1: Public Render Parameters • Los portlets deben declarar qué parámetros públicos quieren leer, utilizando el tag : <supported-publicrender-parameter> • Los parámetros públicos siempre son de tipo “String” • Ej. : • Pueden obtenerse utilizando el siguiente Map:

Portlets Inter Portlet Communication (IPC) Método 1: Public Render Parameters • Los parámetros son

Portlets Inter Portlet Communication (IPC) Método 1: Public Render Parameters • Los parámetros son mezclados con los parámetros regulares, de manera que pueden ser leídos utilizando el método request. get. Parameter(name) o también request. get. Parameter. Map(). • Pueden ser seteados en los métodos process. Action (reciben el objeto Action. Response) mediante el siguiente método: Para remover un parámetro se realiza también desde el Action. Response: O también con: portlet. URL. remove. Public. Render. Parameter(name)

Portlets Inter Portlet Communication (IPC) Método 2: Eventos • Utiliza un patrón Producer-Listener §

Portlets Inter Portlet Communication (IPC) Método 2: Eventos • Utiliza un patrón Producer-Listener § Un portlet genera un evento § Cero o más portlets pueden estar escuchando y reaccionar ante el evento • Eventos permiten la comunicación entre portlets de diferentes aplicaciones • Los portlets pueden publicar eventos desde process. Action usando el método: action. Response. set. Event(event, event. Pay. Load) • Publicar un evento causa una o más invocaciones del nuevo método process. Event en el mismo u otros portlets

Portlets Inter Portlet Communication (IPC) Método 2: Eventos • Desde la implementación del process.

Portlets Inter Portlet Communication (IPC) Método 2: Eventos • Desde la implementación del process. Event, también pueden lanzarse nuevos eventos, usando el método: event. Response. set. Event(event, event. Payload) • No se garantiza el orden de entrega de los eventos • Para que la aplicación participe en el procesamiento de eventos, es necesario decirle al contenedor cuales eventos nos interesan. • Adicionalmente necesitamos agregar el evento a nuestro descriptor, de manera que Liferay conozca qué portlet puede enviar el evento y qué portlet puede recibirlo.

Portlets Inter Portlet Communication (IPC) Método 2: Eventos • Definiendo el evento: • En

Portlets Inter Portlet Communication (IPC) Método 2: Eventos • Definiendo el evento: • En portlet. xml se debe agregar dentro del tag <portlet-app> al final, el siguiente tag que indica el namespace, el nombre del evento, y el tipo de dato que irá en el payload:

Portlets Inter Portlet Communication (IPC) Método 2: Eventos • Definiendo el sender: • Ahora

Portlets Inter Portlet Communication (IPC) Método 2: Eventos • Definiendo el sender: • Ahora necesitamos decirle al contenedor, qué portlet envía el evento, para esto se define el siguiente tag dentro de la definición del portlet (tag portlet):

Portlets Inter Portlet Communication (IPC) Método 2: Eventos • Para publicar el evento se

Portlets Inter Portlet Communication (IPC) Método 2: Eventos • Para publicar el evento se realiza de la siguiente manera dentro de un método process. Action:

Portlets Inter Portlet Communication (IPC) Método 2: Eventos Para escuchar el evento en un

Portlets Inter Portlet Communication (IPC) Método 2: Eventos Para escuchar el evento en un portlet, se debe crear un método de la siguiente manera:

Portlets Inter Portlet Communication (IPC) Ejercicio: Creación de dos Portlets que se comunican utilizando

Portlets Inter Portlet Communication (IPC) Ejercicio: Creación de dos Portlets que se comunican utilizando IPC • Mediante dos portlets , simular el proceso de transporte hacia al espacio de algún elemento • La idea es solo mostrar como se envía un evento con datos a otro portlet, para que éste ultimo realice una acción al recibirlo

Portlets Desarrollo de Portlets • • • Ejercicio, pasos a seguir: Crear proyecto de

Portlets Desarrollo de Portlets • • • Ejercicio, pasos a seguir: Crear proyecto de tipo Liferay Plugin Project Nombre del proyecto: ipc-beam-me-up Crear Portlet Beam. Me. Up. Portlet con framework Liferay MVC, y superclase javax. portlet. Generic. Portlet. Dejar lo demás por defecto • Crear Portlet Arrival. Portlet con framework Liferay MVC, y superclase javax. portlet. Generic. Portlet. Dejar lo demás por defecto

Portlets Desarrollo de Portlets Ejercicio, pasos a seguir: • Editar el archivo portlet. xml

Portlets Desarrollo de Portlets Ejercicio, pasos a seguir: • Editar el archivo portlet. xml (tab Overview): § Namespace URI: http: //liferay. com/events § Local Part: ipc. beammeup § Value Type: java. lang. String • En el mismo archivo, utilizar la sección Inter Portlet Communication del portlet beam-me-up-portlet, para seleccionar la opción «Supported Publishing Event» , y seleccionar el evento correspondiente • En el mismo archivo, utilizar la sección Inter Portlet Communication del portlet arrival-portlet, para seleccionar la opción «Supported Processing Event» , y seleccionar el evento correspondiente • Utilizar los snippets de Portal. Dev-02 -IPC Exercise

Portlets y Web. App Frameworks Los frameworks principales son: • Struts • JSF •

Portlets y Web. App Frameworks Los frameworks principales son: • Struts • JSF • Spring Portlet MVC • Liferay MVC es más simple de utilizar, pero es menos estándar

Portlets y Web. App Frameworks Liferay MVC Portlet: • ¿Porqué Liferay creó otro framework

Portlets y Web. App Frameworks Liferay MVC Portlet: • ¿Porqué Liferay creó otro framework si existían los otros? § Baja curva de aprendizaje, y liviano § No posee complicados XMLs de configuración § Liferay MVCPortlet extiende Liferay. Portlet, el cual a su vez extiende Generic. Portlet, con el cual estamos familiarizados § Extendiendo MVCPortlet tenemos acceso a todas las capas de funcionalidad de bajo nivel en forma directa

Portlets y Web. App Frameworks Liferay MVC Portlet: Liferay MVC Portlet está diseñado para

Portlets y Web. App Frameworks Liferay MVC Portlet: Liferay MVC Portlet está diseñado para remover el código repetitivo que vemos cuando se extiende Generic. Portlet Debido a que Liferay MVCPortlet extiende Liferay. Portlet, también chequea el parámetro de inicialización add-processaction-success-action Cuando este parámetro está seteado en true (por defecto), y el método process. Action se completa sin error, el portlet despliega el siguiente mensaje: Your request completed succesfully Importante: Liferay MVC podría no ser la elección correcta para todas las situaciones, se deben evaluar los diferentes frameworks dependiendo de las necesidades.

Portlets Ejemplo de Aplicación Funcional Crearemos una mini aplicación para describir conceptos clave en

Portlets Ejemplo de Aplicación Funcional Crearemos una mini aplicación para describir conceptos clave en el desarrollo en Liferay. • La aplicación consiste en manejar un inventario de piezas de naves espaciales, y sus fabricantes • La aplicación completa consistirá de dos portlets: • Manufacturer Portlet: Usado para agregar, editar, eliminar y visualizar fabricantes. • Parts Portlet: Utilizado para agregar, editar, eliminar y visualizar partes o piezas. • Los portlets serán no-instanciables, por lo que se podrán agregar sólo una vez a una página.

Portlets Ejemplo de Aplicación Funcional Utilizaremos un enfoque MVC El Modelo • Almacena y

Portlets Ejemplo de Aplicación Funcional Utilizaremos un enfoque MVC El Modelo • Almacena y mantiene los datos, además mantiene lógica de negocio para manipular los datos La Vista • Contiene la lógica para desplegar los datos a los usuarios, en el ejemplo utilizamos páginas JSP El Controlador • Esta capa pasa datos entre las capas de view y model • Generalmente view y model hablan solamente con la capa del controlador • En algunos casos, la capa view puede hablar directamente con el modelo para propósitos de despliegue • En el ejemplo, la clase del portlet actúa como controlador

Portlets Ejemplo de Aplicación Funcional Crear el proyecto: parts-inventory

Portlets Ejemplo de Aplicación Funcional Crear el proyecto: parts-inventory

Portlets Ejemplo de Aplicación Funcional Crear el portlet: Manufacturer Portlet

Portlets Ejemplo de Aplicación Funcional Crear el portlet: Manufacturer Portlet

Portlets Ejemplo de Aplicación Funcional Crear el portlet: Manufacturer Portlet

Portlets Ejemplo de Aplicación Funcional Crear el portlet: Manufacturer Portlet

Portlets Ejemplo de Aplicación Funcional Crear el portlet: Parts Portlet

Portlets Ejemplo de Aplicación Funcional Crear el portlet: Parts Portlet

Portlets Ejemplo de Aplicación Funcional Crear el portlet: Parts Portlet

Portlets Ejemplo de Aplicación Funcional Crear el portlet: Parts Portlet

Portlets Ejemplo de Aplicación Funcional Service Layer • Liferay posee una herramienta de generación

Portlets Ejemplo de Aplicación Funcional Service Layer • Liferay posee una herramienta de generación de código llamada Liferay’s Service Builder • Liferay posee un robusto set de servicios • Los portlets son consumidores de estos servicios • Los servicios pueden ser locales o remotos • Los servicios locales son expuestos como API a clientes ejecutándose en la misma JVM • Los servicios remotos son expuestos como Web Services a clientes fuera de la JVM del portal o en una máquina remota • Nota: Las tablas del servicio se crean al momento de deployar el plugin

Portlets Ejemplo de Aplicación Funcional Liferay Service Builder • Los servicios son automáticamente construidos

Portlets Ejemplo de Aplicación Funcional Liferay Service Builder • Los servicios son automáticamente construidos por un generador de código llamado Service Builder • Las entidades de los servicios son modeladas en un XML llamado WEB-INF/service. xml • Creación: Botón derecho en el proyecto de servicio > New > Liferay Service Builder • Service Builder puede ser configurado en plugins de tipo Hook o Portlet • El generador de código del Service Builder es invocado utilizando la tarea Ant: build-service

Portlets Ejemplo de Aplicación Funcional Liferay Service Builder • Creación de servicios:

Portlets Ejemplo de Aplicación Funcional Liferay Service Builder • Creación de servicios:

Portlets Ejemplo de Aplicación Funcional Liferay Service Builder

Portlets Ejemplo de Aplicación Funcional Liferay Service Builder

Portlets Ejemplo de Aplicación Funcional Liferay Service Builder

Portlets Ejemplo de Aplicación Funcional Liferay Service Builder

Portlets Ejemplo de Aplicación Funcional Liferay Service Builder • Es posible definir columnas localizadas

Portlets Ejemplo de Aplicación Funcional Liferay Service Builder • Es posible definir columnas localizadas seteando el atributo localized=“true” en el tag <column …/> de la columna a localizar

Portlets Ejemplo de Aplicación Funcional Liferay Service Builder • Agregar los snippets 01 -First

Portlets Ejemplo de Aplicación Funcional Liferay Service Builder • Agregar los snippets 01 -First Entity y 02 -Second Entity de Portal. Dev-03 -Service Builder, al archivo WEBINF/service. xml

Portlets Ejemplo de Aplicación Funcional Liferay Service Builder • Otras configuraciones:

Portlets Ejemplo de Aplicación Funcional Liferay Service Builder • Otras configuraciones:

Portlets Ejemplo de Aplicación Funcional Liferay Service Builder • Ejecutar Service Builder: • Importante:

Portlets Ejemplo de Aplicación Funcional Liferay Service Builder • Ejecutar Service Builder: • Importante: Debe estar configurado JDK 1. 7 para el proyecto

Portlets Ejemplo de Aplicación Funcional Liferay Service Builder Cuando se ejecuta el Service Builder,

Portlets Ejemplo de Aplicación Funcional Liferay Service Builder Cuando se ejecuta el Service Builder, se generan interfaces e implementaciones de los servicios configurados. Las interfaces y clases que no deben ser editadas, quedan disponibles en un jar para su utilización:

Portlets Ejemplo de Aplicación Funcional Detalle de las clases generadas:

Portlets Ejemplo de Aplicación Funcional Detalle de las clases generadas:

Portlets Ejemplo de Aplicación Funcional El Service Builder también genera el SQL que será

Portlets Ejemplo de Aplicación Funcional El Service Builder también genera el SQL que será usado para crear las tablas en la base de datos:

Portlets Ejemplo de Aplicación Funcional Implementación de lógica de negocio: • La capa de

Portlets Ejemplo de Aplicación Funcional Implementación de lógica de negocio: • La capa de servicios generada, tiene operaciones CRUD por defecto • Es posible agregar nuevos métodos, modificando las clases de implementación, y al ejecutar el Build Service las interfaces son regeneradas:

Portlets Ejemplo de Aplicación Funcional Implementación de lógica de negocio: • Las clases Impl

Portlets Ejemplo de Aplicación Funcional Implementación de lógica de negocio: • Las clases Impl las genera con esta documentación de alerta: • Importante: El comentario anterior indica que nunca debemos llamar a la implementación directamente, en su lugar debemos utilizar el objeto de tipo Manufacturer. Local. Service. Util. java

Portlets Ejemplo de Aplicación Funcional Implementación de lógica de negocio: • Agregar el contenido

Portlets Ejemplo de Aplicación Funcional Implementación de lógica de negocio: • Agregar el contenido del snippet 03 Manufacturer. Local. Service. Impl a la clase Manufacturer. Local. Service. Impl. java, y organizar los imports. • Agregar el contenido del snippet 04 Part. Local. Service. Impl a la clase Part. Local. Service. Impl. java, y organizar los imports. • Una vez modificadas las implementaciones, ejecutamos el Service Builder para que regenere las interfaces respectivas.

Portlets Ejemplo de Aplicación Funcional Implementación de lógica de negocio: • Liferay es agnóstico

Portlets Ejemplo de Aplicación Funcional Implementación de lógica de negocio: • Liferay es agnóstico de la base de datos, y provee un método agnóstico para generar claves primarias para registros de base de datos. • Se utiliza el servicio increment de la clase Counter. Local. Service de la siguiente manera:

Portlets Ejemplo de Aplicación Funcional Implementación de lógica de negocio: • En el ejemplo

Portlets Ejemplo de Aplicación Funcional Implementación de lógica de negocio: • En el ejemplo anterior counter. Local. Service es una referencia a una instancia de Counter. Local. Service. Impl, el cual es inyectado por el Service Builder (mediante Spring) en la implementación que la está utilizando • Esta referencia es heredada de Manufacturer. Local. Service. Base. Impl junto a otros objetos más inyectados (no se debe modificar esta clase). • También podríamos haber utilizado la clase Counter. Local. Service. Util para llamar al servicio y obtener el id incrementado (pero no es lo óptimo):

Portlets Ejemplo de Aplicación Funcional Inyección de Servicios: • Hay tres servicios que son

Portlets Ejemplo de Aplicación Funcional Inyección de Servicios: • Hay tres servicios que son inyectados automáticamente por el Service Builder en la clase generada xxx. Local. Service. Impl: § Counter. Local. Service: Utilizado para manipular IDs de assets generados § Resource. Local. Service: Provee métodos relacionados a la creación, actualización y eliminación de nuevos assets § User. Local. Service: Provee métodos relacionados a la creación y eliminación de nuevos usuarios, como así también la administración de su información • Importante: Estos servicios proveen métodos vitales para la integración con assets, usuarios y permisos en Liferay