diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/ReportGenerator.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/ReportGenerator.java index 044382d736..ca474b6cb8 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/ReportGenerator.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/ReportGenerator.java @@ -18,6 +18,9 @@ */ 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.namespace.QName; @@ -28,7 +31,8 @@ import org.alfresco.service.namespace.QName; public interface ReportGenerator { QName getReportType(); - + Report generateReport(NodeRef reportedUponNodeRef, String mimetype); + Report generateReport(NodeRef reportedUponNodeRef, String mimetype, Map properties); } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/ReportService.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/ReportService.java index 6ae83e3888..33b8e5defc 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/ReportService.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/ReportService.java @@ -18,6 +18,8 @@ */ package org.alfresco.module.org_alfresco_module_rm.report; +import java.io.Serializable; +import java.util.Map; import java.util.Set; import org.alfresco.service.cmr.repository.NodeRef; @@ -62,6 +64,15 @@ public interface ReportService */ 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 properties); + /** * 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. diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/ReportServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/ReportServiceImpl.java index 23a08f9203..808c8e32da 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/ReportServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/ReportServiceImpl.java @@ -18,6 +18,7 @@ */ package org.alfresco.module.org_alfresco_module_rm.report; +import java.io.Serializable; import java.util.HashMap; import java.util.Map; 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 public Report generateReport(QName reportType, NodeRef reportedUponNodeRef) { + ParameterCheck.mandatory("reportType", reportType); + ParameterCheck.mandatory("reportedUponNodeRef", reportedUponNodeRef); + 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 public Report generateReport(QName reportType, NodeRef reportedUponNodeRef, String mimetype) { ParameterCheck.mandatory("reportType", reportType); ParameterCheck.mandatory("reportedUponNodeRef", reportedUponNodeRef); - ParameterCheck.mandatory("mimetype", mimetype); + ParameterCheck.mandatoryString("mimetype", mimetype); + + return generateReport(reportType, reportedUponNodeRef, mimetype, new HashMap(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 properties) + { + ParameterCheck.mandatory("reportType", reportType); + ParameterCheck.mandatory("reportedUponNodeRef", reportedUponNodeRef); + ParameterCheck.mandatoryString("mimetype", mimetype); + ParameterCheck.mandatory("properties", properties); // get the generator ReportGenerator generator = registry.get(reportType); @@ -137,7 +155,7 @@ public class ReportServiceImpl extends ServiceBaseImpl } // generate the report - return generator.generateReport(reportedUponNodeRef, mimetype); + return generator.generateReport(reportedUponNodeRef, mimetype, properties); } /** diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/generator/BaseReportGenerator.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/generator/BaseReportGenerator.java index 8d05ffb30c..d4bf413c8f 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/generator/BaseReportGenerator.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/generator/BaseReportGenerator.java @@ -29,6 +29,7 @@ import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; +import org.alfresco.util.ParameterCheck; /** * @author Roy Wetherall @@ -37,60 +38,73 @@ import org.alfresco.service.namespace.QName; public abstract class BaseReportGenerator implements ReportGenerator { protected ReportService reportService; - + protected NamespaceService namespaceService; - + protected String reportTypeName; + protected QName reportType; - + public void setReportService(ReportService reportService) { this.reportService = reportService; } - + public void setNamespaceService(NamespaceService namespaceService) { this.namespaceService = namespaceService; } - + public void setReportTypeName(String reportTypeName) { this.reportTypeName = reportTypeName; } - + @Override public QName getReportType() { return reportType; } - + public void init() { // convert type name to QName reportType = QName.createQName(reportTypeName, namespaceService); - + // register report generator reportService.registerReportGenerator(this); } - + @Override public Report generateReport(NodeRef reportedUponNodeRef, String mimetype) { + ParameterCheck.mandatory("reportedUponNodeRef", reportedUponNodeRef); + ParameterCheck.mandatoryString("mimetype", mimetype); + + return generateReport(reportedUponNodeRef, mimetype, new HashMap(1)); + } + + @Override + public Report generateReport(NodeRef reportedUponNodeRef, String mimetype, Map properties) + { + ParameterCheck.mandatory("reportedUponNodeRef", reportedUponNodeRef); + ParameterCheck.mandatoryString("mimetype", mimetype); + ParameterCheck.mandatory("properties", properties); + String reportName = generateReportName(reportedUponNodeRef); Map reportProperties = generateReportProperties(reportedUponNodeRef); - ContentReader contentReader = generateReportContent(reportedUponNodeRef, mimetype); - return new ReportInfo(reportType, reportName, reportProperties, contentReader); + ContentReader contentReader = generateReportContent(reportedUponNodeRef, mimetype, properties); + return new ReportInfo(reportType, reportName, reportProperties, contentReader); } - + protected abstract String generateReportName(NodeRef reportedUponNodeRef); - - + protected Map generateReportProperties(NodeRef reportedUponNodeRef) { // default implementation return new HashMap(0); } - - protected abstract ContentReader generateReportContent(NodeRef reportedUponNodeRef, String mimetype); + + protected abstract ContentReader generateReportContent(NodeRef reportedUponNodeRef, String mimetype, Map properties); } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/generator/DeclarativeReportGenerator.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/generator/DeclarativeReportGenerator.java index 6762ddf688..e8b3dcbe3d 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/generator/DeclarativeReportGenerator.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/generator/DeclarativeReportGenerator.java @@ -40,7 +40,7 @@ import org.springframework.extensions.surf.util.I18NUtil; /** * Declarative report generator. - * + * * @author Roy Wetherall * @since 2.1 */ @@ -48,35 +48,35 @@ public class DeclarativeReportGenerator extends BaseReportGenerator { /** template lookup root */ protected static final NodeRef TEMPLATE_ROOT = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, "rm_report_templates"); - + /** model keys */ protected static final String KEY_NODE = "node"; protected static final String KEY_CHILDREN = "children"; - + /** content service */ protected ContentService contentService; - + /** mimetype service */ protected MimetypeService mimetypeService; - + /** file folder service */ protected FileFolderService fileFolderService; - + /** template service */ protected TemplateService templateService; - + /** node service */ protected NodeService nodeService; - + /** repository helper */ protected Repository repository; - + /** parameter processor component */ protected ParameterProcessorComponent parameterProcessorComponent; - + /** sys admin params */ protected SysAdminParams sysAdminParams; - + /** * @param mimetypeService mimetype service */ @@ -84,7 +84,7 @@ public class DeclarativeReportGenerator extends BaseReportGenerator { this.mimetypeService = mimetypeService; } - + /** * @param fileFolderService file folder service */ @@ -92,7 +92,7 @@ public class DeclarativeReportGenerator extends BaseReportGenerator { this.fileFolderService = fileFolderService; } - + /** * @param templateService template service */ @@ -100,7 +100,7 @@ public class DeclarativeReportGenerator extends BaseReportGenerator { this.templateService = templateService; } - + /** * @param contentService content service */ @@ -108,7 +108,7 @@ public class DeclarativeReportGenerator extends BaseReportGenerator { this.contentService = contentService; } - + /** * @param nodeService node service */ @@ -116,7 +116,7 @@ public class DeclarativeReportGenerator extends BaseReportGenerator { this.nodeService = nodeService; } - + /** * @param parameterProcessorComponent parameter processor component */ @@ -124,7 +124,7 @@ public class DeclarativeReportGenerator extends BaseReportGenerator { this.parameterProcessorComponent = parameterProcessorComponent; } - + /** * @param repository repository helper */ @@ -132,7 +132,7 @@ public class DeclarativeReportGenerator extends BaseReportGenerator { this.repository = repository; } - + /** * @param sysAdminParams sys admin params */ @@ -140,68 +140,71 @@ public class DeclarativeReportGenerator extends BaseReportGenerator { this.sysAdminParams = sysAdminParams; } - + /** * @see org.alfresco.module.org_alfresco_module_rm.report.generator.BaseReportGenerator#generateReportName(org.alfresco.service.cmr.repository.NodeRef) */ @Override 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"); 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 - protected ContentReader generateReportContent(NodeRef reportedUponNodeRef, String mimetype) + protected ContentReader generateReportContent(NodeRef reportedUponNodeRef, String mimetype, Map properties) { // get the template NodeRef reportTemplateNodeRef = getReportTemplate(mimetype); - + // get the model - Map model = createTemplateModel(reportTemplateNodeRef, reportedUponNodeRef); - + Map model = createTemplateModel(reportTemplateNodeRef, reportedUponNodeRef, properties); + // run the template String result = templateService.processTemplate("freemarker", reportTemplateNodeRef.toString(), model); - - // create the temp content + + // create the temp content ContentWriter contentWriter = contentService.getTempWriter(); contentWriter.setEncoding("UTF-8"); contentWriter.setMimetype(mimetype); contentWriter.putContent(result); - + // return the reader to the temp content return contentWriter.getReader(); } - - protected Map createTemplateModel(NodeRef templateNodeRef, NodeRef reportedUponNodeRef) + + protected Map createTemplateModel(NodeRef templateNodeRef, NodeRef reportedUponNodeRef, Map properties) { Map model = new HashMap(); - + // build the default model NodeRef person = repository.getPerson(); - templateService.buildDefaultModel(person, - repository.getCompanyHome(), - repository.getUserHome(person), - templateNodeRef, + templateService.buildDefaultModel(person, + repository.getCompanyHome(), + repository.getUserHome(person), + templateNodeRef, null); - + // put the reported upon node reference in the model model.put(KEY_NODE, reportedUponNodeRef); - + // context url's (handy for images and links) model.put("url", UrlUtil.getAlfrescoUrl(sysAdminParams)); model.put(TemplateService.KEY_SHARE_URL, UrlUtil.getShareUrl(sysAdminParams)); - + + // add additional properties + model.put("properties", (Serializable) properties); + return model; } - + /** * Get's the report template based on the type and mimetype. - * + * * @param mimetype * @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."); } - + String reportTemplateName = getReportTemplateName(mimetype); - + NodeRef reportTemplateNodeRef = fileFolderService.searchSimple(TEMPLATE_ROOT, reportTemplateName); if (reportTemplateNodeRef == null) { throw new AlfrescoRuntimeException("Unable to get report template, because report template " + reportTemplateName + " does not exist."); } - + // get localise template return fileFolderService.getLocalizedSibling(reportTemplateNodeRef); - - + + } - + /** * Gets the template name based on the type and mimetype. - * + * * @param mimetype * @return */ @@ -237,14 +240,14 @@ public class DeclarativeReportGenerator extends BaseReportGenerator { String typePrefixName = reportType.getPrefixedQName(namespaceService).getPrefixString().replace(":", "_"); String extension = mimetypeService.getExtension(mimetype); - + StringBuffer sb = new StringBuffer(128) .append("report_") .append(typePrefixName) .append(".") .append(extension) .append(".ftl"); - + return sb.toString(); }