diff --git a/pom.xml b/pom.xml
index 70593388a6..649a8bbc0b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -74,6 +74,11 @@
reflections
0.9.10
+
+ org.testng
+ testng
+ 6.8.8
+
diff --git a/rm-automation/pom.xml b/rm-automation/pom.xml
index 02900fdb16..0b8f2e9087 100644
--- a/rm-automation/pom.xml
+++ b/rm-automation/pom.xml
@@ -150,7 +150,6 @@
org.testng
testng
- 6.8.8
ru.yandex.qatools.htmlelements
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-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-context.xml
index 6e089b6f92..5db93ad555 100755
--- a/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-context.xml
+++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-context.xml
@@ -9,7 +9,7 @@
-
+
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/pom.xml b/rm-server/pom.xml
index 8803399995..7837927177 100644
--- a/rm-server/pom.xml
+++ b/rm-server/pom.xml
@@ -79,16 +79,6 @@
maven-surefire-plugin
-
-
- usedefaultlisteners
- false
-
-
- listener
- org.uncommons.reportng.HTMLReporter, org.uncommons.reportng.JUnitXMLReporter
-
-
${project.build.testOutputDirectory}/testng.xml
@@ -253,6 +243,12 @@
tests
test
+
+
+ org.testng
+ testng
+ test
+
postgresql
@@ -267,12 +263,6 @@
test
-
- org.uncommons
- reportng
- 1.1.4
- test
-
com.google.inject
guice
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..6c2ad22328 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 ASPECT_SAVED_SEARCH = QName.createQName(RM_URI, "savedSearch");
}
diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v20/RMv2SavedSearchPatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v20/RMv2SavedSearchPatch.java
index 636e6f1c56..b1519b5c3c 100644
--- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v20/RMv2SavedSearchPatch.java
+++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v20/RMv2SavedSearchPatch.java
@@ -32,6 +32,8 @@ import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.site.SiteService;
import org.springframework.beans.factory.BeanNameAware;
+import static org.alfresco.module.org_alfresco_module_rm.model.rma.type.RmSiteType.DEFAULT_SITE_NAME;
+
/**
* RM v2.0 Saved Search Patch
*
@@ -42,9 +44,6 @@ import org.springframework.beans.factory.BeanNameAware;
public class RMv2SavedSearchPatch extends ModulePatchComponent
implements BeanNameAware, RecordsManagementModel, DOD5015Model
{
- /** RM site id */
- private static final String RM_SITE_ID = "rm";
-
/** Records management search service */
private RecordsManagementSearchService recordsManagementSearchService;
@@ -84,10 +83,10 @@ public class RMv2SavedSearchPatch extends ModulePatchComponent
@Override
protected void executePatch()
{
- if (siteService.getSite(RM_SITE_ID) != null)
+ if (siteService.getSite(DEFAULT_SITE_NAME) != null)
{
// get the saved searches
- List savedSearches = recordsManagementSearchService.getSavedSearches(RM_SITE_ID);
+ List savedSearches = recordsManagementSearchService.getSavedSearches(DEFAULT_SITE_NAME);
if (LOGGER.isDebugEnabled())
{
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..4233420911
--- /dev/null
+++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v23/RMv23SavedSearchesPatch.java
@@ -0,0 +1,71 @@
+/*
+ * 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 static org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel.ASPECT_SAVED_SEARCH;
+import static org.alfresco.module.org_alfresco_module_rm.model.rma.type.RmSiteType.DEFAULT_SITE_NAME;
+
+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;
+
+
+/**
+ * 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;
+ }
+
+ /**
+ * Retrieves all saved searches for the records management site and adds ASPECT_SAVED_SEARCH
+ */
+ @Override
+ public void applyInternal()
+ {
+ for(SavedSearchDetails savedSearchDetails : recordsManagementSearchService.getSavedSearches(DEFAULT_SITE_NAME))
+ {
+ nodeService.addAspect(savedSearchDetails.getNodeRef(), ASPECT_SAVED_SEARCH,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..cde2540590 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
@@ -18,6 +18,8 @@
*/
package org.alfresco.module.org_alfresco_module_rm.search;
+import static org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel.ASPECT_SAVED_SEARCH;
+
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
@@ -34,6 +36,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 +52,7 @@ import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.extensions.surf.util.I18NUtil;
+
/**
* Records management search service implementation
*
@@ -73,6 +77,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 +115,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 +535,7 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear
}
}, AuthenticationUtil.getSystemUserName());
}
-
+ nodeService.addAspect(searchNode, ASPECT_SAVED_SEARCH, 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..a73190ab7d
--- /dev/null
+++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/patch/v23/RMv23SavedSearchesPatchUnitTest.java
@@ -0,0 +1,84 @@
+/*
+ * 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 static java.util.Arrays.asList;
+import static org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel.ASPECT_SAVED_SEARCH;
+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;
+
+import org.alfresco.module.org_alfresco_module_rm.search.RecordsManagementSearchServiceImpl;
+import org.alfresco.module.org_alfresco_module_rm.search.SavedSearchDetails;
+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;
+
+/**
+ * patch.v23 unit test
+ *
+ * @author Ross Gale
+ * @since 2.3
+ */
+public class RMv23SavedSearchesPatchUnitTest
+{
+
+ @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.3
+ * When I execute the patch
+ * Then any existing rm saved searches will have the saved search aspect applied
+ */
+ @Test
+ public void executePatch()
+ {
+ MockitoAnnotations.initMocks(this);
+ NodeRef noderef1 = new NodeRef("foo://123/456");
+ NodeRef noderef2 = new NodeRef("bar://123/456");
+ List searches = asList(mockSavedSearchDetails1, 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, ASPECT_SAVED_SEARCH, null);
+ verify(nodeService, times(1)).addAspect(noderef2, ASPECT_SAVED_SEARCH, null);
+ }
+
+}
+