Integración de Sistemas Java POJO. Laboratorio de Prácticas L0.1



Documentos relacionados
4.4 Caso de Estudio: Diseño e Implementación de la Capa Web de MiniPortal

4.4 Caso de Estudio: Diseño e Implementación de la Capa Web de MiniPortal

Integración Capa Web de pojo-miniportal (1)

Tutorial: Primeros Pasos con Subversion

Marcos de Desarrollo. Diseño e implementación de aplicaciones Web con.net

ATLAS MANUAL DE USUARIO DEL ARQUETIPO WEB CON DOCUMENTUM

Práctica 2: Instalación de un gestor de bases de datos relacionales y desarrollo de una aplicación Web con persistencia de datos

MANUAL DE USUARIO Guía de Gestión de la Configuración con Subversion

GESTIÓN DOCUMENTAL PARA EL SISTEMA DE CALIDAD

Práctica 1: Instalación de un servidor de aplicaciones web y diseño de la vista de una aplicación

MONTAR GVSIG 1.9 EN ECLIPSE DESDE EL REPOSITORIO SVN. Eduardo Cristóbal

Ejercicios - Persistencia en Android: ficheros y SQLite

La tortuga y los documentos: Tortoise + Subversion

Administración Local Soluciones

Instalación. Interfaz gráfico. Programación de Backups. Anexo I: Gestión de la seguridad. Manual de Usuario de Backup Online 1/21.

Descarga, instalación y uso de herramientas:

Manual de NetBeans y XAMPP

1. El entorno de desarrollo Eclipse

Integración Capa Web de pojo-miniportal (1)

DOCENTES FORMADORES UGEL 03 PRIMARIA

Acronis License Server. Guía del usuario

SUBVERSION Y SUBCLIPSE

Para poder instalar el producto, tendremos que obtener el instalador apropiado para nuestro entorno hardware y software.

GIT Dinahosting 3. Hola!

CIF-KM. GUÍA DE LOS PRIMEROS PASOS

Notas para la instalación de un lector de tarjetas inteligentes.

SIEWEB. La intranet corporativa de SIE

Manual CMS Mobincube

CREAR UN SERVICIO WEB BASICO CON JAVA AXIS2. Víctor J. Sosa

Cómo usar Subversion. con Windows XP/2000/2003.

Ayuda para la instalación Componente Firma Digital INDICE. 1 Configuración previa Configuración Internet Explorer para ActiveX...

COPIAS DE SEGURIDAD AUTOMÁTICAS DE DIRECCIONES CALLEÇPAÑA

ATLAS MANUAL DE USUARIO DEL ARQUETIPO WEBSERVICE

Aplicateca. Manual de Usuario: Ilion Factura Electrónica. Espíritu de Servicio

Correo Electrónico: Webmail: Horde 3.1.1

Accede a su DISCO Virtual del mismo modo como lo Hace a su disco duro, a través de:

Clase Práctica Nº 1 ED 2015

Servicio de Notificaciones Electrónicas y Dirección Electrónica Habilitada

gvsig_des_2.x_d: Curso de desarrolladores de gvsig Desktop v 2.x Maven en gvsig Maven en gvsig Novedades de desarrollo en gvsig 2.

Instalación de Tomcat7 en Ubuntu

Configuración servidor Tomcat

INSTALACIÓ N A3ERP. Informática para empresas INTRODUCCIÓN CONSIDERACIONES GENERALES DE LA INSTALACIÓN PAQUETES DE INSTALACIÓN PREDEFINIDOS

Documentación Técnica Conector

Escudo Movistar Guía Rápida de Instalación Para Windows

MANUAL DE SHAREPOINT Por: Área de Administración de Aplicaciones.

MANUAL DE AYUDA TAREA PROGRAMADA COPIAS DE SEGURIDAD

Pontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación. IIC1102 Introducción a la Programación

E Manual de usuario. : Versión: 0.1 Fecha: 05/02/2013 Autor: Carlos Ors Carlos.ors@tecsidel.es

Manual de usuario investigador

MANUAL DE AYUDA MÓDULOS 2011 MACOS

3. Qué necesitamos para usar Wordpress?

CONFIGURACION AVANZADA DE MOZILLA THUNDERBIRD

Person IP CRM Manual MOBILE

Ejercicios de validación e internacionalización

Tutorial de SVN en eclipse:

Edición de Ofertas Excel Manual de Usuario

- MANUAL TÉCNICO - Software de diagnóstico de la seguridad de la información y autoimplantación de LOPD. Rev. 01- FEBRERO 2013

Integración de Toolchain PTXdist sobre IDE gráfico basado en Eclipse

Portal de Proveedores Requisitos técnicos del proveedor

FOROS. Manual de Usuario

Ingeniería del Software Arquitectura Física en 3 niveles

Análisis y diseño del sistema CAPÍTULO 3

AGREGAR COMPONENTES ADICIONALES DE WINDOWS

COMPROBACIONES BÁSICAS PARA EL USO DE FIRMA EN EL RTC

Instalar y configurar W3 Total Cache

CVS Concurrent Versions System Manual de Usuario

UNIVERSIDAD DE OVIEDO

Login y Password. Elección de directorios confidenciales

ATLAS MANUAL DE USUARIO DEL ARQUETIPO WEB PARA PROYECTOS NEXUS

Animalandia. Manual de instalación. (Actualizado: Sept-2015) Fernando Lisón Martín

Integración de Toolchain PTXdist sobre IDE gráfico basado en Eclipse

PRESENTACIÓN DEL PRODUCTO

INSTALACIÓN DE GITLAB

Escudo Movistar Guía Rápida de Instalación Dispositivos Symbian

Carrera: Analista de Sistemas. Asignatura: Resolución de Problemas y Algoritmos

30 de Mayo de

GUÍA PARA LA INSTALACIÓN DE MOODLE EN UN COMPUTADOR PERSONAL QUE USA EL SISTEMA OPERATIVO MS. WINDOWS

MANUAL DE USUARIO PANEL DE CONTROL Sistema para Administración del Portal Web.

GUIA COMPLEMENTARIA PARA EL USUARIO DE AUTOAUDIT. Versión N 02 Fecha: 2011-Febrero Apartado: Archivos Anexos ARCHIVOS ANEXOS

UAM MANUAL DE EMPRESA. Universidad Autónoma de Madrid

INSTALACIÓN A3ERP INTRODUCCIÓN CONSIDERACIONES GENERALES DE LA INSTALACIÓN PAQUETES DE INSTALACIÓN PREDEFINIDOS

Programación páginas web. Servidor (PHP)

Dossier de prácticas

Haga clic en los recuadros donde indica la mano y regrese al inicio del capítulo al hacer clic en el título de la sección donde se encuentra

Guía nuevo panel de clientes Hostalia

Oficina Online. Manual del administrador

XPERTO EN DISEÑO DE PÁGINAS WEB

Internet Information Server

ÍTEMS DEL MENÚ CREACIÓN Y GESTIÓN (Última revisión: lunes, 9 de marzo de 2009)

REPOSITORIOS. Ing. Ismael Castañeda Fuentes, MSc Grupo de Investigación UNBD Universidad Nacional de Colombia Marzo de 2011

MS Outlook: Guía de Configuración

MANUAL DE USO DE LA APLICACIÓN

Consultoría, Análisis, Desarrollo y Mantenimiento de Software. Guía de Usuario V2.1. Junio 2.004

Manual de usuario Versión: 1.3 Edición: 05/02/2015 1

Gestión de ficheros. Manual de generación de ficheros de pagos y cobros

Podemos descargar la distribucion de gnu/linux de los repositorios de Ubuntu

Páginas web ::: Edición web en línea con Kompozer Diseño de materiales multimedia. Web Edición web en línea con Kompozer

Transcripción:

Integración de Sistemas Java POJO Laboratorio de Prácticas L0.1

Índice Objetivos Entorno de Desarrollo Ejemplos Variables de Entorno Base de Datos: MySQL Apache Maven 3 Gestión de Proyectos POM Dependencias Ciclo de Vida Ejemplos del Laboratorio Estructura Maven 3 Configuración Maven 3 Compilación IDE Eclipse (Entorno de Desarrollo Integrado) SVN Integración Maven 3 Ejecución/Depuración de aplicaciones Plugin Maven 3 Conceptos Básicos Plugin para Eclipse Creación Inicial de un Proyecto MiniPortal Servidores Web Jetty Tomcat Recomendaciones Finales Laboratorio - 2

Objetivos Familiarizarse con el entorno y herramientas de desarrollo de aplicaciones empresariales Ejecutar los ejemplos según se vaya avanzando en clase de teoría Realización de la Práctica de la asignatura Enfoque basado en iteraciones, de manera que cada iteración incorpora más funcionalidad sobre la anterior, hasta que en la última iteración se termina con un software que implementa toda la funcionalidad En cada iteración se hace análisis, diseño, implementación y pruebas Grupos: 3 personas Laboratorio - 3

Entorno de Desarrollo (1) Sistema Operativo: Linux Ubuntu Herramientas de modelado de aplicaciones MagicDraw for UML 16.5 - Professional Java Edition /opt/magicdraw_uml_16.5/bin/mduml Applications > Programming > MagicDraw 16.5 Umbrello 1.5.8 /usr/bin/umbrello Applications > Programming > Umbrello IDE de desarrollo Eclipse 4.2 Juno Incluye plugins para: Maven 3 / SVN Laboratorio - 4

Entorno de Desarrollo (2) ftp://ftp.fic.udc.es/publico/pojoyws/software- POJOyWS-Java-2012-2013/ eclipse jdk maven mysql svn tomcat Software en /opt/pojoyws-1213 jdk1.7.0_05 apache-maven-3.0.4 mysql-5.5.25a-linux2.6-i686 Documentación https://campusvirtual.udc.es/moodle Laboratorio - 5

Entorno de Desarrollo (y 3) Laboratorio - 6 Instalación cd $HOME mkdir SoftwareIS cd SoftwareIS wget ftp://ftp.fic.udc.es/publico/pojoyws/software-pojoyws-java-2012-2013/eclipse/eclipse-java-juno-linux-gtk.tar.gz tar zxf eclipse-java-juno-linux-gtk.tar.gz rm -rf eclipse-java-juno-linux-gtk.tar.gz wget ftp://ftp.fic.udc.es/publico/pojoyws/software-pojoyws-java-2012-2013/tomcat/apache-tomcat-7.0.29.tar.gz tar zxf apache-tomcat-7.0.29.tar.gz rm -rf apache-tomcat-7.0.29.tar.gz

Ejemplos Laboratorio - 7 Descarga y desempaquetado de los ejemplos https://campusvirtual.udc.es/moodle tar zxf pojo-examples-<version>-src.tar.gz

Variables de Entorno (1) Laboratorio - 8 Añadir al fichero $HOME/.bashrc export IS_HOME=$HOME/SoftwareIS # J2SE. export JAVA_HOME=/opt/POJOyWS-1213/jdk1.7.0_05 # For convenience. PATH=$JAVA_HOME/bin:$PATH # Maven. MAVEN_HOME=/opt/POJOyWS-1213/apache-maven-3.0.4 PATH=$MAVEN_HOME/bin:$PATH export MAVEN_OPTS="-Xms512m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m" # MySQL. MYSQL_HOME=/opt/POJOyWS-1213/mysql-5.5.25a-linux2.6-i686 PATH=$MYSQL_HOME/bin:$PATH # Tomcat. export CATALINA_OPTS=$MAVEN_OPTS # Eclipse. PATH=$IS_HOME/eclipse:$PATH Para hacer efectivas las variables de entorno Ejecutar ". $HOME/.bashrc" ó Cerrar todos los terminales y abrirlos de nuevo RECOMENDADO)

Variables de Entorno (y 2) Comprobar que se han establecido correctamente las variables de entorno verificando la ruta obtenida para los siguientes comandos which java which eclipse which mysqld which mvn Laboratorio - 9

MySQL Inicialización (1) Laboratorio - 10 Crear el directorio de datos de MySQL mkdir -p $IS_HOME/.MySQLData Crear el fichero $HOME/.my.cnf con el contenido siguiente No se pueden usar variables de entorno [client] socket [mysqld] pid-file socket basedir datadir tmpdir = /home/i/<login>/softwareis/.mysqldata/mysqld.sock = /home/i/<login>/softwareis/.mysqldata/mysqld.pid = /home/i/<login>/softwareis/.mysqldata/mysqld.sock = /opt/pojoyws-1213/mysql-5.5.25a-linux2.6-i686 = /home/i/<login>/softwareis/.mysqldata = /tmp

MySQL Inicialización (y 2) Laboratorio - 11 Inicializar la base de datos (creación de las bases de datos mysql y test ) cd /opt/pojoyws-1213/mysql-5.5.25a-linux2.6-i686/ scripts/mysql_install_db --defaults-file=$home/.my.cnf Iniciar servidor MySQL --general-log=1 para depuración (genera el fichero $IS_HOME/.MySQLData/<hostname>.log) mysqld --defaults-file=$home/.my.cnf

MySQL - Configuración y Arranque Base de datos: pojo y pojotest usuario: pojo, password: pojo Crear bases de datos pojo y pojotest mysqladmin -u root create pojo mysqladmin -u root create pojotest Crear usuario pojo con password pojo y permitirle acceder a las bases de datos pojo y pojotest desde localhost mysql -u root GRANT ALL PRIVILEGES ON pojo.* to pojo@localhost IDENTIFIED BY 'pojo'; GRANT ALL PRIVILEGES ON pojotest.* to pojo@localhost IDENTIFIED BY 'pojo'; exit; Acceder a la base de datos pojo y pojotest mysql -u pojo --password=pojo pojo mysql -u pojo --password=pojo pojotest \. nombrescript.sql exit (salir) Finalizar el servidor mysqladmin -u root shutdown Laboratorio - 12

Apache Maven 3 - Gestión de Proyectos (1) Herramienta de Gestión de proyectos Software Open Source Proyecto Apache (http://maven.apache.org) Desarrollada en Java Características Convenciones de nombrado Sistema de plugins Sistema de dependencias similar al existente en el mundo linux con las dependencias entre paquetes Documentación Maven en 5 minutos http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html Guía básica de Maven http://maven.apache.org/guides/getting-started/index.html Laboratorio - 13

Apache Maven 3 - Gestión de Proyectos (2) Estandarización de prácticas de gestión de proyectos No se pierde tiempo reinventando estructuras de directorios, convenciones, ni personalizando scripts para cada proyecto Maven permite redefinir la estructura de directorios estándar pero es conveniente respetarla por las siguientes razones Los ficheros de configuración serán más pequeños y sencillos Hace que el proyecto sea más fácil de entender y facilita el mantenimiento futuro por otros Facilita la integración de plugins (asumen también la estructura por defecto) Laboratorio - 14

Apache Maven 3 - POM (3) Núcleo: POM (Project Object Model) Contiene una descripción detallada del proyecto, incluyendo información de versiones, gestión de configuración, dependencias, recursos de la aplicación y de pruebas, miembros del equipo,... Fichero XML situado en el directorio raíz del proyecto -> pom.xml Si el proyecto contiene módulos, estos se declaran dentro del pom.xml del directorio raíz y cada módulo contiene su propio pom.xml (en su subdirectorio) que hereda del pom.xml general Esta es la situación de los ejemplos de la asignatura Laboratorio - 15

Laboratorio - 16 Apache Maven 3 Ejemplo pom.xml (4) <?xml version="1.0" encoding="utf-8"?> <project xmlns="http://maven.apache.org/pom/4.0.0" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelversion>4.0.0</modelversion> <parent> <groupid>es.udc.pojo</groupid> <artifactid>pojo-examples</artifactid> <version>2.0.0</version> </parent> <artifactid>pojo-modelutil</artifactid> <packaging>jar</packaging> <name>pojo-examples ModelUtil Subsystem</name> <dependencies> <dependency> <groupid>org.hibernate</groupid> <artifactid>hibernate-core</artifactid> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-orm</artifactid> </dependency> </dependencies> </project>

Apache Maven 3 Dependencias (5) En el fichero pom.xml se definen las librerías de las que depende un proyecto y los plugins que utiliza Maven automáticamente descarga las librerías y plugins de repositorios remotos en repositorios locales Mantiene una estructura de directorios en base al groupid y artifactid de los elementos Localización de repositorios (defecto) Remoto -> http://repo1.maven.org/maven2 Local -> $HOME/.m2 Para realizar búsquedas sobre el repositorio remoto puede utilizarse el siguiente buscador http://search.maven.org Laboratorio - 17

Apache Maven 3 Dependencias (6) Gestión de Dependencias Transitivas Sólo es necesario especificar los jars que la aplicación necesita de forma directa Gestiona las dependencias de las librerías utilizadas, para incluirlas de forma automática Ámbitos de Dependencias en función de las fases compile -> necesaria en todas las fases (valor por defecto) provided -> necesaria para compilar pero no para instalar (e.g. API de servlets) runtime -> necesaria sólo para ejecutar (e.g. drivers JDBC) test -> necesaria sólo para pruebas (e.g. API JUnit) Laboratorio - 18

Laboratorio - 19 Apache Maven 3 Ciclo de Vida (7) Fases de construcción de un proyecto compile, test, package, Ciclo de vida: Fases Plugins archetype mvn compile compile compiler mvn test mvn install process-test-resources test package install deploy sql-maven-plugin db:pojotest db:pojo surefire jar install mvn sql:execute

Apache Maven 3 Ciclo de Vida (y 8) Fases de construcción de un proyecto (cont) Cada vez que se ejecuta una fase, se ejecutan los plugins vinculados a ella Cada plugin tiene un conjunto de goals (acciones) Un goal se puede vincular a una o varias fases, o ninguna, con distintas configuraciones (e.g. por defecto, el goal compile del plugin compiler está vinculado a la fase compile ) A maven se le puede pedir la ejecución de una fase (y en ese caso, ejecuta también las anteriores) (e.g. mvn test) o un goal de un plugin (e.g. mvn compiler:compile, mvn sql:execute, etc.) Laboratorio - 20

Laboratorio - 21 Ejemplos - Estructura Maven 3 (1) pom.xml pom.xml MySQLCreateTables.sql

Laboratorio - 22 Ejemplos Configuración Maven 3 (2) Profiles y filtrados Permiten especificar ciertos aspectos de configuración de los recursos como variables, que son reemplazadas por un valor concreto en tiempo de build (cuando se ejecuta maven) Hemos definido el perfil mysql, activo por defecto, asignándole a las variables los valores correspondientes para la conectividad con la BD MySQL Plugins Compiler Configuración del compilador Assembly (mvn assembly:assembly) Permite generar distribuciones En los ejemplos se usa para generar una distribución fuente SQL (mvn sql:execute) Ejecución de los scripts SQL de creación de tablas Jetty (mvn jetty:run) Permite ejecutar una aplicación en el servidor Web Jetty sin necesidad de empaquetarla en un fichero WAR

Ejemplos Compilación (y 3) Laboratorio - 23 Configuración por defecto de BD: MySQL BD para la ejecución de la aplicación: pojo BD para la ejecución de las pruebas: pojotest En ambos casos => usuario pojo, password pojo Disponer de ambas bases de datos, permite que la ejecución de la aplicación no afecte a la ejecución de las pruebas, y viceversa Arrancar la BD Utilizar maven para crear las tablas en la base de datos y compilar los ejemplos cd pojo-examples-2.0.0 mvn sql:execute install

Eclipse (1) Arrancar Eclipse eclipse& IMPORTANTE: no usar las versiones de Eclipse disponibles en Applications > Programming Seguir pasos del README.txt de los ejemplos para configuración e instalación de plugins Subversion (subclipse) Maven 3 (m2eclipse) Laboratorio - 24

Laboratorio - 25 Eclipse - Importar Proyecto Maven (2) Configuración de Eclipse para importar todos los módulos de los ejemplos como un proyecto (utilizando m2eclipse) Ir a "File > Import > Maven > Existing Maven Projects" Seleccionar el directorio raíz del proyecto Click sobre "Finish"

Eclipse - Ejecución y Depuración de clases (3) Creación de una nueva configuración para ejecutar una clase en Eclipse Seleccionar la clase que se quiere ejecutar en el Package Explorer Botón derecho + Run As > Run Configurations... > Java Application Botón derecho + "New" Especificar el nombre de la nueva configuración Main > Main class Aparece rellenado con el nombre de la clase seleccionada en el primer paso Arguments > Program arguments: Indicar los argumentos Apply Laboratorio - 26

Eclipse - Ejecución y Depuración de clases (4) Depuración Eclipse posee una perspectiva para depuración de aplicaciones Permite seguir la traza de ejecución de una aplicación, establecer puntos de interrupción y visualizar el estado de las variables en un instante determinado Laboratorio - 27

Laboratorio - 28 Eclipse - Ejecución y Depuración de clases (5) Ejecución de una clase para la que ya se ha creado una configuración: Run > Run Configurations... > Elegir configuración a Ejecutar > Run Icono Run de la barra de herramientas > Elegir configuración a ejecutar Ejecución de una clase en modo Debug para la que ya se ha creado una configuración: Run > Debug Configurations... > Elegir configuración a Ejecutar > Debug Icono Debug de la barra de herramientas > Elegir configuración a ejecutar Organización de configuraciones preferidas Icono Run de la barra de herramientas > Organize Favourites Icono Debug de la barra de herramientas > Organize Favourites

Laboratorio - 29 Eclipse - Ejecución y Depuración de clases (6) Iniciar la base de datos Ejecución desde Eclipse NOTA: Tras importar el proyecto es necesario forzar a que los recursos se copien y filtren del directorio src a target Ejecutar: mvn process-test-resources pojo-jdbctutorial es.udc.pojo.jdbctutorial.insertexample es.udc.pojo.jdbctutorial.selectexample es.udc.pojo.jdbctutorial.transactionexample pojo-minibank es.udc.pojo.minibank.test.experiments.hibernate.createaccount es.udc.pojo.minibank.test.experiments.hibernate.existaccount <accid> es.udc.pojo.minibank.test.experiments.hibernate.findaccount <accid> es.udc.pojo.minibank.test.experiments.hibernate.findaccountsbyuserid <userid> es.udc.pojo.minibank.test.experiments.hibernate.removeaccount <accid> es.udc.pojo.minibank.test.experiments.transfer.transfer <srcaccid> <destaccid>

Eclipse: Plugin Maven 3 (7) Laboratorio - 30 Creación de una nueva configuración maven para Eclipse Botón derecho sobre un pom.xml en el Package Explorer Run As > Maven build... Especificar el nombre de la nueva configuración de maven Main: Base directory: Aparece rellenado con el directorio donde está el pom.xml seleccionado en el primer paso Goals: Indicar los goals a ejecutar en esta configuración Apply Select: Permite elegir entre los goals disponibles

Eclipse: Plugin Maven 3 (8) Laboratorio - 31 Creación de una nueva configuración maven para Eclipse para ejecutar una única clase de test Botón derecho sobre el pom.xml del módulo que contiene la clase de prueba Run As > Maven build... Especificar el nombre de la nueva configuración de maven Main: Base directory: Aparece rellenado con el directorio donde está el pom.xml seleccionado en el primer paso Goals: test Añadir los parámetros forkmode (valor none ) y test (nombre de la clase a ejecutar) a través del botón Add. Por ejemplo: <forkmode, none> Apply <test, AccountServiceTest>

Eclipse: Plugin Maven 3 (y 9) Laboratorio - 32 Ejecución de una configuración maven para Eclipse ya creada Run > Run Configurations... > Elegir configuración a Ejecutar > Run Icono Run de la barra de herramientas > Elegir configuración a ejecutar Ejecución de una configuración maven para Eclipse ya creada en modo Debug Run > Debug Configurations... > Elegir configuración a Ejecutar > Debug Icono Debug de la barra de herramientas > Elegir configuración a ejecutar Organización de configuraciones preferidas Icono Run de la barra de herramientas > Organize Favourites Icono Debug de la barra de herramientas > Organize Favourites

SVN Conceptos básicos (1) Laboratorio - 33 Subversion es un sistema de control de versiones similar a CVS La parte principal es el repositorio, que es un almacén central de datos El repositorio almacena información en forma de árbol de archivos Típica jerarquía de archivos y directorios El repositorio es como un servidor de ficheros ordinario, excepto porque recuerda todos los cambios hechos a sus ficheros y directorios Esto permite recuperar versiones antiguas de los datos, o examinar el historial de cambios Permite acceso concurrente a múltiples usuarios para lectura o escritura Algunos comandos import, checkout, add, delete, commit, update, diff, status, copy, move, log, merge, help [command]

SVN Conceptos básicos (2) Métodos para control de versiones Bloqueo-Modificación-Desbloqueo (Lock-Modify-Unlock) En general no se suele utilizar este método Copiar-Modificar-Mezclar (Copy-Modify-Merge) Los repositorios de Subversion son accesibles a través de diferentes métodos (en el disco local, o a través de varios protocolos de red) La ubicación de un repositorio se especifica siempre con un URL En nuestro caso utilizaremos el protocolo HTTPS https://svn.fic.udc.es/ei5/is/is Laboratorio - 34

SVN Conceptos básicos (3) Laboratorio - 35 Revisiones Una operación svn commit puede publicar los cambios sobre cualquier número de ficheros y directorios como una única transacción atómica En la copia privada, se puede cambiar el contenido de los ficheros, crear, borrar, renombrar y copiar ficheros y directorios, y luego enviar el conjunto entero de cambios como si se tratara de una unidad al repositorio En el repositorio, cada commit se trata como una transacción atómica: o bien se realizan todos los cambios, o no se realiza ninguno Cada vez que el repositorio acepta un envío, éste da lugar a un nuevo estado del árbol de ficheros llamado revisión A cada revisión se le asigna un número natural único, una unidad mayor que el número de la revisión anterior La revisión inicial de un repositorio recién creado se numera con el cero, y consiste únicamente en un directorio raíz vacío

SVN Conceptos básicos (4) Un concepto común en el control de versiones es el de etiqueta o tag Una etiqueta no es más que una instantánea del proyecto en el tiempo En Subversion, esta idea ya está presente en todas partes ya que cada revisión del repositorio es exactamente eso (una instantánea del sistema de ficheros tras cada envío al repositorio) No obstante, es más significativo dar nombres más familiares a las etiquetas, como por ejemplo version-1.0 El comando svn copy permite realizar una copia ligera de un directorio del repositorio a otra ubicación svn copy https://svn.fic.udc.es/ei5/is/12-13/isg001/pojo-app/trunk \ https://svn.fic.udc.es/ei5/is/12-13/isg001/pojo-app/tags/version-1.0 \ -m "Etiqueta de la versión 1.0 del proyecto pojo-app" Laboratorio - 36

SVN Conceptos básicos (5) Otro concepto común en el control de versiones es el de rama o branch En Subversion no hay diferencia entre una etiqueta y una rama Ambas son directorios ordinarios que son creados a partir de una copia La única razón por la que un directorio copiado es una etiqueta es porque el usuario ha decidido tratarlo de ese modo Mientras nadie envíe cambios usando ese directorio, seguirá siendo una instantánea Si se realizan cambios sobre él, se convierte en una rama Es posible copiar cambios entre ramas o fusionarlas Laboratorio - 37

Laboratorio - 38 SVN Conceptos básicos (6) Estructura recomendada Directorio raíz del proyecto https://svn.fic.udc.es/ei5/is/12-13/isg001 Cada branch contiene modificaciones realizadas a partir del código asociado a un tag Cada tag contiene código asociado a una revisión específica El trunk contiene la versión actual del código (ultima revisión)

SVN & Eclipse (7) Laboratorio - 39 Plugin subclipse Botón derecho > Team Update to HEAD Commit Add to Version Control Branch/Tag Show History Botón derecho > Delete

SVN & Eclipse (y 8) Laboratorio - 40 Creación de tags/branches

Creación Inicial del Proyecto Arquetipo: pojo-miniportal-archetype Proyecto generado por el arquetipo: MiniPortal Modelo Capa Web Layout Session y Cookies Filtros de regeneración de sesión / acceso a recursos Uso del arquetipo Cómo añadir un DAO Cómo añadir una operación Cómo añadir una página web Laboratorio - 41

Creación Inicial del Proyecto (1) Añadir a la lista de repositorios el del arquetipo + cd $HOME/.m2 + wget http://www.tic.udc.es/is-java/maven-repo/settings.xml Crear el esqueleto del proyecto y subirlo al repositorio Es necesario tener en cuenta las siguientes consideraciones artifactid representa el nombre del proyecto (cambiar pojo-app por el nombre del proyecto, que puede estar basado en la temática de la práctica) groupid representa la jerarquía de paquetes básica de la aplicación, por lo que tiene que especificarse en minúsculas y no incluir guiones. Suele ser el nombre de la organización más el nombre del proyecto dentro de la organización (cambiar es.udc.pojoapp por el nombre del paquete principal de la práctica del grupo, como por ejemplo es.udc.is.isg001.practicais, siendo isg001 el nombre del grupo de prácticas correspondiente y practicais el nombre del proyecto) Laboratorio - 42

Creación Inicial del Proyecto (2) Crear el esqueleto del proyecto y subirlo al repositorio + mvn archetype:generate -DarchetypeGroupId=es.udc.pojo.archetypes -DarchetypeArtifactId=pojo-miniportal-archetype -DarchetypeVersion=2.0.0 -DgroupId=es.udc.pojoapp -DartifactId=pojo-app -Dversion=1.0.0 + Confirmar el proceso: Y + cd pojo-app + mkdir trunk branches tags + mv pom.xml src trunk + svn import https://svn.fic.udc.es/ei5/is/12-13/isg001/pojo-app -m "Proyecto pojo-app" --username XX --password XX + cd.. + rm -rf pojo-app NOTA: Sustituir pojo-app por el nombre del proyecto e isg001 por el grupo correspondiente y especificar usuario y contraseña NOTA: Sólo debe de realizarlo un miembro del grupo Laboratorio - 43

Creación Inicial del Proyecto (3) Laboratorio - 44 Bajar el proyecto del repositorio y crear un proyecto Eclipse + Importar el proyecto desde Eclipse mediante File -> Import -> Maven -> Check out Maven Projects from SCM" * Especificar la URL "svn" "https://svn.fic.udc.es/ei5/is/12-13/isg001/pojoapp/trunk" * Click en Next * (Opcional) Deseleccionar "Use default workspace location" Browse -> elegir un directorio en el que se creará el proyecto En ese directorio se creará un directorio con el nombre del proyecto o con nombre maven.<timestamp> con el código fuente del proyecto dentro * Click en Finish * Introducir usuario y contraseña en caso de que la pida

Creación Inicial del Proyecto (y 4) Laboratorio - 45 Instrucciones, tras el import En ese momento eclipse crea el directorio.settings y los ficheros.project,.classpath + Botón derecho sobre el proyecto -> Team > Synchronize with repository Esto hace que te muestre los ficheros que no están sincronizados Sobre los ficheros.project,.classpath y directorio.settings: + botón derecho > Team > Add to svn:ignore NOTA: Add to svn:ignore sólo se puede hacer sobre ficheros que no estén ya subidos al SVN. Para los subidos, primero hay que eliminarlos Hacer modificaciones y commit desde Eclipse + Botón derecho sobre pom.xml -> Team -> Commit (Sólo un miembro del grupo; el resto de miembros Team -> Update to Head sobre el proyecto)

MiniPortal El arquetipo genera la aplicación MiniPortal Qué es MiniPortal? Un portal con registro de usuarios y sin contenidos Arquitectura reusable para implementar un portal real con usuarios registrados Qué aporta MiniPortal frente a MiniBank? Gestión de sesiones y cookies Extensión del procesador de peticiones para Mantenimiento de la sesión Obligar a que las acciones que requieren autenticación sólo estén disponibles para los usuarios autenticados Constituye la base para el desarrollo de la práctica Laboratorio - 46

Estructura de src/main (1) pojo-miniportal src/main java es.udc.pojoapp model userprofile userservice util (Continúa en la siguiente transparencia) web components pages user services util Laboratorio - 47

Estructura de src/main (y 2) pojo-miniportal src/main resources es/udc/pojoapp/web components pages org/apache/tapestry5 user corelib components pages webapp css internal WEB-INF Laboratorio - 48

Modelo de MiniPortal (1) Laboratorio - 49 es.udc.pojoapp.model.userprofile.userprofile Modela la información de registro de un usuario Para gestionar su persistencia se define un DAO, que extiende del genérico y utiliza Hibernate UserProfile - userprofileid : Long - loginname : String - encryptedpassword : String - firstname : String - lastname : String - email : String - version : long + Constructores + métodos get/set es.udc.pojoapp.model.userservice.userservice Servicio que modela la interacción del usuario con el portal Registrar usuario Autenticarse Recuperar información de registro Actualizar información de registro Cambiar contraseña

Modelo de MiniPortal (2) Laboratorio - 50 UserProfileDetails - firstname : String - lastname : String - email : String + Constructor + Métodos get <<interface>> UserService + registeruser(loginname : String, clearpassword : String, userprofiledetails : UserProfileDetails) : Long + login(loginname : String, password : String, passwordisencrypted : boolean) : UserProfile + finduserprofile(userprofileid : Long) : UserProfile + updateuserprofiledetails(userprofileid : Long, userprofiledetails : UserProfileDetails) : void + changepassword(userprofileid : Long, oldclearpassword : String, newclearpassword : String) : void UserServiceImpl <<use>> PasswordEncrypter <<use>> jcrypt

Modelo de MiniPortal (3) Cuando un usuario se registra, introduce su contraseña en claro El portal no permite actualizar la contraseña y el resto de información de registro a través del mismo formulario, dado que las contraseñas se guardan cifradas Para cifrar las contraseñas se utiliza la clase es.udc.pojoapp.model.userservice.util.passwordencrypter Las operaciones de registro de usuario y actualización de información de registro de la fachada trabajan con UserProfileDetails, que no incluye la contraseña Laboratorio - 51

Modelo de MiniPortal (y 4) El caso de uso login devuelve UserProfile porque se necesita la siguiente información userprofileid Se mantendrá en la sesión (caché), porque se necesita para invocar los casos de uso de búsqueda y actualización de información de usuario (además, su presencia en la sesión se utiliza para saber si un usuario está autenticado) firstname Se mantendrá en la sesión (caché), dado que se visualiza en todas las páginas Ocupa poca memoria encryptedpassword Si el usuario selecciona recordar mi contraseña, es preciso enviar su valor como cookie Laboratorio - 52

Capa Web de MiniPortal Laboratorio - 53 De forma similar a pojo-minibank, en MiniPortal todas las páginas tienen el mismo layout (se basan en el componente es.udc.pojoapp.web.components.layout) Título (tag title) Cabecera Mensaje Bienvenida [nombre usuario] - Nombre pantalla Enlaces Contenido Pie de página

Session State Objects (1) A diferencia de MiniBank, MiniPortal permite realizar diferentes operaciones en función de si hay o no un usuario autenticado Tapestry permite crear objetos que estén accesibles a todas las páginas: Session State Objects (SSOs) En MiniPortal hemos definido la clase UserSession, que contiene información de un usuario, necesaria una vez se ha autenticado/registrado Los SSOs típicamente tienen que tener un constructor sin argumentos (o con argumentos para inyectar servicios) Para hacer accesible ese objeto a una página en concreto, es necesario añadir una propiedad de ese tipo a la página correspondiente y anotarla con @SessionState Sólo puede haber un SSO por clase de objeto Es decir, cualquier página que declare una propiedad de la clase UserSession, anotándola con @SessionState, referenciará al mismo objeto, aunque el nombre de la propiedad sea diferente Laboratorio - 54

Session State Objects (y 2) Laboratorio - 55 Como cualquier otra propiedad de una página, es necesario definir métodos get para poder acceder a ella desde la plantilla Por defecto, los SSOs se almacenan en la Sesión (javax.servlet.http.httpsession) Si no existe la Sesión cuando se referencia un SSO por primera vez, se crea Tapestry proporciona un mecanismo para determinar si un SSO ha sido creado, sin iniciar su creación Declarar una propiedad privada boolean con el mismo nombre que la propiedad del SSO + el token Exists Alternativamente, se puede permitir que el SSO sea nulo para que no se cree de forma automática al referenciarlo, utilizando el parámetro create=false en la anotación Ésta es la alternativa utilizada en los ejemplos Tapestry contempla el uso de SSOs en un entorno en cluster

UserSession.java Laboratorio - 56 public class UserSession { private Long userprofileid; private String firstname; public Long getuserprofileid() { return userprofileid; } public void setuserprofileid(long userprofileid) { this.userprofileid = userprofileid; } public String getfirstname() { return firstname; } public void setfirstname(string firstname) { this.firstname = firstname; } }

Layout.java public class Layout { @SuppressWarnings("unused") @Property @Parameter(required = false, defaultprefix = "message") private String menuexplanation; } @SuppressWarnings("unused") @Property @Parameter(required = true, defaultprefix = "message") private String pagetitle; @SuppressWarnings("unused") @Property @SessionState(create=false) private UserSession usersession;... En función de si un usuario está autenticado o no, se mostrarán diferentes enlaces, el nombre del usuario y un mensaje Laboratorio - 57

Layout.tml... <t:if test="usersession"> ${message:menu-hello} ${usersession.firstname} <p:else> ${message:menu-welcome} </p:else> </t:if> </span> - <t:if test="menuexplanation"> <span id="menuexplanation"> ${menuexplanation} </span> <p:else> <span id="menulinks"> <t:if test="usersession"> <a href="#" t:type="pagelink t:page="user/updateprofile"> ${message:menu-updateprofile}</a> - <a href="#" t:type="actionlink" t:id="logout"> ${message:menu-logout}</a> <p:else> <a href="#" t:type="pagelink" t:page="user/login"> ${message:menu-authenticate}</a> </p:else> </t:if> </span> </p:else> </t:if>... Laboratorio - 58

Capa Web de pojo-miniportal Clic en Register user/register user/login onvalidatefromxxx() onvalidatefromxxx() Clic en Authenticate onsuccess() onsuccess() Index (sin autenticar) Clic en Logout Index (autenticado) Clic en Update profile onprepareforrender() onactionfromlogout() onvalidatefromxxx() user/updateprofile onsuccess() Clic en Change password onsuccess() user/changepassword onvalidatefromxxx() Laboratorio - 59

Gestión de Cookies Para gestionar las cookies, Tapestry proporciona el servicio Cookies Permite leer el valor de cookies que llegan en la petición HTTP, así como eliminar y modificar/añadir cookies a la respuesta HTTP Para hacer uso de este servicio sólo es necesario inyectarlo en la página que lo vaya a utilizar @Inject private Cookies cookies; Para gestionar las cookies hemos definido una clase utilidad, CookiesManager, que recibe como parámetro el servicio Cookies Laboratorio - 60

CookiesManager.java public class CookiesManager { private static final String LOGIN_NAME_COOKIE = "loginname"; private static final String ENCRYPTED_PASSWORD_COOKIE = "encryptedpassword"; private static final int REMEMBER_MY_PASSWORD_AGE = 30 * 24 * 3600; // 30 days in seconds public static void leavecookies(cookies cookies, String loginname, String encryptedpassword) { cookies.writecookievalue(login_name_cookie, loginname, REMEMBER_MY_PASSWORD_AGE); cookies.writecookievalue(encrypted_password_cookie, encryptedpassword, REMEMBER_MY_PASSWORD_AGE); } public static void removecookies(cookies cookies) { cookies.removecookievalue(login_name_cookie); cookies.removecookievalue(encrypted_password_cookie); } public static String getloginname(cookies cookies) { return cookies.readcookievalue(login_name_cookie); } } public static String getencryptedpassword(cookies cookies) { return cookies.readcookievalue(encrypted_password_cookie); } Laboratorio - 61

Login.java (1) Laboratorio - 62 public class Login { @Property private String loginname; @Property private String password; @Property private boolean remembermypassword; @SessionState(create=false) private UserSession usersession; @Inject private Cookies cookies; @Component private Form loginform; @Inject private Messages messages; @Inject private UserService userservice; private UserProfile userprofile = null;...

Login.java (y 2) void onvalidatefromloginform() { if (!loginform.isvalid()) { return; } try { userprofile = userservice.login(loginname, password, false); } catch (InstanceNotFoundException e) { loginform.recorderror(messages. get("error-authenticationfailed")); } catch (IncorrectPasswordException e) { loginform.recorderror(messages. get("error-authenticationfailed")); } } Object onsuccess() { usersession = new UserSession(); usersession.setuserprofileid(userprofile.getuserprofileid()); usersession.setfirstname(userprofile.getfirstname()); } } if (remembermypassword) { CookiesManager.leaveCookies(cookies, loginname, userprofile.getencryptedpassword()); } return Index.class; Laboratorio - 63

Login.tml Laboratorio - 64 http://localhost:9090/pojo-miniportal/user/login MiniPortal authentication form La plantilla de user/login hace uso del componente CheckBox... <div class="field"> <t:label for="remembermypassword"/> <span class="entry"> <input type="checkbox" t:type="checkbox" t:id="remembermypassword" /> </span> </div>...

Acción de Logout Laboratorio - 65 No existe página de Logout Como no requería plantilla, se ha implementado como un ActionLink desde Layout.tml En la clase Layout se ha añadido el método onactionfromlogout, responsable de la destrucción del objeto que representa la sesión del usuario y de borrar las cookies... @SuppressWarnings("unused") @Property @SessionState(create=false) private UserSession usersession; @Inject private Cookies cookies;... Object onactionfromlogout() { usersession = null; CookiesManager.removeCookies(cookies); return Index.class; }

Gestión de Cookies en MiniPortal Laboratorio - 66 MiniPortal utiliza dos cookies para recordar la contraseña de un usuario durante 30 días: loginname y encryptedpassword El método onvalidatefromloginform de la página user/login Valida las credenciales del usuario (método login de UserService) Inicializa la propiedad userprofile El método onsuccess de la página user/login añade las cookies a la respuesta HTTP (CookiesManager.leaveCookies) Obtiene la información de contraseña encriptada de la propiedad userprofile El método onactionfromlogout del componente Layout destruye el objeto usersession y borra las cookies (CookiesManager.removeCookies) Los métodos getloginname y getencryptedpassword de la clase CookiesManager son utilizados para recuperar el nombre y contraseña del usuario a partir de las cookies recibidas Más adelante se verá cómo se utilizan estos métodos para autenticar de forma automática a un usuario, sin necesidad de introducir nombre de usuario y contraseña, si el cliente posee las cookies loginname y encryptedpassword

Laboratorio - 67 Mantenimiento de Sesión y Control de Acceso (1) Problema 1: Mantenimiento de la sesión Si un usuario se ha autenticado chequeando recordar mi contraseña, cuando vuelva a acceder al portal debe de autenticarse de forma automática si le caducó la sesión y las cookies no han expirado Problema 2: Prohibir determinadas acciones a usuarios no autenticados Si un usuario no autenticado intenta acceder a las páginas actualizar info. registro o cambiar contraseña, o las asociadas a sus botones de Submit, o a la asociada al enlace Logout, debería redirigírsele a la página de autenticación En este caso la interfaz de usuario no presenta estas opciones a un usuario no autenticado, pero podría ocurrir si no ha seleccionado recordar mi contraseña y su sesión ha caducado Portal de comercio electrónico Normalmente permiten que cualquier usuario busque y añada productos al carrito de la compra Cuando el usuario intenta comprar, si no se había autenticado, se le redirige a la página de autenticación

Mantenimiento de Sesión y Control de Acceso (2) Todas las peticiones de páginas de Tapestry pasan por el filtro de Tapestry configurado en el fichero web.xml Ese filtro delega en diferentes cadenas de filtros para realizar distintos procesamientos sobre la petición Tapestry permite añadir nuevos filtros a esas cadenas, para realizar procesamientos adicionales. En particular, MiniPortal añade dos tipos de filtros diferentes Para resolver el problema 1: Mantenimiento de Sesión Añade un filtro que utiliza el servicio Cookies (clase CookiesManager) para intentar recuperar las cookies loginname/encriptedpassword Si encuentra las cookies, utiliza sus valores para autenticar al usuario y crear el SSO UserSession. En otro caso, elimina las cookies, por ser inválidas Laboratorio - 68

Mantenimiento de Sesión y Control de Acceso (y 3) En particular, MiniPortal añade dos tipos de filtros diferentes (cont.) Para resolver el problema 2: Control de Acceso Define una política de acceso, con diferentes niveles, a través de la enumeración AuthenticationPolicyType ALL_USERS. Cualquier usuario puede realizar esa acción AUTHENTICATED_USERS. Sólo puede acceder un usuario que previamente se haya autenticado NON_AUTHENTICATED_USERS. Sólo pueden acceder usuarios que no se hayan autenticado previamente Asigna un nivel de acceso a cada uno de los elementos (páginas o métodos de procesamiento de eventos) de la aplicación a través de la anotación AuthenticationPolicy. Valor por defecto ALL_USERS Añade un filtro que implementa la lógica que aplique la política de acceso en base a las anotaciones de cada elemento solicitado y el estado de la sesión del usuario (usuario autenticado o no autenticado) Laboratorio - 69

Uso del Arquetipo Uso del arquetipo Cómo añadir datos a la base de datos Cómo añadir un DAO al modelo Cómo añadir una operación al modelo Cómo añadir una página web Laboratorio - 70

Añadir Datos a la Base de Datos Base de datos de pruebas y de ejecución de aplicaciones MiniPortal utiliza dos bases de datos: una para pruebas (tests) y otra para la ejecución de aplicaciones De esta manera, la ejecución de una aplicación no afecta a las pruebas, y viceversa Para crear los datos necesarios para la ejecución de la aplicación (e.g. categorías y productos en una tienda de comercio electrónico) Añadir sentencias INSERT INTO en el siguiente script src/sql/2-mysqlcreatedata.sql Laboratorio - 71

Añadir un DAO al Modelo Para añadir una nueva entidad persistente Xxx Crear una interfaz en es.udc.pojoapp.model/xxx/xxxdao que extienda del DAO genérico, GenericDao<E, PK> Crear una clase de implementación en es.udc.pojoapp.model/xxx/xxxdaohibernate que extienda de GenericDaoHibernate<E,PK> e implemente XxxDao Anotarla con @Repository("xxxDao") Añadir métodos no soportados por el DAO genérico Laboratorio - 72

Añadir una Operación al Modelo Laboratorio - 73 Crear una interfaz si se define un nuevo servicio Definir las operaciones del servicio Añadir método a la interfaz que define el servicio Crear una clase de implementación del servicio que implemente la interfaz Anotar la clase para representar un servicio @Service("serviceName") Gestión declarativa de la transaccionalidad de las operaciones Anotar la clase con @Transactional (redefinir en métodos e.g. para optimizar: readonly) Inyectar los DAOs necesarios para las operaciones @Autowired sobre las propiedades que almacenan la instancia de los DAOs Definir las operaciones en términos de DAOs

Añadir una Página Web (1) Laboratorio - 74 Clase Java Para usar sesiones utilizar la anotación @SessionState @SessionState(create=false) private UserSession usersession; Para usar servicios del modelo utilizar la anotación @Inject @Inject private UserService userservice; Plantilla Uso del componente Layout <html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd" t:type="layout" t:pagetitle="title" t:menuexplanation="menuexplanation"> </html>

Añadir una Página Web (y 2) Laboratorio - 75 Control de acceso a la página / métodos Anotar los elementos de la aplicación (páginas o métodos de procesamiento de eventos) de forma adecuada Usar la anotación @AuthenticationPolicy Especificar el nivel de acceso al recurso mediante uno de los valores posibles de la enumeración AuthenticationPolicyType Ejemplos Las páginas user/login y user/register son sólo aplicables a usuarios que no se hayan autenticado todavía @AuthenticationPolicy( AuthenticationPolicyType.NON_AUTHENTICATED_USERS) public class Login {... } El evento logout del componente Layout sólo puede ser invocado por usuarios que se hayan autenticado previamente @AuthenticationPolicy( AuthenticationPolicyType.AUTHENTICATED_USERS) Object onactionfromlogout() {... }

Jetty & Maven 3 (1) Laboratorio - 76 Jetty: Servidor HTTP y contenedor de servlets open source escrito 100% en Java Maven 3 + plugin Jetty Desarrollo ágil: Permite ejecutar una aplicación Web sin empaquetarla en un fichero WAR (entiende los directorios "src" y "target" de la distribución fuente) El plugin puede configurarse para que detecte automáticamente cambios en la aplicación web y la recargue, o para permitir una recarga manual Ejecución: cd <module> mvn jetty:run Cargar en el navegador http://localhost:9090/<module> Ejemplo: cd pojo-minibank mvn jetty:run http://localhost:9090/pojo-minibank Para parar Jetty: CTRL-C Para recargar la aplicación web: ENTER

Laboratorio - 77 Jetty - Modificación del puerto por defecto (2) Por defecto se arranca en el puerto 8080 En los ejemplos de la asignatura se ha configurado para que arranque en el puerto 9090 Se ha incluido el siguiente fragmento en la configuración del plugin de Jetty (dentro del tag configuration) <connectors> <connector implementation="org.eclipse.jetty.server.nio.selectchannelconnector"> <port>9090</port> </connector> </connectors> También es posible especificar un puerto distinto en el momento de arrancar el servidor Jetty desde maven, usando la propiedad de entorno jetty.port E.g. Arrancar jetty en el puerto 9090 mvn -Djetty.port=9090 jetty:run

Detección de cambios (3) Cambios a ficheros Web estándar Ficheros Web estándar: páginas JSP o ficheros HTML en src/main/webapp Al igual que cualquier otro servidor de aplicaciones Java, Jetty detecta automáticamente los cambios que se hagan a este tipo de ficheros de forma transparente al desarrollador Cambios a plantillas y ficheros de mensajes Las plantillas y los ficheros de mensajes son conceptos específicos a Tapestry (los ficheros de mensajes son estándar, pero en nuestro caso, su uso está ligado a las plantillas de Tapestry) Jetty utiliza las versiones disponibles en target/classes (equivalente a WEB-INF/classes) Cuando Tapestry está configurado en modo desarrollo, Tapestry detecta automáticamente los cambios que se hagan a este tipo de ficheros de forma transparente al desarrollador Laboratorio - 78

Detección de cambios (4) Laboratorio - 79 Cambios a plantillas y ficheros de mensajes (cont) Si se importa el proyecto con m2eclipse, cuando se modifica un fichero de recursos en src/main/resources, Eclipse lo copia automáticamente a target/classes Project -> Build Automatically tiene que estar habilitado, o alternativamente hay que ejecutar explícitamente Project -> Build Project sobre el proyecto Si se utilizase otro IDE que no hiciese esta copia automáticamente, basta hacer mvn process-resources En consecuencia, con nuestro entorno de desarrollo, cada vez que se hace un cambio a una plantilla o un fichero de mensajes, Tapestry lo detecta automáticamente de forma transparente al desarrollador Cambios a ficheros fuente Java Los ficheros objeto de las clases Java residen en target/classes Jetty, al igual que otros servidores de aplicaciones Java, no detecta automáticamente los cambios a los ficheros objeto de las clases Java (WEB-INF/classes)

Detección de cambios (5) Cambios a ficheros fuente Java (cont) Es posible configurar Jetty para que recargue la aplicación Web En la asignatura hemos optado por configurar Jetty para que recargue la aplicación Web pulsando ENTER en la consola de Jetty Si se importa el proyecto con m2eclipse, cuando se modifica un fichero fuente Java, Eclipse lo copia automáticamente a target/classes Project -> Build Automatically tiene que estar habilitado, o alternativamente hay que ejecutar explícitamente Project -> Build Project sobre el proyecto Si se utilizase otro IDE que no hiciese esta copia automáticamente, basta hacer mvn compile Caso especial: cuando Tapestry está configurado en modo desarrollo, Tapestry detecta automáticamente (y de forma transparente al desarrollador) los cambios que se hagan a las clases en los paquetes components y pages de la capa Web Laboratorio - 80

Detección de cambios (6) Cambios a ficheros fuente Java (cont) En consecuencia Con nuestro entorno de desarrollo, cada vez que hacemos un conjunto de cambios a ficheros Java que no estén en los paquetes components y pages de la capa Web, y a continuación queremos acceder a la aplicación Web, es necesario pulsar ENTER en la consola de Jetty Si los cambios sólo afectan a clases que estén en los paquetes components y pages de la capa Web, no es necesario hacer nada Cambios en el resto de ficheros Ficheros de configuración de Spring/Hibernate, WEB- INF/web.xml, etc. Es necesario pulsar ENTER en la consola de Jetty Laboratorio - 81

Detección de cambios (7) Efectos de las recargas de Jetty Jetty recarga la aplicación Web cada vez que pulsamos ENTER en su consola Los cambios a ficheros Web estándar, plantillas, ficheros de mensajes y clases que estén en los paquetes components y pages de la capa Web, no requieren recargar la aplicación Web Efecto 1: sesiones Todas las sesiones que estaban creadas se destruyen (e.g. si el usuario está autenticado, su sesión se destruirá) Efecto 2: memoria Las recargas no liberan correctamente la memoria de la aplicación Web (es un tema común a los cargadores de clases de Java) Laboratorio - 82

Detección de cambios (8) Efectos de las recargas de Jetty Efecto 2: memoria (cont) Tras n recargas, Jetty tendrá problemas de memoria y dejará de funcionar (como cualquier otra aplicación Java) Para hacer que Jetty aguante más, puede configurarse la máquina virtual de Java para use unos tamaños mayores de memoria (como se haría con cualquier otra aplicación Java) Es posible definir la variable de entorno MAVEN_OPTS para que Maven pase opciones a la máquina virtual E.g. export MAVEN_OPTS="-Xms512m -Xmx1024m -XX:PermSize=256m \ -XX:MaxPermSize=512m" Finalmente, es buena práctica pulsar ENTER sólo cuando hay una necesidad real de que Jetty recargue la aplicación Web (e.g. hacemos un conjunto de cambios a ficheros de configuración o fuentes Java que no estén en los paquetes components y pages de la capa Web, y queremos probar la aplicación) Laboratorio - 83

Jetty - Depuración (y 9) Laboratorio - 84 Depuración Web Crear una configuración para ejecutar el goal jetty:run Arrancar Jetty a través del plugin de Maven 3 de Eclipse en modo debug Run > Debug Configurations... Maven Build > New para crear una nueva configuración o elegir una configuración de maven existente Debug Icono Debug de la barra de herramientas > Elegir configuración a ejecutar Para finalizar la ejecución de Jetty, hay que pulsar sobre el botón rojo de la consola de Jetty en Eclipse Para más información sobre el plugin de Jetty puede consultarse su documentación http://wiki.eclipse.org/jetty/feature/jetty_maven_plugin

Apache Tomcat Laboratorio - 85 Configuración cd $IS_HOME/apache-tomcat-7.0.29 Seguir pasos del README.txt de los ejemplos Arranque: bin/startup.sh -> http://localhost:8080 Finalización: bin/shutdown.sh Instalación de Aplicaciones Copiar el fichero WAR al directorio webapps LOGS logs/localhost.<fecha>.log logs/catalina.out

Recomendaciones Finales Gestor de base de datos (MySQL) Finalizarlo de forma correcta para evitar tener que cambiar el puerto utilizado por defecto por el gestor La práctica debe poder ser compilada y empaquetada con maven 3, y ejecutada desde Tomcat, aunque se utilicen Eclipse y Jetty como entorno de desarrollo Laboratorio - 86