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);