RM-1099 (Refactor Transfer and Accession reports)

* Extended the ReportGenerator/ReportService so that additional properties can be passed to the report template

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/HEAD@58442 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Tuna Aksoy
2013-11-29 23:48:50 +00:00
parent 678ef393ce
commit 9631d4644c
5 changed files with 120 additions and 70 deletions

View File

@@ -18,6 +18,9 @@
*/ */
package org.alfresco.module.org_alfresco_module_rm.report; package org.alfresco.module.org_alfresco_module_rm.report;
import java.io.Serializable;
import java.util.Map;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
@@ -28,7 +31,8 @@ import org.alfresco.service.namespace.QName;
public interface ReportGenerator public interface ReportGenerator
{ {
QName getReportType(); QName getReportType();
Report generateReport(NodeRef reportedUponNodeRef, String mimetype); Report generateReport(NodeRef reportedUponNodeRef, String mimetype);
Report generateReport(NodeRef reportedUponNodeRef, String mimetype, Map<String, Serializable> properties);
} }

View File

@@ -18,6 +18,8 @@
*/ */
package org.alfresco.module.org_alfresco_module_rm.report; package org.alfresco.module.org_alfresco_module_rm.report;
import java.io.Serializable;
import java.util.Map;
import java.util.Set; import java.util.Set;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
@@ -62,6 +64,15 @@ public interface ReportService
*/ */
Report generateReport(QName reportType, NodeRef reportedUponNodeRef, String mimetype); Report generateReport(QName reportType, NodeRef reportedUponNodeRef, String mimetype);
/**
* @param reportType
* @param reportedUponNodeRef
* @param mimetype
* @param properties
* @return
*/
Report generateReport(QName reportType, NodeRef reportedUponNodeRef, String mimetype, Map<String, Serializable> properties);
/** /**
* File report in the given destination. If the given node reference is a file plan node * File report in the given destination. If the given node reference is a file plan node
* reference the report will be filed in the unfiled records container. * reference the report will be filed in the unfiled records container.

View File

@@ -18,6 +18,7 @@
*/ */
package org.alfresco.module.org_alfresco_module_rm.report; package org.alfresco.module.org_alfresco_module_rm.report;
import java.io.Serializable;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@@ -109,23 +110,40 @@ public class ReportServiceImpl extends ServiceBaseImpl
} }
/** /**
* @see org.alfresco.module.org_alfresco_module_rm.report.ReportService#generateReport(org.alfresco.service.namespace.QName, org.alfresco.service.cmr.repository.NodeRef) * @see org.alfresco.module.org_alfresco_module_rm.report.ReportService#generateReport(QName, NodeRef)
*/ */
@Override @Override
public Report generateReport(QName reportType, NodeRef reportedUponNodeRef) public Report generateReport(QName reportType, NodeRef reportedUponNodeRef)
{ {
ParameterCheck.mandatory("reportType", reportType);
ParameterCheck.mandatory("reportedUponNodeRef", reportedUponNodeRef);
return generateReport(reportType, reportedUponNodeRef, MimetypeMap.MIMETYPE_HTML); return generateReport(reportType, reportedUponNodeRef, MimetypeMap.MIMETYPE_HTML);
} }
/** /**
* @see org.alfresco.module.org_alfresco_module_rm.report.ReportService#generateReport(org.alfresco.service.namespace.QName, org.alfresco.service.cmr.repository.NodeRef) * @see org.alfresco.module.org_alfresco_module_rm.report.ReportService#generateReport(QName, NodeRef, String)
*/ */
@Override @Override
public Report generateReport(QName reportType, NodeRef reportedUponNodeRef, String mimetype) public Report generateReport(QName reportType, NodeRef reportedUponNodeRef, String mimetype)
{ {
ParameterCheck.mandatory("reportType", reportType); ParameterCheck.mandatory("reportType", reportType);
ParameterCheck.mandatory("reportedUponNodeRef", reportedUponNodeRef); ParameterCheck.mandatory("reportedUponNodeRef", reportedUponNodeRef);
ParameterCheck.mandatory("mimetype", mimetype); ParameterCheck.mandatoryString("mimetype", mimetype);
return generateReport(reportType, reportedUponNodeRef, mimetype, new HashMap<String, Serializable>(1));
}
/**
* @see org.alfresco.module.org_alfresco_module_rm.report.ReportService#generateReport(QName, NodeRef, String, Map)
*/
@Override
public Report generateReport(QName reportType, NodeRef reportedUponNodeRef, String mimetype, Map<String, Serializable> properties)
{
ParameterCheck.mandatory("reportType", reportType);
ParameterCheck.mandatory("reportedUponNodeRef", reportedUponNodeRef);
ParameterCheck.mandatoryString("mimetype", mimetype);
ParameterCheck.mandatory("properties", properties);
// get the generator // get the generator
ReportGenerator generator = registry.get(reportType); ReportGenerator generator = registry.get(reportType);
@@ -137,7 +155,7 @@ public class ReportServiceImpl extends ServiceBaseImpl
} }
// generate the report // generate the report
return generator.generateReport(reportedUponNodeRef, mimetype); return generator.generateReport(reportedUponNodeRef, mimetype, properties);
} }
/** /**

View File

@@ -29,6 +29,7 @@ import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.alfresco.util.ParameterCheck;
/** /**
* @author Roy Wetherall * @author Roy Wetherall
@@ -37,60 +38,73 @@ import org.alfresco.service.namespace.QName;
public abstract class BaseReportGenerator implements ReportGenerator public abstract class BaseReportGenerator implements ReportGenerator
{ {
protected ReportService reportService; protected ReportService reportService;
protected NamespaceService namespaceService; protected NamespaceService namespaceService;
protected String reportTypeName; protected String reportTypeName;
protected QName reportType; protected QName reportType;
public void setReportService(ReportService reportService) public void setReportService(ReportService reportService)
{ {
this.reportService = reportService; this.reportService = reportService;
} }
public void setNamespaceService(NamespaceService namespaceService) public void setNamespaceService(NamespaceService namespaceService)
{ {
this.namespaceService = namespaceService; this.namespaceService = namespaceService;
} }
public void setReportTypeName(String reportTypeName) public void setReportTypeName(String reportTypeName)
{ {
this.reportTypeName = reportTypeName; this.reportTypeName = reportTypeName;
} }
@Override @Override
public QName getReportType() public QName getReportType()
{ {
return reportType; return reportType;
} }
public void init() public void init()
{ {
// convert type name to QName // convert type name to QName
reportType = QName.createQName(reportTypeName, namespaceService); reportType = QName.createQName(reportTypeName, namespaceService);
// register report generator // register report generator
reportService.registerReportGenerator(this); reportService.registerReportGenerator(this);
} }
@Override @Override
public Report generateReport(NodeRef reportedUponNodeRef, String mimetype) public Report generateReport(NodeRef reportedUponNodeRef, String mimetype)
{ {
ParameterCheck.mandatory("reportedUponNodeRef", reportedUponNodeRef);
ParameterCheck.mandatoryString("mimetype", mimetype);
return generateReport(reportedUponNodeRef, mimetype, new HashMap<String, Serializable>(1));
}
@Override
public Report generateReport(NodeRef reportedUponNodeRef, String mimetype, Map<String, Serializable> properties)
{
ParameterCheck.mandatory("reportedUponNodeRef", reportedUponNodeRef);
ParameterCheck.mandatoryString("mimetype", mimetype);
ParameterCheck.mandatory("properties", properties);
String reportName = generateReportName(reportedUponNodeRef); String reportName = generateReportName(reportedUponNodeRef);
Map<QName, Serializable> reportProperties = generateReportProperties(reportedUponNodeRef); Map<QName, Serializable> reportProperties = generateReportProperties(reportedUponNodeRef);
ContentReader contentReader = generateReportContent(reportedUponNodeRef, mimetype); ContentReader contentReader = generateReportContent(reportedUponNodeRef, mimetype, properties);
return new ReportInfo(reportType, reportName, reportProperties, contentReader); return new ReportInfo(reportType, reportName, reportProperties, contentReader);
} }
protected abstract String generateReportName(NodeRef reportedUponNodeRef); protected abstract String generateReportName(NodeRef reportedUponNodeRef);
protected Map<QName, Serializable> generateReportProperties(NodeRef reportedUponNodeRef) protected Map<QName, Serializable> generateReportProperties(NodeRef reportedUponNodeRef)
{ {
// default implementation // default implementation
return new HashMap<QName, Serializable>(0); return new HashMap<QName, Serializable>(0);
} }
protected abstract ContentReader generateReportContent(NodeRef reportedUponNodeRef, String mimetype); protected abstract ContentReader generateReportContent(NodeRef reportedUponNodeRef, String mimetype, Map<String, Serializable> properties);
} }

View File

@@ -40,7 +40,7 @@ import org.springframework.extensions.surf.util.I18NUtil;
/** /**
* Declarative report generator. * Declarative report generator.
* *
* @author Roy Wetherall * @author Roy Wetherall
* @since 2.1 * @since 2.1
*/ */
@@ -48,35 +48,35 @@ public class DeclarativeReportGenerator extends BaseReportGenerator
{ {
/** template lookup root */ /** template lookup root */
protected static final NodeRef TEMPLATE_ROOT = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, "rm_report_templates"); protected static final NodeRef TEMPLATE_ROOT = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, "rm_report_templates");
/** model keys */ /** model keys */
protected static final String KEY_NODE = "node"; protected static final String KEY_NODE = "node";
protected static final String KEY_CHILDREN = "children"; protected static final String KEY_CHILDREN = "children";
/** content service */ /** content service */
protected ContentService contentService; protected ContentService contentService;
/** mimetype service */ /** mimetype service */
protected MimetypeService mimetypeService; protected MimetypeService mimetypeService;
/** file folder service */ /** file folder service */
protected FileFolderService fileFolderService; protected FileFolderService fileFolderService;
/** template service */ /** template service */
protected TemplateService templateService; protected TemplateService templateService;
/** node service */ /** node service */
protected NodeService nodeService; protected NodeService nodeService;
/** repository helper */ /** repository helper */
protected Repository repository; protected Repository repository;
/** parameter processor component */ /** parameter processor component */
protected ParameterProcessorComponent parameterProcessorComponent; protected ParameterProcessorComponent parameterProcessorComponent;
/** sys admin params */ /** sys admin params */
protected SysAdminParams sysAdminParams; protected SysAdminParams sysAdminParams;
/** /**
* @param mimetypeService mimetype service * @param mimetypeService mimetype service
*/ */
@@ -84,7 +84,7 @@ public class DeclarativeReportGenerator extends BaseReportGenerator
{ {
this.mimetypeService = mimetypeService; this.mimetypeService = mimetypeService;
} }
/** /**
* @param fileFolderService file folder service * @param fileFolderService file folder service
*/ */
@@ -92,7 +92,7 @@ public class DeclarativeReportGenerator extends BaseReportGenerator
{ {
this.fileFolderService = fileFolderService; this.fileFolderService = fileFolderService;
} }
/** /**
* @param templateService template service * @param templateService template service
*/ */
@@ -100,7 +100,7 @@ public class DeclarativeReportGenerator extends BaseReportGenerator
{ {
this.templateService = templateService; this.templateService = templateService;
} }
/** /**
* @param contentService content service * @param contentService content service
*/ */
@@ -108,7 +108,7 @@ public class DeclarativeReportGenerator extends BaseReportGenerator
{ {
this.contentService = contentService; this.contentService = contentService;
} }
/** /**
* @param nodeService node service * @param nodeService node service
*/ */
@@ -116,7 +116,7 @@ public class DeclarativeReportGenerator extends BaseReportGenerator
{ {
this.nodeService = nodeService; this.nodeService = nodeService;
} }
/** /**
* @param parameterProcessorComponent parameter processor component * @param parameterProcessorComponent parameter processor component
*/ */
@@ -124,7 +124,7 @@ public class DeclarativeReportGenerator extends BaseReportGenerator
{ {
this.parameterProcessorComponent = parameterProcessorComponent; this.parameterProcessorComponent = parameterProcessorComponent;
} }
/** /**
* @param repository repository helper * @param repository repository helper
*/ */
@@ -132,7 +132,7 @@ public class DeclarativeReportGenerator extends BaseReportGenerator
{ {
this.repository = repository; this.repository = repository;
} }
/** /**
* @param sysAdminParams sys admin params * @param sysAdminParams sys admin params
*/ */
@@ -140,68 +140,71 @@ public class DeclarativeReportGenerator extends BaseReportGenerator
{ {
this.sysAdminParams = sysAdminParams; this.sysAdminParams = sysAdminParams;
} }
/** /**
* @see org.alfresco.module.org_alfresco_module_rm.report.generator.BaseReportGenerator#generateReportName(org.alfresco.service.cmr.repository.NodeRef) * @see org.alfresco.module.org_alfresco_module_rm.report.generator.BaseReportGenerator#generateReportName(org.alfresco.service.cmr.repository.NodeRef)
*/ */
@Override @Override
protected String generateReportName(NodeRef reportedUponNodeRef) protected String generateReportName(NodeRef reportedUponNodeRef)
{ {
String reportTypeName = reportType.getPrefixedQName(namespaceService).getPrefixString().replace(":", "_"); String reportTypeName = reportType.getPrefixedQName(namespaceService).getPrefixString().replace(":", "_");
String value = I18NUtil.getMessage("report." + reportTypeName + ".name"); String value = I18NUtil.getMessage("report." + reportTypeName + ".name");
return parameterProcessorComponent.process(value, reportedUponNodeRef); return parameterProcessorComponent.process(value, reportedUponNodeRef);
} }
/** /**
* @see org.alfresco.module.org_alfresco_module_rm.report.generator.BaseReportGenerator#generateReportContent(org.alfresco.service.cmr.repository.NodeRef, java.lang.String) * @see org.alfresco.module.org_alfresco_module_rm.report.generator.BaseReportGenerator#generateReportContent(NodeRef, String, Map)
*/ */
@Override @Override
protected ContentReader generateReportContent(NodeRef reportedUponNodeRef, String mimetype) protected ContentReader generateReportContent(NodeRef reportedUponNodeRef, String mimetype, Map<String, Serializable> properties)
{ {
// get the template // get the template
NodeRef reportTemplateNodeRef = getReportTemplate(mimetype); NodeRef reportTemplateNodeRef = getReportTemplate(mimetype);
// get the model // get the model
Map<String, Serializable> model = createTemplateModel(reportTemplateNodeRef, reportedUponNodeRef); Map<String, Serializable> model = createTemplateModel(reportTemplateNodeRef, reportedUponNodeRef, properties);
// run the template // run the template
String result = templateService.processTemplate("freemarker", reportTemplateNodeRef.toString(), model); String result = templateService.processTemplate("freemarker", reportTemplateNodeRef.toString(), model);
// create the temp content // create the temp content
ContentWriter contentWriter = contentService.getTempWriter(); ContentWriter contentWriter = contentService.getTempWriter();
contentWriter.setEncoding("UTF-8"); contentWriter.setEncoding("UTF-8");
contentWriter.setMimetype(mimetype); contentWriter.setMimetype(mimetype);
contentWriter.putContent(result); contentWriter.putContent(result);
// return the reader to the temp content // return the reader to the temp content
return contentWriter.getReader(); return contentWriter.getReader();
} }
protected Map<String, Serializable> createTemplateModel(NodeRef templateNodeRef, NodeRef reportedUponNodeRef) protected Map<String, Serializable> createTemplateModel(NodeRef templateNodeRef, NodeRef reportedUponNodeRef, Map<String, Serializable> properties)
{ {
Map<String, Serializable> model = new HashMap<String, Serializable>(); Map<String, Serializable> model = new HashMap<String, Serializable>();
// build the default model // build the default model
NodeRef person = repository.getPerson(); NodeRef person = repository.getPerson();
templateService.buildDefaultModel(person, templateService.buildDefaultModel(person,
repository.getCompanyHome(), repository.getCompanyHome(),
repository.getUserHome(person), repository.getUserHome(person),
templateNodeRef, templateNodeRef,
null); null);
// put the reported upon node reference in the model // put the reported upon node reference in the model
model.put(KEY_NODE, reportedUponNodeRef); model.put(KEY_NODE, reportedUponNodeRef);
// context url's (handy for images and links) // context url's (handy for images and links)
model.put("url", UrlUtil.getAlfrescoUrl(sysAdminParams)); model.put("url", UrlUtil.getAlfrescoUrl(sysAdminParams));
model.put(TemplateService.KEY_SHARE_URL, UrlUtil.getShareUrl(sysAdminParams)); model.put(TemplateService.KEY_SHARE_URL, UrlUtil.getShareUrl(sysAdminParams));
// add additional properties
model.put("properties", (Serializable) properties);
return model; return model;
} }
/** /**
* Get's the report template based on the type and mimetype. * Get's the report template based on the type and mimetype.
* *
* @param mimetype * @param mimetype
* @return * @return
*/ */
@@ -212,24 +215,24 @@ public class DeclarativeReportGenerator extends BaseReportGenerator
{ {
throw new AlfrescoRuntimeException("Unable to get report template, because the template root folder does not exist in the data dictionary."); throw new AlfrescoRuntimeException("Unable to get report template, because the template root folder does not exist in the data dictionary.");
} }
String reportTemplateName = getReportTemplateName(mimetype); String reportTemplateName = getReportTemplateName(mimetype);
NodeRef reportTemplateNodeRef = fileFolderService.searchSimple(TEMPLATE_ROOT, reportTemplateName); NodeRef reportTemplateNodeRef = fileFolderService.searchSimple(TEMPLATE_ROOT, reportTemplateName);
if (reportTemplateNodeRef == null) if (reportTemplateNodeRef == null)
{ {
throw new AlfrescoRuntimeException("Unable to get report template, because report template " + reportTemplateName + " does not exist."); throw new AlfrescoRuntimeException("Unable to get report template, because report template " + reportTemplateName + " does not exist.");
} }
// get localise template // get localise template
return fileFolderService.getLocalizedSibling(reportTemplateNodeRef); return fileFolderService.getLocalizedSibling(reportTemplateNodeRef);
} }
/** /**
* Gets the template name based on the type and mimetype. * Gets the template name based on the type and mimetype.
* *
* @param mimetype * @param mimetype
* @return * @return
*/ */
@@ -237,14 +240,14 @@ public class DeclarativeReportGenerator extends BaseReportGenerator
{ {
String typePrefixName = reportType.getPrefixedQName(namespaceService).getPrefixString().replace(":", "_"); String typePrefixName = reportType.getPrefixedQName(namespaceService).getPrefixString().replace(":", "_");
String extension = mimetypeService.getExtension(mimetype); String extension = mimetypeService.getExtension(mimetype);
StringBuffer sb = new StringBuffer(128) StringBuffer sb = new StringBuffer(128)
.append("report_") .append("report_")
.append(typePrefixName) .append(typePrefixName)
.append(".") .append(".")
.append(extension) .append(extension)
.append(".ftl"); .append(".ftl");
return sb.toString(); return sb.toString();
} }