From 9e7ae77cd5bcbbc2a726c5a132d2618b32d5b4c1 Mon Sep 17 00:00:00 2001 From: roxana Date: Mon, 24 Oct 2016 10:16:58 +0300 Subject: [PATCH 1/8] When the last step of the current disposition is completed, no more calculation is needed. --- .../disposition/DispositionServiceImpl.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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 2111674ec5..91cb2be3bd 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 @@ -278,6 +278,13 @@ public class DispositionServiceImpl extends ServiceBaseImpl NodeRef dsNodeRef = null; if (isRecord(nodeRef)) { + DispositionSchedule originDispositionSchedule = getOriginDispositionSchedule(nodeRef); + // if the initial disposition schedule of the record is folder based + if (isNotTrue(originDispositionSchedule.isRecordLevelDisposition())) + { + return null; + } + final NextActionFromDisposition dsNextAction = getDispositionActionByNameForRecord(nodeRef); if (dsNextAction != null) @@ -1143,6 +1150,13 @@ public class DispositionServiceImpl extends ServiceBaseImpl if (nextDispositionAction == null) { + DispositionAction lastCompletedDispositionAction = getLastCompletedDispostionAction(record); + if (lastCompletedDispositionAction != null) + { + // all disposition actions upon the given record were completed + return null; + } + return getFirstDispositionAction(record, recordFolders); } else From 4abeb19938b69c590642028a70f4137201ce0ff6 Mon Sep 17 00:00:00 2001 From: roxana Date: Mon, 24 Oct 2016 11:09:32 +0300 Subject: [PATCH 2/8] Added null check --- .../disposition/DispositionServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 91cb2be3bd..6e258baba3 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 @@ -280,7 +280,8 @@ public class DispositionServiceImpl extends ServiceBaseImpl { DispositionSchedule originDispositionSchedule = getOriginDispositionSchedule(nodeRef); // if the initial disposition schedule of the record is folder based - if (isNotTrue(originDispositionSchedule.isRecordLevelDisposition())) + if (originDispositionSchedule!= null && + isNotTrue(originDispositionSchedule.isRecordLevelDisposition())) { return null; } From cb3357080de60c9b33756d5ee80d6701b5cb1523 Mon Sep 17 00:00:00 2001 From: roxana Date: Mon, 24 Oct 2016 15:30:37 +0300 Subject: [PATCH 3/8] I've tweaked the tests a bit to handle daylight savings. --- .../disposition/DispositionServiceImpl.java | 2 +- .../disposition/MultipleSchedulesTest.java | 21 ++++++++++++------- 2 files changed, 14 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 6e258baba3..297455098a 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 @@ -280,7 +280,7 @@ public class DispositionServiceImpl extends ServiceBaseImpl { DispositionSchedule originDispositionSchedule = getOriginDispositionSchedule(nodeRef); // if the initial disposition schedule of the record is folder based - if (originDispositionSchedule!= null && + if (originDispositionSchedule == null || isNotTrue(originDispositionSchedule.isRecordLevelDisposition())) { return null; 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 f97a7fee3a..f166c97a1f 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 @@ -3,11 +3,10 @@ package org.alfresco.module.org_alfresco_module_rm.test.integration.disposition; import static org.alfresco.module.org_alfresco_module_rm.test.util.bdt.BehaviourTest.test; import java.io.Serializable; +import java.util.Calendar; import java.util.Date; import java.util.Map; -import com.google.common.collect.ImmutableMap; - import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.action.impl.CutOffAction; import org.alfresco.module.org_alfresco_module_rm.action.impl.DestroyAction; @@ -21,6 +20,8 @@ import org.alfresco.service.namespace.QName; import org.alfresco.util.ApplicationContextHelper; import org.springframework.extensions.webscripts.GUID; +import com.google.common.collect.ImmutableMap; + public class MultipleSchedulesTest extends BaseRMTestCase { /** A unique prefix for the constants in this test. */ @@ -118,6 +119,7 @@ public class MultipleSchedulesTest extends BaseRMTestCase */ public void testLinkedToLongerSchedule() { + Calendar calendar = Calendar.getInstance(); test() .given(() -> { setUpFilePlan(); @@ -130,11 +132,12 @@ public class MultipleSchedulesTest extends BaseRMTestCase dispositionService.cutoffDisposableItem(record); // Ensure the update has been applied to the record. internalDispositionService.updateNextDispositionAction(record); + calendar.setTime((Date) nodeService.getProperty(record, PROP_CUT_OFF_DATE)); + calendar.add(Calendar.WEEK_OF_YEAR, 1); }) .then() - .expect(7 * 24 * 60 * 60 * 1000L) - .from(() -> dispositionService.getNextDispositionAction(record).getAsOfDate().getTime() - - ((Date) nodeService.getProperty(record, PROP_CUT_OFF_DATE)).getTime()) + .expect(calendar.getTime()) + .from(() -> dispositionService.getNextDispositionAction(record).getAsOfDate()) .because("Record should follow largest rentention schedule period, which is one week."); } @@ -149,6 +152,7 @@ public class MultipleSchedulesTest extends BaseRMTestCase */ public void testLinkedToShorterSchedule() { + Calendar calendar = Calendar.getInstance(); test() .given(() -> { setUpFilePlan(); @@ -161,11 +165,12 @@ public class MultipleSchedulesTest extends BaseRMTestCase dispositionService.cutoffDisposableItem(record); // Ensure the update has been applied to the record. internalDispositionService.updateNextDispositionAction(record); + calendar.setTime((Date) nodeService.getProperty(record, PROP_CUT_OFF_DATE)); + calendar.add(Calendar.WEEK_OF_YEAR, 1); }) .then() - .expect(7 * 24 * 60 * 60 * 1000L) - .from(() -> dispositionService.getNextDispositionAction(record).getAsOfDate().getTime() - - ((Date) nodeService.getProperty(record, PROP_CUT_OFF_DATE)).getTime()) + .expect(calendar.getTime()) + .from(() -> dispositionService.getNextDispositionAction(record).getAsOfDate()) .because("Record should follow largest rentention schedule period, which is one week."); } } From 86d3705362337090564aa8eb0736fe17ff0b92b0 Mon Sep 17 00:00:00 2001 From: Mihai Cozma Date: Mon, 24 Oct 2016 18:07:07 +0300 Subject: [PATCH 4/8] RM-1039_Delete_duplicate_test --- .../integration/issue/IssueTestSuite.java | 1 - .../test/integration/issue/RM1039Test.java | 186 ------------------ .../recordfolder/MoveRecordFolderTest.java | 11 +- 3 files changed, 8 insertions(+), 190 deletions(-) delete mode 100644 rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/RM1039Test.java diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/IssueTestSuite.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/IssueTestSuite.java index 5e5dd27b0a..30ff940467 100755 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/IssueTestSuite.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/IssueTestSuite.java @@ -42,7 +42,6 @@ import org.junit.runners.Suite.SuiteClasses; RM452Test.class, RM804Test.class, RM994Test.class, - RM1039Test.class, RM1799Test.class, RM1814Test.class, RM978Test.class, diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/RM1039Test.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/RM1039Test.java deleted file mode 100644 index 8ef86eef6e..0000000000 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/RM1039Test.java +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Copyright (C) 2005-2013 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.test.integration.issue; - -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; - -import net.sf.acegisecurity.vote.AccessDecisionVoter; - -import org.alfresco.model.ContentModel; -import org.alfresco.module.org_alfresco_module_rm.action.impl.CompleteEventAction; -import org.alfresco.module.org_alfresco_module_rm.action.impl.CutOffAction; -import org.alfresco.module.org_alfresco_module_rm.capability.Capability; -import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionAction; -import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase; -import org.alfresco.module.org_alfresco_module_rm.test.util.CommonRMTestUtils; -import org.alfresco.service.cmr.repository.NodeRef; - - -/** - * Unit test for RM-1039 ... can't move a folder into a category with a disposition schedule - * - * @author Roy Wetherall - * @since 2.1 - */ -public class RM1039Test extends BaseRMTestCase -{ - @Override - protected boolean isRecordTest() - { - return true; - } - - // try and move a folder from no disposition schedule to a disposition schedule - public void testMoveRecordFolderFromNoDisToDis() throws Exception - { - final NodeRef recordFolder = doTestInTransaction(new Test() - { - @Override - public NodeRef run() - { - // create a record category (no disposition schedule) - NodeRef recordCategory = filePlanService.createRecordCategory(filePlan, "Caitlin Reed"); - - // create a record folder - return recordFolderService.createRecordFolder(recordCategory, "Grace Wetherall"); - } - - @Override - public void test(NodeRef result) throws Exception - { - assertNotNull(result); - assertNull(dispositionService.getDispositionSchedule(result)); - assertFalse(nodeService.hasAspect(result, ASPECT_DISPOSITION_LIFECYCLE)); - } - }); - - final NodeRef record = doTestInTransaction(new Test() - { - @Override - public NodeRef run() - { - // create a record - return fileFolderService.create(recordFolder, "mytest.txt", ContentModel.TYPE_CONTENT).getNodeRef(); - } - - @Override - public void test(NodeRef result) throws Exception - { - assertNotNull(result); - assertNull(dispositionService.getDispositionSchedule(result)); - assertFalse(nodeService.hasAspect(result, ASPECT_DISPOSITION_LIFECYCLE)); - } - }); - - doTestInTransaction(new Test() - { - @Override - public NodeRef run() throws Exception - { - Capability capability = capabilityService.getCapability("CreateModifyDestroyFolders"); - assertEquals(AccessDecisionVoter.ACCESS_GRANTED, capability.evaluate(recordFolder)); - assertEquals(AccessDecisionVoter.ACCESS_GRANTED, capability.evaluate(recordFolder, rmContainer)); - - // take a look at the move capability - Capability moveCapability = capabilityService.getCapability("Move"); - assertEquals(AccessDecisionVoter.ACCESS_GRANTED, moveCapability.evaluate(recordFolder, rmContainer)); - - // move the node - return fileFolderService.move(recordFolder, rmContainer, null).getNodeRef(); - } - - @Override - public void test(NodeRef result) throws Exception - { - assertNotNull(result); - assertNotNull(dispositionService.getDispositionSchedule(result)); - assertTrue(nodeService.hasAspect(result, ASPECT_DISPOSITION_LIFECYCLE)); - - DispositionAction dispositionAction = dispositionService.getNextDispositionAction(result); - assertNotNull(dispositionAction); - - assertNull(dispositionAction.getAsOfDate()); - assertEquals("cutoff", dispositionAction.getName()); - assertEquals(1, dispositionAction.getEventCompletionDetails().size()); - - // take a look at the record and check things are as we would expect - assertFalse(nodeService.hasAspect(record, ASPECT_DISPOSITION_LIFECYCLE)); - } - }); - } - - // move from a disposition schedule to another .. both record folder level - - // move from a disposition schedule to another .. from record to folder level - - - // try and move a cutoff folder - public void testMoveCutoffRecordFolder() throws Exception - { - final NodeRef destination = doTestInTransaction(new Test() - { - @Override - public NodeRef run() - { - // create a record category (no disposition schedule) - return filePlanService.createRecordCategory(filePlan, "Caitlin Reed"); - } - }); - - final NodeRef testFolder = doTestInTransaction(new Test() - { - @Override - public NodeRef run() - { - // create folder - NodeRef testFolder = recordFolderService.createRecordFolder(rmContainer, "Peter Edward Francis"); - - // complete event - Map params = new HashMap(1); - params.put(CompleteEventAction.PARAM_EVENT_NAME, CommonRMTestUtils.DEFAULT_EVENT_NAME); - rmActionService.executeRecordsManagementAction(testFolder, CompleteEventAction.NAME, params); - - // cutoff folder - rmActionService.executeRecordsManagementAction(testFolder, CutOffAction.NAME); - - return testFolder; - } - - @Override - public void test(NodeRef result) throws Exception - { - // take a look at the move capability - Capability moveCapability = capabilityService.getCapability("Move"); - assertEquals(AccessDecisionVoter.ACCESS_DENIED, moveCapability.evaluate(result, destination)); - - } - }); - - doTestInTransaction(new FailureTest() - { - @Override - public void run() throws Exception - { - fileFolderService.move(testFolder, destination, null).getNodeRef(); - } - }); - } -} diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/recordfolder/MoveRecordFolderTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/recordfolder/MoveRecordFolderTest.java index d8ecd511ed..9389be47b4 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/recordfolder/MoveRecordFolderTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/recordfolder/MoveRecordFolderTest.java @@ -384,9 +384,14 @@ public class MoveRecordFolderTest extends BaseRMTestCase } }); } - - - // try and move a cutoff folder + + /** + * Try to move from a disposition schedule to another .. both record folder level + * Try to move from a disposition schedule to another .. from record to folder level + * Try and move a cutoff folder + * + * @see https://issues.alfresco.com/jira/browse/RM-1039 + */ public void testMoveCutoffRecordFolder() throws Exception { final NodeRef destination = doTestInTransaction(new Test() From fd3cf70a70475515436cc707afaac4b46184db9d Mon Sep 17 00:00:00 2001 From: Tom Page Date: Mon, 24 Oct 2016 16:39:50 +0100 Subject: [PATCH 5/8] Remove unwanted javadoc comments. --- .../test/integration/recordfolder/MoveRecordFolderTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/recordfolder/MoveRecordFolderTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/recordfolder/MoveRecordFolderTest.java index 9389be47b4..328a31b5e6 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/recordfolder/MoveRecordFolderTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/recordfolder/MoveRecordFolderTest.java @@ -386,8 +386,6 @@ public class MoveRecordFolderTest extends BaseRMTestCase } /** - * Try to move from a disposition schedule to another .. both record folder level - * Try to move from a disposition schedule to another .. from record to folder level * Try and move a cutoff folder * * @see https://issues.alfresco.com/jira/browse/RM-1039 From 20d2bfb7d697d0cdc1178c2cf98c6597021c4668 Mon Sep 17 00:00:00 2001 From: roxana Date: Tue, 25 Oct 2016 15:51:39 +0300 Subject: [PATCH 6/8] Run as system when getting disposition schedule for a record. --- .../disposition/DispositionServiceImpl.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) 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 297455098a..3a6e1d5beb 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 @@ -278,7 +278,15 @@ public class DispositionServiceImpl extends ServiceBaseImpl NodeRef dsNodeRef = null; if (isRecord(nodeRef)) { - DispositionSchedule originDispositionSchedule = getOriginDispositionSchedule(nodeRef); + // calculate disposition schedule without taking into account the user + DispositionSchedule originDispositionSchedule = AuthenticationUtil.runAsSystem(new RunAsWork() + { + @Override + public DispositionSchedule doWork() + { + return getOriginDispositionSchedule(nodeRef); + } + }); // if the initial disposition schedule of the record is folder based if (originDispositionSchedule == null || isNotTrue(originDispositionSchedule.isRecordLevelDisposition())) From 7e105f40f9f1b4c9a252c2463762a8a84c8235ba Mon Sep 17 00:00:00 2001 From: Tom Page Date: Thu, 27 Oct 2016 12:30:05 +0100 Subject: [PATCH 7/8] Update version to 2.3.2-SNAPSHOT. --- pom.xml | 2 +- rm-automation/pom.xml | 2 +- rm-server/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 7d56dd2c18..70593388a6 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.alfresco alfresco-rm-parent pom - 2.3.1-SNAPSHOT + 2.3.2-SNAPSHOT Alfresco Records Management http://www.alfresco.org/ diff --git a/rm-automation/pom.xml b/rm-automation/pom.xml index e88c8062f1..02900fdb16 100644 --- a/rm-automation/pom.xml +++ b/rm-automation/pom.xml @@ -8,7 +8,7 @@ org.alfresco alfresco-rm-parent - 2.3.1-SNAPSHOT + 2.3.2-SNAPSHOT diff --git a/rm-server/pom.xml b/rm-server/pom.xml index 7d347cf2a7..8803399995 100644 --- a/rm-server/pom.xml +++ b/rm-server/pom.xml @@ -5,7 +5,7 @@ org.alfresco alfresco-rm-parent - 2.3.1-SNAPSHOT + 2.3.2-SNAPSHOT 4.0.0 alfresco-rm-server From 18e5d469a6bd4174a106f95e0c57002429cb3479 Mon Sep 17 00:00:00 2001 From: Ana Bozianu Date: Thu, 13 Oct 2016 15:29:12 +0300 Subject: [PATCH 8/8] fixed "get pending reviews" solr query (cherry picked from commit 798b76a8ed1e4f07737edddd3a7b399f478d318f) --- .../job/NotifyOfRecordsDueForReviewJobExecuter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/job/NotifyOfRecordsDueForReviewJobExecuter.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/job/NotifyOfRecordsDueForReviewJobExecuter.java index 4a7ad4b735..37b8d46324 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/job/NotifyOfRecordsDueForReviewJobExecuter.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/job/NotifyOfRecordsDueForReviewJobExecuter.java @@ -92,8 +92,8 @@ public class NotifyOfRecordsDueForReviewJobExecuter extends RecordsManagementJob // notification has not been sent. StringBuilder queryBuffer = new StringBuilder(); queryBuffer.append("+ASPECT:\"rma:vitalRecord\" "); - queryBuffer.append("+(@rma\\:reviewAsOf:[MIN TO NOW] ) "); - queryBuffer.append("+( "); + queryBuffer.append("AND @rma\\:reviewAsOf:[MIN TO NOW] "); + queryBuffer.append("AND ( "); queryBuffer.append("@rma\\:notificationIssued:false "); queryBuffer.append("OR ISNULL:\"rma:notificationIssued\" "); queryBuffer.append(") ");