From d1ba3bf7bda269347dde9c2d8acce19347b68dfe Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Wed, 20 Aug 2014 21:11:32 +0000 Subject: [PATCH] RM-1623 (Move In-Place Record) * Created a new service for the inplace record actions git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/HEAD@80914 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../org_alfresco_module_rm/action-context.xml | 4 +- .../rm-service-context.xml | 55 ++++- .../action/dm/HideRecordAction.java | 14 +- .../action/dm/MoveDmRecordAction.java | 24 +-- .../record/InplaceRecordService.java | 45 +++++ .../record/InplaceRecordServiceImpl.java | 190 ++++++++++++++++++ .../record/RecordService.java | 15 -- .../record/RecordServiceImpl.java | 112 ----------- 8 files changed, 308 insertions(+), 151 deletions(-) create mode 100644 rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/InplaceRecordService.java create mode 100644 rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/InplaceRecordServiceImpl.java diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/action-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/action-context.xml index 91ff7f93eb..3f5c40a98b 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/action-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/action-context.xml @@ -28,14 +28,14 @@ - + - + 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 498a5f59e1..f41285327e 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 @@ -1040,7 +1040,6 @@ - @@ -1094,7 +1093,6 @@ org.alfresco.module.org_alfresco_module_rm.record.RecordService.createRecord=RM_ALLOW org.alfresco.module.org_alfresco_module_rm.record.RecordService.createRecordFromContent=RM.Create.0 org.alfresco.module.org_alfresco_module_rm.record.RecordService.file=RM_ALLOW - org.alfresco.module.org_alfresco_module_rm.record.RecordService.hideRecord=RM_ALLOW org.alfresco.module.org_alfresco_module_rm.record.RecordService.isPropertyEditable=RM.Read.0 org.alfresco.module.org_alfresco_module_rm.record.RecordService.isMetadataStub=RM.Read.0 org.alfresco.module.org_alfresco_module_rm.record.RecordService.rejectRecord=RM_ALLOW @@ -1102,13 +1100,64 @@ org.alfresco.module.org_alfresco_module_rm.record.RecordService.addRecordType=RM_ALLOW org.alfresco.module.org_alfresco_module_rm.record.RecordService.makeRecord=RM_ALLOW org.alfresco.module.org_alfresco_module_rm.record.RecordService.link=RM_ALLOW - org.alfresco.module.org_alfresco_module_rm.record.RecordService.moveRecord=RM.Write.0 org.alfresco.module.org_alfresco_module_rm.record.RecordService.*=RM_DENY ]]> + + + + + + + + + + + + org.alfresco.module.org_alfresco_module_rm.record.InplaceRecordService + + + + + + + + + + + + + + + + + + + + + + + + ${server.transaction.mode.default} + + + + + + + + + + + + diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/HideRecordAction.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/HideRecordAction.java index 9eef3871f7..011a7fcbe1 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/HideRecordAction.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/HideRecordAction.java @@ -22,7 +22,7 @@ import java.util.List; import org.alfresco.module.org_alfresco_module_rm.action.AuditableActionExecuterAbstractBase; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; -import org.alfresco.module.org_alfresco_module_rm.record.RecordService; +import org.alfresco.module.org_alfresco_module_rm.record.InplaceRecordService; import org.alfresco.service.cmr.action.Action; import org.alfresco.service.cmr.action.ParameterDefinition; import org.alfresco.service.cmr.repository.NodeRef; @@ -51,8 +51,8 @@ public class HideRecordAction extends AuditableActionExecuterAbstractBase /** Node service */ private NodeService nodeService; - /** Record service */ - private RecordService recordService; + /** Inplace record service */ + private InplaceRecordService inplaceRecordService; /** * @param nodeService node service @@ -63,11 +63,11 @@ public class HideRecordAction extends AuditableActionExecuterAbstractBase } /** - * @param recordService record service + * @param inplaceRecordService inplace record service */ - public void setRecordService(RecordService recordService) + public void setInplaceRecordService(InplaceRecordService inplaceRecordService) { - this.recordService = recordService; + this.inplaceRecordService = inplaceRecordService; } /** @@ -87,7 +87,7 @@ public class HideRecordAction extends AuditableActionExecuterAbstractBase else { // hide the record from the collaboration site - recordService.hideRecord(actionedUponNodeRef); + inplaceRecordService.hideRecord(actionedUponNodeRef); } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/MoveDmRecordAction.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/MoveDmRecordAction.java index adc33c01e7..e0898671ad 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/MoveDmRecordAction.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/dm/MoveDmRecordAction.java @@ -23,7 +23,7 @@ import java.util.List; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.module.org_alfresco_module_rm.action.AuditableActionExecuterAbstractBase; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; -import org.alfresco.module.org_alfresco_module_rm.record.RecordService; +import org.alfresco.module.org_alfresco_module_rm.record.InplaceRecordService; import org.alfresco.service.cmr.action.Action; import org.alfresco.service.cmr.action.ParameterDefinition; import org.alfresco.service.cmr.repository.NodeRef; @@ -53,8 +53,8 @@ public class MoveDmRecordAction extends AuditableActionExecuterAbstractBase impl /** Node service */ private NodeService nodeService; - /** Record service */ - private RecordService recordService; + /** Inplace record service */ + private InplaceRecordService inplaceRecordService; /** * Gets the node service @@ -77,23 +77,23 @@ public class MoveDmRecordAction extends AuditableActionExecuterAbstractBase impl } /** - * Gets the record service + * Gets the inplace record service * - * @return Record service + * @return Inplace record service */ - protected RecordService getRecordService() + protected InplaceRecordService getInplaceRecordService() { - return this.recordService; + return this.inplaceRecordService; } /** - * Sets the record service + * Sets the inplace record service * - * @param recordService Record service + * @param InplaceRecordService Inplace record service */ - public void setRecordService(RecordService recordService) + public void setInplaceRecordService(InplaceRecordService inplaceRecordService) { - this.recordService = recordService; + this.inplaceRecordService = inplaceRecordService; } /** @@ -110,7 +110,7 @@ public class MoveDmRecordAction extends AuditableActionExecuterAbstractBase impl else { // Move the record within the collaboration site - getRecordService().moveRecord(actionedUponNodeRef, getTargetNodeRef(action)); + getInplaceRecordService().moveRecord(actionedUponNodeRef, getTargetNodeRef(action)); } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/InplaceRecordService.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/InplaceRecordService.java new file mode 100644 index 0000000000..a3c27c465e --- /dev/null +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/InplaceRecordService.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2005-2014 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.module.org_alfresco_module_rm.record; + +import org.alfresco.service.cmr.repository.NodeRef; + +/** + * Inplace Record Service Interface. + * + * @author Tuna Aksoy + * @since 2.3 + */ +public interface InplaceRecordService +{ + /** + * Hides a record within a collaboration site + * + * @param nodeRef The record which should be hidden + */ + void hideRecord(NodeRef nodeRef); + + /** + * Moves a record within a collaboration site + * + * @param nodeRef The record which should be moved + * @param targetNodeRef The target node reference where it should be moved to + */ + void moveRecord(NodeRef nodeRef, NodeRef targetNodeRef); +} diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/InplaceRecordServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/InplaceRecordServiceImpl.java new file mode 100644 index 0000000000..045f4e40ac --- /dev/null +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/InplaceRecordServiceImpl.java @@ -0,0 +1,190 @@ +/* + * Copyright (C) 2005-2014 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.module.org_alfresco_module_rm.record; + +import java.util.List; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; +import org.alfresco.module.org_alfresco_module_rm.security.ExtendedSecurityService; +import org.alfresco.repo.security.authentication.AuthenticationUtil; +import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; +import org.alfresco.service.cmr.model.FileExistsException; +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.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.cmr.site.SiteInfo; +import org.alfresco.service.cmr.site.SiteService; +import org.alfresco.util.ParameterCheck; + +/** + * Inplace record service implementation. + * + * @author Tuna Aksoy + * @since 2.3 + */ +public class InplaceRecordServiceImpl implements InplaceRecordService, RecordsManagementModel +{ + /** Site service */ + private SiteService siteService; + + /** Node service */ + private NodeService nodeService; + + /** Extended security service */ + private ExtendedSecurityService extendedSecurityService; + + /** File folder service */ + private FileFolderService fileFolderService; + + /** + * @param siteService site service + */ + public void setSiteService(SiteService siteService) + { + this.siteService = siteService; + } + + /** + * @param nodeService node service + */ + public void setNodeService(NodeService nodeService) + { + this.nodeService = nodeService; + } + + /** + * @param extendedSecurityService extended security service + */ + public void setExtendedSecurityService( + ExtendedSecurityService extendedSecurityService) + { + this.extendedSecurityService = extendedSecurityService; + } + + /** + * @param fileFolderService file folder service + */ + public void setFileFolderService(FileFolderService fileFolderService) + { + this.fileFolderService = fileFolderService; + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.record.InplaceRecordService#hideRecord(org.alfresco.service.cmr.repository.NodeRef) + */ + @Override + public void hideRecord(final NodeRef nodeRef) + { + ParameterCheck.mandatory("NodeRef", nodeRef); + + // do the work of hiding the record as the system user + AuthenticationUtil.runAsSystem(new RunAsWork() + { + @Override + public Void doWork() + { + // remove the child association + NodeRef originatingLocation = (NodeRef) nodeService.getProperty(nodeRef, PROP_RECORD_ORIGINATING_LOCATION); + List parentAssocs = nodeService.getParentAssocs(nodeRef); + for (ChildAssociationRef childAssociationRef : parentAssocs) + { + if (!childAssociationRef.isPrimary() && childAssociationRef.getParentRef().equals(originatingLocation)) + { + nodeService.removeChildAssociation(childAssociationRef); + break; + } + } + + // remove the extended security from the node + // this prevents the users from continuing to see the record in searchs and other linked locations + extendedSecurityService.removeAllExtendedSecurity(nodeRef); + + return null; + } + }); + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.record.InplaceRecordService#moveRecord(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.repository.NodeRef) + */ + @Override + public void moveRecord(final NodeRef nodeRef, final NodeRef targetNodeRef) + { + ParameterCheck.mandatory("nodeRef", nodeRef); + ParameterCheck.mandatory("targetNodeRef", targetNodeRef); + + NodeRef sourceParentNodeRef = null; + + NodeRef originatingLocation = (NodeRef) nodeService.getProperty(nodeRef, PROP_RECORD_ORIGINATING_LOCATION); + for (ChildAssociationRef parentAssoc : nodeService.getParentAssocs(nodeRef)) + { + if (!parentAssoc.isPrimary() && parentAssoc.getParentRef().equals(originatingLocation)) + { + sourceParentNodeRef = parentAssoc.getParentRef(); + break; + } + } + + if (sourceParentNodeRef == null) + { + throw new AlfrescoRuntimeException("Could not find source parent node reference."); + } + + SiteInfo sourceSite = siteService.getSite(sourceParentNodeRef); + SiteInfo targetSite = siteService.getSite(targetNodeRef); + + if (!sourceSite.equals(targetSite)) + { + throw new AlfrescoRuntimeException("The record can only be moved within the same collaboration site."); + } + + if (!sourceSite.getSitePreset().equals("site-dashboard")) + { + throw new AlfrescoRuntimeException("Only records within a collaboration site can be moved."); + } + + final NodeRef source = sourceParentNodeRef; + + AuthenticationUtil.runAsSystem(new RunAsWork() + { + @Override + public Void doWork() + { + try + { + // Move the record + fileFolderService.moveFrom(nodeRef, source, targetNodeRef, null); + + // Update the originating location property + nodeService.setProperty(nodeRef, PROP_RECORD_ORIGINATING_LOCATION, targetNodeRef); + } + catch (FileExistsException | FileNotFoundException ex) + { + throw new AlfrescoRuntimeException("Can't move node: " + ex); + } + + return null; + } + }); + } + +} diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordService.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordService.java index d1705b3ea0..9c402deb4b 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordService.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordService.java @@ -169,13 +169,6 @@ public interface RecordService */ void file(NodeRef record); - /** - * Hides a record within a collaboration site - * - * @param nodeRef The record which should be hidden - */ - void hideRecord(NodeRef nodeRef); - /** * Rejects a record with the provided reason * @@ -231,12 +224,4 @@ public interface RecordService * @param folder The folder in which the link will be created */ void link(NodeRef nodeRef, NodeRef folder); - - /** - * Moves a record within a collaboration site - * - * @param nodeRef The record which should be moved - * @param targetNodeRef The target node reference where it should be moved to - */ - void moveRecord(NodeRef nodeRef, NodeRef targetNodeRef); } 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 a1f5bf7033..e62419a5ae 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 @@ -80,8 +80,6 @@ import org.alfresco.service.cmr.security.AccessPermission; import org.alfresco.service.cmr.security.AccessStatus; import org.alfresco.service.cmr.security.OwnableService; import org.alfresco.service.cmr.security.PermissionService; -import org.alfresco.service.cmr.site.SiteInfo; -import org.alfresco.service.cmr.site.SiteService; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.RegexQNamePattern; @@ -196,9 +194,6 @@ public class RecordServiceImpl extends BaseBehaviourBean /** Permission service */ private PermissionService permissionService; - /** Site service */ - private SiteService siteService; - /** list of available record meta-data aspects and the file plan types the are applicable to */ private Map> recordMetaDataAspects; @@ -320,14 +315,6 @@ public class RecordServiceImpl extends BaseBehaviourBean this.permissionService = permissionService; } - /** - * @param siteService site service - */ - public void setSiteService(SiteService siteService) - { - this.siteService = siteService; - } - /** * Init method */ @@ -1049,41 +1036,6 @@ public class RecordServiceImpl extends BaseBehaviourBean } } - /** - * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#hideRecord(org.alfresco.service.cmr.repository.NodeRef) - */ - @Override - public void hideRecord(final NodeRef nodeRef) - { - ParameterCheck.mandatory("NodeRef", nodeRef); - - // do the work of hiding the record as the system user - AuthenticationUtil.runAsSystem(new RunAsWork() - { - @Override - public Void doWork() - { - // remove the child association - NodeRef originatingLocation = (NodeRef) nodeService.getProperty(nodeRef, PROP_RECORD_ORIGINATING_LOCATION); - List parentAssocs = nodeService.getParentAssocs(nodeRef); - for (ChildAssociationRef childAssociationRef : parentAssocs) - { - if (!childAssociationRef.isPrimary() && childAssociationRef.getParentRef().equals(originatingLocation)) - { - nodeService.removeChildAssociation(childAssociationRef); - break; - } - } - - // remove the extended security from the node - // this prevents the users from continuing to see the record in searchs and other linked locations - extendedSecurityService.removeAllExtendedSecurity(nodeRef); - - return null; - } - }); - } - /** * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#rejectRecord(org.alfresco.service.cmr.repository.NodeRef, java.lang.String) */ @@ -1488,68 +1440,4 @@ public class RecordServiceImpl extends BaseBehaviourBean nodeService.addChild(folder, nodeRef, ContentModel.ASSOC_CONTAINS, QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, nodeService.getProperty(nodeRef, ContentModel.PROP_NAME).toString())); } } - - /** - * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#moveRecord(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.repository.NodeRef) - */ - @Override - public void moveRecord(final NodeRef nodeRef, final NodeRef targetNodeRef) - { - ParameterCheck.mandatory("nodeRef", nodeRef); - ParameterCheck.mandatory("targetNodeRef", targetNodeRef); - - NodeRef sourceParentNodeRef = null; - - NodeRef originatingLocation = (NodeRef) nodeService.getProperty(nodeRef, PROP_RECORD_ORIGINATING_LOCATION); - for (ChildAssociationRef parentAssoc : nodeService.getParentAssocs(nodeRef)) - { - if (!parentAssoc.isPrimary() && parentAssoc.getParentRef().equals(originatingLocation)) - { - sourceParentNodeRef = parentAssoc.getParentRef(); - break; - } - } - - if (sourceParentNodeRef == null) - { - throw new AlfrescoRuntimeException("Could not find source parent node reference."); - } - - SiteInfo sourceSite = siteService.getSite(sourceParentNodeRef); - SiteInfo targetSite = siteService.getSite(targetNodeRef); - - if (!sourceSite.equals(targetSite)) - { - throw new AlfrescoRuntimeException("The record can only be moved within the same collaboration site."); - } - - if (!sourceSite.getSitePreset().equals("site-dashboard")) - { - throw new AlfrescoRuntimeException("Only records within a collaboration site can be moved."); - } - - final NodeRef source = sourceParentNodeRef; - - AuthenticationUtil.runAsSystem(new RunAsWork() - { - @Override - public Void doWork() - { - try - { - // Move the record - fileFolderService.moveFrom(nodeRef, source, targetNodeRef, null); - - // Update the originating location property - nodeService.setProperty(nodeRef, PROP_RECORD_ORIGINATING_LOCATION, targetNodeRef); - } - catch (FileExistsException | FileNotFoundException ex) - { - throw new AlfrescoRuntimeException("Can't move node: " + ex); - } - - return null; - } - }); - } }