martes, 23 de febrero de 2016

Override prepareSession del Module de una aplicación

En ocasiones es necesario preparar la sesión de base de datos antes de realizar cualquier acción sobre la base de datos. Para ello hay que hacer un override del método prepareSession del Module. Para ello hacemos lo siguiente:

1. Creamos otro Module, con las mismas características que nuestro Module, que lo único que hará será en su implementación extender de la clase ApplicationModuleImpl para sobreescribir los métodos que queremos, en este caso el prepareSession.

public class CustomCommonModuleImpl extends ApplicationModuleImpl {

    private static final ADFLogger LOGGER = ADFLogger.createADFLogger(CustomCommonModuleImpl.class);

    public CustomCommonModuleImpl() {
        super();
    }

    protected void beforeDisconnect() {
        CustomTransactionImpl dbTrans = (CustomTransactionImpl) this.getDBTransaction();
        OracleConnection conn = dbTrans.getConnection();

        try {
            conn.close(OracleConnection.PROXY_SESSION);
        } catch (SQLException e) {
            throw new JboException(e);
        }

        super.beforeDisconnect();
    }

    protected void prepareSession(Session session) {
        super.prepareSession(session);

        ...
        }


    }


2. En nuestra implementación del Module, hacemos lo siguiente:

public class xxxImpl extends CustomCommonModuleImpl implements xxxModule {
...
}

3. Importante! Si queremos que se llame al prepareSession antes de cada consulta/update/insert en base de datos, hay que ajustar los siguientes parámetros:

3.1) jbo.doconnectionpooling.- Se ajusta en la siguiente pantalla (luego aparece en properties con 1). 




 3.2) jbo.txn.disconnect_level a 1



Paso variables entre capa View-Controller y Model

Se nos plantea la problemática de necesitar pasar unos parámetros de la capa View-Controller al Model, en concreto para hacer un override del método prepareSession de Model para setear el contexto del usuario logado. A nivel de MVC no está bien visto que la capa VC acceda al M, pero es la única forma que hemos encontrado para hacerlo.

Para ello, en el bean de Session definido en la aplicación, definimos las dos variables que necesitamos pasar al Model:

        //Preparamos en session el cdempresa y cddelega
        ExternalContext ectx = FacesContext.getCurrentInstance().getExternalContext();
        HttpSession userSession = (HttpSession) ectx.getSession(true);
        userSession.setAttribute("cdDelega", cddelega);
        userSession.setAttribute("cdEmpresa", (cdempresa+cdempresa));


 Ahora, en el implement del Module:

        Map sessionScope = ADFContext.getCurrent().getSessionScope();
        if (sessionScope.get("cdDelega") != null && sessionScope.get("cdEmpresa") != null) {
            String cdDelega = (String) sessionScope.get("cdDelega");
            String cdEmpresa = (String) sessionScope.get("cdEmpresa");

            ...

miércoles, 3 de febrero de 2016

Resetear el valor de un input en el ValueChangeListener

Esta post surge por la necesidad de restituir el valor de un componente que ha sido introducido en una LOV, porque por requerimientos se ha hecho una comprobación en el ValueChangeListener y no se tiene que setear el valor buscado en la LOV.

Mediante el parámetro valueChangeEvent del método ValueChangeListener, podemos hacer lo siguiente:

public void method (ValueChangeEvent valueChangeEvent) {

   ...

   ((UIXEditableValue)valueChangeEvent.getComponent()).resetValue();

   ...

}