domingo, 11 de diciembre de 2011

SSXA: Obteniendo SiteContext y conexión RIDC en un Servlet

Durante el desarrollo de sitios web con SSXA (Site Studio for eXternal Applications) nos habremos encontrado en numerosas ocasiones con los siguientes problemas:
  • ¿Cómo obtengo el SiteContext del sitio web para poder generar, por ejemplo, enlaces a secciones en un Servlet?.
  • ¿Cómo puedo conseguir la conexión RIDC que está siendo utilizada por el proyecto de Site Studio en un Servlet?. Obtener de manera "limpia" esta conexión nos asegura que cada vez que cambiemos la conexión a Site Studio del proyecto, no hay que realizar ningún cambio manual en código.
Para ello haremos uso de API proporcionado por el core de las librerías de SiteStudio.

Obtener el SiteContext en un Servlet.
Obtención del SiteContext en un Servlet
Obtener el cliente IDC para realizar consultas mediante API RIDC.

Los pasos a seguir son los siguientes:
  • Obtener una IdcClientFactory.
    Obtención de la factoría
  • A partir de la factoría, obtener el cliente y el contexto. También podemos generar un contexto a mano si queremos que las consultas sean realizadas por un usuario fijo.
Uso del IdcClientFactory.
Referencias: Blog de David.

Descarga: Java del ejemplo.

Un saludo a todos.

viernes, 11 de noviembre de 2011

Integrando WebCenter Spaces en WebCenter Portal

Cuando se desarrolla un portal con WebCenter Portal Framework es posible integrar la funcionalidad de WebCenter Spaces en el mismo.

Enlace a la entrada tutorial de como configurarlo


¿Cómo integrar WebCenter Spaces API?

WebCenter Spaces ofrece un Web Service que expone toda la funcionalidad con respecto a:
  • Creación y gestión de grupos de espacios y plantillas.
  • Gestión de usuarios y los espacios a los que pertenecen.
  • Obtener información acerca de los espacios y plantillas de los mismos.
Los pasos a seguir para la obtención del Data Control que nos permitirá el uso de manera fácil y transparente la funcionalidad ofrecida por el WebCenter Spaces API Client son los siguientes:
  • Primero se debe comprobar que hay acceso al WSDL de WebCenter Spaces atacando a la siguiente URL. http://host:[spacesport]/webcenter/SpacesWebService?WSDL
    XML que define el WSDL de Spaces


    WSDL de Spaces para probarlo 
  • Adherir la tecnología Web Service al proyecto de WebCenter (o aplicación ADF). Para ello hacer click derecho en el proyecto y navegar hasta Project Properties > Technology Scope y añadir la tecnlogía Web Services que permitirá la creación de Data Controls a partir de WSDL's.

    Tecnología Web Service
  • Haciendo click derecho en el proyecto de WebCenter o aplicación ADF y haciendo click en New podremos ver que ahora permite crear Data Control a partir de WebServices. Seleccionar Web Service Data Control para iniciar el wizard que nos ayudará a configurar el Data Control a partir del WSDL.
    Creación de Web Service Data Control
  • En el primer paso del Wizard configurar la URL de conexión al WSDL y el nombre lógico que se quiere dar al Data Control.

    Registro de la dirección del WSDL para obtención de Data Control
  • Seleccionar las operaciones del WSDL que se requieran para el Data Control.

    Operaciones del WSDL que se desean en el Data Control
  • Con respecto al paso de Endpoint Authentication hay que tener en cuenta que la conexión entre la aplicación y WebCenter Spaces debe ser segura. Para ello es necesario seguir la configuración de la documentación. http://docs.oracle.com/cd/E15523_01/webcenter.1111/e10148/jpsdg_spaces.htm#CIHEIHIH
    http://docs.oracle.com/cd/E14571_01/webcenter.1111/e12405/wcadm_security_wss.htm#BGBFIIGE
  • Finalmente se generará un Data Control que permitirá mediante Drag & Drop sobre las páginas de la aplicación la creación de formularios e interfaces de manejo de WebCenter Spaces API.

    WebCenter Spaces API Data Control del WSDL
Por último comentar algunas ventajas e inconvenientes de esta solución:
  • Requiere la aplicación de WebCenter Spaces corriendo y consumiendo recursos del entorno.
  • Si existen Task Flows que deben ser compartidos o pueden ser usados en WebCenter Portal y Spaces deberían desplegarse como Shared-library para que el mantenimiento de los mismos sea más eficiente.
  • La parte de Autenticación que dejo indicada hacia la documentación oficial puede ser la más tediosa. Consiste en generar un keystore productor registrado en el dominio de WebCenter Spaces y un consumidor con el mapeo correspondiente para el dominio de nuestra aplicación. Siguiendo los pasos de la documentación oficial es trivial establecer los valores del WS-Security necesarios para la conexión segura.
  • Recomiendo que WebCenter Portal y WebCenter Spaces tengan un mecanismo de SSO o compartan LDAP.
  • Existen otras opciones como REST API (en la documentación oficial) ó generar las clases Java automáticas a partir del Web Service en vez de usar el Data Control.
Referencias:

lunes, 7 de noviembre de 2011

Extendiendo Oracle Composer

Oracle Composer es un mecanismo de personalización y configuración en tiempo real de los distintos componentes ADF de nuestra aplicación o portal.

En la entrada os traigo cómo añadir nuevos paneles a la barra de herramientas de Oracle Composer. Además, también os comento cómo extender el panel de propiedades asociado a componentes y manejar los eventos de Oracle Composer.

Oracle Composer con un Panel propio adherido a la barra de herramientas
Para añadir nuevos paneles hay que seguir los siguientes pasos:

  • Crear un Task Flow que será el responsable de realizar las operaciones pertinentes de nuestro nuevo panel.
    Task Flow de cambio de Logo
  • Crear el archivo de configuración de extensiones de Oracle Composer, pe_ext.xml, en la carpeta META-INF de nuestro proyecto (este archivo no se crea por defecto con WebCenter ni ADF Applications).
    Archivo pe_ext.xml con un panel nuevo
  • El archivo pe_ext.xml contiene los siguientes elementos:
    • <panels><panel></panel>...</panel>: Contiene la definición de los nuevos paneles así como su "mapeo" a los Task Flow que ejecuta.(Incluido en el ejemplo decargable).
      Nuevo panel a la barra de herramientas

    • <property-panels><property-panel></property-panel>...</property-panels>: Oracle Composer permite añadir/eliminar propiedades que trae consigo los componentes y Task Flow ADF al editarlos con Oracle Composer. Para ser más especifico, cuando se edita una página con Oracle Composer, cada componente que forma parte de ella posee un icono, normalmente "llave inglesa" que da acceso a la configuración de sus propiedades. En estas propiedades se pueden configurar tanto estilos, como parámetros de entrada del mismo. Extendiendo Oracle Composer se puede eliminar o limitar ciertas propiedades de los componentes o Task Flow que queramos a la vez que también se puede añadir nuevas pestañas a la ventana de configuración con configuraciones Custom. (No incluido en el ejemplo decargable).
      Propiedades del componente "Recuadro"/Box
    • <event-handlers>...</event-handlers>: Los manejadores de eventos sirven para sobrescribir los eventos disparados por Oracle Composer. Se puede introducir código propio tanto en eventos de salvado, cancelación e incluso cerrado de Oracle Composer.
  • En el archivo de configuración, adf-config.xml debe añadirse la configuración referente a <pe:page-editor-config> para registrar los paneles que deben mostrarse en Oracle Composer. Notar que por defecto el atributo show-default-addons de <addon-panels> está a false por lo que si no lo establecemos a true tendrá que definirse manualmente cada panel de Composer (incluidos los denominados "por defecto").
    adf-config sin declarar show-default-addons
    adf-config con los default-addons por defecto
Por último comentar que hay ciertos paneles de Oracle Composer que no están habilitados por defecto:
  • Customization Manager: Es un panel que permite la gestión de la personalización de la página (datos del repositorio MDS) en caliente sin tener que importar/exportar con comandos WSLT.
    Enlace a la documentación

    <addon-panel name="oracle.adf.pageeditor.addonpanels.customization-manager" rendered="#{securityContext.userInAppRole['Administrator']}"/>
  • Resource String Editor. Sirve para contribuir literales en caliente. Lo realiza en el Bundle registrado de Composer. Enlace a la documentación.
Os dejo un ejemplo a descargar que contiene lo siguiente:
  • Una aplicación ADF exportable a ADF JAR library en caso de querer usarla en una aplicación de WebCenter Portal.
  • La aplicación ADF contiene un Task Flow para cambiar, a través de Oracle Composer, el Logo de una imagen de la página en función a unos valores establecidos en Managed Beans que gestiona. la URL de la imagen puede ser relativa o absoluta.
  • Recomiendo observar los ficheros pe_ext.xml, adf-config.xml y la página home.jspx para observar la lógica que sigue la extensión de Oracle Composer. Además, la clase Java SaveHandler que gestiona el evento de guardado de Composer.
Desarrollado en: JDeveloper 11.1.1.4

Referencia a la documentación oficial: Extending Runtime Capabilities Using Oracle Composer.

viernes, 28 de octubre de 2011

Oracle WebCenter Portal PS3: Bug al ejecutar Task Flows con inline-popups

Uno de los Bug más curiosos que me encontré al aterrizar en la versión PS3 de Oracle WebCenter fue el siguiente:

Al ejecutar Custom ADF Task Flows que a su vez ejecutan otros Task Flows en forma de Dialog/inline-popup en una aplicación de Oracle WebCenter Portal. Me encontré que los popups, en Firefox/Chrome, renderizaban la misma página del Portal en la que se encontraba el Task Flow invococador en lugar del Task Flow al que invocaba. Curiosamente este "Bug" no ocurría en Internet Explorer.

Enlace de descarga

Aquí os presento un sencillo ejemplo que presenta el curioso Bug y una solución de contingencia al mismo hasta que encuentre una solución limpia a ello.
  • En primer lugar crear una Fusion Middleware Application (ADF) del cual generar una ADF JAR Library con los Custom ADF Task Flows que se van a ejecutar en la aplicación de WebCenter.
  • Básicamente generar 2 ADF Bounded Task Flows:
    • Uno basado en page-fragments (jsff), que actuará como el llamador.
    • Uno basado en pages (jspx) que será el Task Flow que se renderizará en el popup.
Task Flow llama a otro en forma de Diálogo / inline-popup
  • El ADF Task Flow basado en fragmentos llamará al otro como Run-as-Dialog / inline-popup.
    Propiedades de la llamada al Task Flow en diálogo
  • Crear una aplicación de WebCenter Portal e incluir nuestro Task Flow al catálgo de la misma. (Podeis hacerlo como comenté en un Post Anterior de cómo incluir Task Flows en aplicacines de WebCenter Portal).
  • Ejecutar la aplicación de WebCenter Portal. Incluir mediante Oracle Composer el Task Flow invocador del diálogo y ejecutar el mismo.
    Se puede observar que en Firefox/Chrome no renderiza el Task Flow que en Internet Explorer si.

    Ejecución en Firefox

    Ejecución en IE 8
  • El Task Flow invocador ha sido añadido una página del Navigation-Model que es renderizada en la Template asignada (y no realiza redirección).
    Configuración página Home como Render URL in Page Template
    En este caso, en Firefox y Chrome siempre se renderiza la misma página en lugar que el Task Flow que debería invocar, además de obtener una excepción a la hora de cerrar el diálogo.
  • Como solución de contingencia, si el Task Flow es añadido en una página que tiene configurado, en el Navigation-Model, que en lugar de renderizar la URL en la Page Template realizará una redirección a esa URL.
    Configuración de la página Redirect como Redirect to URL
  • Al ejecutar el Task Flow invocador en esta página en cualquier navegador, el popup renderizará el Task Flow en lugar de la misma página del Portal.

    Ejecución en Firefox
Conclusión: Como solución de contingencia hasta que sepa realmente porque ocurre este Bug recomiendo que la página que contenga un ADF Task Flow con este tipo de configuración, cambie su configuración del Navigation-Model para que realice una redirección a la URL.

Pruebas: Realmente no lo he probado, pero si en vez de usar la configuración por defecto para ejecutar un Task-Flow como diálogo/inline-popup realizamos esta funcionalidad manualmente con <af:dialog> y <af:popup>, creo que funcionará perfectamente. (Incluso también mediante API de RichFaces invocar a un Popup).

Referencias: Entrada de OTN al respecto de este Bug.

Ejemplo desarrollado en JDeveloper 11.1.1.4 con la extensión de Oracle WebCenter.

Descarga: Ejemplo descargable.

Un saludo a todos.

jueves, 27 de octubre de 2011

Oracle WebCenter Content (UCM): Propagación de metadatos de las carpetas


La propagación de Metadata de las carpetas a los contenidos almacenados en la misma se realiza mediante la siguiente configuración.
  • Primer se debe seleccionar en la configuración del componente Folders_g de Oracle WebCenter Content (UCM) los metadatos que van a ser propagados.

    Configuración de qué metadatos propagar
  • En las carpetas que queremos que propaguen metadatos, debemos indicarles en el metadato Inhibit Propagation que lo haga estableciéndolo al valor “False”.
    Metadato que indica la propagación
  • Al realizar Check-in de nuevos contenidos en la carpeta desde UCM, los metadatos propagados estarán auto-rellenados.
Sin embargo, cuando realizamos una carga masiva de contenidos desde BatchLoader en una carpeta determinada, no se rellenan automáticamente los metadatos propagados desde la carpeta.
Por ello es necesario ejecutar la función Propagate desde la sección info de la carpeta.
Función de propagación de metadatos en la info de una carpeta
Un saludo a todos

martes, 25 de octubre de 2011

Procesamiento de XML y uso de XSLT en aplicaciones de SiteStudio o WebCenter

Una de los problemas más comunes a la hora de utilizar XSTL (JSTL para XML), o transformaciones XSL (x:transform por ejemplo) en nuestras aplicaciones de Oracle WebCenter o SiteStudio XA (SSXA) suele residir en el SAX Parser registrado tanto en WebLogic, como en nuestra aplicación.

El error más usual es el siguiente:

XML-22108: (Error) Invalid Source - URL format is incorrect. XML-22000: (Fatal Error) Error while parsing XSL file (weblogic.xml.jaxp.RegistryXMLReader cannot be cast to oracle.xml.parser.v2.SAXParser).

¿Qué significa este error?. 

Que WebLogic por su lado esta utilizando y tiene registrado los "Factory" de la librería xerces.jar y por nuestro lado tenemos en nuestro Classpath de la aplicación la librería de Oracle XML Parser v2. 

¿Cómo se soluciona este error?.

Las posibles soluciones a este error tienen 2 vertientes principalmente:

  • Registrar en WebLogic el Parser Oracle XML Parser v2 e incluirlo en su classpath. (Solución 1).
  • Directamente en el archivo weblogic-application.xml  de nuestra aplicación registrar el "parser" que tiene registrado actualmente WebLogic. (Solución 2).
En el siguiente ejemplo muestro unas imágenes acerca de la Solución 2:
  • En la consola de Administración, en la home de la misma podemos registrar un nuevo "parser". Al intentar generar uno nuevo, vendrá por defecto relleno con los siguientes valores.

    Configuración de Parser por defecto de WebLogic basado en Xerces
  • Copiar estos valores en el archivo de configuración weblogic-application.xml de nuestra aplicación.
    Archivo weblogic-application.xml de una aplicación J2EE con JDeveloper
Al desplegar de nuevo la aplicación podremos observar que se habrá solventado el quebradero de cabeza que suele dar este error :).

Espero haber ayudado un poco :).

Un saludo a todos.

Agradecimientos a Daniel Pascual por su aportación en esta entrada.

PD: Pronto más WebCenter y ADF.



lunes, 24 de octubre de 2011

Site Studio (SSXA): Cache de consultas RIDC

Una de las novedades de Site Studio for eXternal Applications (SSXA) es la posibilidad de "cachear" los resultados procedentes de consultas RIDC.

Por ello únicamente es necesario añadir, en las consultas "cacheables", los siguientes parámetros:

  • __ssxaCacheEnabled: Flag que establece si vamos a cachear la consulta. Para ello establecerlo a true.
  • __ssxaCacheKey: Para el caso en el que se quiera especificar la clave de caché a utilizar.
  • __ssxaCacheFields: Campos que se van a usar para "cachear" el contenido. Si no se especifica utilizará toda la información local.
  • __ssxaCacheTTL: Es el tiempo de vida del contenido en caché medido en milisegundos. Por defecto, si no se especifica valor es de 5 minutos.
Un ejemplo de uso:

Ejemplo de servicio RIDC cacheado

En el caso de querer administrar/monitorizar la caché manualmente. Se puede acceder a su administración desde la consola del Content Server de Oracle WebCenter Content (UCM):
  • Navegar hasta Administration > Site Studio Administration > External Applications Administration.
    Administración de SSXA Caché
Por último comentar que el contenido cacheado queda almacenado en archivos de formato .hda en una estructura de carpetas con la siguiente nomenclatura:

/idc-service/service_name/user_name/cacheID.hda

Donde:
  • service_name: Es el nombre del servicio RIDC ejecutado. Por ejemplo: get_search_results.
  • user_name: Nombre del usuario que ejecutó el servicio RIDC.
  • cacheID: Compuesto por el __ssxaCacheKey y __ssxaCacheFields en el caso de haber sido proporcionados.
Un saludos a todos.

Referencia: Documentación oficial de Oracle para SSXA.

PD: Espero tener el ejemplo de integración WebCenter Spaces API - WebCenter Portal pronto :).

lunes, 3 de octubre de 2011

Rendimiento en aplicaciones de WebCenter (Performance)

Hola.

Aquí os traigo un breve bloque de referencias sobre como mejorar el rendimiento de nuestros portales de WebCenter.

Por un lado, en el capítulo 22 de la documentación oficial de Oracle encontramos diferentes formas de mejorar el rendimiento de nuestra aplicación. En ella podemos encontrar varios tipos de configuraciones que podemos realizar tanto a nivel de aplicación como de configuración externa:

  • Configuración del DataSource de WebCenterDS recomienda que se incrementen los "pooles" iniciales de conexión al igual qué parámetros que por defecto vienen en un valor bastante bajo.
  • Configuraciones de la JVM y WebLogic como pueden ser el aumento de la memoria asignada a la JVM ó la configuración del garbage collector
  • Configuración de la duración de la sesión y del tiempo de expiración de las JSP de nuestra aplicación de WebCenter para la liberación de memoria de aquellos recursos que son usados con menor frecuencia.
  • "Setting ADF Client State Token". Es el número de páginas que el usuario puede guardar en la pila en caso de dar al botón Back del navegador. Contra más páginas se guarden mayor rendimiento. Sin embargo, esto tiene una penalización de uso de CPU y memoria. Hay que encontrar una cifra de equilibrio.
  • También hace referencia para aumentar la capacidad de almacenamiento de la caché del MDS.
  • Y por último hace referencia a cómo mejorar el rendimiento de servicios proporcionados por el framework de WebCenter.
Por otro lado también podemos mejorar el rendimiento de nuestras aplicaciones de WebCenter almacenando en caché recursos estáticos internos a nuestra aplicación de WebCenter que no se encuentren en un frontal (Servidor Web). Para ello es necesario la modificación del archivo adf-config.xml como se indica en la siguiente página de cómo mejorar el rendimiento en aplicaciones ADF.

Por último comentar (gracias a Luis Villa por este reporte) un pequeño detalle a la hora de integrar nuestras aplicaciones de WebCenter con UCM para la visualización de contenidos.
Si existe el caso en el que es necesario aplicar una política de seguridad tan estricta como que se llegue al punto de que puede haber un grupo de seguridad por cada documento o contenido. UCM genera Queries  mediante operadores OR para verificar si el documento es accesible por un usuario o no.
¿Qué significa? Las Queries a base de datos con operadores OR son muy lentas por lo que cada consulta penalizará seriamente el rendimiento del Portal.

También existen ciertos trucos para aumentar el rendimiento de ADF en caso de usar Business Components u otras partes de ADF. En el Blog de Andrejus Baranovskis's encontraréis muchos trucos para incrementar el rendimiento de vuestras aplicaciones ADF / WebCenter.

Un saludo a todos :).

domingo, 2 de octubre de 2011

Integración WebCenter - UCM (PS3): Obtener conexión RIDC mediante Java (II)

Hola.

Respecto al a entrada: Integración WebCenter - UCM (PS3): Obtener conexión RIDC mediante Java añadir que existe una librería para el acceso al nombre de la conexión primaria RIDC configurada en nuestra aplicación de WebCenter:

String connectionName = DocLibADFConfigUtils.getPrimaryConnectionName();

Con ella podremos acceder al nombre configurado de la conexión UCM de forma transparente.

Un saludo.

martes, 27 de septiembre de 2011

UCM: Filtrar metadatos del formulario de Check-in de una Carpeta

Hola.

Hoy os traigo una entrada relacionada con WebCenter Content (Oracle UCM).

En esta ocasión indicaré los pasos para poder filtrar los metadatos que son mostrados al usuario en el caso de que cree una carpeta en nuestro repositorio de contenidos.

Los pasos a seguir son los siguientes:
  • Acceder a Administration > Admin Applets > Configuration Manager que es donde se establecen los metadatos, perfiles, reglas etc... que usa Oracle UCM.

    Configuration Manager
  • Navegar a la pestaña Rules y darle a Add para añadir una nueva regla. Rellenando los siguientes campos:

    Regla configurada
    • Name: Nombre de la regla
    • Descripción: Es de buena costumbre especificar de qué se trata la regla :).
    • Seleccionar la opción Is global rule with priority para indicar que es una regla global.
    • Activar la opción Use rule activation condition para indicar en qué caso se desea que la carpeta no muestre los metadatos en los formularios de Check-in.
    • Añadir dando a Edit la siguiente regla de activación:

      • En la pestaña Conditions añadir una nueva regla (Add).

        Creación de una condición
      • En la pestaña Clauses seleccionar la siguiente expresión: Folders equals 0 y añadirla para que genere la expresión.

        Clausula para verificar que es una carpeta
    • En el caso de querer que sólo se aplique a una carpeta concreta. Podemos seleccionar el xCollectionId de la carpeta como Value.
    • En la pestaña Fields añadir aquellos metadatos que deseamos que sean de tipo hidden y, por lo tanto, no serán mostrados en los formularios de Check-in.

      Campos que no se desean en el formulario de Check-in
  • Como podremos comprobar. Los metadatos propios de Idioma y Orden desaparecen a la hora de realizar Check-in de una carpeta.

    Antes de aplicar la regla recién creada

    Después de aplicar la regla recién creada
Ejemplo desarrollado en WebCenter Content 11g (Oracle UCM 11g).

Agradecimientos a: Luis Villa y Fransico Javier Ruiz por su aportación.


Un saludo a todos :).

martes, 20 de septiembre de 2011

Integración WebCenter - UCM (PS3): Obtener conexión RIDC mediante Java

Hola a todos.

Algo que no he encontrado documentado por la red (por lo que puede que cambie en futuras versiones) es cómo conseguir mediante API de WebCenter la conexión RIDC a nuestro servidor de contenidos UCM.

Por ello, indagando cómo WebCenter Spaces atacaba a los servidores de contenido configurados en la EnterpriseManager o cómo atacar a los propios configurados en JDeveloper me encontré con la siguiente clase:

oracle.webcenter.content.stellent.StellentUtils;

Gracias a esta clase podemos obtener la conexión UCM por el nombre configurado desde la EnterpriseManager o en nuestro JDeveloper mediante la llamada:

StellentUtils.getIdcClient("NOMBRE_CONEXION");

Aquí os dejo un pequeño fragmento de lo que sería un método que devolviese una conexión RIDC a nuestro servidor de contenidos:

Acceso RIDC mediante StellentUtils
Por otro lado siempre tenemos la opción de usar el API JCR para acceder a nuestra conexión y a partir de ahí obtener un cliente de acceso RIDC. Nos apoyaremos en la clase ADFConnectionsManager para obtener el repositorio configurado en nuestro contexto ADF.

Conexión RIDC mediante JCR


Por último comentar que podemos obviar las opciones configuradas y atacar directamente al servidor de aplicaciones mediante RIDC estableciendo la conexión con el API directamente.

Conexión directa RIDC mediante API
Existen más maneras de conseguir las conexiones configuradas en nuestro portal de WebCenter dado que estas conexiones son registradas en un archivo connections.xml y pueden ser accedidas mediante JNDI.

Referencias:

Un saludo a todos :).

domingo, 18 de septiembre de 2011

ADF BC: Valor procedente de una Secuencia

Hola.

Hoy os traigo tres formas distintas de establecer el valor de un atributo de una Entity Object al valor de una secuencia de base de datos.

Cambiando el tipo de dato del atributo a DBSequence.

Esta solución consiste en cambiar el tipo de dato del atributo de nuestra Entity Object a DBSequence.
Al realizar este cambio podemos observar en la parte inferior de la pantalla de propiedades se ha habilitado la posibilidad de configurar el nombre de la secuencia de base de datos que deseamos utilizar para dicho atributo.

Atributo de entidad con Type: DBSequence
No genera el valor final de la secuencia hasta que se realiza commit. Por ello si se contribuyen tablas asociadas a la del valor autogenerado pueden encontrarse valores negativos temporales hasta que se realice el commit de los datos.

Programáticamente en la creación de la fila

Esta solución consiste en sobrescribir el método create de una fila y forzar la llamada a la secuencia de base de datos para establecer el valor del campo deseado.
Para ello se debe generar la clase Java que representa la entidad incluyendo el Create Method.

Generación de la clase Java que define la Entidad
Y seguidamente incluir en el código del método create la llamada a la secuencia de base de datos deseada y asignarle el valor al campo correspondiente de la entidad.

Método create de la Entity

Finalmente es necesario actualizar el atributo de la entidad para que refresque después de la inserción.

Refresco después de inserción
Esta opción genera un valor siempre que se comience una operación de inserción en base de datos por lo que si se cancela la operación de inserción, ese valor será un valor perdido puesto que en la próxima inserción se generará el siguiente valor.

Mediante una Groovy Expression

Para esta solución hay que generar primero la clase que define la Entidad (como hicimos en la solución anterior). Y crear un método que obtiene el valor de la secuencia.

Método que genera el valor de la DBSequence

Seguidamente editar las propiedades del atributo de la entidad para que obtenga su valor procedente de dicho método mediante una Groovy Expression.

Groovy expression que invoca a la DBSequence
Personalmente nunca he usado esta opción.

Ejemplo desarrollado en JDeveloper 11.1.1.4.

Un saludo :).

miércoles, 31 de agosto de 2011

Custom Skin ADF: Modificación de los estilos y traducción de literales

Hola a todos :).

Hoy os traigo un ejemplo de cómo realizar nuestra Custom Skin a nuestros componentes ADF.

El Custom Skin engloba 2 puntos fundamentalmente:

  • La sobre-escritura de estilos de los componentes ADF.
  • La modificación/traducción de los literales por defecto que vienen en los componentes ADF.
En el siguiente ejemplo vamos a crear una aplicación básica en la que cambiaremos un estilo y un texto de un componente ADF.

En primer lugar debemos crear en la carpeta WEB-INF de nuestra aplicación Fusion Middleware (ADF) un archivo XML con el siguiente nombre: trinidad-skins.xml .

Fichero trinidad-skins.xml

En este archivo se pueden definir tantos Skins como se necesite:

Contenido de trinidad-skins.xml

Los campos a rellenar por cada Skin son:
  • Id: Identificador único del Skin.
  • Family: Nombre de la familia. Este nombre es importante dado que es el que se utiliza para seleccionar el Skin en la aplicación.
  • Extends: En caso de estar extendiendo un Skin existente. Por ejemplo, para ADF es muy frecuente que se extienda fusion-v1.desktop.
  • Render-kit-id: Es la clase encargada de qué render se va a usar. Puede ser para "desktop" o "pda".
  • Style-sheet-name: Ruta donde esta ubicada nuestra CSS.
  • Bundle-name: Ruta de paquetes y nombre del proyecto de Bundle para la escritura de literales. En el caso del ejemplo se realizará desde una clase Java.
  • Translation-source: Personalmente nunca he usado esta opción en detrimento de Bundle-name.
Ahora debemos modificar el archivo trinidad-config.xml para que use nuestra Custom Skin. Para ello únicamente hay que sustituir el valor que viene dentro de <skin-family> por el nombre de la Family de nuestra Custom Skin.

trinidad-config.xml modificado

En el caso de una aplicación de WebCenter Portal. Nos encontraremos el siguiente valor:

<skin-family>#{preferenceBean.defaultTrinidadSkin}</skin-family>

Aquí tenemos varias alternativas, entre las cuales destaco:
  • Cambiar la preferencia de portal del archivo de configuración adf-config.xml para que use nuestra Custom Skin.
    adf-config.xml de WebCenter Portal

  • Establecer directamente el valor de nuestra Skin. Caso en el que no vayamos a cambiar la Skin del portal en modo ejecución.
  • Registrar en la aplicación de WebCenter la nueva Skin para que pueda establecerse desde la página de Administración de WebCenter.
En el ejemplo vamos a modificar ligeramente un <af:calendar>, cambiando alguno de sus estilos y los literales del componente traduciendolos al catalán (idioma para el que no se encuentran traducidos). 

Por ello, además de haber creado/modificado los archivos descritos anteriormente. Es necesario
  • Modificar el archivo faces-config.xml para que acepte el Catalán (ca_ES).

    faces-config.xml

  • Crear una página de pruebas y establecer en el atributo locale de <f:view> el valor "ca_ES" para indicar que nos encontramos en Catalán. Y añadir un componente <af:calendar>.

    Página de prueba
  • Verificar que tenemos creado el archivo trinidad-skins y modificado el archivo trinidad-config correctamente.
  • En el archivo CSS referenciado por nuestra Custom Skin vamos a añadir algunos selectores del componente calendar para modificar su estilo.

    Estilos Custom
  • Completar los Bundle Java que hemos creado y referenciado desde trinidad-skins.
    Código de Bundle en Catalán

  • Ejecutar la página JSPX y comprobar que los literales han sido traducidos al catalán así como los colores han cambiado.

    <af:calendar> con Custom Skin
Por último comentar que en la documentación oficial también se explica como desplegar nuestras Custom Skin en librerías JAR externas a nuestra aplicación. Algo que recomiendo cara a la limpieza del desarrollo.

Nota: Podeis encontrar una lista con los selectores, así como las claves de los literales traducibles por cada componente ADF en la ayuda de JDeveloper.

Lista de selectores de la ayuda de JDev

Ejemplo desarrollado en JDeveloper 11.1.1.4.

Documentación oficial: Custom Skin ADF.

Un saludo a todos :).