From c9c3812fe52ea5dae94ff9f8361bc0b1f5190941 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Tue, 6 Aug 2013 03:36:54 +0000 Subject: [PATCH] RM-777: Record name duplication within the in-place container is not allowed. * records are now renamed when they are created to incorporate the record identifier * rejecting a record resotres the origional name git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/HEAD@53630 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../org_alfresco_module_rm/log4j.properties | 5 +- .../model/recordsModel.xml | 8 +- .../model/RecordsManagementModel.java | 1 + .../record/RecordServiceImpl.java | 94 +++++++++++++++---- .../test/action/FileToActionTest.java | 7 +- 5 files changed, 90 insertions(+), 25 deletions(-) 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 19d4f43d4f..7721baeb5f 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 @@ -7,10 +7,11 @@ log4j.logger.org.alfresco.module.org_alfresco_module_rm.security.RMMethodSecurit # # Module patches # -log4j.logger.org.alfresco.module.org_alfresco_module_rm.patch=debug +log4j.logger.org.alfresco.module.org_alfresco_module_rm.patch=info # # RM Permission Debug Information # #log4j.logger.org.alfresco.module.org_alfresco_module_rm.capability.RMEntryVoter=debug -#log4j.logger.org.alfresco.module.org_alfresco_module_rm.capability.declarative=debug \ No newline at end of file +#log4j.logger.org.alfresco.module.org_alfresco_module_rm.capability.declarative=debug +log4j.logger.org.alfresco.module.org_alfresco_module_rm.record.RecordServiceImpl=debug \ No newline at end of file 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 7e86ee5f93..3bbae9aa5e 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 @@ -714,6 +714,12 @@ Date Filed d:date + + + Origional Name + d:text + true + Publication Date @@ -1167,7 +1173,7 @@ d:date true - + d:any true diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/RecordsManagementModel.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/RecordsManagementModel.java index b3525ae7a5..cc63fe26f0 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/RecordsManagementModel.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/RecordsManagementModel.java @@ -93,6 +93,7 @@ public interface RecordsManagementModel extends RecordsManagementCustomModel // Record aspect public static final QName ASPECT_RECORD = QName.createQName(RM_URI, "record"); public static final QName PROP_DATE_FILED = QName.createQName(RM_URI, "dateFiled"); + public static final QName PROP_ORIGIONAL_NAME = QName.createQName(RM_URI, "origionalName"); public static final QName PROP_ORIGINATOR = QName.createQName(RM_URI, "originator"); public static final QName PROP_ORIGINATING_ORGANIZATION = QName.createQName(RM_URI, "originatingOrganization"); public static final QName PROP_PUBLICATION_DATE = QName.createQName(RM_URI, "publicationDate"); diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java index 4604d27314..52a6036bc7 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java @@ -60,6 +60,7 @@ import org.alfresco.service.cmr.dictionary.ClassDefinition; import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.dictionary.PropertyDefinition; import org.alfresco.service.cmr.model.FileFolderService; +import org.alfresco.service.cmr.model.FileNotFoundException; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentWriter; @@ -539,15 +540,24 @@ public class RecordServiceImpl implements RecordService, if (isLinked == true) { - // maintain the original primary location - nodeService.addChild(parentAssoc.getParentRef(), nodeRef, parentAssoc.getTypeQName(), parentAssoc.getQName()); - - // set the extended security - Set combinedWriters = new HashSet(writers); - combinedWriters.add(owner); - combinedWriters.add(AuthenticationUtil.getFullyAuthenticatedUser()); - - extendedSecurityService.addExtendedSecurity(nodeRef, readers, combinedWriters); + // turn off rules + ruleService.disableRules(); + try + { + // maintain the original primary location + nodeService.addChild(parentAssoc.getParentRef(), nodeRef, parentAssoc.getTypeQName(), parentAssoc.getQName()); + + // set the extended security + Set combinedWriters = new HashSet(writers); + combinedWriters.add(owner); + combinedWriters.add(AuthenticationUtil.getFullyAuthenticatedUser()); + + extendedSecurityService.addExtendedSecurity(nodeRef, readers, combinedWriters); + } + finally + { + ruleService.enableRules(); + } } return null; @@ -610,11 +620,43 @@ public class RecordServiceImpl implements RecordService, */ private void makeRecord(NodeRef document) { - nodeService.addAspect(document, RecordsManagementModel.ASPECT_RECORD, null); - - String recordId = identifierService.generateIdentifier(ASPECT_RECORD, nodeService.getPrimaryParent(document) - .getParentRef()); - nodeService.setProperty(document, PROP_IDENTIFIER, recordId); + try + { + // get the record id + String recordId = identifierService.generateIdentifier(ASPECT_RECORD, + nodeService.getPrimaryParent(document).getParentRef()); + + // get the record name + String name = (String)nodeService.getProperty(document, ContentModel.PROP_NAME); + + // rename the record + int dotIndex = name.lastIndexOf("."); + String prefix = name; + String postfix = ""; + if (dotIndex != -1) + { + prefix = name.substring(0, dotIndex); + postfix = name.substring(dotIndex); + } + String recordName = prefix + " (" + recordId + ")" + postfix; + fileFolderService.rename(document, recordName); + + if (logger.isDebugEnabled() == true) + { + logger.debug("Rename " + name + " to " + recordName); + } + + // add the record aspect + Map props = new HashMap(2); + props.put(PROP_IDENTIFIER, recordId); + props.put(PROP_ORIGIONAL_NAME, name); + nodeService.addAspect(document, RecordsManagementModel.ASPECT_RECORD, props); + } + catch (FileNotFoundException e) + { + throw new AlfrescoRuntimeException("Unable to make record, because rename failed.", e); + } + } /** @@ -749,14 +791,14 @@ public class RecordServiceImpl implements RecordService, ruleService.disableRules(); try { - // take note of the record id - String recordId = (String)nodeService.getProperty(nodeRef, PROP_IDENTIFIER); - - // take node of the original document owner - String documentOwner = (String) nodeService.getProperty(nodeRef, PROP_RECORD_ORIGINATING_USER_ID); + // get record property values + Map properties = nodeService.getProperties(nodeRef); + String recordId = (String)properties.get(PROP_IDENTIFIER); + String documentOwner = (String)properties.get(PROP_RECORD_ORIGINATING_USER_ID); + String origionalName = (String)properties.get(PROP_ORIGIONAL_NAME); + NodeRef originatingLocation = (NodeRef)properties.get(PROP_RECORD_ORIGINATING_LOCATION); // first remove the secondary link association - NodeRef originatingLocation = (NodeRef) nodeService.getProperty(nodeRef, PROP_RECORD_ORIGINATING_LOCATION); List parentAssocs = nodeService.getParentAssocs(nodeRef); for (ChildAssociationRef childAssociationRef : parentAssocs) { @@ -784,6 +826,18 @@ public class RecordServiceImpl implements RecordService, // move the record into the collaboration site nodeService.moveNode(nodeRef, originatingLocation, ContentModel.ASSOC_CONTAINS, parentAssoc.getQName()); + // rename to the origional name + if (origionalName != null) + { + fileFolderService.rename(nodeRef, origionalName); + + if (logger.isDebugEnabled() == true) + { + String name = (String)nodeService.getProperty(nodeRef, ContentModel.PROP_NAME); + logger.debug("Rename " + name + " to " + origionalName); + } + } + // save the information about the rejection details Map aspectProperties = new HashMap(3); aspectProperties.put(PROP_RECORD_REJECTION_USER_ID, userId); diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/action/FileToActionTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/action/FileToActionTest.java index e4f3ca1ffb..344d9b27bb 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/action/FileToActionTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/action/FileToActionTest.java @@ -24,6 +24,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.action.impl.FileToAction; import org.alfresco.module.org_alfresco_module_rm.capability.Capability; import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel; @@ -47,7 +48,7 @@ public class FileToActionTest extends BaseRMTestCase private static final String PATH_BAD = "monkey/rmfolder"; private static final String PATH_CREATE = "rmcontainer/newrmfolder"; - private static final String PATH_SUB1 = "rmcontainer/${node.cm:name}"; + private static final String PATH_SUB1 = "rmcontainer/${node.cm:title}"; protected ActionService dmActionService; @@ -112,6 +113,8 @@ public class FileToActionTest extends BaseRMTestCase { public Void run() { + nodeService.setProperty(dmDocument, ContentModel.PROP_TITLE, "mytestvalue"); + // create record from document recordService.createRecord(filePlan, dmDocument); @@ -193,7 +196,7 @@ public class FileToActionTest extends BaseRMTestCase public void testCreateSub() throws Exception { initRecord(); - createRecord(PATH_SUB1, "collabDocument.txt", "rmcontainer/collabDocument.txt"); + createRecord(PATH_SUB1, "mytestvalue", "rmcontainer/mytestvalue"); } private void createRecord(String path, String name)