Creating your own Report plugin

Report plugins are used to generate your own reports to be rendered in the OpenKM UI.

You can create your own Report plugin.

Conditions:

  • The new Report Plugin class must implement the "Report" interface.
  • The new Report Plugin class must be declared under the package "com.openkm.plugin.report".
  • The new Report Plugin class must be annotated with "@PluginImplementation".
  • The new Report Plugin class must extend "BasePlugin".

Report interface:

package com.openkm.plugin.report;

import com.openkm.bean.PageInfo;
import com.openkm.bean.form.FormElement;
import com.openkm.core.AccessDeniedException;
import com.openkm.core.DatabaseException;
import com.openkm.core.PathNotFoundException;
import com.openkm.core.RepositoryException;
import net.xeoh.plugins.base.Plugin;

import java.util.List;
import java.util.Map;

/**
* Report plugin
*/
public interface Report extends Plugin {

List<FormElement> getFormElements();

PageInfo execute(Map<String, String> params) throws AccessDeniedException, PathNotFoundException, RepositoryException, DatabaseException;

String getName();
}

The new class must be loaded into the package com.openkm.plugin.report because the application plugin system will try to load from there.

Do not forget the tag @PluginImplementation; otherwise, the application plugin system will not be able to retrieve the new class.

More information at Register a new plugin.

Methods description

MethodTypeDescription

getFormElements()

List<FormElement>

The method returns a list of FormElement objects that will be rendered in the UI to ask for report filter values.

execute(Map<String, String> params)

PageInfo

Returns a list of elements related to the report.

The params variable contains the values of the form elements set by the user in the UI.

getName()

String

Returns the name of the report.

Example of the Report plugin implementation

In this example, we return a list of documents filtered by document name (provided as an input value), and with a limit on the number of results as an input value (if it is empty, the default limit is 100). The list shows only 3 fields related to the document (Author, Path, Date).

package com.openkm.plugin.report;

import com.openkm.bean.Folder;
import com.openkm.bean.PageInfo;
import com.openkm.bean.form.FormElement;
import com.openkm.bean.form.Input;
import com.openkm.core.AccessDeniedException;
import com.openkm.core.DatabaseException;
import com.openkm.core.PathNotFoundException;
import com.openkm.core.RepositoryException;
import com.openkm.db.bean.NodeBase;
import com.openkm.db.bean.NodeDocument;
import com.openkm.db.service.NodeBaseSrv;
import com.openkm.module.db.DbRepositoryModule;
import com.openkm.plugin.BasePlugin;
import com.openkm.util.FormatUtil;
import com.openkm.ws.rest.util.SimpleNodeBase;
import com.openkm.ws.rest.util.SimpleRowReport;
import net.xeoh.plugins.base.annotations.PluginImplementation;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@PluginImplementation
public class TestReport extends BasePlugin implements Report {
	private static final Logger log = LoggerFactory.getLogger(TestReport.class);

	private static final String REPORTS_DEFAULT_LIMIT = "100";
	private static final String REPORT_INPUT_FILTER = "filter";
	private static final String REPORT_INPUT_LIMIT = "limit";
	private static final String REPORT_COLUMN_LABEL_1 = "Author";
	private static final String REPORT_COLUMN_LABEL_2 = "Path";
	private static final String REPORT_COLUMN_LABEL_3 = "Date";

	@Autowired
	private DbRepositoryModule dbRepositoryModule;

	@Autowired
	private NodeBaseSrv nodeBaseSrv;

	@Override
	public String getName() {
		return "Consulting documents sample";
	}

	@Override
	public List getFormElements() {
		List formElements = new ArrayList<>();

		FormElement feInputFilter = new Input();
		feInputFilter.setName(REPORT_INPUT_FILTER);
		feInputFilter.setLabel("Filter");

		FormElement feInputLimit = new Input();
		feInputLimit.setName(REPORT_INPUT_LIMIT);
		feInputLimit.setLabel("Limit");

		formElements.add(feInputFilter);
		formElements.add(feInputLimit);

		return formElements;
	}

	@Override
	public PageInfo execute(Map<String, String> params) throws AccessDeniedException, PathNotFoundException,
			RepositoryException, DatabaseException {
		PageInfo reportPageInfo = new PageInfo();
		List simpleRowReportList = new ArrayList<>();
		Folder rootFolder = dbRepositoryModule.getRootFolder(null);

		String filter = params.get(REPORT_INPUT_FILTER);
		String limit = StringUtils.isNotEmpty(params.get(REPORT_INPUT_LIMIT)) ? params.get(REPORT_INPUT_LIMIT) : REPORTS_DEFAULT_LIMIT;

		List<Class<? extends NodeBase>> filteredByNodeTypeList = new ArrayList<>();
		filteredByNodeTypeList.add(NodeDocument.class);

		PageInfo pageInfo = nodeBaseSrv.getCommonChildrenPaginated(rootFolder.getUuid(), 0, Integer.parseInt(limit), filter, "name",
				true, filteredByNodeTypeList);

		// Only fill the metadata values when results size greater than 0
		if (pageInfo.getObjects().size() > 0) {
			for (SimpleNodeBase snb : (List) pageInfo.getObjects()) {
				SimpleRowReport simpleRowReportPlugin = new SimpleRowReport();
				simpleRowReportPlugin.setUuid(snb.getUuid());
				simpleRowReportPlugin.setName(snb.getName());
				simpleRowReportPlugin.setReportColumnLabel1(REPORT_COLUMN_LABEL_1);
				simpleRowReportPlugin.setReportColumnLabel2(REPORT_COLUMN_LABEL_2);
				simpleRowReportPlugin.setReportColumnLabel3(REPORT_COLUMN_LABEL_3);
				simpleRowReportPlugin.setReportColumnValue1(snb.getAuthor());
				simpleRowReportPlugin.setReportColumnValue2(snb.getPath());
				simpleRowReportPlugin.setReportColumnValue3(FormatUtil.formatDate(snb.getVersionCreated())); // formatted from backend

				simpleRowReportList.add(simpleRowReportPlugin);
			}

			reportPageInfo.setTotalElements(pageInfo.getObjects().size());
			reportPageInfo.setObjects(simpleRowReportList);
		}

		return reportPageInfo;
	}
}