pretify

miércoles, 2 de octubre de 2013

Adding an item to richfaces datascroller and positioning in it

The thing is not that hard, but also helps exemplify a tunnel vision case. There is a web application which uses RichFaces that has a form in which there are a datatable for data input. When the user wants to add a new item, she clicks on a link that adds a new line. I obviously needed to focus the user on the added item. Well, this one was my inner conversation with myself:

- How can I do this?
- Oh! That's easy! just use javascript! What's the problem?
- Yes, but the thing is that I can have several pages in that input, so first, I need to go to the page.
- Well, then you first use switchToPage

And I ended up with the same problem described in http://stackoverflow.com/questions/7902627/onchange-richcomponentds-switchtopagethis-value-in-richfaces.

So I started to look the way to make this an asynchronous call even without being able to understand how my request became an asynchronous one. And here is where tunnel vision appeared. I spent a lot of time trying to understand this, and trying to solve it in the link component by using javascript in several ways.

Finally, almost accidentally I found a very simple solution in https://community.jboss.org/thread/148679?start=0&tstart=0. It was completely different from the thing I was trying to do. The solution was extremely obvious once I get to it (as it always is). Not use only the link component but also the dataScroller component:

<a4j:commandLink id="addLink" action="#{myMB.add}" render="tableItems msg" execute="@form" oncomplete="#{rich:component('myScroller')}.switchToPage(#{myMB.lastPage});">

and
<rich:dataScroller id="myScroller" page="#{myMB.page}" execute="@form" oncomplete="document.getElementById('frm1:tableItems:#{myMB.lastAdded}:myFirstInput').focus();"/>

martes, 9 de abril de 2013

Cliente WS

Necesité generar un cliente para un servicio web que trabaja con SSL en un servidor corriendo sobre protocolo https. Por ejemplo: https://ws.proveedor.service.org/service/service.asmx?WSDL

Al intentar generar las clases utilizando wsimport me encontré con un error que entre líneas se vería similar a lo siguiente:

sun.security.validator.ValidatorException: PKIX path building failed: unable to find valid certification path to requested target.

Tras buscar en internet encontré la respuesta en [1]. Así que para resolverlo fue necesario descargar desde [2] una clase que se escribió para instalar un certificado. Luego se ejecuta el comando:

java InstallCert ws.proveedor.service.org

Esto escribe el archivo jssecacerts en el directorio desde el cual se ejecute este comando. Este archivo deberá ser copiado en $JAVA_HOME$/jre/lib/security


[1] https://blogs.oracle.com/gc/entry/unable_to_find_valid_certification
[2] http://code.google.com/p/java-use-examples/source/browse/trunk/src/com/aw/ad/util/InstallCert.java

jueves, 17 de enero de 2013

ViewScoped y composite components

He tenido que crear un componente compuesto en jsf 2.0 y durante la construcción del bean administrado me encontré con el siguiente comportamiento:

Si el managed bean está anotado @ViewScoped, y se quiere agregar un Session bean @EJB, éste último debe ser transitorio (@Transient). Pero en este caso, si se define en el componente un método y se pretende utilizar, se obtiene un error que indica que no encuentra la propiedad del nombre del método en el managed bean.

Entonces, para mi caso la solución fue modificar el managed bean para que fuera @RequestScoped, el Session bean inyectado ya no necesita ser transiente, y el componente entiende correctamente que el atributo definido como un método es efectivamente un método y no una propiedad.

La razón, se hace evidente entonces. @ViewScoped requiere que sus atributos sean o bien transitorios o bien serializables pues para mantener la vista entre peticiones tendrá que enviar su estado en el request, o almacenarlo en la sesión.

Mala decisión con dozer y proyectos dependientes

Como ya entendí que no soy un escritor, limitaré mis entradas en el blog a construir memoria. Así, esta primera entrada de este nuevo intento será para que luego no se me olvide recordar que al utilizar dozer, si se decide hacer una locura (creo que bestialidad sería una palabra más adecuada) como la siguiente, se tendrán inconvenientes para probar.

Proyecto A, depende de proyecto B.

En proyecto B se crea un archivo dozer en el que se establecen relaciones entre clases del proyecto B. Hasta ahí todo bien (o casi todo bien debería decir, pues sería mejor crear un dozer para cada relación entre clases?). Pero además se incluye una relación con una clase del proyecto A (esta es la casi segura bestialidad). Al intentar ejecutar pruebas de unidad (junit), me encontraré con que la clase del proyecto B no existe:

org.dozer.MappingException: java.lang.ClassNotFoundException:

miércoles, 7 de diciembre de 2011

Instalando utplsql

Estaba tratando de instalar una aplicación (específicamente utplsql), que está escrita en pl-sql. Esta tarea se reduce a la ejecución de los scripts correspondientes y durante su ejecución me encontraba con errores, del cual el primero fue:
SP2-0734: unknown command beginning rest of line ignored

Tras encontrar varias soluciones planteadas para atacar este error me percaté que el archivo podía utilizar el formato de fin de línea tipo unix (yo estoy instalando utplsql en windows). Entonces, la solución fue modificar los archivos para que utilicen el formato de fin de línea tipo windows.

Yo lo hice descargando la aplicación que se encuentra en [1], y creando un script que ejecutara la aplicación con todos los archivos de la instalación de utplsql.

Posteriormente a esto, pude ejecutar los scripts, sin embargo, algunos paquetes se compilaron con errores. Los errores que aparecieron fueron:

PLS-00201: identifier 'UTL_FILE' must be declared.
PLS-00201: identifier 'DBMS_PIPE' must be declared.

Para resolver dichos problemas, fue necesario conectarse como sysdba y dar permisos sobre los dos recursos que aparecieron en el error.
[1] http://www.efgh.com/software/unix2dos.htm