Traducir a :

miércoles, 9 de octubre de 2013

¿Cómo utilizar el File Adapter en un proceso BPEL?

Este tutorial fue realizado en jDeveloper 11.1.1.7.0 y su objetivo es explicar el uso de los File Adapter en un proceso BPEL.

En los procesos BPEL existen varias opciones para usar los File Adapter:

1. Read File: Se utiliza como entrada a un proceso BPEL en la cuál se realizará la lectura de archivos cada cierto tiempo especificado, llamado polling.
2. Write File: Utilizado para escribir en un archivo plano.
3. Synchronous Read File: Utilizado para realizar lecturas de archivos en medio de un proceso BPEL. (En este caso no se realiza polling).


Caso 1: Read File y Write File

En este caso se leerá el archivo plano: Persona.txt para crear un esquema Persona.xsd , y escribirlo en un archivo plano utilizando Write File en un proceso BPEL.

Para comenzar creamos una nueva aplicación BPM  incluyendo un proceso BPEL en el composite:


Luego damos las siguientes especificaciones a nuestro proceso BPEL:
- Versión: BPEL 2.0 Specification
- Template: "Define Servece Later"


Después arrastramos un File Adapter desde el Component Palette, le damos un nombre, dejamos la opción *Define from operation and schema (specified later) y escogemos la opción Read File.

Luego damos la ruta en donde se encuentran los archivos que serán leídos. Además podemos guardar en otra carpeta los archivos que van siendo leídos como vemos a continuación:


En el siguiente paso damos el nombre del archivo (o archivos) que será leído, en este caso solo darémos el nombre de archivo plano Persona.txt:



Ahora viene la opción de seleccionar cada cuanto se realizará la lectura de archivos o polling:


Ahora vamos a crear el esquema xsd a partir del archivo plano Persona.txt de la siguiente manera. Seleccionamos el ícono que dice "Define schema for native format" y se abrirá el wizard en el cual se especificarán las siguientes opciones:


En este caso nuestro archivo plano contiene varios registros de un solo tipo "Persona", por esto seleccionamos las siguientes opciones.


Después especificamos el nombre del elemento que representa nuestros registros.


Finalmente damos el nombre a nuestro esquema correspondiente al archivo plano leído, en este caso Persona.xsd



Luego de la configuración del Read File  lo unimos al proceso BPEL en el composite. En este proceso podemos definir si este proceso lo deseamos síncrono o asíncrono. Luego agregamos otro File Adapter de tipo Write. El composite quedará de la siguiente manera:


La configuración del Write File es similar.  Al momento de definir el esquema (Step 6 of 7) podemos especificar el esquema Persona.xsd creado anteriormente.

Luego abrimos el proceso BPEL. En éste arrastramos desde el Component Palette/BPEL Constructs/Web Service un "Receive" y un "Invoke":


Luego unimos Receive_ReadFile_Persona  a  ReadFile_Persona. En este momento saldrá la opción para crear la variable de entrada a este receive basados en el ReadFile, como se muestra a continuación:



Hacemos el mismo procedimiento uniendo "Invoke_WriteFile_Persona" a "WriteFile_Persona" y creamos la variable correspondiente.

Nota: Las especificaciones de los File Adapter se pueden modificar en el .jca generado por cada uno.

Después arrastramos una transformación desde Component Palette/Oracle Extensions en medio de los dos web services creados anteriormente y creamos la siguiente transformación:






Finalmente probamos nuestro proceso BPEL.

Caso 2: Synchronous Read File

En este caso se leerán 2 archivos planos: Persona.txt y Telefonos.txt. para crear un esquema con un arreglo de personas y cada uno de estos tenga una lista de telefonos. El proceso BPEL devolverá el xml de este esquema  dados los archivos planos leídos.

El archivo plano Telefonos tiene un id y un teléfono por cada línea. El id representa el id de la Persona.




Inicialmente tenemos en nuestro Business Catalog el objeto Persona:




Arrastramos un proceso BPEL al composite y damos la siguiente especificación:

Versión: BPEL 2.0 Specification
Template: Synchronous BPEL Process
Output: (http://xmlns.oracle.com/bpm/bpmobject/Data/ArrayPersona)ArrayPersona
 (ArrayPersona es un arreglo de BO_Persona)

Nota: Las anteriores especificaciones también se pueden modificar en el archivo wsdl que genera el BPEL.


Como vemos anteriormente, la salida de este proceso BPEL síncrono será  ArrayPersona, que es el objeto que llenaremos con la lectura de los archivos Persona.txt y telefonos.txt

Ahora en el proceso BPEL arrastramos un File Adapter en el cuál se leerá el archivo plano Persona.txt. Éste será de tipo "Synchronous Read File". La configuración de este File Adapter es similar al Read File pero no tendrá polling.


Luego de crear el Synchronous Read File para Persona.txt lo haremos igualmente para Telefonos.txt. Nuestro BPEL se verá de la siguiente manera:


Al momento de crear las variables de para los Invoke es importante definir las variable input y output para cada uno.

Después de esto hacemos la transformación  para crear ArrayPersona con los datos de los archivos planos de la siguiente manera:




Finalmente nuestro proceso BPEL se verá de la siguiente manera:

¿Quieres compartir esta publicación?

miércoles, 31 de julio de 2013

¿Cómo insertar un registro a una tabla de la base de datos desde un popUp en Oracle ADF?

Este tutorial fue realizado en jDeveloper 11.1.1.7.0 y su objetivo es insertar un registro a una tabla de la base de datos ingresando los datos del nuevo registro en un popUp.

Para este tutorial tenemos la siguiente tabla de Observaciones y  botón "Agregar Observación" en el fragmento "Fragmento.jsff".


Tenemos un popUp que contiene un Dialog y necesitamos agregar un nuevo registro en la tabla de la base de datos. Es necesario arrastar desde los Data Controls el View Object referente a la tabla de la base de datos que estamos trabajando, en este caso es "ObservacionesView1".



Vamos a popUp -> Propety Inspector -> Common -> PopUpFetchListener creamos la función "editPopUpListener", y en popUp -> Propety Inspector -> Common-> PopUpCanceledListener creamos la función "editPopUpCancelListener", en el Manage Bean del fragmento: "FragmentoBean.java".

Además cambiamos la propiedad de Common-> ContentDelivery a lazyUncached.


Luego nos dirigimos hacia la pestaña Bindings de la página y añadimos 3 bindings de tipo "action": "CreateInsert" , "Commit" y "Rollback". Como vemos todas estas acciones hacen referencia al Iterador: "ObservacionView1Iterator" del View Object "ObservacionView1" que estamos trabajando.



Para ejecutar un "action" desde el ManageBean de la página o fragmento podemos utilizar la siguiente función:
    public Object executeAction(String actionName) {
            BindingContainer bindings = BindingContext.getCurrent().getCurrentBindingsEntry();
            OperationBinding operation = bindings.getOperationBinding(actionName);
            return operation.execute(); }

Luego implementamos los métodos "editPopUpListener"  y "editPopUpCancelListener":

   public void editPopUpFetchListener(PopupFetchEvent popupFetchEvent) {
        executeAction("CreateInsert");   }

  public void editPopUpCalcelListener(PopupCanceledEvent popupCanceledEvent) {
    executeAction("Rollback"); }

Ahora vamos nos dirigimos hacia las propiedades del  Dialog que se encuentra dentro del popUp y añadimos un método en Dialog-> Property Inspector -> Behavior -> DialogListener


En la función OKDialog que acabamos de crear, implementamos lo siguiente:

  public void OKDialog(DialogEvent dialogEvent) { 
    Outcome outcome = dialogEvent.getOutcome();
            if (outcome == Outcome.ok){
              executeAction("Commit");}
          else if (outcome == Outcome.no){
               executeAction("Rollback");}}
¿Quieres compartir esta publicación?

¿Cómo obtener la fila actual (currentRow) de una tabla en Oracle ADF?


Este tutorial fue realizado en jDeveloper 11.1.1.7.0 y su objetivo es obtener la fila actual de una tabla al oprimir un botón.

Por ejemplo tenemos la siguiente tabla, en la cual deseamos obtener el valor de "NumDocumento"  de la fila actual cuando se oprima el botón "Ver".



Seleccionamos el botón "Ver", nos dirigimos hacia Source y veremos sombreado las propiedades del botón en la página o fragmento. Dentro de el código de este botón agregamos la siguiente línea:

 <f:attribute name="rowID" value="#{row.NumDocumento}"/> 


De lo anterior se indica que se creó un atributo "rowID" que nos dará el valor de "NumDocumento" de la fila actual.

Finalmente creamos una evento en el ActionListener del botón "Ver" y en el método obtenemos el valor de la fila que deseamos de la siguiente manera:

   public void obtenerFilaActual(ActionEvent actionEvent) {
    Object ob = actionEvent.getComponent().getAttributes().get("rowID");
    System.out.println("ob: "+ob); }
¿Quieres compartir esta publicación?