diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/model/recordsModel.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/model/recordsModel.xml index 8cbdbed4ff..480311488f 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/model/recordsModel.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/model/recordsModel.xml @@ -699,6 +699,10 @@ + + Saved search + + Vital Record Definition diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v23-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v23-context.xml index 1600a1b836..b1e33c4ec4 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v23-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v23-context.xml @@ -34,4 +34,14 @@ + + + + + + + + \ No newline at end of file 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 6b39ea2065..f4834f93a5 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 @@ -327,6 +327,7 @@ ]]> + diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/RecordsManagementModel.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/RecordsManagementModel.java index d57cc2f818..5e45514ee0 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/RecordsManagementModel.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/RecordsManagementModel.java @@ -16,6 +16,7 @@ * You should have received a copy of the GNU Lesser General Public License * along with Alfresco. If not, see . */ + package org.alfresco.module.org_alfresco_module_rm.model; import org.alfresco.service.namespace.QName; @@ -149,7 +150,9 @@ public interface RecordsManagementModel extends RecordsManagementCustomModel QName PROP_DISPOSITION_ACTION_ID = QName.createQName(RM_URI, "dispositionActionId"); QName PROP_DISPOSITION_ACTION = QName.createQName(RM_URI, "dispositionAction"); QName PROP_DISPOSITION_AS_OF = QName.createQName(RM_URI, "dispositionAsOf"); - /** A flag indicating that the "disposition as of" date has been manually set and shouldn't be changed. */ + /** + * A flag indicating that the "disposition as of" date has been manually set and shouldn't be changed. + */ QName PROP_MANUALLY_SET_AS_OF = QName.createQName(RM_URI, "manuallySetAsOf"); QName PROP_DISPOSITION_EVENTS_ELIGIBLE = QName.createQName(RM_URI, "dispositionEventsEligible"); QName PROP_DISPOSITION_ACTION_STARTED_AT = QName.createQName(RM_URI, "dispositionActionStartedAt"); @@ -229,13 +232,16 @@ public interface RecordsManagementModel extends RecordsManagementCustomModel QName PROP_RS_DISPOSITION_EVENTS_ELIGIBLE = QName.createQName(RM_URI, "recordSearchDispositionEventsEligible"); QName PROP_RS_DISPOSITION_EVENTS = QName.createQName(RM_URI, "recordSearchDispositionEvents"); QName PROP_RS_VITAL_RECORD_REVIEW_PERIOD = QName.createQName(RM_URI, "recordSearchVitalRecordReviewPeriod"); - QName PROP_RS_VITAL_RECORD_REVIEW_PERIOD_EXPRESSION = QName.createQName(RM_URI, "recordSearchVitalRecordReviewPeriodExpression"); + QName PROP_RS_VITAL_RECORD_REVIEW_PERIOD_EXPRESSION = QName.createQName(RM_URI, + "recordSearchVitalRecordReviewPeriodExpression"); QName PROP_RS_DISPOSITION_PERIOD = QName.createQName(RM_URI, "recordSearchDispositionPeriod"); QName PROP_RS_DISPOSITION_PERIOD_EXPRESSION = QName.createQName(RM_URI, "recordSearchDispositionPeriodExpression"); QName PROP_RS_HAS_DISPOITION_SCHEDULE = QName.createQName(RM_URI, "recordSearchHasDispositionSchedule"); QName PROP_RS_DISPOITION_INSTRUCTIONS = QName.createQName(RM_URI, "recordSearchDispositionInstructions"); QName PROP_RS_DISPOITION_AUTHORITY = QName.createQName(RM_URI, "recordSearchDispositionAuthority"); - /** @depreacted as of 2.2, because disposable items can now be in multiple holds */ + /** + * @depreacted as of 2.2, because disposable items can now be in multiple holds + */ @Deprecated QName PROP_RS_HOLD_REASON = QName.createQName(RM_URI, "recordSearchHoldReason"); @@ -245,9 +251,12 @@ public interface RecordsManagementModel extends RecordsManagementCustomModel // Extended security aspect // @deprecated as of 2.5, because of performance issues - @Deprecated QName ASPECT_EXTENDED_SECURITY = QName.createQName(RM_URI, "extendedSecurity"); - @Deprecated QName PROP_READERS = QName.createQName(RM_URI, "readers"); - @Deprecated QName PROP_WRITERS = QName.createQName(RM_URI, "writers"); + @Deprecated + QName ASPECT_EXTENDED_SECURITY = QName.createQName(RM_URI, "extendedSecurity"); + @Deprecated + QName PROP_READERS = QName.createQName(RM_URI, "readers"); + @Deprecated + QName PROP_WRITERS = QName.createQName(RM_URI, "writers"); // Originating details of a record QName ASPECT_RECORD_ORIGINATING_DETAILS = QName.createQName(RM_URI, "recordOriginatingDetails"); @@ -269,4 +278,6 @@ public interface RecordsManagementModel extends RecordsManagementCustomModel // Countable aspect QName ASPECT_COUNTABLE = QName.createQName(RM_URI, "countable"); QName PROP_COUNT = QName.createQName(RM_URI, "count"); + + QName SAVED_SEARCH_ASPECT = QName.createQName(RM_URI, "savedSearch"); } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v23/RMv23SavedSearchesPatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v23/RMv23SavedSearchesPatch.java new file mode 100644 index 0000000000..100cc60e81 --- /dev/null +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v23/RMv23SavedSearchesPatch.java @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2005-2014 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.module.org_alfresco_module_rm.patch.v23; + +import org.alfresco.module.org_alfresco_module_rm.patch.AbstractModulePatch; +import org.alfresco.module.org_alfresco_module_rm.search.RecordsManagementSearchService; +import org.alfresco.module.org_alfresco_module_rm.search.SavedSearchDetails; +import org.alfresco.service.cmr.repository.NodeService; + +import static org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel.SAVED_SEARCH_ASPECT; + +/** + * RM v2.3 patch that adds the saved search aspect. + * + * @author Ross Gale + * @since 2.3 + */ +public class RMv23SavedSearchesPatch extends AbstractModulePatch +{ + /** records management search service */ + private RecordsManagementSearchService recordsManagementSearchService; + + /** node service */ + private NodeService nodeService; + + /** + * @param recordsManagementSearchService records management search service + */ + public void setRecordsManagementSearchService(RecordsManagementSearchService recordsManagementSearchService) + { + this.recordsManagementSearchService = recordsManagementSearchService; + } + + /** + * @param nodeService node service + */ + public void setNodeService(NodeService nodeService) + { + this.nodeService = nodeService; + } + + /** + * @see AbstractModulePatch#applyInternal() + */ + @Override + public void applyInternal() + { + for(SavedSearchDetails savedSearchDetails : recordsManagementSearchService.getSavedSearches("rm")) + { + nodeService.addAspect(savedSearchDetails.getNodeRef(),SAVED_SEARCH_ASPECT,null); + } + } + +} diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/search/RecordsManagementSearchServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/search/RecordsManagementSearchServiceImpl.java index b3c0dba0f5..c4204f806b 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/search/RecordsManagementSearchServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/search/RecordsManagementSearchServiceImpl.java @@ -34,6 +34,7 @@ import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.search.ResultSet; import org.alfresco.service.cmr.search.SearchParameters; @@ -49,6 +50,8 @@ import org.json.JSONException; import org.json.JSONObject; import org.springframework.extensions.surf.util.I18NUtil; +import static org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel.SAVED_SEARCH_ASPECT; + /** * Records management search service implementation * @@ -73,6 +76,9 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear /** Namespace service */ private NamespaceService namespaceService; + /** Node service */ + private NodeService nodeService; + /** List of report details */ private List reports = new ArrayList(13); @@ -108,7 +114,15 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear this.namespaceService = namespaceService; } - /** + /** + * @param nodeService Node service + */ + public void setNodeService(NodeService nodeService) + { + this.nodeService = nodeService; + } + + /** * @param reportsJSON */ public void setReportsJSON(String reportsJSON) @@ -520,7 +534,7 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear } }, AuthenticationUtil.getSystemUserName()); } - + nodeService.addAspect(searchNode, SAVED_SEARCH_ASPECT, null); // Write the JSON content to search node final NodeRef writableSearchNode = searchNode; AuthenticationUtil.runAs(new RunAsWork() diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/patch/v23/RMv23SavedSearchesPatchUnitTest.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/patch/v23/RMv23SavedSearchesPatchUnitTest.java new file mode 100755 index 0000000000..2ad10354b7 --- /dev/null +++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/patch/v23/RMv23SavedSearchesPatchUnitTest.java @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2005-2014 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.module.org_alfresco_module_rm.patch.v23; + + +import org.alfresco.module.org_alfresco_module_rm.search.RecordsManagementSearchServiceImpl; +import org.alfresco.module.org_alfresco_module_rm.search.SavedSearchDetails; +import org.alfresco.module.org_alfresco_module_rm.test.util.BaseUnitTest; +import org.alfresco.repo.version.NodeServiceImpl; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.ArrayList; +import java.util.List; + +import static org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel.SAVED_SEARCH_ASPECT; +import static org.mockito.Mockito.mockingDetails; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * patch.v23 unit test + * + * @author Ross Gale + * @since 2.3 + */ +public class RMv23SavedSearchesPatchUnitTest// extends BaseUnitTest +{ + + @Mock + private NodeService nodeService; + + @Mock + private RecordsManagementSearchServiceImpl recordsManagementSearchService; + + @Mock + private SavedSearchDetails mockSavedSearchDetails1, mockSavedSearchDetails2; + + @InjectMocks + private RMv23SavedSearchesPatch patch; + + /** + * Given that I am upgrading an existing repository to v2.2 + * When I execute the patch + * Then the capabilities are updated + */ + @Test + public void executePatch() + { + MockitoAnnotations.initMocks(this); + NodeRef noderef1 = new NodeRef("foo://123/456"); + NodeRef noderef2 = new NodeRef("bar://123/456"); + List searches = new ArrayList<>(); + searches.add(mockSavedSearchDetails1); + searches.add(mockSavedSearchDetails2); + when(mockSavedSearchDetails1.getNodeRef()).thenReturn(noderef1); + when(mockSavedSearchDetails2.getNodeRef()).thenReturn(noderef2); + when(recordsManagementSearchService.getSavedSearches("rm")).thenReturn(searches); + + // execute patch + patch.applyInternal(); + + verify(nodeService, times(1)).addAspect(noderef1,SAVED_SEARCH_ASPECT,null); + verify(nodeService, times(1)).addAspect(noderef2, SAVED_SEARCH_ASPECT, null); + } + +} +