UDA-Migracion a v2

25
UDA – Utilidades de desarrollo de aplicaciones by EJIE is licensed under a Creative Commons Reconocimiento- NoComercial-CompartirIgual 3.0 Unported License . UDA - Utilidades de desarrollo de aplicaciones Migración v2.0.0 Fecha: 22/06/2012 Referencia: EJIE S.A. Mediterráneo, 14 Tel. 945 01 73 00* Fax. 945 01 73 01 01010 Vitoria-Gasteiz Posta-kutxatila / Apartado: 809 01080 Vitoria-Gasteiz www.ejie.es

description

UDA-Utilidades de desarrollo de aplicaciones • Migración a versión 2 http://code.google.com/p/uda/

Transcript of UDA-Migracion a v2

UDA – Utilidades de desarrollo de aplicaciones by EJIE is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License.

UDA - Utilidades de desarrollo de aplicaciones

Migración v2.0.0

Fecha: 22/06/2012 Referencia:

EJIE S.A.

Mediterráneo, 14

Tel. 945 01 73 00*

Fax. 945 01 73 01

01010 Vitoria-Gasteiz

Posta-kutxatila / Apartado: 809

01080 Vitoria-Gasteiz

www.ejie.es

Migración v2.0.0 ii/25

Control de documentación

Título de documento: Migración v2.0.0

Histórico de versiones

Código: Versión: Fecha: Resumen de cambios:

1.0.0 22/06/2012 Primera versión.

Cambios producidos desde la última versión

Control de difusión

Responsable: Ander Martínez

Aprobado por:

Firma: Fecha:

Distribución:

Referencias de archivo

Autor:

Nombre archivo:

Localización:

Migración v2.0.0 iii/25

Contenido

Capítulo/sección Página

1 Introducción v2.0.0 1

2 Actualización componentes RUP v2.0.0 2

3 Actualización librerías v2.0.0 5

3.1 Dependencias 5

3.2 Ficheros de configuración de Spring 6

4 Configuración idiomática 9

5 Seguridad 13

5.1 Seguridad mediante el uso del Mock 14

5.2 Seguridad mediante el uso de XLNets 17

6 Jackson JSON Processor 18

7 Envío de ficheros desde un mantenimiento 19

8 Validaciones 21

9 Excepciones 22

Migración v2.0.0 1/25

1 Introducción v2.0.0

El objetivo de este documento es describir los cambios necesarios a realizar en aplicaciones que se encuentren en fase de desarrollo y que consideren necesario actualizar la versión de las utilidades que proporciona UDA, entendiendo por utilidad los patrones de interacción RUP, la librería de utilidades x38ShLibClasses, las plantillas de generación de código y el plugin para el Eclipse.

En el caso de nuevos desarrollos con UDA se recomienda descargar la última versión completa y tenerla como punto de partida.

La actualización a la versión v2.0.0 se puede realizar en función de las necesidades de la aplicación, pero se dan por sentados los siguientes supuestos:

• La actualización se realiza sobre una aplicación con la versión 1.2.1 de RUP. La actualización directa desde versiones anteriores no ha sido probada por lo que es posible que pueda darse la necesidad de realizar modificaciones extras.

• Los ficheros originales de RUP no han sido modificados.

En los capítulos siguientes se describe de forma detallada qué cambios habrá que realizar en cada caso y además se referencia a diversos anexos de la documentación para profundizar más en cómo se han implementado y para mostrar ejemplos, además de la propia aplicación x21a que está disponible en el repositorio de código.

Una guía básica de qué cambios se deben realizar en cada caso en función de las necesidades de la aplicación sería la siguiente:

Si se quiere modificar únicamente los componentes visuales para resolver posibles problemas detectados y/o obtener los componentes para los nuevos patrones desarrollados sin tocar el resto de la aplicación:

o Solo es necesario actualizar los patrones RUP.

o No es necesario actualizar la librería x38. Los componentes son compatibles con la versión anterior pero no se obtendrá el beneficio de las mejoras practicadas para validaciones y excepciones.

Si se quiere actualizar la librería de utilidades para beneficiarse de las mejoras en seguridad, validación, excepciones, gestión idiomática:

o Habrá que actualizar los componentes RUP, la librería x38ShLibClasses y realizar los cambios requeridos por su uso, a saber: configuración idiomática y configuración de seguridad.

o No es necesario realizar los cambios de validación y excepciones.

Si se quieren implementar validaciones en servidor y cliente mediante la nueva versión:

o Habrá que actualizar los componentes RUP, la librería x38ShLibClasses, realizar los cambios de gestión idiomática y seguridad, que son obligatorios, y además los cambios del sistema de validación y excepción.

Migración v2.0.0 2/25

2 Actualización componentes RUP v2.0.0

Los pasos que se han de realizar para realizar la actualización son los siguientes:

1. Cambiar la carpeta xxxStatics\WebContent\rup por la carpeta incluida en el fichero rup-v2.0.0.zip

2. Modificar la inclusión de los ficheros CSS y JS que se detallan a continuación:

<xxxYYY>War\WebContent?\WEB-INF\layouts\includes\ru p.styles.inc

Modificar las líneas 7-8:

<!-- jQuery UI (custom-theme) --> <link href="${staticsUrl}/rup/custom-theme/jquery-ui-1.8.20.custom.css" rel="stylesheet" type="text/css" />

Modificar las líneas 10-27:

<!-- Patrones (basic-theme) --> <link href="${staticsUrl}/rup/basic-theme/theme.rup.base-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.accordion-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.autocomplete-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.breadCrumb-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.combo-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.date-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.feedback-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.grid-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.lang-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.maint-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.menu-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.messages-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.tabs-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.time-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.toolbar-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.tooltip-2.0.0.css" rel="stylesheet" type="text/css" />

Añadir en la línea 28:

<link href="${staticsUrl}/rup/basic-theme/theme.rup.validate-2.0.0.css" rel="stylesheet" type="text/css" /> <link href="${staticsUrl}/rup/basic-theme/theme.rup.wizard-2.0.0.css" rel="stylesheet" type="text/css" />

<xxxYYY>War\WebContent?\WEB-INF\layouts\includes\ru p.scripts.inc

Modificar las líneas 3-4. Actualización de la versión de jQuery:

<!-- jQuery 1.7.2 --> <script src="${staticsUrl}/rup/scripts/core/jquery-1.7.2.js" type="text/javascript"></script>

Modificar las líneas 6-8. Modificar las versiones de rup.utils y rup.base:

<!-- RUP-CORE --> <script src="${staticsUrl}/rup/scripts/rup.utils-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.base-2.0.0.js" type="text/javascript"></script>

Migración v2.0.0 3/25

Añadir en la línea 9:

<script src="${staticsUrl}/rup/scripts/rup.compatibility-2.0.0.js" type="text/javascript"></script>

Actualizar la sección de jQuery UI:

<!-- jQuery UI 1.8.20--> <script src="${staticsUrl}/rup/scripts/core/ui/jquery-ui-1.8.20.custom.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/ui/jquery-ui.multidatespicker.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/ui/jquery-ui.timepicker.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/ui/jquery.ui.autocomplete.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/ui/jquery.ui.selectmenu.js" type="text/javascript"></script>

Actualizar la sección de jqGrid:

<!-- jqGrid 4.3.2--> <script src="${staticsUrl}/rup/scripts/core/jqGrid/jqGrid-4.3.2.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/jqGrid/jquery.jqGrid.fluid.js" type="text/javascript"></script>

Actualizar la sección de Utilidades adicionales:

<!—Utilidades adicionales--> <script src="${staticsUrl}/rup/scripts/core/utils/form2object.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/utils/jquery.blockUI.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/utils/jquery.fileupload.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/utils/jquery.fileupload-ui.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/utils/jquery.form.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/utils/jquery.iframe-transport.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/utils/jquery.json-2.2.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/utils/jquery.numeric.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/utils/jquery.qtip.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/utils/jquery.url.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/utils/jquery.validate.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/utils/jquery.xdr-transport.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/utils/xbreadcrumbs.js" type="text/javascript"></script>

Actualizar las versiones de los ficheros de los patrones RUP:

<!-- Patrones RUP --> <script src="${staticsUrl}/rup/scripts/rup.accordion-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.autocomplete-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.breadCrumb-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.combo-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.date-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.dialog-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.feedback-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.grid-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.lang-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.maint-2.0.0.js" type="text/javascript"></script>

Migración v2.0.0 4/25

<script src="${staticsUrl}/rup/scripts/rup.menu-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.message-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.tabs-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.time-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.toolbar-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.tooltip-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.upload-2.0.0.js" type="text/javascript"></script>

Añadir a continuación las entradas de los nuevos patrones:

<script src="${staticsUrl}/rup/scripts/rup.upload-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.validate-2.0.0.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/rup.wizard-2.0.0.js" type="text/javascript"></script>

Añadir a continuación la siguiente sección nueva:

<!-- Ajustes de compatibilidad de menú--> <script src="${staticsUrl}/rup/scripts/core/jquery-1.7.2.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/ui/menu/jquery.ui.core.menu.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/ui/menu/jquery.ui.widget.menu.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/ui/menu/jquery.ui.position.menu.js" type="text/javascript"></script> <script src="${staticsUrl}/rup/scripts/core/ui/menu/jquery.ui.menu.js" type="text/javascript"></script> <script type="text/javascript">widgetMenu = $.noConflict(true);</script>

Migración v2.0.0 5/25

3 Actualización librerías v2.0.0

A continuación se van a exponer las modificaciones que se deben realizar para actualizar las versiones de los componentes de servidor que se utilizan en la versión v2.0.0.

3.1 Dependencias

La versión v2.0.0 de UDA trae consigo una serie de actualizaciones de las versiones de las librerías que se utilizan. En concreto, las librerías actualizadas son las siguientes:

Librerías actualizadas

• jackson-core-asl-1.7.2.jar � jackson-core-asl-1.9.7.jar

• jackson-mapper-asl-1.7.2.jar � jackson-mapper-asl-1.9.7.jar

• logback-classic-0.9.29.jar � logback-classic-1.0.6.jar

• logback-core-0.9.29.jar � logback-core-1.0.6.jar

• spring-aop-3.0.5.RELEASE.jar � spring-aop-3.1.1.RELEASE.jar

• spring-asm-3.0.5.RELEASE.jar � spring-asm-3.1.1.RELEASE.jar

• spring-beans-3.0.5.RELEASE.jar � spring-beans-3.1.1.RELEASE.jar

• spring-context-3.0.5.RELEASE.jar � spring-context-3.1.1.RELEASE.jar

• spring-context-support-3.0.5.RELEASE.jar � spring-context-support-3.1.1.RELEASE.jar

• spring-core-3.0.5.RELEASE.jar � spring-core-3.1.1.RELEASE.jar

• spring-expression-3.0.5.RELEASE.jar � spring-expression-3.1.1.RELEASE.jar

• spring-jdbc-3.0.5.RELEASE.jar � spring-jdbc-3.1.1.RELEASE.jar

• spring-orm-3.0.5.RELEASE.jar � spring-orm-3.1.1.RELEASE.jar

• spring-security-acl-3.0.5.RELEASE.jar � spring-security-acl-3.1.0.RELEASE.jar

• spring-security-config-3.0.5.RELEASE.jar � spring-security-config-3.1.0.RELEASE.jar

• spring-security-core-3.0.5.RELEASE.jar � spring-security-core-3.1.0.RELEASE.jar

• spring-security-taglibs-3.0.5.RELEASE.jar � spring-security-taglibs-3.1.0.RELEASE.jar

• spring-security-web-3.0.5.RELEASE.jar � spring-security-web-3.1.0.RELEASE.jar

• spring-tx-3.0.5.RELEASE.jar � spring-tx-3.1.1.RELEASE.jar

• spring-web-3.0.5.RELEASE.jar � spring-web-3.1.1.RELEASE.jar

• spring-webmvc-3.0.5.RELEASE.jar � spring-webmvc-3.1.1.RELEASE.jar

• x38ShLibClasses-1.2.1.jar � x38ShLibClasses-2.0.0.jar

Librerías añadidas

• spring-security-crypto-3.1.0.RELEASE.jar

Migración v2.0.0 6/25

Estos son los pasos a seguir para realizar la actualización de las librerías:

1. Actualizar el repositorio de dependencias Maven con la nueva versión 2.0.0, que contiene las nuevas versiones de las librerías [Opcional]. En caso de no realizarlo, el Eclipse se conectará al repositorio de Internet para descargarse las librerías con lo que el proceso será más lento.

2. Actualizar el fichero "pom.xml" del proyecto xxxEAR para dejar acorde las dependencias de las librerías:

... <properties> <org.springframework.version>3.1.1.RELEASE</org.springframework.version> <org.springframework.security.version>3.1.0.RELEASE</org.springframework.security.version> <org.logback.version>1.0.6</org.logback.version> ... <com.ejie.x38.version>2.0.0</com.ejie.x38.version> </properties> ... ... <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.7</version> </dependency> ... ...

3. Cerrar el Eclipse y borrar las librerías del proyecto EAR alojadas en xxxEAR\APP_INF\lib.

4. Abrir el "build.xml" del proyecto xxxEAR con el editor Ant (botón derecho sobre el fichero, Open With>Ant Editor)

5. Ejecuta la tarea "mavenRunDependencies" (botón derecho sobre la tarea, Run As>Ant Build)

actualizando las nuevas librerías xxxEAR\APP_INF\lib

6. Sobre el proyecto xxxEAR pulsar F5 (Refresh)

3.2 Ficheros de configuración de Spring

La actualización de la versión de Spring implica la modificación de los esquemas de los ficheros de configuración.

Las modificaciones se deben de llevar a cabo en los siguientes ficheros:

• <xxxYYY>EARClasses/src

o beanRefContext.xml

• <xxxYYY>EARClasses/src/spring

o dao-config.xml

o log-config.xml

o security-config.xml

Migración v2.0.0 7/25

o service-config.xml

o tx-config.xml

• <xxxYYY>War/WebContent/WEB-INF/spring

o app-config.xml

o log-config.xml

o mvc-config.xml

o security-config.xml

o security-core-config.xml

o validation-config.xml

En cada uno de estos ficheros se ha de modificar la versión de los esquemas de configuración. La versión debe de modificarse de la 3.0 existente a la 3.1. Como ejemplo mostramos la modificación realizada en el fichero app-config.xml.

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd">

<import resource="mvc-config.xml" /> <import resource="log-config.xml"/> <import resource="validation-config.xml"/> <import resource="security-core-config.xml"/> <import resource="security-config.xml"/> </beans>

En concreto hay que modificar las líneas

Migración v2.0.0 8/25

...

... http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ... http://www.springframework.org/schema/beans/spring-beans-3.0.xsd ... http://www.springframework.org/schema/context/spring-context-3.0.xsd ... http://www.springframework.org/schema/jee/spring-jee-3.0.xsd ... http://www.springframework.org/schema/tx/spring-tx-3.0.xsd ... http://www.springframework.org/schema/task/spring-task-3.0.xsd" ... ...

Por las siguientes:

...

... http://www.springframework.org/schema/aop/spring-aop-3.1.xsd ... http://www.springframework.org/schema/beans/spring-beans-3.1.xsd ... http://www.springframework.org/schema/context/spring-context-3.1.xsd ... http://www.springframework.org/schema/jee/spring-jee-3.1.xsd ... http://www.springframework.org/schema/tx/spring-tx-3.1.xsd ... http://www.springframework.org/schema/task/spring-task-3.1.xsd" ... ...

Migración v2.0.0 9/25

4 Configuración idiomática

El capítulo que nos ocupa pretende recopilar los cambios a realizar en una aplicación para utilizar la nueva gestión de idioma implementada en esta versión. Se puede ver más en detalle como se ha implementado esta gestión en el anexo Gestión idiomática .

A continuación se detalla proyecto a proyecto los cambios necesarios (en el siguiente capítulo se detallará las mejoras aportadas con dichos cambios):

� <xxxConfig>

o xxx.properties : Contiene variables para la gestión del idioma y del layout que ya no se utilizan ya que se declaran a nivel de War en su mvc-config.xml, por lo que podrían eliminarse.

x21aPilotoPatronesWar.default.language=es x21aPilotoPatronesWar.default.layout=horizontal

� <xxxEAR>

o Sustituir la librería de x38 por la nueva versión x38ShLibClasses-2.0.0.jar

� <xxxEARClasses>

o Modificar el fichero service-config.xml el bean appMessageSource añadiendo las líneas destacadas.

<bean id="appMessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="basename" value="x21a.i18n" /> <property name="defaultEncoding" value="UTF-8" /> <<<<propertypropertypropertyproperty namenamenamename===="useCodeAsD"useCodeAsD"useCodeAsD"useCodeAsDefaultMessage"efaultMessage"efaultMessage"efaultMessage" valuevaluevaluevalue===="true""true""true""true" />/>/>/> <<<<propertypropertypropertyproperty namenamenamename===="fallbackToSystemLocale""fallbackToSystemLocale""fallbackToSystemLocale""fallbackToSystemLocale" valuevaluevaluevalue===="false""false""false""false" />/>/>/> </bean>

� <xxxNombreWAR>

o Modificar el fichero mvc-config.xml el bean messageSource añadiendo las líneas destacadas.

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <property name="parentMessageSource" ref="appMessageSource" /> <property name="basename" value="/WEB-INF/resources/x21aMantenimientos.i18n" /> <property name="defaultEncoding" value="UTF-8" /> <<<<propertypropertypropertyproperty namenamenamename===="useCodeAsDefaultMessage""useCodeAsDefaultMessage""useCodeAsDefaultMessage""useCodeAsDefaultMessage" valuevaluevaluevalue===="true""true""true""true" />/>/>/> <<<<propertypropertypropertyproperty namenamenamename===="fallbackToSystemLocale""fallbackToSystemLocale""fallbackToSystemLocale""fallbackToSystemLocale" valuevaluevaluevalue===="false""false""false""false" />/>/>/> </bean>

Migración v2.0.0 10/25

o Modificar el fichero mvc-config.xml para sustituir el antiguo interceptor por el nuevo. Teniendo en cuenta que ahora las propiedades del fichero xxx.properties para la gestión de idioma por defecto y layout se configuran mediante propiedades del interceptor.

[Viejo]

<!-- Configures Handler Interceptors --> <mvc:interceptors> <!-- Changes the locale when a 'locale' request parameter is sent;e.g./?locale=en --> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" /> </mvc:interceptors> <!-- Saves a locale change using a cookie --> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> <property name="cookieName"> <value>language</value> </property> </bean>

[Nuevo] <mvc:interceptors> <ref bean="mvcInterceptor"/> </mvc:interceptors> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> <property name="cookieName" value="language" /> </bean> <bean id="mvcInterceptor" class="com.ejie.x38.control.MvcInterceptor"> <property name="defaultLanguage" value="es" /> <property name="defaultLayout" value="horizontal" /> <property name="availableLangs" value="es,eu,en,fr" /> </bean>

o Modificar el fichero mvc-config.xml para añadir las nuevas clases de resolución de vista incluídas en x38.

[Viejo] <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" /> </bean>

Migración v2.0.0 11/25

[Nuevo] <bean id="viewResolver" class="com.ejie.x38.control.view.UdaViewResolver"> <property name="viewClass" value="com.ejie.x38.control.view.UdaTilesView"/> <property name="exposedContextBeanNames" > <list> <value>localeResolver</value> <value>mvcInterceptor</value> </list> </property> </bean>

o Modificar el fichero base-includes.jsp para cambiar las variables utilizadas en la

configuración del idioma para RUP:

[Viejo] <script type="text/javascript">

APP_RESOURCES = 'x21a', CTX_PATH = '<%= request.getContextPath()%>/', RUP = '${staticsUrl}/rup', STATICS = '${staticsUrl}', DEFAULT_LANGUAGE = DEFAULT_LANGUAGE = DEFAULT_LANGUAGE = DEFAULT_LANGUAGE = "${defaultLanguage}""${defaultLanguage}""${defaultLanguage}""${defaultLanguage}",,,, LAYOUT = "${defaultLayout}", WAR_NAME = "x21aPilotoPatrones", AVAILABLE_LANGS = AVAILABLE_LANGS = AVAILABLE_LANGS = AVAILABLE_LANGS = "es, eu, en, fr""es, eu, en, fr""es, eu, en, fr""es, eu, en, fr";;;;

</script>

[Nuevo]

<script type="text/javascript"> APP_RESOURCES = 'x21a', CTX_PATH = '<%= request.getContextPath()%>/', STATICS = '${staticsUrl}', RUP = '${staticsUrl}/rup', WAR_NAME = "x21aPilotoPatrones", //model//model//model//model LAYOUT = "${defaultLayout}", //mvc//mvc//mvc//mvc----config.xmlconfig.xmlconfig.xmlconfig.xml

AVAILABLE_LANGS = "$AVAILABLE_LANGS = "$AVAILABLE_LANGS = "$AVAILABLE_LANGS = "${mvcInterceptor.availableLangs}",{mvcInterceptor.availableLangs}",{mvcInterceptor.availableLangs}",{mvcInterceptor.availableLangs}", LOCALE_COOKIE_NAME = LOCALE_COOKIE_NAME = LOCALE_COOKIE_NAME = LOCALE_COOKIE_NAME = "${locale_cookieName}""${locale_cookieName}""${locale_cookieName}""${locale_cookieName}";;;; LOCALE_PARAM_NAME = LOCALE_PARAM_NAME = LOCALE_PARAM_NAME = LOCALE_PARAM_NAME = "${locale_paramName}""${locale_paramName}""${locale_paramName}""${locale_paramName}";;;;

</script>

� DEFAULT_LANGUAGE (deprecated): Ahora se carga desde el mvc-config.xml � LOCALE_COOKIE_NAME: Nombre de la cookie (definida en mvc-config.xml) � LOCALE_PARAM_NAME: Nombre del parámetro de cambio de idioma (definida en

mvc-config.xml)

Migración v2.0.0 12/25

� AVAILABLE_LANGS: Posibles lenguajes de la aplicación (definidos en mvc-config.xml)

� <xxxStatics>

o Modificar en el fichero _layoutLoader.js (existe uno por cada War) para cambiar la invocación del componente rup.language [en caso de que se utilice] utilizando la variable definida.

[Viejo] $("#x21aPilotoPatronesWar_language").rup_language({languages: ["es", "eu", "en", "fr"]});

[Nuevo] $("#x21aMantenimientosWar_language").rup_language({languages: $.rup.AVAILABLE_LANGS_ARRAY$.rup.AVAILABLE_LANGS_ARRAY$.rup.AVAILABLE_LANGS_ARRAY$.rup.AVAILABLE_LANGS_ARRAY});

Migración v2.0.0 13/25

5 Seguridad

La actualización a la versión v2.0.0 de UDA requiere de una serie de ajustes en el componente de seguridad. Las modificaciones son diferentes dependiendo si se está utilizando el Mock de seguridad o el provider de XLNets.

En cualquiera de los dos casos es necesario realizar una serie de ajustes en el fichero de configuración común security-core-config.xml . Este fichero se define a nivel de War por lo que estas modificaciones deberán realizarse tantas veces como módulos web disponga la aplicación.

Así pues, se deberá sustituir la definición del bean springSecurityFilterChain existente:

<bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy"> <security:filter-chain-map path-type="ant"> <security:filter-chain pattern="/error" filters="none"/> <security:filter-chain pattern="/accesRefused" filters="none"/> <security:filter-chain pattern="**" filters=" exceptionTranslationFilter, securityContextPersistenceFilter, logoutFilter, preAuthenticateProcessingFilter, filterSecurityInterceptor" /> <security:filter-chain pattern="/**" filters=" exceptionTranslationFilter, securityContextPersistenceFilter, logoutFilter, preAuthenticateProcessingFilter, filterSecurityInterceptor" /> </security:filter-chain-map> </bean>

La nueva configuración será la siguiente:

<bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy"> <security:filter-chain-map request-matcher="regex"> <security:filter-chain pattern="/mockLoginPage.*" filters="none"/> <security:filter-chain pattern="/mockLoginAjaxPage.*" filters="none"/> <security:filter-chain pattern="/error.*" filters="none"/> <security:filter-chain pattern="/accessDenied.*" filters="none"/> <security:filter-chain pattern="**" filters="

exceptionTranslationFilter, securityContextPersistenceFilter,

logoutFilter, preAuthenticateProcessingFilter, filterSecurityInterceptor" /> </security:filter-chain-map> </bean>

Migración v2.0.0 14/25

Del mismo modo, se deberá modificar la inicialización del bean myLogoutHandler eliminando la inicialización de la propiedad invalidateXlnetSession:

<property name="invalidateXlnetSession" value="false" />

Y añadiendo la nueva para la propiedad invalidateUserSession. La declaración final sería la siguiente:

<bean id="myLogoutHandler" class="com.ejie.x38.security.MyLogoutHandler"> <property name="perimetralSecurityWrapper" ref="perimetralSecurityWrapper" /> <property name="invalidateHttpSession" value="true" /> <property name="invalidateUserSession" value="true" /> </bean>

5.1 Seguridad mediante el uso del Mock

En aquellos desarrollos en los que se esté haciendo uso del mock para simular XLNets cuando la aplicación no está desplegada en Ejie, habrá que realizar las siguientes modificaciones en el fichero security-config.xml del War:

Se deberá modificar la configuración del perimetralSecurityWrapper.

[Configuración anterior] <bean id="perimetralSecurityWrapper" class="com.ejie.x38.security.PerimetralSecurityWrapperMockImpl"> <property name="principal" value="USER_UDA" /> <property name="roles">

<list> <value>UDA</value> </list>

</property> <property name="uidSession" value="1290789636844" /> </bean> [Configuración nueva] <bean id="perimetralSecurityWrapper" class="com.ejie.x38.security.PerimetralSecurityWrapperMockImpl"> <property name="principal">

<list> <map> <entry key="userName" value="USER_UDA"/>

<entry key="nif" value="12121212j"/> <entry key="policy" value="1"/> <entry key="position" value="01"/> <entry key="isCertificate" value="no"/> <entry key="roles"> <list>

Migración v2.0.0 15/25

<value>UDA</value> </list> </entry> </map> </list> </property> <property name="userChangeUrl"

value="http://desarrollo.jakina.ejiedes.net:7001/x21aMantenimientosWar/"/> </bean>

La nueva implementación permite especificar diferentes usuarios indicando para cada uno de ellos una configuración de seguridad diferente. Estos usuarios son definidos mediante una lista con la que realizará la inicialización de la propiedad principal. De este modo es posible disponer de una serie de usuarios entre los cuales se podrá seleccionar uno de ellos para hacer login al acceder a la aplicación.

De este modo para realizar la migración de la configuración de usuarios existente, se deberá de crear por cada usuario una entrada en la lista con la que se inicializa la propiedad principal.

<property name="principal"> <list> <!-- Usuario 1 --> <map> <entry key="userName" value="USER_1"/>

... <entry key="roles"> <list> <value>ROLE_1</value>

<value>XXX-IN-0001</value> ...

</list> </entry> </map> <!-- Usuario 2 -->

<map> <entry key="userName" value="USER_2"/>

... <entry key="roles"> <list> <value>ROLE_1</value>

<value>XXX-IN-0002</value> <value>XXX-IN-0003</value> ...

</list> </entry> </map> </list> </property>

Además de la incorporación de múltiples usuarios, el Mock ofrece la posibilidad de definir una url, la propiedad userChangeLog, que determina la URL a la que debe ir la aplicación si el usuario logado cambia sin previo

Migración v2.0.0 16/25

aviso. Esta nueva propiedad, simula el comportamiento que también tiene XLNets para evitar cambios de usuarios en mitad de una ejecución y evitar posibles inconsistencias de identidad (accesos anómalos).

Las siguientes modificaciones que se han de realizar son para incluir una página de login simulará el registro de usuarios en la aplicación.

Proyecto WEB:

• xxxYYYWar/WebContent/WEB-INF/layouts/templateLogin.jsp

• xxxYYYWar/WebContent/WEB-INF/layouts/includes/mockLoginPage.styles.inc

• xxxYYYWar/WebContent/WEB-INF/views/mockLogin/mockLoginAjaxPage.jsp

• xxxYYYWar/WebContent/WEB-INF/views/mockLogin/mockLoginPage.jsp

• xxxYYYWar/WebContent/WEB-INF/views/mockLogin/mockLoginPage-includes.jsp

Proyecto de estáticos:

• xxxYYYStatics/WebContent/<xxx>/scripts/<xxxYYY>/mockLoginPage.js

• xxxYYYStatics/WebContent/<xxx>/styles/mockLoginPage.css

Estos ficheros se pueden encontrar tanto en la aplicación de ejemplo como en el fichero adjunto disponibles en la web de UDA.

Una vez incorporados los nuevos ficheros a la aplicación, es necesario realizar las siguientes modificaciones.

En el fichero tiles.xml se deben añadir las entradas correspondientes a la template del mock y a la propia entrada de la página de login.

<definition name="templateLogintemplateLogintemplateLogintemplateLogin" template="/WEB-INF/layouts/templateLogin.jsp"> <put-attribute name="header" value="/WEB-INF/layouts/header.jsp"/> <put-attribute name="language" value="/WEB-INF/layouts/language.jsp"/> <put-attribute name="breadCrumb" value="/WEB-INF/layouts/breadCrumb.jsp" /> <put-attribute name="footer" value="/WEB-INF/layouts/footer.jsp"/> <put-attribute name="base-includes" value="/WEB-INF/layouts/base-includes.jsp"/> <put-attribute name="includes" value=""/> </definition>

<definition name="mockLoginPagemockLoginPagemockLoginPagemockLoginPage" extends="templateLogin"> <put-attribute name="content" value="/WEB-INF/views/mockLogin/mockLoginPage.jsp"/> <put-attribute name="includes" value="/WEB-INF/views/mockLogin/mockLoginPage-includes.jsp"/> </definition> <definition name="mockLoginAjaxPagemockLoginAjaxPagemockLoginAjaxPagemockLoginAjaxPage" template="/WEB-INF/views/mockLogin/mockLoginAjaxPage.jsp"/>

En el fichero mvc-config.xml se deben añadir los mapeos correspondientes para el login:

<mvc:view-controller path="/mockLoginPage" view-name="mockLoginAjaxPage" /> <mvc:view-controller path="/mockLoginAjaxPage" view-name="mockLoginAjaxPage" />

Migración v2.0.0 17/25

La página de login del mock hace uso de una serie de literales internacionalizados que se deben añadir en los ficheros de i18n de la aplicación. La lista de literales de los que hace uso es la siguiente:

...

app.title=Uda

mockLogin.selectUser=Elija un Usuario

mockLogin.selectedUser=Usuario seleccionado:

mockLogin.login_button=Iniciar Sesión

logOut.disconnect=Desconectar

...

5.2 Seguridad mediante el uso de XLNets

Para usar Xlnets como sistema de seguridad a partir de la versión v.2.0.0, hay que modificar la declaración del bean perimetralSecurityWrapper en el fichero de configuración de Spring security-config.xml .

[Viejo] <bean id="perimetralSecurityWrapper" class="com.ejie.x38.security.PerimetralSecurityWrapperN38Impl"> <property name="xlnetCachingPeriod" value="120" /> </bean> [Nuevo] <bean id="perimetralSecurityWrapper" class="com.ejie.x38.security.PerimetralSecurityWrapperN38Impl"> <property name="xlnetCachingPeriod" value="120" /> <property name="userChangeUrl" value="/x21aPilotoPatronesWar/" /> <property name="anonymousCredentials">

<map> <entry key="userProfiles" value="UDA" /> <!-- entry key="userProfiles" value="udaAnonymousProfile" /--> <entry key="position" value="udaAnonymousPosition" /> </map>

</property>

</bean>

Migración v2.0.0 18/25

6 Jackson JSON Processor

Al desarrollar la versión v2.0.0 se ha tratado de mantener el mayor grado de retrocompatibilidad con las implementaciones existentes en las aplicaciones que hacen uso del componente de Jackson. Los desarrollos que hacen uso de las funcionalidades del componente Jackson incluido en las versiones anteriores a la v2.0.0 de UDA son compatibles siempre y cuando no se hayan utilizado funcionalidades deprecadas en la nueva versión de Jackson. Sin embargo en la nueva versión de Jackson se han implementado una serie de nuevas funcionalidades que mejoran y potencian los procesos de serialización y deserialización. Del mismo modo, se facilita la configuración de ambos procesos permitiendo una mayor flexibilidad en su uso. Para que las aplicaciones puedan beneficiarse de estas mejoras es necesario realizar una serie de ajustes en la configuración de Jackson. Así pues, a pesar de que no es estrictamente necesaria la actualización para que la aplicación siga funcionando de manera correcta, si se recomienda llevarla a cabo para mejorar el proceso de desarrollo. Por supuesto esta decisión se deberá tomar de acuerdo a las necesidades puntuales y el grado de desarrollo de las aplicaciones. El proceso de actualización completo se puede encontrar en el anexo Configuración y uso de Jackson . De todos modos es necesario indicar que existe una característica de Jackson que ha variado su funcionamiento y que requiere de un ajuste en la implementación existent e. En versiones posteriores a Jackson 1.9, la anotación @JsonIgnore podía ser utilizada a nivel de método (ej. un método getter de una propiedad). A partir de la versión 1.9 es posible anotar un método pero se toma como una anotación de propiedad. Es decir si estamos anotando el método getter mediante @JsonIgnore, esta propiedad no solo se ignorará en el proceso de serialización sino que también será obviada al realizar la deserialización. Debido a esto es necesario modificar el código existente para utilizar la anotación @JsonProperty(“propiedad”) en el método que queremos que conserve su funcionalidad. Como ejemplo, en el siguiente código realizaremos las anotaciones correspondientes para que la clave de acceso de un alumno no sea procesada durante la serialización pero si en la deserialización. En el código existente solo existiría la anotación @JsonIgnore para evitar la serialización de la propiedad. Con la actualización a la nueva versión de Jackson, se deberá de añadir la anotación resaltada en el setter, @JsonProperty(“password”), para que se continúe realizando la deserialización. publicpublicpublicpublic classclassclassclass Alumno implementsimplementsimplementsimplements java.io.Serializable {

privateprivateprivateprivate BigDecimal id; privateprivateprivateprivate String nombre; privateprivateprivateprivate String apellido1; privateprivateprivateprivate String apellido2; privateprivateprivateprivate String password;

// Getters y setters de las propiedades @JsonIgnore

publicpublicpublicpublic String getPassword() { returnreturnreturnreturn thisthisthisthis.password; } @JsonProperty@JsonProperty@JsonProperty@JsonProperty(((("password""password""password""password")))) publicpublicpublicpublic voidvoidvoidvoid setPassword(String password) { thisthisthisthis.password = password;

} }

Migración v2.0.0 19/25

7 Envío de ficheros desde un mantenimiento

En actualización de las versiones de Spring y de las librerías jQuery se han introducido una serie de mejoras y modificaciones en sus funcionalidades. Estos cambios implican realizar una serie de ajustes en el proceso de subida de archivos pero conllevan una simplificación y optimización del mismo. Las mejoras logradas en el proceso son las siguientes:

• Se posibilita el envío de ficheros mediante peticiones PUT y POST, dependiendo del tipo de operación que sea (edición o inserción). En la anterior versión de Spring no se permitía el envío de ficheros mediante una petición de tipo multipart/form-data utilizando un método HTTP PUT.

• Se elimina la necesidad de utilizar las cabeceras que indican el tipo de operación que se está realizando en las peticiones del mantenimiento.

• Las peticiones en las que esté involucrado un campo file se realizan siempre del mismo modo, independientemente de si se haya seleccionado un fichero o no. Esto simplifica la gestión de peticiones en los controllers.

La característica principal que permite esta serie de mejoras es la posibilidad de realizar un envío de ficheros mediante PUT. Esto es debido a que en la versión 3.1.1 de Spring se han realizado modificaciones en la clase RequestParamMethodArgumentResolver que permiten que las peticiones multipart/form-data puedan ser realizadas mediante una petición PUT. Aun así, la clase CommonsMultipartResolver encargada de gestionar las peticiones multipart/form-data sigue limitando que estas peticiones deban ser realizadas mediante peticiones POST. Para evitar esto se ha creado una clase UdaMultipartResolver que extiende de la anterior sobrescribiendo el método de comprobación de una petición multipart válida. La modificación en la configuración de Spring se deberá realizar en el fichero mvc-config.xml definido a nivel de War, por lo que se deberá realizar esta modificación tantas veces como módulos web, en los que se realice subida de ficheros, disponga la aplicación. El cambio supone sustituir el uso del CommonsMultipartResolver por el nuevo UdaMultipartResolver: [Viejo] <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/> [Nuevo] <bean id="multipartResolver" class="com.ejie.x38.util.UdaMultipartResolver"/>

El siguiente paso será modificar en los controllers los métodos encargados de procesar las peticiones de envío de ficheros. NOTA: Solamente deberán modificarse los métodos inv olucrados en el proceso del envío de ficheros. En el envío de ficheros desde un formulario de deta lle de un mantenimiento se deberán modificar los métodos que procesan la inserción y modificación de un elemento. En el siguiente código se muestran resaltadas las modificaciones a realizar en las anotaciones de mapeo de peticiones de los métodos de los controllers. Con la nueva versión el método de edición de un elemento se

Migración v2.0.0 20/25

mapeará con peticiones que utilicen el método HTTP PUT. En ambos métodos se elimina el uso de la cabecera rup_maint_mode en la petición. [Viejo] @RequestMapping@RequestMapping@RequestMapping@RequestMapping((((method = RequestMethod.method = RequestMethod.method = RequestMethod.method = RequestMethod.POSTPOSTPOSTPOST, headers=, headers=, headers=, headers="rup_maint_mode=add""rup_maint_mode=add""rup_maint_mode=add""rup_maint_mode=add")))) publicpublicpublicpublic @ResponseBody PerfilUsuario add(

@ModelAttribute PerfilUsuario perfilUsuario, @RequestParam(value="imagen", required=false)MultipartFile imagen,

HttpServletResponse response) { // Implementación de la funcionalidad del método } @RequestMapping@RequestMapping@RequestMapping@RequestMapping(method = RequestMethod.(method = RequestMethod.(method = RequestMethod.(method = RequestMethod.POSTPOSTPOSTPOST, headers=, headers=, headers=, headers="rup_maint_mode=edit""rup_maint_mode=edit""rup_maint_mode=edit""rup_maint_mode=edit")))) publicpublicpublicpublic @ResponseBody PerfilUsuario edit(

@ModelAttribute PerfilUsuario perfilUsuario, @RequestParam(value="imagen", required=false)MultipartFile imagen,

HttpServletResponse response) { // Implementación de la funcionalidad del método }

[Nuevo] @RequestMapping@RequestMapping@RequestMapping@RequestMapping(method = RequestMethod.(method = RequestMethod.(method = RequestMethod.(method = RequestMethod.POSTPOSTPOSTPOST)))) publicpublicpublicpublic @ResponseBody PerfilUsuario add(

@ModelAttribute PerfilUsuario perfilUsuario, @RequestParam(value="imagen", required=false)MultipartFile imagen,

HttpServletResponse response) { // Implementación de la funcionalidad del método } @RequestMapping@RequestMapping@RequestMapping@RequestMapping(method = RequestMethod.(method = RequestMethod.(method = RequestMethod.(method = RequestMethod.PPPPUTUTUTUT)))) publicpublicpublicpublic @ResponseBody PerfilUsuario edit(

@ModelAttribute PerfilUsuario perfilUsuario, @RequestParam(value="imagen", required=false)MultipartFile imagen,

HttpServletResponse response) { // Implementación de la funcionalidad del método }

Migración v2.0.0 21/25

8 Validaciones

La nueva versión v2.0.0 de UDA conlleva una profunda remodelación en el sistema de validaciones. Mediante el nuevo sistema se ha buscado reducir el impacto de implementaciones propias en la gestión de validaciones y tratar de dar una solución basada en la especificación JSR-303 para validaciones de beans.

Se ha desarrollado también un sistema de validaciones en cliente para tratar de maximizar el rendimiento de las aplicaciones en este aspecto. Para ello se ha tratado de simplificar y optimizar la comunicación del resultado de los procesos de validación entre las partes servidor y cliente.

Debido a estos cambios se deben realizar una serie de ajustes para poder beneficiarse de las funcionalidades y mejoras del nuevo sistema de validaciones. Estas modificaciones se detallan en el anexo Gestión de validaciones .

De todos modos y buscando no perjudicar a las implementaciones existentes, se ha mantenido una retrocompatibilidad completa con el sistema de validaciones existente, por lo que en caso de no ser necesario el uso de las nuevas funcionalidades no es obligatorio acometer las actualización a la nueva versión.

Migración v2.0.0 22/25

9 Excepciones

La nueva versión v2.0.0 de UDA presenta una nueva gestión de excepciones.

Las aplicaciones desarrolladas con versiones anteriores UDA contaban con una serie de excepciones por defecto dentro de la librería x38. Mediante el uso de estas clases se conseguía una gestión homogénea en todas las aplicaciones, pero era labor del desarrollador la gestión de cada excepción de la aplicación.

A partir de la versión v.2.0.0 la gestión independiza el código de las clases (ya sean controllers, services o daos) de las excepciones ya que éstas se gestionan a través de una clase externa denominada handler (en caso de necesidad también se podría realizar la gestión en el propio controller). La generación de código mediante el plugin UDA aporta un handler genérico que realiza la gestión por defecto de las excepciones pero será labor del desarrollador decidir si quiere realizar una gestión particular de cierto tipo de excepciones.

El uso de este nuevo sistema de excepciones necesita de una serie de modificaciones para migrar a la nueva gestión. El proceso de migración se detalla en el anexo Gestión de excepciones .

De todos modos y buscando no perjudicar a las implementaciones existentes, se ha mantenido una retrocompatibilidad completa con el sistema de excepciones existente, por lo que en caso de no ser necesario el uso de las nuevas funcionalidades no es obligatorio acometer las actualización a la nueva versión.