diff --git a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/fileplancomponents/FilePlanTests.java b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/fileplancomponents/FilePlanTests.java index 3c9bb4b5a2..ebc396e80f 100644 --- a/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/fileplancomponents/FilePlanTests.java +++ b/rm-automation/rm-automation-community-rest-api/src/test/java/org/alfresco/rest/rm/fileplancomponents/FilePlanTests.java @@ -198,7 +198,7 @@ public class FilePlanTests extends BaseRestTest /** * Given that a file plan exists * When I ask the API to delete the file plan - * Then the 403 response code is returned. + * Then the 422 response code is returned. */ @Test ( @@ -217,6 +217,40 @@ public class FilePlanTests extends BaseRestTest // Delete the file plan component filePlanComponentAPI.deleteFilePlanComponent(filePlanAlias.toString()); + // Check the DELETE response status code + filePlanComponentAPI.usingRestWrapper().assertStatusCodeIs(UNPROCESSABLE_ENTITY); + } + + /** + * Given that a file plan exists and I am a non RM user + * When I ask the API to delete the file plan + * Then the 403 response code is returned. + */ + @Test + ( + description = "Check the response code when deleting the special file plan components with non RM user", + dataProviderClass = TestData.class, + dataProvider = "getContainers" + ) + public void deleteFilePlanSpecialComponentsNonRMUser(String filePlanAlias) throws Exception + { + // Create RM Site if doesn't exist + createRMSiteIfNotExists(); + + // Disconnect the current user from the API session + rmSiteAPI.usingRestWrapper().disconnect(); + // Authenticate admin user to Alfresco REST API + restClient.authenticateUser(dataUser.getAdminUser()); + + // Create a random user + UserModel nonRMuser = dataUser.createRandomTestUser("testUser"); + + // Authenticate using the random user + filePlanComponentAPI.usingRestWrapper().authenticateUser(nonRMuser); + + // Delete the file plan component + filePlanComponentAPI.deleteFilePlanComponent(filePlanAlias.toString()); + // Check the DELETE response status code filePlanComponentAPI.usingRestWrapper().assertStatusCodeIs(FORBIDDEN); } diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-fileplan-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-fileplan-context.xml index 1d5e045a92..c285a9fb16 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-fileplan-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-fileplan-context.xml @@ -110,4 +110,36 @@ + + + + + + TRANSFER_CONTAINER + + + + + + + + + + + + + + + HOLD_CONTAINER + + + + + + + + + \ No newline at end of file diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-group-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-group-context.xml index 87e4ea0edc..f68edd726c 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-group-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-group-context.xml @@ -25,6 +25,8 @@ + + diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-model-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-model-context.xml index fe6cedfd6d..aba5909bb3 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-model-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-model-context.xml @@ -76,6 +76,9 @@ + + + @@ -112,6 +115,7 @@ + diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/FilePlanType.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/FilePlanType.java index 3cc8cba850..94c496ac8b 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/FilePlanType.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/FilePlanType.java @@ -37,6 +37,7 @@ import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService; import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService; import org.alfresco.repo.node.NodeServicePolicies; +import org.alfresco.repo.node.integrity.IntegrityException; import org.alfresco.repo.policy.Behaviour.NotificationFrequency; import org.alfresco.repo.policy.annotation.Behaviour; import org.alfresco.repo.policy.annotation.BehaviourBean; @@ -61,10 +62,12 @@ import org.alfresco.service.namespace.QName; public class FilePlanType extends BaseBehaviourBean implements NodeServicePolicies.OnCreateChildAssociationPolicy, NodeServicePolicies.OnCreateNodePolicy, - NodeServicePolicies.OnDeleteNodePolicy + NodeServicePolicies.OnDeleteNodePolicy, + NodeServicePolicies.BeforeDeleteNodePolicy { private final static List ACCEPTED_UNIQUE_CHILD_TYPES = Arrays.asList(TYPE_HOLD_CONTAINER, TYPE_TRANSFER_CONTAINER, TYPE_UNFILED_RECORD_CONTAINER); private final static List ACCEPTED_NON_UNIQUE_CHILD_TYPES = Arrays.asList(TYPE_RECORD_CATEGORY); + private static final String BEHAVIOUR_NAME = "onDeleteFilePlan"; /** file plan service */ private FilePlanService filePlanService; @@ -78,6 +81,21 @@ public class FilePlanType extends BaseBehaviourBean /** file plan role service */ private FilePlanRoleService filePlanRoleService; + /** + * Unfiled Record Container Type behaviour bean + */ + private UnfiledRecordContainerType unfilerRecordContainerType; + + /** + * Transfer Container Type behaviour bean + */ + private TransferContainerType transferContainerType; + + /** + * Hold Container Type behaviour bean + */ + private HoldContainerType holdContainerType; + /** * @return File plan service */ @@ -142,6 +160,49 @@ public class FilePlanType extends BaseBehaviourBean this.filePlanRoleService = filePlanRoleService; } + /** + * @param unfilerRecordContainerType - unfiled record container type behaviour bean + */ + public void setUnfilerRecordContainerType(UnfiledRecordContainerType unfilerRecordContainerType) + { + this.unfilerRecordContainerType = unfilerRecordContainerType; + } + + /** + * @param transferContainerType - transfer container type behaviour bean + */ + public void setTransferContainerType(TransferContainerType transferContainerType) + { + this.transferContainerType = transferContainerType; + } + + /** + * @param holdContainerType - hold container type behaviour bean + */ + public void setHoldContainerType(HoldContainerType holdContainerType) + { + this.holdContainerType = holdContainerType; + } + + /** + * Disable the behaviours for this transaction + * + */ + public void disable() + { + getBehaviour(BEHAVIOUR_NAME).disable(); + } + + /** + * Enable behaviours for this transaction + * + */ + public void enable() + { + getBehaviour(BEHAVIOUR_NAME).enable(); + } + + /** * @see org.alfresco.repo.node.NodeServicePolicies.OnCreateChildAssociationPolicy#onCreateChildAssociation(org.alfresco.service.cmr.repository.ChildAssociationRef, boolean) */ @@ -194,15 +255,49 @@ public class FilePlanType extends BaseBehaviourBean /** * @see org.alfresco.repo.node.NodeServicePolicies.OnDeleteNodePolicy#onDeleteNode(org.alfresco.service.cmr.repository.ChildAssociationRef, boolean) */ + @Override @Behaviour ( kind = BehaviourKind.CLASS, + notificationFrequency = NotificationFrequency.FIRST_EVENT, + name = BEHAVIOUR_NAME + ) + public void onDeleteNode(ChildAssociationRef childAssocRef, boolean archived) + { + unfilerRecordContainerType.enable(); + transferContainerType.enable(); + holdContainerType.enable(); + throw new IntegrityException("Operation failed. Deletion of File Plan is not allowed.", null); + } + + /** + * @see org.alfresco.repo.node.NodeServicePolicies.BeforeDeleteNodePolicy#beforeDeleteNode(org.alfresco.service.cmr.repository.NodeRef) + */ + @Override + @Behaviour + ( + kind = BehaviourKind.CLASS, + notificationFrequency = NotificationFrequency.FIRST_EVENT + ) + public void beforeDeleteNode(NodeRef nodeRef) + { + unfilerRecordContainerType.disable(); + transferContainerType.disable(); + holdContainerType.disable(); + } + + @Behaviour + ( + kind = BehaviourKind.CLASS, + policy = "alf:onDeleteNode", notificationFrequency = NotificationFrequency.TRANSACTION_COMMIT ) - @Override - public void onDeleteNode(ChildAssociationRef childAssocRef, boolean archived) + public void onDeleteNodeOnCommit(ChildAssociationRef childAssocRef, boolean archived) { // tear down the file plan roles getFilePlanRoleService().tearDownFilePlanRoles(childAssocRef.getChildRef()); + unfilerRecordContainerType.enable(); + transferContainerType.enable(); + holdContainerType.enable(); } } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/HoldContainerType.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/HoldContainerType.java index 989b92699b..2326b41f64 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/HoldContainerType.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/HoldContainerType.java @@ -33,6 +33,7 @@ import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.model.BaseBehaviourBean; import org.alfresco.repo.node.NodeServicePolicies; +import org.alfresco.repo.node.integrity.IntegrityException; import org.alfresco.repo.policy.annotation.Behaviour; import org.alfresco.repo.policy.annotation.BehaviourBean; import org.alfresco.repo.policy.annotation.BehaviourKind; @@ -49,10 +50,31 @@ import org.springframework.extensions.surf.util.I18NUtil; */ @BehaviourBean(defaultType = "rma:holdContainer") public class HoldContainerType extends BaseBehaviourBean - implements NodeServicePolicies.OnCreateChildAssociationPolicy, NodeServicePolicies.OnCreateNodePolicy + implements NodeServicePolicies.OnCreateChildAssociationPolicy, + NodeServicePolicies.OnCreateNodePolicy, + NodeServicePolicies.OnDeleteNodePolicy { private final static String MSG_ERROR_ADD_CONTENT_CONTAINER = "rm.service.error-add-content-container"; private final static List ACCEPTED_NON_UNIQUE_CHILD_TYPES = Arrays.asList(TYPE_HOLD); + private static final String DELETE_BEHAVIOUR_NAME = "onDeleteHoldContainer"; + + /** + * Disable the behaviours for this transaction + * + */ + public void disable() + { + getBehaviour(DELETE_BEHAVIOUR_NAME).disable(); + } + + /** + * Enable behaviours for this transaction + * + */ + public void enable() + { + getBehaviour(DELETE_BEHAVIOUR_NAME).enable(); + } /** * On every event @@ -74,6 +96,16 @@ public class HoldContainerType extends BaseBehaviourBean NodeRef nodeRef = childAssocRef.getChildRef(); if (instanceOf(nodeRef, ContentModel.TYPE_CONTENT) == true) { throw new AlfrescoRuntimeException( I18NUtil.getMessage(MSG_ERROR_ADD_CONTENT_CONTAINER)); } + } + @Override + @Behaviour + ( + kind = BehaviourKind.CLASS, + name = DELETE_BEHAVIOUR_NAME + ) + public void onDeleteNode(ChildAssociationRef childAssocRef, boolean isNodeArchived) + { + throw new IntegrityException("Operation failed. Deletion of Hold Container is not allowed.", null); } } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/RmSiteType.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/RmSiteType.java index 82eb0b57ac..40b7842c08 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/RmSiteType.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/RmSiteType.java @@ -97,6 +97,8 @@ public class RmSiteType extends BaseBehaviourBean /** Authority service */ private AuthorityService authorityService; + private FilePlanType filePlanType; + /** Map of file plan type's key'ed by corresponding site types */ protected Map mapFilePlanType = new HashMap(3); @@ -133,6 +135,11 @@ public class RmSiteType extends BaseBehaviourBean this.authorityService = authorityService; } + public void setFilePlanType(FilePlanType filePlanType) + { + this.filePlanType = filePlanType; + } + /** * Registers a file plan type for a specific site type. * @@ -302,6 +309,7 @@ public class RmSiteType extends BaseBehaviourBean return null; } }); + filePlanType.disable(); } } } @@ -354,4 +362,15 @@ public class RmSiteType extends BaseBehaviourBean throw new IntegrityException(I18NUtil.getMessage(MULTIPLE_CHILDREN_TYPE_ERROR, ContentModel.TYPE_FOLDER), null); } } + + @Behaviour + ( + kind = BehaviourKind.CLASS, + policy = "alf:onDeleteNode", + notificationFrequency = NotificationFrequency.TRANSACTION_COMMIT + ) + public void onDeleteNodeOnCommit(ChildAssociationRef childAssocRef, boolean isNodeArchived) + { + filePlanType.enable(); + } } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/TransferContainerType.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/TransferContainerType.java index d0fba4ff99..6fb4cca3ef 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/TransferContainerType.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/TransferContainerType.java @@ -46,11 +46,15 @@ import org.springframework.extensions.surf.util.I18NUtil; */ @BehaviourBean(defaultType = "rma:transferContainer") public class TransferContainerType extends BaseBehaviourBean - implements NodeServicePolicies.OnCreateChildAssociationPolicy, NodeServicePolicies.OnCreateNodePolicy + implements NodeServicePolicies.OnCreateChildAssociationPolicy, + NodeServicePolicies.OnCreateNodePolicy, + NodeServicePolicies.OnDeleteNodePolicy + { private final static String MSG_ERROR_ADD_CONTENT_CONTAINER = "rm.service.error-add-content-container"; private final static String MSG_ERROR_ADD_CHILD_TO_TRANSFER_CONTAINER = "rm.action.create.transfer.container.child-error-message"; private static final String BEHAVIOUR_NAME = "onCreateChildAssocsForTransferContainer"; + private static final String DELETE_BEHAVIOUR_NAME = "onDeleteTransferContainer"; /** * Disable the behaviours for this transaction @@ -59,6 +63,7 @@ public class TransferContainerType extends BaseBehaviourBean public void disable() { getBehaviour(BEHAVIOUR_NAME).disable(); + getBehaviour(DELETE_BEHAVIOUR_NAME).disable(); } /** @@ -68,6 +73,7 @@ public class TransferContainerType extends BaseBehaviourBean public void enable() { getBehaviour(BEHAVIOUR_NAME).enable(); + getBehaviour(DELETE_BEHAVIOUR_NAME).enable(); } /** @@ -94,4 +100,15 @@ public class TransferContainerType extends BaseBehaviourBean if (instanceOf(nodeRef, ContentModel.TYPE_CONTENT) == true) { throw new AlfrescoRuntimeException( I18NUtil.getMessage(MSG_ERROR_ADD_CONTENT_CONTAINER)); } } + + @Override + @Behaviour + ( + kind = BehaviourKind.CLASS, + name = DELETE_BEHAVIOUR_NAME + ) + public void onDeleteNode(ChildAssociationRef childAssocRef, boolean isNodeArchived) + { + throw new IntegrityException("Operation failed. Deletion of Transfer Container is not allowed.", null); + } } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/UnfiledRecordContainerType.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/UnfiledRecordContainerType.java index b0b78a9bbb..4c0c1e9df9 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/UnfiledRecordContainerType.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/UnfiledRecordContainerType.java @@ -33,6 +33,7 @@ import java.util.List; import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.model.BaseBehaviourBean; import org.alfresco.repo.node.NodeServicePolicies; +import org.alfresco.repo.node.integrity.IntegrityException; import org.alfresco.repo.policy.annotation.Behaviour; import org.alfresco.repo.policy.annotation.BehaviourBean; import org.alfresco.repo.policy.annotation.BehaviourKind; @@ -47,9 +48,30 @@ import org.alfresco.service.namespace.QName; */ @BehaviourBean(defaultType = "rma:unfiledRecordContainer") public class UnfiledRecordContainerType extends BaseBehaviourBean - implements NodeServicePolicies.OnCreateChildAssociationPolicy + implements NodeServicePolicies.OnCreateChildAssociationPolicy, + NodeServicePolicies.OnDeleteNodePolicy { + private static final String BEHAVIOUR_NAME = "onDeleteUnfiledRecordContainer"; private final static List ACCEPTED_NON_UNIQUE_CHILD_TYPES = Arrays.asList(TYPE_UNFILED_RECORD_FOLDER, ContentModel.TYPE_CONTENT, TYPE_NON_ELECTRONIC_DOCUMENT); + + /** + * Disable the behaviours for this transaction + * + */ + public void disable() + { + getBehaviour(BEHAVIOUR_NAME).disable(); + } + + /** + * Enable behaviours for this transaction + * + */ + public void enable() + { + getBehaviour(BEHAVIOUR_NAME).enable(); + } + @Override @Behaviour(kind = BehaviourKind.ASSOCIATION) public void onCreateChildAssociation(ChildAssociationRef childAssocRef, boolean isNewNode) @@ -57,4 +79,15 @@ public class UnfiledRecordContainerType extends BaseBehaviourBean // check the created child is of an accepted type validateNewChildAssociationSubTypesIncluded(childAssocRef.getChildRef(), ACCEPTED_NON_UNIQUE_CHILD_TYPES); } + + @Override + @Behaviour + ( + kind = BehaviourKind.CLASS, + name = BEHAVIOUR_NAME + ) + public void onDeleteNode(ChildAssociationRef childAssocRef, boolean isNodeArchived) + { + throw new IntegrityException("Operation failed. Deletion of Unfiled Record Container is not allowed.", null); + } } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/impl/RMNodesImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/impl/RMNodesImpl.java index b5bd4267f3..9e61d8c8cc 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/impl/RMNodesImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/impl/RMNodesImpl.java @@ -49,8 +49,6 @@ import org.alfresco.rest.api.impl.NodesImpl; import org.alfresco.rest.api.model.Node; import org.alfresco.rest.api.model.UserInfo; import org.alfresco.rest.framework.core.exceptions.EntityNotFoundException; -import org.alfresco.rest.framework.core.exceptions.PermissionDeniedException; -import org.alfresco.rest.framework.resource.parameters.Parameters; import org.alfresco.rm.rest.api.RMNodes; import org.alfresco.rm.rest.api.model.FileplanComponentNode; import org.alfresco.rm.rest.api.model.RecordCategoryNode; @@ -415,22 +413,4 @@ public class RMNodesImpl extends NodesImpl implements RMNodes return false; } - - /** - * Overridden this method just in order to use our isSpecialNode method since core method could not be overridden. - * - * TODO remove this after isSpecialNode will be made protected in core(REPO-1459). - */ - @Override - public void deleteNode(String nodeId, Parameters parameters) - { - NodeRef nodeRef = validateOrLookupNode(nodeId, null); - QName nodeType = nodeService.getType(nodeRef); - - if (isSpecialNode(nodeRef, nodeType)) - { - throw new PermissionDeniedException("Cannot delete: " + nodeId); - } - super.deleteNode(nodeId, parameters); - } } diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/RM4293Test.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/RM4293Test.java new file mode 100644 index 0000000000..aac6266d89 --- /dev/null +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/RM4293Test.java @@ -0,0 +1,126 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2016 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * - + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * - + * 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 . + * #L% + * + */ + +package org.alfresco.module.org_alfresco_module_rm.test.integration.issue; + +import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase; +import org.alfresco.repo.node.integrity.IntegrityException; +import org.alfresco.service.cmr.repository.NodeRef; + +/** + * Test for RM-4293 + * + * @author Silviu Dinuta + * @since 2.6 + * + */ +public class RM4293Test extends BaseRMTestCase +{ + public void testDeleteSpecialContainers() throws Exception + { + doTestInTransaction(new Test() + { + @Override + public Void run() + { + NodeRef holdContainer = filePlanService.getHoldContainer(filePlan); + assertNotNull(holdContainer); + + try + { + fileFolderService.delete(holdContainer); + fail("This should have thrown an exception"); + } + catch (IntegrityException e) + { + // ("Hold Container can't be deleted.") + } + return null; + } + }); + + doTestInTransaction(new Test() + { + @Override + public Void run() + { + NodeRef transferContainer = filePlanService.getTransferContainer(filePlan); + assertNotNull(transferContainer); + try + { + fileFolderService.delete(transferContainer); + fail("This should have thrown an exception"); + } + catch (IntegrityException e) + { + // ("Transfer Container can't be deleted.") + } + return null; + } + }); + + doTestInTransaction(new Test() + { + @Override + public Void run() + { + NodeRef unfiledRecordContainer = filePlanService.getUnfiledContainer(filePlan); + assertNotNull(unfiledRecordContainer); + + try + { + fileFolderService.delete(unfiledRecordContainer); + fail("This should have thrown an exception"); + } + catch (IntegrityException e) + { + // ("Unfiled Record Container can't be deleted.") + } + return null; + } + }); + + doTestInTransaction(new Test() + { + @Override + public Void run() + { + try + { + fileFolderService.delete(filePlan); + fail("This should have thrown an exception"); + } + catch (IntegrityException e) + { + // ("FilePlan can't be deleted.") + } + return null; + } + }); + } +} diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/impl/RMNodesImplUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/impl/RMNodesImplUnitTest.java index abbb8e9aa7..abda9f8a2b 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/impl/RMNodesImplUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/impl/RMNodesImplUnitTest.java @@ -34,9 +34,6 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.security.InvalidParameterException; @@ -53,8 +50,6 @@ import org.alfresco.module.org_alfresco_module_rm.test.util.BaseUnitTest; import org.alfresco.repo.model.Repository; import org.alfresco.rest.api.model.Node; import org.alfresco.rest.framework.core.exceptions.EntityNotFoundException; -import org.alfresco.rest.framework.core.exceptions.PermissionDeniedException; -import org.alfresco.rest.framework.resource.parameters.Parameters; import org.alfresco.rm.rest.api.RMNodes; import org.alfresco.rm.rest.api.model.FileplanComponentNode; import org.alfresco.rm.rest.api.model.RecordCategoryNode; @@ -637,121 +632,6 @@ public class RMNodesImplUnitTest extends BaseUnitTest assertEquals(nodeRef, validateOrLookupNode); } - @Test - public void testDeleteNode() throws Exception - { - NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService); - Parameters mockedParameters = mock(Parameters.class); - QName mockedType = AlfMock.generateQName(); - when(mockedNodeService.getType(nodeRef)).thenReturn(mockedType); - - setupCompanyHomeAndPrimaryParent(nodeRef); - - rmNodesImpl.deleteNode(nodeRef.getId(), mockedParameters); - verify(mockedFileFolderService, times(1)).delete(nodeRef); - } - - @Test - public void testDeleteFileplanNode() throws Exception - { - NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService); - Parameters mockedParameters = mock(Parameters.class); - QName mockedType = AlfMock.generateQName(); - when(mockedNodeService.getType(nodeRef)).thenReturn(mockedType); - - when(mockedFilePlanService.getFilePlanBySiteId(RM_SITE_ID)).thenReturn(nodeRef); - try - { - rmNodesImpl.deleteNode(nodeRef.getId(), mockedParameters); - fail("Expected ecxeption as filePlan can't be deleted."); - } - catch(PermissionDeniedException ex) - { - assertEquals("Cannot delete: " + nodeRef.getId(), ex.getMsgId()); - } - verify(mockedFileFolderService, never()).delete(nodeRef); - } - - @Test - public void testDeleteTransfersContainerNode() throws Exception - { - NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService); - Parameters mockedParameters = mock(Parameters.class); - QName mockedType = AlfMock.generateQName(); - when(mockedNodeService.getType(nodeRef)).thenReturn(mockedType); - - NodeRef filePlanNodeRef = AlfMock.generateNodeRef(mockedNodeService); - when(mockedFilePlanService.getFilePlanBySiteId(RM_SITE_ID)).thenReturn(filePlanNodeRef); - when(mockedFilePlanService.getTransferContainer(filePlanNodeRef)).thenReturn(nodeRef); - try - { - rmNodesImpl.deleteNode(nodeRef.getId(), mockedParameters); - fail("Expected ecxeption as Trnsfers container can't be deleted."); - } - catch(PermissionDeniedException ex) - { - assertEquals("Cannot delete: " + nodeRef.getId(), ex.getMsgId()); - } - verify(mockedFileFolderService, never()).delete(nodeRef); - } - - @Test - public void testDeleteHoldsContainerNode() throws Exception - { - NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService); - Parameters mockedParameters = mock(Parameters.class); - QName mockedType = AlfMock.generateQName(); - when(mockedNodeService.getType(nodeRef)).thenReturn(mockedType); - - NodeRef filePlanNodeRef = AlfMock.generateNodeRef(mockedNodeService); - when(mockedFilePlanService.getFilePlanBySiteId(RM_SITE_ID)).thenReturn(filePlanNodeRef); - - NodeRef transferContainerNodeRef = AlfMock.generateNodeRef(mockedNodeService); - when(mockedFilePlanService.getTransferContainer(filePlanNodeRef)).thenReturn(transferContainerNodeRef); - - when(mockedFilePlanService.getHoldContainer(filePlanNodeRef)).thenReturn(nodeRef); - try - { - rmNodesImpl.deleteNode(nodeRef.getId(), mockedParameters); - fail("Expected ecxeption as Holds container can't be deleted."); - } - catch(PermissionDeniedException ex) - { - assertEquals("Cannot delete: " + nodeRef.getId(), ex.getMsgId()); - } - verify(mockedFileFolderService, never()).delete(nodeRef); - } - - @Test - public void testDeleteUnfiledRecordsContainerNode() throws Exception - { - NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService); - Parameters mockedParameters = mock(Parameters.class); - QName mockedType = AlfMock.generateQName(); - when(mockedNodeService.getType(nodeRef)).thenReturn(mockedType); - - NodeRef filePlanNodeRef = AlfMock.generateNodeRef(mockedNodeService); - when(mockedFilePlanService.getFilePlanBySiteId(RM_SITE_ID)).thenReturn(filePlanNodeRef); - - NodeRef transferContainerNodeRef = AlfMock.generateNodeRef(mockedNodeService); - when(mockedFilePlanService.getTransferContainer(filePlanNodeRef)).thenReturn(transferContainerNodeRef); - - NodeRef holdContainerNodeRef = AlfMock.generateNodeRef(mockedNodeService); - when(mockedFilePlanService.getHoldContainer(filePlanNodeRef)).thenReturn(holdContainerNodeRef); - - when(mockedFilePlanService.getUnfiledContainer(filePlanNodeRef)).thenReturn(nodeRef); - try - { - rmNodesImpl.deleteNode(nodeRef.getId(), mockedParameters); - fail("Expected ecxeption as Unfiled Records container can't be deleted."); - } - catch(PermissionDeniedException ex) - { - assertEquals("Cannot delete: " + nodeRef.getId(), ex.getMsgId()); - } - verify(mockedFileFolderService, never()).delete(nodeRef); - } - private void setupCompanyHomeAndPrimaryParent(NodeRef nodeRef) { NodeRef companyHomeNodeRef = AlfMock.generateNodeRef(mockedNodeService);