miércoles, 16 de abril de 2014

Solución a el problema de IE 11 o IE 10 con Oracle Adf 11g

Entradas de oracle con el bug:
https://blogs.oracle.com/jdeveloperpm/entry/oracle_jdeveloper_and_adf_patches




Recientemente Microsoft ha lanzado su nueva versión 11 de Internet Explorer. En el desarrollo de ADF-aplicaciones la pregunta más obvia es, por supuesto: ¿mi aplicación seguirá funcionando? La respuesta corta es: no, usted tiene que esperar hasta que Oracle lleva a cabo un nuevo parche. Cuando intenta ejecutar la aplicación, usted recibirá un mensaje emergente en el hecho de que usted está utilizando una versión del navegador no compatible...


Y la buena noticia es que hemos encontrado una solución que funciona para Internet Explorer 11.

Empecemos:

 Cuando ADF recibe una solicitud del "browser" en las cabeceras determina el "user-agent" del navegador, en versiones anteriores a IE 11, estas concordaban con la versión del navegador por ejemplo Internet Explorer 10, escribíamos un meta-tag <meta http-equiv="X-UA-Compatible content="IE=10.0">, el problema ha venido en la version IE11 que en la cabecera se cree que viene un navegador tipo "Gecko-like Browser".

Entonces lo que haremos será crear un filtro, que determine el "user-agent" que estamos usando, y si proviene de un IE 10 o IE 11, lo remplazaremos para que ADF piense que viene de un Internet Explorer 9, y establezca los meta-tag adecuados.

Aclarado todo el proceso ha realizar sigamos con la parte programática:

Lo primero que haremos es crear la clase:


 package view;  
   
 import java.io.IOException;  
   
 import javax.servlet.Filter;  
 import javax.servlet.FilterChain;  
 import javax.servlet.FilterConfig;  
 import javax.servlet.ServletException;  
 import javax.servlet.ServletRequest;  
 import javax.servlet.ServletResponse;  
 import javax.servlet.http.HttpServletRequest;  
 import javax.servlet.http.HttpServletRequestWrapper;  
   
   
 public class IECompatibleFilter implements Filter {  
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
      String userAgentStr = ((HttpServletRequest)request).getHeader("user-agent");  
     // Comprobamos el user-agent utilized y devolvemos la header  
     if (userAgentStr != null && (userAgentStr.contains("MSIE 1") || 
                                     userAgentStr.contains("Trident"))) {  
       ServletRequest wrappedRequest = new WrapperRequest((HttpServletRequest)request);  
       chain.doFilter(wrappedRequest, response);  
     } else {  
       chain.doFilter(request, response);  
     }  
   }  
   
   public void destroy() {  
   }  
   
   public void init(FilterConfig arg0) throws ServletException {  
   }  
   
   private class WrapperRequest extends HttpServletRequestWrapper {  
     public WrapperRequest(HttpServletRequest request) {  
       super(request);  
     }  
   
     public String getHeader(String name) {  
       // IE 10: remplazamos IE10 por IE9 
       HttpServletRequest request = (HttpServletRequest)getRequest();  
       if ("user-agent".equalsIgnoreCase(name) && request.getHeader("user-agent").contains("MSIE 10")) {  
         return request.getHeader("user-agent").replaceAll("MSIE [^;]*;", "MSIE 9.0;");  
       }  
       // IE 11: remplazamos IE11 por IE9  
       if ("user-agent".equalsIgnoreCase(name) && request.getHeader("user-agent").contains("Trident")) {  
         String newAgentStr = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.2; Trident/6.0)";  
         return newAgentStr;  
       }  
       return request.getHeader(name);  
     }  
   }  
 }  


Ahora crearemos el filtro en el "web.xml"


<filter>  
   <filter-name>IECompatibleFilter</filter-name>  
   <filter-class>view.IECompatibleFilter</filter-class>  
  </filter>  
<filter-mapping>  
   <filter-name>IECompatibleFilter</filter-name>  
   <servlet-name>Faces Servlet</servlet-name>  
  </filter-mapping>  
  <filter-mapping>



Gracias por su atención, y un saludo.

Rafael Prada Gómez


martes, 15 de abril de 2014

View Objects Operaciones

View Objects representa la estructura de datos del negocio, y la lógica del negocio que se contiene las entidades.

Operaciones:

Create: Crea una nueva Row en la vista, esta nueva fila no se incluye en la transacción.

CreateInsert: Crea una nueva Row en la vista, esta nueva fila se incluye en la transacción.

CreateWithParameter: Crea una nueva Row en la vista, además se le pueden añadir valores por defecto añadiendo el componente "NamedData" en la pagina de definición de binding.

Delete: Elimina el Current Row de la vista.

SetCurrentRowWithKey: Cambia el Current Row de la vista, a la Key señalada.

RemoveRowWithKey: Elimina la Row con la Key indicada.




Gracias por su atención, y un saludo.

Rafael Prada Gómez

domingo, 23 de marzo de 2014

Override Commit en AppModule, Oracle Adf 11g

Hoy nuestra idea es crear un commit personalizado, para cuando se realice la operación commit, ya sea mediante Task Flow o programáticamente, podemos hacer operaciones tanto en commit como en rollback y en su before y en su after.

La idea final es realizar una auditoria sobre cada operación que se realice en nuestra aplicación.

Lo primero que debemos realizar son 2 clases java.

La primera "CustomDatabaseTransactionFactory.java", extenderá de "DatabaseTransactionFactory".


La segunda "CustomDataBaseImpl" extenderá de "DBTransactionImpl2".


Ya realizadas las dos clases con sus respectivos métodos, Nos vamos al "appModule", y nos vamos a su configuración.

Dentro de su configuración pulsamos en "appmoduleLocal". 

En las propiedades buscamos la opción "TransactionFactory", y modificamos con nuestra ruta del java creado anteriormente con nombre "CustomDatabaseTransactionFactory.java".


Con todo esto tenemos un "override" de las operaciones, ahora podremos usarla para nuestra necesidad, en este caso cada vez que se haya realizado un commit, leeremos todas las transacciones, miraremos su estado "nuevo registro/modificado/eliminado ...", y con toda la información recogida alimentan su auditoria.


Gracias por su atención, y un saludo.

Rafael Prada Gómez



sábado, 22 de marzo de 2014

Adf - viewCriteriaItem con séntencia SQL

Hoy explicaremos una forma muy fácil de utilizar una sentencia sql dentro de un viewCriteria.

En nuestro ejemplo filtraremos todos nuestros empleados que tengan un salario superior a la media, y es el que mostraremos al usuario.

Basándonos en una VO simple, creamos un  viewCriteria, le añadimos la opción "Salary".



Después nos vamos al XML, y nos posicionamos en el viewCriteriaItem del salario, y añadimos la propiedad "isSqlFragment".

Seguidamente al volver al "overView", he insertamos en el valor la sentencia SQL.
"(SELECT AVG(SALARY) AVG_SAL FROM EMPLOYEES)".

En la pestaña de "UI Hints", seleccionamos en el "rendered", nunca.

Al generar el viewCriteria dentro de una página, vemos el resultado.
Empero como siempre que esto les haya servido de gran ayuda.

Rafael Prada Gómez 





lunes, 17 de marzo de 2014

Uso de Jquery y JavaScript en Oracle Adf

Hoy utilizaremos Javascript para el lanzamiento de mensaje "message" en Adf y nos apoyaremos en Jquery para hacerlo visualmente atractivo.


Lo primero que haremos es utilizar el formulario del otro día y añadirle un botón, con la función de guardar.


Las funciones JavaScript que usaremos son:


 En resumen estas funciones colocan una capa durante 2 segundos con el texto recibido en parámetros.

En el formulario no se nos puede olvidar aplicar "resources" aplicando el "js" y los Jquery.


En la funcionalidad del boton, haremos un commit programático, después comprobaremos que sea realizado commit correctamente.

Y mostraremos el mensaje de confirmación.


Resultado final:


Con unos sencillos pasos hemos incrustado un mensaje atractivo dentro de nuestro proyecto.

Rafael Prada Gómez.






viernes, 14 de marzo de 2014

LOV (List Of Value) Creación de lista de valores.

Hoy veremos un ejemplo muy sencillo de como crear un LOV "Lista de valores" en Oracle Developer 11g.

Esta opción es realmente útil, cuando usamos "foreing key" o un atributo tiene una lista de valores ya predeterminada.

En nuestro ejemplo un empleado, esta asociado a un departamento, la "foreign key" es DepartmentId.




Generamos la vista de department, una VO sencilla la llamaremos "DepartmentView"y la de empleados "EmployeesView".
Agregamos un nuevo ViewAccessor.


Seleccionamos al vista creada anteriormente.


A continuación nos situamos en la "foreign key", en la etiqueta "List of Value, seleccionamos la vista agregada en el ViewAccessor y despues la "primary key" por la que hace referencia.


En la siguiente pestaña, podremos señalar que tipo de componente queremos que nos salga en los formularios o en los demás sitios donde vayamos a usarlo, como por ejemplo en un componente "af|query".

Tiene varias opciones muy interesantes, como es (include "No Selection" item), con esto conseguiremos que en la lista de valores exista el campo null.
Esta opción es bastante útil a la hora de implemente ViewCriterias.

Ahora al arrastrar el data control en DepatmentId nos muestra por defecto otra opción que es "Select One Choine".



Resultado final:

Hemos conseguido crear una lista de valores rápidamente, sin necesidad de tener mas de una entidad en un view y tener que realizar los respectivos join.



Empero como siempre que esto les haya servido de gran ayuda.

Rafael Prada Gómez 








martes, 11 de marzo de 2014

Busquedas e implementación mediante ViewCriteria en Adf

En esta tarde explicaremos como realizar un viewCriteria con los componentes "af:query" y "af:table".

Con el componente "af:query" implementado a partir de la versión 11g realizaremos las funciones de búsqueda con mucho menor coste que anteriormente.

Para empezar generamos una VO sencilla de empleados "EmployessView".


Añadimos un "ViewCriteria" e incorporamos los distintos criterios de búsqueda que deseamos incluir en nuestro panel de búsqueda.


Ademas en la segunda pestaña podremos seleccionar, tanto el "Query automatically" para que se ejecute la query automáticamente, como marcarle el tipo de Rendered que deseamos en cada criterio y el tamaño que llevara.





Con esto hemos generado un ViewCriteria donde se vería reflejado en el apartado de "Named Criteria" dentro de los "Data Control".
Automáticamente se genera un componente "af:query" y su tabla correspondiente.


Empero como siempre que esto les haya servido de gran ayuda.

Rafael Prada Gómez