Puntos de Administración de OpenCms: ¿Cómo usar el A_CmsListReport?

Thu Feb 20 09:01:17 CET 2014       Rogelio Lamas Turrillo       Administración, OpenCms, Programación, Manuales y tutoriales

Primero deberemos crear una clase que herede de A_CmsListReport.
Debemos sobreescribir el método initializeThread(). El cual generará un objeto de tipo A_CmsReportThread (la cual extenderemos creando nuestra propia clase) y retornaremos como resultado de la función anteriormente descrita.

A tener en cuenta que si a nuestro A_CmsListReport queremos pasarle un parámetro este debe cumplir unas condiciones respecto al nombre. sus métodos getter y setter serán tal que getParam[NOMBRE_DEL_PARAMETRO]. Donde [NOMBRE_DEL_PARAMETRO] debe empieza por mayúscula y el resto minúsculas. Si en medio del texto ponéis alguna mayúscula fallará, ya que probé con MiParametro, y no lo cogía, pero si pruebas con Miparametro si.

Importante en la clase A_CmsReportThread sobreescribir el método run() que es el que hará los distintos procesos y pintará los mensajes que deseemos en la lista.

MyFirstReport.java

public class MyFirstReport extends A_CmsListReport {
    public static final String PARAM_PARAMETRO = "parametro";
    private String m_paramParametro;

    public MyFirstReport(CmsJspActionElement jsp) {
        super(jsp);
    }

    public MyFirstReport(PageContext context,
        HttpServletRequest req, HttpServletResponse res) {
        super(context, req, res);
    }

    @Override
    public I_CmsReportThread initializeThread() {
                if (getParamParametro() == null) {
                      throw new CmsIllegalArgumentException(Messages.get().container(
                      Messages.ERR_MISSING_PARAM_1,
                      PARAM_PARAMETRO));
                }
        
                // aqui podemos modificar el constructor para pasarle parámetros extra si lo deseamos
                CustomCmsReportThread thread = new CustomCmsReportThread(getCms());
                return thread;
    }

    public String getParamParametro() {
        return m_paramConfiguration;
    }

    public void setParamParametro(String paramParametro) {
        this.m_paramParametro = paramParametro;
    }
}

CustomCmsReportThread.java

public class CustomCmsReportThread extends A_CmsReportThread {

    /** The last error occurred. */
    private Throwable m_error;

    public CmsParsingReportThread(CmsObject cms) {
        super(cms, Messages.get().getBundle().key(
                Messages.GUI_PARSING_THREAD_NAME_0));
        initHtmlReport(cms.getRequestContext().getLocale());
    }

    @Override
    public Throwable getError() {
        return m_error;
    }

    @Override
    public String getReportUpdate() {
        return getReport().getReportUpdate();
    }

    @Override
    public void run() {
        // start message
        getReport().println(
            Messages.get().container(Messages.RPT_BEGIN_0),
            I_CmsReport.FORMAT_HEADLINE);

        try {
            /* Aquí lo que tengamos que hacer. Es posible que tengamos que
            llamar a otra clase para realizar alguna tarea compleja, lo mejor es
            pasarle como parámetro el report con getReport() como parámetro
                             y usarlo igual que usaríamos el logger.debug() */
            
            // end message
            getReport().println(
                Messages.get().container(Messages.RPT_END_0),
                I_CmsReport.FORMAT_HEADLINE);
        } catch (Throwable exc) {
            // error message
            getReport().println(
                Messages.get().container(Messages.RPT_FAILED_0),
                I_CmsReport.FORMAT_WARNING);
            getReport().println(exc);
            m_error = exc;
        }
    }
}

Para llamar a MyFirstReport, en mi caso desde un botón que esta dentro de una lista. Debemos hacer lo siguiente:

Crear el fichero report.jsp

<%@ page import="es.ejemplo.report.*, org.opencms.workplace.list.A_CmsListReport" %>
<%
     A_CmsListReport wp = new MyFirstReport(pageContext, request, response);
    wp.displayDialog();
%>

y en las propiedades de report.jsp

admintoolhandler-args = params:action=initial&parametro=${param.parametro}|path:/mimodulo/report
admintoolhandler-class = org.opencms.workplace.tools.CmsInvisibleToolHandler


La última línea es para que no salga en la barra de menús del módulo de administración.

Y luego desde la lista que tenemos que hereda de A_CmsListDialog dentro del método executeListSingleActions():

if (LIST_ACTION_EXECUTE_REPORT.equals(getParamListAction())) {
            Map<String, String> params = new HashMap<String, String>();
            params.put(MyFirstReport.PARAM_PARAMETRO,
                getSelectedItem().get(LIST_COLUMN_NAME).toString());
            params.put(CmsDialog.PARAM_ACTION, CmsDialog.DIALOG_INITIAL);
            
            // comprobar en las propiedades del jsp que hemos rellenado con el
            // path correcto su toolHandler-args
            // params:action=initial&parametro=${param.parametro}|path:/mimodulo/report
            getToolManager().jspForwardTool(this,
                    this.getCurrentToolPath() + "/report", params);      
}



En fin, espero que os sirva cuando tengáis que hacer un módulo de administración.

 Administración, OpenCms, Listados, Report