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¶metro=${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¶metro=${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.