Archive for January, 2009

Performance: Porqué usar @Factory en vez de getters

Cuando JSF resuelve una #{EL Expression} no cachea los resultados. Esto quiere decir que por cada expresión como #{user.name}, se hará una llamada al método User.getName().

Esto por sí mismo no es peligroso. Pero analicemos este caso típico

@Name("userManager")
public class UserManager {

    public List getUserList() {
        return createUserList();
    }
}

<h :dataTable value="#{userManager.userList}" var="user">
    ...
    #{user.name}
    ...
</h>

En este caso por cada fila de la tabla, se hará una llamada al método UserManager.getUserList() para obtener el usuario actual. Si el método UserManager.getUserList() implica una llamada a la base de datos, el tiempo de carga crece imcreíblemente.

Una primera solución es usar el patrón de diseño Carga Perezosa (LazyLoad).

@Name("userManager")
public class UserManager {
    private List list;

    public List getUserList() {
        if (this.list == null) {
            this.list = createUserList();
        }
        return list;
    }
}

De esta forma la lista no se crea cada vez que se la llama desde la página JSF. Pero aún así se sigue invocando el método getUserList() multitud de veces.

La mejor solución es poner la lista en el contexto de la página, y acceder a ella directamente por su nombre en el contexto en vez de por el componente al que pertenece.
Esto se puede hacer mediante la anotación @Out o la anotación @Factory

public class UserManager {

    @Factory(value = "userList", scope = ScopeType.PAGE)
    public List getUserList() {
        if (this.list == null) {
            this.list = createUserList();
        }
        return list;
    }
}

<h :dataTable value="#{userList}" var="user"> // invocamos la variable userList directamente
    ...
    #{user.name}
    ...
</h>

Leave a Comment

Cómo obtener un componente de seam sin usar la anotacion @In

En seam, la forma más fácil de obtener un componente es usando la inyección de dependencias mediante la anotación @In. Sin embargo, las anotaciones para la bijection solo funcionan si se utilizan desde otro componente de Seam marcado mediante la anotación @Name.

Es decir, si en una clase 'normal' (sin la anotación @Name) utilizas un @In o un @Out o cualquier otra anotación propia de Seam, esta será ignorada. Aun así,  la API de Seam nos permite obtener instancias de otros componentes directamente, buscándolos a través de su nombre o de su clase.

// Obtiene una instancia de un componente a través de su clase
Component.getInstance(Class clazz)

// Obtiene una instancia de un componente a través de su nombre
Component.getInstance(String name)

El metodo getInstance también admite otros parametros para indicar si hay que crear el elemento, su contexto, etc..

Leave a Comment

Cambiar el usuario y password de subversion en eclipse

Si estas usando eclipse con el plugin de subversion subclipse, el usuario y el password con el que te conectas se queda almacenado, y el plugin no te da opciones para cambiarlo.

Tampoco sirve de nada eliminar el repositorio (repository location) y volverlo a crear, porque el usuario y password se quedan almacenados en un archivo del disco y están asociados a la url del repositorio.

La solución consiste en eliminar/modificar el archivo desde el que el plugin  lee los usuarios. Este archivo es distinto según el cliente del svn interface que estés usando (mirar en Window - Preferences - Team  - SVN : SVN Interface).

Si usas el cliente JavaHL el archivo esta en una de las subcarpetas de  ~/.subversion/auth  (probablemente ~/.subversion/auth/svn.simple), y hay un archivo de texto plano para cada repositorio svn.

Si usas el cliente SVNKit, eclipse usa el keyring general, que está en $ECLIPSE_HOME/configuration/.keyring. Lo malo que este archivo no está en texto plano y hay que eliminarlo. La próxima vez que te intentes conectar, te pedirá el usuario y el password.

Probablemente tengas que eliminar el repository location desde el plugin (Discard location) y reiniciar el eclipse tras modificar el archivo para que tenga efecto

Leave a Comment