El Rincón del Código para ADF

1

Pese a que había accedido a muchos de los artículos directamente, no había podido encontrar la página principal del  ADF Code Corner, afortunadamente y gracias al articulo publicado por Frank en el nuevo blog del equipo de Developement Tools, me fue posible encontrar el acceso.

Como se explica en el artículo, cualquier persona puede aportar artículos al rincón del código, la diferencia es que estos son un poco más formales que un artículo de blog. Para publicar un artículo lo único que requiere es obtener la plantilla y enviar el articulo a Frank.

Por este lado ya deje el enlace en la sección de Links Relacionados.


Entrenamiento de 5 dias para Partners en ADF 11g

0

Como anunció Shay en su blog. Para todos los que trabajen en compañías Partners de Oracle y quieran tener un entrenamiento avanzado en ADF 11g, compren sus tíquetes para San Francisco para la semana del 27-31 de Octubre. Nos vemos en la Casa Matriz de Oracle (aka Headquarters). Aquí pueden encontrar más información al respecto.

Si están asistiendo al entrenamiento no duden en contactarme, podríamos realizar una cena con todo el grupo y extender los lazos de amistad entre la comunidad Hispana de ADF.


Finalmente el Patchset 10.1.3.4 para SOA Suite fué liberado

0

Al igual que indicó Juan que JDEV 10.1.3.4 había sido liberado, el parche para llegar a 10.1.3.4 en Oracle AS y Oracle SOA Suite también fué finalment liberado y está disponible en otn.oracle.com

Este parche además de contener las soluciones a bugs tiene características nuevas sobre productos como BPEL PM y Oracle ESB.

Si ustedes tienen una instalación de SOA Suite 10.1.3.1 o bien sólo de BPEL PM 10.1.3.1 o ESB 10.1.3.1 pueden aplicar este parche directamente y así en un solo paso estar actualizando toda la plataforma.

Se recomienda también hacer uso de SOA Suite 10.1.3.4 con JDEV 10.1.3.4, así tanto tiempo de diseño como de ejecución estarán actualizados.



Pasando Parámetros a una Página desde un Bean

1

El requerimiento es que se quiere pasar algún tipo de información a la Interfase del Usuario, esta información es generada a través de un Bean. La idea es que en el momento que la página sea desplegada se presente la información.

En este ejemplo vamos a crear un Bean llamado myTest el cual contiene un método que retorna una cadena de caracteres. El objetivo es utilizar este método para asignar el título a una página. El codigo del Bean es:

public class MyTest {
    public MyTest(){
    }
        public String retornaCadena(String myString){
            String result = "Navegando en el Departamento: "+myString;
            System.out.println(result);
            return result;
        }
}DataControl

Luego creamos un Datacontrol para este bean el cual nos va permitir hacer el binding a este método. Esta no es la única forma en que podemos exponer la lógica para las interfaces, podríamos también empaquetar este bean y su data control dentro de un archivo JAR e importarlo en otros proyectos, esto nos va a permitir visualizar el Data control de la misma forma.

 

A continuación creamos un par de proyectos, uno para los serviciPaginaInicialos (lógica de negocio) y otro para el UI. Por el lado de los servicios para este ejemplo vamos a crear Business Components para la tabla Departments del esquema HR. Para la interfase de usuario creamos una nueva página JSF y adicionamos un panelHeader y una forma de lectura (Read Only Form) con opciones de navegación del Departamento.

methodBinding Para asignar el encabezado del panelHeader utilizando el método, vamos al tab de bindings, creamos un nuevo MethodAction binding donde seleccionamos le método del datacontrol y al parámetro de entrada vamos a utilizar el binding del nombre del departamento.

Este binding requiere de algún ejecutable para poder ser invocado por lo cual creamos también un nuevo ejecutable de tipo invokeAction, buscamos el methodBinding que acabamos de crear y damos un id cualquiera. Una vez lo hayamos definido ajuste la propiedad de refresh de este ejecutable a ifNeeded, esto hace que cada vez que naveguemos a otro departamento el método va a ser ejecutado.

Finalmente para asignar el encabezado tenemos que crear un variableIterator en los ejecutable que mapee la variable de retorno del método y un attributeValue binding. Sin embargo esta parte la podemos hacer de manera automática si dentro de la página arrastramos y soltamos el valor de retorno del método y lo mapeamos como un outPutText, luego si volvemos a los bindings vamos a poder ver la estructura creada de esta forma:resultado

 

 

 

 

El código objetivo en el pageDef es:

<executables>

...
    <invokeAction Binds="retornaCadena" id="invocaMetodo" Refresh="ifNeeded"/>
    <variableIterator id="variables">
      <variable Type="java.lang.String" Name="retornaCadena_Return"
                IsQueriable="false" IsUpdateable="0"
                DefaultValue="${bindings.retornaCadena.result}"/>
    </variableIterator>
  </executables>
  <bindings>
...       

<methodAction id="retornaCadena" InstanceName="MyTest.dataProvider"
                  DataControl="MyTest" RequiresUpdateModel="true"
                  Action="invokeMethod" MethodName="retornaCadena"
                  IsViewObjectMethod="false"                  ReturnName="MyTest.methodResults.retornaCadena_MyTest_dataProvider_retornaCadena_result">
      <NamedData NDName="myString" NDValue="${bindings.DepartmentName}"
                 NDType="java.lang.String"/>
    </methodAction>
    <attributeValues IterBinding="variables" id="Return">
      <AttrNames>
        <Item Value="retornaCadena_Return"/>
      </AttrNames>
    </attributeValues>
  </bindings>

Para finalizar en la propiedad Text del panelHeader ya podemos hacer el binding del resultado del método #{bindings.Return.inputValue} y tendriamos como página terminada

resultadoFinal

Este ejemplo aplica cuando se quiere determinar de manera dinámica los strings de una página a través de un ResourceBundle o también enviar valores calculados bajo cierta lógica.


ROI de BPM

0

En los últimos días he estado platicando con 2 clientes que tienen inquietud sobre el ROI que uno puede presentar al comité para justificar una inversión sobre tecnlogía BPM.

Me llegó este artículo a mi email que puede ser interesante para todos:

http://www.ebizq.net/hot_topics/bpm/features/9958.html?page=1

En Oracle existe una herramienta para hacer assesments sobre SOA, que igualmente es ideal para tener un sustento para justificar internamente, ésta la pueden encontrar en: http://www.oracle.com/soa


Los Tipos de Listas de Valores y Algunos Tips

1

En estos días estuve trabajando con un requerimiento de un proyecto en el cual detectamos algunas características especificas de las listas de valores en JDev11g, a partir de lo cual decidí crear esta entrada. Dado que en post anteriores ya he presentado las bases en como crear las listas de valores, en este articulo voy a explicar brevemente los distintos tipos que se tienen en JDev11g, así como también algunos tips para trabajarlas.

Vamos a presentar los distintos Departamentos de una organización como una lista de valores; internamente el atributo que nos interesa es el ID del departamento (departmentId), sin embargo para el UI la idea es presentar el nombre del mismo (departmentName).

Types

Los tipos que tenemos desde el Modelo en el cual definimos la lista son:

Choice List y Combo Box: Es la opción a elegir para obtener un af:selectOneChoice o la lista de valores tradicional. La unica diferencia es que con combo boxes se puede tener un historial de los elegidos previamente.

ComboBox with List of Values: Esta opción se renderiza como un af:inputComboboxListOfValues esta lista de valores se puede presentar directamente como un look and feel más AJAX, o también tiene la funcionalidad automática de presentar un componente de busqueda. comboInput

Muy util para cuando se requiere hacer un query sobre otra tabla para obtner este valor. Una característica de esta lista es que si en un backing bean hacemos ejecutamos getValue(), esta lista nos va a devolver por defecto el número correspondiente a la posición, más no el ID. Si queremos obtener el valor, en el binding de la lista ajustamos la propiedad includeSelectionAttr

binding

Input Text with List of Values: Parecido al anterior pero en este caso el UI se presenta como una lupa de busqueda, renderiza como un af:inputListOfValues, la cual puede activar una busqueda o puede hacer un query directo a la fuente de datos, si se quiere hacer la busqueda sobre otra tabla, es ideal.

inputTextWListList Box: Presenta la lista dentro de una caja de opciones, ideal cuando se quiere seleccionar más de un valor. Se renderiza como un af:selectOneListBox.

listBox

 

Estas presentaciones de listas pueden también ser intercambiadas en la interfaz gráfica así como también los tipos de bindigs, de las mismas.  Para cambiar una lista desde la interfaz, solo basta con ir a la estructura, seleccionar la lista de valores, click derecho y hacer click en Convert. Esto también se puede hacer directamente sobre el diseñador gráfico.

Otro de los elementos que se puede configurar desde la definición a través del VO es la opción de búsqueda. Esta opción permite crear un pop-up para realizar una búsqueda la fuente de datos de la lista (lo cual puede ser otro VO y en este caso lo que se hace es ejecutar el query con base en ciertos parámetros.

El o los valores que se retornan, una vez se escoge un elemento de la lista es también configurable, lo cual es una opción es muy útil si requerimos asignar más de un valor sobre atributos del VO base.

returnValues 

El binding de las listas de valores puede ser de 2 tipos List binding o ListOfValue binding. El segundo nos da una serie de opciones avanzadas para configurar el comportamiento de la lista, normalmente de acuerdo como se defina la lista desde el VO este binding se hace de manera automática, sin embargo a través del PageDef podríamos cambiar entre uno y otro.


Refresh de Pooling de Conexiones Remoto a través de MBeans.

6

Este es una aportación de Andrés Ramírez de Perú. El tuvo un issue de refresh de Pooling de Conexiones hacia BD, sobre todo al modificar el cuerpo de un paquete almacenado. El decidió realizarlo a través de Mbeans controlando el pool de conexiones. Aquí la descripción de cómo lo hizo (gracias Andrés):

1. UTILIZACION de Mbeans

1.1. Mediante la consola de administración: Oracle Enterprise Manager

a. Ingresar a la instancia deseada (oc4j_soa)

clip_image003

b. Ir a la pestaña de administración

clip_image006

c. Ir a la sección de “Búsqueda de MBeans"

clip_image009

d. Buscar el recurso deseado (OrdenesCP – Connection Pool)

clip_image012

e. Ir a la pestaña de Operaciones e ingresar al método (refreshConnectionPool)

clip_image016

f. Invocar Método

clip_image019


1.2. Aplicaciones Custom: Java JMX en JDeveloper

a. Ingresar al Jdeveloper y crear la siguiente estructura:

clip_image021

b. En las propiedades del Proyecto (MBeansTest) agregar las siguientes librerias:

clip_image023

Ubicaciones de los Jars:

C:\Jdeveloper\j2ee\home\lib\jmx_remote_api.jar

C:\Jdeveloper\j2ee\home\lib\jmxcluster.jar

C:\Jdeveloper\j2ee\home\lib\jmxri.jar

C:\Jdeveloper\j2ee\home\oc4jclient.jar

C:\Jdeveloper\opmn\lib\ons.jar

C:\Jdeveloper\opmn\lib\optic.jar

C:\Jdeveloper\j2ee\home\lib\adminclient.jar

Nota: Agregar la Libreria J2EE desde la opción: Add Library...

c. Definir la clase MBeansClient.java (Ver Anexo 1)

ANEXO 1

package mbeanstest;

import java.io.IOException;

import java.net.MalformedURLException;

import java.util.Hashtable;

import java.util.Iterator;

import java.util.Set;

import javax.management.AttributeNotFoundException;

import javax.management.InstanceNotFoundException;

import javax.management.InvalidAttributeValueException;

import javax.management.MBeanException;

import javax.management.MBeanServerConnection;

import javax.management.MalformedObjectNameException;

import javax.management.ObjectName;

import javax.management.ReflectionException;

import javax.management.remote.JMXConnector;

import javax.management.remote.JMXConnectorFactory;

import javax.management.remote.JMXServiceURL;

import oracle.oc4j.admin.jmx.remote.api.JMXConnectorConstant;

public class MBeansClient {

//URL del OC4J Single

private static final String OC4J_SOA_URL =

"service:jmx:rmi:///opmn://172.20.1.92:6005/oc4j_soa";

//URL del OC4J Cluster

private static final String CLUSTER_OC4J_SOA_URL =

"service:jmx:rmi:///opmn://172.20.1.92:6005/cluster";

//Nombre del recurso MBean

private static final String MBEAN_OBJECT_NAME =

"oc4j:j2eeType=JDBCResource,name=\"OrdenesCP\",J2EEApplication=default,J2EEServer=standalone";

//Nombre del grupo (cluster) MBean

private static final String CLUSTER_MBEAN_OBJECT_NAME =

"ias:j2eeType=J2EEServer,name=oc4j_soa,J2EEServerGroup=default_group,ASInstance=soa.test.com";

//Nombre del método del MBean

private static final String MBEAN_METHOD_NAME =

"refreshConnectionPool";

//Credenciales del Administrador

private static final String USERNAME = "oc4jadmin";

private static final String PASSWORD = "oracle10g";

public MBeansClient() {

}

//Crear conexion con el Servidor MBeans

public MBeanServerConnection getMBeanConnection(String URL) throws MalformedURLException,

IOException {

JMXConnector jmxConnector = null;

JMXServiceURL serviceUrl = new JMXServiceURL(URL);

Hashtable env = new Hashtable();

env.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES, "oracle.oc4j.admin.jmx.remote");

Hashtable credentials = new Hashtable();

credentials.put(JMXConnectorConstant.CREDENTIALS_LOGIN_KEY, USERNAME);

credentials.put(JMXConnectorConstant.CREDENTIALS_PASSWORD_KEY, PASSWORD);

env.put(JMXConnector.CREDENTIALS, credentials);

jmxConnector = JMXConnectorFactory.newJMXConnector(serviceUrl, env);

jmxConnector.connect();

MBeanServerConnection mBeanServerConnection = jmxConnector.getMBeanServerConnection();

return mBeanServerConnection;

}

//Método que muestra todos los MBeans disponibles

public void printAllMBeans(MBeanServerConnection mBeanServerConnection) throws IOException {

System.out.println(" \n\n Imprimiendo todos los MBean ");

Set mbeans = mBeanServerConnection.queryNames(null, null);

Iterator iter = mbeans.iterator();

while (iter.hasNext()) {

System.out.println(iter.next().toString());

ObjectName objectName = (ObjectName)iter.next();

System.out.println(" domain " + objectName.getDomain() + " " + objectName.getKeyPropertyListString());

}

System.out.println(" Fin de impresion \n\n ");

}

//Método que invoca a la operación "refreshConnectionPool" perteneciente al recurso "OrdenesCP" en una sola instancia OC4J

private void testSingle() throws MalformedURLException, IOException,

MalformedObjectNameException,

InstanceNotFoundException, MBeanException,

ReflectionException,

AttributeNotFoundException,

InvalidAttributeValueException {

MBeanServerConnection mBeanServerConnection = getMBeanConnection(OC4J_SOA_URL);

//printAllMBeans(mBeanServerConnection);

ObjectName objectName = new ObjectName(MBEAN_OBJECT_NAME);

System.out.println("\n\n Invoke Method over single oc4j ............");

Object invokeMethodReturnObject =

mBeanServerConnection.invoke(objectName, MBEAN_METHOD_NAME, null,

null);

//El retorno será = null pues la operacion es de tipo void

System.out.println(" Single invokeMethodReturnObject " +

invokeMethodReturnObject);

}

//Método que invoca a la operación "refreshConnectionPool" perteneciente al recurso "OrdenesCP" en un grupo (cluster) OC4J

public void testCluster() throws MalformedURLException, IOException,

MalformedObjectNameException,

InstanceNotFoundException, MBeanException,

ReflectionException,

AttributeNotFoundException,

InvalidAttributeValueException {

MBeanServerConnection mBeanServerConnection = getMBeanConnection(CLUSTER_OC4J_SOA_URL);

//printAllMBeans(mBeanServerConnection);

ObjectName clusterObjectName = new ObjectName(CLUSTER_MBEAN_OBJECT_NAME);

ObjectName customObjectName = new ObjectName(MBEAN_OBJECT_NAME);

Object[] invokeMethodParameters =

new Object[] { customObjectName, MBEAN_METHOD_NAME, null, null };

String[] invokeMethodSignature =

new String[] { "javax.management.ObjectName", "java.lang.String", "[Ljava.lang.Object;", "[Ljava.lang.String;" };

System.out.println("\n\n Invoke Method over cluster oc4j ............");

Object invokeMethodResult =

mBeanServerConnection.invoke(clusterObjectName, "invoke", invokeMethodParameters, invokeMethodSignature);

//El retorno será = null pues la operacion es de tipo void

System.out.println(" Cluster invokeMethodResult object is " + invokeMethodResult);

}

public static void main(String[] args) throws MalformedURLException,

IOException,

MalformedObjectNameException,

InstanceNotFoundException,

MBeanException,

ReflectionException,

AttributeNotFoundException,

InvalidAttributeValueException {

MBeansClient mBeanClient = new MBeansClient();

mBeanClient.testSingle();

mBeanClient.testCluster();

}

}

Especificaciones:

1.Modificar el IP del servidor y el puerto “Request” del opmn según corresponda. De igual modo, especificar el nombre correcto del OC4J correspondiente a la instalación del SOA Suite.

2. Modificar el IP del servidor y el puerto “Request” del opmn según corresponda.

3. El nombre correcto del MBean puede ser encontrado de la siguiente manera:

Ir al EM console –> oc4j_soa –>Administration –> System MBean Browser –> Cluster MBean Browser –> Operations –> getAttribute –> clip_image033 -> Buscar el recurso deseado

4. El nombre correcto del Cluster MBean puede ser encontrado de la siguiente manera:

Ir al em console –> oc4j_soa –> Administration –> System MBean Browser à Cluster MBean Browser -> Copiar el MBean Name

5. Especificar las credenciales apropiadas


Pasamos los 500 Artículos en Ingles

0

El día de hoy pasamos la barrera de los 500 artículos y ejemplos prácticos de ADF y JDeveloper coleccionados en un único repositorio. Estos artículos son en ingles y han sido escritos por bloggers de todo el mundo que quieren compartir sus experiencias y conocimiento sobre el ADF y JDeveloper.

Cualquier persona puede hacer búsquedas sobre este repositorio a través de la página principal de JDeveloper así como también pueden acceder al RSS feed del mismo o a través de la extensión que expliqué en un post anterior. Por nuestro lado (blogs en español) llevamos un total de 28 artículos + los que se encuentran en este blog asociados con ADF/JDeveloper y SOA.


xsi:type en Oracle BPEL PM 10.1.3.x ???

0

En semanas pasadas en un proyecto de implementación de BPEL PM en un cliente en México me encontré que uno de los servicios que se tenían que consumir desde Oracle BPEL PM, requerían forzosamente el uso del atributo xsi:type que algunos Web Services viejos requieren para ser ejecutados.

Este atributo sirve para explícitamente determinar el tipo del elemento que se está enviando, y hace un override al determinado en el namespace de dicho elemento.
En mi caso, si no específicaba el uso del atributo simplemente no obtenía respuesta correcta del servicio. Evidentemente la gente que lo había desarrollado no tenía forma de quitarle eso.
Afortunadamente hay un parámetro que se coloca en el bpel.xml del proceso BPEL que esté invocando al servicio, en donde puedes indicar si requieres de enviar o no el xsi:type. Esta información la encontró el consultor del partner que está implementando el proyecto (gracias Toño).

El parámetro es el siguiente:

Con ésto a nivel de partnerlink puede determinar el uso y envío del xsi:type en el body del mensaje soap.


Post navigation