From b3aa001eb0c69dd34dd281a629dc06ca5b65834e Mon Sep 17 00:00:00 2001 From: Silviu Dinuta Date: Tue, 8 Nov 2016 11:42:58 +0200 Subject: [PATCH] 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