Monday, February 11, 2013

Creating deployment plan for EJB 3.0

Para crear el "Deployment plan" hay que dar clic derecho a nuestro proyecto como se muestra en la figura y elegir "New Deployment Profile"


Nos aparece una galería de tecnologías y elegimos la que dice "EJB JAR File".



Y nombramos nuestro "Deployment Profile".



Nos aparecerá la siguiente pantalla y solamente presionamos el botón "Ok".


Bien, ahora ya es posible desplegar el EJB en nuestro servidor de Weblogic haciendo clic derecho a nuestro proyecto y en "Deploy".

hf gl!

How to make an EJB 3.0 with JDeveloper

A continuación se muestra como crear un EJB 3.0 usando el wizard del JDeveloper 11.1.1.4.

Primero creamos nuestro proyecto como se muestra en la imagen.



En la siguiente pantalla elegimos el tipo de proyecto "Generic Project".



Después definimos el nombre del proyecto, en este caso lo llamaremos "EJBsample" y presionamos el botón "Finish".



Ahora vamos a crear un EJB haciendo clic derecho en el proyecto que acabamos de crear y en el menú elegimos "New".



Y después buscamos en la galería "Session Bean" el cual se refiere a nuestro EJB Bean que usaremos del tipo "Stateless".



Definimos la versión del EJB 3.0.



Ahora procedemos a darle nombre a nuestro EJB y renombramos el nombre con el cual sera mapeado en nuestro servidor de Weblogic una vez desplegado.



Y después renombramos el nombre del Bean que va a contener nuestro EJB como se muestra en la imagen.



Ahora en los tipos de interfase seleccionamos solamente la interfaz remota ya que nuestro objetivo es exponer nuestro EJB para que sea invocado desde cualquier lugar.



Finalmente presionamos el botón "Finish".



Bien, ahora que tenemos nuestro EJB listo falta crear algunos métodos los cuales expondrá nuestro EJB para que sean invocados.

Procedemos a modificar nuestra interfaz remota y agregamos un método para concatenar String's.



Finalmente implementamos nuestro método que acabamos de definir en nuestra interfaz remota como se muestra en la imagen.




gl hf!

Friday, February 8, 2013

How to build a JAR Client for EJB´s

Ahora veremos como generar un JAR para crear un cliente de EJB.

Damos clic derecho en nuestro proyecto de EJB en JDeveloper y en el siguiente menú elegimos "Project Properties"



En la siguiente pantalla nos dirigimos en el menú al apartado de "Deployments" como se muestra en la imagén y presionamos el botón "New".




A continuación seleccionamos que el archivo que deseamos generar es del tipo "JAR" y nombramos nuestro archivo.



Después hay que filtrar los objetos que no ocupamos en nuestro archivo "JAR", dejamos solamente la interfaz remota de nuestro EJB.




Bien, ahora ya podemos generar nuestra librería que usara nuestro cliente.

Nos vamos en el apartado de "Deploy" en nuestro proyecto y seleccionamos nuestro plan de despliegue que acabamos de crear.



Ya podemos hacer uso del "JAR" como se puede ver en el log.




gl hf^^

Tuesday, February 5, 2013

Configuring JMS Queue in Weblogic 11g

Hola,

Ingresamos a nuestra consola de weblogic: 

http://<IP_APPLICATION_SERVER>:<PUERTO>/console



Cuando iniciamos sesión veremos una pantalla como la que se muestra , el primer paso antes de realizar el despliegue seria configurar los JNDI que utilizara la aplicación, que son:
  • jms/ClientConnectionFactory: Crea sesiones para la Cola jms/ClientQueue.
  • jms/ClientQueue: Almacena los mensajes recibidos por el plugin.
Por lo tanto debemos tener configuradas 1 Fábrica de Queue y 1 Queue. Para comenzar la creación de las Queue, accesaremos al menú “JMSMODULE” ubicado en el menú de lado izquierdo.


Donde nos listara los módulos actualmente existentes, en esta pantalla agregaremos un módulo que será utilizado por nuestra aplicación, por lo tanto oprimimos el botón de New.


Cuando crea un nuevo módulo de JMS, inicialmente solicita el nombre, podemos poner cualquier nombre, para este ejemplo usaremos el nombre de “SFE”, al finalizar oprimimos el botón de Next.


El siguiente paso para crear el modulo es indicarle que servers pueden accederlo, como nuestra aplicación no se encuentra en Clúster, solo nos parece la default “AdminServer”, y esta es la que debemos seleccionar y después oprimir el botón Next.


Prácticamente hemos terminado la configuración sin embargo el servidor de aplicaciones nos pregunta si deseamos agregar recursos a este módulo, seleccionamos la opción de agregar recursos y oprimimos el botón de Finish.


Ahora tenemos creado el módulo de JMS donde agregaremos los ConnectionFactory y los Queue, por lo que el siguiente paso es dar click en el botón new.


Lo primero que se debe crear es el Connection Factory "ClientConnectionFactory", por lo tanto seleccionamos el recurso de Connection Factory y oprimimos el botón de Next.


Para la configuración del Connection Factory dejaremos los valores default solo pondremos el nombre del Connection Factory y como JNDI name antepondremos “jms/” seguido por el nombre del ConnectionFactory.


Cuando se halla introducido el nombre y el Jndi, oprimimos el botón de Next, que nos mostrara una ventana de confirmación y simplemente oprimimos el botón de Finish:


Una vez que se hayan creado las dos Connection Factory, debemos ver en el módulo que creamos anteriormente algo parecido a la siguiente imagen:


Ahora que tenemos las Connection Factory, debemos crear las Queue, por lo que agregaremos otro recurso al módulo que creamos anteriormente, pero esta vez seleccionaremos Queue.


La configuración de la Queue es muy parecida a la del Connection Factory ya que nos pide esencialmente los mismos datos que son el nombre y el Jndi.


La siguiente pantalla muestra por default que no contiene o está asociado a un subdeplyment, sin embargo debemos crear uno, por lo que oprimimos el botón de “Create a New Sub Deployment”.


Como nombre al sub deployment se sugiere poner el mismo nombre del Queue.


Una vez que se creó el subdeployment debemos asignar este a un JMS Server, en este caso lo asignaremos a “WseeJmsServer” y oprimimos Finish.


Al finalizar la configuración de la Queue, los recursos dentro del módulo deben aparecer como se ilustra en la siguiente imagen:


Listo!

hf gl^^

How to enable a business event for editing

Que tal,

Vamos a resolver un bug que encontré en la version de Oracle E'Business Suite 12.1.3 para la edición de los "Business Event" dentro de la responsablidad de "Workflow Administrator", en el cuál entrando con un usuario con responsabilidad de "System Administrator" no se permite la edición de los "Business Event".

Primero vamos a identificar el escenario donde no nos permite la edición como bien se especifica en la imagén.


En la imagén anterior nos encontramos con la leyenda que dice "Set de value '*' to grant administrative privileges to all users" pero nos encontramos con que el texto NO ES EDITABLE.

Para solucionar este bug tenemos que actualizar manualmente el rol "WF_ADMIN_ROLE" y lo podemos visualizar en esta consulta como se muestra en la imagen.


Actualizamos el role de la siguiente manera:
update wf_resources
set text='FND_RESP|SYSADMIN|SYSTEM_ADMINISTRATOR|STANDARD'
where name='WF_ADMIN_ROLE
commit;

¡Listo!

Ya podemos visualizar el texto para edición.


Y finalmente si queremos editar un "Business Event" lo veremos de la siguiente forma.


Nota: Antes de realizar esta actualizacion para el uso de "Business Event" en "Integrated SOA Gateway" se aplico un parche que ocupa esta version de EBS.

gl hf!


Monday, February 4, 2013

Format Date with XSLT using a Template

Hola,

Vamos a ver como dar formato de una fecha especifica. En esta ocasión vamos a usar una transformación sencilla donde mapeamos un elemento de tipo cadena a otra variable con el formato solicitado.

Veamos la siguiente ejemplo:



  
    
      
          
            
          
      
    
    
  
    
    
    -
    
    -
    
    T
    
    :
    
    :
    
    
  

Vamos a dar formato procesando una cadena con la función "substring". En este escenario esperamos dar formato a una cadena de caracteres cualquiera ej. 20060101000000. Definimos el siguiente template para parsear la cadena según el valor que vamos a leer y preparamos el formato que deseamos.

  
    
    
    -
    
    -
    
    T
    
    :
    
    :
    
    
  

Y finalmente añadimos el llamado al template dentro del mapeo de nuestra variable que queremos formatear:

    
      
          
            
          
      
    
Listo! 
 Ahora realizamos un "Test" en JDeveloper.




gl hf ;)

Enabling Coherence with example

Que tal,

Veamos como habilitar el nodo de Coherence en el cual viene integrado con Weblogic, en esta ocasión usare la versión 11.1.1.5 del producto.

Primero nos dirigirnos al siguiente archivo de coherence en la siguiente ruta:

cd /u01/orasoa/middleware/coherence_3.X/bin
Bien, ahora modificamos el archivo "coherence.sh" usando el comando:
vi coherence.sh

Dentro del archivo buscamos la linea que dice "STORAGE_ENABLED=false"



Hay que modificar el valor "false" por el valor "true".

Nota: Después de actualizar el archivo hay que reiniciar Weblogic.

Vamos a ver un ejemplo en Java de como usar Coherence.

import com.tangosol.net.CacheFactory;
import com.tangosol.net.NamedCache;

import com.eddosoa.coherence.persistence.DataVO;
import com.eddosoa.coherence.persistence.HeaderVO;
import com.eddosoa.coherence.utils.CoherenceUtil;

import java.util.ArrayList;
import java.util.List;

public class CoherenceSample {  
    /**
     * Atributo para ser utilizado por patron de diseño de la instancia
     */
    private static CoherenceEJBBean instance = null;
    
    /**
     *  CONSTANTE con el nomre de la cache a utilizar.
     */
    private static final String CACHE_NAME = "TestCache";  
    
    /**
     * 
     */
    private static NamedCache cache;
  
    /**
     * Bloque que inicializa por unica vez la cache almacenada en Coherence
     */
    static {
        try {
            if (cache == null) {
                CacheFactory.ensureCluster();
                cache = CacheFactory.getCache( CACHE_NAME );
            }
        } catch(Exception ex) {
          System.out.println("Error --> " + ex.getMessage());
        }
    }

      
    /**
    * Metodo que almacena un elemento en Coherence.
    * @param data
    * @return
    */
    public void putCacheValue(DataVO data) {
 
  String key = CoherenceUtil.createKey(data.getHeader()); //Metodo createKey: genera una cadena para crear la llave (usar cualquier nombre)
  cache.put(key , data.getDataInfo());
    }
    
    /**
    *   Metodo que retorna un objeto dado otro objeto para la busqueda
    *   @param data
    *   @return
    */
    public Object getCacheValue(HeaderVO header) {
        ResponseVO result = new ResponseVO();
        if(header != null) {
              if(CoherenceUtil.checkHeaderValues(header)) {                
                String key = CoherenceUtil.createKey(header);
                if(cache.containsKey(key)) {
                  result.setResponse(cache.get(key));
                }                

        }
        return result;
    }      
    
    
    /**
       * Metodo que elimina un objeto almacenado en la cache de coherence dado un header
       * @param header
       * @return
       */
    public void deleteSegment(HeaderVO header){
      ResponseVO result = new ResponseVO();
      if(header != null) {
            if(CoherenceUtil.checkHeaderValues(header)) {
              String key = CoherenceUtil.createKey(header);
              cache.remove(key);
          }
      }
    }
          
  }

Estos son ejemplos de como construir los DTO para coherence en el cual implementamos la interface para los POF(Portable Object Format.
package com.eddosoa.coherence.persistence;

import com.tangosol.io.pof.PofReader;
import com.tangosol.io.pof.PofWriter;
import com.tangosol.io.pof.PortableObject;

import java.io.IOException;
import java.io.Serializable;

public class HeaderVO implements Serializable, PortableObject{
    
  private String docKindOf;
  private String currentPart;
  private String totalParts;
  private String store;
  private String date;
    
    

    public void readExternal(PofReader reader) throws IOException {
      docKindOf   = reader.readString(0);
      currentPart = reader.readString(1);
      totalParts  = reader.readString(2);
      store       = reader.readString(3);
      date        = reader.readString(4);
    }

    public void writeExternal(PofWriter writer) throws IOException {
      writer.writeString(0, docKindOf);
      writer.writeString(1, currentPart);
      writer.writeString(2, totalParts);
      writer.writeString(3, store);
      writer.writeString(4, date);
    }


    public void setDocKindOf(String docKindOf) {
        this.docKindOf = docKindOf;
    }

    public String getDocKindOf() {
        return docKindOf;
    }

    public void setCurrentPart(String currentPart) {
        this.currentPart = currentPart;
    }

    public String getCurrentPart() {
        return currentPart;
    }

    public void setTotalParts(String totalParts) {
        this.totalParts = totalParts;
    }

    public String getTotalParts() {
        return totalParts;
    }

    public void setStore(String store) {
        this.store = store;
    }

    public String getStore() {
        return store;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getDate() {
        return date;
    }
}

package com.eddosoa.coherence.persistence;

import com.tangosol.io.pof.PofReader;
import com.tangosol.io.pof.PofWriter;
import com.tangosol.io.pof.PortableObject;

import com.eddosoa.coherence.utils.EnumType;

import java.io.IOException;
import java.io.Serializable;

public class DataVO implements Serializable, PortableObject {
          
    private HeaderVO header;
    private String dataInfo;
    private EnumType type;

    public void readExternal(PofReader reader) throws IOException {
      header   = (HeaderVO)reader.readObject(0);
      dataInfo = reader.readString(1);
      type     = (EnumType)reader.readObject(2);
    }

    public void writeExternal(PofWriter writer) throws IOException {
      writer.writeObject(0, header);
      writer.writeString(1, dataInfo);
      writer.writeObject(2, type);
    }


    public void setHeader(HeaderVO header) {
        this.header = header;
    }

    public HeaderVO getHeader() {
        return header;
    }

    public void setDataInfo(String dataInfo) {
        this.dataInfo = dataInfo;
    }

    public String getDataInfo() {
        return dataInfo;
    }

    public void setType(EnumType type) {
        this.type = type;
    }

    public EnumType getType() {
        return type;
    }
}


gl hf!


Friday, February 1, 2013

Grouping with XSLT 2.0 in Oracle SOA 11g

Que tal,

En esta ocasión les comparto la forma en la cual he utilizado agrupaciones en Oracle SOA 11g usando XSLT 2.0.

Les menciono que la version XSLT 1.0 no soporta agrupaciones por lo cual hay que dirigirse a usar la versión XSLT 2.0.

Les explicare un ejemplo de como utilizarlo y escribiré algunas notas.

Empecemos:

Primeramente cuando queremos realizar una transformación, por ejemplo en BPEL. Automaticamente nos crea un archivo "*.xsl" con la versión 1.0.


Lo primero que debemos hacer es: manualmente tenemos que cambiar la versión a 2.0 como se muestra en la imagen.


¡Listo!

Ahora podemos utilizar agrupaciones, a continuación les muestro un ejemplo breve y no entrare en explicación de como utilizar esta funcionalidad, si llegan a requerir apoyo favor de comentarlo.


Notas:


  • Si se pretende probar este XSLT con la funcionalidad de "Test" que cuenta JDeveloper, al menos en la versión JDeveloper 11.1.1.4 si es posible y asumo que en las posteriores igual.
  • Si no pueden ver el XSLT en modo "Desing" no tengan miedo, el BPEL o lo que sea se puede desplegar SIN PROBLEMAS, y verán que a la hora de ejecutar el BPEL no habrá problemas.
gl hf ^^

Bug fixed, EJB 3.0 JNDI weblogic

Que tal,

A continuación muestro un bug encontrado en la version de Oracle SOA 11.1.1.4 en el cual implica un despliegue de un EJB 3.0 con interfaz remota sobre weblogic.

El problema reside que al querer realizar una invocación vía RMI al EJB el cliente "NO LO ENCUENTRA". 

Comento que desconozco como reproducir este error y la razón. Les explico la solución:

En el JDeveloper definimos un EJB 3.0.


Elegimos solamente una interfaz remota.


En automático JDeveloper nos crea la clase con interfaz remota referenciando con anotaciones como se muestra en esta imagen.


Lo que hacemos es borrar la referencia de la anotación remota que se marca en el recuadro en rojo y la agregamos vía anotación al Bean.



¡Listo!

Ahora desplegamos el EJB en nuestro servidor weblogic y sin problemas podemos esperar que nuestro EJB estara disponible para invocarlo.

Revisamos en la liga de "Ver Árbol de JNDI".


Y por fin ya podemos lo podemos visualizar.

gl hf!