From 139d83bab501304baa687cdf617811ad3231f83a Mon Sep 17 00:00:00 2001 From: Samuel Langlois Date: Wed, 31 Oct 2012 10:51:54 +0000 Subject: [PATCH 01/38] Tagged RM 2.0.1 build 147 revision 42983 as TAGS/V2.0.1 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/TAGS/V2.0.1@43258 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 From 7513235f4e778cfe3e5198a9261e763366ff34c6 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Wed, 17 Jul 2013 15:19:35 +0000 Subject: [PATCH 02/38] RM-769 (Impossible to add access for several values) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.0@52785 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../alfresco/extension/ehcache-custom.xml | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 rm-server/config/alfresco/extension/ehcache-custom.xml diff --git a/rm-server/config/alfresco/extension/ehcache-custom.xml b/rm-server/config/alfresco/extension/ehcache-custom.xml new file mode 100644 index 0000000000..d646f4885c --- /dev/null +++ b/rm-server/config/alfresco/extension/ehcache-custom.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + From 6aac0fce36e9c186db7221c6406b34f74d95c688 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Tue, 27 Aug 2013 06:13:20 +0000 Subject: [PATCH 03/38] RM-876: Wrong RM version(actual: 2.0.2, must be: 2.0.3). git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.0@54472 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- gradle.properties | 2 +- .../alfresco/module/org_alfresco_module_rm/module.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index f5756a2a5a..54b3170cb3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ groupid=alfresco packageName=rm -version=2.0.2 +version=2.0.3 build=dev alfrescoBaseVersion=4.1.4 diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties index ed5f7435ab..fcfa904742 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties @@ -6,7 +6,7 @@ module.aliases=org_alfresco_module_dod5015 module.title=Records Management module.description=Alfresco Record Management Extension -module.version=2.0.2 +module.version=2.0.3 module.repo.version.min=4.1.4 module.repo.version.max=4.1.99 \ No newline at end of file From fe73bfa98aa96c69d143281872ea9f7ab7004b55 Mon Sep 17 00:00:00 2001 From: Samuel Langlois Date: Fri, 6 Sep 2013 11:25:25 +0000 Subject: [PATCH 04/38] RM-904 Create V2.0.1.x branch from V2.0.1 tag, to host hotfixes git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.0.1.x@55032 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 From e4fac727bb89ff478ed63a6fa809f01fedaee734 Mon Sep 17 00:00:00 2001 From: Samuel Langlois Date: Fri, 6 Sep 2013 12:19:09 +0000 Subject: [PATCH 05/38] Incremented version label (2.0.1.1) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.0.1.x@55047 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index e1167a1fd1..535b36b9d6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ groupid=alfresco packageName=rm -version=2.0.1 +version=2.0.1.1 build=dev alfrescoBaseVersion=4.0.2 From d755bbaf85a56bb151b61cf2c719c84834908d88 Mon Sep 17 00:00:00 2001 From: Jared Ottley Date: Mon, 16 Sep 2013 19:35:16 +0000 Subject: [PATCH 06/38] Merge recordsmanagement/DEV/DODRECERT to recordsmanagement/BRANCHES/V2.0.1.x for: RM-904: Actions are missing within Records Management Site for Record Series and its children: r51134: DOD Recert: Upgrade issues * added patch to fill in missing file plan root node reference * default site id set when retrieving saved searches git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.0.1.x@55365 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../org_alfresco_module_rm/log4j.properties | 1 + .../model/recordsModel.xml | 1 - .../rm-patch-context.xml | 16 +++ .../patch/RMv2FilePlanNodeRefPatch.java | 134 ++++++++++++++++++ .../patch/RMv2ModelPatch.java | 4 +- .../search/SavedSearchDetails.java | 10 +- 6 files changed, 159 insertions(+), 7 deletions(-) create mode 100644 rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2FilePlanNodeRefPatch.java diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/log4j.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/log4j.properties index 57c59d75ba..ec18e783e1 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/log4j.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/log4j.properties @@ -1,2 +1,3 @@ log4j.logger.org.alfresco.module.org_alfresco_module_rm.caveat=warn log4j.logger.org.alfresco.module.org_alfresco_module_rm.security.RMMethodSecurityPostProcessor=warn +log4j.logger.org.alfresco.module.org_alfresco_module_rm.patch=debug diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/model/recordsModel.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/model/recordsModel.xml index 0be4c0dee8..94c3a75c1a 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/model/recordsModel.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/model/recordsModel.xml @@ -576,7 +576,6 @@ - File Plan Component false diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-patch-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-patch-context.xml index 8c0dd0e455..0a28801ddc 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-patch-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-patch-context.xml @@ -31,5 +31,21 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2FilePlanNodeRefPatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2FilePlanNodeRefPatch.java new file mode 100644 index 0000000000..526b4756cb --- /dev/null +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2FilePlanNodeRefPatch.java @@ -0,0 +1,134 @@ +/* + * 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.patch; + +import java.util.List; + +import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService; +import org.alfresco.module.org_alfresco_module_rm.dod5015.DOD5015Model; +import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; +import org.alfresco.repo.domain.node.NodeDAO; +import org.alfresco.repo.domain.patch.PatchDAO; +import org.alfresco.repo.domain.qname.QNameDAO; +import org.alfresco.repo.module.AbstractModuleComponent; +import org.alfresco.repo.policy.BehaviourFilter; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.namespace.QName; +import org.alfresco.util.Pair; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.BeanNameAware; + +/** + * RM v2.0 File Plan Node Ref Patch + * + * @author Roy Wetherall + */ +public class RMv2FilePlanNodeRefPatch extends AbstractModuleComponent + implements BeanNameAware, RecordsManagementModel, DOD5015Model +{ + /** Logger */ + private static Log logger = LogFactory.getLog(RMv2FilePlanNodeRefPatch.class); + + private NodeService nodeService; + private RecordsManagementService recordsManagementService; + private BehaviourFilter behaviourFilter; + private PatchDAO patchDAO; + private NodeDAO nodeDAO; + private QNameDAO qnameDAO; + + public void setNodeService(NodeService nodeService) + { + this.nodeService = nodeService; + } + + public void setRecordsManagementService(RecordsManagementService recordsManagementService) + { + this.recordsManagementService = recordsManagementService; + } + + public void setBehaviourFilter(BehaviourFilter behaviourFilter) + { + this.behaviourFilter = behaviourFilter; + } + + public void setPatchDAO(PatchDAO patchDAO) + { + this.patchDAO = patchDAO; + } + + public void setNodeDAO(NodeDAO nodeDAO) + { + this.nodeDAO = nodeDAO; + } + + public void setQnameDAO(QNameDAO qnameDAO) + { + this.qnameDAO = qnameDAO; + } + + /** + * @see org.alfresco.repo.module.AbstractModuleComponent#executeInternal() + */ + @Override + protected void executeInternal() throws Throwable + { + if (logger.isDebugEnabled() == true) + { + logger.debug("RM Module RMv2FilePlanNodeRef Patch ..."); + } + + Pair aspectPair = qnameDAO.getQName(ASPECT_FILE_PLAN_COMPONENT); + if (aspectPair != null) + { + List records = patchDAO.getNodesByAspectQNameId(aspectPair.getFirst(), 0L, patchDAO.getMaxAdmNodeID()); + + if (logger.isDebugEnabled() == true) + { + logger.debug(" ... updating " + records.size() + " items" ); + } + + behaviourFilter.disableBehaviour(); + try + { + for (Long record : records) + { + Pair recordPair = nodeDAO.getNodePair(record); + NodeRef recordNodeRef = recordPair.getSecond(); + + if (nodeService.getProperty(recordNodeRef, PROP_ROOT_NODEREF) == null) + { + nodeService.setProperty(recordNodeRef, PROP_ROOT_NODEREF, recordsManagementService.getFilePlan(recordNodeRef)); + } + } + } + finally + { + behaviourFilter.enableBehaviour(); + } + } + + if (logger.isDebugEnabled() == true) + { + logger.debug(" ... complete RM Module RMv2FilePlanNodeRef Patch"); + } + + } +} diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2ModelPatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2ModelPatch.java index 545d846d92..b4b1e5368b 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2ModelPatch.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2ModelPatch.java @@ -43,7 +43,7 @@ public class RMv2ModelPatch extends AbstractModuleComponent implements BeanNameAware, RecordsManagementModel, DOD5015Model { /** Logger */ - private static Log logger = LogFactory.getLog(NotificationTemplatePatch.class); + private static Log logger = LogFactory.getLog(RMv2ModelPatch.class); private static long BATCH_SIZE = 100000L; @@ -80,7 +80,7 @@ public class RMv2ModelPatch extends AbstractModuleComponent { if (logger.isDebugEnabled() == true) { - logger.debug("RM Module NotificationTemplatePatch ..."); + logger.debug("RM Module RMv2ModelPatch ..."); } updateQName(QName.createQName(DOD_URI, "filePlan"), TYPE_FILE_PLAN, "TYPE"); diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/search/SavedSearchDetails.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/search/SavedSearchDetails.java index 4c0dc935a1..53d6923a03 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/search/SavedSearchDetails.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/search/SavedSearchDetails.java @@ -89,6 +89,8 @@ public class SavedSearchDetails extends ReportDetails public static final String SORT = "sort"; public static final String PARAMS = "params"; + private static final String DEFAULT_SITE_ID = "rm"; + /** Site id */ private String siteId; @@ -117,11 +119,11 @@ public class SavedSearchDetails extends ReportDetails JSONObject search = new JSONObject(jsonString); // Get the site id - if (search.has(SITE_ID) == false) + String siteId = DEFAULT_SITE_ID; + if (search.has(SITE_ID) == true) { - throw new AlfrescoRuntimeException("Can not create saved search details from json, because required siteid is not present. " + jsonString); - } - String siteId = search.getString(SITE_ID); + siteId = search.getString(SITE_ID); + } // Get the name if (search.has(NAME) == false) From 65d6601ecd213d8165e2591b28e1303886f9ec5c Mon Sep 17 00:00:00 2001 From: Jared Ottley Date: Mon, 16 Sep 2013 19:54:13 +0000 Subject: [PATCH 07/38] Incremented version label (2.0.1.2) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.0.1.x@55368 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 535b36b9d6..964b9461a1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ groupid=alfresco packageName=rm -version=2.0.1.1 +version=2.0.1.2 build=dev alfrescoBaseVersion=4.0.2 From 8efc9da209d9cd059c60a62a2b79b64fefac42e9 Mon Sep 17 00:00:00 2001 From: Alan Davis Date: Tue, 17 Sep 2013 09:22:17 +0000 Subject: [PATCH 08/38] Reverse merged the version label increment as this had already been done. 55368: Incremented version label (2.0.1.2) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.0.1.x@55384 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 964b9461a1..535b36b9d6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ groupid=alfresco packageName=rm -version=2.0.1.2 +version=2.0.1.1 build=dev alfrescoBaseVersion=4.0.2 From c0f6b25140f18f57752567993cd7fd78d6f3a485 Mon Sep 17 00:00:00 2001 From: Jared Ottley Date: Tue, 17 Sep 2013 20:35:26 +0000 Subject: [PATCH 09/38] Merge recordsmanagement/BRANCHES/V2.0 to recordsmanagement/BRANCHES/V2.0.1.x: RM-904: Actions are missing within Records Management Site for Record Series and its children r52262: RM-757: Permission confusion after upgrade from 1.0 RM-753: Can't edit former seria untill it's vital git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.0.1.x@55428 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../model/recordsModel.xml | 1 - .../rm-patch-context.xml | 2 + .../RecordsManagementTypeFormFilter.java | 23 ++++++- .../patch/RMv2FilePlanNodeRefPatch.java | 68 +++++++++++++++++-- .../BroadcastVitalRecordDefinitionAction.java | 10 ++- .../vital/VitalRecordDefinitionImpl.java | 4 ++ 6 files changed, 97 insertions(+), 11 deletions(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/model/recordsModel.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/model/recordsModel.xml index 94c3a75c1a..82097435aa 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/model/recordsModel.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/model/recordsModel.xml @@ -677,7 +677,6 @@ Review Period d:period - true none|0 diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-patch-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-patch-context.xml index 0a28801ddc..d030f80f98 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-patch-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-patch-context.xml @@ -46,6 +46,8 @@ + + \ No newline at end of file diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/forms/RecordsManagementTypeFormFilter.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/forms/RecordsManagementTypeFormFilter.java index 28aa892093..986e44810e 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/forms/RecordsManagementTypeFormFilter.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/forms/RecordsManagementTypeFormFilter.java @@ -26,6 +26,7 @@ import java.util.Set; import org.alfresco.module.org_alfresco_module_rm.identifier.IdentifierService; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; import org.alfresco.repo.forms.Field; +import org.alfresco.repo.forms.FieldDefinition; import org.alfresco.repo.forms.FieldGroup; import org.alfresco.repo.forms.Form; import org.alfresco.repo.forms.FormData; @@ -103,8 +104,26 @@ public class RecordsManagementTypeFormFilter extends RecordsManagementFormFilter } } - // Group fields - // groupFields(form); + // set the id + List fieldDefs = form.getFieldDefinitions(); + for (FieldDefinition fieldDef : fieldDefs) + { + String prefixName = fieldDef.getName(); + if (prefixName.equals("rma:identifier") == true) + { + String defaultId = identifierService.generateIdentifier(typeName, null); + fieldDef.setDefaultValue(defaultId); + } + // NOTE: we set these defaults in the form for backwards compatibility reasons (RM-753) + else if (prefixName.equals("rma:vitalRecordIndicator") == true) + { + fieldDef.setDefaultValue(Boolean.FALSE.toString()); + } + else if (prefixName.equals("rma:reviewPeriod") == true) + { + fieldDef.setDefaultValue("none|0"); + } + } } /** diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2FilePlanNodeRefPatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2FilePlanNodeRefPatch.java index 526b4756cb..bd8175f8dd 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2FilePlanNodeRefPatch.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2FilePlanNodeRefPatch.java @@ -18,11 +18,16 @@ */ package org.alfresco.module.org_alfresco_module_rm.patch; +import java.io.Serializable; import java.util.List; +import org.alfresco.module.org_alfresco_module_rm.FilePlanComponentKind; import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService; +import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel; import org.alfresco.module.org_alfresco_module_rm.dod5015.DOD5015Model; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; +import org.alfresco.module.org_alfresco_module_rm.security.RecordsManagementSecurityService; +import org.alfresco.module.org_alfresco_module_rm.security.Role; import org.alfresco.repo.domain.node.NodeDAO; import org.alfresco.repo.domain.patch.PatchDAO; import org.alfresco.repo.domain.qname.QNameDAO; @@ -30,6 +35,8 @@ import org.alfresco.repo.module.AbstractModuleComponent; import org.alfresco.repo.policy.BehaviourFilter; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.cmr.repository.Period; +import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.namespace.QName; import org.alfresco.util.Pair; import org.apache.commons.logging.Log; @@ -53,6 +60,8 @@ public class RMv2FilePlanNodeRefPatch extends AbstractModuleComponent private PatchDAO patchDAO; private NodeDAO nodeDAO; private QNameDAO qnameDAO; + private PermissionService permissionService; + private RecordsManagementSecurityService recordsManagementSecurityService; public void setNodeService(NodeService nodeService) { @@ -84,6 +93,22 @@ public class RMv2FilePlanNodeRefPatch extends AbstractModuleComponent this.qnameDAO = qnameDAO; } + /** + * @param recordsManagementSecurityService records management security service + */ + public void setRecordsManagementSecurityService(RecordsManagementSecurityService recordsManagementSecurityService) + { + this.recordsManagementSecurityService = recordsManagementSecurityService; + } + + /** + * @param permissionService permission service + */ + public void setPermissionService(PermissionService permissionService) + { + this.permissionService = permissionService; + } + /** * @see org.alfresco.repo.module.AbstractModuleComponent#executeInternal() */ @@ -98,24 +123,53 @@ public class RMv2FilePlanNodeRefPatch extends AbstractModuleComponent Pair aspectPair = qnameDAO.getQName(ASPECT_FILE_PLAN_COMPONENT); if (aspectPair != null) { - List records = patchDAO.getNodesByAspectQNameId(aspectPair.getFirst(), 0L, patchDAO.getMaxAdmNodeID()); + List filePlanComponents = patchDAO.getNodesByAspectQNameId(aspectPair.getFirst(), 0L, patchDAO.getMaxAdmNodeID()); if (logger.isDebugEnabled() == true) { - logger.debug(" ... updating " + records.size() + " items" ); + logger.debug(" ... updating " + filePlanComponents.size() + " items" ); } behaviourFilter.disableBehaviour(); try { - for (Long record : records) + for (Long filePlanComponent : filePlanComponents) { - Pair recordPair = nodeDAO.getNodePair(record); - NodeRef recordNodeRef = recordPair.getSecond(); + Pair recordPair = nodeDAO.getNodePair(filePlanComponent); + NodeRef filePlanComponentNodeRef = recordPair.getSecond(); - if (nodeService.getProperty(recordNodeRef, PROP_ROOT_NODEREF) == null) + NodeRef filePlan = recordsManagementService.getFilePlan(filePlanComponentNodeRef); + + // set the file plan node reference + if (nodeService.getProperty(filePlanComponentNodeRef, PROP_ROOT_NODEREF) == null) { - nodeService.setProperty(recordNodeRef, PROP_ROOT_NODEREF, recordsManagementService.getFilePlan(recordNodeRef)); + nodeService.setProperty(filePlanComponentNodeRef, PROP_ROOT_NODEREF, filePlan); + } + + // only set the rmadmin permissions on record categories, record folders and records + FilePlanComponentKind kind = recordsManagementService.getFilePlanComponentKind(filePlanComponentNodeRef); + if (FilePlanComponentKind.RECORD_CATEGORY.equals(kind) == true || + FilePlanComponentKind.RECORD_FOLDER.equals(kind) == true || + FilePlanComponentKind.RECORD.equals(kind) == true ) + { + // ensure the that the records management role has read and file on the node + Role adminRole = recordsManagementSecurityService.getRole(filePlan, "Administrator"); + if (adminRole != null) + { + permissionService.setPermission(filePlanComponentNodeRef, adminRole.getRoleGroupName(), RMPermissionModel.FILING, true); + } + + // ensure that the default vital record default values have been set (RM-753) + Serializable vitalRecordIndicator = nodeService.getProperty(filePlanComponentNodeRef, PROP_VITAL_RECORD_INDICATOR); + if (vitalRecordIndicator == null) + { + nodeService.setProperty(filePlanComponentNodeRef, PROP_VITAL_RECORD_INDICATOR, false); + } + Serializable reviewPeriod = nodeService.getProperty(filePlanComponentNodeRef, PROP_REVIEW_PERIOD); + if (reviewPeriod == null) + { + nodeService.setProperty(filePlanComponentNodeRef, PROP_REVIEW_PERIOD, new Period("none|0")); + } } } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/vital/BroadcastVitalRecordDefinitionAction.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/vital/BroadcastVitalRecordDefinitionAction.java index e7adec62e7..faa03fa17b 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/vital/BroadcastVitalRecordDefinitionAction.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/vital/BroadcastVitalRecordDefinitionAction.java @@ -68,7 +68,15 @@ public class BroadcastVitalRecordDefinitionAction extends RMActionExecuterAbstra private void propagateChangeToChildrenOf(NodeRef actionedUponNodeRef) { Map parentProps = nodeService.getProperties(actionedUponNodeRef); - boolean parentVri = (Boolean) parentProps.get(PROP_VITAL_RECORD_INDICATOR); + + // parent vital record indicator, default to null if not set + boolean parentVri = false; + Boolean parentVriValue = (Boolean) parentProps.get(PROP_VITAL_RECORD_INDICATOR); + if (parentVriValue != null) + { + parentVri = parentVriValue.booleanValue(); + } + Period parentReviewPeriod = (Period) parentProps.get(PROP_REVIEW_PERIOD); List assocs = this.nodeService.getChildAssocs(actionedUponNodeRef, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL); diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/vital/VitalRecordDefinitionImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/vital/VitalRecordDefinitionImpl.java index 571992b247..2315ddf2bf 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/vital/VitalRecordDefinitionImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/vital/VitalRecordDefinitionImpl.java @@ -63,6 +63,10 @@ public class VitalRecordDefinitionImpl implements VitalRecordDefinition, Records /* package */ static VitalRecordDefinition create(NodeService nodeService, NodeRef nodeRef) { Boolean enabled = (Boolean)nodeService.getProperty(nodeRef, PROP_VITAL_RECORD_INDICATOR); + if (enabled == null) + { + enabled = Boolean.FALSE; + } Period reviewPeriod = (Period)nodeService.getProperty(nodeRef, PROP_REVIEW_PERIOD); return new VitalRecordDefinitionImpl(enabled, reviewPeriod); } From b0a375221b5e7fc87ac2180997e2fc8de95d8e20 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Thu, 19 Sep 2013 00:44:57 +0000 Subject: [PATCH 10/38] RM-731: Impossible to add 'read and file' permissions for default categories * permissions set on the file where not being correct set down the file plan heirarchy git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.0@55508 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../security/RecordsManagementSecurityServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/RecordsManagementSecurityServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/RecordsManagementSecurityServiceImpl.java index d96b2b9330..4b5e233a93 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/RecordsManagementSecurityServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/RecordsManagementSecurityServiceImpl.java @@ -885,7 +885,8 @@ public class RecordsManagementSecurityServiceImpl implements RecordsManagementSe private void setPermissionDown(NodeRef nodeRef, String authority, String permission) { setPermissionImpl(nodeRef, authority, permission); - if (recordsManagementService.isRecordCategory(nodeRef) == true) + if (recordsManagementService.isFilePlan(nodeRef) == true || + recordsManagementService.isRecordCategory(nodeRef) == true) { List assocs = nodeService.getChildAssocs(nodeRef, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL); for (ChildAssociationRef assoc : assocs) From 91c2a02b7cf32da840da37ffcce8ed900e7d7b47 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Thu, 19 Sep 2013 01:30:25 +0000 Subject: [PATCH 11/38] RM-731: Impossible to add 'read and file' permissions for default categories git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.0@55510 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../RecordsManagementSecurityServiceImpl.java | 42 +++++++++++-------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/RecordsManagementSecurityServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/RecordsManagementSecurityServiceImpl.java index 4b5e233a93..c4938c8d5e 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/RecordsManagementSecurityServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/RecordsManagementSecurityServiceImpl.java @@ -868,10 +868,13 @@ public class RecordsManagementSecurityServiceImpl implements RecordsManagementSe { NodeRef parent = nodeService.getPrimaryParent(nodeRef).getParentRef(); if (parent != null && - recordsManagementService.isFilePlan(parent) == false) + recordsManagementService.isFilePlanComponent(nodeRef) == true) { setPermissionImpl(parent, authority, RMPermissionModel.READ_RECORDS); - setReadPermissionUp(parent, authority); + if (recordsManagementService.isFilePlan(parent) == false) + { + setReadPermissionUp(parent, authority); + } } } @@ -910,7 +913,8 @@ public class RecordsManagementSecurityServiceImpl implements RecordsManagementSe */ private void setPermissionImpl(NodeRef nodeRef, String authority, String permission) { - if (RMPermissionModel.FILING.equals(permission) == true) + if (RMPermissionModel.FILING.equals(permission) == true && + permissionService.getInheritParentPermissions(nodeRef) == false) { // Remove record read permission before adding filing permission permissionService.deletePermission(nodeRef, authority, RMPermissionModel.READ_RECORDS); @@ -928,21 +932,25 @@ public class RecordsManagementSecurityServiceImpl implements RecordsManagementSe { public Boolean doWork() throws Exception { - // Delete permission on this node - permissionService.deletePermission(nodeRef, authority, permission); - - if (recordsManagementService.isRecordCategory(nodeRef) == true) + // can't delete permissions if inherited (eg hold and transfer containers) + if (permissionService.getInheritParentPermissions(nodeRef) == false) { - List assocs = nodeService.getChildAssocs(nodeRef, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL); - for (ChildAssociationRef assoc : assocs) - { - NodeRef child = assoc.getChildRef(); - if (recordsManagementService.isRecordCategory(child) == true || - recordsManagementService.isRecordFolder(child) == true) - { - deletePermission(child, authority, permission); - } - } + // Delete permission on this node + permissionService.deletePermission(nodeRef, authority, permission); + + if (recordsManagementService.isRecordCategory(nodeRef) == true) + { + List assocs = nodeService.getChildAssocs(nodeRef, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL); + for (ChildAssociationRef assoc : assocs) + { + NodeRef child = assoc.getChildRef(); + if (recordsManagementService.isRecordCategory(child) == true || + recordsManagementService.isRecordFolder(child) == true) + { + deletePermission(child, authority, permission); + } + } + } } return null; From add64005354cc0987e573399fce69052e59e385a Mon Sep 17 00:00:00 2001 From: Pavel Yurkevich Date: Thu, 19 Sep 2013 10:41:31 +0000 Subject: [PATCH 12/38] RM-976: CLONE: RM: Cache overrides break Alfresco clustering Any custom configuration in 'config/alfresco/extension' of RM module has precedence over the configuration in 'tomcat/shared/classes'. This may cause problems as described at MNT-9520 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.0@55528 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../alfresco/extension/ehcache-custom.xml | 28 ------------------- 1 file changed, 28 deletions(-) delete mode 100644 rm-server/config/alfresco/extension/ehcache-custom.xml diff --git a/rm-server/config/alfresco/extension/ehcache-custom.xml b/rm-server/config/alfresco/extension/ehcache-custom.xml deleted file mode 100644 index d646f4885c..0000000000 --- a/rm-server/config/alfresco/extension/ehcache-custom.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - From 7c9e0e7253af095b639f1d9c73f134667940cc8e Mon Sep 17 00:00:00 2001 From: Jared Ottley Date: Thu, 19 Sep 2013 21:26:43 +0000 Subject: [PATCH 13/38] [RM-904] Actions are missing within Records Management Site for Record Series and its children. Patches are implemented as components. Components are loaded in a single thread. The work of a patch should be wrapped in its own transaction to isolate it from the changes of other patches and allowing patches to commit work before working on the next patch. Moved all work of RMv2ModelPatch into the RetryingTransactionCallback. RetryingTransactionHelper set to create new thread. Add RetryingTransactionHelper to RMv2FilePlanNodeRefPatch. Move all of the work of the patch into the callback. Helper creates new thread. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.0.1.x@55708 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../rm-patch-context.xml | 1 + .../patch/RMv2FilePlanNodeRefPatch.java | 136 ++++++++++-------- .../patch/RMv2ModelPatch.java | 88 ++++++------ 3 files changed, 121 insertions(+), 104 deletions(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-patch-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-patch-context.xml index d030f80f98..ff1e2e25ef 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-patch-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-patch-context.xml @@ -48,6 +48,7 @@ + \ No newline at end of file diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2FilePlanNodeRefPatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2FilePlanNodeRefPatch.java index bd8175f8dd..08bd90d7b2 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2FilePlanNodeRefPatch.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2FilePlanNodeRefPatch.java @@ -33,6 +33,7 @@ import org.alfresco.repo.domain.patch.PatchDAO; import org.alfresco.repo.domain.qname.QNameDAO; import org.alfresco.repo.module.AbstractModuleComponent; import org.alfresco.repo.policy.BehaviourFilter; +import org.alfresco.repo.transaction.RetryingTransactionHelper; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.Period; @@ -62,6 +63,7 @@ public class RMv2FilePlanNodeRefPatch extends AbstractModuleComponent private QNameDAO qnameDAO; private PermissionService permissionService; private RecordsManagementSecurityService recordsManagementSecurityService; + private RetryingTransactionHelper retryingTransactionHelper; public void setNodeService(NodeService nodeService) { @@ -109,6 +111,11 @@ public class RMv2FilePlanNodeRefPatch extends AbstractModuleComponent this.permissionService = permissionService; } + public void setRetryingTransactionHelper(RetryingTransactionHelper retryingTransactionHelper) + { + this.retryingTransactionHelper = retryingTransactionHelper; + } + /** * @see org.alfresco.repo.module.AbstractModuleComponent#executeInternal() */ @@ -120,69 +127,80 @@ public class RMv2FilePlanNodeRefPatch extends AbstractModuleComponent logger.debug("RM Module RMv2FilePlanNodeRef Patch ..."); } - Pair aspectPair = qnameDAO.getQName(ASPECT_FILE_PLAN_COMPONENT); - if (aspectPair != null) - { - List filePlanComponents = patchDAO.getNodesByAspectQNameId(aspectPair.getFirst(), 0L, patchDAO.getMaxAdmNodeID()); - - if (logger.isDebugEnabled() == true) - { - logger.debug(" ... updating " + filePlanComponents.size() + " items" ); - } - - behaviourFilter.disableBehaviour(); - try - { - for (Long filePlanComponent : filePlanComponents) - { - Pair recordPair = nodeDAO.getNodePair(filePlanComponent); - NodeRef filePlanComponentNodeRef = recordPair.getSecond(); - - NodeRef filePlan = recordsManagementService.getFilePlan(filePlanComponentNodeRef); - - // set the file plan node reference - if (nodeService.getProperty(filePlanComponentNodeRef, PROP_ROOT_NODEREF) == null) - { - nodeService.setProperty(filePlanComponentNodeRef, PROP_ROOT_NODEREF, filePlan); - } - - // only set the rmadmin permissions on record categories, record folders and records - FilePlanComponentKind kind = recordsManagementService.getFilePlanComponentKind(filePlanComponentNodeRef); - if (FilePlanComponentKind.RECORD_CATEGORY.equals(kind) == true || - FilePlanComponentKind.RECORD_FOLDER.equals(kind) == true || - FilePlanComponentKind.RECORD.equals(kind) == true ) - { - // ensure the that the records management role has read and file on the node - Role adminRole = recordsManagementSecurityService.getRole(filePlan, "Administrator"); - if (adminRole != null) - { - permissionService.setPermission(filePlanComponentNodeRef, adminRole.getRoleGroupName(), RMPermissionModel.FILING, true); - } - - // ensure that the default vital record default values have been set (RM-753) - Serializable vitalRecordIndicator = nodeService.getProperty(filePlanComponentNodeRef, PROP_VITAL_RECORD_INDICATOR); - if (vitalRecordIndicator == null) - { - nodeService.setProperty(filePlanComponentNodeRef, PROP_VITAL_RECORD_INDICATOR, false); - } - Serializable reviewPeriod = nodeService.getProperty(filePlanComponentNodeRef, PROP_REVIEW_PERIOD); - if (reviewPeriod == null) - { - nodeService.setProperty(filePlanComponentNodeRef, PROP_REVIEW_PERIOD, new Period("none|0")); - } - } - } - } - finally - { - behaviourFilter.enableBehaviour(); - } - } + retryingTransactionHelper.doInTransaction(new Work(), false, true); if (logger.isDebugEnabled() == true) { logger.debug(" ... complete RM Module RMv2FilePlanNodeRef Patch"); } - } + } + + private class Work implements RetryingTransactionHelper.RetryingTransactionCallback + { + @Override + public Integer execute() throws Throwable + { + Pair aspectPair = qnameDAO.getQName(RecordsManagementModel.ASPECT_FILE_PLAN_COMPONENT); + if (aspectPair != null) + { + List filePlanComponents = patchDAO.getNodesByAspectQNameId(aspectPair.getFirst(), 0L, patchDAO.getMaxAdmNodeID()); + + if (logger.isDebugEnabled() == true) + { + logger.debug(" ... updating " + filePlanComponents.size() + " items" ); + } + + behaviourFilter.disableBehaviour(); + try + { + for (Long filePlanComponent : filePlanComponents) + { + Pair recordPair = nodeDAO.getNodePair(filePlanComponent); + NodeRef filePlanComponentNodeRef = recordPair.getSecond(); + + NodeRef filePlan = recordsManagementService.getFilePlan(filePlanComponentNodeRef); + + // set the file plan node reference + if (nodeService.getProperty(filePlanComponentNodeRef, RecordsManagementModel.PROP_ROOT_NODEREF) == null) + { + nodeService.setProperty(filePlanComponentNodeRef, RecordsManagementModel.PROP_ROOT_NODEREF, filePlan); + } + + // only set the rmadmin permissions on record categories, record folders and records + FilePlanComponentKind kind = recordsManagementService.getFilePlanComponentKind(filePlanComponentNodeRef); + if (FilePlanComponentKind.RECORD_CATEGORY.equals(kind) == true || + FilePlanComponentKind.RECORD_FOLDER.equals(kind) == true || + FilePlanComponentKind.RECORD.equals(kind) == true ) + { + // ensure the that the records management role has read and file on the node + Role adminRole = recordsManagementSecurityService.getRole(filePlan, "Administrator"); + if (adminRole != null) + { + permissionService.setPermission(filePlanComponentNodeRef, adminRole.getRoleGroupName(), RMPermissionModel.FILING, true); + } + + // ensure that the default vital record default values have been set (RM-753) + Serializable vitalRecordIndicator = nodeService.getProperty(filePlanComponentNodeRef, RecordsManagementModel.PROP_VITAL_RECORD_INDICATOR); + if (vitalRecordIndicator == null) + { + nodeService.setProperty(filePlanComponentNodeRef, RecordsManagementModel.PROP_VITAL_RECORD_INDICATOR, false); + } + Serializable reviewPeriod = nodeService.getProperty(filePlanComponentNodeRef, RecordsManagementModel.PROP_REVIEW_PERIOD); + if (reviewPeriod == null) + { + nodeService.setProperty(filePlanComponentNodeRef, RecordsManagementModel.PROP_REVIEW_PERIOD, new Period("none|0")); + } + } + } + } + finally + { + behaviourFilter.enableBehaviour(); + } + } + // nothing to do + return 0; + } + } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2ModelPatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2ModelPatch.java index b4b1e5368b..c1a0c0699e 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2ModelPatch.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/RMv2ModelPatch.java @@ -52,6 +52,7 @@ public class RMv2ModelPatch extends AbstractModuleComponent private QNameDAO qnameDAO; private RetryingTransactionHelper retryingTransactionHelper; + public void setPatchDAO(PatchDAO patchDAO) { this.patchDAO = patchDAO; @@ -90,44 +91,22 @@ public class RMv2ModelPatch extends AbstractModuleComponent private void updateQName(QName qnameBefore, QName qnameAfter, String reindexClass) { - Long maxNodeId = patchDAO.getMaxAdmNodeID(); - Pair before = qnameDAO.getQName(qnameBefore); + Work work = new Work(qnameBefore, qnameAfter, reindexClass); + retryingTransactionHelper.doInTransaction(work, false, true); - if (before != null) - { - for (Long i = 0L; i < maxNodeId; i+=BATCH_SIZE) - { - Work work = new Work(before.getFirst(), i, reindexClass); - retryingTransactionHelper.doInTransaction(work, false, true); - } - - qnameDAO.updateQName(qnameBefore, qnameAfter); - - if (logger.isDebugEnabled() == true) - { - logger.debug(" ... updated qname " + qnameBefore.toString()); - } - } - else - { - if (logger.isDebugEnabled() == true) - { - logger.debug(" ... no need to update qname " + qnameBefore.toString()); - } - } } private class Work implements RetryingTransactionHelper.RetryingTransactionCallback { - private long qnameId; - private long lower; + private QName qnameBefore; + private QName qnameAfter; private String reindexClass; - Work(long qnameId, long lower, String reindexClass) + Work(QName qnameBefore, QName qnameAfter, String reindexClass) { - this.qnameId = qnameId; - this.lower = lower; + this.qnameBefore = qnameBefore; + this.qnameAfter = qnameAfter; this.reindexClass = reindexClass; } @@ -138,24 +117,43 @@ public class RMv2ModelPatch extends AbstractModuleComponent @Override public Integer execute() throws Throwable { - if ("TYPE".equals(reindexClass)) + Long maxNodeId = patchDAO.getMaxAdmNodeID(); + + Pair before = qnameDAO.getQName(qnameBefore); + + if (before != null) { - List nodeIds = patchDAO.getNodesByTypeQNameId(qnameId, lower, lower + BATCH_SIZE); - nodeDAO.touchNodes(nodeDAO.getCurrentTransactionId(true), nodeIds); - return nodeIds.size(); - } - else if ("ASPECT".equals(reindexClass)) - { - List nodeIds = patchDAO.getNodesByAspectQNameId(qnameId, lower, lower + BATCH_SIZE); - nodeDAO.touchNodes(nodeDAO.getCurrentTransactionId(true), nodeIds); - return nodeIds.size(); - } + for (Long i = 0L; i < maxNodeId; i+=BATCH_SIZE) + { + if ("TYPE".equals(reindexClass)) + { + List nodeIds = patchDAO.getNodesByTypeQNameId(before.getFirst(), i, i + BATCH_SIZE); + nodeDAO.touchNodes(nodeDAO.getCurrentTransactionId(true), nodeIds); + } + else if ("ASPECT".equals(reindexClass)) + { + List nodeIds = patchDAO.getNodesByAspectQNameId(before.getFirst(), i, i + BATCH_SIZE); + nodeDAO.touchNodes(nodeDAO.getCurrentTransactionId(true), nodeIds); + } + } + + qnameDAO.updateQName(qnameBefore, qnameAfter); + + if (logger.isDebugEnabled() == true) + { + logger.debug(" ... updated qname " + qnameBefore.toString()); + } + } else { - // nothing to do - return 0; + if (logger.isDebugEnabled() == true) + { + logger.debug(" ... no need to update qname " + qnameBefore.toString()); + } } - - } - } + + //nothing to do + return 0; + } + } } From 26223cb435238a683d354e5788ff7cf6911ea3a8 Mon Sep 17 00:00:00 2001 From: Jared Ottley Date: Wed, 25 Sep 2013 18:18:14 +0000 Subject: [PATCH 14/38] [RM-904][MNT-9589] Actions are missing within Records Management Site for Record Series and its children. Add DOD5015 constants for old style audit entries. Modify callback to look for and parse existing DOD5015 audit entries. Add query to look for DOD5015 audit entries. This call must be before the query for RM entries for the report to be ordered correctly. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.0.1.x@55998 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../audit/RecordsManagementAuditService.java | 27 ++++++++++ .../RecordsManagementAuditServiceImpl.java | 52 +++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/audit/RecordsManagementAuditService.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/audit/RecordsManagementAuditService.java index f493d4949c..5ec3681c0e 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/audit/RecordsManagementAuditService.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/audit/RecordsManagementAuditService.java @@ -67,6 +67,33 @@ public interface RecordsManagementAuditService public static final String RM_AUDIT_DATA_LOGIN_FULLNAME = "/RM/login/no-error/fullName"; public static final String RM_AUDIT_DATA_LOGIN_ERROR = "/RM/login/error/value"; + /* Provide Backward compatibility with DOD5015 Audit Events RM-904*/ + public static final String DOD5015_AUDIT_APPLICATION_NAME = "DOD5015"; + public static final String DOD5015_AUDIT_PATH_ROOT = "/DOD5015"; + public static final String DOD5015_AUDIT_SNIPPET_EVENT = "/event"; + public static final String DOD5015_AUDIT_SNIPPET_PERSON = "/person"; + public static final String DOD5015_AUDIT_SNIPPET_NAME = "/name"; + public static final String DOD5015_AUDIT_SNIPPET_NODE = "/node"; + public static final String DOD5015_AUDIT_SNIPPET_CHANGES = "/changes"; + public static final String DOD5015_AUDIT_SNIPPET_BEFORE = "/before"; + public static final String DOD5015_AUDIT_SNIPPET_AFTER = "/after"; + + public static final String DOD5015_AUDIT_DATA_PERSON_FULLNAME = "/DOD5015/event/person/fullName"; + public static final String DOD5015_AUDIT_DATA_PERSON_ROLES = "/DOD5015/event/person/roles"; + public static final String DOD5015_AUDIT_DATA_EVENT_NAME = "/DOD5015/event/name/value"; + public static final String DOD5015_AUDIT_DATA_NODE_NODEREF = "/DOD5015/event/node/noderef"; + public static final String DOD5015_AUDIT_DATA_NODE_NAME = "/DOD5015/event/node/name"; + public static final String DOD5015_AUDIT_DATA_NODE_TYPE = "/DOD5015/event/node/type"; + public static final String DOD5015_AUDIT_DATA_NODE_IDENTIFIER = "/DOD5015/event/node/identifier"; + public static final String DOD5015_AUDIT_DATA_NODE_NAMEPATH = "/DOD5015/event/node/namePath"; + public static final String DOD5015_AUDIT_DATA_NODE_CHANGES_BEFORE = "/DOD5015/event/node/changes/before/value"; + public static final String DOD5015_AUDIT_DATA_NODE_CHANGES_AFTER = "/DOD5015/event/node/changes/after/value"; + + public static final String DOD5015_AUDIT_DATA_LOGIN_USERNAME = "/DOD5015/login/args/userName/value"; + public static final String DOD5015_AUDIT_DATA_LOGIN_FULLNAME = "/DOD5015/login/no-error/fullName"; + public static final String DOD5015_AUDIT_DATA_LOGIN_ERROR = "/DOD5015/login/error/value"; + /* End Backward compatibility with DOD5015 Audit Events */ + /** * Starts RM auditing. */ 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 ed279bd596..7bfb10c207 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 @@ -825,6 +825,30 @@ public class RecordsManagementAuditServiceImpl nodeType = (typeDef != null) ? typeDef.getTitle() : null; } } + else if (values.containsKey(RecordsManagementAuditService.DOD5015_AUDIT_DATA_EVENT_NAME)) + { + // This data is /RM/event/... + eventName = (String) values.get(RecordsManagementAuditService.DOD5015_AUDIT_DATA_EVENT_NAME); + fullName = (String) values.get(RecordsManagementAuditService.DOD5015_AUDIT_DATA_PERSON_FULLNAME); + userRoles = (String) values.get(RecordsManagementAuditService.DOD5015_AUDIT_DATA_PERSON_ROLES); + nodeRef = (NodeRef) values.get(RecordsManagementAuditService.DOD5015_AUDIT_DATA_NODE_NODEREF); + nodeName = (String) values.get(RecordsManagementAuditService.DOD5015_AUDIT_DATA_NODE_NAME); + QName nodeTypeQname = (QName) values.get(RecordsManagementAuditService.DOD5015_AUDIT_DATA_NODE_TYPE); + nodeIdentifier = (String) values.get(RecordsManagementAuditService.DOD5015_AUDIT_DATA_NODE_IDENTIFIER); + namePath = (String) values.get(RecordsManagementAuditService.DOD5015_AUDIT_DATA_NODE_NAMEPATH); + beforeProperties = (Map) values.get( + RecordsManagementAuditService.DOD5015_AUDIT_DATA_NODE_CHANGES_BEFORE); + afterProperties = (Map) values.get( + RecordsManagementAuditService.DOD5015_AUDIT_DATA_NODE_CHANGES_AFTER); + + // Convert some of the values to recognizable forms + nodeType = null; + if (nodeTypeQname != null) + { + TypeDefinition typeDef = dictionaryService.getType(nodeTypeQname); + nodeType = (typeDef != null) ? typeDef.getTitle() : null; + } + } else if (values.containsKey(RecordsManagementAuditService.RM_AUDIT_DATA_LOGIN_USERNAME)) { user = (String) values.get(RecordsManagementAuditService.RM_AUDIT_DATA_LOGIN_USERNAME); @@ -839,6 +863,20 @@ public class RecordsManagementAuditServiceImpl fullName = (String) values.get(RecordsManagementAuditService.RM_AUDIT_DATA_LOGIN_FULLNAME); } } + else if (values.containsKey(RecordsManagementAuditService.DOD5015_AUDIT_DATA_LOGIN_USERNAME)) + { + user = (String) values.get(RecordsManagementAuditService.DOD5015_AUDIT_DATA_LOGIN_USERNAME); + if (values.containsKey(RecordsManagementAuditService.DOD5015_AUDIT_DATA_LOGIN_ERROR)) + { + eventName = RecordsManagementAuditService.RM_AUDIT_EVENT_LOGIN_FAILURE; + fullName = user; // The user didn't log in + } + else + { + eventName = RecordsManagementAuditService.RM_AUDIT_EVENT_LOGIN_SUCCESS; + fullName = (String) values.get(RecordsManagementAuditService.DOD5015_AUDIT_DATA_LOGIN_FULLNAME); + } + } else { // This is not recognisable data @@ -939,6 +977,18 @@ public class RecordsManagementAuditServiceImpl } // Build audit query parameters + AuditQueryParameters dod5015AuditQueryParams = new AuditQueryParameters(); + dod5015AuditQueryParams.setForward(forward); + dod5015AuditQueryParams.setApplicationName(RecordsManagementAuditService.DOD5015_AUDIT_APPLICATION_NAME); + dod5015AuditQueryParams.setUser(user); + dod5015AuditQueryParams.setFromTime(fromTime); + dod5015AuditQueryParams.setToTime(toTime); + if (nodeRef != null) + { + dod5015AuditQueryParams.addSearchKey(RecordsManagementAuditService.DOD5015_AUDIT_DATA_NODE_NODEREF, nodeRef); + } + + // AuditQueryParameters auditQueryParams = new AuditQueryParameters(); auditQueryParams.setForward(forward); auditQueryParams.setApplicationName(RecordsManagementAuditService.RM_AUDIT_APPLICATION_NAME); @@ -949,7 +999,9 @@ public class RecordsManagementAuditServiceImpl { auditQueryParams.addSearchKey(RecordsManagementAuditService.RM_AUDIT_DATA_NODE_NODEREF, nodeRef); } + // Get audit entries + auditService.auditQuery(callback, dod5015AuditQueryParams, maxEntries); auditService.auditQuery(callback, auditQueryParams, maxEntries); // finish off the audit trail report From 93991e82656fdc0200df2c98bbe415051c75a60c Mon Sep 17 00:00:00 2001 From: Pavel Yurkevich Date: Wed, 2 Oct 2013 11:20:07 +0000 Subject: [PATCH 15/38] RM-1029: Trashcan page in admin console opened with Internal Server Error - permissionServiceImpl#hasPermission method was updated. Now we check a node for existence before nodeService.hasAspect method invocation that checks a node for ASPECT_FILE_PLAN_COMPONENT aspect. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.0@56244 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../org_alfresco_module_rm/permission/PermissionServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/permission/PermissionServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/permission/PermissionServiceImpl.java index 2dfd8206f4..cb7a0eae31 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/permission/PermissionServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/permission/PermissionServiceImpl.java @@ -1057,6 +1057,7 @@ public class PermissionServiceImpl extends AbstractLifecycleBean implements Perm { String result = perm; if ("Read".equals(perm) == true && + nodeService.exists(nodeRef) && nodeService.hasAspect(nodeRef, RecordsManagementModel.ASPECT_FILE_PLAN_COMPONENT) == true) { result = "ReadRecords"; From 0bb35b74e8726b454113feed6a5c9af684e159b2 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Fri, 11 Oct 2013 14:45:02 +0000 Subject: [PATCH 16/38] RM-986 (Group added twice for default categories) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.0@56542 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../dod5015/DODExampleFilePlan.xml | 741 +++++++++--------- 1 file changed, 389 insertions(+), 352 deletions(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/dod5015/DODExampleFilePlan.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/dod5015/DODExampleFilePlan.xml index 9b40dfe679..cfc6288333 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/dod5015/DODExampleFilePlan.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/dod5015/DODExampleFilePlan.xml @@ -1,44 +1,46 @@ - - + + Reports 0318 Reports Record series for reports - + - + - + + - - + + AIS Audit Records 0318-01 @@ -47,43 +49,44 @@ week|1 true - + - + - - + + N1-218-00-4 item 023 - Cut off monthly, hold 1 month, then destroy. + Cut off monthly, hold 1 month, then destroy. - + - - - + + + cutoff monthend|1 - - - + + + destroy month|1 {http://www.alfresco.org/model/recordsmanagement/1.0}cutOffDate - + - - + + - - - - - + + + + + + January AIS Audit Records January AIS Audit Records @@ -94,57 +97,59 @@ - + - + - + + - + Unit Manning Documents 0318-02 Unit Manning Documents Consisting of manpower document and monthly strength report forwarded to OSD and other activities which are maintained by personnel office as the official record copy. - - + + - + - - + + N1-218-89-1 item 002 Cut off every 3 months, hold 3 months, then destroy. - + - - - + + + cutoff quarterend|1 - - - + + + destroy month|3 {http://www.alfresco.org/model/recordsmanagement/1.0}cutOffDate - - + + - + - + + 1st Quarter Unit Manning Documents 0318-02-01 @@ -153,55 +158,57 @@ - + - + - + + - + Overtime Reports 0318-03 Overtime reports and related documents - Overtime reports and related documents which are maintained by JS/combatant controller as the official record copy. - - + Overtime reports and related documents which are maintained by JS/combatant controller as the official record copy. + + - + - - + + N1-218-00-7 item 28 - Cut off at end of FY, hold 3 years, then destroy. + Cut off at end of FY, hold 3 years, then destroy. - + - - + + cutoff - fyend|1 - - - + fyend|1 + + + destroy year|3 {http://www.alfresco.org/model/recordsmanagement/1.0}cutOffDate - - + + - - - + + + + FY08 Overtime Reports 0318-03-01 @@ -210,54 +217,56 @@ - + - + - + + - + Bi-Weekly Cost Reports 0318-04 Bi-Weekly Cost Reports Bi-wekly cost reports which are maintained by JS/combatant command controler as the official record copy. - - + + - + - - + + N1-218-00-7 item 2 - Cut off at end of CY, hold 2 years, then destroy. + Cut off at end of CY, hold 2 years, then destroy. - + - - + + cutoff yearend|1 - - - + + + destroy year|2 {http://www.alfresco.org/model/recordsmanagement/1.0}cutOffDate - - + + - + + CY08 Unit Manning Documents 0318-04-01 @@ -266,121 +275,124 @@ - + - + - - + + - + Military Files 0412 Military Files Record series for military files - + - + - + + - + Military Assignment Documents 0412-01 Military Assignment Documents - Policy matters pertaining to military assignments which are maintained by any JS/combatant command activity as the official record copy. + Policy matters pertaining to military assignments which are maintained by any JS/combatant command activity as the official record copy. - + - + - - + + N1-218-00-3 item 30 - Cut off when superseded, hold 5 years, then destroy. - true + Cut off when superseded, hold 5 years, then destroy. + true - + - - + + cutoff superseded - - - + + + destroy year|5 {http://www.alfresco.org/model/recordsmanagement/1.0}cutOffDate - - + + - + - + - + - + - + + - + Official Military Personnel Privilege Card Applications 0412-02 Official Military Personnel Privilege Card Applications - Consisting of: documents reflecting applications for priviege cards and ration cards, including Department of Defense Forms (DD Forms) 1172 (Application for Unifomed Services Identification and Privilege Card) and similar documents which are maintained by any JS/combatant command activity. + Consisting of: documents reflecting applications for priviege cards and ration cards, including Department of Defense Forms (DD Forms) 1172 (Application for Unifomed Services Identification and Privilege Card) and similar documents which are maintained by any JS/combatant command activity. - + - + - - + + N1-218-00-3 item 20 Cut off when no longer needed and destroy immediately. - + - - + + cutoff no_longer_needed - - - + + + destroy immediately|0 - - + + - + + COL Bob Johnson 0412-02-01 @@ -388,6 +400,7 @@ + PFC Alan Murphy 0412-02-02 @@ -396,59 +409,61 @@ - + - + - + + - + Personnel Security Program Records 0412-03 Personnel Security Program Records - Position sensitivity files including requests for information relating to the designation of sensitive and non-sensitive personnel positions in an agency and results of final actions taken consisting of approved requests which are maintained by any JS/combatant command activity + Position sensitivity files including requests for information relating to the designation of sensitive and non-sensitive personnel positions in an agency and results of final actions taken consisting of approved requests which are maintained by any JS/combatant command activity - + - + - - + + N1-218-00-4 item 017 Cutoff when position is abolished, re-designated, or no longer needed, whichever is later. Destroy immediately after cutoff. - + - - + + cutoff abolished re_designated no_longer_needed - + and - - - + + + destroy immediately|0 - - + + - + + Commander's Administrative Assistant 0412-03-01 @@ -456,6 +471,7 @@ + Equal Opportunity Coordinator 0412-03-02 @@ -464,138 +480,142 @@ - + - + - + - + + Civilian Files 0430 Civilian Files Record series for civilian files - + - + - + + - + Employee Performance File System Records 0430-01 Employee Performance File System Records - Consisting of: performance records superseded through an administrative, judicial, or quasi-judicial procedure which are maintained by any JS/combatant command activity + Consisting of: performance records superseded through an administrative, judicial, or quasi-judicial procedure which are maintained by any JS/combatant command activity - + - + - - + + GRS 1 item 23b(1) Cutoff when superseded. Destroy immediately after cutoff - true + true - + - - + + cutoff superseded - - - + + + destroy immediately|0 - - + + - + - + - + - + + - + Foreign Employee Award Files 0430-02 Foreign Employee Award Files - Decorations to foreign nationals and US citizens not employed by the US Government consisting of: case files of recommendations, decisions, awards announcements, board meeting minutes, and related documents which are maintained by any JS/combatant command activity + Decorations to foreign nationals and US citizens not employed by the US Government consisting of: case files of recommendations, decisions, awards announcements, board meeting minutes, and related documents which are maintained by any JS/combatant command activity - + - - + + N1-218-00-3 item 18 - Permanent. Cut off on completion of case, hold 2 years, then retire to offline storage. Transfer to federal records holding area 5 years after retirement to offline storage. Transfer to NARA 25 years after cutoff. + Permanent. Cut off on completion of case, hold 2 years, then retire to offline storage. Transfer to federal records holding area 5 years after retirement to offline storage. Transfer to NARA 25 years after cutoff. - + - - + + cutoff case_complete - - - + + + transfer Retire to offline storage. Offline Storage year|2 {http://www.alfresco.org/model/recordsmanagement/1.0}cutOffDate - - - + + + transfer - Transfer to federal records holding area. + Transfer to federal records holding area. Federal Records Holding year|5 {http://www.alfresco.org/model/recordsmanagement/1.0}dispositionAsOf - - - + + + accession Transfer to NARA. NARA year|25 {http://www.alfresco.org/model/recordsmanagement/1.0}cutOffDate - - + + - - - + + + + Christian Bohr 0430-02-01 @@ -603,6 +623,7 @@ + Karl Planck 0430-02-02 @@ -611,27 +632,29 @@ - + - + - + + - + Case Files and Papers 0430-03 Case Files and Papers Consisting of library containing information on personnel actions which are maintained by R&A Br and Deputy Chief Information Office None - Disposal not authorized. Disposition pending NARA approval. + Disposal not authorized. Disposition pending NARA approval. - + + Gilbert Competency Hearing 0430-03-01 @@ -640,35 +663,36 @@ - + - + - + + - + Withholding of Within-Grade Increase (WGI) Records 0430-04 Withholding of Within-Grade Increase (WGI) Records - Files concerning an employee’s performance rating of record with work examples which establish less than fully successful performance, notice of withholding of WGI, employee's request for reconsideration of denied WGI, and decision concerning such a reconsideration request which are maintained by any JS/combatant command activity. + Files concerning an employee’s performance rating of record with work examples which establish less than fully successful performance, notice of withholding of WGI, employee's request for reconsideration of denied WGI, and decision concerning such a reconsideration request which are maintained by any JS/combatant command activity. - + - + - - + + N1-218-00-3 item 16 Cut off on completion of WGI action or on separation, whichever is earlier; hold 3 years, then destroy/delete. - + - + cutoff @@ -676,23 +700,24 @@ separation or - - - + + + destroy year|3 {http://www.alfresco.org/model/recordsmanagement/1.0}cutOffDate - - + + - - - + + + + Gilbert WGI Records 0430-04-01 @@ -701,62 +726,64 @@ - + - + - + + - + Payroll Differential and Allowances 0430-05 Payroll Differential and Allowances - Consisting of: information to assist overseas civilian personnel offices to document employee eligibility for foreign post differential and foreign quarters and post allowances, including SF 1190 (Foreign Allowances Application, Grant, and Report) and similar information which are maintained by any JS/combatant command activity. + Consisting of: information to assist overseas civilian personnel offices to document employee eligibility for foreign post differential and foreign quarters and post allowances, including SF 1190 (Foreign Allowances Application, Grant, and Report) and similar information which are maintained by any JS/combatant command activity. - + - + - - + + N1-218-00-3 item 3 Cut off at end of Fiscal Year (FY) in which all allowances granted are terminated, hold 3 years, then destroy. - + - - + + retain all_allowances_granted_are_terminated - - - + + + cutoff fyend|1 {http://www.alfresco.org/model/recordsmanagement/1.0}dispositionAsOf - - - + + + destroy year|3 {http://www.alfresco.org/model/recordsmanagement/1.0}cutOffDate - - + + - + - + + Martin Payroll Differential and Allowances 0430-05-01 @@ -765,73 +792,75 @@ - + - + - - + + - + Miscellaneous Files 0950 Miscellaneous Files Record series for miscellaneous files - + - + - + + - + Civilian Employee Training Program Records 0950-01 Civilian Employee Training Program Records - Decorations to foreign nationals and US citizens not employed by the US Government consisting of: case files of recommendations, decisions, awards announcements, board meeting minutes, and related documents which are maintained by any JS/combatant command activity + Decorations to foreign nationals and US citizens not employed by the US Government consisting of: case files of recommendations, decisions, awards announcements, board meeting minutes, and related documents which are maintained by any JS/combatant command activity - + - - + + GRS 1 item 29b - Cut off annually, hold 5 years, then destroy, or destroy when obsolete, whichever is earlier. + Cut off annually, hold 5 years, then destroy, or destroy when obsolete, whichever is earlier. - + - - + + cutoff year|1 {http://www.alfresco.org/model/recordsmanagement/1.0}dateFiled - - - + + + destroy year|5 {http://www.alfresco.org/model/recordsmanagement/1.0}cutOffDate obsolete - - + + - + + Bob Prentice Training Records (2008) 0950-01-01 @@ -839,6 +868,7 @@ + Beth Tanaka Training Records (2008) 0950-01-02 @@ -846,6 +876,7 @@ + Chuck Stevens Training Records (2008) 0950-01-03 @@ -854,104 +885,107 @@ - + - + - + + - + Purchase of Foreign Award Medals and Decorations 0950-02 Purchase of Foreign Award Medals and Decorations - Forms reflecting purchase of foreign award medals and decorations. + Forms reflecting purchase of foreign award medals and decorations. - + - + - - + + N1-218-00-3 item 11 Cutoff when related record is transferred to inactive storage, hold 1 year, destroy. - true + true - + - - + + cutoff related_record_trasfered_inactive_storage - - - + + + destroy year|1 {http://www.alfresco.org/model/recordsmanagement/1.0}cutOffDate - - + + - + - + - + - + + - + Monthly Cockpit Crew Training 0950-03 Monthly Cockpit/Crew Training - Consisting of skills training/evaluation forms, e.g., AF Form 4031. + Consisting of skills training/evaluation forms, e.g., AF Form 4031. - + - + - - + + N1-218-00-3 item 13 - Cutoff after training is complete, hold 1 year, destroy. + Cutoff after training is complete, hold 1 year, destroy. - + - - + + cutoff training_complete - - - + + + destroy year|1 {http://www.alfresco.org/model/recordsmanagement/1.0}cutOffDate - - + + - + + January Cockpit Crew Training 0950-03-01 @@ -959,6 +993,7 @@ + February Cockpit Crew Training 0950-03-02 @@ -967,66 +1002,68 @@ - + - + - + + - + Science Advisor Records 0950-04 Science Advisor Records - Consisting of: reports, studies, tasking orders, and similar records. Reports are usually informal and unpublished. Records may be generated at all activities + Consisting of: reports, studies, tasking orders, and similar records. Reports are usually informal and unpublished. Records may be generated at all activities - + - + - + N1-218-00-10 item 44 Cut off on completion of study, hold 5 years, then transfer to Inactive Storage. Transfer to NARA 25 years after cutoff. - + - - + + cutoff study_complete - - - + + + transfer Transfer to inactive storage. Inactive Storage year|5 {http://www.alfresco.org/model/recordsmanagement/1.0}cutOffDate - - - + + + accession Transfer to NARA. NARA year|25 {http://www.alfresco.org/model/recordsmanagement/1.0}cutOffDate - - + + - + + Phoenix Mars Mission 0950-04-01 @@ -1035,12 +1072,12 @@ - + - + - + - - \ No newline at end of file + + \ No newline at end of file From 49644a1f4710e0ff58f0f08786bb88dccf28afc6 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Thu, 17 Oct 2013 05:16:34 +0000 Subject: [PATCH 17/38] Merge HEAD to V2.0: 56762 - RM-981: Stack specific: "Failed to get lock" error when performing actions with "List of Values" and "Relationships" in Management Console git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.0@56763 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../job/RecordsManagementJob.java | 37 ++++--------------- .../job/RecordsManagementJobExecuter.java | 12 +++++- 2 files changed, 18 insertions(+), 31 deletions(-) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/RecordsManagementJob.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/RecordsManagementJob.java index 9987308e3d..ac31ef8117 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/RecordsManagementJob.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/RecordsManagementJob.java @@ -18,12 +18,9 @@ */ package org.alfresco.module.org_alfresco_module_rm.job; -import java.util.concurrent.atomic.AtomicBoolean; - import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.repo.lock.JobLockService; import org.alfresco.repo.lock.LockAcquisitionException; -import org.alfresco.repo.lock.JobLockService.JobLockRefreshCallback; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.service.namespace.NamespaceService; @@ -102,37 +99,17 @@ public class RecordsManagementJob implements Job { // try and get the lock String lockToken = getLock(); - if (lockToken == null) - { - // exit - return null; - } - - // use a flag to keep track of the running job - final AtomicBoolean running = new AtomicBoolean(true); - jobLockService.refreshLock(lockToken, getLockQName(), DEFAULT_TIME, new JobLockRefreshCallback() - { - @Override - public boolean isActive() + if (lockToken != null) + { + try { - return running.get(); + // do work + jobExecuter.execute(); } - @Override - public void lockReleased() + finally { - running.set(false); + jobLockService.releaseLock(lockToken, getLockQName()); } - }); - - try - { - // do work - jobExecuter.execute(); - } - finally - { - // The lock will self-release if answer isActive in the negative - running.set(false); } // return diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/RecordsManagementJobExecuter.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/RecordsManagementJobExecuter.java index 233619ff0a..388b93eb8a 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/RecordsManagementJobExecuter.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/RecordsManagementJobExecuter.java @@ -21,6 +21,7 @@ package org.alfresco.module.org_alfresco_module_rm.job; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; import org.alfresco.repo.admin.RepositoryState; import org.alfresco.repo.transaction.RetryingTransactionHelper; +import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; /** * Records management job executer base class. @@ -59,7 +60,16 @@ public abstract class RecordsManagementJobExecuter implements RecordsManagementM // jobs not allowed to execute unless bootstrap is complete if (repositoryState.isBootstrapping() == false) { - executeImpl(); + retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback() + { + @Override + public Void execute() throws Throwable + { + executeImpl(); + + return null; + } + }, false, true); } } From 39cd44864aefddf5c528c8f987b653bc03943a34 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Fri, 18 Oct 2013 04:18:51 +0000 Subject: [PATCH 18/38] RM: Fix build * double check existance of node ref prior to work git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.0@56793 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../job/PublishUpdatesJobExecuter.java | 66 ++++++++++--------- 1 file changed, 35 insertions(+), 31 deletions(-) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/PublishUpdatesJobExecuter.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/PublishUpdatesJobExecuter.java index b40c648659..672f8d32ce 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/PublishUpdatesJobExecuter.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/PublishUpdatesJobExecuter.java @@ -97,37 +97,41 @@ public class PublishUpdatesJobExecuter extends RecordsManagementJobExecuter // Deal with each updated disposition action in turn for (NodeRef nodeRef : nodeRefs) { - // Mark the update node as publishing in progress - markPublishInProgress(nodeRef); - try - { - Date start = new Date(); - if (logger.isDebugEnabled() == true) - { - logger.debug("Starting publish of updates ..."); - logger.debug(" - for " + nodeRef.toString()); - logger.debug(" - at " + start.toString()); - } - - // Publish updates - publishUpdates(nodeRef); - - - if (logger.isDebugEnabled() == true) - { - Date end = new Date(); - long duration = end.getTime() - start.getTime(); - logger.debug("Completed publish of updates ..."); - logger.debug(" - for " + nodeRef.toString()); - logger.debug(" - at " + end.toString()); - logger.debug(" - duration " + Long.toString(duration)); - } - } - finally - { - // Ensure the update node has either completed the publish or is marked as no longer in progress - unmarkPublishInProgress(nodeRef); - } + // double check that the node in question still exists + if (nodeService.exists(nodeRef) == true) + { + // Mark the update node as publishing in progress + markPublishInProgress(nodeRef); + try + { + Date start = new Date(); + if (logger.isDebugEnabled() == true) + { + logger.debug("Starting publish of updates ..."); + logger.debug(" - for " + nodeRef.toString()); + logger.debug(" - at " + start.toString()); + } + + // Publish updates + publishUpdates(nodeRef); + + + if (logger.isDebugEnabled() == true) + { + Date end = new Date(); + long duration = end.getTime() - start.getTime(); + logger.debug("Completed publish of updates ..."); + logger.debug(" - for " + nodeRef.toString()); + logger.debug(" - at " + end.toString()); + logger.debug(" - duration " + Long.toString(duration)); + } + } + finally + { + // Ensure the update node has either completed the publish or is marked as no longer in progress + unmarkPublishInProgress(nodeRef); + } + } } return null; }; From be0eff46223115f95f51d63b7ac023a5258d76ca Mon Sep 17 00:00:00 2001 From: Samuel Langlois Date: Wed, 30 Oct 2013 12:13:46 +0000 Subject: [PATCH 19/38] Upgrade version number to 2.0.4 and Alfresco dependency to 4.1.6 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.0@57377 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 54b3170cb3..adb4c7949b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ groupid=alfresco packageName=rm -version=2.0.3 +version=2.0.4 build=dev -alfrescoBaseVersion=4.1.4 +alfrescoBaseVersion=4.1.6 From 72150ee5b34b6f12f4bb290982588c68e2b056ce Mon Sep 17 00:00:00 2001 From: Samuel Langlois Date: Wed, 30 Oct 2013 15:30:38 +0000 Subject: [PATCH 20/38] Rely on Alfresco 4.1.5 rather than 4.1.6, where test classes are missing in the war git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.0@57390 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index adb4c7949b..bf5d39cc8b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,4 +2,4 @@ groupid=alfresco packageName=rm version=2.0.4 build=dev -alfrescoBaseVersion=4.1.6 +alfrescoBaseVersion=4.1.5 From d7d72bd5d61680949ca79e251403c65ed62b8b1f Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Sun, 24 Nov 2013 16:12:59 +0000 Subject: [PATCH 21/38] RM-1092 (Impossible to apply RM module) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.0@58228 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../module/org_alfresco_module_rm/rm-service-context.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml index 629a9ee404..a7dcb900cd 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml @@ -157,7 +157,7 @@ - + @@ -490,7 +490,7 @@ - + From be717e846fb9cfe7b844e928239333760a0660e9 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Sun, 24 Nov 2013 16:15:20 +0000 Subject: [PATCH 22/38] RM-1080 (ListOfValuesConstraint.getAllowedValues() called several times on custom constraint) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.0@58229 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../caveat/RMListOfValuesConstraint.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/caveat/RMListOfValuesConstraint.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/caveat/RMListOfValuesConstraint.java index 47ffa3fcbf..b4d8e3cd68 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/caveat/RMListOfValuesConstraint.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/caveat/RMListOfValuesConstraint.java @@ -153,6 +153,10 @@ public class RMListOfValuesConstraint extends ListOfValuesConstraint allowedValues = new ArrayList(0); } int valueCount = allowedValues.size(); + if (valueCount > 0) + { + super.setAllowedValues(allowedValues); + } this.allowedValues = Collections.unmodifiableList(allowedValues); // make the upper case versions From 81a2e0e9f4f65471a3916c9e82c8e71783c114c8 Mon Sep 17 00:00:00 2001 From: Samuel Langlois Date: Thu, 12 Dec 2013 15:02:33 +0000 Subject: [PATCH 23/38] Upgrade version to 2.0.5 and Alfresco base version to 4.1.7 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.0@58930 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index bf5d39cc8b..ce35aa1f8d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ groupid=alfresco packageName=rm -version=2.0.4 +version=2.0.5 build=dev -alfrescoBaseVersion=4.1.5 +alfrescoBaseVersion=4.1.7 From 16293b9d3c4e89097f10d7a544684f19962158bd Mon Sep 17 00:00:00 2001 From: Samuel Langlois Date: Wed, 18 Dec 2013 17:04:36 +0000 Subject: [PATCH 24/38] Add Alfresco test dependencies, now that test code is separated from main code git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.0@59136 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- rm-server/build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rm-server/build.gradle b/rm-server/build.gradle index cb6ca069cd..225bc6e00e 100644 --- a/rm-server/build.gradle +++ b/rm-server/build.gradle @@ -7,6 +7,8 @@ dependencies { compile 'javax.servlet:servlet-api:2.5' testCompile 'org.springframework:spring-test:2.5' + testCompile group: 'org.alfresco.enterprise', name: 'alfresco-repository', version: alfrescoBaseVersion, classifier: 'tests', transitive: false + testCompile group: 'org.alfresco.enterprise', name: 'alfresco-remote-api', version: alfrescoBaseVersion, classifier: 'tests', transitive: false testRuntime files(explodedConfigDir) testRuntime files(configDir) From 12f7f7e062caa77b87aa616655e4f4ee617140f6 Mon Sep 17 00:00:00 2001 From: Samuel Langlois Date: Mon, 2 Jun 2014 10:20:21 +0000 Subject: [PATCH 25/38] RM-1536 Increase version in module.properties to 2.0.5, to match version of the build Increase dependent Alfresco version to 4.1.8 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.0@72746 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- gradle.properties | 2 +- .../alfresco/module/org_alfresco_module_rm/module.properties | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index ce35aa1f8d..bd6e5dc871 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,4 +2,4 @@ groupid=alfresco packageName=rm version=2.0.5 build=dev -alfrescoBaseVersion=4.1.7 +alfrescoBaseVersion=4.1.8 diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties index fcfa904742..d46e22e2d1 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties @@ -6,7 +6,7 @@ module.aliases=org_alfresco_module_dod5015 module.title=Records Management module.description=Alfresco Record Management Extension -module.version=2.0.3 +module.version=2.0.5 module.repo.version.min=4.1.4 -module.repo.version.max=4.1.99 \ No newline at end of file +module.repo.version.max=4.1.99 From 589abffcc79b82c5b3585ead7240ed7159f46bd2 Mon Sep 17 00:00:00 2001 From: Samuel Langlois Date: Mon, 2 Jun 2014 13:40:10 +0000 Subject: [PATCH 26/38] Revert to using Alfresco 4.1.7 - Alfresco 4.1.8 causes test failures git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.0@72776 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index bd6e5dc871..ce35aa1f8d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,4 +2,4 @@ groupid=alfresco packageName=rm version=2.0.5 build=dev -alfrescoBaseVersion=4.1.8 +alfrescoBaseVersion=4.1.7 From 776269907063cde45e43ed672ba1b820de5eaa37 Mon Sep 17 00:00:00 2001 From: Alan Davis Date: Wed, 23 Sep 2015 13:03:44 +0000 Subject: [PATCH 27/38] Creating V2.3.0.x from V2.3 #98191 which was the same rev as TAGS/V2.3.0 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.3.0.x@112695 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 From 26ff9e87eba613ab070553a4f5131f634b9bdf51 Mon Sep 17 00:00:00 2001 From: Alan Davis Date: Wed, 23 Sep 2015 13:13:00 +0000 Subject: [PATCH 28/38] Incremented the version to 2.3.0.1 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.3.0.x@112696 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- pom.xml | 2 +- rm-automation/pom.xml | 2 +- .../alfresco/module/org_alfresco_module_rm/module.properties | 2 +- rm-server/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 4f2b578766..f7de549206 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.alfresco alfresco-rm-parent pom - 2.3-SNAPSHOT + 2.3.0.1-SNAPSHOT Alfresco Records Management http://www.alfresco.org/ diff --git a/rm-automation/pom.xml b/rm-automation/pom.xml index 1221af32e3..5d0b28da47 100644 --- a/rm-automation/pom.xml +++ b/rm-automation/pom.xml @@ -3,7 +3,7 @@ org.alfresco alfresco-rm-parent - 2.3-SNAPSHOT + 2.3.0.1-SNAPSHOT 4.0.0 alfresco-rm-automation diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties index 19d6ed89dd..8b53f83020 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties @@ -6,6 +6,6 @@ module.aliases=org_alfresco_module_dod5015 module.title=Records Management module.description=Alfresco Record Management Extension -module.version=2.3 +module.version=2.3.0.1 module.repo.version.min=4.2.2 \ No newline at end of file diff --git a/rm-server/pom.xml b/rm-server/pom.xml index 5dc43e4252..1f928dd9eb 100644 --- a/rm-server/pom.xml +++ b/rm-server/pom.xml @@ -5,7 +5,7 @@ org.alfresco alfresco-rm-parent - 2.3-SNAPSHOT + 2.3.0.1-SNAPSHOT 4.0.0 alfresco-rm-server From bb855a761ca785e1a33fe074c069ac5c8d07b2ad Mon Sep 17 00:00:00 2001 From: Alan Davis Date: Wed, 23 Sep 2015 13:18:46 +0000 Subject: [PATCH 29/38] Merged RM 2.3 to trunk RM 2.3.0.x 112691 abozianu: MNT-14728 : CLONE for HF - RM: Not all files are found when searching for a keyword using advanced search. - partial workaround (the elements can be scrolled down but the total result number is still wrong) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.3.0.x@112697 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../capability/RMAfterInvocationProvider.java | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/RMAfterInvocationProvider.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/RMAfterInvocationProvider.java index 1b4d91b18c..437f1c4c08 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/RMAfterInvocationProvider.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/RMAfterInvocationProvider.java @@ -412,8 +412,29 @@ public class RMAfterInvocationProvider extends RMSecurityCommon return null; } + class RMFilteringResultSet extends FilteringResultSet + { + private long numberFound; + + public RMFilteringResultSet(ResultSet unfiltered, BitSet inclusionMask) + { + super(unfiltered, inclusionMask); + } + + @Override + public long getNumberFound() + { + return numberFound; + } + + private void setNumberFound(long numberFound) + { + this.numberFound = numberFound; + } + } + BitSet inclusionMask = new BitSet(returnedObject.length()); - FilteringResultSet filteringResultSet = new FilteringResultSet(returnedObject, inclusionMask); + RMFilteringResultSet filteringResultSet = new RMFilteringResultSet(returnedObject, inclusionMask); List supportedDefinitions = extractSupportedDefinitions(config); @@ -524,6 +545,9 @@ public class RMAfterInvocationProvider extends RMSecurityCommon break; } } + + filteringResultSet.setNumberFound(returnedObject.getNumberFound()); + return filteringResultSet; } From fc33aecf30da5dba4ea8d17e7164f06286f85d2c Mon Sep 17 00:00:00 2001 From: Tatyana Valkevych Date: Mon, 26 Oct 2015 15:58:04 +0000 Subject: [PATCH 30/38] MNT-15068: Merged V2.2 to V2.2.1.x 109401: RM-2391 : The Audit Log GET requests have to verify first which user is logged in and to which data it has access. - Added capability checking to the AuditLog Get REST API. Added a unit test. Minor changes on the Share side to forward the forbidden status. 111064: RM-2391 : - also check for the access audit capability on each node from the report 114786: RM-2391 : - Implemented final fix and added a unit test. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.2.1.x@115178 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../rm-service-context.xml | 1 + .../rm-webscript-context.xml | 2 + .../RecordsManagementAuditServiceImpl.java | 23 ++++++ .../script/AuditLogGet.java | 54 +++++++++++++- ...RecordsManagementAuditServiceImplTest.java | 49 +++++++++++++ .../legacy/webscript/AuditRestApiTest.java | 72 +++++++++++++++++++ .../test/util/BaseRMWebScriptTestCase.java | 7 +- 7 files changed, 206 insertions(+), 2 deletions(-) create mode 100644 rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/webscript/AuditRestApiTest.java diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml index 978d73d381..4057ea3e2d 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml @@ -921,6 +921,7 @@ + cm:lastThumbnailModification diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-webscript-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-webscript-context.xml index c815e3e411..637551ea30 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-webscript-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-webscript-context.xml @@ -536,6 +536,8 @@ + + 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 b0b406217c..9e804bc72e 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 @@ -40,6 +40,7 @@ import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementAction; import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService; import org.alfresco.module.org_alfresco_module_rm.audit.event.AuditEvent; +import org.alfresco.module.org_alfresco_module_rm.capability.CapabilityService; import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; import org.alfresco.repo.audit.AuditComponent; import org.alfresco.repo.audit.model.AuditApplication; @@ -62,6 +63,7 @@ import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.repository.MLText; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.cmr.security.AccessStatus; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.alfresco.service.transaction.TransactionService; @@ -98,6 +100,8 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean /** Logger */ private static Log logger = LogFactory.getLog(RecordsManagementAuditServiceImpl.class); + private static final String ACCESS_AUDIT_CAPABILITY = "AccessAudit"; + private static final String KEY_RM_AUDIT_NODE_RECORDS = "RMAUditNodeRecords"; protected static final String RM_AUDIT_EVENT_LOGIN_SUCCESS = "Login.Success"; @@ -179,6 +183,7 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean private RecordsManagementActionService rmActionService; private FilePlanService filePlanService; private NamespaceService namespaceService; + protected CapabilityService capabilityService; private boolean shutdown = false; @@ -270,6 +275,17 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean { this.namespaceService = namespaceService; } + + /** + * @param capabilityService capability service + */ + public void setCapabilityService(CapabilityService capabilityService) + { + this.capabilityService = capabilityService; + } + + + /** * @param ignoredAuditProperties @@ -904,6 +920,13 @@ public class RecordsManagementAuditServiceImpl extends AbstractLifecycleBean // Skip it return true; } + + if(nodeRef != null && nodeService.exists(nodeRef) && + !AccessStatus.ALLOWED.equals( + capabilityService.getCapabilityAccessState(nodeRef, ACCESS_AUDIT_CAPABILITY))) + { + return true; + } // TODO: Refactor this to use the builder pattern RecordsManagementAuditEntry entry = new RecordsManagementAuditEntry( diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/AuditLogGet.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/AuditLogGet.java index 6cf968f99c..3acdbd1197 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/AuditLogGet.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/AuditLogGet.java @@ -21,9 +21,17 @@ package org.alfresco.module.org_alfresco_module_rm.script; import java.io.File; import java.io.IOException; +import org.alfresco.module.org_alfresco_module_rm.audit.RecordsManagementAuditQueryParameters; +import org.alfresco.module.org_alfresco_module_rm.audit.RecordsManagementAuditService.ReportFormat; +import org.alfresco.module.org_alfresco_module_rm.capability.CapabilityService; +import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; import org.alfresco.repo.web.scripts.content.ContentStreamer; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.security.AccessStatus; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.WebScriptException; import org.springframework.extensions.webscripts.WebScriptRequest; import org.springframework.extensions.webscripts.WebScriptResponse; @@ -39,9 +47,16 @@ public class AuditLogGet extends BaseAuditRetrievalWebScript private static Log logger = LogFactory.getLog(AuditLogGet.class); private static final String PARAM_EXPORT = "export"; + private static final String ACCESS_AUDIT_CAPABILITY = "AccessAudit"; /** Content Streamer */ protected ContentStreamer contentStreamer; + + /** Capability service */ + protected CapabilityService capabilityService; + + /** File plan service */ + protected FilePlanService filePlanService; /** * @param contentStreamer @@ -50,6 +65,24 @@ public class AuditLogGet extends BaseAuditRetrievalWebScript { this.contentStreamer = contentStreamer; } + + /** + * + * @param capabilityService Capability Service + */ + public void setCapabilityService(CapabilityService capabilityService) + { + this.capabilityService = capabilityService; + } + + /** + * + * @param capabilityService Capability Service + */ + public void setFilePlanService(FilePlanService filePlanService) + { + this.filePlanService = filePlanService; + } @Override public void execute(WebScriptRequest req, WebScriptResponse res) throws IOException @@ -58,8 +91,16 @@ public class AuditLogGet extends BaseAuditRetrievalWebScript try { + + RecordsManagementAuditQueryParameters queryParams = parseQueryParameters(req); + ReportFormat reportFormat = parseReportFormat(req); + + if( !userCanAccessAudit(queryParams) ) + { + throw new WebScriptException(Status.STATUS_FORBIDDEN, "Access denied because the user does not have the Access Audit capability"); + } // parse the parameters and get a file containing the audit trail - auditTrail = this.rmAuditService.getAuditTrailFile(parseQueryParameters(req), parseReportFormat(req)); + auditTrail = this.rmAuditService.getAuditTrailFile(queryParams, reportFormat); if (logger.isDebugEnabled()) { @@ -101,4 +142,15 @@ public class AuditLogGet extends BaseAuditRetrievalWebScript } } } + + private boolean userCanAccessAudit(RecordsManagementAuditQueryParameters queryParams) + { + NodeRef targetNode = queryParams.getNodeRef(); + if( targetNode == null ) + { + targetNode = filePlanService.getFilePlanBySiteId(FilePlanService.DEFAULT_RM_SITE_ID); + } + return AccessStatus.ALLOWED.equals( + capabilityService.getCapabilityAccessState(targetNode, ACCESS_AUDIT_CAPABILITY)); + } } \ No newline at end of file diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RecordsManagementAuditServiceImplTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RecordsManagementAuditServiceImplTest.java index 65b0cede07..1a9d8f469c 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RecordsManagementAuditServiceImplTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RecordsManagementAuditServiceImplTest.java @@ -141,6 +141,55 @@ public class RecordsManagementAuditServiceImplTest extends BaseRMTestCase }, ADMIN_USER); } + /** + * Test getAuditTrail method to check that deleted items always show in the audit. + * + * @see RM-2391 (last addressed isue) + */ + public void testGetAuditTrailForDeletedItem() + { + // We have only one entry for the event "audit.start": + List entries = getAuditTrail(1, ADMIN_USER); + + assertEquals(entries.get(0).getEvent(), "audit.start"); + + // Event "audit.view" was generated but will be visible on the next call to getAuditTrail(). + + // Make a change: + updateTitle(filePlan, ADMIN_USER); // event=Update RM Object + + // Show the audit has been updated; at this point we have three entries for the three events up to now: + // "audit.start", "audit.view" and "Update RM Object"; + entries = getAuditTrail(3, ADMIN_USER); + + assertEquals(entries.get(0).getEvent(), "audit.start"); + assertEquals(entries.get(1).getEvent(), "audit.view"); + assertEquals(entries.get(2).getEvent(), "Update RM Object"); + + // New "audit.view" event was generated - will be visible on next getAuditTrail(). + + doTestInTransaction(new Test() + { + @Override + public Void run() throws Exception + { + nodeService.deleteNode(record); + List entries = getAuditTrail(5, ADMIN_USER); + + assertEquals(entries.get(0).getEvent(), "audit.start"); + assertEquals(entries.get(1).getEvent(), "audit.view"); + assertEquals(entries.get(2).getEvent(), "Update RM Object"); + assertEquals(entries.get(3).getEvent(), "audit.view"); + + // Show the audit contains a reference to the deleted item: + assertEquals(entries.get(4).getEvent(), "Delete RM Object"); + assertEquals(entries.get(4).getNodeRef(), record); + + return null; + } + }); + } + /** * Test getAuditTrail method and parameter filters. */ diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/webscript/AuditRestApiTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/webscript/AuditRestApiTest.java new file mode 100644 index 0000000000..d28c62d790 --- /dev/null +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/webscript/AuditRestApiTest.java @@ -0,0 +1,72 @@ +package org.alfresco.module.org_alfresco_module_rm.test.legacy.webscript; + +import java.io.IOException; +import java.text.MessageFormat; + +import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMWebScriptTestCase; +import org.alfresco.repo.security.authentication.AuthenticationUtil; +import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.util.GUID; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.TestWebScriptServer.GetRequest; + + +public class AuditRestApiTest extends BaseRMWebScriptTestCase +{ + /** URL for the REST APIs */ + protected static final String GET_NODE_AUDITLOG_URL_FORMAT = "/api/node/{0}/rmauditlog"; + + private static final String USER_WITHOUT_AUDIT_CAPABILITY = GUID.generate(); + + private NodeRef record; + + public void testAuditAccessCapability() throws IOException + { + + String recordAuditUrl = MessageFormat.format(GET_NODE_AUDITLOG_URL_FORMAT,record.toString().replace("://", "/")); + + sendRequest(new GetRequest(recordAuditUrl), Status.STATUS_OK, AuthenticationUtil.getAdminUserName() ); + + sendRequest(new GetRequest(recordAuditUrl), Status.STATUS_FORBIDDEN, USER_WITHOUT_AUDIT_CAPABILITY ); + } + + @Override + protected void setupTestData() + { + super.setupTestData(); + + retryingTransactionHelper.doInTransaction(new RetryingTransactionCallback() + { + @Override + public Object execute() throws Throwable + { + + AuthenticationUtil.setFullyAuthenticatedUser(AuthenticationUtil + .getSystemUserName()); + + createUser(USER_WITHOUT_AUDIT_CAPABILITY); + + record = utils.createRecord(recordFolder, GUID.generate()); + + + return null; + } + }); + } + + @Override + protected void tearDownImpl() + { + super.tearDownImpl(); + + deleteUser(USER_WITHOUT_AUDIT_CAPABILITY); + } + + protected String getRMSiteId() + { + return filePlanService.DEFAULT_RM_SITE_ID; + } + + +} diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMWebScriptTestCase.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMWebScriptTestCase.java index 53fed575c1..ac9c6f6798 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMWebScriptTestCase.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMWebScriptTestCase.java @@ -279,7 +279,7 @@ public class BaseRMWebScriptTestCase extends BaseWebScriptTest assertNotNull("Could not create base folder", folder); // Create the site - siteId = GUID.generate(); + siteId = getRMSiteId(); siteInfo = siteService.createSite("rm-site-dashboard", siteId, "title", "descrition", SiteVisibility.PUBLIC, RecordsManagementModel.TYPE_RM_SITE); filePlan = siteService.getContainer(siteId, RmSiteType.COMPONENT_DOCUMENT_LIBRARY); assertNotNull("Site document library container was not created successfully.", filePlan); @@ -383,4 +383,9 @@ public class BaseRMWebScriptTestCase extends BaseWebScriptTest authorityService.deleteAuthority(groupName, true); } } + + protected String getRMSiteId() + { + return GUID.generate(); + } } From 526375786f8cfa502573b60c001247e553a400c8 Mon Sep 17 00:00:00 2001 From: Tatyana Valkevych Date: Mon, 26 Oct 2015 16:12:52 +0000 Subject: [PATCH 31/38] Updated version to 2.2.1.4 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.2.1.x@115179 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- pom.xml | 2 +- .../alfresco/module/org_alfresco_module_rm/module.properties | 2 +- rm-server/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 296823bfdf..b7ca9eae6f 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.alfresco alfresco-rm-parent pom - 2.2.1.3 + 2.2.1.4 Alfresco Records Management http://www.alfresco.org/ diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties index 5b5d6a527e..058f832baf 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties @@ -6,6 +6,6 @@ module.aliases=org_alfresco_module_dod5015 module.title=Records Management module.description=Alfresco Record Management Extension -module.version=2.2.1.3 +module.version=2.2.1.4 module.repo.version.min=4.2 \ No newline at end of file diff --git a/rm-server/pom.xml b/rm-server/pom.xml index 4ce8419000..afc57ed519 100644 --- a/rm-server/pom.xml +++ b/rm-server/pom.xml @@ -5,7 +5,7 @@ org.alfresco alfresco-rm-parent - 2.2.1.3 + 2.2.1.4 4.0.0 alfresco-rm-server From 412c2e304443f83b1308785ee2a8d4feda7dbfe3 Mon Sep 17 00:00:00 2001 From: Tatyana Valkevych Date: Tue, 27 Oct 2015 11:51:04 +0000 Subject: [PATCH 32/38] Record only merge of r115178 as it was backport from V2.2 for MNT-15068 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.2@115354 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 From a862cbda96bf7729dc581b97d8233e4d57d51618 Mon Sep 17 00:00:00 2001 From: Tatyana Valkevych Date: Tue, 27 Oct 2015 11:54:52 +0000 Subject: [PATCH 33/38] Record only merge of r115179 - version upgrade on 2.2.1.x branch git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.2@115356 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 From eeb678337d5a2f77b3280eb9ab0c4a6cea393de8 Mon Sep 17 00:00:00 2001 From: Tom Page Date: Thu, 17 Dec 2015 11:58:03 +0000 Subject: [PATCH 34/38] RM-2871 Generate .gitignore file for V2.0. --- .gitignore | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..c095498da2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +# General ignored files and directories +.classpath +.gradle +.idea +.project +.settings +*.iml +*.log* +*.tmp +*.war +bin +dist +explodedDeps + +# / +/l10n +/root + +# /rm-server/ +/rm-server/alfresco-solr.zip +/rm-server/solr + +# /rm-server/build/ +/rm-server/build/* + +# /rm-server/config/alfresco/ +/rm-server/config/alfresco/extension + +# /rm-server/libs/ +/rm-server/libs/ + +# /rm-share/build/ +/rm-share/build/* From 8d20c8d4c092c946bed7bc05d5040f87a49d2b1d Mon Sep 17 00:00:00 2001 From: Tom Page Date: Thu, 17 Dec 2015 12:07:50 +0000 Subject: [PATCH 35/38] RM-2871 Generate .gitignore file for V2.0.1.x. --- .gitignore | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..c095498da2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +# General ignored files and directories +.classpath +.gradle +.idea +.project +.settings +*.iml +*.log* +*.tmp +*.war +bin +dist +explodedDeps + +# / +/l10n +/root + +# /rm-server/ +/rm-server/alfresco-solr.zip +/rm-server/solr + +# /rm-server/build/ +/rm-server/build/* + +# /rm-server/config/alfresco/ +/rm-server/config/alfresco/extension + +# /rm-server/libs/ +/rm-server/libs/ + +# /rm-share/build/ +/rm-share/build/* From 5e216fbfa2ca64d27083d93f0591c3abb8f52b23 Mon Sep 17 00:00:00 2001 From: Tom Page Date: Thu, 17 Dec 2015 12:14:31 +0000 Subject: [PATCH 36/38] RM-2871 Generate .gitignore file for V2.1.0.x. --- .gitignore | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..ec48bf4fb2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +# General ignored files and directories +.classpath +.gradle +.idea +.project +.settings +*.iml +*.log* +*.tmp +*.war +bin +dist +explodedDeps + +# / +/l10n +/dist +/root + +# /rm-server/ +/rm-server/alfresco-solr.zip +/rm-server/solr +/rm-server/shared + +# /rm-server/build/ +/rm-server/build/* + +# /rm-server/config/alfresco/ +/rm-server/config/alfresco/extension + +# /rm-server/libs/ +/rm-server/libs/mysql* + +# /rm-share/build/ +/rm-share/build/* From f8827752b0e8b8602b6d169178eb6fadcc40e0d0 Mon Sep 17 00:00:00 2001 From: Tom Page Date: Thu, 17 Dec 2015 12:30:04 +0000 Subject: [PATCH 37/38] RM-2871 Generate .gitignore file for V2.2.1.x. --- .gitignore | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..24be3fc3c1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,32 @@ +# General ignored files and directories +.ant-targets-build.xml +.classpath +.gradle +.idea +.project +.settings +*.iml +*.log* +*.tmp +*.war +bin +build.local.properties +dist +explodedDeps +target +test-output + +# / +/l10n +/root + +# /rm-server/ +/rm-server/alfresco-solr.zip +/rm-server/solr +/rm-server/shared + +# /rm-server/config/ +/rm-server/config/alfresco-global.properties + +# /rm-server/config/alfresco/ +/rm-server/config/alfresco/extension From fb9363d66288f860914b4d6bad3cee485cd7c488 Mon Sep 17 00:00:00 2001 From: Tom Page Date: Thu, 17 Dec 2015 12:37:55 +0000 Subject: [PATCH 38/38] RM-2871 Generate .gitignore file for V2.3.0.x. --- .gitignore | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..715394a480 --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +# General ignored files and directories +.classpath +.gradle +.idea +.project +.settings +*.iml +*.log* +*.tmp +*.war +bin +build.local.properties +dist +explodedDeps +target +test-output + +# / +/l10n +/root + +# /rm-server/ +/rm-server/alfresco-solr.zip +/rm-server/solr +/rm-server/shared + +# /rm-server/config/ +/rm-server/config/alfresco-global.properties + +# /rm-server/config/alfresco/ +/rm-server/config/alfresco/extension