From adc144e9717ae17ce80aa6f50c099f6852e7b075 Mon Sep 17 00:00:00 2001 From: roxana Date: Mon, 31 Oct 2016 12:18:34 +0200 Subject: [PATCH 01/23] Update disposition schedule action for a record when linking or unlinking it. --- .../rm-service-context.xml | 1 + .../disposition/DispositionService.java | 8 ++++++++ .../disposition/DispositionServiceImpl.java | 20 +++++++++++++++++++ .../record/RecordServiceImpl.java | 12 ++++++++--- 4 files changed, 38 insertions(+), 3 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 97f6a97480..81a2ad8478 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 @@ -142,6 +142,7 @@ org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.updateDispositionActionDefinition=RM_ALLOW org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.isNextDispositionActionEligible=RM.Read.0 org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.getNextDispositionAction=RM.Read.0 + org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.updateDispositionWhenLinkingOrUnlinking=RM.Read.0 org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.getCompletedDispositionActions=RM.Read.0 org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.getLastCompletedDispostionAction=RM.Read.0 org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.isDisposableItemCutoff=RM.Read.0 diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionService.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionService.java index ed2ed79ecd..67e0ff072d 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionService.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionService.java @@ -264,4 +264,12 @@ public interface DispositionService * @return the initial disposition */ DispositionSchedule getOriginDispositionSchedule(NodeRef nodeRef); + + /** + * Updates disposition action step when linking or unlinking + * the given record to/from a record folder + * + * @param record + */ + void updateDispositionWhenLinkingOrUnlinking(NodeRef record); } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java index 3a6e1d5beb..272a2beb7a 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java @@ -1094,6 +1094,26 @@ public class DispositionServiceImpl extends ServiceBaseImpl } return null; } + + public void updateDispositionWhenLinkingOrUnlinking(NodeRef record) + { + List recordFolders = recordFolderService.getRecordFolders(record); + + DispositionAction nextDispositionAction = getNextDispositionAction(record); + + NextActionFromDisposition dsNextAction = getNextDispositionAction(record, recordFolders, nextDispositionAction); + final NodeRef action = dsNextAction.getNextActionNodeRef(); + final Date dispositionActionDate = dsNextAction.getNextActionDateAsOf(); + AuthenticationUtil.runAsSystem(new RunAsWork() + { + @Override + public Void doWork() + { + nodeService.setProperty(action, PROP_DISPOSITION_AS_OF, dispositionActionDate); + return null; + } + }); + } /** * Helper method to determine if a node is frozen or has frozen children 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 a523ac93b6..c56cec4f50 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 @@ -34,14 +34,12 @@ import java.util.Set; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; -import org.alfresco.module.org_alfresco_module_rm.RecordsManagementServiceRegistry; import org.alfresco.module.org_alfresco_module_rm.RecordsManagementPolicies.BeforeFileRecord; import org.alfresco.module.org_alfresco_module_rm.RecordsManagementPolicies.OnFileRecord; import org.alfresco.module.org_alfresco_module_rm.capability.Capability; import org.alfresco.module.org_alfresco_module_rm.capability.CapabilityService; import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel; import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedule; -import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionScheduleImpl; import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService; import org.alfresco.module.org_alfresco_module_rm.dod5015.DOD5015Model; import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; @@ -547,6 +545,8 @@ public class RecordServiceImpl extends BaseBehaviourBean // create and file the content as a record file(nodeRef); + // recalculate disposition schedule for the record when linking it + dispositionService.updateDispositionWhenLinkingOrUnlinking(nodeRef); } } } @@ -1695,7 +1695,7 @@ public class RecordServiceImpl extends BaseBehaviourBean // ensure we are linking a record to a record folder if(isRecord(record) && isRecordFolder(recordFolder)) { - // ensure that we are not linking a record to an exisiting location + // ensure that we are not linking a record to an existing location List parents = nodeService.getParentAssocs(record); for (ChildAssociationRef parent : parents) { @@ -1718,6 +1718,9 @@ public class RecordServiceImpl extends BaseBehaviourBean record, ContentModel.ASSOC_CONTAINS, QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, name)); + + // recalculate disposition schedule for the record when linking it + dispositionService.updateDispositionWhenLinkingOrUnlinking(record); } else { @@ -1774,6 +1777,9 @@ public class RecordServiceImpl extends BaseBehaviourBean // remove the link nodeService.removeChild(recordFolder, record); + + // recalculate disposition schedule for record after unlinking it + dispositionService.updateDispositionWhenLinkingOrUnlinking(record); } else { From 0a79d24defc9a8ff106b2dfe37f147be9e105823 Mon Sep 17 00:00:00 2001 From: roxana Date: Mon, 31 Oct 2016 14:41:58 +0200 Subject: [PATCH 02/23] Renamed method for calculating next disposition step and added null check. --- .../rm-service-context.xml | 2 +- .../disposition/DispositionService.java | 2 +- .../disposition/DispositionServiceImpl.java | 25 +++++++++++-------- .../record/RecordServiceImpl.java | 6 ++--- 4 files changed, 19 insertions(+), 16 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 81a2ad8478..6b39ea2065 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 @@ -142,7 +142,7 @@ org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.updateDispositionActionDefinition=RM_ALLOW org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.isNextDispositionActionEligible=RM.Read.0 org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.getNextDispositionAction=RM.Read.0 - org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.updateDispositionWhenLinkingOrUnlinking=RM.Read.0 + org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.recalculateNextDispositionStep=RM.Read.0 org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.getCompletedDispositionActions=RM.Read.0 org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.getLastCompletedDispostionAction=RM.Read.0 org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService.isDisposableItemCutoff=RM.Read.0 diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionService.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionService.java index 67e0ff072d..a666b950c4 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionService.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionService.java @@ -271,5 +271,5 @@ public interface DispositionService * * @param record */ - void updateDispositionWhenLinkingOrUnlinking(NodeRef record); + void recalculateNextDispositionStep(NodeRef record); } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java index 272a2beb7a..2dcd859cf4 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java @@ -1095,24 +1095,27 @@ public class DispositionServiceImpl extends ServiceBaseImpl return null; } - public void updateDispositionWhenLinkingOrUnlinking(NodeRef record) + public void recalculateNextDispositionStep(NodeRef record) { List recordFolders = recordFolderService.getRecordFolders(record); DispositionAction nextDispositionAction = getNextDispositionAction(record); - NextActionFromDisposition dsNextAction = getNextDispositionAction(record, recordFolders, nextDispositionAction); - final NodeRef action = dsNextAction.getNextActionNodeRef(); - final Date dispositionActionDate = dsNextAction.getNextActionDateAsOf(); - AuthenticationUtil.runAsSystem(new RunAsWork() + if (nextDispositionAction != null) { - @Override - public Void doWork() + NextActionFromDisposition dsNextAction = getNextDispositionAction(record, recordFolders, nextDispositionAction); + final NodeRef action = dsNextAction.getNextActionNodeRef(); + final Date dispositionActionDate = dsNextAction.getNextActionDateAsOf(); + AuthenticationUtil.runAsSystem(new RunAsWork() { - nodeService.setProperty(action, PROP_DISPOSITION_AS_OF, dispositionActionDate); - return null; - } - }); + @Override + public Void doWork() + { + nodeService.setProperty(action, PROP_DISPOSITION_AS_OF, dispositionActionDate); + return null; + } + }); + } } /** 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 c56cec4f50..22d4c95733 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 @@ -546,7 +546,7 @@ public class RecordServiceImpl extends BaseBehaviourBean // create and file the content as a record file(nodeRef); // recalculate disposition schedule for the record when linking it - dispositionService.updateDispositionWhenLinkingOrUnlinking(nodeRef); + dispositionService.recalculateNextDispositionStep(nodeRef); } } } @@ -1720,7 +1720,7 @@ public class RecordServiceImpl extends BaseBehaviourBean QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, name)); // recalculate disposition schedule for the record when linking it - dispositionService.updateDispositionWhenLinkingOrUnlinking(record); + dispositionService.recalculateNextDispositionStep(record); } else { @@ -1779,7 +1779,7 @@ public class RecordServiceImpl extends BaseBehaviourBean nodeService.removeChild(recordFolder, record); // recalculate disposition schedule for record after unlinking it - dispositionService.updateDispositionWhenLinkingOrUnlinking(record); + dispositionService.recalculateNextDispositionStep(record); } else { From b47d2370d7a47035629f60d644100bda745745b8 Mon Sep 17 00:00:00 2001 From: roxana Date: Mon, 31 Oct 2016 15:14:14 +0200 Subject: [PATCH 03/23] Added integration test for recalculating disposition for a record when unlinking it. --- .../disposition/MultipleSchedulesTest.java | 29 +++++++++++++++++++ .../UpdateNextDispositionActionTest.java | 2 -- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/disposition/MultipleSchedulesTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/disposition/MultipleSchedulesTest.java index f166c97a1f..26d119210d 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/disposition/MultipleSchedulesTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/disposition/MultipleSchedulesTest.java @@ -173,4 +173,33 @@ public class MultipleSchedulesTest extends BaseRMTestCase .from(() -> dispositionService.getNextDispositionAction(record).getAsOfDate()) .because("Record should follow largest rentention schedule period, which is one week."); } + + /** + * RM-4292 + *

+     * Given a record subject to a mixed disposition schedule
+     * When the record is unlinked from one of its secondary parents
+     * Then the next disposition action is recalculated.
+     * 
+ */ + public void testRecalculateDispositionWhenUnlinking() + { + test() + .given(() -> { + setUpFilePlan(); + // Create a record filed under category A and linked to category B. + record = fileFolderService.create(folderA, RECORD_NAME, ContentModel.TYPE_CONTENT).getNodeRef(); + recordService.link(record, folderB); + }) + .when(() -> { + // Cut off the record. + dispositionService.cutoffDisposableItem(record); + // Unlink the record from folder B. + recordService.unlink(record, folderB); + }) + .then() + .expect(true) + .from(() -> dispositionService.isNextDispositionActionEligible(record)) + .because("Destroy action should be available, as the record should follow its origin disposition schedule."); + } } diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/disposition/UpdateNextDispositionActionTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/disposition/UpdateNextDispositionActionTest.java index d8dbb0b078..66bf5513b8 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/disposition/UpdateNextDispositionActionTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/disposition/UpdateNextDispositionActionTest.java @@ -26,13 +26,11 @@ import static org.alfresco.util.GUID.generate; import java.io.Serializable; import java.util.Collections; -import java.util.Date; import java.util.HashMap; import java.util.Map; import org.alfresco.module.org_alfresco_module_rm.action.impl.CutOffAction; import org.alfresco.module.org_alfresco_module_rm.action.impl.DestroyAction; -import org.alfresco.module.org_alfresco_module_rm.action.impl.EditDispositionActionAsOfDateAction; import org.alfresco.module.org_alfresco_module_rm.action.impl.TransferAction; import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionSchedule; import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase; From 07d010b1645a1ca849d2d5db3125f648aa53a312 Mon Sep 17 00:00:00 2001 From: roxana Date: Mon, 31 Oct 2016 15:53:17 +0200 Subject: [PATCH 04/23] Added null check. --- .../disposition/DispositionServiceImpl.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java index 2dcd859cf4..907c6c2b90 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java @@ -1104,17 +1104,20 @@ public class DispositionServiceImpl extends ServiceBaseImpl if (nextDispositionAction != null) { NextActionFromDisposition dsNextAction = getNextDispositionAction(record, recordFolders, nextDispositionAction); - final NodeRef action = dsNextAction.getNextActionNodeRef(); - final Date dispositionActionDate = dsNextAction.getNextActionDateAsOf(); - AuthenticationUtil.runAsSystem(new RunAsWork() + if (dsNextAction != null) { - @Override - public Void doWork() + final NodeRef action = dsNextAction.getNextActionNodeRef(); + final Date dispositionActionDate = dsNextAction.getNextActionDateAsOf(); + AuthenticationUtil.runAsSystem(new RunAsWork() { - nodeService.setProperty(action, PROP_DISPOSITION_AS_OF, dispositionActionDate); - return null; - } - }); + @Override + public Void doWork() + { + nodeService.setProperty(action, PROP_DISPOSITION_AS_OF, dispositionActionDate); + return null; + } + }); + } } } From b3aa001eb0c69dd34dd281a629dc06ca5b65834e Mon Sep 17 00:00:00 2001 From: Silviu Dinuta Date: Tue, 8 Nov 2016 11:42:58 +0200 Subject: [PATCH 05/23] RM-4326: added restriction for types that are accepted to be create in unfiled record folder --- .../rm-model-context.xml | 2 + .../rma/type/UnfiledRecordFolderType.java | 61 ++++++++ .../type/UnfiledRecordFolderTypeUnitTest.java | 138 ++++++++++++++++++ 3 files changed, 201 insertions(+) create mode 100644 rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/UnfiledRecordFolderType.java create mode 100644 rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/UnfiledRecordFolderTypeUnitTest.java 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 cc0af7b9d8..16dd447fe6 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 @@ -87,6 +87,8 @@ + + diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/UnfiledRecordFolderType.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/UnfiledRecordFolderType.java new file mode 100644 index 0000000000..e9fca65542 --- /dev/null +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/UnfiledRecordFolderType.java @@ -0,0 +1,61 @@ +/* + * #%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.model.rma.type; + +import java.util.Arrays; +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.policy.annotation.Behaviour; +import org.alfresco.repo.policy.annotation.BehaviourBean; +import org.alfresco.repo.policy.annotation.BehaviourKind; +import org.alfresco.service.cmr.repository.ChildAssociationRef; +import org.alfresco.service.namespace.QName; + +/** + * rma:unfiledRecordFolder behaviour bean + * + * @author Silviu Dinuta + * @since 2.6 + */ +@BehaviourBean(defaultType = "rma:unfiledRecordFolder") +public class UnfiledRecordFolderType extends BaseBehaviourBean + implements NodeServicePolicies.OnCreateChildAssociationPolicy +{ + private final static List ACCEPTED_NON_UNIQUE_CHILD_TYPES = Arrays.asList(TYPE_UNFILED_RECORD_FOLDER, ContentModel.TYPE_CONTENT, TYPE_NON_ELECTRONIC_DOCUMENT); + + @Override + @Behaviour(kind = BehaviourKind.ASSOCIATION) + public void onCreateChildAssociation(ChildAssociationRef childAssocRef, boolean isNewNode) + { + // check the created child is of an accepted type + validateNewChildAssociationSubTypesIncluded(childAssocRef.getChildRef(), ACCEPTED_NON_UNIQUE_CHILD_TYPES); + } +} diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/UnfiledRecordFolderTypeUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/UnfiledRecordFolderTypeUnitTest.java new file mode 100644 index 0000000000..18efc7ecde --- /dev/null +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/UnfiledRecordFolderTypeUnitTest.java @@ -0,0 +1,138 @@ +/* + * #%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.model.rma.type; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.security.InvalidParameterException; + +import org.alfresco.model.ContentModel; +import org.alfresco.module.org_alfresco_module_rm.test.util.AlfMock; +import org.alfresco.module.org_alfresco_module_rm.test.util.BaseUnitTest; +import org.alfresco.service.cmr.repository.ChildAssociationRef; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.namespace.QName; +import org.junit.Test; +import org.mockito.InjectMocks; + +/** + * Unit test for UnfiledRecordFolderType + * + * @author Silviu Dinuta + * @since 2.6 + */ +public class UnfiledRecordFolderTypeUnitTest extends BaseUnitTest +{ + @InjectMocks + private UnfiledRecordFolderType unfiledRecordFolderType; + + /** + * Given that we try to add a type that is not one of "rma:unfiledRecordFolder", "cm:content" or "rma:nonElectronicDocument" types to unfiled record folder, + * Then InvalidParameterException is thrown. + */ + @Test(expected = InvalidParameterException.class) + public void testAddNonAcceptedTypeToUnfiledRecordFolder() + { + QName type = AlfMock.generateQName(); + when(mockedDictionaryService.isSubClass(type, TYPE_UNFILED_RECORD_FOLDER)).thenReturn(false); + when(mockedDictionaryService.isSubClass(type, ContentModel.TYPE_CONTENT)).thenReturn(false); + when(mockedDictionaryService.isSubClass(type, TYPE_NON_ELECTRONIC_DOCUMENT)).thenReturn(false); + + NodeRef nodeRef= AlfMock.generateNodeRef(mockedNodeService, type); + + NodeRef unfiledRecordFolder = generateNodeRef(TYPE_UNFILED_RECORD_FOLDER, true); + ChildAssociationRef mockedChildAssoc = mock(ChildAssociationRef.class); + when(mockedChildAssoc.getChildRef()).thenReturn(nodeRef); + when(mockedChildAssoc.getParentRef()).thenReturn(unfiledRecordFolder); + unfiledRecordFolderType.onCreateChildAssociation(mockedChildAssoc, true); + } + + /** + * Given that we try to add "rma:unfiledRecordFolder" sub-type to unfiled record folder, + * Then the operation is successful. + */ + @Test + public void testAddUnfiledRecordFolderTypeToUnfiledRecordFolder() + { + QName type = AlfMock.generateQName(); + when(mockedDictionaryService.isSubClass(type, TYPE_UNFILED_RECORD_FOLDER)).thenReturn(true); + when(mockedDictionaryService.isSubClass(type, ContentModel.TYPE_CONTENT)).thenReturn(false); + when(mockedDictionaryService.isSubClass(type, TYPE_NON_ELECTRONIC_DOCUMENT)).thenReturn(false); + + NodeRef nodeRef= AlfMock.generateNodeRef(mockedNodeService, type); + + NodeRef unfiledRecordFolder = generateNodeRef(TYPE_UNFILED_RECORD_FOLDER, true); + ChildAssociationRef mockedChildAssoc = mock(ChildAssociationRef.class); + when(mockedChildAssoc.getChildRef()).thenReturn(nodeRef); + when(mockedChildAssoc.getParentRef()).thenReturn(unfiledRecordFolder); + unfiledRecordFolderType.onCreateChildAssociation(mockedChildAssoc, true); + } + + /** + * Given that we try to add "cm:content" sub-type to unfiled record folder, + * Then the operation is successful. + */ + @Test + public void testAddContentTypeToUnfiledRecordFolder() + { + QName type = AlfMock.generateQName(); + when(mockedDictionaryService.isSubClass(type, TYPE_UNFILED_RECORD_FOLDER)).thenReturn(false); + when(mockedDictionaryService.isSubClass(type, ContentModel.TYPE_CONTENT)).thenReturn(true); + when(mockedDictionaryService.isSubClass(type, TYPE_NON_ELECTRONIC_DOCUMENT)).thenReturn(false); + + NodeRef nodeRef= AlfMock.generateNodeRef(mockedNodeService, type); + + NodeRef unfiledRecordFolder = generateNodeRef(TYPE_UNFILED_RECORD_FOLDER, true); + ChildAssociationRef mockedChildAssoc = mock(ChildAssociationRef.class); + when(mockedChildAssoc.getChildRef()).thenReturn(nodeRef); + when(mockedChildAssoc.getParentRef()).thenReturn(unfiledRecordFolder); + unfiledRecordFolderType.onCreateChildAssociation(mockedChildAssoc, true); + } + + /** + * Given that we try to add "rma:nonElectronicDocument" sub-type to unfiled record folder, + * Then the operation is successful. + */ + @Test + public void testNonElectronicDocumentTypeToUnfiledRecordFolder() + { + QName type = AlfMock.generateQName(); + when(mockedDictionaryService.isSubClass(type, TYPE_UNFILED_RECORD_FOLDER)).thenReturn(false); + when(mockedDictionaryService.isSubClass(type, ContentModel.TYPE_CONTENT)).thenReturn(false); + when(mockedDictionaryService.isSubClass(type, TYPE_NON_ELECTRONIC_DOCUMENT)).thenReturn(true); + + NodeRef nodeRef= AlfMock.generateNodeRef(mockedNodeService, type); + + NodeRef unfiledRecordFolder = generateNodeRef(TYPE_UNFILED_RECORD_FOLDER, true); + ChildAssociationRef mockedChildAssoc = mock(ChildAssociationRef.class); + when(mockedChildAssoc.getChildRef()).thenReturn(nodeRef); + when(mockedChildAssoc.getParentRef()).thenReturn(unfiledRecordFolder); + unfiledRecordFolderType.onCreateChildAssociation(mockedChildAssoc, true); + } +} \ No newline at end of file From c28e0d53382e0eb8f5e202b3a247a15168ac7a73 Mon Sep 17 00:00:00 2001 From: Silviu Dinuta Date: Tue, 8 Nov 2016 14:16:15 +0200 Subject: [PATCH 06/23] RM-4326: restricted permission for post request on Transfer Container, Transfer Folder type and Hold folder type and added unit tests for the changes --- .../org/alfresco/rm/rest/api/RMNodes.java | 5 +- .../rm/rest/api/impl/RMNodesImpl.java | 31 +++- .../FileplanComponentChildrenRelation.java | 10 +- .../rm/rest/api/impl/RMNodesImplUnitTest.java | 87 +++++++++-- ...planComponentChildrenRelationUnitTest.java | 140 +++++++++++++++++- 5 files changed, 238 insertions(+), 35 deletions(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/RMNodes.java b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/RMNodes.java index bbbaf76323..c495eb0ebf 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/RMNodes.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/RMNodes.java @@ -47,10 +47,9 @@ public interface RMNodes extends Nodes public static String PARAM_INCLUDE_IS_COMPLETED = "isCompleted"; /** - * Identifies if one node is RM site node. + * Verifies if the post request is allowed for nodeId received as parameter. * * @param nodeId - * @return */ - boolean isRMSite(String nodeId); + void checkPostPermission(String nodeId); } 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 d0059819bb..6c6dca808b 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 @@ -404,19 +404,34 @@ public class RMNodesImpl extends NodesImpl implements RMNodes } @Override - public boolean isRMSite(String nodeId) + public void checkPostPermission(String nodeId) { - NodeRef nodeRef = validateOrLookupNode(nodeId, null); + NodeRef parentNodeRef = validateOrLookupNode(nodeId, null); + QName parentNodeRefType = nodeService.getType(parentNodeRef); - SiteInfo siteInfo = siteService.getSite(FilePlanService.DEFAULT_RM_SITE_ID); - if(siteInfo !=null) + if(RecordsManagementModel.TYPE_TRANSFER.equals(parentNodeRefType)) { - NodeRef rmNodeRef = siteInfo.getNodeRef(); - if(rmNodeRef.equals(nodeRef)) + throw new PermissionDeniedException("POST request not allowed in Transfer Folder."); + } + else if(RecordsManagementModel.TYPE_TRANSFER_CONTAINER.equals(parentNodeRefType)) + { + throw new PermissionDeniedException("POST request not allowed in Transfer Container."); + } + else if(RecordsManagementModel.TYPE_HOLD.equals(parentNodeRefType)) + { + throw new PermissionDeniedException("POST request not allowed in Hold Folder."); + } + else + { + SiteInfo siteInfo = siteService.getSite(FilePlanService.DEFAULT_RM_SITE_ID); + if(siteInfo !=null) { - return true; + NodeRef rmNodeRef = siteInfo.getNodeRef(); + if(rmNodeRef.equals(parentNodeRef)) + { + throw new PermissionDeniedException("POST request not allowed in RM site."); + } } } - return false; } } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelation.java b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelation.java index bbf714bcad..eca43b2f5f 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelation.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelation.java @@ -68,10 +68,7 @@ public class FileplanComponentChildrenRelation implements RelationshipResourceAc @Override public List create(String parentFolderNodeId, List nodeInfos, Parameters parameters) { - if(nodes.isRMSite(parentFolderNodeId)) - { - throw new PermissionDeniedException("POST request not allowed in RM site."); - } + nodes.checkPostPermission(parentFolderNodeId); List result = new ArrayList<>(nodeInfos.size()); for (Node nodeInfo : nodeInfos) @@ -85,10 +82,7 @@ public class FileplanComponentChildrenRelation implements RelationshipResourceAc @Override public Node create(String parentFolderNodeId, FormData formData, Parameters parameters, WithResponse withResponse) { - if(nodes.isRMSite(parentFolderNodeId)) - { - throw new PermissionDeniedException("POST request not allowed in RM site."); - } + nodes.checkPostPermission(parentFolderNodeId); return nodes.upload(parentFolderNodeId, formData, parameters); } } 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 5dc05ded3d..4107b81759 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 @@ -726,29 +726,90 @@ public class RMNodesImplUnitTest extends BaseUnitTest } @Test - public void testIsRMSite() throws Exception + public void testCheckPostPermissionForRMSite() throws Exception { - //test when rm site exists and we do not check the rm site NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); + SiteInfo mockedSiteInfo = mock(SiteInfo.class); + when(mockedSiteInfo.getNodeRef()).thenReturn(parentNodeRef); + when(mockedSiteService.getSite(RM_SITE_ID)).thenReturn(mockedSiteInfo); + try + { + rmNodesImpl.checkPostPermission(parentNodeRef.getId()); + fail("Expected ecxeption as post should not be permitted on the RM site"); + } + catch(PermissionDeniedException ex) + { + assertEquals("POST request not allowed in RM site.", ex.getMsgId()); + } + } + + @Test + public void testCheckPostPermissionForNormalNodeRefWhenRMSiteExists() throws Exception + { + NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); NodeRef rmSiteNodeRef = AlfMock.generateNodeRef(mockedNodeService); SiteInfo mockedSiteInfo = mock(SiteInfo.class); when(mockedSiteInfo.getNodeRef()).thenReturn(rmSiteNodeRef); when(mockedSiteService.getSite(RM_SITE_ID)).thenReturn(mockedSiteInfo); + rmNodesImpl.checkPostPermission(parentNodeRef.getId()); + } - boolean isRMSite = rmNodesImpl.isRMSite(parentNodeRef.getId()); - assertEquals("Should return false.", false, isRMSite); + @Test + public void testCheckPostPermissionForTransferContainer() throws Exception + { + NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); + when(mockedNodeService.getType(parentNodeRef)).thenReturn(RecordsManagementModel.TYPE_TRANSFER_CONTAINER); + try + { + rmNodesImpl.checkPostPermission(parentNodeRef.getId()); + fail("Expected ecxeption as post should not be permitted on the Transfer Container"); + } + catch(PermissionDeniedException ex) + { + assertEquals("POST request not allowed in Transfer Container.", ex.getMsgId()); + } + } - //check when rm site does not exist - when(mockedSiteService.getSite(RM_SITE_ID)).thenReturn(null); - isRMSite = rmNodesImpl.isRMSite(parentNodeRef.getId()); - assertEquals("Should return false.", false, isRMSite); + @Test + public void testCheckPostPermissionForTransferFolder() throws Exception + { + NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); + when(mockedNodeService.getType(parentNodeRef)).thenReturn(RecordsManagementModel.TYPE_TRANSFER); + try + { + rmNodesImpl.checkPostPermission(parentNodeRef.getId()); + fail("Expected ecxeption as post should not be permitted on the Transfer Folder"); + } + catch(PermissionDeniedException ex) + { + assertEquals("POST request not allowed in Transfer Folder.", ex.getMsgId()); + } + } - //check when rm site exists and we check with rm site node ref id - when(mockedSiteInfo.getNodeRef()).thenReturn(parentNodeRef); - when(mockedSiteService.getSite(RM_SITE_ID)).thenReturn(mockedSiteInfo); - isRMSite = rmNodesImpl.isRMSite(parentNodeRef.getId()); - assertEquals("Should return true.", true, isRMSite); + @Test + public void testCheckPostPermissionForHoldFolder() throws Exception + { + NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); + when(mockedNodeService.getType(parentNodeRef)).thenReturn(RecordsManagementModel.TYPE_HOLD); + try + { + rmNodesImpl.checkPostPermission(parentNodeRef.getId()); + fail("Expected ecxeption as post should not be permitted on the Hold Folder"); + } + catch(PermissionDeniedException ex) + { + assertEquals("POST request not allowed in Hold Folder.", ex.getMsgId()); + } + } + + @Test + public void testCheckPostPermission() throws Exception + { + NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); + QName type = AlfMock.generateQName(); + when(mockedNodeService.getType(parentNodeRef)).thenReturn(type); + rmNodesImpl.checkPostPermission(parentNodeRef.getId()); } private void setupCompanyHomeAndPrimaryParent(NodeRef nodeRef) diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelationUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelationUnitTest.java index 895437efa3..a27fa04a78 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelationUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelationUnitTest.java @@ -34,7 +34,6 @@ 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.util.ArrayList; import java.util.List; @@ -51,6 +50,7 @@ import org.junit.Before; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.springframework.extensions.webscripts.servlet.FormData; @@ -109,7 +109,7 @@ public class FileplanComponentChildrenRelationUnitTest extends BaseUnitTest Node mokedNodeInfo = mock(Node.class); nodeInfos.add(mokedNodeInfo); - when(mockedRMNodes.isRMSite(parentNodeRef.getId())).thenReturn(true); + Mockito.doThrow(new PermissionDeniedException("POST request not allowed in RM site.")).when(mockedRMNodes).checkPostPermission(parentNodeRef.getId()); try { filePlanComponentChildrenRelation.create(parentNodeRef.getId(), nodeInfos, mockedParameters); @@ -122,6 +122,76 @@ public class FileplanComponentChildrenRelationUnitTest extends BaseUnitTest verify(mockedRMNodes, never()).createNode(parentNodeRef.getId(), nodeInfos.get(0), mockedParameters); } + @Test + public void testCreateOnTransferContainer() throws Exception + { + Parameters mockedParameters = mock(Parameters.class); + NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); + + List nodeInfos = new ArrayList(); + Node mokedNodeInfo = mock(Node.class); + nodeInfos.add(mokedNodeInfo); + + Mockito.doThrow(new PermissionDeniedException("POST request not allowed in Transfer Container.")).when(mockedRMNodes).checkPostPermission(parentNodeRef.getId()); + try + { + filePlanComponentChildrenRelation.create(parentNodeRef.getId(), nodeInfos, mockedParameters); + fail("Expected ecxeption as POST request is not allowed in Transfer Container."); + } + catch(PermissionDeniedException ex) + { + assertEquals("POST request not allowed in Transfer Container.", ex.getMsgId()); + } + verify(mockedRMNodes, never()).createNode(parentNodeRef.getId(), nodeInfos.get(0), mockedParameters); + } + + @Test + public void testCreateOnHoldFolder() throws Exception + { + Parameters mockedParameters = mock(Parameters.class); + NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); + + List nodeInfos = new ArrayList(); + Node mokedNodeInfo = mock(Node.class); + nodeInfos.add(mokedNodeInfo); + + Mockito.doThrow(new PermissionDeniedException("POST request not allowed in Hold Folder.")).when(mockedRMNodes).checkPostPermission(parentNodeRef.getId()); + try + { + filePlanComponentChildrenRelation.create(parentNodeRef.getId(), nodeInfos, mockedParameters); + fail("Expected ecxeption as POST request is not allowed in Hold Folder."); + } + catch(PermissionDeniedException ex) + { + assertEquals("POST request not allowed in Hold Folder.", ex.getMsgId()); + } + verify(mockedRMNodes, never()).createNode(parentNodeRef.getId(), nodeInfos.get(0), mockedParameters); + } + + @Test + public void testCreateOnTransferFolder() throws Exception + { + Parameters mockedParameters = mock(Parameters.class); + NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); + + List nodeInfos = new ArrayList(); + Node mokedNodeInfo = mock(Node.class); + nodeInfos.add(mokedNodeInfo); + + Mockito.doThrow(new PermissionDeniedException("POST request not allowed in Transfer Folder.")).when(mockedRMNodes).checkPostPermission(parentNodeRef.getId()); + try + { + filePlanComponentChildrenRelation.create(parentNodeRef.getId(), nodeInfos, mockedParameters); + fail("Expected ecxeption as POST request is not allowed in Transfer Folder."); + } + catch(PermissionDeniedException ex) + { + assertEquals("POST request not allowed in Transfer Folder.", ex.getMsgId()); + } + verify(mockedRMNodes, never()).createNode(parentNodeRef.getId(), nodeInfos.get(0), mockedParameters); + } + + @Test public void testUpload() throws Exception { Parameters mockedParameters = mock(Parameters.class); @@ -132,6 +202,7 @@ public class FileplanComponentChildrenRelationUnitTest extends BaseUnitTest verify(mockedRMNodes, times(1)).upload(parentNodeRef.getId(), mockedFormData, mockedParameters); } + @Test public void testUploadOnRMSite() throws Exception { Parameters mockedParameters = mock(Parameters.class); @@ -139,7 +210,7 @@ public class FileplanComponentChildrenRelationUnitTest extends BaseUnitTest FormData mockedFormData = mock(FormData.class); WithResponse mockedWithResponse = mock(WithResponse.class); - when(mockedRMNodes.isRMSite(parentNodeRef.getId())).thenReturn(true); + Mockito.doThrow(new PermissionDeniedException("POST request not allowed in RM site.")).when(mockedRMNodes).checkPostPermission(parentNodeRef.getId()); try { filePlanComponentChildrenRelation.create(parentNodeRef.getId(), mockedFormData, mockedParameters, mockedWithResponse); @@ -151,4 +222,67 @@ public class FileplanComponentChildrenRelationUnitTest extends BaseUnitTest } verify(mockedRMNodes, never()).upload(parentNodeRef.getId(), mockedFormData, mockedParameters); } + + @Test + public void testUploadOnTransferContainer() throws Exception + { + Parameters mockedParameters = mock(Parameters.class); + NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); + FormData mockedFormData = mock(FormData.class); + WithResponse mockedWithResponse = mock(WithResponse.class); + + Mockito.doThrow(new PermissionDeniedException("POST request not allowed in Transfer Container.")).when(mockedRMNodes).checkPostPermission(parentNodeRef.getId()); + try + { + filePlanComponentChildrenRelation.create(parentNodeRef.getId(), mockedFormData, mockedParameters, mockedWithResponse); + fail("Expected ecxeption as POST request is not allowed in Transfer Container."); + } + catch(PermissionDeniedException ex) + { + assertEquals("POST request not allowed in Transfer Container.", ex.getMsgId()); + } + verify(mockedRMNodes, never()).upload(parentNodeRef.getId(), mockedFormData, mockedParameters); + } + + @Test + public void testUploadOnHoldFolder() throws Exception + { + Parameters mockedParameters = mock(Parameters.class); + NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); + FormData mockedFormData = mock(FormData.class); + WithResponse mockedWithResponse = mock(WithResponse.class); + + Mockito.doThrow(new PermissionDeniedException("POST request not allowed in Hold Folder.")).when(mockedRMNodes).checkPostPermission(parentNodeRef.getId()); + try + { + filePlanComponentChildrenRelation.create(parentNodeRef.getId(), mockedFormData, mockedParameters, mockedWithResponse); + fail("Expected ecxeption as POST request is not allowed in Hold Folder."); + } + catch(PermissionDeniedException ex) + { + assertEquals("POST request not allowed in Hold Folder.", ex.getMsgId()); + } + verify(mockedRMNodes, never()).upload(parentNodeRef.getId(), mockedFormData, mockedParameters); + } + + @Test + public void testUploadOnTransferFolder() throws Exception + { + Parameters mockedParameters = mock(Parameters.class); + NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); + FormData mockedFormData = mock(FormData.class); + WithResponse mockedWithResponse = mock(WithResponse.class); + + Mockito.doThrow(new PermissionDeniedException("POST request not allowed in Transfer Folder.")).when(mockedRMNodes).checkPostPermission(parentNodeRef.getId()); + try + { + filePlanComponentChildrenRelation.create(parentNodeRef.getId(), mockedFormData, mockedParameters, mockedWithResponse); + fail("Expected ecxeption as POST request is not allowed in Transfer Folder."); + } + catch(PermissionDeniedException ex) + { + assertEquals("POST request not allowed in Transfer Folder.", ex.getMsgId()); + } + verify(mockedRMNodes, never()).upload(parentNodeRef.getId(), mockedFormData, mockedParameters); + } } From fce705ff72b5d5791e749c29a191c2dedfdf9de6 Mon Sep 17 00:00:00 2001 From: Silviu Dinuta Date: Tue, 8 Nov 2016 17:26:07 +0200 Subject: [PATCH 07/23] RM-4326: allow creation in transfer container only from TransferServiceImpl --- .../rm-service-context.xml | 45 ++++++++++--------- .../model/rma/type/TransferContainerType.java | 33 +++++++++++--- .../transfer/TransferServiceImpl.java | 31 ++++++++++--- .../rm/rest/api/impl/RMNodesImpl.java | 4 -- .../type/TransferContainerTypeUnitTest.java | 18 -------- .../rm/rest/api/impl/RMNodesImplUnitTest.java | 16 ------- ...planComponentChildrenRelationUnitTest.java | 44 ------------------ 7 files changed, 73 insertions(+), 118 deletions(-) diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml index 97f6a97480..d41b69d8f0 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml @@ -161,6 +161,7 @@ + @@ -373,10 +374,10 @@ - + - @@ -566,9 +567,9 @@ parent="baseService"> - - - + + + @@ -1060,8 +1061,8 @@ - - + + @@ -1522,20 +1523,20 @@ 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 07a2d3fe9c..15a2320bd0 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 @@ -26,8 +26,7 @@ */ package org.alfresco.module.org_alfresco_module_rm.model.rma.type; -import java.util.Arrays; -import java.util.List; +import java.security.InvalidParameterException; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; @@ -38,7 +37,6 @@ import org.alfresco.repo.policy.annotation.BehaviourBean; import org.alfresco.repo.policy.annotation.BehaviourKind; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.service.namespace.QName; import org.springframework.extensions.surf.util.I18NUtil; /** @@ -52,7 +50,25 @@ public class TransferContainerType extends BaseBehaviourBean implements NodeServicePolicies.OnCreateChildAssociationPolicy, NodeServicePolicies.OnCreateNodePolicy { 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_TRANSFER); + private static final String BEHAVIOUR_NAME = "onCreateChildAssocsForTransferContainer"; + + /** + * 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(); + } /** * On every event @@ -61,11 +77,14 @@ public class TransferContainerType extends BaseBehaviourBean * boolean) */ @Override - @Behaviour(kind = BehaviourKind.ASSOCIATION) + @Behaviour + ( + kind = BehaviourKind.ASSOCIATION, + name = BEHAVIOUR_NAME + ) public void onCreateChildAssociation(ChildAssociationRef childAssocRef, boolean bNew) { - // check the created child is of an accepted type - validateNewChildAssociationSubTypesIncluded(childAssocRef.getChildRef(), ACCEPTED_NON_UNIQUE_CHILD_TYPES); + throw new InvalidParameterException("Operation failed. Creation is not allowed in Transfer Container"); } @Override diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/transfer/TransferServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/transfer/TransferServiceImpl.java index 8bc00da79d..89b1227eef 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/transfer/TransferServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/transfer/TransferServiceImpl.java @@ -41,6 +41,7 @@ import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; import org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; +import org.alfresco.module.org_alfresco_module_rm.model.rma.type.TransferContainerType; import org.alfresco.module.org_alfresco_module_rm.record.RecordService; import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService; import org.alfresco.module.org_alfresco_module_rm.util.ServiceBaseImpl; @@ -87,6 +88,8 @@ public class TransferServiceImpl extends ServiceBaseImpl /** Freeze Service */ protected FreezeService freezeService; + protected TransferContainerType transferContainerType; + /** * @param filePlanService file plan service */ @@ -127,6 +130,11 @@ public class TransferServiceImpl extends ServiceBaseImpl this.freezeService = freezeService; } + public void setTransferContainerType(TransferContainerType transferContainerType) + { + this.transferContainerType = transferContainerType; + } + /** * @see org.alfresco.module.org_alfresco_module_rm.transfer.TransferService#transfer(NodeRef, boolean) */ @@ -164,12 +172,21 @@ public class TransferServiceImpl extends ServiceBaseImpl } NodeRef transferContainer = filePlanService.getTransferContainer(root); - transferNodeRef = nodeService.createNode(transferContainer, - ContentModel.ASSOC_CONTAINS, - QName.createQName(RM_URI, transferName), - TYPE_TRANSFER, - transferProps).getChildRef(); + transferContainerType.disable(); + try + { + transferNodeRef = nodeService.createNode(transferContainer, + ContentModel.ASSOC_CONTAINS, + QName.createQName(RM_URI, transferName), + TYPE_TRANSFER, + transferProps).getChildRef(); + + } + finally + { + transferContainerType.enable(); + } // Bind the hold node reference to the transaction AlfrescoTransactionSupport.bindResource(KEY_TRANSFER_NODEREF, transferNodeRef); } @@ -253,12 +270,12 @@ public class TransferServiceImpl extends ServiceBaseImpl { throw new AlfrescoRuntimeException("Could not complete a transfer that contains held folders"); } - + if(freezeService.hasFrozenChildren(assoc.getChildRef())) { throw new AlfrescoRuntimeException("Cound not complete a transfer that contains folders with held children"); } - + markComplete(assoc.getChildRef(), accessionIndicator, transferLocation); } 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 6c6dca808b..94effa0345 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 @@ -413,10 +413,6 @@ public class RMNodesImpl extends NodesImpl implements RMNodes { throw new PermissionDeniedException("POST request not allowed in Transfer Folder."); } - else if(RecordsManagementModel.TYPE_TRANSFER_CONTAINER.equals(parentNodeRefType)) - { - throw new PermissionDeniedException("POST request not allowed in Transfer Container."); - } else if(RecordsManagementModel.TYPE_HOLD.equals(parentNodeRefType)) { throw new PermissionDeniedException("POST request not allowed in Hold Folder."); diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/TransferContainerTypeUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/TransferContainerTypeUnitTest.java index 2e3a3135b1..5e622ecc93 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/TransferContainerTypeUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/TransferContainerTypeUnitTest.java @@ -68,22 +68,4 @@ public class TransferContainerTypeUnitTest extends BaseUnitTest when(mockedChildAssoc.getParentRef()).thenReturn(transferContainer); transferContainerType.onCreateChildAssociation(mockedChildAssoc, true); } - - /** - * Given that we try to add "rma:transfer" type to transfer container, - * Then the operation is successful. - */ - @Test - public void testAddTransferFolderToTransferContainer() - { - QName type = AlfMock.generateQName(); - when(mockedDictionaryService.isSubClass(type, TYPE_TRANSFER)).thenReturn(true); - NodeRef transferFolder= AlfMock.generateNodeRef(mockedNodeService, type); - - NodeRef transferContainer = generateNodeRef(TYPE_TRANSFER_CONTAINER, true); - ChildAssociationRef mockedChildAssoc = mock(ChildAssociationRef.class); - when(mockedChildAssoc.getChildRef()).thenReturn(transferFolder); - when(mockedChildAssoc.getParentRef()).thenReturn(transferContainer); - transferContainerType.onCreateChildAssociation(mockedChildAssoc, true); - } } 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 4107b81759..47042d1d5f 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 @@ -755,22 +755,6 @@ public class RMNodesImplUnitTest extends BaseUnitTest rmNodesImpl.checkPostPermission(parentNodeRef.getId()); } - @Test - public void testCheckPostPermissionForTransferContainer() throws Exception - { - NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); - when(mockedNodeService.getType(parentNodeRef)).thenReturn(RecordsManagementModel.TYPE_TRANSFER_CONTAINER); - try - { - rmNodesImpl.checkPostPermission(parentNodeRef.getId()); - fail("Expected ecxeption as post should not be permitted on the Transfer Container"); - } - catch(PermissionDeniedException ex) - { - assertEquals("POST request not allowed in Transfer Container.", ex.getMsgId()); - } - } - @Test public void testCheckPostPermissionForTransferFolder() throws Exception { diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelationUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelationUnitTest.java index a27fa04a78..a5bca8b366 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelationUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelationUnitTest.java @@ -122,29 +122,6 @@ public class FileplanComponentChildrenRelationUnitTest extends BaseUnitTest verify(mockedRMNodes, never()).createNode(parentNodeRef.getId(), nodeInfos.get(0), mockedParameters); } - @Test - public void testCreateOnTransferContainer() throws Exception - { - Parameters mockedParameters = mock(Parameters.class); - NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); - - List nodeInfos = new ArrayList(); - Node mokedNodeInfo = mock(Node.class); - nodeInfos.add(mokedNodeInfo); - - Mockito.doThrow(new PermissionDeniedException("POST request not allowed in Transfer Container.")).when(mockedRMNodes).checkPostPermission(parentNodeRef.getId()); - try - { - filePlanComponentChildrenRelation.create(parentNodeRef.getId(), nodeInfos, mockedParameters); - fail("Expected ecxeption as POST request is not allowed in Transfer Container."); - } - catch(PermissionDeniedException ex) - { - assertEquals("POST request not allowed in Transfer Container.", ex.getMsgId()); - } - verify(mockedRMNodes, never()).createNode(parentNodeRef.getId(), nodeInfos.get(0), mockedParameters); - } - @Test public void testCreateOnHoldFolder() throws Exception { @@ -223,27 +200,6 @@ public class FileplanComponentChildrenRelationUnitTest extends BaseUnitTest verify(mockedRMNodes, never()).upload(parentNodeRef.getId(), mockedFormData, mockedParameters); } - @Test - public void testUploadOnTransferContainer() throws Exception - { - Parameters mockedParameters = mock(Parameters.class); - NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); - FormData mockedFormData = mock(FormData.class); - WithResponse mockedWithResponse = mock(WithResponse.class); - - Mockito.doThrow(new PermissionDeniedException("POST request not allowed in Transfer Container.")).when(mockedRMNodes).checkPostPermission(parentNodeRef.getId()); - try - { - filePlanComponentChildrenRelation.create(parentNodeRef.getId(), mockedFormData, mockedParameters, mockedWithResponse); - fail("Expected ecxeption as POST request is not allowed in Transfer Container."); - } - catch(PermissionDeniedException ex) - { - assertEquals("POST request not allowed in Transfer Container.", ex.getMsgId()); - } - verify(mockedRMNodes, never()).upload(parentNodeRef.getId(), mockedFormData, mockedParameters); - } - @Test public void testUploadOnHoldFolder() throws Exception { From c7f1fcafc818f1a919158e44958d2a48a762ac13 Mon Sep 17 00:00:00 2001 From: Silviu Dinuta Date: Tue, 8 Nov 2016 17:36:21 +0200 Subject: [PATCH 08/23] RM-4326: undo some formatting --- .../rm-service-context.xml | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml index d41b69d8f0..e875aba1e5 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml @@ -374,10 +374,10 @@ - + - @@ -567,9 +567,9 @@ parent="baseService"> - - - + + + @@ -1061,8 +1061,8 @@ - - + + @@ -1523,20 +1523,20 @@ From 517e3286b227f1bd75fce28a420e11624f39d6bf Mon Sep 17 00:00:00 2001 From: Silviu Dinuta Date: Tue, 8 Nov 2016 17:42:06 +0200 Subject: [PATCH 09/23] RM-4326: adjusted unit test name for transferContainerType --- .../model/rma/type/TransferContainerTypeUnitTest.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/TransferContainerTypeUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/TransferContainerTypeUnitTest.java index 5e622ecc93..1623164f25 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/TransferContainerTypeUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/TransferContainerTypeUnitTest.java @@ -51,16 +51,15 @@ public class TransferContainerTypeUnitTest extends BaseUnitTest private @InjectMocks TransferContainerType transferContainerType; /** - * Given that we try to add a non "rma:transfer" type to transfer container, + * Given that we try to add to transfer container, * Then InvalidParameterException is thrown. */ @Test(expected = InvalidParameterException.class) - public void testAddNonTransferTypeToTransferContainerTest() + public void testAddToTransferContainerTest() { NodeRef transferContainer = generateNodeRef(TYPE_TRANSFER_CONTAINER, true); QName type = AlfMock.generateQName(); - when(mockedDictionaryService.isSubClass(type, TYPE_TRANSFER)).thenReturn(false); NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService, type); ChildAssociationRef mockedChildAssoc = mock(ChildAssociationRef.class); From 0836e9682b15422c2a5ae034da7d8a1de7ce4675 Mon Sep 17 00:00:00 2001 From: Silviu Dinuta Date: Tue, 8 Nov 2016 18:38:35 +0200 Subject: [PATCH 10/23] RM-4326: allow creation in transfer only from TransferServiceImpl --- .../rm-model-context.xml | 2 + .../rm-service-context.xml | 5 ++- .../transfer/TransferServiceImpl.java | 24 ++++++++-- .../rm/rest/api/impl/RMNodesImpl.java | 6 +-- .../rm/rest/api/impl/RMNodesImplUnitTest.java | 16 ------- ...planComponentChildrenRelationUnitTest.java | 44 ------------------- 6 files changed, 26 insertions(+), 71 deletions(-) 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 16dd447fe6..fe6cedfd6d 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 @@ -84,6 +84,8 @@ + + diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml index e875aba1e5..ca3985d07f 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml @@ -162,6 +162,7 @@ + @@ -1061,8 +1062,8 @@ - - + + diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/transfer/TransferServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/transfer/TransferServiceImpl.java index 89b1227eef..be3775462f 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/transfer/TransferServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/transfer/TransferServiceImpl.java @@ -42,6 +42,7 @@ import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; import org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; import org.alfresco.module.org_alfresco_module_rm.model.rma.type.TransferContainerType; +import org.alfresco.module.org_alfresco_module_rm.model.rma.type.TransferType; import org.alfresco.module.org_alfresco_module_rm.record.RecordService; import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService; import org.alfresco.module.org_alfresco_module_rm.util.ServiceBaseImpl; @@ -90,6 +91,8 @@ public class TransferServiceImpl extends ServiceBaseImpl protected TransferContainerType transferContainerType; + protected TransferType transferType; + /** * @param filePlanService file plan service */ @@ -135,6 +138,11 @@ public class TransferServiceImpl extends ServiceBaseImpl this.transferContainerType = transferContainerType; } + public void setTransferType(TransferType transferType) + { + this.transferType = transferType; + } + /** * @see org.alfresco.module.org_alfresco_module_rm.transfer.TransferService#transfer(NodeRef, boolean) */ @@ -205,10 +213,18 @@ public class TransferServiceImpl extends ServiceBaseImpl } // Link the record to the trasnfer object - nodeService.addChild(transferNodeRef, - nodeRef, - ASSOC_TRANSFERRED, - ASSOC_TRANSFERRED); + transferType.disable(); + try + { + nodeService.addChild(transferNodeRef, + nodeRef, + ASSOC_TRANSFERRED, + ASSOC_TRANSFERRED); + } + finally + { + transferType.enable(); + } // Set PDF indicator flag setPDFIndicationFlag(transferNodeRef, nodeRef); 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 94effa0345..198c75afab 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 @@ -409,11 +409,7 @@ public class RMNodesImpl extends NodesImpl implements RMNodes NodeRef parentNodeRef = validateOrLookupNode(nodeId, null); QName parentNodeRefType = nodeService.getType(parentNodeRef); - if(RecordsManagementModel.TYPE_TRANSFER.equals(parentNodeRefType)) - { - throw new PermissionDeniedException("POST request not allowed in Transfer Folder."); - } - else if(RecordsManagementModel.TYPE_HOLD.equals(parentNodeRefType)) + if(RecordsManagementModel.TYPE_HOLD.equals(parentNodeRefType)) { throw new PermissionDeniedException("POST request not allowed in Hold Folder."); } 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 47042d1d5f..21c0ab62f5 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 @@ -755,22 +755,6 @@ public class RMNodesImplUnitTest extends BaseUnitTest rmNodesImpl.checkPostPermission(parentNodeRef.getId()); } - @Test - public void testCheckPostPermissionForTransferFolder() throws Exception - { - NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); - when(mockedNodeService.getType(parentNodeRef)).thenReturn(RecordsManagementModel.TYPE_TRANSFER); - try - { - rmNodesImpl.checkPostPermission(parentNodeRef.getId()); - fail("Expected ecxeption as post should not be permitted on the Transfer Folder"); - } - catch(PermissionDeniedException ex) - { - assertEquals("POST request not allowed in Transfer Folder.", ex.getMsgId()); - } - } - @Test public void testCheckPostPermissionForHoldFolder() throws Exception { diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelationUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelationUnitTest.java index a5bca8b366..df7e599d01 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelationUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelationUnitTest.java @@ -145,29 +145,6 @@ public class FileplanComponentChildrenRelationUnitTest extends BaseUnitTest verify(mockedRMNodes, never()).createNode(parentNodeRef.getId(), nodeInfos.get(0), mockedParameters); } - @Test - public void testCreateOnTransferFolder() throws Exception - { - Parameters mockedParameters = mock(Parameters.class); - NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); - - List nodeInfos = new ArrayList(); - Node mokedNodeInfo = mock(Node.class); - nodeInfos.add(mokedNodeInfo); - - Mockito.doThrow(new PermissionDeniedException("POST request not allowed in Transfer Folder.")).when(mockedRMNodes).checkPostPermission(parentNodeRef.getId()); - try - { - filePlanComponentChildrenRelation.create(parentNodeRef.getId(), nodeInfos, mockedParameters); - fail("Expected ecxeption as POST request is not allowed in Transfer Folder."); - } - catch(PermissionDeniedException ex) - { - assertEquals("POST request not allowed in Transfer Folder.", ex.getMsgId()); - } - verify(mockedRMNodes, never()).createNode(parentNodeRef.getId(), nodeInfos.get(0), mockedParameters); - } - @Test public void testUpload() throws Exception { @@ -220,25 +197,4 @@ public class FileplanComponentChildrenRelationUnitTest extends BaseUnitTest } verify(mockedRMNodes, never()).upload(parentNodeRef.getId(), mockedFormData, mockedParameters); } - - @Test - public void testUploadOnTransferFolder() throws Exception - { - Parameters mockedParameters = mock(Parameters.class); - NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); - FormData mockedFormData = mock(FormData.class); - WithResponse mockedWithResponse = mock(WithResponse.class); - - Mockito.doThrow(new PermissionDeniedException("POST request not allowed in Transfer Folder.")).when(mockedRMNodes).checkPostPermission(parentNodeRef.getId()); - try - { - filePlanComponentChildrenRelation.create(parentNodeRef.getId(), mockedFormData, mockedParameters, mockedWithResponse); - fail("Expected ecxeption as POST request is not allowed in Transfer Folder."); - } - catch(PermissionDeniedException ex) - { - assertEquals("POST request not allowed in Transfer Folder.", ex.getMsgId()); - } - verify(mockedRMNodes, never()).upload(parentNodeRef.getId(), mockedFormData, mockedParameters); - } } From 6d1fa3408e3c531ea0306376ea57bd89626ea8cb Mon Sep 17 00:00:00 2001 From: Silviu Dinuta Date: Tue, 8 Nov 2016 18:41:15 +0200 Subject: [PATCH 11/23] RM-4326: allow creation in transfer only from TransferServiceImpl --- .../model/rma/type/TransferType.java | 78 +++++++++++++++++++ .../model/rma/type/TransferTypeUnitTest.java | 71 +++++++++++++++++ 2 files changed, 149 insertions(+) create mode 100644 rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/TransferType.java create mode 100644 rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/TransferTypeUnitTest.java diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/TransferType.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/TransferType.java new file mode 100644 index 0000000000..0e0cd87dc9 --- /dev/null +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/TransferType.java @@ -0,0 +1,78 @@ +/* + * #%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.model.rma.type; + +import java.security.InvalidParameterException; + +import org.alfresco.module.org_alfresco_module_rm.model.BaseBehaviourBean; +import org.alfresco.repo.node.NodeServicePolicies; +import org.alfresco.repo.policy.annotation.Behaviour; +import org.alfresco.repo.policy.annotation.BehaviourBean; +import org.alfresco.repo.policy.annotation.BehaviourKind; +import org.alfresco.service.cmr.repository.ChildAssociationRef; + +/** + * rma:transfer behaviour bean + * + * @author Silviu Dinuta + * @since 2.6 + */ +@BehaviourBean(defaultType = "rma:transfer") +public class TransferType extends BaseBehaviourBean implements NodeServicePolicies.OnCreateChildAssociationPolicy +{ + private static final String BEHAVIOUR_NAME = "onCreateChildAssocsForTransferType"; + + /** + * 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, + name = BEHAVIOUR_NAME + ) + public void onCreateChildAssociation(ChildAssociationRef childAssocRef, boolean isNewNode) + { + throw new InvalidParameterException("Operation failed. Creation is not allowed in Transfer Folders"); + } +} diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/TransferTypeUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/TransferTypeUnitTest.java new file mode 100644 index 0000000000..d16b49759a --- /dev/null +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/TransferTypeUnitTest.java @@ -0,0 +1,71 @@ +/* + * #%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.model.rma.type; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.security.InvalidParameterException; + +import org.alfresco.module.org_alfresco_module_rm.test.util.AlfMock; +import org.alfresco.module.org_alfresco_module_rm.test.util.BaseUnitTest; +import org.alfresco.service.cmr.repository.ChildAssociationRef; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.namespace.QName; +import org.junit.Test; +import org.mockito.InjectMocks; + +/** + * Unit test for TransferType + * + * @author Silviu Dinuta + * @since 2.6 + */ +public class TransferTypeUnitTest extends BaseUnitTest +{ + /** test object */ + private @InjectMocks TransferType transferType; + + /** + * Given that we try to add to transfer type folder, + * Then InvalidParameterException is thrown. + */ + @Test(expected = InvalidParameterException.class) + public void testAddToTransferFolderTest() + { + NodeRef transferFolder = generateNodeRef(TYPE_TRANSFER, true); + + QName type = AlfMock.generateQName(); + NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService, type); + + ChildAssociationRef mockedChildAssoc = mock(ChildAssociationRef.class); + when(mockedChildAssoc.getChildRef()).thenReturn(nodeRef); + when(mockedChildAssoc.getParentRef()).thenReturn(transferFolder); + transferType.onCreateChildAssociation(mockedChildAssoc, true); + } +} From 9a2e543c009cb91c1cf3409207f8d1ef9ff7367c Mon Sep 17 00:00:00 2001 From: Silviu Dinuta Date: Tue, 8 Nov 2016 18:44:42 +0200 Subject: [PATCH 12/23] RM-4326: undo some formatting --- .../module/org_alfresco_module_rm/rm-service-context.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml index ca3985d07f..7d4b163dc7 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml @@ -1062,8 +1062,8 @@ - - + + From 03174c61c4c1797e4777c18054bbd8198a7e0331 Mon Sep 17 00:00:00 2001 From: Silviu Dinuta Date: Tue, 8 Nov 2016 20:40:51 +0200 Subject: [PATCH 13/23] RM-4326: allow creation under hold type only from HoldServiceImpl --- .../rm-model-context.xml | 2 + .../rm-service-context.xml | 5 +- .../hold/HoldServiceImpl.java | 18 ++++- .../model/rma/type/HoldType.java | 79 +++++++++++++++++++ .../rm/rest/api/impl/RMNodesImpl.java | 18 ++--- .../FileplanComponentChildrenRelation.java | 1 - .../hold/HoldServiceImplUnitTest.java | 5 ++ .../model/rma/type/HoldTypeUnitTest.java | 72 +++++++++++++++++ .../rm/rest/api/impl/RMNodesImplUnitTest.java | 16 ---- ...planComponentChildrenRelationUnitTest.java | 44 ----------- 10 files changed, 183 insertions(+), 77 deletions(-) create mode 100644 rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/HoldType.java create mode 100644 rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/HoldTypeUnitTest.java 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..9cfd1a90ae 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 @@ -86,6 +86,8 @@ + + diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml index 7d4b163dc7..d2ea0c746e 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml @@ -1062,8 +1062,8 @@ - - + + @@ -1499,6 +1499,7 @@ + . + * #L% + */ + +package org.alfresco.module.org_alfresco_module_rm.model.rma.type; + +import java.security.InvalidParameterException; + +import org.alfresco.module.org_alfresco_module_rm.model.BaseBehaviourBean; +import org.alfresco.repo.node.NodeServicePolicies; +import org.alfresco.repo.policy.annotation.Behaviour; +import org.alfresco.repo.policy.annotation.BehaviourBean; +import org.alfresco.repo.policy.annotation.BehaviourKind; +import org.alfresco.service.cmr.repository.ChildAssociationRef; + +/** + * rma:transferContainer behaviour bean + * + * @author Silviu Dinuta + * @since 2.6 + */ +@BehaviourBean(defaultType = "rma:hold") +public class HoldType extends BaseBehaviourBean implements NodeServicePolicies.OnCreateChildAssociationPolicy +{ + private static final String BEHAVIOUR_NAME = "onCreateChildAssocsForHoldType"; + + /** + * 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, + name = BEHAVIOUR_NAME + ) + public void onCreateChildAssociation(ChildAssociationRef childAssocRef, boolean isNewNode) + { + throw new InvalidParameterException("Operation failed. Creation is not allowed in Hold Folders"); + } + +} 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 198c75afab..b2cb97d3a0 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 @@ -407,22 +407,14 @@ public class RMNodesImpl extends NodesImpl implements RMNodes public void checkPostPermission(String nodeId) { NodeRef parentNodeRef = validateOrLookupNode(nodeId, null); - QName parentNodeRefType = nodeService.getType(parentNodeRef); - if(RecordsManagementModel.TYPE_HOLD.equals(parentNodeRefType)) + SiteInfo siteInfo = siteService.getSite(FilePlanService.DEFAULT_RM_SITE_ID); + if(siteInfo !=null) { - throw new PermissionDeniedException("POST request not allowed in Hold Folder."); - } - else - { - SiteInfo siteInfo = siteService.getSite(FilePlanService.DEFAULT_RM_SITE_ID); - if(siteInfo !=null) + NodeRef rmNodeRef = siteInfo.getNodeRef(); + if(rmNodeRef.equals(parentNodeRef)) { - NodeRef rmNodeRef = siteInfo.getNodeRef(); - if(rmNodeRef.equals(parentNodeRef)) - { - throw new PermissionDeniedException("POST request not allowed in RM site."); - } + throw new PermissionDeniedException("POST request not allowed in RM site."); } } } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelation.java b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelation.java index eca43b2f5f..2ff63ba601 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelation.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelation.java @@ -31,7 +31,6 @@ import java.util.ArrayList; import java.util.List; import org.alfresco.rest.api.model.Node; -import org.alfresco.rest.framework.core.exceptions.PermissionDeniedException; import org.alfresco.rest.framework.resource.RelationshipResource; import org.alfresco.rest.framework.resource.actions.interfaces.MultiPartRelationshipResourceAction; import org.alfresco.rest.framework.resource.actions.interfaces.RelationshipResourceAction; diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java index 169a6bc694..cc4bf8c36c 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java @@ -51,6 +51,7 @@ import java.util.Map; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; +import org.alfresco.module.org_alfresco_module_rm.model.rma.type.HoldType; import org.alfresco.module.org_alfresco_module_rm.test.util.BaseUnitTest; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; @@ -61,6 +62,7 @@ import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; +import org.mockito.Mock; import org.mockito.Spy; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; @@ -82,6 +84,9 @@ public class HoldServiceImplUnitTest extends BaseUnitTest protected NodeRef hold; protected NodeRef hold2; + @Mock + private HoldType mockedHoldType; + @Spy @InjectMocks HoldServiceImpl holdService; @Before diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/HoldTypeUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/HoldTypeUnitTest.java new file mode 100644 index 0000000000..339bb290d9 --- /dev/null +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/HoldTypeUnitTest.java @@ -0,0 +1,72 @@ +/* + * #%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.model.rma.type; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.security.InvalidParameterException; + +import org.alfresco.module.org_alfresco_module_rm.test.util.AlfMock; +import org.alfresco.module.org_alfresco_module_rm.test.util.BaseUnitTest; +import org.alfresco.service.cmr.repository.ChildAssociationRef; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.namespace.QName; +import org.junit.Test; +import org.mockito.InjectMocks; + +/** + * Unit test for HoldType + * + * @author Silviu Dinuta + * @since 2.6 + * + */ +public class HoldTypeUnitTest extends BaseUnitTest +{ + /** test object */ + private @InjectMocks HoldType holdType; + + /** + * Given that we try to add to hold folder, + * Then InvalidParameterException is thrown. + */ + @Test(expected = InvalidParameterException.class) + public void testAddToHoldFolderTest() + { + NodeRef holdFolder = generateNodeRef(TYPE_HOLD, true); + + QName type = AlfMock.generateQName(); + NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService, type); + + ChildAssociationRef mockedChildAssoc = mock(ChildAssociationRef.class); + when(mockedChildAssoc.getChildRef()).thenReturn(nodeRef); + when(mockedChildAssoc.getParentRef()).thenReturn(holdFolder); + holdType.onCreateChildAssociation(mockedChildAssoc, true); + } +} 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 21c0ab62f5..166af4c5bb 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 @@ -755,22 +755,6 @@ public class RMNodesImplUnitTest extends BaseUnitTest rmNodesImpl.checkPostPermission(parentNodeRef.getId()); } - @Test - public void testCheckPostPermissionForHoldFolder() throws Exception - { - NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); - when(mockedNodeService.getType(parentNodeRef)).thenReturn(RecordsManagementModel.TYPE_HOLD); - try - { - rmNodesImpl.checkPostPermission(parentNodeRef.getId()); - fail("Expected ecxeption as post should not be permitted on the Hold Folder"); - } - catch(PermissionDeniedException ex) - { - assertEquals("POST request not allowed in Hold Folder.", ex.getMsgId()); - } - } - @Test public void testCheckPostPermission() throws Exception { diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelationUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelationUnitTest.java index df7e599d01..f16cc01103 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelationUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelationUnitTest.java @@ -122,29 +122,6 @@ public class FileplanComponentChildrenRelationUnitTest extends BaseUnitTest verify(mockedRMNodes, never()).createNode(parentNodeRef.getId(), nodeInfos.get(0), mockedParameters); } - @Test - public void testCreateOnHoldFolder() throws Exception - { - Parameters mockedParameters = mock(Parameters.class); - NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); - - List nodeInfos = new ArrayList(); - Node mokedNodeInfo = mock(Node.class); - nodeInfos.add(mokedNodeInfo); - - Mockito.doThrow(new PermissionDeniedException("POST request not allowed in Hold Folder.")).when(mockedRMNodes).checkPostPermission(parentNodeRef.getId()); - try - { - filePlanComponentChildrenRelation.create(parentNodeRef.getId(), nodeInfos, mockedParameters); - fail("Expected ecxeption as POST request is not allowed in Hold Folder."); - } - catch(PermissionDeniedException ex) - { - assertEquals("POST request not allowed in Hold Folder.", ex.getMsgId()); - } - verify(mockedRMNodes, never()).createNode(parentNodeRef.getId(), nodeInfos.get(0), mockedParameters); - } - @Test public void testUpload() throws Exception { @@ -176,25 +153,4 @@ public class FileplanComponentChildrenRelationUnitTest extends BaseUnitTest } verify(mockedRMNodes, never()).upload(parentNodeRef.getId(), mockedFormData, mockedParameters); } - - @Test - public void testUploadOnHoldFolder() throws Exception - { - Parameters mockedParameters = mock(Parameters.class); - NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); - FormData mockedFormData = mock(FormData.class); - WithResponse mockedWithResponse = mock(WithResponse.class); - - Mockito.doThrow(new PermissionDeniedException("POST request not allowed in Hold Folder.")).when(mockedRMNodes).checkPostPermission(parentNodeRef.getId()); - try - { - filePlanComponentChildrenRelation.create(parentNodeRef.getId(), mockedFormData, mockedParameters, mockedWithResponse); - fail("Expected ecxeption as POST request is not allowed in Hold Folder."); - } - catch(PermissionDeniedException ex) - { - assertEquals("POST request not allowed in Hold Folder.", ex.getMsgId()); - } - verify(mockedRMNodes, never()).upload(parentNodeRef.getId(), mockedFormData, mockedParameters); - } } From 9782ff27575c04c09365cc8203890512fe7e7c0f Mon Sep 17 00:00:00 2001 From: Silviu Dinuta Date: Tue, 8 Nov 2016 20:47:10 +0200 Subject: [PATCH 14/23] RM-4326: undo some formatting --- .../module/org_alfresco_module_rm/rm-service-context.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml index d2ea0c746e..4f91d82304 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml @@ -1062,8 +1062,8 @@ - - + + From 7e06083595d754e4ec93ebd3ab3e9dbcc8ee1618 Mon Sep 17 00:00:00 2001 From: Silviu Dinuta Date: Wed, 9 Nov 2016 12:44:19 +0200 Subject: [PATCH 15/23] RM-4326: removed checkPostPermission method and changed RmSyteType to handle allowed created types --- .../rm-model-context.xml | 2 - .../rm-service-context.xml | 45 +++-- .../hold/HoldServiceImpl.java | 18 +- .../model/rma/type/HoldType.java | 79 -------- .../model/rma/type/RmSiteType.java | 179 +++++++++++------- .../org/alfresco/rm/rest/api/RMNodes.java | 7 - .../rm/rest/api/impl/RMNodesImpl.java | 20 -- .../FileplanComponentChildrenRelation.java | 2 - .../hold/HoldServiceImplUnitTest.java | 1 - .../model/rma/type/HoldTypeUnitTest.java | 72 ------- .../rm/rest/api/impl/RMNodesImplUnitTest.java | 40 ---- ...planComponentChildrenRelationUnitTest.java | 49 ----- 12 files changed, 136 insertions(+), 378 deletions(-) delete mode 100644 rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/HoldType.java delete mode 100644 rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/HoldTypeUnitTest.java 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 9cfd1a90ae..fe6cedfd6d 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 @@ -86,8 +86,6 @@ - - diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml index 4f91d82304..40c4434610 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml @@ -375,10 +375,10 @@ - + - @@ -568,9 +568,9 @@ parent="baseService"> - - - + + + @@ -1062,8 +1062,8 @@ - - + + @@ -1499,7 +1499,6 @@ - diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java index 34e1b014c1..5cd600edb7 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImpl.java @@ -44,7 +44,6 @@ import org.alfresco.module.org_alfresco_module_rm.audit.event.AuditEvent; import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel; import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; -import org.alfresco.module.org_alfresco_module_rm.model.rma.type.HoldType; import org.alfresco.module.org_alfresco_module_rm.record.RecordService; import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService; import org.alfresco.module.org_alfresco_module_rm.util.ServiceBaseImpl; @@ -103,8 +102,6 @@ public class HoldServiceImpl extends ServiceBaseImpl /** records management audit service */ private RecordsManagementAuditService recordsManagementAuditService; - private HoldType holdType; - /** * Set the file plan service * @@ -163,11 +160,6 @@ public class HoldServiceImpl extends ServiceBaseImpl this.recordsManagementAuditService = recordsManagementAuditService; } - public void setHoldType(HoldType holdType) - { - this.holdType = holdType; - } - /** * Initialise hold service */ @@ -602,15 +594,7 @@ public class HoldServiceImpl extends ServiceBaseImpl } // Link the record to the hold - holdType.disable(); - try - { - nodeService.addChild(hold, nodeRef, ASSOC_FROZEN_RECORDS, ASSOC_FROZEN_RECORDS); - } - finally - { - holdType.enable(); - } + nodeService.addChild(hold, nodeRef, ASSOC_FROZEN_RECORDS, ASSOC_FROZEN_RECORDS); // audit item being added to the hold recordsManagementAuditService.auditEvent(nodeRef, AUDIT_ADD_TO_HOLD); diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/HoldType.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/HoldType.java deleted file mode 100644 index f36db06383..0000000000 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/HoldType.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * #%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.model.rma.type; - -import java.security.InvalidParameterException; - -import org.alfresco.module.org_alfresco_module_rm.model.BaseBehaviourBean; -import org.alfresco.repo.node.NodeServicePolicies; -import org.alfresco.repo.policy.annotation.Behaviour; -import org.alfresco.repo.policy.annotation.BehaviourBean; -import org.alfresco.repo.policy.annotation.BehaviourKind; -import org.alfresco.service.cmr.repository.ChildAssociationRef; - -/** - * rma:transferContainer behaviour bean - * - * @author Silviu Dinuta - * @since 2.6 - */ -@BehaviourBean(defaultType = "rma:hold") -public class HoldType extends BaseBehaviourBean implements NodeServicePolicies.OnCreateChildAssociationPolicy -{ - private static final String BEHAVIOUR_NAME = "onCreateChildAssocsForHoldType"; - - /** - * 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, - name = BEHAVIOUR_NAME - ) - public void onCreateChildAssociation(ChildAssociationRef childAssocRef, boolean isNewNode) - { - throw new InvalidParameterException("Operation failed. Creation is not allowed in Hold Folders"); - } - -} 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 0a6c839818..9368c467d6 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 @@ -28,10 +28,14 @@ package org.alfresco.module.org_alfresco_module_rm.model.rma.type; import java.io.Serializable; +import java.security.InvalidParameterException; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.capability.CapabilityService; import org.alfresco.module.org_alfresco_module_rm.model.BaseBehaviourBean; import org.alfresco.module.org_alfresco_module_rm.search.RecordsManagementSearchService; @@ -55,6 +59,8 @@ import org.alfresco.service.namespace.QName; import org.alfresco.util.ParameterCheck; import org.alfresco.util.PropertyMap; +import com.google.common.collect.Sets; + /** * Behaviour associated with the RM Site type * @@ -68,10 +74,11 @@ import org.alfresco.util.PropertyMap; public class RmSiteType extends BaseBehaviourBean implements NodeServicePolicies.OnCreateNodePolicy, NodeServicePolicies.OnUpdatePropertiesPolicy, - NodeServicePolicies.BeforeDeleteNodePolicy + NodeServicePolicies.BeforeDeleteNodePolicy, + NodeServicePolicies.OnCreateChildAssociationPolicy { - /** Constant values */ - public static final String COMPONENT_DOCUMENT_LIBRARY = "documentLibrary"; + /** Constant values */ + public static final String COMPONENT_DOCUMENT_LIBRARY = "documentLibrary"; public static final String DEFAULT_SITE_NAME = "rm"; public static final QName DEFAULT_FILE_PLAN_TYPE = TYPE_FILE_PLAN; @@ -96,8 +103,8 @@ public class RmSiteType extends BaseBehaviourBean */ public void setSiteService(SiteService siteService) { - this.siteService = siteService; - } + this.siteService = siteService; + } /** * @param recordsManagementSearchService records management search service @@ -132,39 +139,39 @@ public class RmSiteType extends BaseBehaviourBean */ public void registerFilePlanType(QName siteType, QName filePlanType) { - ParameterCheck.mandatory("siteType", siteType); - ParameterCheck.mandatory("filePlanType", filePlanType); + ParameterCheck.mandatory("siteType", siteType); + ParameterCheck.mandatory("filePlanType", filePlanType); - // check that the registered site type is a subtype of rma:rmsite - if (!dictionaryService.isSubClass(siteType, TYPE_RM_SITE)) - { - throw new AlfrescoRuntimeException( - "Can't register site type, because site type is not a sub type of rma:rmsite (siteType=" + siteType.toString() + ")"); - } + // check that the registered site type is a subtype of rma:rmsite + if (!dictionaryService.isSubClass(siteType, TYPE_RM_SITE)) + { + throw new AlfrescoRuntimeException( + "Can't register site type, because site type is not a sub type of rma:rmsite (siteType=" + siteType.toString() + ")"); + } - // check that the registered file plan type is a sub type of rma:filePlan - if (!dictionaryService.isSubClass(filePlanType, TYPE_FILE_PLAN)) - { - throw new AlfrescoRuntimeException( - "Can't register file plan type, because site type is not a sub type of rma:filePlan (filePlanType=" + filePlanType.toString() + ")"); - } + // check that the registered file plan type is a sub type of rma:filePlan + if (!dictionaryService.isSubClass(filePlanType, TYPE_FILE_PLAN)) + { + throw new AlfrescoRuntimeException( + "Can't register file plan type, because site type is not a sub type of rma:filePlan (filePlanType=" + filePlanType.toString() + ")"); + } - // add site and file plan types to map - mapFilePlanType.put(siteType, filePlanType); + // add site and file plan types to map + mapFilePlanType.put(siteType, filePlanType); } /** * @see org.alfresco.repo.node.NodeServicePolicies.OnCreateNodePolicy#onCreateNode(org.alfresco.service.cmr.repository.ChildAssociationRef) */ - @Override - @Behaviour - ( - kind = BehaviourKind.CLASS, - notificationFrequency = NotificationFrequency.FIRST_EVENT - ) - public void onCreateNode(ChildAssociationRef childAssocRef) - { - final NodeRef rmSite = childAssocRef.getChildRef(); + @Override + @Behaviour + ( + kind = BehaviourKind.CLASS, + notificationFrequency = NotificationFrequency.FIRST_EVENT + ) + public void onCreateNode(ChildAssociationRef childAssocRef) + { + final NodeRef rmSite = childAssocRef.getChildRef(); // Do not execute behaviour if this has been created in the archive store if(rmSite.getStoreRef().equals(StoreRef.STORE_REF_ARCHIVE_SPACESSTORE)) @@ -179,52 +186,52 @@ public class RmSiteType extends BaseBehaviourBean { public Object doWork() { - SiteInfo siteInfo = siteService.getSite(rmSite); - if (siteInfo != null) - { - // Create the file plan component - siteService.createContainer(siteInfo.getShortName(), COMPONENT_DOCUMENT_LIBRARY, getFilePlanType(siteInfo), null); + SiteInfo siteInfo = siteService.getSite(rmSite); + if (siteInfo != null) + { + // Create the file plan component + siteService.createContainer(siteInfo.getShortName(), COMPONENT_DOCUMENT_LIBRARY, getFilePlanType(siteInfo), null); - // Add the reports - recordsManagementSearchService.addReports(siteInfo.getShortName()); - } + // Add the reports + recordsManagementSearchService.addReports(siteInfo.getShortName()); + } return null; } }, AuthenticationUtil.getAdminUserName()); } - } + } - /** - * Get the file plan type for the given site. - * - * @param siteInfo site info - * @return QName file plan type to create as a container - * @since 2.2 - */ - private QName getFilePlanType(SiteInfo siteInfo) - { - ParameterCheck.mandatory("siteInfo", siteInfo); + /** + * Get the file plan type for the given site. + * + * @param siteInfo site info + * @return QName file plan type to create as a container + * @since 2.2 + */ + private QName getFilePlanType(SiteInfo siteInfo) + { + ParameterCheck.mandatory("siteInfo", siteInfo); - // set default file plan - QName result = DEFAULT_FILE_PLAN_TYPE; + // set default file plan + QName result = DEFAULT_FILE_PLAN_TYPE; - // check to see if there is an 'override' for the file plan type given the site type - QName siteType = nodeService.getType(siteInfo.getNodeRef()); - if (mapFilePlanType.containsKey(siteType)) - { - result = mapFilePlanType.get(siteType); - } + // check to see if there is an 'override' for the file plan type given the site type + QName siteType = nodeService.getType(siteInfo.getNodeRef()); + if (mapFilePlanType.containsKey(siteType)) + { + result = mapFilePlanType.get(siteType); + } - return result; - } + return result; + } - /** - * Ensure that the visibility of a RM site can not be changed to anything but public. - * - * TODO support other site visibilities - * - * @see org.alfresco.repo.node.NodeServicePolicies.OnUpdatePropertiesPolicy#onUpdateProperties(org.alfresco.service.cmr.repository.NodeRef, java.util.Map, java.util.Map) - */ + /** + * Ensure that the visibility of a RM site can not be changed to anything but public. + * + * TODO support other site visibilities + * + * @see org.alfresco.repo.node.NodeServicePolicies.OnUpdatePropertiesPolicy#onUpdateProperties(org.alfresco.service.cmr.repository.NodeRef, java.util.Map, java.util.Map) + */ @Behaviour ( kind = BehaviourKind.CLASS, @@ -295,4 +302,44 @@ public class RmSiteType extends BaseBehaviourBean } } } + + /** + * @author Silviu Dinuta + * @since 2.6 + */ + @Override + @Behaviour(kind = BehaviourKind.ASSOCIATION) + public void onCreateChildAssociation(final ChildAssociationRef childAssocRef, boolean isNewNode) + { + AuthenticationUtil.runAsSystem(new RunAsWork() + { + @Override + public Void doWork() + { + final NodeRef child = childAssocRef.getChildRef(); + final NodeRef parent = childAssocRef.getParentRef(); + List acceptedUniqueChildTypes = new ArrayList(); + SiteInfo siteInfo = siteService.getSite(parent); + acceptedUniqueChildTypes.add(getFilePlanType(siteInfo)); + List acceptedNonUniqueChildTypes = new ArrayList(); + acceptedNonUniqueChildTypes.add(ContentModel.TYPE_FOLDER); + // check the created child is of an accepted type + validateNewChildAssociation(parent, child, acceptedUniqueChildTypes, acceptedNonUniqueChildTypes); + return null; + } + }); + } + + @Override + protected void validateNewChildAssociation(NodeRef parent, NodeRef child, List acceptedUniqueChildType, + List acceptedMultipleChildType) throws InvalidParameterException + { + super.validateNewChildAssociation(parent, child, acceptedUniqueChildType, acceptedMultipleChildType); + + // check the user is not trying to create more than 2 folders that are created by default + if(nodeService.getChildAssocs(parent, Sets.newHashSet(ContentModel.TYPE_FOLDER)).size() > 2) + { + throw new InvalidParameterException("Operation failed. Children of type " + ContentModel.TYPE_FOLDER + " are not allowed"); + } + } } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/RMNodes.java b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/RMNodes.java index c495eb0ebf..983f985e96 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/RMNodes.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/RMNodes.java @@ -45,11 +45,4 @@ public interface RMNodes extends Nodes public static String PARAM_INCLUDE_HAS_RETENTION_SCHEDULE = "hasRetentionSchedule"; public static String PARAM_INCLUDE_IS_CLOSED = "isClosed"; public static String PARAM_INCLUDE_IS_COMPLETED = "isCompleted"; - - /** - * Verifies if the post request is allowed for nodeId received as parameter. - * - * @param nodeId - */ - void checkPostPermission(String nodeId); } 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 b2cb97d3a0..b127e2fbe1 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 @@ -59,8 +59,6 @@ import org.alfresco.service.cmr.dictionary.DictionaryService; 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.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.alfresco.util.Pair; @@ -86,7 +84,6 @@ public class RMNodesImpl extends NodesImpl implements RMNodes private Repository repositoryHelper; private DictionaryService dictionaryService; private DispositionService dispositionService; - private SiteService siteService; /** * TODO to remove this after isSpecialNode is made protected in core implementation(REPO-1459) @@ -98,7 +95,6 @@ public class RMNodesImpl extends NodesImpl implements RMNodes this.nodeService = serviceRegistry.getNodeService(); this.dictionaryService = serviceRegistry.getDictionaryService(); this.dispositionService = serviceRegistry.getDispositionService(); - this.siteService = serviceRegistry.getSiteService(); } public void setRecordsManagementServiceRegistry(RecordsManagementServiceRegistry serviceRegistry) @@ -402,20 +398,4 @@ public class RMNodesImpl extends NodesImpl implements RMNodes } super.deleteNode(nodeId, parameters); } - - @Override - public void checkPostPermission(String nodeId) - { - NodeRef parentNodeRef = validateOrLookupNode(nodeId, null); - - SiteInfo siteInfo = siteService.getSite(FilePlanService.DEFAULT_RM_SITE_ID); - if(siteInfo !=null) - { - NodeRef rmNodeRef = siteInfo.getNodeRef(); - if(rmNodeRef.equals(parentNodeRef)) - { - throw new PermissionDeniedException("POST request not allowed in RM site."); - } - } - } } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelation.java b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelation.java index 2ff63ba601..9573442927 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelation.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelation.java @@ -67,7 +67,6 @@ public class FileplanComponentChildrenRelation implements RelationshipResourceAc @Override public List create(String parentFolderNodeId, List nodeInfos, Parameters parameters) { - nodes.checkPostPermission(parentFolderNodeId); List result = new ArrayList<>(nodeInfos.size()); for (Node nodeInfo : nodeInfos) @@ -81,7 +80,6 @@ public class FileplanComponentChildrenRelation implements RelationshipResourceAc @Override public Node create(String parentFolderNodeId, FormData formData, Parameters parameters, WithResponse withResponse) { - nodes.checkPostPermission(parentFolderNodeId); return nodes.upload(parentFolderNodeId, formData, parameters); } } diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java index cc4bf8c36c..0a82499e08 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java @@ -51,7 +51,6 @@ import java.util.Map; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; -import org.alfresco.module.org_alfresco_module_rm.model.rma.type.HoldType; import org.alfresco.module.org_alfresco_module_rm.test.util.BaseUnitTest; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/HoldTypeUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/HoldTypeUnitTest.java deleted file mode 100644 index 339bb290d9..0000000000 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/HoldTypeUnitTest.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * #%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.model.rma.type; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import java.security.InvalidParameterException; - -import org.alfresco.module.org_alfresco_module_rm.test.util.AlfMock; -import org.alfresco.module.org_alfresco_module_rm.test.util.BaseUnitTest; -import org.alfresco.service.cmr.repository.ChildAssociationRef; -import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.service.namespace.QName; -import org.junit.Test; -import org.mockito.InjectMocks; - -/** - * Unit test for HoldType - * - * @author Silviu Dinuta - * @since 2.6 - * - */ -public class HoldTypeUnitTest extends BaseUnitTest -{ - /** test object */ - private @InjectMocks HoldType holdType; - - /** - * Given that we try to add to hold folder, - * Then InvalidParameterException is thrown. - */ - @Test(expected = InvalidParameterException.class) - public void testAddToHoldFolderTest() - { - NodeRef holdFolder = generateNodeRef(TYPE_HOLD, true); - - QName type = AlfMock.generateQName(); - NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService, type); - - ChildAssociationRef mockedChildAssoc = mock(ChildAssociationRef.class); - when(mockedChildAssoc.getChildRef()).thenReturn(nodeRef); - when(mockedChildAssoc.getParentRef()).thenReturn(holdFolder); - holdType.onCreateChildAssociation(mockedChildAssoc, true); - } -} 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 166af4c5bb..3ae63a99c2 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 @@ -65,7 +65,6 @@ import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.security.AccessStatus; import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.cmr.security.PersonService; -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; @@ -725,45 +724,6 @@ public class RMNodesImplUnitTest extends BaseUnitTest verify(mockedFileFolderService, never()).delete(nodeRef); } - @Test - public void testCheckPostPermissionForRMSite() throws Exception - { - NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); - SiteInfo mockedSiteInfo = mock(SiteInfo.class); - when(mockedSiteInfo.getNodeRef()).thenReturn(parentNodeRef); - when(mockedSiteService.getSite(RM_SITE_ID)).thenReturn(mockedSiteInfo); - - try - { - rmNodesImpl.checkPostPermission(parentNodeRef.getId()); - fail("Expected ecxeption as post should not be permitted on the RM site"); - } - catch(PermissionDeniedException ex) - { - assertEquals("POST request not allowed in RM site.", ex.getMsgId()); - } - } - - @Test - public void testCheckPostPermissionForNormalNodeRefWhenRMSiteExists() throws Exception - { - NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); - NodeRef rmSiteNodeRef = AlfMock.generateNodeRef(mockedNodeService); - SiteInfo mockedSiteInfo = mock(SiteInfo.class); - when(mockedSiteInfo.getNodeRef()).thenReturn(rmSiteNodeRef); - when(mockedSiteService.getSite(RM_SITE_ID)).thenReturn(mockedSiteInfo); - rmNodesImpl.checkPostPermission(parentNodeRef.getId()); - } - - @Test - public void testCheckPostPermission() throws Exception - { - NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); - QName type = AlfMock.generateQName(); - when(mockedNodeService.getType(parentNodeRef)).thenReturn(type); - rmNodesImpl.checkPostPermission(parentNodeRef.getId()); - } - private void setupCompanyHomeAndPrimaryParent(NodeRef nodeRef) { NodeRef companyHomeNodeRef = AlfMock.generateNodeRef(mockedNodeService); diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelationUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelationUnitTest.java index f16cc01103..7e9c9d75e2 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelationUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/rm/rest/api/nodes/FileplanComponentChildrenRelationUnitTest.java @@ -28,10 +28,7 @@ package org.alfresco.rm.rest.api.nodes; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -41,7 +38,6 @@ import java.util.List; import org.alfresco.module.org_alfresco_module_rm.test.util.AlfMock; import org.alfresco.module.org_alfresco_module_rm.test.util.BaseUnitTest; import org.alfresco.rest.api.model.Node; -import org.alfresco.rest.framework.core.exceptions.PermissionDeniedException; import org.alfresco.rest.framework.resource.parameters.Parameters; import org.alfresco.rest.framework.webscripts.WithResponse; import org.alfresco.rm.rest.api.impl.RMNodesImpl; @@ -50,7 +46,6 @@ import org.junit.Before; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.springframework.extensions.webscripts.servlet.FormData; @@ -99,29 +94,6 @@ public class FileplanComponentChildrenRelationUnitTest extends BaseUnitTest verify(mockedRMNodes, times(1)).createNode(parentNodeRef.getId(), nodeInfos.get(0), mockedParameters); } - @Test - public void testCreateOnRMSite() throws Exception - { - Parameters mockedParameters = mock(Parameters.class); - NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); - - List nodeInfos = new ArrayList(); - Node mokedNodeInfo = mock(Node.class); - nodeInfos.add(mokedNodeInfo); - - Mockito.doThrow(new PermissionDeniedException("POST request not allowed in RM site.")).when(mockedRMNodes).checkPostPermission(parentNodeRef.getId()); - try - { - filePlanComponentChildrenRelation.create(parentNodeRef.getId(), nodeInfos, mockedParameters); - fail("Expected ecxeption as POST request is not allowed in RM site."); - } - catch(PermissionDeniedException ex) - { - assertEquals("POST request not allowed in RM site.", ex.getMsgId()); - } - verify(mockedRMNodes, never()).createNode(parentNodeRef.getId(), nodeInfos.get(0), mockedParameters); - } - @Test public void testUpload() throws Exception { @@ -132,25 +104,4 @@ public class FileplanComponentChildrenRelationUnitTest extends BaseUnitTest filePlanComponentChildrenRelation.create(parentNodeRef.getId(), mockedFormData, mockedParameters, mockedWithResponse); verify(mockedRMNodes, times(1)).upload(parentNodeRef.getId(), mockedFormData, mockedParameters); } - - @Test - public void testUploadOnRMSite() throws Exception - { - Parameters mockedParameters = mock(Parameters.class); - NodeRef parentNodeRef = AlfMock.generateNodeRef(mockedNodeService); - FormData mockedFormData = mock(FormData.class); - WithResponse mockedWithResponse = mock(WithResponse.class); - - Mockito.doThrow(new PermissionDeniedException("POST request not allowed in RM site.")).when(mockedRMNodes).checkPostPermission(parentNodeRef.getId()); - try - { - filePlanComponentChildrenRelation.create(parentNodeRef.getId(), mockedFormData, mockedParameters, mockedWithResponse); - fail("Expected ecxeption as POST request is not allowed in RM site."); - } - catch(PermissionDeniedException ex) - { - assertEquals("POST request not allowed in RM site.", ex.getMsgId()); - } - verify(mockedRMNodes, never()).upload(parentNodeRef.getId(), mockedFormData, mockedParameters); - } } From 49cb2f59aee75511becf130bd2709bb9e88f2ec3 Mon Sep 17 00:00:00 2001 From: Silviu Dinuta Date: Wed, 9 Nov 2016 12:51:14 +0200 Subject: [PATCH 16/23] RM-4326: undo some formatting --- .../rm-service-context.xml | 16 +-- .../model/rma/type/RmSiteType.java | 130 +++++++++--------- .../hold/HoldServiceImplUnitTest.java | 4 - 3 files changed, 73 insertions(+), 77 deletions(-) diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml index 40c4434610..ec5fe2d051 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml @@ -375,10 +375,10 @@ - + - @@ -568,9 +568,9 @@ parent="baseService"> - - - + + + @@ -1062,8 +1062,8 @@ - - + + 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 9368c467d6..f446e767ec 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 @@ -77,8 +77,8 @@ public class RmSiteType extends BaseBehaviourBean NodeServicePolicies.BeforeDeleteNodePolicy, NodeServicePolicies.OnCreateChildAssociationPolicy { - /** Constant values */ - public static final String COMPONENT_DOCUMENT_LIBRARY = "documentLibrary"; + /** Constant values */ + public static final String COMPONENT_DOCUMENT_LIBRARY = "documentLibrary"; public static final String DEFAULT_SITE_NAME = "rm"; public static final QName DEFAULT_FILE_PLAN_TYPE = TYPE_FILE_PLAN; @@ -103,8 +103,8 @@ public class RmSiteType extends BaseBehaviourBean */ public void setSiteService(SiteService siteService) { - this.siteService = siteService; - } + this.siteService = siteService; + } /** * @param recordsManagementSearchService records management search service @@ -139,39 +139,39 @@ public class RmSiteType extends BaseBehaviourBean */ public void registerFilePlanType(QName siteType, QName filePlanType) { - ParameterCheck.mandatory("siteType", siteType); - ParameterCheck.mandatory("filePlanType", filePlanType); + ParameterCheck.mandatory("siteType", siteType); + ParameterCheck.mandatory("filePlanType", filePlanType); - // check that the registered site type is a subtype of rma:rmsite - if (!dictionaryService.isSubClass(siteType, TYPE_RM_SITE)) - { - throw new AlfrescoRuntimeException( - "Can't register site type, because site type is not a sub type of rma:rmsite (siteType=" + siteType.toString() + ")"); - } + // check that the registered site type is a subtype of rma:rmsite + if (!dictionaryService.isSubClass(siteType, TYPE_RM_SITE)) + { + throw new AlfrescoRuntimeException( + "Can't register site type, because site type is not a sub type of rma:rmsite (siteType=" + siteType.toString() + ")"); + } - // check that the registered file plan type is a sub type of rma:filePlan - if (!dictionaryService.isSubClass(filePlanType, TYPE_FILE_PLAN)) - { - throw new AlfrescoRuntimeException( - "Can't register file plan type, because site type is not a sub type of rma:filePlan (filePlanType=" + filePlanType.toString() + ")"); - } + // check that the registered file plan type is a sub type of rma:filePlan + if (!dictionaryService.isSubClass(filePlanType, TYPE_FILE_PLAN)) + { + throw new AlfrescoRuntimeException( + "Can't register file plan type, because site type is not a sub type of rma:filePlan (filePlanType=" + filePlanType.toString() + ")"); + } - // add site and file plan types to map - mapFilePlanType.put(siteType, filePlanType); + // add site and file plan types to map + mapFilePlanType.put(siteType, filePlanType); } /** * @see org.alfresco.repo.node.NodeServicePolicies.OnCreateNodePolicy#onCreateNode(org.alfresco.service.cmr.repository.ChildAssociationRef) */ - @Override - @Behaviour - ( - kind = BehaviourKind.CLASS, - notificationFrequency = NotificationFrequency.FIRST_EVENT - ) - public void onCreateNode(ChildAssociationRef childAssocRef) - { - final NodeRef rmSite = childAssocRef.getChildRef(); + @Override + @Behaviour + ( + kind = BehaviourKind.CLASS, + notificationFrequency = NotificationFrequency.FIRST_EVENT + ) + public void onCreateNode(ChildAssociationRef childAssocRef) + { + final NodeRef rmSite = childAssocRef.getChildRef(); // Do not execute behaviour if this has been created in the archive store if(rmSite.getStoreRef().equals(StoreRef.STORE_REF_ARCHIVE_SPACESSTORE)) @@ -186,52 +186,52 @@ public class RmSiteType extends BaseBehaviourBean { public Object doWork() { - SiteInfo siteInfo = siteService.getSite(rmSite); - if (siteInfo != null) - { - // Create the file plan component - siteService.createContainer(siteInfo.getShortName(), COMPONENT_DOCUMENT_LIBRARY, getFilePlanType(siteInfo), null); + SiteInfo siteInfo = siteService.getSite(rmSite); + if (siteInfo != null) + { + // Create the file plan component + siteService.createContainer(siteInfo.getShortName(), COMPONENT_DOCUMENT_LIBRARY, getFilePlanType(siteInfo), null); - // Add the reports - recordsManagementSearchService.addReports(siteInfo.getShortName()); - } + // Add the reports + recordsManagementSearchService.addReports(siteInfo.getShortName()); + } return null; } }, AuthenticationUtil.getAdminUserName()); } - } + } - /** - * Get the file plan type for the given site. - * - * @param siteInfo site info - * @return QName file plan type to create as a container - * @since 2.2 - */ - private QName getFilePlanType(SiteInfo siteInfo) - { - ParameterCheck.mandatory("siteInfo", siteInfo); + /** + * Get the file plan type for the given site. + * + * @param siteInfo site info + * @return QName file plan type to create as a container + * @since 2.2 + */ + private QName getFilePlanType(SiteInfo siteInfo) + { + ParameterCheck.mandatory("siteInfo", siteInfo); - // set default file plan - QName result = DEFAULT_FILE_PLAN_TYPE; + // set default file plan + QName result = DEFAULT_FILE_PLAN_TYPE; - // check to see if there is an 'override' for the file plan type given the site type - QName siteType = nodeService.getType(siteInfo.getNodeRef()); - if (mapFilePlanType.containsKey(siteType)) - { - result = mapFilePlanType.get(siteType); - } + // check to see if there is an 'override' for the file plan type given the site type + QName siteType = nodeService.getType(siteInfo.getNodeRef()); + if (mapFilePlanType.containsKey(siteType)) + { + result = mapFilePlanType.get(siteType); + } - return result; - } + return result; + } - /** - * Ensure that the visibility of a RM site can not be changed to anything but public. - * - * TODO support other site visibilities - * - * @see org.alfresco.repo.node.NodeServicePolicies.OnUpdatePropertiesPolicy#onUpdateProperties(org.alfresco.service.cmr.repository.NodeRef, java.util.Map, java.util.Map) - */ + /** + * Ensure that the visibility of a RM site can not be changed to anything but public. + * + * TODO support other site visibilities + * + * @see org.alfresco.repo.node.NodeServicePolicies.OnUpdatePropertiesPolicy#onUpdateProperties(org.alfresco.service.cmr.repository.NodeRef, java.util.Map, java.util.Map) + */ @Behaviour ( kind = BehaviourKind.CLASS, diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java index 0a82499e08..169a6bc694 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/hold/HoldServiceImplUnitTest.java @@ -61,7 +61,6 @@ import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; -import org.mockito.Mock; import org.mockito.Spy; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; @@ -83,9 +82,6 @@ public class HoldServiceImplUnitTest extends BaseUnitTest protected NodeRef hold; protected NodeRef hold2; - @Mock - private HoldType mockedHoldType; - @Spy @InjectMocks HoldServiceImpl holdService; @Before From ddab49bf51be540024280f765e13130cd87a111a Mon Sep 17 00:00:00 2001 From: Silviu Dinuta Date: Wed, 9 Nov 2016 12:53:53 +0200 Subject: [PATCH 17/23] RM-4326: undo some formatting --- .../rm-service-context.xml | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml index ec5fe2d051..7d4b163dc7 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml @@ -1524,20 +1524,20 @@ From ee5a40a5086207a8c8ff56f567ed2d019ff11176 Mon Sep 17 00:00:00 2001 From: Silviu Dinuta Date: Wed, 9 Nov 2016 13:27:33 +0200 Subject: [PATCH 18/23] RM-4326: extracted non unique types in a constant for RmSyteType create association check --- .../org_alfresco_module_rm/model/rma/type/RmSiteType.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 f446e767ec..5000eeab42 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 @@ -30,6 +30,7 @@ package org.alfresco.module.org_alfresco_module_rm.model.rma.type; import java.io.Serializable; import java.security.InvalidParameterException; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -81,6 +82,7 @@ public class RmSiteType extends BaseBehaviourBean public static final String COMPONENT_DOCUMENT_LIBRARY = "documentLibrary"; public static final String DEFAULT_SITE_NAME = "rm"; public static final QName DEFAULT_FILE_PLAN_TYPE = TYPE_FILE_PLAN; + private final static List ACCEPTED_NON_UNIQUE_CHILD_TYPES = Arrays.asList(TYPE_RECORD_CATEGORY); /** Site service */ protected SiteService siteService; @@ -321,10 +323,8 @@ public class RmSiteType extends BaseBehaviourBean List acceptedUniqueChildTypes = new ArrayList(); SiteInfo siteInfo = siteService.getSite(parent); acceptedUniqueChildTypes.add(getFilePlanType(siteInfo)); - List acceptedNonUniqueChildTypes = new ArrayList(); - acceptedNonUniqueChildTypes.add(ContentModel.TYPE_FOLDER); // check the created child is of an accepted type - validateNewChildAssociation(parent, child, acceptedUniqueChildTypes, acceptedNonUniqueChildTypes); + validateNewChildAssociation(parent, child, acceptedUniqueChildTypes, ACCEPTED_NON_UNIQUE_CHILD_TYPES); return null; } }); From 8a8fc1e3123c5869966caedc790a6a2fc3668ff6 Mon Sep 17 00:00:00 2001 From: Silviu Dinuta Date: Wed, 9 Nov 2016 14:48:49 +0200 Subject: [PATCH 19/23] RM-4326: minor fix --- .../org_alfresco_module_rm/model/rma/type/RmSiteType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 5000eeab42..4a23e73fc3 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 @@ -82,7 +82,7 @@ public class RmSiteType extends BaseBehaviourBean public static final String COMPONENT_DOCUMENT_LIBRARY = "documentLibrary"; public static final String DEFAULT_SITE_NAME = "rm"; public static final QName DEFAULT_FILE_PLAN_TYPE = TYPE_FILE_PLAN; - private final static List ACCEPTED_NON_UNIQUE_CHILD_TYPES = Arrays.asList(TYPE_RECORD_CATEGORY); + private final static List ACCEPTED_NON_UNIQUE_CHILD_TYPES = Arrays.asList(ContentModel.TYPE_FOLDER); /** Site service */ protected SiteService siteService; From 1d7f8673bbf8034edef5951f44606aa47f941433 Mon Sep 17 00:00:00 2001 From: Silviu Dinuta Date: Wed, 9 Nov 2016 16:35:51 +0200 Subject: [PATCH 20/23] RM-4326: added unit tests for RmSiteType class --- .../model/rma/type/RmSyteTypeUnitTest.java | 237 ++++++++++++++++++ 1 file changed, 237 insertions(+) create mode 100644 rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/RmSyteTypeUnitTest.java diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/RmSyteTypeUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/RmSyteTypeUnitTest.java new file mode 100644 index 0000000000..9138d3a722 --- /dev/null +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/RmSyteTypeUnitTest.java @@ -0,0 +1,237 @@ +/* + * #%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.model.rma.type; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.security.InvalidParameterException; +import java.util.ArrayList; + +import org.alfresco.model.ContentModel; +import org.alfresco.module.org_alfresco_module_rm.test.util.AlfMock; +import org.alfresco.module.org_alfresco_module_rm.test.util.BaseUnitTest; +import org.alfresco.module.org_alfresco_module_rm.test.util.MockAuthenticationUtilHelper; +import org.alfresco.module.org_alfresco_module_rm.util.AuthenticationUtil; +import org.alfresco.service.cmr.repository.ChildAssociationRef; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.site.SiteInfo; +import org.alfresco.service.cmr.site.SiteService; +import org.alfresco.service.namespace.QName; +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import com.google.common.collect.Sets; + +/** + * Unit test for RmSyteType + * + * @author Silviu Dinuta + * @since 2.6 + * + */ +public class RmSyteTypeUnitTest extends BaseUnitTest +{ + @Mock + private AuthenticationUtil mockAuthenticationUtil; + + @Mock + private SiteService mockedSiteService; + + private @InjectMocks RmSiteType rmSiteType; + + @Before + public void setup() + { + MockitoAnnotations.initMocks(this); + MockAuthenticationUtilHelper.setup(mockAuthenticationUtil); + } + + /** + * Given that we try to add non allowed type to rm site, + * Then InvalidParameterException is thrown. + */ + @Test(expected = InvalidParameterException.class) + public void testAddNonAcceptedTypeToRmSite() + { + NodeRef rmSiteNodeRef = generateNodeRef(TYPE_RM_SITE, true); + + QName type = AlfMock.generateQName(); + NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService, type); + + ChildAssociationRef mockedChildAssoc = mock(ChildAssociationRef.class); + when(mockedChildAssoc.getChildRef()).thenReturn(nodeRef); + when(mockedChildAssoc.getParentRef()).thenReturn(rmSiteNodeRef); + SiteInfo mockedSiteInfo = mock(SiteInfo.class); + when(mockedSiteService.getSite(rmSiteNodeRef)).thenReturn(mockedSiteInfo); + when(mockedApplicationContext.getBean("dbNodeService")).thenReturn(mockedNodeService); + rmSiteType.onCreateChildAssociation(mockedChildAssoc, true); + } + + /** + * Given that we try to add one cm:folder to rm site, + * Then operation is successful. + */ + @Test + public void testAddOneFolderTypeToRmSite() + { + NodeRef rmSiteNodeRef = generateNodeRef(TYPE_RM_SITE, true); + ArrayList assocs = new ArrayList(); + + SiteInfo mockedSiteInfo = mock(SiteInfo.class); + when(mockedSiteService.getSite(rmSiteNodeRef)).thenReturn(mockedSiteInfo); + when(mockedApplicationContext.getBean("dbNodeService")).thenReturn(mockedNodeService); + + NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService, ContentModel.TYPE_FOLDER); + ChildAssociationRef mockedChildAssoc = generateChildAssociationRef(rmSiteNodeRef, nodeRef); + assocs.add(mockedChildAssoc); + when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(ContentModel.TYPE_FOLDER))).thenReturn(assocs); + + rmSiteType.onCreateChildAssociation(mockedChildAssoc, true); + } + + /** + * Given that we try to add two cm:folder to rm site, + * Then operation is successful. + */ + @Test + public void testAddTwoFolderTypeToRmSite() + { + NodeRef rmSiteNodeRef = generateNodeRef(TYPE_RM_SITE, true); + ArrayList assocs = new ArrayList(); + + SiteInfo mockedSiteInfo = mock(SiteInfo.class); + when(mockedSiteService.getSite(rmSiteNodeRef)).thenReturn(mockedSiteInfo); + when(mockedApplicationContext.getBean("dbNodeService")).thenReturn(mockedNodeService); + + //create first folder + NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService, ContentModel.TYPE_FOLDER); + ChildAssociationRef mockedChildAssoc = generateChildAssociationRef(rmSiteNodeRef, nodeRef); + assocs.add(mockedChildAssoc); + when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(ContentModel.TYPE_FOLDER))).thenReturn(assocs); + rmSiteType.onCreateChildAssociation(mockedChildAssoc, true); + + //create second cm:folder + nodeRef = AlfMock.generateNodeRef(mockedNodeService, ContentModel.TYPE_FOLDER); + mockedChildAssoc = generateChildAssociationRef(rmSiteNodeRef, nodeRef); + assocs.add(mockedChildAssoc); + when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(ContentModel.TYPE_FOLDER))).thenReturn(assocs); + rmSiteType.onCreateChildAssociation(mockedChildAssoc, true); + } + + /** + * Given that we try to add more than two cm:folder to rm site, + * Then InvalidParameterException is thrown. + */ + @Test(expected = InvalidParameterException.class) + public void testAddMoreThanTwhoFolderTypeToRmSite() + { + NodeRef rmSiteNodeRef = generateNodeRef(TYPE_RM_SITE, true); + ArrayList assocs = new ArrayList(); + + SiteInfo mockedSiteInfo = mock(SiteInfo.class); + when(mockedSiteService.getSite(rmSiteNodeRef)).thenReturn(mockedSiteInfo); + when(mockedApplicationContext.getBean("dbNodeService")).thenReturn(mockedNodeService); + when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(ContentModel.TYPE_FOLDER))).thenReturn(new ArrayList()); + + //create first folder + NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService, ContentModel.TYPE_FOLDER); + ChildAssociationRef mockedChildAssoc = generateChildAssociationRef(rmSiteNodeRef, nodeRef); + rmSiteType.onCreateChildAssociation(mockedChildAssoc, true); + assocs.add(mockedChildAssoc); + when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(ContentModel.TYPE_FOLDER))).thenReturn(assocs); + + //create second cm:folder + nodeRef = AlfMock.generateNodeRef(mockedNodeService, ContentModel.TYPE_FOLDER); + mockedChildAssoc = generateChildAssociationRef(rmSiteNodeRef, nodeRef); + assocs.add(mockedChildAssoc); + when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(ContentModel.TYPE_FOLDER))).thenReturn(assocs); + rmSiteType.onCreateChildAssociation(mockedChildAssoc, true); + + //create third cm:folder + nodeRef = AlfMock.generateNodeRef(mockedNodeService, ContentModel.TYPE_FOLDER); + mockedChildAssoc = generateChildAssociationRef(rmSiteNodeRef, nodeRef); + assocs.add(mockedChildAssoc); + when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(ContentModel.TYPE_FOLDER))).thenReturn(assocs); + rmSiteType.onCreateChildAssociation(mockedChildAssoc, true); + } + + /** + * Given that we try to add one rma:filePlan to rm site, + * Then operation is successful. + */ + @Test + public void testAddOneFilePlanTypeToRmSite() + { + NodeRef rmSiteNodeRef = generateNodeRef(TYPE_RM_SITE, true); + ArrayList assocs = new ArrayList(); + + SiteInfo mockedSiteInfo = mock(SiteInfo.class); + when(mockedSiteService.getSite(rmSiteNodeRef)).thenReturn(mockedSiteInfo); + when(mockedApplicationContext.getBean("dbNodeService")).thenReturn(mockedNodeService); + + NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService, TYPE_FILE_PLAN); + ChildAssociationRef mockedChildAssoc = generateChildAssociationRef(rmSiteNodeRef, nodeRef); + assocs.add(mockedChildAssoc); + when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(TYPE_FILE_PLAN))).thenReturn(assocs); + + rmSiteType.onCreateChildAssociation(mockedChildAssoc, true); + } + + /** + * Given that we try to add more than one rma:filePlan to rm site, + * Then InvalidParameterException is thrown. + */ + @Test(expected = InvalidParameterException.class) + public void testAddMoreThanOneFilePlanTypeToRmSite() + { + NodeRef rmSiteNodeRef = generateNodeRef(TYPE_RM_SITE, true); + ArrayList assocs = new ArrayList(); + + SiteInfo mockedSiteInfo = mock(SiteInfo.class); + when(mockedSiteService.getSite(rmSiteNodeRef)).thenReturn(mockedSiteInfo); + when(mockedApplicationContext.getBean("dbNodeService")).thenReturn(mockedNodeService); + + //first file plan creation + NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService, TYPE_FILE_PLAN); + ChildAssociationRef mockedChildAssoc = generateChildAssociationRef(rmSiteNodeRef, nodeRef); + assocs.add(mockedChildAssoc); + when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(TYPE_FILE_PLAN))).thenReturn(assocs); + rmSiteType.onCreateChildAssociation(mockedChildAssoc, true); + + //second filePlan creation + nodeRef = AlfMock.generateNodeRef(mockedNodeService, TYPE_FILE_PLAN); + mockedChildAssoc = generateChildAssociationRef(rmSiteNodeRef, nodeRef); + assocs.add(mockedChildAssoc); + when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(TYPE_FILE_PLAN))).thenReturn(assocs); + rmSiteType.onCreateChildAssociation(mockedChildAssoc, true); + } +} From 0e93c1dcbe79568dfb3a8487dff843a2286d71f8 Mon Sep 17 00:00:00 2001 From: Silviu Dinuta Date: Wed, 9 Nov 2016 16:52:17 +0200 Subject: [PATCH 21/23] RM-4326: renamed rm site type unit test class --- .../type/{RmSyteTypeUnitTest.java => RmSiteTypeUnitTest.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/{RmSyteTypeUnitTest.java => RmSiteTypeUnitTest.java} (99%) diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/RmSyteTypeUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/RmSiteTypeUnitTest.java similarity index 99% rename from rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/RmSyteTypeUnitTest.java rename to rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/RmSiteTypeUnitTest.java index 9138d3a722..ff65223fd8 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/RmSyteTypeUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/RmSiteTypeUnitTest.java @@ -52,13 +52,13 @@ import org.mockito.MockitoAnnotations; import com.google.common.collect.Sets; /** - * Unit test for RmSyteType + * Unit test for RmSiteType * * @author Silviu Dinuta * @since 2.6 * */ -public class RmSyteTypeUnitTest extends BaseUnitTest +public class RmSiteTypeUnitTest extends BaseUnitTest { @Mock private AuthenticationUtil mockAuthenticationUtil; From 94ec27b0de84f9c089feffb676dbb87d458df7e0 Mon Sep 17 00:00:00 2001 From: Silviu Dinuta Date: Thu, 10 Nov 2016 11:04:34 +0200 Subject: [PATCH 22/23] RM-4326 : added some more unit tests for RmSiteType and did some code cleanup in this class --- .../model/rma/type/RmSiteTypeUnitTest.java | 131 ++++++++++++++++-- 1 file changed, 116 insertions(+), 15 deletions(-) diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/RmSiteTypeUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/RmSiteTypeUnitTest.java index ff65223fd8..a9483509ad 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/RmSiteTypeUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/RmSiteTypeUnitTest.java @@ -33,7 +33,7 @@ import static org.mockito.Mockito.when; import java.security.InvalidParameterException; import java.util.ArrayList; -import org.alfresco.model.ContentModel; +import org.alfresco.module.org_alfresco_module_rm.dod5015.DOD5015Model; import org.alfresco.module.org_alfresco_module_rm.test.util.AlfMock; import org.alfresco.module.org_alfresco_module_rm.test.util.BaseUnitTest; import org.alfresco.module.org_alfresco_module_rm.test.util.MockAuthenticationUtilHelper; @@ -58,7 +58,7 @@ import com.google.common.collect.Sets; * @since 2.6 * */ -public class RmSiteTypeUnitTest extends BaseUnitTest +public class RmSiteTypeUnitTest extends BaseUnitTest implements DOD5015Model { @Mock private AuthenticationUtil mockAuthenticationUtil; @@ -110,10 +110,10 @@ public class RmSiteTypeUnitTest extends BaseUnitTest when(mockedSiteService.getSite(rmSiteNodeRef)).thenReturn(mockedSiteInfo); when(mockedApplicationContext.getBean("dbNodeService")).thenReturn(mockedNodeService); - NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService, ContentModel.TYPE_FOLDER); + NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService, TYPE_FOLDER); ChildAssociationRef mockedChildAssoc = generateChildAssociationRef(rmSiteNodeRef, nodeRef); assocs.add(mockedChildAssoc); - when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(ContentModel.TYPE_FOLDER))).thenReturn(assocs); + when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(TYPE_FOLDER))).thenReturn(assocs); rmSiteType.onCreateChildAssociation(mockedChildAssoc, true); } @@ -133,17 +133,17 @@ public class RmSiteTypeUnitTest extends BaseUnitTest when(mockedApplicationContext.getBean("dbNodeService")).thenReturn(mockedNodeService); //create first folder - NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService, ContentModel.TYPE_FOLDER); + NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService, TYPE_FOLDER); ChildAssociationRef mockedChildAssoc = generateChildAssociationRef(rmSiteNodeRef, nodeRef); assocs.add(mockedChildAssoc); - when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(ContentModel.TYPE_FOLDER))).thenReturn(assocs); + when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(TYPE_FOLDER))).thenReturn(assocs); rmSiteType.onCreateChildAssociation(mockedChildAssoc, true); //create second cm:folder - nodeRef = AlfMock.generateNodeRef(mockedNodeService, ContentModel.TYPE_FOLDER); + nodeRef = AlfMock.generateNodeRef(mockedNodeService, TYPE_FOLDER); mockedChildAssoc = generateChildAssociationRef(rmSiteNodeRef, nodeRef); assocs.add(mockedChildAssoc); - when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(ContentModel.TYPE_FOLDER))).thenReturn(assocs); + when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(TYPE_FOLDER))).thenReturn(assocs); rmSiteType.onCreateChildAssociation(mockedChildAssoc, true); } @@ -160,27 +160,27 @@ public class RmSiteTypeUnitTest extends BaseUnitTest SiteInfo mockedSiteInfo = mock(SiteInfo.class); when(mockedSiteService.getSite(rmSiteNodeRef)).thenReturn(mockedSiteInfo); when(mockedApplicationContext.getBean("dbNodeService")).thenReturn(mockedNodeService); - when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(ContentModel.TYPE_FOLDER))).thenReturn(new ArrayList()); + when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(TYPE_FOLDER))).thenReturn(new ArrayList()); //create first folder - NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService, ContentModel.TYPE_FOLDER); + NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService, TYPE_FOLDER); ChildAssociationRef mockedChildAssoc = generateChildAssociationRef(rmSiteNodeRef, nodeRef); rmSiteType.onCreateChildAssociation(mockedChildAssoc, true); assocs.add(mockedChildAssoc); - when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(ContentModel.TYPE_FOLDER))).thenReturn(assocs); + when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(TYPE_FOLDER))).thenReturn(assocs); //create second cm:folder - nodeRef = AlfMock.generateNodeRef(mockedNodeService, ContentModel.TYPE_FOLDER); + nodeRef = AlfMock.generateNodeRef(mockedNodeService, TYPE_FOLDER); mockedChildAssoc = generateChildAssociationRef(rmSiteNodeRef, nodeRef); assocs.add(mockedChildAssoc); - when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(ContentModel.TYPE_FOLDER))).thenReturn(assocs); + when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(TYPE_FOLDER))).thenReturn(assocs); rmSiteType.onCreateChildAssociation(mockedChildAssoc, true); //create third cm:folder - nodeRef = AlfMock.generateNodeRef(mockedNodeService, ContentModel.TYPE_FOLDER); + nodeRef = AlfMock.generateNodeRef(mockedNodeService, TYPE_FOLDER); mockedChildAssoc = generateChildAssociationRef(rmSiteNodeRef, nodeRef); assocs.add(mockedChildAssoc); - when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(ContentModel.TYPE_FOLDER))).thenReturn(assocs); + when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(TYPE_FOLDER))).thenReturn(assocs); rmSiteType.onCreateChildAssociation(mockedChildAssoc, true); } @@ -206,6 +206,23 @@ public class RmSiteTypeUnitTest extends BaseUnitTest rmSiteType.onCreateChildAssociation(mockedChildAssoc, true); } + /** + * Given that we try to add one dod:filePlan to standard rm site, + * Then InvalidParameterException is thrown. + */ + @Test(expected = InvalidParameterException.class) + public void testAddDODFilePlanTypeToStandardRmSite() + { + NodeRef rmSiteNodeRef = generateNodeRef(TYPE_RM_SITE, true); + SiteInfo mockedSiteInfo = mock(SiteInfo.class); + when(mockedSiteService.getSite(rmSiteNodeRef)).thenReturn(mockedSiteInfo); + when(mockedApplicationContext.getBean("dbNodeService")).thenReturn(mockedNodeService); + + NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService, TYPE_DOD_5015_FILE_PLAN); + ChildAssociationRef mockedChildAssoc = generateChildAssociationRef(rmSiteNodeRef, nodeRef); + rmSiteType.onCreateChildAssociation(mockedChildAssoc, true); + } + /** * Given that we try to add more than one rma:filePlan to rm site, * Then InvalidParameterException is thrown. @@ -234,4 +251,88 @@ public class RmSiteTypeUnitTest extends BaseUnitTest when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(TYPE_FILE_PLAN))).thenReturn(assocs); rmSiteType.onCreateChildAssociation(mockedChildAssoc, true); } + + /** + * Given that we try to add one dod:filePlan to rm site, + * Then operation is successful. + */ + @Test + public void testAddOneDODFilePlanTypeToRmSite() + { + NodeRef rmSiteNodeRef = generateNodeRef(TYPE_DOD_5015_SITE, true); + ArrayList assocs = new ArrayList(); + + SiteInfo mockedSiteInfo = mock(SiteInfo.class); + when(mockedSiteInfo.getNodeRef()).thenReturn(rmSiteNodeRef); + when(mockedSiteService.getSite(rmSiteNodeRef)).thenReturn(mockedSiteInfo); + when(mockedApplicationContext.getBean("dbNodeService")).thenReturn(mockedNodeService); + + when(mockedDictionaryService.isSubClass(TYPE_DOD_5015_SITE, TYPE_RM_SITE)).thenReturn(true); + when(mockedDictionaryService.isSubClass(TYPE_DOD_5015_FILE_PLAN, TYPE_FILE_PLAN)).thenReturn(true); + rmSiteType.registerFilePlanType(TYPE_DOD_5015_SITE, TYPE_DOD_5015_FILE_PLAN); + + NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService, TYPE_DOD_5015_FILE_PLAN); + ChildAssociationRef mockedChildAssoc = generateChildAssociationRef(rmSiteNodeRef, nodeRef); + assocs.add(mockedChildAssoc); + when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(TYPE_DOD_5015_FILE_PLAN))).thenReturn(assocs); + + rmSiteType.onCreateChildAssociation(mockedChildAssoc, true); + } + + /** + * Given that we try to add more than one dod:filePlan to rm site, + * Then InvalidParameterException is thrown. + */ + @Test(expected = InvalidParameterException.class) + public void testAddMoreThanOneDODFilePlanTypeToRmSite() + { + NodeRef rmSiteNodeRef = generateNodeRef(TYPE_DOD_5015_SITE, true); + ArrayList assocs = new ArrayList(); + + SiteInfo mockedSiteInfo = mock(SiteInfo.class); + when(mockedSiteInfo.getNodeRef()).thenReturn(rmSiteNodeRef); + when(mockedSiteService.getSite(rmSiteNodeRef)).thenReturn(mockedSiteInfo); + when(mockedApplicationContext.getBean("dbNodeService")).thenReturn(mockedNodeService); + + when(mockedDictionaryService.isSubClass(TYPE_DOD_5015_SITE, TYPE_RM_SITE)).thenReturn(true); + when(mockedDictionaryService.isSubClass(TYPE_DOD_5015_FILE_PLAN, TYPE_FILE_PLAN)).thenReturn(true); + rmSiteType.registerFilePlanType(TYPE_DOD_5015_SITE, TYPE_DOD_5015_FILE_PLAN); + + //first dod:filePlan creation + NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService, TYPE_DOD_5015_FILE_PLAN); + ChildAssociationRef mockedChildAssoc = generateChildAssociationRef(rmSiteNodeRef, nodeRef); + assocs.add(mockedChildAssoc); + when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(TYPE_DOD_5015_FILE_PLAN))).thenReturn(assocs); + rmSiteType.onCreateChildAssociation(mockedChildAssoc, true); + + //second dod:filePlan creation + nodeRef = AlfMock.generateNodeRef(mockedNodeService, TYPE_DOD_5015_FILE_PLAN); + mockedChildAssoc = generateChildAssociationRef(rmSiteNodeRef, nodeRef); + assocs.add(mockedChildAssoc); + when(mockedNodeService.getChildAssocs(rmSiteNodeRef, Sets.newHashSet(TYPE_DOD_5015_FILE_PLAN))).thenReturn(assocs); + rmSiteType.onCreateChildAssociation(mockedChildAssoc, true); + } + + /** + * Given that we try to add one rma:filePlan to DOD rm site, + * Then InvalidParameterException is thrown. + */ + @Test(expected = InvalidParameterException.class) + public void testAddStandardFilePlanTypeToDODRmSite() + { + NodeRef rmSiteNodeRef = generateNodeRef(TYPE_DOD_5015_SITE, true); + + SiteInfo mockedSiteInfo = mock(SiteInfo.class); + when(mockedSiteInfo.getNodeRef()).thenReturn(rmSiteNodeRef); + when(mockedSiteService.getSite(rmSiteNodeRef)).thenReturn(mockedSiteInfo); + when(mockedApplicationContext.getBean("dbNodeService")).thenReturn(mockedNodeService); + + when(mockedDictionaryService.isSubClass(TYPE_DOD_5015_SITE, TYPE_RM_SITE)).thenReturn(true); + when(mockedDictionaryService.isSubClass(TYPE_DOD_5015_FILE_PLAN, TYPE_FILE_PLAN)).thenReturn(true); + rmSiteType.registerFilePlanType(TYPE_DOD_5015_SITE, TYPE_DOD_5015_FILE_PLAN); + + NodeRef nodeRef = AlfMock.generateNodeRef(mockedNodeService, TYPE_FILE_PLAN); + ChildAssociationRef mockedChildAssoc = generateChildAssociationRef(rmSiteNodeRef, nodeRef); + rmSiteType.onCreateChildAssociation(mockedChildAssoc, true); + } } From 3b524477bd738166fb57d63623873d206815667f Mon Sep 17 00:00:00 2001 From: Silviu Dinuta Date: Thu, 10 Nov 2016 15:51:05 +0200 Subject: [PATCH 23/23] RM-4326: added some comments --- .../model/rma/type/RmSiteType.java | 13 ++++++++++++- .../model/rma/type/TransferContainerType.java | 2 +- .../model/rma/type/TransferType.java | 3 +++ 3 files changed, 16 insertions(+), 2 deletions(-) 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 4a23e73fc3..9068216fb3 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 @@ -306,6 +306,11 @@ public class RmSiteType extends BaseBehaviourBean } /** + * Add the limitation of creating only one rma:filePlan or one dod:filePlan depending on the type of rm site. + * Also added the limitation of crating two cm:folder type under rm site. + * + * Other than this nothing can be created under rm site nodeRef + * * @author Silviu Dinuta * @since 2.6 */ @@ -330,13 +335,19 @@ public class RmSiteType extends BaseBehaviourBean }); } + /** + * Overridden this because in this case we need to have multiple cm:folder types but not more than two of them. + * The two mentioned folders are created when rm site is created and one of them is Saved Searches and the other surf-config folder. + After that creation of cm:folder should not be allowed under rm site node + * + */ @Override protected void validateNewChildAssociation(NodeRef parent, NodeRef child, List acceptedUniqueChildType, List acceptedMultipleChildType) throws InvalidParameterException { super.validateNewChildAssociation(parent, child, acceptedUniqueChildType, acceptedMultipleChildType); - // check the user is not trying to create more than 2 folders that are created by default + // check the user is not trying to create more than 2 folders that are created by default. if(nodeService.getChildAssocs(parent, Sets.newHashSet(ContentModel.TYPE_FOLDER)).size() > 2) { throw new InvalidParameterException("Operation failed. Children of type " + ContentModel.TYPE_FOLDER + " are not allowed"); 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 15a2320bd0..b46fd8c711 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 @@ -71,7 +71,7 @@ public class TransferContainerType extends BaseBehaviourBean } /** - * On every event + * Prevent creating a node inside transfer container, this will be possible only through internal services in a controlled manner. * * @see org.alfresco.repo.node.NodeServicePolicies.OnCreateChildAssociationPolicy#onCreateChildAssociation(org.alfresco.service.cmr.repository.ChildAssociationRef, * boolean) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/TransferType.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/TransferType.java index 0e0cd87dc9..268caa0165 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/TransferType.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/model/rma/type/TransferType.java @@ -65,6 +65,9 @@ public class TransferType extends BaseBehaviourBean implements NodeServicePolici getBehaviour(BEHAVIOUR_NAME).enable(); } + /** + * Prevent creating a node inside transfer folder, this will be possible only through internal services in a controlled manner. + */ @Override @Behaviour (