miércoles, 27 de noviembre de 2013

Cambiando el mensaje de incompatibilidad de Navegador

Encontré en el foro de OTN una pregunta acerca de como cambiar el mensaje por defecto de ADF 11g R1 correspondiente con la incompatibilidad del navegador utilizada.

Mensaje de ADF 11gR1 corriendo en IE con Compatibily View Mode
Mensaje sobreescrito con ADF Skinning
Hilo en el foro de WebCenter Portal

Versión en inglés (coming soon)

Indagando por las librerías internas del core de ADF encontré el siguiente fragmento de código en el DocumentRenderer (el renderizador del componente af:document de ADF):

if (checkAgentSupport) 
    { 
      String unsupportedAgentMessage = arc.getTranslatedString("AFUnsupportedBrowser"); 
      out.writeText("AdfAgent._UNSUPPORTED_BROWSER_ALERT=\"", null); 
      out.writeText(unsupportedAgentMessage, null); 
      out.writeText("\";", null); 
}  


La variable arc no es mas que una instancia de org.apache.myfaces.trinidad.context.RenderingContext
El método getTranslatedString recoge del Resource Bundle de la Skin actual el literal deseado.

En el caso de WebCenter Portal 11.1.1.8 y la Skin skyros estos literales se encuentran en:
oracle.adfinternal.view.faces.renderkit.rich.resource.RichBundle

...{ "AFUnsupportedBrowser", "You are using an unsupported browser. The supported browsers are Internet Explorer 7 and higher, Firefox 2.0.0.2 and higher, Safari 3.1.2 and higher, and Google Chrome 1.0 or higher." }, { "AFUnsupportedBrowserMode", "The current compatibility setting is not supported. Disable Compatibility View before running this web page." }...

¿Cómo modificar los mensajes?

Solución 1: Mediante Skinning (recomendado y soportado por Oracle)
Crea una Custom Skin que extienda tu Skin actual cuya configuración incluya un Resource Bundle que sobreescriba las entradas AFUnsupportedBrowser y AFUnsupportedBrowserMode.
Link a la entrada de Skinning de mi Blog

Solución 2: Sobreescribir la clase RichBundle (No recomendado)
Crear la misma estructura de paquetes y clases que RichBundle en el codigo que se despliega con WebCenter Portal Framework o con el PortalExtension de WebCenter Portal y modificar las cadenas de texto necesarias.

NOTA: Esta solución sobreescribe la funcionalidad estándar de ADF y afectará a futuros parches.

Articulo OTN: Construyendo adaptadores de busqueda

Ha sido publicado mi primer artículo técnico para Oracle OTN.

http://www.oracle.com/technetwork/articles/enterprise2/garcia-wcp-search-adaptor-2066866.html

Twitter Search Adapter for WebCenter Portal

Este artículo trata de complementar la documentación oficial de Oracle acerca de la construcción de adaptadores de búsqueda para WebCenter Portal. En él encontraréis un ejemplo práctico de cómo construir un adaptador y qué es importante conocer del API de WebCenter Search.

Manejo de estaticos en WebCenter Portal Framework Application

Versión española en proceso...

Para la version inglesa haz click aqui: Versión en inglés

miércoles, 23 de octubre de 2013

Mejores prácticas: WebCenter Portal (antes Spaces) web.xml

Para modificar el archivo web.xml en Oracle WebCenter Spaces (PS1-PS6) / WebCenter Portal (PS7) la documentación oficial tiene la siguiente información:
  • Documentación oficial 11.1.1.1-11.1.1.7: La documentación para las versiones previas a la actual dicen de desempaquetar la aplicación de webcenter.ear y realizar las modificaciones pertinentes.
  • Documentación oficial 11.1.1.8: Elimina la parte de desempaquetar y cambiar la configuración manualmente en el servidor. Sin embargo, se refiere a ciertos parámetros que podrían querer modificarse.
¿Qué ocurre en caso de modificar manualmente el archivo web.xml?
Los cambios realizados en web.xml se pierder tras cada aplicación de parche o actualización a WebCenter.

¿Cuál es la mejor práctica en caso de querer modificar el archivo web.xml?
El archivo web.xml puede modificarse usando la aplicación de extensión de WebCenter Spaces / Portal.

Para ello hay que tener en cuenta la versión de WebCenter:

Versiones inferiores a WebCenter Portal 11.1.1.8 
En la aplicación DesignWebCenterSpaces, añadir el archivo web.xml como recurso en el despliegue de la extension de WebCenter Spaces.
  • En el proyecto WebCenterSpacesExtensionLibrary. Habilita en la carpeta Resources que se pueda editar web.xml.
    Añadir el archivo web.xml a los recursos para que sea editable desde el proyecto
  • En el proyecto WebCenterSpacesExstensionLibrary, acceder a las los detalles del Deployment Profile llamado custom_webcenter_spaces_war

  •  En File Groups -> Web Files -> Filters activar web.xml
    Activación del archivo web.xml
  • El archivo web.xml se verá en el proyecto y se desplegará con la librería extendida. Ahora podemos añadir / sobreescribir los parámetros de contexto o añadir servlets propios.
    web.xml solo con información extendida
Nota: Cuando se añaden tecnologias o dependencias al proyecto puede que el archivo web.xml se rellene con filtros e información sobrante. Se debe mantener este archivo limpio con sólo aquello nuevo / sobreescrito. En el caso de haber contenido extra en el web.xml puede que los ANT scripts de despliegue fallen a la hora de desplegar el código extendido. 

Versión WebCenter Portal 11.1.1.8
En esta versión de WebCenter Portal (renombrado Spaces a Portal). JDeveloper trae consigo su propia Aplicación y Proyecto para extender WebCenter Portal.

Para seguir desarrollando recursos de Portal como plantillas, estilo de páginas, plantillas de content presenter... La aplicación DesignWebCenterSpaces debe seguir siendo utilizada. Sin embargo, el proyecto WebCenterSpacesExstensionLibrary ya no se usa en esta versión para desplegar código.

En este caso debe crear una nueva aplicación usando la nueva plantilla de JDeveloper: WebCenter Portal Server Extension.

WebCenter Portal Server Extension

Esta plantilla generará dos proyectos (que podemos nombrar en la creación).
  • PortalExtension: Se usa para encapsular los Task Flow y código adicional.
  • PortalSharedLibrary: Actuará como WebCenterSpacesExtensionLibrary con la diferencia de que el manejo del versionado y el despliegue se realiza utilizando el asistente de despliegue de JDeveloper en lugar de los ANT Script que proporcionaba el anterior mecanismo.
Haciendo foco en PortalSharedLibrary se puede comprobar que solamente trae consigo el archivo MANIFEST.MF
MANIFEST.MF de la aplicación PortalSharedLibrary
¿Dónde se encuentran entonces weblogic.xml y web.xml?
Los archivos de configuración deben ser generados manualmente. Por ejemplo para generar el archivo weblogic.xml nada más que crear un nuevo WebLogic Deployment Descriptor.
Nuevo WebLogic Deployment Descriptor
weblogic.xml como nuevo descriptor
En caso de web.xml, usar el mismo procedimiento, pero creando un Java EE Deployment Descriptor.

Nuevo Java EE Deployment Descriptor
web.xml

Automáticamente los archivos web.xml y weblogic.xml formarán parte del despliegue de la librería extendida.

Al igual que ocurría con las versiones anteriores, se debe mantener web.xml con sólo la información añadida o sobrescrita.

Referencias:
 

viernes, 5 de julio de 2013

Ejecutando WebCenter Spaces WSDL API en WebCenter Portal (JDeveloper)

Para llamar WebCenter Spaces WSDL API desde una aplicación de WebCenter Portal se requiere la  configuración de la confianza y seguridad entre los dominios en los que se ejecutan.

Versión en inglés

Anteriormente publiqué un post hablando de esta configuración. Integrando Spaces en Portal
En este quiero detallar el proceso de configuración y los posibles problemas que se pueden encontrar.

Spaces Data Control
En este tutorial se explica concretamente como configurar la seguridad para un escenario en el que hay una instalación de WebCenter Spaces y se quiere ejecutar desde una WebCenter Portal corriendo en el servidor integrado. En diferentes arquitecturas o topologías esta configuración puede ser un poco distinta.

Generando los ficheros Java Key Store

Los archivos que se generarán para configurar el KeyStore tanto del productor (Spaces)
  • webcenter.jks: Usado por el dominio de WebCenter e incluyendo el certificado webcenter_public.cer
  • external_webcenter_custom.jks: Usado por el dominio integrado de JDeveloper. Incluye su propio certifiacdo y webcenter_public.cer para la securizacion y confianza de la llamada a Spaces WSDL.
Para WebCenter Domain:
keytool -genkeypair -keyalg RSA -dname "cn=spaces,dc=vassit,dc=com" -alias webcenter -keypass welcome1 -keystore webcenter.jks -storepass welcome1 -validity 1064
keytool -exportcert -v -alias webcenter -keystore webcenter.jks -storepass welcome1 -rfc -file webcenter_public.cer
keytool -importcert -alias webcenter_public -file webcenter_public.cer -keystore webcenter.jks -storepass welcome1

Para JDeveloper Domain:
keytool -genkeypair -keyalg RSA -dname "cn=external_webcenter_custom,dc=vassit,dc=com" -alias external_webcenter_custom -keypass welcome1 -keystore external_webcenter_custom.jks -storepass welcome1 -validity 1024
keytool -exportcert -v -alias external_webcenter_custom -keystore external_webcenter_custom.jks -storepass welcome1 -rfc -file external_webcenter_custom_public_key.cer
keytool -importcert -alias external_webcenter_custom_public_key -file external_webcenter_custom_public_key.cer -keystore webcenter.jks -storepass welcome1
keytool -importcert -alias webcenter_public -file webcenter_public.cer -keystore external_webcenter_custom.jks -storepass welcome1

La carpeta donde se han generado los ficheros debería verse como en la siguiente imagen:
Archivos JKS y CER generados

Configurando el KeyStore de WebCenter Domain

La configuración del Java Key Store para el dominio de WebCentet puede hacerse por dos vías diferentes:
  • Usando Fusion Middleware Console.
  • Usando comandos WLST.
Antes de empezar la configuración, copia el archivo webcenter.jks a: 

 ../[DOMAIN_HOME]/config/fmwconfig


Copiar webcenter.jks a fmwconfig

Configurando usando la Fusion Middleware Console:
  • Ve a Domain -> Security -> Security Provider Configuration -> Keystore (Configure).
Configuración de seguridad del dominio de WebCenter
    Configurar KeyStore
  • Configura el path donde se encuentra el keystore (path relativo a la carpeta fmwconfig) y los alias de los certificados generados.
    Configuración de los Alias/Certificados
Despues de configurar el keystore se requiere un reinicio completo del Dominio de WebLogic así como de los servidores.

Configurando usando WLST:

Editar [DOMAIN_HOME]/config/fmwconfig/jps-config.xml cambiando la siguiente linea:

<serviceInstance name="keystore.inst.0" provider="keystore.provider" location="./webcenter.jks">
            <description>Default JPS Keystore Service</description>


Ejecuta WLST en [WC_HOME]/common/bin y conecta con el dominio de WebCenter para ejecutar los siguientes comandos que actualizan los alias/credenciales:

updateCred(map="oracle.wsm.security", key="keystore-csf-key", user="owsm", password="welcome1", desc="Keystore key")
updateCred(map="oracle.wsm.security", key="enc-csf-key", user="webcenter", password="welcome1", desc="Encryption key")
updateCred(map="oracle.wsm.security", key="sign-csf-key", user="webcenter", password="welcome1", desc="Signing key")

Despues de configurar el keystore se requiere un reinicio completo del Dominio de WebLogic así como de los servidores.

Configurando JDeveloper/Integrated WebLogic Domain Keystore

El servidor integrado de WebLogic de JDeveloper no trae por defecto la consola de Fusion Middleware. Esta puede ser instalada, pero no es necesario para la configuración. La actualización en el cliente se realizará usando WLST siguiendo los siguientes pasos:

Copia el archivo JKS generado para el cliente, external_webcenter_custom.jks, en la carpeta de configuración del dominio del WebLogic Integrado de JDeveloper:

C:\Users\[User]\AppData\Roaming\JDeveloper\system11.1.1.6.38.61.92\DefaultDomain\config\fmwconfig



Edit jps-config to change the keystore used:


<serviceInstance name="keystore" provider="keystore.provider" location="./external_webcenter_custom.jks">
            <description>Default JPS Keystore Service</description>
 


Ve a la carpeta de la Oracle Middleware Home (Por defecto suele ser C:\Oracle\Middleware\oracle_common\bin).

Ejecuta WLST y conecta al dominio integrado de WebLogic para ejecutar la actualización de los credenciales:

updateCred(map="oracle.wsm.security", key="keystore-csf-key", user="owsm", password="welcome1", desc="Keystore key")
updateCred(map="oracle.wsm.security", key="enc-csf-key", user="external_webcenter_custom", password="welcome1", desc="Encryption key")
updateCred(map="oracle.wsm.security", key="sign-csf-key", user="external_webcenter_custom", password="welcome1", desc="Signing key")

Despues de configurar el keystore se requiere un reinicio completo del Dominio de WebLogic así como de los servidores.

Test

Para ejecutar una prueba de concepto si la configuración fue hecha correctamente usa el siguiente snippet de código:

GroupSpaceWSContext context = new GroupSpaceWSContext();
context.setEndPoint("http://[Host]:[Port]/webcenter/SpacesWebService");
context.setSamlIssuerName("www.oracle.com");
context.setRecipientKeyAlias("webcenter_public");
try {
    GroupSpaceWSClient groupSpaceWSClient =
        new GroupSpaceWSClient(context);
    List<String> gspaceList = groupSpaceWSClient.getGroupSpaces(null);
    for (String name : gspaceList) {
        System.out.println(name);
    }
} catch (Exception e) {
    e.printStackTrace();
}

En caso de no funcionar hecha un ojo a la siguiente sección sobre problemas comunes.

Problemas y soluciones a errores comunes de la configuración

SOAP Fault error caused because headers can’t be read

Tras la primera ejecución de los Web Services es común que no se hayan configurado las policies adheridas al Web Service de Spaces. Para configurar las policies asociadas sigue los siguientes pasos:
  • Ve a la configuración de Web Services de WebCenter Spaces en la Fusion Middleware Control:
    Configuración de los WebServices de Spaces
  • En la pestaña Web Service Endpoints selecciona SpacesWebServiceSOAPHttpPort.
    Lista de WebServices
  • Añade al menos oracle/wss11_saml_token_with_message_protection_service_policy dado que la petición estará llamando con la policy:
    wss11_saml_token_with_message_protection_client_service_policy
    Politicas de seguridad adjuntas
  • Prueba de nuevo

Diferente SamlIssuerName

Como puedes comprobar en el código del snippet, se usa:
context.setSamlIssuerName("www.oracle.com");

Ese issuer viene configurado por defecto en la instalación de WebCenter.

En caso de querer registrar otro distinto, cambia el saml.loginmodule en la configuración de la seguridad del dominio a través de la Fusion Middleware Console.
Lista de módulos de autenticación
Lista de SAML Issuers

oracle.wsm.security.SecurityException: WSM-00060 : Error validating timestamp.

En el caso de que los dominios de WebCenter y JDeveloper esten en rangos horarios distintos entonces hay que configurar la propiedad clockSkew para configurar el desfase que hay entre los entornos.

Referencia: http://docs.oracle.com/cd/E23943_01/web.1111/b32511/managing.htm#BABHIFDD

Por ejemplo:
WebCenter Domain esta Spain, JDeveloper Client esta en UK.
UK está una hora por detrás de España y por ello se requiere realizar la siguiente configuración:

  • Ve al archivo policy-accesor-config.xml en la carpeta fmwconfig del dominio de JDeveloper
  • Cambia:

    <interceptor name="BindingSecurityInterceptor"
    class="oracle.fabric.common.BindingSecurityInterceptor"
    category="security">
            <properties>
                <property name="agent.clock.skew">360</property>
                <property name="agent.nonce.ttl">28800</property>
                <property name="agent.expire.time">300</property>
                <property name="agent.allow.all.xpaths">false</property>
            </properties>
    </interceptor>

    Por

    <interceptor name="BindingSecurityInterceptor"
    class="oracle.fabric.common.BindingSecurityInterceptor"
    category="security">
            <properties>
                <property name="agent.clock.skew">3600</property>
                <property name="agent.nonce.ttl">28800</property>
                <property name="agent.expire.time">300</property>
                <property name="agent.allow.all.xpaths">false</property>
            </properties>
    </interceptor>
El cambio ha sido incrementar agent.clock.skew a 3600 (1hora de diferencia en segundos).

viernes, 28 de junio de 2013

WebCenter Content: Check-in sin Primary File

En esta entrada se explican dos ascpectos relacionados con los Primary File:

Primary File fields
  • Permitir que un Check-in no obligue a subir un fichero asociado para todos los contenidos.
  • Cómo permitir Check-in para un perfil específico y ocultar los campos de Primary File de un formulario de Check-in.
Permitir Check-in sin Primary File

Para permitir los Check-in sin Primary asociado para todos los contenidos de WebCenter Content solo hay que añadir la siguiente variable a la configuración:

AllowPrimaryMetaFile=true

Configuración de Oracle WebCenter Content

Permitir Check-in y ocultar los campos para un Profile específico

En caso de requerir realizar la acción para ciertos perfiles de WebCenter Content. Seguir los siguientes pasos:
  • Crear una nueva regla que se activará con las condiciones de Check-in
    Regla que se activa con Check-in

  • En la pestaña de Side Effects añadir el siguiente IdocScript que permitirá la creación de contenido sin Primary File y además ocultará las filas en el formulario.

    <$AllowPrimaryMetaFile="true"$>
    <$createPrimaryMetaFile="1"$>
    <$primaryFile:rowStyle="display:none"$>
    <$alternateFile:rowStyle="display:none"$>

  • Hacer Check-in del Profile y comprobar que, efectivamente, los campos de Primary File han sido ocultos y no se requieren para contribuir un nuevo contenido.
    Check-in Form sin Primary File
 Agradecimientos a David Pérez por el aporte.
  

jueves, 27 de junio de 2013

WebCenter Content 11.1.1.6: Indexación bloqueada

Hay una incidencia con la versión 11.1.1.6 de WebCenter Content que hace que el indexador se quede bloqueado.

English version

En un entorno WebCenter Content 11.1.1.6 con motor de indexación DATABASE.FULLTEXT. El indexador puede quedar bloqueado cuando se encuentra con un PDF o PPTX corruptos.

¿Cómo indentificar el bug?

Antes de realizar una indexación realizar los siguientes pasos:
  • Configurar las siguientes trazas: indexer, indexermonitor, indexerprocess, systemdatabase, taskmanager. Además, selecctionar Full Verbose Tracing.

    Activar trazas del servicio IDC
  • En las trazas a parecerá la siguiente información:
    Trazas del servicio IDC
    • indexer, indexermonitor, indexerprocess: Muestra las trazas del indexador y los archivos transformados.
    • systemdatabase: Muestra las Queries de base de datos durante el proceso.
    • taskmanager: Muestra procesos responsables de la indexación como puede ser TextExport encargado de sacar los índidces de los documentos.  
  • Antes de lanzar el indexador, parar el automático.
    Parar indexador automático
  • Antes de lanzar el indexdor, además, configurar para que escriba trazas durante la indexación.

    Indexación con trazas activadas.
  • Cuando el indexador llega al contenido corrupto saldrán trazas como la siguiente:

    (internal)/6  06.25 22:17:22.961  TextExport_0    Process 'TextExport' timed out.

    Esta traza indica que durante la transformación del contenido a un .txt de índice ocurrió un Timeout. Esto puede indicar que es necesario aumentar el Timeout de la operación con las variables:


    IndexerTextExtractionTimeout: por defecto son 15 sec (subirlo a 60 sec).
    TextExtractorTimeoutSec: por defecto son 15 sec (subirlo a 60 sec).
  •  Sin embargo, tras aumentar el Timeout se encontrará la siguiente traza
    taskmanager/6             06.25 23:56:10.636          TextExport_0    Task failed with output: 1.
    (internal)/7     06.25 23:56:10.636          TextExport_0    Unexpected abort by process 'TextExport'.
    taskmanager/6             06.25 23:56:10.636          TextExport_0    Removing launcher for task: TextExport that has been marked as terminated
    indexer/6        06.25 23:56:10.636          TextExport_0    Extracted file contains zero bytes.
    taskmanager/6             06.25 23:56:10.652          TextExport_0    task Monitor <intradoc.taskmanager.TaskMonitor$1@130a6d30> exiting
    taskmanager/7             06.25 23:56:10.652          TaskLauncher_TextExport_stderr__0   Finish reading.
    taskmanager/7             06.25 23:56:10.652          TaskLauncher_TextExport_stderr__0   Finish reading.
    TextExport were aborted when processing a file.

    Este error se debe a un Bug de Oracle WebCenter Content 11.1.1.6. Aplicando el último parche de WebCenter Content 11.1.1.6 se soluciona haciendo que el indexador no se quede parado cuando encuentra un problema de este tipo, y, por lo tanto, permitiendo la indexación de nuevo contenido.

WebCenter Portal: Cómo obtener el ID del nodo actual de navegación

No existe una EL Expression directa para obtener el ID del nodo actual de navegación.

(English version soon)

Elemento de navegación

Para obtener el ID no hay más que cortar de la prettyUrlPath la profundidad del nodo actual:

#{node.prettyUrlPath[node.depth]}
Referencias:

viernes, 14 de junio de 2013

Oracle WebCenter EMEA Partner Community Forum

VASSIT Services LTD del Grupo VASS participó en:

           Oracle WebCenter EMEA Partner Community Forum

Presentando las soluciones WebCenter


En él presentamos algunas de nuestras soluciones/extensiones de los producto creadas por el equipo de especialistas de Oracle WebCenter de VASS España y VASSIT UK.

WebCenter Internazionalization Module

Módulo que gestiona la traduccion de contenidos y literales. Además, facilita al usuario final la contribución de contenidos en distintos idiomas sin tener que preocuparse de nomenclaturas.

Este módulo está formado por dos piezas principales:
  • WebCenter i18n Module: Permite la traducción de contenidos desde Site Studio / Oracle WebCenter Portal y Spaces ó directamente desde Oracle WebCenter Content con una intuitiva interfaz.
  • Labels management: Se encarga de la gestión de literales de los sitios de Site Studio y portales de WebCenter permitiendo su gestión desde una aplicación ADF externa.
 WebCenter Content Video Support

Módulo que permite el "streaming" de videos en los portales y sitios web desarrollados con WebCenter.
Este módulo basado en FFMPEG libraries se integra con Oracle IBR (Inbound Refinery) para transformar los videos en formatos comunes a formatos streaming.

 VASS WebCenter Search Framework

Servicio de búsqueda desarrollado por VASS para clientes que no poseen Oracle SES ó los Default Live Adapter no cumplen los requisitos.
  • Motor de búsqueda basado en un algoritmo de ejecución de hilos en paralelo según los recursos disponibles.
  • Rendimiento óptimo comparado con los Default Live Adapters de WebCenter.
  • Única lista de resultados mezclando los elementos de las distintas búsquedas basado en un algoritmo.
  • Filtros extendidos.
  • Auto sugerencias.
  • Fácil de extender y añadir nuevas fuentes de información.
  Extended Spaces Catalog

Nuevo catálogo extendido de espacios incrementando la experiencia de usuario con más información relativa a los espacios. Además, incluyendo un nuevo concepto de "Espacio Favorito".