From fde0de101099d78d21ee3e61c3e99f25f9f39d9c Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Tue, 29 Apr 2014 07:21:54 +0000 Subject: [PATCH] RM-1211: Generate hold report * FileHoldReport capability added (and patched) * hold report type added to report model * hold template added, bootstraped (and patched) * UI action to file hold report added and sensitive to capability * report actions refactored into a single, general purpose, file report action (can be exposed as rule in future) * refactoring and extending of report generators (including declarative report generator) * unit test for file report action * integration test for hold report generation * added Sprin custom property editor registrar and registered QName property editor, this allows short name string forms of QNames to be specified and converted to QName from bean definitions (perhaps something useful for core) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/HEAD@68235 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../bootstrap/RMDataDictionaryBootstrap.xml | 17 ++ .../report/report_rmr_holdReport.html.ftl | 112 +++++++++ .../report/report_rmr_transferReport.html.ftl | 2 + .../rm-capabilities-freeze-context.xml | 19 ++ .../messages/actions.properties | 9 +- .../messages/capability-service.properties | 1 + .../messages/report-model.properties | 12 +- .../messages/report-service.properties | 3 +- .../messages/report-service_de.properties | 2 +- .../messages/report-service_es.properties | 2 +- .../messages/report-service_fr.properties | 2 +- .../messages/report-service_it.properties | 2 +- .../messages/report-service_ja.properties | 2 +- .../messages/report-service_nl.properties | 2 +- .../messages/report-service_zh_CN.properties | 2 +- .../messages/template.properties | 7 +- .../model/recordsPermissionModel.xml | 9 +- .../model/reportModel.xml | 8 +- .../org_alfresco_module_rm/module-context.xml | 17 ++ .../patch/rm-patch-context.xml | 2 +- .../patch/rm-patch-v22-context.xml | 21 ++ .../rm-action-context.xml | 30 +++ .../rm-report-context.xml | 72 ++---- .../rm-ui-evaluators-context.xml | 11 + .../security/rm-default-roles-bootstrap.json | 6 +- .../AuditableActionExecuterAbstractBase.java | 12 +- .../impl/FileReportAction.java} | 45 ++-- .../RecordsManagementAuditServiceImpl.java | 2 +- .../audit/event/AuditEvent.java | 29 ++- .../patch/common/CapabilityPatch.java | 148 ++++++++++++ .../patch/v22/RMv22CapabilityPatch.java | 148 ++---------- .../RMv22FileHoldReportCapabilityPatch.java | 44 ++++ .../patch/v22/RMv22HoldReportPatch.java | 106 +++++++++ .../org_alfresco_module_rm/report/Report.java | 12 + .../report/ReportGenerator.java | 17 +- .../report/ReportModel.java | 16 +- .../report/ReportService.java | 31 +-- .../report/ReportServiceImpl.java | 19 +- .../report/generator/BaseReportGenerator.java | 102 ++++++--- .../generator/DeclarativeReportGenerator.java | 147 ++++++++++-- .../report/generator/ReportInfo.java | 21 ++ .../transfer}/TransferNode.java | 4 +- .../transfer/TransferReportGenerator.java} | 35 ++- .../util/CustomPropertyEditorRegistrar.java | 54 +++++ .../util/QNameTypeEditor.java | 54 +++++ .../integration/IntegrationTestSuite.java | 4 +- .../integration/report/HoldReportTest.java | 166 ++++++++++++++ .../integration/report/ReportTestSuite.java} | 31 ++- .../test/service/ReportServiceImplTest.java | 38 +--- .../test/util/BaseRMTestCase.java | 100 ++++++--- .../action/impl/FileReportActionUnitTest.java | 212 ++++++++++++++++++ .../test/AllUnitTestSuite.java | 6 +- .../test/util/BaseUnitTest.java | 28 +-- 53 files changed, 1575 insertions(+), 428 deletions(-) create mode 100644 rm-server/config/alfresco/module/org_alfresco_module_rm/bootstrap/report/report_rmr_holdReport.html.ftl rename rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/{report/action/BaseReportAction.java => action/impl/FileReportAction.java} (79%) create mode 100644 rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/common/CapabilityPatch.java create mode 100644 rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22FileHoldReportCapabilityPatch.java create mode 100644 rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22HoldReportPatch.java rename rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/{action => generator/transfer}/TransferNode.java (88%) rename rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/{action/TransferReportAction.java => generator/transfer/TransferReportGenerator.java} (85%) create mode 100644 rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/util/CustomPropertyEditorRegistrar.java create mode 100644 rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/util/QNameTypeEditor.java create mode 100644 rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/report/HoldReportTest.java rename rm-server/{source/java/org/alfresco/module/org_alfresco_module_rm/report/action/DestructionReportAction.java => test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/report/ReportTestSuite.java} (53%) create mode 100644 rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/action/impl/FileReportActionUnitTest.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 773090efe0..cc6fe1f97e 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 @@ -227,6 +227,23 @@ + + + + + + + + workspace + SpacesStore + rmr_holdReport + Hold report template. + contentUrl=classpath:alfresco/module/org_alfresco_module_rm/bootstrap/report/report_rmr_holdReport.html.ftl|mimetype=text/plain|encoding=UTF-8 + Hold Report Template + report_rmr_holdReport.html.ftl + + + diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/bootstrap/report/report_rmr_holdReport.html.ftl b/rm-server/config/alfresco/module/org_alfresco_module_rm/bootstrap/report/report_rmr_holdReport.html.ftl new file mode 100644 index 0000000000..fc918fa8dd --- /dev/null +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/bootstrap/report/report_rmr_holdReport.html.ftl @@ -0,0 +1,112 @@ + + + + + + + + + +
+ + + + +
+ + + + + + + +
+ + + + +
+ + + + + +
+ + +
+ ${message("file.report.hold.report")} +
+
+
+ + + + + + + + + + + + + +
${message("file.report.hold.name")}:${node.properties["cm:name"]}
${message("file.report.hold.description")}: + <#if node.properties["cm:description"]??> + ${node.properties["cm:description"]} + +
${message("file.report.hold.reason")}:${node.properties["rma:holdReason"]}
+ <#if node.childAssociations["rma:frozenRecords"]??> +
+ + + + + +
${message("file.report.hold.held")}:
+ + + + +
+ + <#list node.childAssociations["rma:frozenRecords"] as child> + + + + + +
+ + + + + + +
${child.properties["rma:identifier"]} ${child.properties.name}
+
+
+ +
+
+
+
+ +
+
+
+ + \ No newline at end of file diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/bootstrap/report/report_rmr_transferReport.html.ftl b/rm-server/config/alfresco/module/org_alfresco_module_rm/bootstrap/report/report_rmr_transferReport.html.ftl index 38109cfc72..8b4bd71cbe 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/bootstrap/report/report_rmr_transferReport.html.ftl +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/bootstrap/report/report_rmr_transferReport.html.ftl @@ -58,6 +58,7 @@ + <#macro generateTransferFolderHTML transferNode> ${transferNode.properties["name"]?html} @@ -69,6 +70,7 @@ + <#macro generateTransferRecordHTML transferNode>
diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-freeze-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-freeze-context.xml index b11094ba49..623272bc65 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-freeze-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-freeze-context.xml @@ -113,4 +113,23 @@ + + + + + + + + HOLD + + + + + + + + + + \ No newline at end of file diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/actions.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/actions.properties index f377f36af5..f8de00bee7 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/actions.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/actions.properties @@ -175,12 +175,9 @@ retain.description=Retain # Add Record Types addRecordTypes.title=Add record types addRecordTypes.description=Adds the selected type(s) to the record -# Destruction report -destructionReport.title=Destruction report -destructionReport.description=Destruction report -# Transfer Report -transferReport.title=Transfer Report -transferReport.description=Transfer Report +# File report +fileReport.title=File report +fileReport.description=File report # Action parameter constraints rm-ac-is-kind-kinds.record_category=Record Category diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/capability-service.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/capability-service.properties index eba6e0782f..ff6ed3c03b 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/capability-service.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/capability-service.properties @@ -65,6 +65,7 @@ capability.ViewUpdateReasonsForFreeze.title=View Update Reasons for Freeze capability.CreateHold.title=Create Hold capability.AddToHold.title=Add to Hold capability.RemoveFromHold.title=Remove from Hold +capability.FileHoldReport=File Hold Report # Audit capability.group.audit.title=Audit diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-model.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-model.properties index 2e0a528dad..0d85d92411 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-model.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-model.properties @@ -1,7 +1,13 @@ rmr_recordsmanagementreport.description=Records Management Report Content Model -rmr_recordsmanagementreport.type.rmr_report.title=Records Management Report +rmr_recordsmanagementreport.type.rmr_report.title=Report rmr_recordsmanagementreport.type.rmr_report.description=Records management report. -rmr_recordsmanagementreport.type.rmr_destructionReport.title=Records Management Report -rmr_recordsmanagementreport.type.rmr_destructionReport.description=Records management destruction report. \ No newline at end of file +rmr_recordsmanagementreport.type.rmr_destructionReport.title=Transfer Report +rmr_recordsmanagementreport.type.rmr_destructionReport.description=Records management transfer report. + +rmr_recordsmanagementreport.type.rmr_destructionReport.title=Destruction Report +rmr_recordsmanagementreport.type.rmr_destructionReport.description=Records management destruction report. + +rmr_recordsmanagementreport.type.rmr_holdReport.title=Hold Report +rmr_recordsmanagementreport.type.rmr_holdReport.description=Records management hold report. \ No newline at end of file diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service.properties index 56eec14f5d..1b2a8a061e 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service.properties @@ -1,2 +1 @@ -report.rmr_destructionReport.name=Destruction Report (${node.rma:identifier} ${node.cm:name}).html -report.rmr_transferReport.name=Transfer Report (${node.rma:identifier} ${node.cm:name}).html \ No newline at end of file +report.default=Report \ No newline at end of file diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_de.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_de.properties index 07f48bb466..9d9af18268 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_de.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_de.properties @@ -1,2 +1,2 @@ -report.rmr_destructionReport.name=Bericht \u00fcber vernichtete Datens\u00e4tze (${node.rma:identifier} ${node.cm:name}).html +report.rmr_destructionReport.name=Bericht \u00fcber vernichtete Datens\u00e4tze (${node.rma:identifier} ${node.cm:name}) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_es.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_es.properties index 489f57f301..006682b623 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_es.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_es.properties @@ -1,2 +1,2 @@ -report.rmr_destructionReport.name=Informe de destrucci\u00f3n (${node.rma:identifier} ${node.cm:name}).html +report.rmr_destructionReport.name=Informe de destrucci\u00f3n (${node.rma:identifier} ${node.cm:name}) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_fr.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_fr.properties index 5b9f4c690b..4cec45bc1d 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_fr.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_fr.properties @@ -1,2 +1,2 @@ -report.rmr_destructionReport.name=Rapport de destruction (${node.rma:identifier} ${node.cm:name}).html +report.rmr_destructionReport.name=Rapport de destruction (${node.rma:identifier} ${node.cm:name}) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_it.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_it.properties index bd3477583b..878afc2170 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_it.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_it.properties @@ -1,2 +1,2 @@ -report.rmr_destructionReport.name=Report di eliminazione permanente (${node.rma:identifier} ${node.cm:name}).html +report.rmr_destructionReport.name=Report di eliminazione permanente (${node.rma:identifier} ${node.cm:name}) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_ja.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_ja.properties index 02514738d0..3515f5f391 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_ja.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_ja.properties @@ -1,2 +1,2 @@ -report.rmr_destructionReport.name=\u5ec3\u68c4\u30ec\u30dd\u30fc\u30c8(${node.rma:identifier} ${node.cm:name}).html +report.rmr_destructionReport.name=\u5ec3\u68c4\u30ec\u30dd\u30fc\u30c8(${node.rma:identifier} ${node.cm:name}) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_nl.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_nl.properties index 4b8da92623..e93210895a 100755 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_nl.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_nl.properties @@ -1,2 +1,2 @@ -report.rmr_destructionReport.name=Vernietingsrapport (${node.rma:identifier} ${node.cm:name}).html +report.rmr_destructionReport.name=Vernietingsrapport (${node.rma:identifier} ${node.cm:name}) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_zh_CN.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_zh_CN.properties index b5c3d8e9e9..95c1c8b339 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_zh_CN.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-service_zh_CN.properties @@ -1,2 +1,2 @@ -report.rmr_destructionReport.name=\u9500\u6bc1\u62a5\u544a (${node.rma:identifier} ${node.cm:name}).html +report.rmr_destructionReport.name=\u9500\u6bc1\u62a5\u544a (${node.rma:identifier} ${node.cm:name}) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/template.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/template.properties index f5a08e6703..91991d3cb7 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/template.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/template.properties @@ -17,4 +17,9 @@ file.report.performed.by=Performed By file.report.record=Record file.report.record.folder=Record Folder file.report.unique.folder.identifier=Unique Folder Identifier -file.report.unique.record.identifier=Unique Record Identifier \ No newline at end of file +file.report.unique.record.identifier=Unique Record Identifier +file.report.hold.report=Hold Report +file.report.hold.name=Hold Name +file.report.hold.description=Hold Description +file.report.hold.reason=Hold Reason +file.report.hold.held=Held \ No newline at end of file diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/model/recordsPermissionModel.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/model/recordsPermissionModel.xml index b31734f6f7..8d938b3e37 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/model/recordsPermissionModel.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/model/recordsPermissionModel.xml @@ -92,6 +92,7 @@ + @@ -177,6 +178,7 @@ + @@ -454,7 +456,7 @@ - + @@ -467,6 +469,11 @@ + + + + + \ No newline at end of file diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/model/reportModel.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/model/reportModel.xml index 52c1f408f9..a69c725725 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/model/reportModel.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/model/reportModel.xml @@ -35,11 +35,15 @@ cm:content - Report + Destruction Report rmr:report - Transfer + Transfer Report + rmr:report + + + Hold Report rmr:report diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/module-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/module-context.xml index 07652571d4..1b1674c29f 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/module-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/module-context.xml @@ -3,6 +3,23 @@ + + + + + + + + + + + + + + + + diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-context.xml index a0db2e26fa..0277a9f386 100755 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-context.xml @@ -9,7 +9,7 @@ - + diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v22-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v22-context.xml index 7b68e88c1c..2c076cf37b 100755 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v22-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v22-context.xml @@ -59,5 +59,26 @@ ${rm.ghosting.enabled} + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-action-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-action-context.xml index 32b65eb8d8..63d2541b26 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-action-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-action-context.xml @@ -1054,5 +1054,35 @@ + + + + + + + + + + + + + + + + + + + + + + + org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementAction.execute=RM_ALLOW + org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementAction.*=RM_ALLOW + org.alfresco.repo.action.executer.ActionExecuter.*=RM_ALLOW + + + \ No newline at end of file diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-report-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-report-context.xml index 9887108d07..835c39182c 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-report-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-report-context.xml @@ -74,72 +74,32 @@ - + + - + - - - - - - - - - - - - - - - - - - - - + + + + + + rma:transfer + - - - - org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementAction.execute=RM_CAP.0.rma:filePlanComponent.FileTransferReport - org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementAction.*=RM_ALLOW - org.alfresco.repo.action.executer.ActionExecuter.*=RM_ALLOW - - - - - - - - - - - - - - - - - - - - - org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementAction.execute=RM_CAP.0.rma:filePlanComponent.FileDestructionReport - org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementAction.*=RM_ALLOW - org.alfresco.repo.action.executer.ActionExecuter.*=RM_ALLOW - + + + + + rma:hold + diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-ui-evaluators-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-ui-evaluators-context.xml index e3595a659e..e60fc9c43d 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-ui-evaluators-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-ui-evaluators-context.xml @@ -868,4 +868,15 @@ + + + + + + HOLD + + + + diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/security/rm-default-roles-bootstrap.json b/rm-server/config/alfresco/module/org_alfresco_module_rm/security/rm-default-roles-bootstrap.json index 10a0fe56c3..85d331cd96 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/security/rm-default-roles-bootstrap.json +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/security/rm-default-roles-bootstrap.json @@ -141,7 +141,8 @@ "FileTransferReport", "CreateHold", "AddToHold", - "RemoveFromHold" + "RemoveFromHold", + "FileHoldReport" ] }, { @@ -211,7 +212,8 @@ "FileTransferReport", "CreateHold", "AddToHold", - "RemoveFromHold" + "RemoveFromHold", + "FileHoldReport" ] } ] \ No newline at end of file diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/AuditableActionExecuterAbstractBase.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/AuditableActionExecuterAbstractBase.java index 43eb5f726b..35ae6c2af1 100755 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/AuditableActionExecuterAbstractBase.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/AuditableActionExecuterAbstractBase.java @@ -96,7 +96,17 @@ public abstract class AuditableActionExecuterAbstractBase extends ActionExecuter if (auditable) { - getAuditService().registerAuditEvent(this.getActionDefinition().getName(), this.getActionDefinition().getTitle()); + // get the details of the action + String name = getActionDefinition().getName(); + String title = getActionDefinition().getTitle(); + if (title == null || title.isEmpty()) + { + // default to name if no title available + title = name; + } + + // register audit event + getAuditService().registerAuditEvent(title, name); } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/action/BaseReportAction.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/FileReportAction.java similarity index 79% rename from rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/action/BaseReportAction.java rename to rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/FileReportAction.java index 2e6e891cae..bfa33cc3dd 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/action/BaseReportAction.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/impl/FileReportAction.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2013 Alfresco Software Limited. + * Copyright (C) 2005-2014 Alfresco Software Limited. * * This file is part of Alfresco * @@ -16,10 +16,7 @@ * 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.report.action; - -import java.io.Serializable; -import java.util.Map; +package org.alfresco.module.org_alfresco_module_rm.action.impl; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; @@ -36,16 +33,20 @@ import org.apache.commons.lang.StringUtils; import org.springframework.extensions.surf.util.I18NUtil; /** - * Base class for the report action classes + * File report generic action. * * @author Tuna Aksoy * @since 2.2 */ -public abstract class BaseReportAction extends RMActionExecuterAbstractBase implements ReportModel +public class FileReportAction extends RMActionExecuterAbstractBase implements ReportModel { + /** action name */ + public static final String NAME = "fileReport"; + /** Constants for the parameters passed from the UI */ public static final String REPORT_TYPE = "reportType"; public static final String DESTINATION = "destination"; + public static final String MIMETYPE= "mimetype"; /** I18N */ private static final String MSG_PARAM_NOT_SUPPLIED = "rm.action.parameter-not-supplied"; @@ -67,28 +68,30 @@ public abstract class BaseReportAction extends RMActionExecuterAbstractBase impl @Override protected void executeImpl(Action action, NodeRef actionedUponNodeRef) { - // TODO check that the actionedUponNodeRef is in a state to generate a destruction report - // ie: is it eligable for destruction .. use fileDestructionReport capability! - - // TODO allow the mimetype of the report to be specified as a parameter - + // get the mimetype of the report + String mimetype = (String)action.getParameterValue(MIMETYPE); + if (mimetype == null || mimetype.isEmpty()) + { + mimetype = MimetypeMap.MIMETYPE_HTML; + } + + // get the report type QName reportType = getReportType(action); - Report report = reportService.generateReport(reportType, actionedUponNodeRef, MimetypeMap.MIMETYPE_HTML, addProperties(actionedUponNodeRef)); - + + // get the destination NodeRef destination = getDestination(action); + + // generate the report + Report report = reportService.generateReport(reportType, actionedUponNodeRef, mimetype); + + // file the report NodeRef filedReport = reportService.fileReport(destination, report); + // return the report name String filedReportName = (String) nodeService.getProperty(filedReport, ContentModel.PROP_NAME); action.setParameterValue(ActionExecuterAbstractBase.PARAM_RESULT, filedReportName); } - /** - * Gives other action classes to pass additional properties for the template model - * - * @return Properties which are passed to the template model - */ - protected abstract Map addProperties(NodeRef nodeRef); - /** * Retrieves the value of the given parameter. If the parameter has not been passed from the UI an error will be thrown * diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/audit/RecordsManagementAuditServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/audit/RecordsManagementAuditServiceImpl.java index 3ab9dcf2f3..3311d639a3 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/audit/RecordsManagementAuditServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/audit/RecordsManagementAuditServiceImpl.java @@ -1181,7 +1181,7 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean { List listAuditEvents = new ArrayList(this.auditEvents.size()); listAuditEvents.addAll(this.auditEvents.values()); - Collections.sort(listAuditEvents, new AuditEvent()); + Collections.sort(listAuditEvents); return listAuditEvents; } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AuditEvent.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AuditEvent.java index 17f3815e25..c3ab2f7cb9 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AuditEvent.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AuditEvent.java @@ -18,10 +18,9 @@ */ package org.alfresco.module.org_alfresco_module_rm.audit.event; -import java.util.Comparator; - import org.alfresco.module.org_alfresco_module_rm.audit.RecordsManagementAuditService; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; +import org.alfresco.util.ParameterCheck; import org.springframework.extensions.surf.util.I18NUtil; @@ -32,7 +31,7 @@ import org.springframework.extensions.surf.util.I18NUtil; * @author Roy Wetherall * @since 1.0 */ -public class AuditEvent implements RecordsManagementModel, Comparator +public class AuditEvent implements RecordsManagementModel, Comparable { /** Name */ protected String name; @@ -55,15 +54,19 @@ public class AuditEvent implements RecordsManagementModel, Comparator. + */ +package org.alfresco.module.org_alfresco_module_rm.patch.common; + +import java.util.Set; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.module.org_alfresco_module_rm.capability.Capability; +import org.alfresco.module.org_alfresco_module_rm.capability.CapabilityService; +import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; +import org.alfresco.module.org_alfresco_module_rm.patch.AbstractModulePatch; +import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService; +import org.alfresco.module.org_alfresco_module_rm.role.Role; +import org.alfresco.service.cmr.repository.NodeRef; + +/** + * Abstract implementation of capability patch. + * + * @author Roy Wetherall + * @since 2.2 + */ +public abstract class CapabilityPatch extends AbstractModulePatch +{ + /** File plan service */ + private FilePlanService filePlanService; + + /** File plan role service */ + private FilePlanRoleService filePlanRoleService; + + /** Capability service */ + private CapabilityService capabilityService; + + /** + * @param filePlanRoleService file plan role service + */ + public void setFilePlanRoleService(FilePlanRoleService filePlanRoleService) + { + this.filePlanRoleService = filePlanRoleService; + } + + /** + * @param capabilityService capability service + */ + public void setCapabilityService(CapabilityService capabilityService) + { + this.capabilityService = capabilityService; + } + + /** + * @param filePlanService file plan service + */ + public void setFilePlanService(FilePlanService filePlanService) + { + this.filePlanService = filePlanService; + } + + /** + * Helper method to get the file plans + * + * @return Set of file plan node references + */ + protected Set getFilePlans() + { + return filePlanService.getFilePlans(); + } + + /** + * Adds a new capability to the specified roles. + * + * @param filePlan file plan + * @param capabilityName capability name + * @param roles roles + */ + protected void addCapability(NodeRef filePlan, String capabilityName, String ... roles) + { + Capability capability = capabilityService.getCapability(capabilityName); + if (capability == null) + { + throw new AlfrescoRuntimeException("Can't patch capabilities, because capability " + capabilityName + " does not exist."); + } + + for (String roleName : roles) + { + Role role = filePlanRoleService.getRole(filePlan, roleName); + + if (role != null) + { + // get the roles current capabilities + Set capabilities = role.getCapabilities(); + + // only update if the capability is missing + if (!capabilities.contains(capability)) + { + if (logger.isDebugEnabled()) + { + logger.debug(" ... adding capability " + capabilityName + " to role " + role.getName()); + } + + capabilities.add(capability); + filePlanRoleService.updateRole(filePlan, role.getName(), role.getDisplayLabel(), capabilities); + } + } + } + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.patch.AbstractModulePatch#applyInternal() + */ + @Override + public void applyInternal() + { + Set filePlans = getFilePlans(); + + if (logger.isDebugEnabled()) + { + logger.debug(" ... updating " + filePlans.size() + " file plans"); + } + + for (NodeRef filePlan : filePlans) + { + if (logger.isDebugEnabled()) + { + logger.debug(" ... updating file plan " + filePlan.toString()); + } + + // apply the capability patch to each file plan + applyCapabilityPatch(filePlan); + } + } + + protected abstract void applyCapabilityPatch(NodeRef filePlan); +} diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22CapabilityPatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22CapabilityPatch.java index 33bb7340ef..b20a70170c 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22CapabilityPatch.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22CapabilityPatch.java @@ -18,15 +18,8 @@ */ package org.alfresco.module.org_alfresco_module_rm.patch.v22; -import java.util.Set; - -import org.alfresco.error.AlfrescoRuntimeException; -import org.alfresco.module.org_alfresco_module_rm.capability.Capability; -import org.alfresco.module.org_alfresco_module_rm.capability.CapabilityService; -import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; -import org.alfresco.module.org_alfresco_module_rm.patch.AbstractModulePatch; +import org.alfresco.module.org_alfresco_module_rm.patch.common.CapabilityPatch; import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService; -import org.alfresco.module.org_alfresco_module_rm.role.Role; import org.alfresco.service.cmr.repository.NodeRef; /** @@ -35,128 +28,29 @@ import org.alfresco.service.cmr.repository.NodeRef; * @author Tuna Aksoy * @since 2.2 */ -public class RMv22CapabilityPatch extends AbstractModulePatch +public class RMv22CapabilityPatch extends CapabilityPatch { - - /** File plan service */ - private FilePlanService filePlanService; - - /** File plan role service */ - private FilePlanRoleService filePlanRoleService; - - /** Capability service */ - private CapabilityService capabilityService; - /** - * @param filePlanRoleService file plan role service + * @see org.alfresco.module.org_alfresco_module_rm.patch.common.CapabilityPatch#applyCapabilityPatch(org.alfresco.service.cmr.repository.NodeRef) */ - public void setFilePlanRoleService(FilePlanRoleService filePlanRoleService) + protected void applyCapabilityPatch(NodeRef filePlan) { - this.filePlanRoleService = filePlanRoleService; - } - - /** - * @param capabilityService capability service - */ - public void setCapabilityService(CapabilityService capabilityService) - { - this.capabilityService = capabilityService; - } - - /** - * @param filePlanService file plan service - */ - public void setFilePlanService(FilePlanService filePlanService) - { - this.filePlanService = filePlanService; - } - - /** - * Helper method to get the file plans - * - * @return Set of file plan node references - */ - protected Set getFilePlans() - { - return filePlanService.getFilePlans(); - } - - /** - * Adds a new capability to the specified roles. - * - * @param filePlan file plan - * @param capabilityName capability name - * @param roles roles - */ - protected void addCapability(NodeRef filePlan, String capabilityName, String ... roles) - { - Capability capability = capabilityService.getCapability(capabilityName); - if (capability == null) - { - throw new AlfrescoRuntimeException("Unable to bootstrap RMv21 capabilities, because capability " + capabilityName + " does not exist."); - } - - for (String roleName : roles) - { - Role role = filePlanRoleService.getRole(filePlan, roleName); - - if (role != null) - { - // get the roles current capabilities - Set capabilities = role.getCapabilities(); - - // only update if the capability is missing - if (!capabilities.contains(capability)) - { - if (logger.isDebugEnabled()) - { - logger.debug(" ... adding capability " + capabilityName + " to role " + role.getName()); - } - - capabilities.add(capability); - filePlanRoleService.updateRole(filePlan, role.getName(), role.getDisplayLabel(), capabilities); - } - } - } - } - - /** - * @see org.alfresco.module.org_alfresco_module_rm.patch.AbstractModulePatch#applyInternal() - */ - @Override - public void applyInternal() - { - Set filePlans = getFilePlans(); - - if (logger.isDebugEnabled()) - { - logger.debug(" ... updating " + filePlans.size() + " file plans"); - } - - for (NodeRef filePlan : filePlans) - { - if (logger.isDebugEnabled()) - { - logger.debug(" ... updating file plan " + filePlan.toString()); - } - - // add new capability - addCapability(filePlan, - "FileDestructionReport", - FilePlanRoleService.ROLE_ADMIN, - FilePlanRoleService.ROLE_RECORDS_MANAGER); - addCapability(filePlan, - "CreateHold", - FilePlanRoleService.ROLE_ADMIN, - FilePlanRoleService.ROLE_RECORDS_MANAGER); - addCapability(filePlan, - "AddToHold", - FilePlanRoleService.ROLE_ADMIN, - FilePlanRoleService.ROLE_RECORDS_MANAGER); - addCapability(filePlan, - "RemoveFromHold", - FilePlanRoleService.ROLE_ADMIN, - FilePlanRoleService.ROLE_RECORDS_MANAGER); - } + // add new capability + addCapability(filePlan, + "FileDestructionReport", + FilePlanRoleService.ROLE_ADMIN, + FilePlanRoleService.ROLE_RECORDS_MANAGER); + addCapability(filePlan, + "CreateHold", + FilePlanRoleService.ROLE_ADMIN, + FilePlanRoleService.ROLE_RECORDS_MANAGER); + addCapability(filePlan, + "AddToHold", + FilePlanRoleService.ROLE_ADMIN, + FilePlanRoleService.ROLE_RECORDS_MANAGER); + addCapability(filePlan, + "RemoveFromHold", + FilePlanRoleService.ROLE_ADMIN, + FilePlanRoleService.ROLE_RECORDS_MANAGER); } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22FileHoldReportCapabilityPatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22FileHoldReportCapabilityPatch.java new file mode 100644 index 0000000000..33169e9090 --- /dev/null +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22FileHoldReportCapabilityPatch.java @@ -0,0 +1,44 @@ +/* + * 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.v22; + +import org.alfresco.module.org_alfresco_module_rm.patch.common.CapabilityPatch; +import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService; +import org.alfresco.service.cmr.repository.NodeRef; + +/** + * RM v2.2 patch to add FileHoldReport capability. + * + * @author Roy Wetherall + * @since 2.2 + */ +public class RMv22FileHoldReportCapabilityPatch extends CapabilityPatch +{ + /** + * @see org.alfresco.module.org_alfresco_module_rm.patch.common.CapabilityPatch#applyCapabilityPatch(org.alfresco.service.cmr.repository.NodeRef) + */ + protected void applyCapabilityPatch(NodeRef filePlan) + { + // add new capability + addCapability(filePlan, + "FileHoldReport", + FilePlanRoleService.ROLE_ADMIN, + FilePlanRoleService.ROLE_RECORDS_MANAGER); + } +} diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22HoldReportPatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22HoldReportPatch.java new file mode 100644 index 0000000000..144f5a0f29 --- /dev/null +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22HoldReportPatch.java @@ -0,0 +1,106 @@ +/* + * 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.v22; + +import java.io.InputStream; +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +import org.alfresco.model.ContentModel; +import org.alfresco.module.org_alfresco_module_rm.patch.AbstractModulePatch; +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 the hold report. + * + * @author Roy Wetherall + * @since 2.2 + */ +public class RMv22HoldReportPatch extends AbstractModulePatch +{ + /** Report template path */ + private static final String REPORT_TEMPLATE_PATH = "alfresco/module/org_alfresco_module_rm/bootstrap/report/report_rmr_holdReport.html.ftl"; + + /** Report template config node IDs */ + private static final NodeRef REPORT_FOLDER = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, "rm_report_templates"); + private static final NodeRef REPORT = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, "rmr_holdReport"); + + /** 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; + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.patch.AbstractModulePatch#applyInternal() + */ + @Override + public void applyInternal() + { + if (!nodeService.exists(REPORT)) + { + // get the assoc qname + QName assocQName = QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, QName.createValidLocalName("report_rmr_holdReport.html.ftl")); + + // build the node properties + Map props = new HashMap(4); + props.put(ContentModel.PROP_DESCRIPTION, "Hold report template."); + props.put(ContentModel.PROP_TITLE, "Hold Report Template"); + props.put(ContentModel.PROP_NAME, "report_rmr_holdReport.html.ftl"); + props.put(ContentModel.PROP_NODE_UUID, "rmr_holdReport"); + + // create the node + ChildAssociationRef node = nodeService.createNode( + REPORT_FOLDER, + 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/Report.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/Report.java index 5c90cd14e8..5e470692b5 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/Report.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/Report.java @@ -32,12 +32,24 @@ import org.alfresco.service.namespace.QName; */ public interface Report { + /** + * @return {@link QName} report type + */ QName getReportType(); + /** + * @return {@link String} report name + */ String getReportName(); + /** + * @return {@link Map}<{@link QName},{@link Serializable}> report properties + */ Map getReportProperties(); + /** + * @return {@link ContentReader} content reader to report content + */ ContentReader getReportContent(); } 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 ca474b6cb8..9a03aa0d5a 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,21 +18,28 @@ */ 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; /** + * Report generator interface. + * * @author Roy Wetherall * @since 2.1 */ public interface ReportGenerator { + /** + * @return {@link QName} report type + */ QName getReportType(); + /** + * Generate report. + * + * @param reportedUponNodeRef + * @param mimetype + * @return + */ 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/ReportModel.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/ReportModel.java index 710fdccae0..c087fde6da 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/ReportModel.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/ReportModel.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2011 Alfresco Software Limited. + * Copyright (C) 2005-2014 Alfresco Software Limited. * * This file is part of Alfresco * @@ -24,14 +24,26 @@ import org.alfresco.service.namespace.QName; * Helper class containing records management report qualified names * * @author Roy Wetherall + * @since 2.1 */ public interface ReportModel { - // Namespace details + /** Namespace details */ String RMR_URI = "http://www.alfresco.org/model/recordsmanagementreport/1.0"; String RMR_PREFIX = "rmr"; + /** base report type */ QName TYPE_REPORT = QName.createQName(RMR_URI, "report"); + + /** destruction report type */ QName TYPE_DESTRUCTION_REPORT = QName.createQName(RMR_URI, "destructionReport"); + + /** transfer report type */ QName TYPE_TRANSFER_REPORT = QName.createQName(RMR_URI, "transferReport"); + + /** + * hold report type + * @since 2.2 + */ + QName TYPE_HOLD_REPORT = QName.createQName(RMR_URI, "holdReport"); } 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 33b8e5defc..b9f289755d 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,8 +18,6 @@ */ 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; @@ -43,36 +41,31 @@ public interface ReportService /** * Get a list of the available report types. * - * @return + * @return {@link Set}<{@link QName}> list of the available report types */ Set getReportTypes(); /** + * Generate a report of the given type and reported upon node reference. * - * - * @param reportType - * @param reportedUponNodeRef - * @return + * @param reportType report type + * @param reportedUponNodeRef reported upon node reference + * @return {@link Report} generated report */ Report generateReport(QName reportType, NodeRef reportedUponNodeRef); /** + * Generate a report for a specified mimetype. + * + * @see #generateReport(QName, NodeRef) * - * @param reportType - * @param reportedUponNodeRef - * @return + * @param reportType report type + * @param reportedUponNodeRef report upon node reference + * @param mimetype report mimetype + * @return {@link Report} generated report */ 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 f0ce806699..e67a45884c 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 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2013 Alfresco Software Limited. + * Copyright (C) 2005-2014 Alfresco Software Limited. * * This file is part of Alfresco * @@ -18,7 +18,6 @@ */ 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; @@ -95,20 +94,6 @@ public class ReportServiceImpl extends ServiceBaseImpl ParameterCheck.mandatory("reportedUponNodeRef", reportedUponNodeRef); 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); @@ -119,7 +104,7 @@ public class ReportServiceImpl extends ServiceBaseImpl } // generate the report - return generator.generateReport(reportedUponNodeRef, mimetype, properties); + return generator.generateReport(reportedUponNodeRef, mimetype); } /** 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 d4bf413c8f..87fb74c0a9 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 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2013 Alfresco Software Limited. + * Copyright (C) 2005-2014 Alfresco Software Limited. * * This file is part of Alfresco * @@ -19,9 +19,9 @@ package org.alfresco.module.org_alfresco_module_rm.report.generator; import java.io.Serializable; -import java.util.HashMap; import java.util.Map; +import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.module.org_alfresco_module_rm.report.Report; import org.alfresco.module.org_alfresco_module_rm.report.ReportGenerator; import org.alfresco.module.org_alfresco_module_rm.report.ReportService; @@ -32,79 +32,119 @@ import org.alfresco.service.namespace.QName; import org.alfresco.util.ParameterCheck; /** + * Base report generator. + * * @author Roy Wetherall * @since 2.1 */ public abstract class BaseReportGenerator implements ReportGenerator { + /** report service */ protected ReportService reportService; + /** namespace service */ protected NamespaceService namespaceService; - protected String reportTypeName; - + /** report type qualified name */ protected QName reportType; + /** + * @param reportService report service + */ public void setReportService(ReportService reportService) { this.reportService = reportService; } + /** + * @param namespaceService namespace service + */ public void setNamespaceService(NamespaceService namespaceService) { this.namespaceService = namespaceService; } - - public void setReportTypeName(String reportTypeName) + + /** + * @param reportType report type + */ + public void setReportType(QName reportType) { - this.reportTypeName = reportTypeName; + this.reportType = reportType; } - + + /** + * @see org.alfresco.module.org_alfresco_module_rm.report.ReportGenerator#getReportType() + */ @Override public QName getReportType() { return reportType; } + /** + * Init method + */ public void init() { - // convert type name to QName - reportType = QName.createQName(reportTypeName, namespaceService); - + // ensure required values have been set + ParameterCheck.mandatory("reportType", reportType); + // register report generator reportService.registerReportGenerator(this); } + /** + * @see org.alfresco.module.org_alfresco_module_rm.report.ReportGenerator#generateReport(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, java.util.Map) + */ @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, properties); + // check the applicability of the report generator for the given reported upon node + checkReportApplicability(reportedUponNodeRef); + + // generate the report name + String reportName = generateReportName(reportedUponNodeRef, mimetype); + + // generate the report meta-data + Map reportProperties = generateReportMetadata(reportedUponNodeRef); + + // generate the report content + ContentReader contentReader = generateReportContent(reportedUponNodeRef, mimetype, generateReportTemplateContext(reportedUponNodeRef)); + + // return the report information object return new ReportInfo(reportType, reportName, reportProperties, contentReader); } + + /** + * Checks whether the report generator is applicable given the reported upon node reference. + *

+ * Throws AlfrescoRuntimeException if applicability fails, with reason. + * + * @param reportedUponNodeRef reported upon node reference + * @throws AlfrescoRuntimeException if applicability check fails + */ + protected abstract void checkReportApplicability(NodeRef reportedUponNodeRef) throws AlfrescoRuntimeException; - protected abstract String generateReportName(NodeRef reportedUponNodeRef); + /** + * Generate the report name + */ + protected abstract String generateReportName(NodeRef reportedUponNodeRef, String mimetype); - protected Map generateReportProperties(NodeRef reportedUponNodeRef) - { - // default implementation - return new HashMap(0); - } + /** + * Generate the report template context. + */ + protected abstract Map generateReportTemplateContext(NodeRef reportedUponNodeRef); + + /** + * Generate report meta-data + */ + protected abstract Map generateReportMetadata(NodeRef reportedUponNodeRef); + /** + * Generate report content + */ 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 29f6ee574c..f4d44fc0fe 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 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2013 Alfresco Software Limited. + * Copyright (C) 2005-2014 Alfresco Software Limited. * * This file is part of Alfresco * @@ -19,21 +19,28 @@ package org.alfresco.module.org_alfresco_module_rm.report.generator; import java.io.Serializable; +import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.Set; import org.alfresco.error.AlfrescoRuntimeException; -import org.alfresco.repo.action.parameter.ParameterProcessorComponent; +import org.alfresco.model.ContentModel; import org.alfresco.repo.admin.SysAdminParams; +import org.alfresco.repo.i18n.StaticMessageLookup; import org.alfresco.repo.model.Repository; +import org.alfresco.service.cmr.dictionary.DictionaryService; +import org.alfresco.service.cmr.dictionary.TypeDefinition; import org.alfresco.service.cmr.model.FileFolderService; import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.repository.MimetypeService; 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.cmr.repository.TemplateService; +import org.alfresco.service.namespace.QName; import org.alfresco.util.UrlUtil; import org.springframework.extensions.surf.util.I18NUtil; @@ -45,12 +52,18 @@ import org.springframework.extensions.surf.util.I18NUtil; */ public class DeclarativeReportGenerator extends BaseReportGenerator { + /** message lookups */ + protected static final String MSG_REPORT = "report.default"; + /** 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"; + + /** applicable reported upon types */ + protected Set applicableTypes; /** content service */ protected ContentService contentService; @@ -67,12 +80,23 @@ public class DeclarativeReportGenerator extends BaseReportGenerator /** repository helper */ protected Repository repository; - /** parameter processor component */ - protected ParameterProcessorComponent parameterProcessorComponent; - + /** node service */ + protected NodeService nodeService; + + /** dictionary service */ + protected DictionaryService dictionaryService; + /** sys admin params */ protected SysAdminParams sysAdminParams; + /** + * @param applicableTypes applicable types + */ + public void setApplicableTypes(Set applicableTypes) + { + this.applicableTypes = applicableTypes; + } + /** * @param mimetypeService mimetype service */ @@ -106,11 +130,19 @@ public class DeclarativeReportGenerator extends BaseReportGenerator } /** - * @param parameterProcessorComponent parameter processor component + * @param nodeService node service */ - public void setParameterProcessorComponent(ParameterProcessorComponent parameterProcessorComponent) + public void setNodeService(NodeService nodeService) { - this.parameterProcessorComponent = parameterProcessorComponent; + this.nodeService = nodeService; + } + + /** + * @param dictionaryService dictionary service + */ + public void setDictionaryService(DictionaryService dictionaryService) + { + this.dictionaryService = dictionaryService; } /** @@ -128,16 +160,47 @@ 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) + protected String generateReportName(NodeRef reportedUponNodeRef, String mimetype) { - String reportTypeName = reportType.getPrefixedQName(namespaceService).getPrefixString().replace(":", "_"); - String value = I18NUtil.getMessage("report." + reportTypeName + ".name"); - return parameterProcessorComponent.process(value, reportedUponNodeRef); + // get the file extension based on the mimetype + String extension = mimetypeService.getExtension(mimetype); + + // get the name of the reported updon node ref + String name = (String)nodeService.getProperty(reportedUponNodeRef, ContentModel.PROP_NAME); + + // build default report name + StringBuilder builder = new StringBuilder(); + builder.append(getReportDisplayLabel()); + if (name != null & !name.isEmpty()) + { + builder.append(" - ").append(name); + } + builder.append(".").append(extension); + + return builder.toString(); + } + + /** + * Helper method to get the report types display label + * + * @return {@link String} report type display label + */ + private String getReportDisplayLabel() + { + String result = I18NUtil.getMessage(MSG_REPORT); + + TypeDefinition typeDef = dictionaryService.getType(reportType); + if (typeDef != null) + { + result = typeDef.getTitle(new StaticMessageLookup()); + } + + return result; } /** @@ -165,6 +228,14 @@ public class DeclarativeReportGenerator extends BaseReportGenerator return contentWriter.getReader(); } + /** + * Create template model. + * + * @param templateNodeRef + * @param reportedUponNodeRef + * @param properties + * @return + */ protected Map createTemplateModel(NodeRef templateNodeRef, NodeRef reportedUponNodeRef, Map properties) { Map model = new HashMap(); @@ -214,8 +285,6 @@ public class DeclarativeReportGenerator extends BaseReportGenerator // get localise template return fileFolderService.getLocalizedSibling(reportTemplateNodeRef); - - } /** @@ -239,4 +308,52 @@ public class DeclarativeReportGenerator extends BaseReportGenerator return sb.toString(); } + /** + * @see org.alfresco.module.org_alfresco_module_rm.report.generator.BaseReportGenerator#checkReportApplicability(org.alfresco.service.cmr.repository.NodeRef) + */ + @Override + protected void checkReportApplicability(NodeRef reportedUponNodeRef) throws AlfrescoRuntimeException + { + if (applicableTypes != null && applicableTypes.size() != 0) + { + boolean isTypeApplicable = false; + QName type = nodeService.getType(reportedUponNodeRef); + + for (QName applicableType : applicableTypes) + { + if (dictionaryService.isSubClass(type, applicableType)) + { + isTypeApplicable = true; + break; + } + } + + if (!isTypeApplicable) + { + // throw an exception + throw new AlfrescoRuntimeException("Can't generate report, because the provided reported upon node reference is type " + type.toString() + + " which is not an applicable type for a " + reportType.toString() + " report."); + } + } + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.report.generator.BaseReportGenerator#generateReportTemplateContext(org.alfresco.service.cmr.repository.NodeRef) + */ + @SuppressWarnings("unchecked") + @Override + protected Map generateReportTemplateContext(NodeRef reportedUponNodeRef) + { + return Collections.EMPTY_MAP; + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.report.generator.BaseReportGenerator#generateReportMetadata(org.alfresco.service.cmr.repository.NodeRef) + */ + @SuppressWarnings("unchecked") + @Override + protected Map generateReportMetadata(NodeRef reportedUponNodeRef) + { + return Collections.EMPTY_MAP; + } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/generator/ReportInfo.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/generator/ReportInfo.java index 9f1d262047..69409be361 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/generator/ReportInfo.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/generator/ReportInfo.java @@ -45,6 +45,14 @@ import org.springframework.extensions.surf.util.ParameterCheck; /** content reader */ private ContentReader reportContent; + /** + * Default constructor. + * + * @param reportType report type + * @param reportName report name + * @param reportProperties report properties + * @param reportContent report content reader + */ public ReportInfo(QName reportType, String reportName, Map reportProperties, ContentReader reportContent) { ParameterCheck.mandatory("reportType", reportType); @@ -57,22 +65,35 @@ import org.springframework.extensions.surf.util.ParameterCheck; this.reportContent = reportContent; } + /** + * @see org.alfresco.module.org_alfresco_module_rm.report.Report#getReportType() + */ public QName getReportType() { return reportType; } + /** + * @see org.alfresco.module.org_alfresco_module_rm.report.Report#getReportName() + */ @Override public String getReportName() { return reportName; } + /** + * @see org.alfresco.module.org_alfresco_module_rm.report.Report#getReportProperties() + */ + @Override public Map getReportProperties() { return reportProperties; } + /** + * @see org.alfresco.module.org_alfresco_module_rm.report.Report#getReportContent() + */ @Override public ContentReader getReportContent() { diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/action/TransferNode.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/generator/transfer/TransferNode.java similarity index 88% rename from rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/action/TransferNode.java rename to rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/generator/transfer/TransferNode.java index 624d08376b..69b68ddd77 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/action/TransferNode.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/generator/transfer/TransferNode.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2013 Alfresco Software Limited. + * Copyright (C) 2005-2014 Alfresco Software Limited. * * This file is part of Alfresco * @@ -16,7 +16,7 @@ * 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.report.action; +package org.alfresco.module.org_alfresco_module_rm.report.generator.transfer; import java.io.Serializable; import java.util.Map; 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/generator/transfer/TransferReportGenerator.java similarity index 85% rename from rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/action/TransferReportAction.java rename to rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/generator/transfer/TransferReportGenerator.java index 0fc13819db..0aa90b952f 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/generator/transfer/TransferReportGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2013 Alfresco Software Limited. + * Copyright (C) 2005-2014 Alfresco Software Limited. * * This file is part of Alfresco * @@ -16,7 +16,7 @@ * 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.report.action; +package org.alfresco.module.org_alfresco_module_rm.report.generator.transfer; import java.io.Serializable; import java.util.ArrayList; @@ -27,7 +27,9 @@ import java.util.Map; import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedule; +import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; +import org.alfresco.module.org_alfresco_module_rm.report.generator.DeclarativeReportGenerator; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.namespace.QName; @@ -35,21 +37,33 @@ import org.alfresco.service.namespace.RegexQNamePattern; import org.apache.commons.lang.StringUtils; /** - * Transfer report action - * + * Transfer report generator. + * * @author Tuna Aksoy + * @author Roy Wetherall * @since 2.2 */ -public class TransferReportAction extends BaseReportAction +public class TransferReportGenerator extends DeclarativeReportGenerator { - /** Action name */ - public static final String NAME = "transferReport"; - + /** dispotion service */ + protected DispositionService dispositionService; + + /** + * @param dispositionService disposition service + */ + public void setDispositionService(DispositionService dispositionService) + { + this.dispositionService = dispositionService; + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.report.generator.DeclarativeReportGeneratorUnitTest#generateReportTemplateContext(org.alfresco.service.cmr.repository.NodeRef) + */ @Override - protected Map addProperties(NodeRef nodeRef) + protected Map generateReportTemplateContext(NodeRef reportedUponNodeRef) { // Get all 'transferred' nodes - List transferNodes = getTransferNodes(nodeRef); + List transferNodes = getTransferNodes(reportedUponNodeRef); // Get the disposition authority String dispositionAuthority = getDispositionAuthority(transferNodes); @@ -215,4 +229,5 @@ public class TransferReportAction extends BaseReportAction } return dispositionAuthority == null ? StringUtils.EMPTY : dispositionAuthority; } + } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/util/CustomPropertyEditorRegistrar.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/util/CustomPropertyEditorRegistrar.java new file mode 100644 index 0000000000..3c2e4e9653 --- /dev/null +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/util/CustomPropertyEditorRegistrar.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2005-2011 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.util; + +import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.service.namespace.QName; +import org.springframework.beans.PropertyEditorRegistrar; +import org.springframework.beans.PropertyEditorRegistry; + +/** + * Custom property editor registrar. + * + * @author Roy Wetherall + * @since 2.2 + */ +public class CustomPropertyEditorRegistrar implements PropertyEditorRegistrar +{ + /** namespace service */ + private NamespaceService namespaceService; + + /** + * @param namespaceService namespace service + */ + public void setNamespaceService(NamespaceService namespaceService) + { + this.namespaceService = namespaceService; + } + + /** + * @see org.springframework.beans.PropertyEditorRegistrar#registerCustomEditors(org.springframework.beans.PropertyEditorRegistry) + */ + @Override + public void registerCustomEditors(PropertyEditorRegistry registry) + { + // add custom QName editor + registry.registerCustomEditor(QName.class, new QNameTypeEditor(namespaceService)); + } +} diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/util/QNameTypeEditor.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/util/QNameTypeEditor.java new file mode 100644 index 0000000000..679dd7ebad --- /dev/null +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/util/QNameTypeEditor.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2005-2011 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.util; + +import java.beans.PropertyEditorSupport; + +import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.service.namespace.QName; + +/** + * QName type editor. + * + * @author Roy Wetherall + * @since 2.2 + */ +public class QNameTypeEditor extends PropertyEditorSupport +{ + /** namespace service */ + private NamespaceService namespaceService; + + /** + * @param namespaceService namespace service + */ + public QNameTypeEditor(NamespaceService namespaceService) + { + this.namespaceService = namespaceService; + } + + /** + * @see java.beans.PropertyEditorSupport#setAsText(java.lang.String) + */ + @Override + public void setAsText(String text) throws IllegalArgumentException + { + // convert prefix string to QName + setValue(QName.createQName(text, namespaceService)); + } +} diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/IntegrationTestSuite.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/IntegrationTestSuite.java index 20d246662a..c3cb55c707 100755 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/IntegrationTestSuite.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/IntegrationTestSuite.java @@ -21,6 +21,7 @@ package org.alfresco.module.org_alfresco_module_rm.test.integration; import org.alfresco.module.org_alfresco_module_rm.test.integration.dod.DoD5015TestSuite; import org.alfresco.module.org_alfresco_module_rm.test.integration.event.EventTestSuite; import org.alfresco.module.org_alfresco_module_rm.test.integration.issue.IssueTestSuite; +import org.alfresco.module.org_alfresco_module_rm.test.integration.report.ReportTestSuite; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @@ -37,7 +38,8 @@ import org.junit.runners.Suite.SuiteClasses; { DoD5015TestSuite.class, IssueTestSuite.class, - EventTestSuite.class + EventTestSuite.class, + ReportTestSuite.class }) public class IntegrationTestSuite { diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/report/HoldReportTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/report/HoldReportTest.java new file mode 100644 index 0000000000..2cb6eb3470 --- /dev/null +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/report/HoldReportTest.java @@ -0,0 +1,166 @@ +/* + * Copyright (C) 2005-2014 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.test.integration.report; + +import java.util.Set; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.module.org_alfresco_module_rm.report.Report; +import org.alfresco.module.org_alfresco_module_rm.report.ReportModel; +import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase; +import org.alfresco.repo.content.MimetypeMap; +import org.alfresco.service.cmr.repository.ContentReader; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.namespace.QName; +import org.springframework.extensions.webscripts.GUID; + +/** + * Hold report integration tests. + *

+ * Relates to: + * - https://issues.alfresco.com/jira/browse/RM-1211 + * + * @author Roy Wetherall + * @since 2.2 + */ +public class HoldReportTest extends BaseRMTestCase implements ReportModel +{ + @Override + protected boolean isRecordTest() + { + return true; + } + + /** + * ensure that 'rmr:holdReport' is in the list of those available + */ + public void testHoldReportTypeAvailable() + { + doBehaviourDrivenTest(new BehaviourDrivenTest() + { + private Set reportTypes; + + public void when() + { + reportTypes = reportService.getReportTypes(); + } + + public void then() + { + assertNotNull(reportTypes); + assertTrue(reportTypes.contains(TYPE_HOLD_REPORT)); + } + }); + } + + /** + * given that the reported upon node is not a hold, ensure that an error is raised when + * the report is generated. + */ + public void testReportedUponNodeIsNotAHold() + { + doBehaviourDrivenTest(new BehaviourDrivenTest(AlfrescoRuntimeException.class) + { + private NodeRef reportedUponNodeRef; + + public void given() + { + reportedUponNodeRef = recordFolderService.createRecordFolder(rmContainer, GUID.generate()); + } + + public void when() + { + reportService.generateReport(TYPE_HOLD_REPORT, reportedUponNodeRef); + } + + public void after() + { + // remove created folder + nodeService.deleteNode(reportedUponNodeRef); + } + }); + } + + /** + * Given a hold that contains items, ensure the report is generated as expected + */ + public void testGenerateHoldReport() + { + doBehaviourDrivenTest(new BehaviourDrivenTest() + { + private static final String HOLD_NAME = "holdName"; + private static final String HOLD_REASON = "holdReason"; + private static final String HOLD_DESCRIPTION = "holdDescription"; + private static final String FOLDER1_NAME = "folder1Name"; + + private NodeRef hold; + private NodeRef folder1; + private Report report; + + public void given() + { + // crate a hold + hold = holdService.createHold(filePlan, HOLD_NAME, HOLD_REASON, HOLD_DESCRIPTION); + + // add some items to the hold + folder1 = recordFolderService.createRecordFolder(rmContainer, FOLDER1_NAME); + holdService.addToHold(hold, folder1); + holdService.addToHold(hold, recordOne); + } + + public void when() + { + report = reportService.generateReport(TYPE_HOLD_REPORT, hold, MimetypeMap.MIMETYPE_HTML); + } + + public void then() + { + assertNotNull(report); + assertEquals(TYPE_HOLD_REPORT, report.getReportType()); + assertTrue(report.getReportProperties().isEmpty()); + + // check the name has been generated correctly + assertNotNull(report.getReportName()); + assertTrue(report.getReportName().contains("Hold Report")); + assertTrue(report.getReportName().contains(HOLD_NAME)); + assertTrue(report.getReportName().contains(".html")); + + // check the content reader + ContentReader reader = report.getReportContent(); + assertNotNull(reader); + assertEquals(MimetypeMap.MIMETYPE_HTML, reader.getMimetype()); + + // check the content + String reportContent = reader.getContentString(); + assertNotNull(reportContent); + assertTrue(reportContent.contains(HOLD_NAME)); + assertTrue(reportContent.contains(HOLD_REASON)); + assertTrue(reportContent.contains(HOLD_DESCRIPTION)); + assertTrue(reportContent.contains(FOLDER1_NAME)); + assertTrue(reportContent.contains("one")); + } + + public void after() + { + holdService.deleteHold(hold); + nodeService.deleteNode(folder1); + } + }); + } +} diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/action/DestructionReportAction.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/report/ReportTestSuite.java similarity index 53% rename from rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/action/DestructionReportAction.java rename to rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/report/ReportTestSuite.java index b910a7a036..e32531429b 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/report/action/DestructionReportAction.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/report/ReportTestSuite.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2013 Alfresco Software Limited. + * Copyright (C) 2005-2014 Alfresco Software Limited. * * This file is part of Alfresco * @@ -16,28 +16,23 @@ * 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.report.action; +package org.alfresco.module.org_alfresco_module_rm.test.integration.report; -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; - -import org.alfresco.service.cmr.repository.NodeRef; +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import org.junit.runners.Suite.SuiteClasses; /** - * Destruction report action + * Report integration test suite * - * @author Tuna Aksoy + * @author Roy Wetherall * @since 2.2 */ -public class DestructionReportAction extends BaseReportAction +@RunWith(Suite.class) +@SuiteClasses( +{ + HoldReportTest.class +}) +public class ReportTestSuite { - /** Action name */ - public static final String NAME = "destructionReport"; - - @Override - protected Map addProperties(NodeRef nodeRef) - { - return new HashMap(1); - } } diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/ReportServiceImplTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/ReportServiceImplTest.java index 8677b98309..32e0e7667f 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/ReportServiceImplTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/ReportServiceImplTest.java @@ -19,7 +19,6 @@ package org.alfresco.module.org_alfresco_module_rm.test.service; import java.io.Serializable; -import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.Set; @@ -28,12 +27,10 @@ import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementAction import org.alfresco.module.org_alfresco_module_rm.action.impl.CompleteEventAction; import org.alfresco.module.org_alfresco_module_rm.action.impl.CutOffAction; import org.alfresco.module.org_alfresco_module_rm.action.impl.DestroyAction; +import org.alfresco.module.org_alfresco_module_rm.action.impl.FileReportAction; import org.alfresco.module.org_alfresco_module_rm.action.impl.TransferAction; import org.alfresco.module.org_alfresco_module_rm.report.Report; import org.alfresco.module.org_alfresco_module_rm.report.ReportModel; -import org.alfresco.module.org_alfresco_module_rm.report.action.DestructionReportAction; -import org.alfresco.module.org_alfresco_module_rm.report.action.TransferNode; -import org.alfresco.module.org_alfresco_module_rm.report.action.TransferReportAction; import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase; import org.alfresco.module.org_alfresco_module_rm.test.util.CommonRMTestUtils; import org.alfresco.repo.content.MimetypeMap; @@ -84,7 +81,7 @@ public class ReportServiceImplTest extends BaseRMTestCase implements ReportModel System.out.println(destructionReport.getReportContent().getContentString()); // Transfer Report - Report transferReport = generateTransfertReport(); + Report transferReport = reportService.generateReport(TYPE_TRANSFER_REPORT, getTransferObject(), MimetypeMap.MIMETYPE_HTML); System.out.println(transferReport.getReportName()); System.out.println(transferReport.getReportContent().getContentString()); @@ -128,22 +125,7 @@ public class ReportServiceImplTest extends BaseRMTestCase implements ReportModel { return reportService.generateReport(TYPE_DESTRUCTION_REPORT, rmFolder); } - - /** - * Helper method to generate a transfer report - * - * @return Transfer report - */ - private Report generateTransfertReport() - { - Map properties = new HashMap(2); - ArrayList transferNodes = new ArrayList(1); - String dispositionAuthority = StringUtils.EMPTY; - properties.put("transferNodes", transferNodes); - properties.put("dispositionAuthority", dispositionAuthority); - return reportService.generateReport(TYPE_TRANSFER_REPORT, getTransferObject(), MimetypeMap.MIMETYPE_HTML, properties); - } - + /** * Helper method to file a destruction report * @@ -162,7 +144,7 @@ public class ReportServiceImplTest extends BaseRMTestCase implements ReportModel */ private NodeRef fileTransferReport() { - Report transferReport = generateTransfertReport(); + Report transferReport = reportService.generateReport(TYPE_TRANSFER_REPORT, getTransferObject(), MimetypeMap.MIMETYPE_HTML); return reportService.fileReport(filePlan, transferReport); } @@ -181,9 +163,9 @@ public class ReportServiceImplTest extends BaseRMTestCase implements ReportModel rmActionService.executeRecordsManagementAction(rmFolder, DestroyAction.NAME); Map fileReportParams = new HashMap(2); - fileReportParams.put(DestructionReportAction.REPORT_TYPE, "rmr:destructionReport"); - fileReportParams.put(DestructionReportAction.DESTINATION, filePlan.toString()); - rmActionService.executeRecordsManagementAction(rmFolder, DestructionReportAction.NAME, fileReportParams); + fileReportParams.put(FileReportAction.REPORT_TYPE, "rmr:destructionReport"); + fileReportParams.put(FileReportAction.DESTINATION, filePlan.toString()); + rmActionService.executeRecordsManagementAction(rmFolder, FileReportAction.NAME, fileReportParams); return null; } }); @@ -198,9 +180,9 @@ public class ReportServiceImplTest extends BaseRMTestCase implements ReportModel { // Create transfer report for the transfer object Map params = new HashMap(2); - params.put(TransferReportAction.REPORT_TYPE, "rmr:transferReport"); - params.put(TransferReportAction.DESTINATION, filePlan.toString()); - RecordsManagementActionResult transferReportAction = rmActionService.executeRecordsManagementAction(getTransferObject(), TransferReportAction.NAME, params); + params.put(FileReportAction.REPORT_TYPE, "rmr:transferReport"); + params.put(FileReportAction.DESTINATION, filePlan.toString()); + RecordsManagementActionResult transferReportAction = rmActionService.executeRecordsManagementAction(getTransferObject(), FileReportAction.NAME, params); // Check transfer report result String transferReportName = (String) transferReportAction.getValue(); assertFalse(StringUtils.isBlank(transferReportName)); diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java index f63ae08cb1..5f5df891f1 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java @@ -810,49 +810,99 @@ public abstract class BaseRMTestCase extends RetryingTransactionHelperTestCase } } + /** + * Execute behaviour driven test. + * + * @param test + */ protected void doBehaviourDrivenTest(BehaviourDrivenTest test) { test.run(); } + /** + * Behaviour driven test. + * + * @author Roy Wetherall + * @since 2.2 + */ protected abstract class BehaviourDrivenTest { - public abstract void given(); + protected Class expectedException; - public abstract void when(); + public BehaviourDrivenTest() + { + } - public abstract void then(); + public BehaviourDrivenTest(Class expectedException) + { + this.expectedException = expectedException; + } + + public void given() { /** empty implementation */ } + + public void when() { /** empty implementation */ } + + public void then() { /** empty implementation */ } + + public void after() { /** empty implementation */ } public void run() { - doTestInTransaction(new VoidTest() - { - @Override - public void runImpl() throws Exception - { - given(); - } - }); - - doTestInTransaction(new VoidTest() + try { + doTestInTransaction(new VoidTest() + { + @Override + public void runImpl() throws Exception + { + given(); + } + }); - @Override - public void runImpl() throws Exception + if (expectedException == null) { - when(); + doTestInTransaction(new VoidTest() + { + @Override + public void runImpl() throws Exception + { + when(); + } + }); + + doTestInTransaction(new VoidTest() + { + @Override + public void runImpl() throws Exception + { + then(); + } + }); } - }); - - doTestInTransaction(new VoidTest() - { - - @Override - public void runImpl() throws Exception + else { - then(); + doTestInTransaction(new FailureTest(expectedException) + { + @Override + public void run() throws Exception + { + when(); + } + }); } - }); + } + finally + { + doTestInTransaction(new VoidTest() + { + @Override + public void runImpl() throws Exception + { + after(); + } + }); + } } } } diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/action/impl/FileReportActionUnitTest.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/action/impl/FileReportActionUnitTest.java new file mode 100644 index 0000000000..5042afb20b --- /dev/null +++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/action/impl/FileReportActionUnitTest.java @@ -0,0 +1,212 @@ +/* + * Copyright (C) 2005-2014 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.action.impl; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.model.ContentModel; +import org.alfresco.module.org_alfresco_module_rm.report.Report; +import org.alfresco.module.org_alfresco_module_rm.test.util.BaseUnitTest; +import org.alfresco.repo.action.executer.ActionExecuterAbstractBase; +import org.alfresco.repo.content.MimetypeMap; +import org.alfresco.service.cmr.action.Action; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.namespace.QName; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +/** + * Unit test for file report action. + * + * @author Roy Wetherall + * @since 2.2 + */ +public class FileReportActionUnitTest extends BaseUnitTest +{ + /** report name */ + private static final String REPORT_NAME = "testReportName"; + + /** actioned upon node reference */ + private NodeRef actionedUponNodeRef; + + /** mocked action */ + private @Mock Action mockedAction; + + /** mocked report */ + private @Mock Report mockedReport; + + /** file report action */ + private @InjectMocks FileReportAction fileReportAction; + + /** + * @see org.alfresco.module.org_alfresco_module_rm.test.util.BaseUnitTest#before() + */ + @Override + public void before() + { + super.before(); + + // actioned upon node reference + actionedUponNodeRef = generateRecord(); + + // mocked action + fileReportAction.setAuditable(false); + } + + /** + * Helper to mock an action parameter value + */ + private void mockActionParameterValue(String name, String value) + { + doReturn(value).when(mockedAction).getParameterValue(name); + } + + /** + * given the destination is not set, ensure that an exception is thrown + */ + @Test + public void destinationNotSet() + { + // == given == + + // set action parameter values + mockActionParameterValue(FileReportAction.MIMETYPE, MimetypeMap.MIMETYPE_HTML); + mockActionParameterValue(FileReportAction.REPORT_TYPE, "rma:destructionReport"); + + // expected exception + exception.expect(AlfrescoRuntimeException.class); + + // == when == + + // execute action + fileReportAction.execute(mockedAction, actionedUponNodeRef); + + // == then == + verifyZeroInteractions(mockedReportService, mockedNodeService); + } + + /** + * given no report type set, ensure that an exception is thrown + */ + @Test + public void reportTypeNotSet() + { + // == given == + + // set action parameter values + mockActionParameterValue(FileReportAction.MIMETYPE, MimetypeMap.MIMETYPE_HTML); + mockActionParameterValue(FileReportAction.DESTINATION, generateNodeRef().toString()); + + // expected exception + exception.expect(AlfrescoRuntimeException.class); + + // == when == + + // execute action + fileReportAction.execute(mockedAction, actionedUponNodeRef); + + // == then == + verifyZeroInteractions(mockedReportService, mockedNodeService); + } + + /** + * given the file report action is executed, ensure the service interactions and returned result + * are correct. + */ + @Test + public void fileReport() + { + // == given == + + // data + NodeRef destination = generateNodeRef(); + NodeRef filedReport = generateNodeRef(); + String reportType = "rma:destructionReport"; + QName reportTypeQName = QName.createQName(RM_URI, "destructionReport"); + String mimetype = MimetypeMap.MIMETYPE_HTML; + + // set action parameter values + mockActionParameterValue(FileReportAction.MIMETYPE, mimetype); + mockActionParameterValue(FileReportAction.DESTINATION, destination.toString()); + mockActionParameterValue(FileReportAction.REPORT_TYPE, reportType); + + // setup service interactions + doReturn(mockedReport).when(mockedReportService).generateReport(reportTypeQName, actionedUponNodeRef, mimetype); + doReturn(filedReport).when(mockedReportService).fileReport(destination, mockedReport); + doReturn(REPORT_NAME).when(mockedNodeService).getProperty(filedReport, ContentModel.PROP_NAME); + + // == when == + + // execute action + fileReportAction.execute(mockedAction, actionedUponNodeRef); + + // == then == + + // verify interactions + verify(mockedReportService, times(1)).generateReport(reportTypeQName, actionedUponNodeRef, mimetype); + verify(mockedReportService, times(1)).fileReport(destination, mockedReport); + verify(mockedNodeService, times(1)).getProperty(filedReport, ContentModel.PROP_NAME); + verify(mockedAction, times(1)).setParameterValue(ActionExecuterAbstractBase.PARAM_RESULT, REPORT_NAME); + } + + /** + * given the file report action is executed with no mimetype set, ensure that a report is generated + * with the default mimetype. + */ + @Test + public void fileReportDefaultMimetype() + { + // == given == + + // data + NodeRef destination = generateNodeRef(); + NodeRef filedReport = generateNodeRef(); + String reportType = "rma:destructionReport"; + QName reportTypeQName = QName.createQName(RM_URI, "destructionReport"); + String mimetype = MimetypeMap.MIMETYPE_HTML; + + // set action parameter values + mockActionParameterValue(FileReportAction.DESTINATION, destination.toString()); + mockActionParameterValue(FileReportAction.REPORT_TYPE, reportType); + + // setup service interactions + doReturn(mockedReport).when(mockedReportService).generateReport(reportTypeQName, actionedUponNodeRef, mimetype); + doReturn(filedReport).when(mockedReportService).fileReport(destination, mockedReport); + doReturn(REPORT_NAME).when(mockedNodeService).getProperty(filedReport, ContentModel.PROP_NAME); + + // == when == + + // execute action + fileReportAction.execute(mockedAction, actionedUponNodeRef); + + // == then == + + // verify interactions + verify(mockedReportService, times(1)).generateReport(reportTypeQName, actionedUponNodeRef, mimetype); + verify(mockedReportService, times(1)).fileReport(destination, mockedReport); + verify(mockedNodeService, times(1)).getProperty(filedReport, ContentModel.PROP_NAME); + verify(mockedAction, times(1)).setParameterValue(ActionExecuterAbstractBase.PARAM_RESULT, REPORT_NAME); + + } +} diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/AllUnitTestSuite.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/AllUnitTestSuite.java index e16ff323bd..de6593468a 100644 --- a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/AllUnitTestSuite.java +++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/AllUnitTestSuite.java @@ -18,6 +18,7 @@ */ package org.alfresco.module.org_alfresco_module_rm.test; +import org.alfresco.module.org_alfresco_module_rm.action.impl.FileReportActionUnitTest; import org.alfresco.module.org_alfresco_module_rm.capability.declarative.condition.HoldCapabilityConditionUnitTest; import org.alfresco.module.org_alfresco_module_rm.forms.RecordsManagementTypeFormFilterUnitTest; import org.alfresco.module.org_alfresco_module_rm.hold.HoldServiceImplUnitTest; @@ -62,7 +63,10 @@ import org.junit.runners.Suite.SuiteClasses; HoldPutUnitTest.class, // capability conditions - HoldCapabilityConditionUnitTest.class + HoldCapabilityConditionUnitTest.class, + + // action implementations + FileReportActionUnitTest.class }) public class AllUnitTestSuite { diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseUnitTest.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseUnitTest.java index 9389e5b40f..e8655e93ec 100644 --- a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseUnitTest.java +++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseUnitTest.java @@ -37,6 +37,7 @@ import org.alfresco.module.org_alfresco_module_rm.identifier.IdentifierService; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; import org.alfresco.module.org_alfresco_module_rm.record.RecordService; import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService; +import org.alfresco.module.org_alfresco_module_rm.report.ReportService; import org.alfresco.module.org_alfresco_module_rm.util.ServiceBaseImpl; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.repo.transaction.RetryingTransactionHelper; @@ -82,24 +83,25 @@ public class BaseUnitTest implements RecordsManagementModel protected NodeRef record; /** core service mocks */ - @Mock(name="nodeService") protected NodeService mockedNodeService; - @Mock(name="dictionaryService") protected DictionaryService mockedDictionaryService; - @Mock(name="namespaceService") protected NamespaceService mockedNamespaceService; - @Mock(name="identifierService") protected IdentifierService mockedIdentifierService; - @Mock(name="permissionService") protected PermissionService mockedPermissionService; - @Mock(name="ownableService") protected OwnableService mockedOwnableService; - @Mock(name="searchService") protected SearchService mockedSearchService; - @Mock(name="retryingTransactionHelper") protected RetryingTransactionHelper mockedRetryingTransactionHelper; + @Mock(name="nodeService") protected NodeService mockedNodeService; + @Mock(name="dictionaryService") protected DictionaryService mockedDictionaryService; + @Mock(name="namespaceService") protected NamespaceService mockedNamespaceService; + @Mock(name="identifierService") protected IdentifierService mockedIdentifierService; + @Mock(name="permissionService") protected PermissionService mockedPermissionService; + @Mock(name="ownableService") protected OwnableService mockedOwnableService; + @Mock(name="searchService") protected SearchService mockedSearchService; + @Mock(name="retryingTransactionHelper") protected RetryingTransactionHelper mockedRetryingTransactionHelper; /** rm service mocks */ - @Mock(name="filePlanService") protected FilePlanService mockedFilePlanService; - @Mock(name="recordFolderService") protected RecordFolderService mockedRecordFolderService; - @Mock(name="recordService") protected RecordService mockedRecordService; - @Mock(name="holdService") protected HoldService mockedHoldService; + @Mock(name="filePlanService") protected FilePlanService mockedFilePlanService; + @Mock(name="recordFolderService") protected RecordFolderService mockedRecordFolderService; + @Mock(name="recordService") protected RecordService mockedRecordService; + @Mock(name="holdService") protected HoldService mockedHoldService; @Mock(name="recordsManagementActionService") protected RecordsManagementActionService mockedRecordsManagementActionService; + @Mock(name="reportService") protected ReportService mockedReportService; /** application context mock */ - @Mock(name="applicationContext") protected ApplicationContext mockedApplicationContext; + @Mock(name="applicationContext") protected ApplicationContext mockedApplicationContext; /** expected exception rule */ @Rule