From 73fc3ef789490f835558012e8d592c27076c8e57 Mon Sep 17 00:00:00 2001 From: Sara Aspery Date: Wed, 6 Nov 2019 23:20:28 +0000 Subject: [PATCH 1/8] RM-7028 Audit add to hold --- .../messages/audit-service.properties | 1 + .../rm-audit-context.xml | 7 ++ .../audit/event/AddToHoldAuditEvent.java | 83 +++++++++++++++++ .../hold/HoldServiceImpl.java | 5 - ...RecordsManagementAuditServiceImplTest.java | 59 ++++++++++++ .../test/util/BaseRMTestCase.java | 10 ++ .../event/AddToHoldAuditEventUnitTest.java | 92 +++++++++++++++++++ .../hold/HoldServiceImplUnitTest.java | 8 -- 8 files changed, 252 insertions(+), 13 deletions(-) create mode 100644 rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEvent.java create mode 100644 rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEventUnitTest.java diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/messages/audit-service.properties b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/messages/audit-service.properties index e2ce5dc332..da0adf2b30 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/messages/audit-service.properties +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/messages/audit-service.properties @@ -15,6 +15,7 @@ rm.audit.copyTo=Copy to rm.audit.fileTo=File to rm.audit.createHold=Create Hold rm.audit.deleteHold=Delete Hold +rm.audit.addToHold=Add To Hold rm.audit.audit-start=Audit Start rm.audit.audit-stop=Audit Stop rm.audit.audit-clear=Audit Clear diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-audit-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-audit-context.xml index 364feeb76e..aec074cf27 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-audit-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-audit-context.xml @@ -138,4 +138,11 @@ + + + + + + + diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEvent.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEvent.java new file mode 100644 index 0000000000..a0c073bda8 --- /dev/null +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEvent.java @@ -0,0 +1,83 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2019 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.audit.event; + +import org.alfresco.model.ContentModel; +import org.alfresco.module.org_alfresco_module_rm.hold.HoldServicePolicies; +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.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.namespace.QName; + +import java.io.Serializable; +import java.util.Map; + +import static org.alfresco.repo.policy.Behaviour.NotificationFrequency.TRANSACTION_COMMIT; + +/** + * Add to hold audit event. + * + * @author Sara Aspery + * @since 3.3 + */ +@BehaviourBean +public class AddToHoldAuditEvent extends AuditEvent implements HoldServicePolicies.OnAddToHoldPolicy +{ + /** Node Service */ + private NodeService nodeService; + + /** + * Sets the node service + * + * @param nodeService nodeService to set + */ + public void setNodeService(NodeService nodeService) + { + this.nodeService = nodeService; + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.hold.HoldServicePolicies.OnAddToHoldPolicy#onAddToHold(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.repository.NodeRef) + */ + @Override + @Behaviour + ( + kind = BehaviourKind.CLASS, + type = "rma:hold", + notificationFrequency = TRANSACTION_COMMIT + ) + public void onAddToHold(NodeRef holdNodeRef, NodeRef contentNodeRef) + { + Map auditProperties = HoldUtils.makePropertiesMap(holdNodeRef, nodeService); + auditProperties.put(ContentModel.PROP_NAME, nodeService.getProperty(contentNodeRef, ContentModel.PROP_NAME)); + + recordsManagementAuditService.auditEvent(contentNodeRef, getName(), null, auditProperties); + } +} 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 4b817cabc7..0b89575c22 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 @@ -100,7 +100,6 @@ public class HoldServiceImpl extends ServiceBaseImpl private static Log logger = LogFactory.getLog(HoldServiceImpl.class); /** Audit event keys */ - private static final String AUDIT_ADD_TO_HOLD = "addToHold"; private static final String AUDIT_REMOVE_FROM_HOLD = "removeFromHold"; /** I18N */ @@ -225,7 +224,6 @@ public class HoldServiceImpl extends ServiceBaseImpl @Override public Void doWork() throws Exception { - recordsManagementAuditService.registerAuditEvent(new AuditEvent(AUDIT_ADD_TO_HOLD, "capability.AddToHold.title")); recordsManagementAuditService.registerAuditEvent(new AuditEvent(AUDIT_REMOVE_FROM_HOLD, "capability.RemoveFromHold.title")); return null; } @@ -666,9 +664,6 @@ public class HoldServiceImpl extends ServiceBaseImpl transactionalResourceHelper.getSet("frozen").add(nodeRef); nodeService.addChild(hold, nodeRef, ASSOC_FROZEN_CONTENT, ASSOC_FROZEN_CONTENT); - // audit item being added to the hold - recordsManagementAuditService.auditEvent(nodeRef, AUDIT_ADD_TO_HOLD); - // Mark all the folders contents as frozen if (isRecordFolder(nodeRef)) { diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RecordsManagementAuditServiceImplTest.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RecordsManagementAuditServiceImplTest.java index 95e03ca779..5dc39d8af1 100644 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RecordsManagementAuditServiceImplTest.java +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RecordsManagementAuditServiceImplTest.java @@ -676,6 +676,65 @@ public class RecordsManagementAuditServiceImplTest extends BaseRMTestCase }); } + /** + * Given I have added an item a hold + * When I will get the RM audit filter by add to hold event + * Then there will be an entry for the item added to the hold, including both the item name and hold name + */ + @org.junit.Test + public void testAuditForAddContentToHold() + { + doBehaviourDrivenTest(new BehaviourDrivenTest() + { + final static String ADD_TO_HOLD_AUDIT_EVENT = "Add To Hold"; + + String holdName = "Hold " + GUID.generate(); + NodeRef hold; + + NodeRef content; + + Map auditEventProperties; + + @Override + public void given() + { + rmAuditService.clearAuditLog(filePlan); + + hold = createHold(holdName, "Reason " + GUID.generate()); + content = utils.createRecord(rmFolder, "Record " + GUID.generate() + ".txt"); + + addContentToHold(hold, content); + } + + @Override + public void when() + { + auditEventProperties = getAuditEntry(ADD_TO_HOLD_AUDIT_EVENT).getAfterProperties(); + } + + @Override + public void then() + { + // check add to hold audit event includes the hold name + assertEquals("Add To Hold event does not include hold name.", holdName, + auditEventProperties.get(HOLD_NAME)); + + // check add to hold audit event includes the content name + String contentName = (String) nodeService.getProperty(content, PROP_NAME); + assertEquals("Add To Hold event does not include content name.", contentName, + auditEventProperties.get(PROP_NAME)); + } + + @Override + public void after() + { + // Stop and delete all entries + rmAuditService.stopAuditLog(filePlan); + rmAuditService.clearAuditLog(filePlan); + } + }); + } + /** === Helper methods === */ private List getAuditTrail(String asUser) diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java index b6a1eb03f3..a8b931f1a3 100644 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java @@ -729,6 +729,16 @@ public abstract class BaseRMTestCase extends RetryingTransactionHelperTestCase holdService.deleteHold(nodeRef); } + /** + * Util method to add content to a hold. + * @param holdNodeRef hold node reference + * @param contentNodeRef content node reference + */ + protected void addContentToHold(NodeRef holdNodeRef, NodeRef contentNodeRef) + { + holdService.addToHold(holdNodeRef, contentNodeRef); + } + /** * Setup multi hierarchy test data */ diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEventUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEventUnitTest.java new file mode 100644 index 0000000000..ea9c1f92cd --- /dev/null +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEventUnitTest.java @@ -0,0 +1,92 @@ +/* + * #%L + * Alfresco Records Management Module + * %% + * Copyright (C) 2005 - 2019 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.audit.event; + +import org.alfresco.module.org_alfresco_module_rm.test.util.BaseUnitTest; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.util.GUID; +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import java.util.Map; + +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Matchers.isNull; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; + +/** + * Unit tests for {@link AddToHoldAuditEvent}. + * + * @author Sara Aspery + * @since 3.3 + */ +public class AddToHoldAuditEventUnitTest extends BaseUnitTest +{ + @InjectMocks + private AddToHoldAuditEvent addToHoldAuditEvent; + + @Mock + private NodeService mockedNodeService; + + private NodeRef holdNodeRef; + private NodeRef contentNodeRef; + + /** Set up the mocks. */ + @Before + public void setUp() + { + initMocks(this); + + holdNodeRef = generateNodeRef(); + String holdName = "Hold " + GUID.generate(); + + contentNodeRef = generateNodeRef(); + String contentName = "Content " + GUID.generate(); + + when(mockedNodeService.getProperty(holdNodeRef, PROP_NAME)).thenReturn(holdName); + when(mockedNodeService.getProperty(contentNodeRef, PROP_NAME)).thenReturn(contentName); + } + + /** + * Check that the add to hold event calls an audit event. + * + */ + @Test + public void testAddToHoldCausesAuditEvent() + { + addToHoldAuditEvent.onAddToHold(holdNodeRef, contentNodeRef); + verify(mockedRecordsManagementAuditService, times(1)).auditEvent(eq(contentNodeRef), any(String.class), isNull(Map.class), any(Map.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 55de14c20d..fdcede7805 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 @@ -346,18 +346,15 @@ public class HoldServiceImplUnitTest extends BaseUnitTest verify(mockedNodeService).addChild(hold, recordFolder, ASSOC_FROZEN_CONTENT, ASSOC_FROZEN_CONTENT); verify(mockedNodeService).addAspect(eq(recordFolder), eq(ASPECT_FROZEN), any(Map.class)); verify(mockedNodeService).addAspect(eq(record), eq(ASPECT_FROZEN), any(Map.class)); - verify(mockedRecordsManagementAuditService).auditEvent(eq(recordFolder), anyString()); holdService.addToHold(hold, record); verify(mockedNodeService).addChild(hold, record, ASSOC_FROZEN_CONTENT, ASSOC_FROZEN_CONTENT); verify(mockedNodeService).addAspect(eq(recordFolder), eq(ASPECT_FROZEN), any(Map.class)); verify(mockedNodeService, times(2)).addAspect(eq(record), eq(ASPECT_FROZEN), any(Map.class)); - verify(mockedRecordsManagementAuditService).auditEvent(eq(record), anyString()); holdService.addToHold(hold, activeContent); verify(mockedNodeService).addChild(hold, activeContent, ASSOC_FROZEN_CONTENT, ASSOC_FROZEN_CONTENT); verify(mockedNodeService).addAspect(eq(activeContent), eq(ASPECT_FROZEN), any(Map.class)); - verify(mockedRecordsManagementAuditService).auditEvent(eq(activeContent), anyString()); } @SuppressWarnings("unchecked") @@ -371,13 +368,11 @@ public class HoldServiceImplUnitTest extends BaseUnitTest verify(mockedNodeService, never()).addChild(hold, recordFolder, ASSOC_FROZEN_CONTENT, ASSOC_FROZEN_CONTENT); verify(mockedNodeService, never()).addAspect(eq(recordFolder), eq(ASPECT_FROZEN), any(Map.class)); verify(mockedNodeService, never()).addAspect(eq(record), eq(ASPECT_FROZEN), any(Map.class)); - verify(mockedRecordsManagementAuditService, never()).auditEvent(eq(recordFolder), anyString()); holdService.addToHold(hold, activeContent); verify(mockedNodeService, never()).addChild(hold, activeContent, ASSOC_FROZEN_CONTENT, ASSOC_FROZEN_CONTENT); verify(mockedNodeService, never()).addAspect(eq(activeContent), eq(ASPECT_FROZEN), any(Map.class)); - verify(mockedRecordsManagementAuditService, never()).auditEvent(eq(activeContent), anyString()); } @SuppressWarnings("unchecked") @@ -395,12 +390,10 @@ public class HoldServiceImplUnitTest extends BaseUnitTest verify(mockedNodeService).addChild(hold, recordFolder, ASSOC_FROZEN_CONTENT, ASSOC_FROZEN_CONTENT); verify(mockedNodeService, never()).addAspect(eq(recordFolder), eq(ASPECT_FROZEN), any(Map.class)); verify(mockedNodeService, never()).addAspect(eq(record), eq(ASPECT_FROZEN), any(Map.class)); - verify(mockedRecordsManagementAuditService).auditEvent(eq(recordFolder), anyString()); holdService.addToHold(hold, activeContent); verify(mockedNodeService).addChild(hold, activeContent, ASSOC_FROZEN_CONTENT, ASSOC_FROZEN_CONTENT); verify(mockedNodeService, never()).addAspect(eq(activeContent), eq(ASPECT_FROZEN), any(Map.class)); - verify(mockedRecordsManagementAuditService).auditEvent(eq(activeContent), anyString()); } @Test (expected = AccessDeniedException.class) @@ -466,7 +459,6 @@ public class HoldServiceImplUnitTest extends BaseUnitTest verify(mockedNodeService, times(1)).addChild(hold2, recordFolder, ASSOC_FROZEN_CONTENT, ASSOC_FROZEN_CONTENT); verify(mockedNodeService, times(1)).addAspect(eq(recordFolder), eq(ASPECT_FROZEN), any(Map.class)); verify(mockedNodeService, times(1)).addAspect(eq(record), eq(ASPECT_FROZEN), any(Map.class)); - verify(mockedRecordsManagementAuditService, times(2)).auditEvent(eq(recordFolder), anyString()); } @Test (expected = IntegrityException.class) From 2888c6dd10f6c980c6abf1749366a9ba2265bf77 Mon Sep 17 00:00:00 2001 From: Sara Aspery Date: Fri, 8 Nov 2019 08:35:50 +0000 Subject: [PATCH 2/8] RM-7028 fix integration tests --- .../test/integration/hold/DeleteHoldTest.java | 62 +++++++++++-------- 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/DeleteHoldTest.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/DeleteHoldTest.java index fdf3c0367e..671aa3d239 100644 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/DeleteHoldTest.java +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/hold/DeleteHoldTest.java @@ -109,7 +109,11 @@ public class DeleteHoldTest extends BaseRMTestCase implements BeforeDeleteHoldPo public NodeRef run() throws Exception { // create test holds - return createAndCheckHold(); + NodeRef newHold = createAndCheckHold(); + // add the record folder to hold1 + holdService.addToHold(newHold, rmFolder); + + return newHold; } }); //Splitting transaction to fix onCreateNodePolicy issue where there was a node not found exception @@ -118,9 +122,6 @@ public class DeleteHoldTest extends BaseRMTestCase implements BeforeDeleteHoldPo @Override public Void run() throws Exception { - // add the record folder to hold1 - holdService.addToHold(hold1, rmFolder); - // assert that the folder and records are frozen assertTrue(freezeService.isFrozen(rmFolder)); assertTrue(freezeService.isFrozen(recordOne)); @@ -162,33 +163,44 @@ public class DeleteHoldTest extends BaseRMTestCase implements BeforeDeleteHoldPo //Splitting transaction to fix onCreateNodePolicy issue where there was a node not found exception doTestInTransaction(new Test() { - @Override - public Void run() throws Exception - { - NodeRef hold1 = holds.get(0); - NodeRef hold2 = holds.get(1); + @Override + public Void run() throws Exception + { + NodeRef hold1 = holds.get(0); + NodeRef hold2 = holds.get(1); - // add the record folder to hold1 - holdService.addToHold(hold1, rmFolder); + // add the record folder to hold1 + holdService.addToHold(hold1, rmFolder); - // assert that the folder and records are frozen - assertTrue(freezeService.isFrozen(rmFolder)); - assertTrue(freezeService.isFrozen(recordOne)); - assertTrue(freezeService.isFrozen(recordDeclaredOne)); + // assert that the folder and records are frozen + assertTrue(freezeService.isFrozen(rmFolder)); + assertTrue(freezeService.isFrozen(recordOne)); + assertTrue(freezeService.isFrozen(recordDeclaredOne)); - // check the contents of the hold - List frozenNodes = holdService.getHeld(hold1); - assertNotNull(frozenNodes); - assertEquals(1, frozenNodes.size()); - assertEquals(rmFolder, frozenNodes.get(0)); + // check the contents of the hold + List frozenNodes = holdService.getHeld(hold1); + assertNotNull(frozenNodes); + assertEquals(1, frozenNodes.size()); + assertEquals(rmFolder, frozenNodes.get(0)); - holdService.addToHold(hold2, recordOne); + holdService.addToHold(hold2, recordOne); - // assert that the folder and records are frozen - assertTrue(freezeService.isFrozen(rmFolder)); - assertTrue(freezeService.isFrozen(recordOne)); - assertTrue(freezeService.isFrozen(recordDeclaredOne)); + // assert that the folder and records are frozen + assertTrue(freezeService.isFrozen(rmFolder)); + assertTrue(freezeService.isFrozen(recordOne)); + assertTrue(freezeService.isFrozen(recordDeclaredOne)); + return null; + } + }); + + doTestInTransaction(new Test() + { + @Override + public Void run() throws Exception + { + NodeRef hold1 = holds.get(0); + NodeRef hold2 = holds.get(1); // delete the hold holdService.deleteHold(hold1); From e4992a0c484f0685efa417fc4802a3358584212f Mon Sep 17 00:00:00 2001 From: Sara Aspery Date: Tue, 12 Nov 2019 05:13:40 +0000 Subject: [PATCH 3/8] RM-7028 show location and fix multiple holds --- .../rm-audit-context.xml | 2 + .../audit/event/AddToHoldAuditEvent.java | 3 +- .../FilePlanNamePathDataExtractor.java | 37 +++++++++++++++++-- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-audit-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-audit-context.xml index aec074cf27..a2860e03de 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-audit-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-audit-context.xml @@ -19,6 +19,8 @@ + + diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEvent.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEvent.java index a0c073bda8..cdb3fd4607 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEvent.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEvent.java @@ -39,6 +39,7 @@ import org.alfresco.service.namespace.QName; import java.io.Serializable; import java.util.Map; +import static org.alfresco.module.org_alfresco_module_rm.audit.event.HoldUtils.HOLD_NAME; import static org.alfresco.repo.policy.Behaviour.NotificationFrequency.TRANSACTION_COMMIT; /** @@ -78,6 +79,6 @@ public class AddToHoldAuditEvent extends AuditEvent implements HoldServicePolici Map auditProperties = HoldUtils.makePropertiesMap(holdNodeRef, nodeService); auditProperties.put(ContentModel.PROP_NAME, nodeService.getProperty(contentNodeRef, ContentModel.PROP_NAME)); - recordsManagementAuditService.auditEvent(contentNodeRef, getName(), null, auditProperties); + recordsManagementAuditService.auditEvent(contentNodeRef, getName(), null, auditProperties, true, false); } } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/extractor/FilePlanNamePathDataExtractor.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/extractor/FilePlanNamePathDataExtractor.java index 67e6bd68fc..00c144cc6e 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/extractor/FilePlanNamePathDataExtractor.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/extractor/FilePlanNamePathDataExtractor.java @@ -33,11 +33,14 @@ import java.util.Objects; import org.alfresco.model.ContentModel; 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.repo.audit.extractor.AbstractDataExtractor; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.cmr.repository.Path; import org.alfresco.service.cmr.rule.RuleService; +import org.alfresco.service.cmr.security.PermissionService; /** * An extractor that extracts the cm:name path from the RM root down to @@ -54,6 +57,8 @@ public final class FilePlanNamePathDataExtractor extends AbstractDataExtractor private NodeService nodeService; private FilePlanService filePlanService; private RuleService ruleService; + private PermissionService permissionService; + private FreezeService freezeService; /** * Used to check that the node in the context is a fileplan component @@ -80,8 +85,24 @@ public final class FilePlanNamePathDataExtractor extends AbstractDataExtractor } /** - * @return Returns true if the data is a NodeRef and it represents - * a fileplan component + * @param permissionService permission service + */ + public void setPermissionService(PermissionService permissionService) + { + this.permissionService = permissionService; + } + + /** + * @param freezeService freeze service + */ + public void setFreezeService(FreezeService freezeService) + { + this.freezeService = freezeService; + } + + /** + * @return Returns true if the data is a NodeRef and it either represents + * a fileplan component or is frozen */ public boolean isSupported(Serializable data) { @@ -89,7 +110,8 @@ public final class FilePlanNamePathDataExtractor extends AbstractDataExtractor { return false; } - return nodeService.hasAspect((NodeRef)data, RecordsManagementModel.ASPECT_FILE_PLAN_COMPONENT); + return nodeService.hasAspect((NodeRef)data, RecordsManagementModel.ASPECT_FILE_PLAN_COMPONENT) || + freezeService.isFrozen((NodeRef) data); } /** @@ -116,6 +138,15 @@ public final class FilePlanNamePathDataExtractor extends AbstractDataExtractor sb.append("/").append(name); } } + else if (freezeService.isFrozen(nodeRef)) + { + // Get path from the DM root + Path nodeRefPath = nodeService.getPath(nodeRef); + sb.append(nodeRefPath.toDisplayPath(nodeService, permissionService)); + // Get node name + String name = (String)nodeService.getProperty(nodeRef, ContentModel.PROP_NAME); + sb.append("/").append(name); + } // Done extractedData = sb.toString(); From 5f04257c5635d79bed1d0dda1955a712b762e5aa Mon Sep 17 00:00:00 2001 From: Sara Aspery Date: Tue, 12 Nov 2019 12:11:34 +0000 Subject: [PATCH 4/8] RM-7028 fix unit test --- .../audit/event/AddToHoldAuditEventUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEventUnitTest.java b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEventUnitTest.java index ea9c1f92cd..334cf13fcd 100644 --- a/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEventUnitTest.java +++ b/rm-community/rm-community-repo/unit-test/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEventUnitTest.java @@ -87,6 +87,6 @@ public class AddToHoldAuditEventUnitTest extends BaseUnitTest public void testAddToHoldCausesAuditEvent() { addToHoldAuditEvent.onAddToHold(holdNodeRef, contentNodeRef); - verify(mockedRecordsManagementAuditService, times(1)).auditEvent(eq(contentNodeRef), any(String.class), isNull(Map.class), any(Map.class)); + verify(mockedRecordsManagementAuditService, times(1)).auditEvent(eq(contentNodeRef), any(String.class), isNull(Map.class), any(Map.class), eq(true), eq(false)); } } From f4e5a3ecd520ff0fd332fcfa5d4e29792aa30d57 Mon Sep 17 00:00:00 2001 From: Sara Aspery Date: Sat, 16 Nov 2019 14:11:06 +0000 Subject: [PATCH 5/8] RM-7028 integ test fix, locn refactor, multi files fix --- .../rm-audit-context.xml | 4 +- .../audit/event/AddToHoldAuditEvent.java | 3 +- ...ractor.java => NamePathDataExtractor.java} | 35 ++--- ...RecordsManagementAuditServiceImplTest.java | 128 +++++++++--------- .../test/util/BaseRMTestCase.java | 32 ----- .../test/util/CommonRMTestUtils.java | 35 +++++ 6 files changed, 122 insertions(+), 115 deletions(-) rename rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/extractor/{FilePlanNamePathDataExtractor.java => NamePathDataExtractor.java} (85%) diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-audit-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-audit-context.xml index a2860e03de..be43164702 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-audit-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-audit-context.xml @@ -14,13 +14,13 @@ - + - + diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEvent.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEvent.java index cdb3fd4607..9aa9a0cae1 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEvent.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEvent.java @@ -40,6 +40,7 @@ import java.io.Serializable; import java.util.Map; import static org.alfresco.module.org_alfresco_module_rm.audit.event.HoldUtils.HOLD_NAME; +import static org.alfresco.repo.policy.Behaviour.NotificationFrequency.EVERY_EVENT; import static org.alfresco.repo.policy.Behaviour.NotificationFrequency.TRANSACTION_COMMIT; /** @@ -72,7 +73,7 @@ public class AddToHoldAuditEvent extends AuditEvent implements HoldServicePolici ( kind = BehaviourKind.CLASS, type = "rma:hold", - notificationFrequency = TRANSACTION_COMMIT + notificationFrequency = EVERY_EVENT ) public void onAddToHold(NodeRef holdNodeRef, NodeRef contentNodeRef) { diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/extractor/FilePlanNamePathDataExtractor.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/extractor/NamePathDataExtractor.java similarity index 85% rename from rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/extractor/FilePlanNamePathDataExtractor.java rename to rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/extractor/NamePathDataExtractor.java index 00c144cc6e..b4bcd5a6b3 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/extractor/FilePlanNamePathDataExtractor.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/extractor/NamePathDataExtractor.java @@ -33,9 +33,9 @@ import java.util.Objects; import org.alfresco.model.ContentModel; 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.repo.audit.extractor.AbstractDataExtractor; +import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.Path; @@ -45,20 +45,21 @@ import org.alfresco.service.cmr.security.PermissionService; /** * An extractor that extracts the cm:name path from the RM root down to * - and including - the node's own name. This will only extract data if the - * node is a {@link RecordsManagementModel#ASPECT_FILE_PLAN_COMPONENT fileplan component}. + * node is a {@link RecordsManagementModel#ASPECT_FILE_PLAN_COMPONENT fileplan component} + * or is a subtype of content. * * @see FilePlanService#getNodeRefPath(NodeRef) * * @author Derek Hulley * @since 3.2 */ -public final class FilePlanNamePathDataExtractor extends AbstractDataExtractor +public final class NamePathDataExtractor extends AbstractDataExtractor { private NodeService nodeService; private FilePlanService filePlanService; private RuleService ruleService; private PermissionService permissionService; - private FreezeService freezeService; + private DictionaryService dictionaryService; /** * Used to check that the node in the context is a fileplan component @@ -73,8 +74,8 @@ public final class FilePlanNamePathDataExtractor extends AbstractDataExtractor */ public void setFilePlanService(FilePlanService filePlanService) { - this.filePlanService = filePlanService; - } + this.filePlanService = filePlanService; + } /** * @param ruleService the ruleService to set @@ -93,11 +94,11 @@ public final class FilePlanNamePathDataExtractor extends AbstractDataExtractor } /** - * @param freezeService freeze service + * @param dictionaryService dictionary service */ - public void setFreezeService(FreezeService freezeService) + public void setDictionaryService(DictionaryService dictionaryService) { - this.freezeService = freezeService; + this.dictionaryService = dictionaryService; } /** @@ -110,8 +111,9 @@ public final class FilePlanNamePathDataExtractor extends AbstractDataExtractor { return false; } + NodeRef nodeRef = (NodeRef) data; return nodeService.hasAspect((NodeRef)data, RecordsManagementModel.ASPECT_FILE_PLAN_COMPONENT) || - freezeService.isFrozen((NodeRef) data); + dictionaryService.isSubClass(nodeService.getType(nodeRef), ContentModel.TYPE_CONTENT); } /** @@ -119,26 +121,26 @@ public final class FilePlanNamePathDataExtractor extends AbstractDataExtractor */ public Serializable extractData(Serializable value) { - String extractedData = null; + String extractedData; ruleService.disableRules(); try { NodeRef nodeRef = (NodeRef) value; StringBuilder sb = new StringBuilder(128); - + if (nodeService.hasAspect(nodeRef, RecordsManagementModel.ASPECT_FILE_PLAN_COMPONENT)) { // Get path from the RM root List nodeRefPath = filePlanService.getNodeRefPath(nodeRef); - + for (NodeRef pathNodeRef : nodeRefPath) { String name = (String)nodeService.getProperty(pathNodeRef, ContentModel.PROP_NAME); sb.append("/").append(name); } } - else if (freezeService.isFrozen(nodeRef)) + else if (dictionaryService.isSubClass(nodeService.getType(nodeRef), ContentModel.TYPE_CONTENT)) { // Get path from the DM root Path nodeRefPath = nodeService.getPath(nodeRef); @@ -174,9 +176,9 @@ public final class FilePlanNamePathDataExtractor extends AbstractDataExtractor { return false; } - FilePlanNamePathDataExtractor that = (FilePlanNamePathDataExtractor) o; + NamePathDataExtractor that = (NamePathDataExtractor) o; return Objects.equals(nodeService, that.nodeService) && Objects.equals(filePlanService, that.filePlanService) - && Objects.equals(ruleService, that.ruleService); + && Objects.equals(ruleService, that.ruleService); } @Override @@ -185,3 +187,4 @@ public final class FilePlanNamePathDataExtractor extends AbstractDataExtractor return Objects.hash(nodeService, filePlanService, ruleService); } } + diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RecordsManagementAuditServiceImplTest.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RecordsManagementAuditServiceImplTest.java index 5dc39d8af1..532d3f6d98 100644 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RecordsManagementAuditServiceImplTest.java +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/RecordsManagementAuditServiceImplTest.java @@ -62,7 +62,7 @@ public class RecordsManagementAuditServiceImplTest extends BaseRMTestCase implements RMPermissionModel { /** A QName to display for the hold name. */ - public static final QName HOLD_NAME = QName.createQName(RecordsManagementModel.RM_URI, "Hold Name"); + private static final QName HOLD_NAME = QName.createQName(RecordsManagementModel.RM_URI, "Hold Name"); /** Test record */ private NodeRef record; @@ -108,6 +108,15 @@ public class RecordsManagementAuditServiceImplTest extends BaseRMTestCase return true; } + /** + * @see org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase#isCollaborationSiteTest() + */ + @Override + protected boolean isCollaborationSiteTest() + { + return true; + } + /** * @see org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase#setupTestDataImpl() */ @@ -574,61 +583,11 @@ public class RecordsManagementAuditServiceImplTest extends BaseRMTestCase }); } - /** - * Given I have created a hold - * When I delete the hold and get the RM audit filter by delete hold event - * Then there will be an entry for the deleted hold, including the hold name - */ - @org.junit.Test - public void testAuditForDeleteHold() - { - doBehaviourDrivenTest(new BehaviourDrivenTest() - { - final static String DELETE_HOLD_AUDIT_EVENT = "Delete Hold"; - - String holdName = "Hold " + GUID.generate(); - - NodeRef hold; - Map auditEventProperties; - - @Override - public void given() - { - rmAuditService.clearAuditLog(filePlan); - hold = createHold(holdName, "Reason " + GUID.generate()); - } - - @Override - public void when() - { - deleteHold(hold); - auditEventProperties = getAuditEntry(DELETE_HOLD_AUDIT_EVENT).getBeforeProperties(); - } - - @Override - public void then() - { - // check delete hold audit event includes the hold name - assertEquals("Delete Hold event does not include hold name.", holdName, - auditEventProperties.get(HOLD_NAME)); - } - - @Override - public void after() - { - // Stop and delete all entries - rmAuditService.stopAuditLog(filePlan); - rmAuditService.clearAuditLog(filePlan); - } - }); - } - /** * Given I have created a hold * When I will get the RM audit filter by create hold event * Then there will be an entry for the created hold, including the hold name and reason */ - @org.junit.Test public void testAuditForCreateHold() { doBehaviourDrivenTest(new BehaviourDrivenTest() @@ -638,14 +597,13 @@ public class RecordsManagementAuditServiceImplTest extends BaseRMTestCase String holdName = "Hold " + GUID.generate(); String holdReason = "Reason " + GUID.generate(); - NodeRef hold; Map auditEventProperties; @Override public void given() { rmAuditService.clearAuditLog(filePlan); - hold = createHold(holdName, holdReason); + utils.createHold(filePlan, holdName, holdReason); } @Override @@ -677,11 +635,58 @@ public class RecordsManagementAuditServiceImplTest extends BaseRMTestCase } /** - * Given I have added an item a hold - * When I will get the RM audit filter by add to hold event + * Given I have created a hold + * When I delete the hold and get the RM audit filter by delete hold event + * Then there will be an entry for the deleted hold, including the hold name + */ + public void testAuditForDeleteHold() + { + doBehaviourDrivenTest(new BehaviourDrivenTest() + { + final static String DELETE_HOLD_AUDIT_EVENT = "Delete Hold"; + + String holdName = "Hold " + GUID.generate(); + + NodeRef hold; + Map auditEventProperties; + + @Override + public void given() + { + rmAuditService.clearAuditLog(filePlan); + hold = utils.createHold(filePlan, holdName, "Reason " + GUID.generate()); + } + + @Override + public void when() + { + utils.deleteHold(hold); + auditEventProperties = getAuditEntry(DELETE_HOLD_AUDIT_EVENT).getBeforeProperties(); + } + + @Override + public void then() + { + // check delete hold audit event includes the hold name + assertEquals("Delete Hold event does not include hold name.", holdName, + auditEventProperties.get(HOLD_NAME)); + } + + @Override + public void after() + { + // Stop and delete all entries + rmAuditService.stopAuditLog(filePlan); + rmAuditService.clearAuditLog(filePlan); + } + }); + } + + /** + * Given I have added an item of content to a hold + * When I get the RM audit filter by add to hold event * Then there will be an entry for the item added to the hold, including both the item name and hold name */ - @org.junit.Test public void testAuditForAddContentToHold() { doBehaviourDrivenTest(new BehaviourDrivenTest() @@ -691,19 +696,14 @@ public class RecordsManagementAuditServiceImplTest extends BaseRMTestCase String holdName = "Hold " + GUID.generate(); NodeRef hold; - NodeRef content; - Map auditEventProperties; @Override public void given() { rmAuditService.clearAuditLog(filePlan); - - hold = createHold(holdName, "Reason " + GUID.generate()); - content = utils.createRecord(rmFolder, "Record " + GUID.generate() + ".txt"); - - addContentToHold(hold, content); + hold = utils.createHold(filePlan, holdName, "Reason " + GUID.generate()); + utils.addItemToHold(hold, dmDocument); } @Override @@ -720,7 +720,7 @@ public class RecordsManagementAuditServiceImplTest extends BaseRMTestCase auditEventProperties.get(HOLD_NAME)); // check add to hold audit event includes the content name - String contentName = (String) nodeService.getProperty(content, PROP_NAME); + String contentName = (String) nodeService.getProperty(dmDocument, PROP_NAME); assertEquals("Add To Hold event does not include content name.", contentName, auditEventProperties.get(PROP_NAME)); } diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java index a8b931f1a3..21cb4ce5d8 100644 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java @@ -92,8 +92,6 @@ import org.alfresco.util.GUID; import org.alfresco.util.RetryingTransactionHelperTestCase; import org.springframework.context.ApplicationContext; -import static org.alfresco.util.GUID.generate; - /** * Base test case class to use for RM unit tests. * @@ -709,36 +707,6 @@ public abstract class BaseRMTestCase extends RetryingTransactionHelperTestCase return createPerson(userName, true); } - /** - * Util method to create a hold. - * @param holdName hold name - * @param holdReason hold reason - * @return NodeRef hold node reference - */ - protected NodeRef createHold(String holdName, String holdReason) - { - return holdService.createHold(filePlan, holdName, holdReason, generate()); - } - - /** - * Util method to delete a hold. - * @param nodeRef hold node reference - */ - protected void deleteHold(NodeRef nodeRef) - { - holdService.deleteHold(nodeRef); - } - - /** - * Util method to add content to a hold. - * @param holdNodeRef hold node reference - * @param contentNodeRef content node reference - */ - protected void addContentToHold(NodeRef holdNodeRef, NodeRef contentNodeRef) - { - holdService.addToHold(holdNodeRef, contentNodeRef); - } - /** * Setup multi hierarchy test data */ diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/CommonRMTestUtils.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/CommonRMTestUtils.java index 9991c9bafd..c6e55cf248 100644 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/CommonRMTestUtils.java +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/CommonRMTestUtils.java @@ -48,6 +48,7 @@ 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.disposition.DispositionSchedule; import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService; +import org.alfresco.module.org_alfresco_module_rm.hold.HoldService; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; import org.alfresco.module.org_alfresco_module_rm.model.security.ModelSecurityService; import org.alfresco.module.org_alfresco_module_rm.record.RecordService; @@ -65,6 +66,8 @@ import org.alfresco.service.namespace.QName; import org.apache.commons.lang.StringUtils; import org.springframework.context.ApplicationContext; +import static org.alfresco.util.GUID.generate; + /** * Common RM test utility methods. * @@ -80,6 +83,7 @@ public class CommonRMTestUtils implements RecordsManagementModel private FilePlanRoleService filePlanRoleService; private CapabilityService capabilityService; private RecordService recordService; + private HoldService holdService; /** test values */ public static final String DEFAULT_DISPOSITION_AUTHORITY = "disposition authority"; @@ -107,6 +111,7 @@ public class CommonRMTestUtils implements RecordsManagementModel filePlanRoleService = (FilePlanRoleService)applicationContext.getBean("FilePlanRoleService"); capabilityService = (CapabilityService)applicationContext.getBean("CapabilityService"); recordService = (RecordService)applicationContext.getBean("RecordService"); + holdService = (HoldService)applicationContext.getBean("HoldService"); } /** @@ -404,4 +409,34 @@ public class CommonRMTestUtils implements RecordsManagementModel // complete event actionService.executeRecordsManagementAction(disposableItem, CompleteEventAction.NAME, params); } + + /** + * Helper method to create a hold. + * @param holdName hold name + * @param holdReason hold reason + * @return NodeRef hold node reference + */ + public NodeRef createHold(NodeRef filePlan, String holdName, String holdReason) + { + return holdService.createHold(filePlan, holdName, holdReason, generate()); + } + + /** + * Helper method to delete a hold. + * @param nodeRef hold node reference + */ + public void deleteHold(NodeRef nodeRef) + { + holdService.deleteHold(nodeRef); + } + + /** + * Util method to add content to a hold. + * @param holdNodeRef hold node reference + * @param contentNodeRef content node reference + */ + public void addItemToHold(NodeRef holdNodeRef, NodeRef contentNodeRef) + { + holdService.addToHold(holdNodeRef, contentNodeRef); + } } From 92e0dea5c2e41092975b0d2939efca6f7230c6b8 Mon Sep 17 00:00:00 2001 From: Sara Aspery Date: Mon, 18 Nov 2019 10:56:45 +0000 Subject: [PATCH 6/8] RM-6930 review updates --- .../audit/event/AddToHoldAuditEvent.java | 2 -- .../audit/extractor/NamePathDataExtractor.java | 10 +++++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEvent.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEvent.java index 9aa9a0cae1..eb784ef9bb 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEvent.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEvent.java @@ -39,9 +39,7 @@ import org.alfresco.service.namespace.QName; import java.io.Serializable; import java.util.Map; -import static org.alfresco.module.org_alfresco_module_rm.audit.event.HoldUtils.HOLD_NAME; import static org.alfresco.repo.policy.Behaviour.NotificationFrequency.EVERY_EVENT; -import static org.alfresco.repo.policy.Behaviour.NotificationFrequency.TRANSACTION_COMMIT; /** * Add to hold audit event. diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/extractor/NamePathDataExtractor.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/extractor/NamePathDataExtractor.java index b4bcd5a6b3..986c3b5af7 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/extractor/NamePathDataExtractor.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/extractor/NamePathDataExtractor.java @@ -102,8 +102,8 @@ public final class NamePathDataExtractor extends AbstractDataExtractor } /** - * @return Returns true if the data is a NodeRef and it either represents - * a fileplan component or is frozen + * @return Returns true if the data is a NodeRef and it either represents + * a fileplan component or is frozen */ public boolean isSupported(Serializable data) { @@ -112,7 +112,7 @@ public final class NamePathDataExtractor extends AbstractDataExtractor return false; } NodeRef nodeRef = (NodeRef) data; - return nodeService.hasAspect((NodeRef)data, RecordsManagementModel.ASPECT_FILE_PLAN_COMPONENT) || + return nodeService.hasAspect(nodeRef, RecordsManagementModel.ASPECT_FILE_PLAN_COMPONENT) || dictionaryService.isSubClass(nodeService.getType(nodeRef), ContentModel.TYPE_CONTENT); } @@ -136,7 +136,7 @@ public final class NamePathDataExtractor extends AbstractDataExtractor for (NodeRef pathNodeRef : nodeRefPath) { - String name = (String)nodeService.getProperty(pathNodeRef, ContentModel.PROP_NAME); + String name = (String) nodeService.getProperty(pathNodeRef, ContentModel.PROP_NAME); sb.append("/").append(name); } } @@ -146,7 +146,7 @@ public final class NamePathDataExtractor extends AbstractDataExtractor Path nodeRefPath = nodeService.getPath(nodeRef); sb.append(nodeRefPath.toDisplayPath(nodeService, permissionService)); // Get node name - String name = (String)nodeService.getProperty(nodeRef, ContentModel.PROP_NAME); + String name = (String) nodeService.getProperty(nodeRef, ContentModel.PROP_NAME); sb.append("/").append(name); } From a2f8d7e7179530430ab1c964d87bd8ba4c8fc464 Mon Sep 17 00:00:00 2001 From: Sara Aspery Date: Mon, 18 Nov 2019 15:59:54 +0000 Subject: [PATCH 7/8] RM-7028 review updates --- .../audit/event/AddToHoldAuditEvent.java | 14 +- .../extractor/NamePathDataExtractor.java | 3 +- .../test/util/CommonRMTestUtils.java | 142 +++++++++--------- 3 files changed, 82 insertions(+), 77 deletions(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEvent.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEvent.java index eb784ef9bb..6cac5e2cf6 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEvent.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/event/AddToHoldAuditEvent.java @@ -27,6 +27,11 @@ package org.alfresco.module.org_alfresco_module_rm.audit.event; +import static org.alfresco.repo.policy.Behaviour.NotificationFrequency.EVERY_EVENT; + +import java.io.Serializable; +import java.util.Map; + import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.hold.HoldServicePolicies; import org.alfresco.repo.policy.annotation.Behaviour; @@ -36,11 +41,6 @@ import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.namespace.QName; -import java.io.Serializable; -import java.util.Map; - -import static org.alfresco.repo.policy.Behaviour.NotificationFrequency.EVERY_EVENT; - /** * Add to hold audit event. * @@ -50,7 +50,9 @@ import static org.alfresco.repo.policy.Behaviour.NotificationFrequency.EVERY_EVE @BehaviourBean public class AddToHoldAuditEvent extends AuditEvent implements HoldServicePolicies.OnAddToHoldPolicy { - /** Node Service */ + /** + * Node Service + */ private NodeService nodeService; /** diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/extractor/NamePathDataExtractor.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/extractor/NamePathDataExtractor.java index 986c3b5af7..d3a1097b9b 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/extractor/NamePathDataExtractor.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/extractor/NamePathDataExtractor.java @@ -51,7 +51,8 @@ import org.alfresco.service.cmr.security.PermissionService; * @see FilePlanService#getNodeRefPath(NodeRef) * * @author Derek Hulley - * @since 3.2 + * @author Sara Aspery + * @since 3.3 */ public final class NamePathDataExtractor extends AbstractDataExtractor { diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/CommonRMTestUtils.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/CommonRMTestUtils.java index c6e55cf248..cfccf57693 100644 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/CommonRMTestUtils.java +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/CommonRMTestUtils.java @@ -27,6 +27,8 @@ package org.alfresco.module.org_alfresco_module_rm.test.util; +import static org.alfresco.util.GUID.generate; + import java.io.InputStream; import java.io.Serializable; import java.util.ArrayList; @@ -66,8 +68,6 @@ import org.alfresco.service.namespace.QName; import org.apache.commons.lang.StringUtils; import org.springframework.context.ApplicationContext; -import static org.alfresco.util.GUID.generate; - /** * Common RM test utility methods. * @@ -75,6 +75,18 @@ import static org.alfresco.util.GUID.generate; */ public class CommonRMTestUtils implements RecordsManagementModel { + /** + * test values + */ + public static final String DEFAULT_DISPOSITION_AUTHORITY = "disposition authority"; + public static final String DEFAULT_DISPOSITION_INSTRUCTIONS = "disposition instructions"; + public static final String DEFAULT_DISPOSITION_DESCRIPTION = "disposition action description"; + public static final String DEFAULT_EVENT_NAME = "case_closed"; + public static final String PERIOD_NONE = "none|0"; + public static final String PERIOD_IMMEDIATELY = "immediately|0"; + public static final String PERIOD_ONE_WEEK = "week|1"; + public static final String PERIOD_ONE_YEAR = "year|1"; + public static final String PERIOD_THREE_YEARS = "year|3"; private DispositionService dispositionService; private NodeService nodeService; private ContentService contentService; @@ -85,33 +97,22 @@ public class CommonRMTestUtils implements RecordsManagementModel private RecordService recordService; private HoldService holdService; - /** test values */ - public static final String DEFAULT_DISPOSITION_AUTHORITY = "disposition authority"; - public static final String DEFAULT_DISPOSITION_INSTRUCTIONS = "disposition instructions"; - public static final String DEFAULT_DISPOSITION_DESCRIPTION = "disposition action description"; - public static final String DEFAULT_EVENT_NAME = "case_closed"; - public static final String PERIOD_NONE = "none|0"; - public static final String PERIOD_IMMEDIATELY = "immediately|0"; - public static final String PERIOD_ONE_WEEK = "week|1"; - public static final String PERIOD_ONE_YEAR = "year|1"; - public static final String PERIOD_THREE_YEARS = "year|3"; - /** * Constructor * - * @param applicationContext application context + * @param applicationContext application context */ public CommonRMTestUtils(ApplicationContext applicationContext) { - dispositionService = (DispositionService)applicationContext.getBean("DispositionService"); - nodeService = (NodeService)applicationContext.getBean("NodeService"); - contentService = (ContentService)applicationContext.getBean("ContentService"); - actionService = (RecordsManagementActionService)applicationContext.getBean("RecordsManagementActionService"); - modelSecurityService = (ModelSecurityService)applicationContext.getBean("ModelSecurityService"); - filePlanRoleService = (FilePlanRoleService)applicationContext.getBean("FilePlanRoleService"); - capabilityService = (CapabilityService)applicationContext.getBean("CapabilityService"); - recordService = (RecordService)applicationContext.getBean("RecordService"); - holdService = (HoldService)applicationContext.getBean("HoldService"); + dispositionService = (DispositionService) applicationContext.getBean("DispositionService"); + nodeService = (NodeService) applicationContext.getBean("NodeService"); + contentService = (ContentService) applicationContext.getBean("ContentService"); + actionService = (RecordsManagementActionService) applicationContext.getBean("RecordsManagementActionService"); + modelSecurityService = (ModelSecurityService) applicationContext.getBean("ModelSecurityService"); + filePlanRoleService = (FilePlanRoleService) applicationContext.getBean("FilePlanRoleService"); + capabilityService = (CapabilityService) applicationContext.getBean("CapabilityService"); + recordService = (RecordService) applicationContext.getBean("RecordService"); + holdService = (HoldService) applicationContext.getBean("HoldService"); } /** @@ -128,26 +129,26 @@ public class CommonRMTestUtils implements RecordsManagementModel /** * Create test disposition schedule */ - public DispositionSchedule createBasicDispositionSchedule( - NodeRef container, - String dispositionInstructions, - String dispositionAuthority, - boolean isRecordLevel, - boolean defaultDispositionActions) - { - return createDispositionSchedule(container, dispositionInstructions, dispositionAuthority, isRecordLevel, defaultDispositionActions, false); - } + public DispositionSchedule createBasicDispositionSchedule( + NodeRef container, + String dispositionInstructions, + String dispositionAuthority, + boolean isRecordLevel, + boolean defaultDispositionActions) + { + return createDispositionSchedule(container, dispositionInstructions, dispositionAuthority, isRecordLevel, defaultDispositionActions, false); + } /** * Create test disposition schedule */ public DispositionSchedule createDispositionSchedule( - NodeRef container, - String dispositionInstructions, - String dispositionAuthority, - boolean isRecordLevel, - boolean defaultDispositionActions, - boolean extendedDispositionSchedule) + NodeRef container, + String dispositionInstructions, + String dispositionAuthority, + boolean isRecordLevel, + boolean defaultDispositionActions, + boolean extendedDispositionSchedule) { return createDispositionSchedule( container, @@ -163,13 +164,13 @@ public class CommonRMTestUtils implements RecordsManagementModel * Create test disposition schedule */ public DispositionSchedule createDispositionSchedule( - NodeRef container, - String dispositionInstructions, - String dispositionAuthority, - boolean isRecordLevel, - boolean defaultDispositionActions, - boolean extendedDispositionSchedule, - String defaultEvent) + NodeRef container, + String dispositionInstructions, + String dispositionAuthority, + boolean isRecordLevel, + boolean defaultDispositionActions, + boolean extendedDispositionSchedule, + String defaultEvent) { Map dsProps = new HashMap<>(3); dsProps.put(PROP_DISPOSITION_AUTHORITY, dispositionAuthority); @@ -185,7 +186,7 @@ public class CommonRMTestUtils implements RecordsManagementModel List events = new ArrayList<>(1); events.add(defaultEvent); - adParams.put(PROP_DISPOSITION_EVENT, (Serializable)events); + adParams.put(PROP_DISPOSITION_EVENT, (Serializable) events); dispositionService.addDispositionActionDefinition(dispositionSchedule, adParams); @@ -214,8 +215,8 @@ public class CommonRMTestUtils implements RecordsManagementModel /** * Helper method to create a record in a record folder. * - * @param recordFolder record folder - * @param name name of record + * @param recordFolder record folder + * @param name name of record * @return {@link NodeRef} record node reference */ public NodeRef createRecord(NodeRef recordFolder, String name) @@ -226,9 +227,9 @@ public class CommonRMTestUtils implements RecordsManagementModel /** * Helper method to create a record in a record folder. * - * @param recordFolder record folder - * @param name name of the record - * @param title title of the record + * @param recordFolder record folder + * @param name name of the record + * @param title title of the record * @return {@link NodeRef} record node reference */ public NodeRef createRecord(NodeRef recordFolder, String name, String title) @@ -241,10 +242,10 @@ public class CommonRMTestUtils implements RecordsManagementModel /** * Helper method to create a record in a record folder. * - * @param recordFolder record folder - * @param name name of record - * @param properties properties of the record - * @param content content of the record + * @param recordFolder record folder + * @param name name of record + * @param properties properties of the record + * @param content content of the record * @return {@link NodeRef} record node reference */ public NodeRef createRecord(NodeRef recordFolder, String name, Map properties, String content) @@ -264,10 +265,10 @@ public class CommonRMTestUtils implements RecordsManagementModel /** * Helper method to create a record in a record folder. * - * @param recordFolder record folder - * @param name name of record - * @param properties properties of the record - * @param content content of the record + * @param recordFolder record folder + * @param name name of record + * @param properties properties of the record + * @param content content of the record * @return {@link NodeRef} record node reference */ public NodeRef createRecord(NodeRef recordFolder, String name, Map properties, String mimetype, InputStream content) @@ -344,8 +345,7 @@ public class CommonRMTestUtils implements RecordsManagementModel nodeService.setProperty(record, RecordsManagementModel.PROP_DATE_FILED, new Date()); nodeService.setProperty(record, ContentModel.PROP_TITLE, "titleValue"); actionService.executeRecordsManagementAction(record, "declareRecord"); - } - finally + } finally { modelSecurityService.setEnabled(true); } @@ -368,8 +368,7 @@ public class CommonRMTestUtils implements RecordsManagementModel try { actionService.executeRecordsManagementAction(recordFolder, "closeRecordFolder"); - } - finally + } finally { modelSecurityService.setEnabled(true); } @@ -378,7 +377,7 @@ public class CommonRMTestUtils implements RecordsManagementModel }, AuthenticationUtil.getAdminUserName()); } - public Role createRole(NodeRef filePlan, String roleName, String ... capabilityNames) + public Role createRole(NodeRef filePlan, String roleName, String... capabilityNames) { Set capabilities = new HashSet<>(capabilityNames.length); for (String name : capabilityNames) @@ -397,8 +396,8 @@ public class CommonRMTestUtils implements RecordsManagementModel /** * Helper method to complete event on disposable item * - * @param disposableItem disposable item (record or record folder) - * @param eventName event name + * @param disposableItem disposable item (record or record folder) + * @param eventName event name */ public void completeEvent(NodeRef disposableItem, String eventName) { @@ -412,7 +411,8 @@ public class CommonRMTestUtils implements RecordsManagementModel /** * Helper method to create a hold. - * @param holdName hold name + * + * @param holdName hold name * @param holdReason hold reason * @return NodeRef hold node reference */ @@ -423,7 +423,8 @@ public class CommonRMTestUtils implements RecordsManagementModel /** * Helper method to delete a hold. - * @param nodeRef hold node reference + * + * @param nodeRef hold node reference */ public void deleteHold(NodeRef nodeRef) { @@ -432,8 +433,9 @@ public class CommonRMTestUtils implements RecordsManagementModel /** * Util method to add content to a hold. - * @param holdNodeRef hold node reference - * @param contentNodeRef content node reference + * + * @param holdNodeRef hold node reference + * @param contentNodeRef content node reference */ public void addItemToHold(NodeRef holdNodeRef, NodeRef contentNodeRef) { From d4ec6dcb80d7cbef3a2158ba879086dd66acc593 Mon Sep 17 00:00:00 2001 From: Sara Aspery Date: Tue, 19 Nov 2019 11:15:45 +0000 Subject: [PATCH 8/8] RM-7028 review updates --- .../audit/extractor/NamePathDataExtractor.java | 3 ++- .../org_alfresco_module_rm/test/util/CommonRMTestUtils.java | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/extractor/NamePathDataExtractor.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/extractor/NamePathDataExtractor.java index d3a1097b9b..2aba0a894f 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/extractor/NamePathDataExtractor.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/audit/extractor/NamePathDataExtractor.java @@ -51,8 +51,9 @@ import org.alfresco.service.cmr.security.PermissionService; * @see FilePlanService#getNodeRefPath(NodeRef) * * @author Derek Hulley + * @since 3.2 * @author Sara Aspery - * @since 3.3 + * @since AGS 3.3 */ public final class NamePathDataExtractor extends AbstractDataExtractor { diff --git a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/CommonRMTestUtils.java b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/CommonRMTestUtils.java index cfccf57693..cf7e449f24 100644 --- a/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/CommonRMTestUtils.java +++ b/rm-community/rm-community-repo/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/CommonRMTestUtils.java @@ -345,7 +345,8 @@ public class CommonRMTestUtils implements RecordsManagementModel nodeService.setProperty(record, RecordsManagementModel.PROP_DATE_FILED, new Date()); nodeService.setProperty(record, ContentModel.PROP_TITLE, "titleValue"); actionService.executeRecordsManagementAction(record, "declareRecord"); - } finally + } + finally { modelSecurityService.setEnabled(true); } @@ -368,7 +369,8 @@ public class CommonRMTestUtils implements RecordsManagementModel try { actionService.executeRecordsManagementAction(recordFolder, "closeRecordFolder"); - } finally + } + finally { modelSecurityService.setEnabled(true); }