From ea20a6a648c6d2987826eb60968620aaa1e8ed6f Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Tue, 3 Dec 2013 15:49:57 +0000 Subject: [PATCH] RM-1099 (Refactor Transfer and Accession reports) * Added a patch for the new report template * Changed the module property to 2.2 to get the patch executed * Refactored the transfer report action git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/HEAD@58546 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../bootstrap/RMDataDictionaryBootstrap.xml | 1 - .../org_alfresco_module_rm/module.properties | 2 +- .../rm-patch-context.xml | 35 ++++-- .../patch/NotificationTemplatePatch_v21.java | 59 +++++----- .../patch/RMv22ReportTemplatePatch.java | 105 ++++++++++++++++++ .../report/action/TransferReportAction.java | 101 +++++++++++------ 6 files changed, 229 insertions(+), 74 deletions(-) create mode 100644 rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv22ReportTemplatePatch.java diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/bootstrap/RMDataDictionaryBootstrap.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/bootstrap/RMDataDictionaryBootstrap.xml index 2438e9df54..773090efe0 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/bootstrap/RMDataDictionaryBootstrap.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/bootstrap/RMDataDictionaryBootstrap.xml @@ -210,7 +210,6 @@ - diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties index 6f31dc07f2..5ccd7180cc 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties @@ -6,6 +6,6 @@ module.aliases=org_alfresco_module_dod5015 module.title=Records Management module.description=Alfresco Record Management Extension -module.version=2.1 +module.version=2.2 module.repo.version.min=4.2 \ No newline at end of file diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-patch-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-patch-context.xml index 367293e00e..89748b746c 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-patch-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-patch-context.xml @@ -3,8 +3,8 @@ - - + + @@ -53,8 +53,8 @@ - - @@ -70,8 +70,8 @@ - - @@ -155,7 +155,7 @@ - + @@ -177,7 +177,24 @@ - + - + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/NotificationTemplatePatch_v21.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/NotificationTemplatePatch_v21.java index 5089e204ae..d646df8a52 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/NotificationTemplatePatch_v21.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/NotificationTemplatePatch_v21.java @@ -33,16 +33,14 @@ import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; -import org.springframework.beans.factory.BeanNameAware; /** * Adds a new email template for rejected records to the existing templates * * @author Tuna Aksoy - * @since v2.1 + * @since 2.1 */ public class NotificationTemplatePatch_v21 extends ModulePatchComponent - implements BeanNameAware { /** Email template path */ private static final String PATH_REJECTED = "alfresco/module/org_alfresco_module_rm/bootstrap/content/record-rejected-email.ftl"; @@ -87,36 +85,33 @@ public class NotificationTemplatePatch_v21 extends ModulePatchComponent protected void executePatch() throws Throwable { NodeRef nodeRef = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, CONFIG_NODEID); - if (nodeService.exists(nodeRef) == false) + // get the parent node + NodeRef supersededTemplate = notificationHelper.getSupersededTemplate(); + if (nodeService.exists(nodeRef) == false && nodeService.exists(supersededTemplate) == true) { - // get the parent node - NodeRef supersededTemplate = notificationHelper.getSupersededTemplate(); - if (nodeService.exists(supersededTemplate) == true) - { - NodeRef parent = nodeService.getPrimaryParent(supersededTemplate).getParentRef(); - - // build the node properties - Map props = new HashMap(4); - props.put(ContentModel.PROP_DESCRIPTION, "Record superseded email template."); - props.put(ContentModel.PROP_TITLE, "record-rejected-email.ftl"); - props.put(ContentModel.PROP_NAME, "record-rejected-email.ftl"); - props.put(ContentModel.PROP_NODE_UUID, "record_rejected_template"); - - // get the assoc qname - QName assocQName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, QName.createValidLocalName("record-rejected-email.ftl")); - - // create the node - ChildAssociationRef node = nodeService.createNode(parent, - ContentModel.ASSOC_CONTAINS, - assocQName, - ContentModel.TYPE_CONTENT, - props); - - // put the content - ContentWriter writer = contentService.getWriter(node.getChildRef(), ContentModel.PROP_CONTENT, true); - InputStream is = getClass().getClassLoader().getResourceAsStream(PATH_REJECTED); - writer.putContent(is); - } + NodeRef parent = nodeService.getPrimaryParent(supersededTemplate).getParentRef(); + + // build the node properties + Map props = new HashMap(4); + props.put(ContentModel.PROP_DESCRIPTION, "Record superseded email template."); + props.put(ContentModel.PROP_TITLE, "record-rejected-email.ftl"); + props.put(ContentModel.PROP_NAME, "record-rejected-email.ftl"); + props.put(ContentModel.PROP_NODE_UUID, "record_rejected_template"); + + // get the assoc qname + QName assocQName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, QName.createValidLocalName("record-rejected-email.ftl")); + + // create the node + ChildAssociationRef node = nodeService.createNode(parent, + ContentModel.ASSOC_CONTAINS, + assocQName, + ContentModel.TYPE_CONTENT, + props); + + // put the content + ContentWriter writer = contentService.getWriter(node.getChildRef(), ContentModel.PROP_CONTENT, true); + InputStream is = getClass().getClassLoader().getResourceAsStream(PATH_REJECTED); + writer.putContent(is); } } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv22ReportTemplatePatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv22ReportTemplatePatch.java new file mode 100644 index 0000000000..0832522c96 --- /dev/null +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv22ReportTemplatePatch.java @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2005-2013 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.module.org_alfresco_module_rm.patch; + +import java.io.InputStream; +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +import org.alfresco.model.ContentModel; +import org.alfresco.service.cmr.repository.ChildAssociationRef; +import org.alfresco.service.cmr.repository.ContentService; +import org.alfresco.service.cmr.repository.ContentWriter; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.cmr.repository.StoreRef; +import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.service.namespace.QName; + +/** + * Adds a new transfer/accession report template to the existing report templates + * + * @author Tuna Aksoy + * @since 2.2 + */ +public class RMv22ReportTemplatePatch extends ModulePatchComponent +{ + /** Report template path */ + private static final String REPORT_TEMPLATE_PATH = "alfresco/module/org_alfresco_module_rm/bootstrap/report/report_rmr_transferReport.html.ftl"; + + /** Report template config node IDs */ + private static final String TRANSFER_REPORT = "rmr_transferReport"; + private static final String DESTRUCTION_REPORT = "rmr_destructionReport"; + + /** Node service */ + private NodeService nodeService; + + /** Content service */ + private ContentService contentService; + + /** + * @param nodeService node service + */ + public void setNodeService(NodeService nodeService) + { + this.nodeService = nodeService; + } + + /** + * @param contentService content service + */ + public void setContentService(ContentService contentService) + { + this.contentService = contentService; + } + + @Override + protected void executePatch() throws Throwable + { + NodeRef transferReport = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, TRANSFER_REPORT); + NodeRef destructionReport = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, DESTRUCTION_REPORT); + if (nodeService.exists(transferReport) == false && nodeService.exists(destructionReport) == true) + { + NodeRef parent = nodeService.getPrimaryParent(destructionReport).getParentRef(); + + // get the assoc qname + QName assocQName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, QName.createValidLocalName("report_rmr_transferReport.html.ftl")); + + // build the node properties + Map props = new HashMap(4); + props.put(ContentModel.PROP_DESCRIPTION, "Transfer report template."); + props.put(ContentModel.PROP_TITLE, "Transfer Report Template"); + props.put(ContentModel.PROP_NAME, "report_rmr_transferReport.html.ftl"); + props.put(ContentModel.PROP_NODE_UUID, "rmr_transferReport"); + + // create the node + ChildAssociationRef node = nodeService.createNode(parent, + ContentModel.ASSOC_CONTAINS, + assocQName, + ContentModel.TYPE_CONTENT, + props); + + // put the content + ContentWriter writer = contentService.getWriter(node.getChildRef(), ContentModel.PROP_CONTENT, true); + InputStream is = getClass().getClassLoader().getResourceAsStream(REPORT_TEMPLATE_PATH); + writer.putContent(is); + } + } +} diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/action/TransferReportAction.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/action/TransferReportAction.java index 2c5a67dc0a..a921c09fd5 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/action/TransferReportAction.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/action/TransferReportAction.java @@ -88,28 +88,18 @@ public class TransferReportAction extends BaseReportAction { Map transferNodeProperties = new HashMap(6); - Map properties = nodeService.getProperties(childRef); - String name = (String) properties.get(ContentModel.PROP_NAME); - String identifier = (String) properties.get(RecordsManagementModel.PROP_IDENTIFIER); boolean isFolder = dictionaryService.isSubClass(nodeService.getType(childRef), ContentModel.TYPE_FOLDER); - - transferNodeProperties.put("name", name); - transferNodeProperties.put("identifier", identifier); transferNodeProperties.put("isFolder", isFolder); if (isFolder == true) { - transferNodeProperties.put("records", (ArrayList) getRecords(childRef)); + Map folderProperties = getFolderProperties(childRef); + transferNodeProperties.putAll(folderProperties); } else { - String declaredBy = (String) properties.get(RecordsManagementModel.PROP_DECLARED_BY); - Date declaredOn = (Date) properties.get(RecordsManagementModel.PROP_DECLARED_AT); - boolean isDeclared = nodeService.hasAspect(childRef, RecordsManagementModel.ASPECT_DECLARED_RECORD); - - transferNodeProperties.put("declaredBy", declaredBy); - transferNodeProperties.put("declaredOn", declaredOn); - transferNodeProperties.put("isDeclared", isDeclared); + Map recordProperties = getRecordProperties(childRef); + transferNodeProperties.putAll(recordProperties); } return transferNodeProperties; @@ -128,29 +118,78 @@ public class TransferReportAction extends BaseReportAction for (ChildAssociationRef child : assocs) { NodeRef record = child.getChildRef(); - if (nodeService.hasAspect(record, RecordsManagementModel.ASPECT_RECORD)) + if (nodeService.hasAspect(record, RecordsManagementModel.ASPECT_RECORD) == true) { - Map transferNodeProperties = new HashMap(6); - - Map properties = nodeService.getProperties(record); - String name = (String) properties.get(ContentModel.PROP_NAME); - String identifier = (String) properties.get(RecordsManagementModel.PROP_IDENTIFIER); - String declaredBy = (String) properties.get(RecordsManagementModel.PROP_DECLARED_BY); - Date declaredOn = (Date) properties.get(RecordsManagementModel.PROP_DECLARED_AT); - boolean isDeclared = nodeService.hasAspect(record, RecordsManagementModel.ASPECT_DECLARED_RECORD); - - transferNodeProperties.put("name", name); - transferNodeProperties.put("identifier", identifier); - transferNodeProperties.put("declaredBy", declaredBy); - transferNodeProperties.put("declaredOn", declaredOn); - transferNodeProperties.put("isDeclared", isDeclared); - - records.add(new TransferNode(record, transferNodeProperties)); + Map recordProperties = getRecordProperties(record); + TransferNode transferNode = new TransferNode(record, recordProperties); + records.add(transferNode); } } return records; } + /** + * Helper method to get the common transfer node properties + * + * @param nodeRef Node reference of the transfer node + * @return Map of the common transfer node properties + */ + private Map getCommonProperties(NodeRef nodeRef) + { + Map transferNodeProperties = new HashMap(3); + + Map properties = nodeService.getProperties(nodeRef); + String name = (String) properties.get(ContentModel.PROP_NAME); + String identifier = (String) properties.get(RecordsManagementModel.PROP_IDENTIFIER); + + transferNodeProperties.put("name", name); + transferNodeProperties.put("identifier", identifier); + + return transferNodeProperties; + } + + /** + * Helper method to get the folder specific properties + * + * @param folder Node reference of the folder + * @return Map of the folder specific properties + */ + private Map getFolderProperties(NodeRef folder) + { + Map transferNodeProperties = new HashMap(3); + + Map commonProperties = getCommonProperties(folder); + ArrayList records = (ArrayList) getRecords(folder); + transferNodeProperties.putAll(commonProperties); + transferNodeProperties.put("records", records); + + return transferNodeProperties; + } + + /** + * Helper method to get the record folder properties + * + * @param record Node reference of the record + * @return Map of the record specific properties + */ + private Map getRecordProperties(NodeRef record) + { + Map transferNodeProperties = new HashMap(5); + + Map properties = nodeService.getProperties(record); + String declaredBy = (String) properties.get(RecordsManagementModel.PROP_DECLARED_BY); + Date declaredOn = (Date) properties.get(RecordsManagementModel.PROP_DECLARED_AT); + boolean isDeclared = nodeService.hasAspect(record, RecordsManagementModel.ASPECT_DECLARED_RECORD); + + Map commonProperties = getCommonProperties(record); + transferNodeProperties.putAll(commonProperties); + transferNodeProperties.put("declaredBy", declaredBy); + transferNodeProperties.put("declaredOn", declaredOn); + transferNodeProperties.put("isDeclared", isDeclared); + + return transferNodeProperties; + } + /** * Gets the disposition authority from the list of the transfer nodes *