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 0277a9f386..0749edf9b5 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 @@
-
+
@@ -34,7 +34,7 @@
-
+
diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v22-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v22-context.xml
index 2c076cf37b..bf0d749558 100755
--- a/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v22-context.xml
+++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v22-context.xml
@@ -80,5 +80,16 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/FilePlanComponentKind.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/FilePlanComponentKind.java
index aa745985f6..b161c32bc5 100644
--- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/FilePlanComponentKind.java
+++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/FilePlanComponentKind.java
@@ -34,6 +34,7 @@ public enum FilePlanComponentKind
RECORD_FOLDER,
RECORD,
TRANSFER,
+ TRANSFER_CONTAINER,
HOLD,
HOLD_CONTAINER,
DISPOSITION_SCHEDULE,
diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/freeze/FreezeService.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/freeze/FreezeService.java
index 23dd11cd02..051c135a18 100644
--- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/freeze/FreezeService.java
+++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/freeze/FreezeService.java
@@ -26,6 +26,8 @@ import org.alfresco.service.cmr.repository.NodeRef;
/**
* Freeze Service Interface
+ *
+ * TODO should be deprecated and methods moved to the HoldService with "hold, held, etc" style names
*
* @author Roy Wetherall
* @since 2.0
diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22RemoveInPlaceRolesFromAllPatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22RemoveInPlaceRolesFromAllPatch.java
new file mode 100644
index 0000000000..61be509bd5
--- /dev/null
+++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22RemoveInPlaceRolesFromAllPatch.java
@@ -0,0 +1,97 @@
+/*
+ * 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.v22;
+
+import java.util.Set;
+
+import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService;
+import org.alfresco.module.org_alfresco_module_rm.patch.AbstractModulePatch;
+import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService;
+import org.alfresco.module.org_alfresco_module_rm.role.Role;
+import org.alfresco.service.cmr.repository.NodeRef;
+import org.alfresco.service.cmr.security.AuthorityService;
+
+/**
+ * Removes the in-place groups from the all roles group.
+ *
+ * @author Roy Wetherall
+ * @since 2.2
+ */
+public class RMv22RemoveInPlaceRolesFromAllPatch extends AbstractModulePatch
+{
+ /** file plan service */
+ private FilePlanService filePlanService;
+
+ /** file plan role service */
+ private FilePlanRoleService filePlanRoleService;
+
+ /** authority service */
+ private AuthorityService authorityService;
+
+ /**
+ * @param filePlanService file plan service
+ */
+ public void setFilePlanService(FilePlanService filePlanService)
+ {
+ this.filePlanService = filePlanService;
+ }
+
+ /**
+ * @param filePlanRoleService file plan role service
+ */
+ public void setFilePlanRoleService(FilePlanRoleService filePlanRoleService)
+ {
+ this.filePlanRoleService = filePlanRoleService;
+ }
+
+ /**
+ * @param authorityService authority service
+ */
+ public void setAuthorityService(AuthorityService authorityService)
+ {
+ this.authorityService = authorityService;
+ }
+
+ /**
+ * @see org.alfresco.module.org_alfresco_module_rm.patch.AbstractModulePatch#applyInternal()
+ */
+ @Override
+ public void applyInternal()
+ {
+ // get all file plans
+ Set filePlans = filePlanService.getFilePlans();
+ for (NodeRef filePlan : filePlans)
+ {
+ Role extendedReaders = filePlanRoleService.getRole(filePlan, FilePlanRoleService.ROLE_EXTENDED_READERS);
+ Role extendedWriters = filePlanRoleService.getRole(filePlan, FilePlanRoleService.ROLE_EXTENDED_WRITERS);
+
+ // remove extended readers and writers roles from the all roles group
+ String allRolesGroup = filePlanRoleService.getAllRolesContainerGroup(filePlan);
+ Set members = authorityService.getContainedAuthorities(null, allRolesGroup, true);
+ if (members.contains(extendedReaders.getRoleGroupName()))
+ {
+ authorityService.removeAuthority(allRolesGroup, extendedReaders.getRoleGroupName());
+ }
+ if (members.contains(extendedWriters.getRoleGroupName()))
+ {
+ authorityService.removeAuthority(allRolesGroup, extendedWriters.getRoleGroupName());
+ }
+ }
+ }
+}
diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/role/FilePlanRoleService.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/role/FilePlanRoleService.java
index aa5c1e188b..de221894f6 100644
--- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/role/FilePlanRoleService.java
+++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/role/FilePlanRoleService.java
@@ -36,7 +36,7 @@ public interface FilePlanRoleService
/** Default role names */
String ROLE_USER = "User";
String ROLE_POWER_USER = "PowerUser";
- String ROLE_SECURITY_OFFICER = "SecurityOfficer";
+ String ROLE_SECURITY_OFFICER = "SecurityOfficer";
String ROLE_RECORDS_MANAGER = "RecordsManager";
String ROLE_ADMIN = "Administrator";
String ROLE_EXTENDED_READERS = "ExtendedReaders";
diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/role/FilePlanRoleServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/role/FilePlanRoleServiceImpl.java
index 07b8a9abe6..83d6e9dc1e 100644
--- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/role/FilePlanRoleServiceImpl.java
+++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/role/FilePlanRoleServiceImpl.java
@@ -81,6 +81,12 @@ public class FilePlanRoleServiceImpl implements FilePlanRoleService,
/** Location of bootstrap role JSON */
private static final String BOOTSTRAP_ROLE_JSON_LOCATION = "alfresco/module/org_alfresco_module_rm/security/rm-default-roles-bootstrap.json";
+
+ /** JSON names */
+ private static final String JSON_NAME = "name";
+ private static final String JSON_DISPLAY_LABEL = "displayLabel";
+ private static final String JSON_IS_ADMIN = "isAdmin";
+ private static final String JSON_CAPABILITIES = "capabilities";
/** Capability service */
private CapabilityService capabilityService;
@@ -111,9 +117,7 @@ public class FilePlanRoleServiceImpl implements FilePlanRoleService,
/** Records management role zone */
public static final String RM_ROLE_ZONE_PREFIX = "rmRoleZone";
- /**
- * Records Management Config Node
- */
+ /** Records Management Config Node */
private static final String CONFIG_NODEID = "rm_config_folder";
/** Logger */
@@ -286,9 +290,10 @@ public class FilePlanRoleServiceImpl implements FilePlanRoleService,
}
/**
- *
- * @param rmRootNode
- * @param unfiledContainer
+ * Bootstraps the default roles
+ *
+ * @param filePlan file plan
+ * @param systemContainers system containers
*/
private void bootstrapDefaultRoles(final NodeRef filePlan, final List systemContainers)
{
@@ -321,9 +326,9 @@ public class FilePlanRoleServiceImpl implements FilePlanRoleService,
// Get the name of the role
String name = null;
- if (object.has("name"))
+ if (object.has(JSON_NAME))
{
- name = object.getString("name");
+ name = object.getString(JSON_NAME);
if (existsRole(filePlan, name))
{
throw new AlfrescoRuntimeException("The bootstrap role " + name + " already exists on the rm root node " + filePlan.toString());
@@ -337,23 +342,23 @@ public class FilePlanRoleServiceImpl implements FilePlanRoleService,
// Get the role's display label
String displayLabel = name;
- if (object.has("displayLabel"))
+ if (object.has(JSON_DISPLAY_LABEL))
{
- displayLabel = object.getString("displayLabel");
+ displayLabel = object.getString(JSON_DISPLAY_LABEL);
}
// Determine whether the role is an admin role or not
boolean isAdmin = false;
- if (object.has("isAdmin"))
+ if (object.has(JSON_IS_ADMIN))
{
- isAdmin = object.getBoolean("isAdmin");
+ isAdmin = object.getBoolean(JSON_IS_ADMIN);
}
// Get the roles capabilities
Set capabilities = new HashSet(30);
- if (object.has("capabilities"))
+ if (object.has(JSON_CAPABILITIES))
{
- JSONArray arrCaps = object.getJSONArray("capabilities");
+ JSONArray arrCaps = object.getJSONArray(JSON_CAPABILITIES);
for (int index = 0; index < arrCaps.length(); index++)
{
String capName = arrCaps.getString(index);
@@ -371,7 +376,7 @@ public class FilePlanRoleServiceImpl implements FilePlanRoleService,
// Add any additional admin permissions
if (isAdmin)
- {
+ {
// Admin has filing
permissionService.setPermission(filePlan, role.getRoleGroupName(), RMPermissionModel.FILING, true);
if (systemContainers != null)
@@ -686,23 +691,23 @@ public class FilePlanRoleServiceImpl implements FilePlanRoleService,
/**
* @see org.alfresco.module.org_alfresco_module_rm.security.RecordsManagementSecurityService#createRole(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, java.lang.String, java.util.Set)
*/
- public Role createRole(final NodeRef rmRootNode, final String role, final String roleDisplayLabel, final Set capabilities)
+ public Role createRole(final NodeRef filePlan, final String role, final String roleDisplayLabel, final Set capabilities)
{
return AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork()
{
public Role doWork()
{
- String fullRoleName = getFullRoleName(role, rmRootNode);
+ String fullRoleName = getFullRoleName(role, filePlan);
// Check that the role does not already exist for the rm root node
if (authorityService.authorityExists(authorityService.getName(AuthorityType.GROUP, fullRoleName)))
{
- throw new AlfrescoRuntimeException("The role " + role + " already exists for root rm node " + rmRootNode.getId());
+ throw new AlfrescoRuntimeException("The role " + role + " already exists for root rm node " + filePlan.getId());
}
// Create a group that relates to the records management role
Set zones = new HashSet(2);
- zones.add(getZoneName(rmRootNode));
+ zones.add(getZoneName(filePlan));
zones.add(RMAuthority.ZONE_APP_RM);
// Look up string, default to passed value if none found
@@ -714,9 +719,13 @@ public class FilePlanRoleServiceImpl implements FilePlanRoleService,
String roleGroup = authorityService.createAuthority(AuthorityType.GROUP, fullRoleName, groupDisplayLabel, zones);
- // Add the roleGroup to the "all" role group
- String allRoleGroup = authorityService.getName(AuthorityType.GROUP, getAllRolesGroupShortName(rmRootNode));
- authorityService.addAuthority(allRoleGroup, roleGroup);
+ // do not add system roles to "all"
+ if (!isSystemRole(role))
+ {
+ // Add the roleGroup to the "all" role group
+ String allRoleGroup = authorityService.getName(AuthorityType.GROUP, getAllRolesGroupShortName(filePlan));
+ authorityService.addAuthority(allRoleGroup, roleGroup);
+ }
// TODO .. we should be creating a permission set containing all the capabilities and then assigning that
// single permission group to the file plan .. would be tidier
@@ -726,7 +735,7 @@ public class FilePlanRoleServiceImpl implements FilePlanRoleService,
{
for (Capability capability : capabilities)
{
- permissionService.setPermission(rmRootNode, roleGroup, capability.getName(), true);
+ permissionService.setPermission(filePlan, roleGroup, capability.getName(), true);
}
}
diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/AuditLogPost.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/AuditLogPost.java
index 2c089c207e..e714c13df4 100644
--- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/AuditLogPost.java
+++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/AuditLogPost.java
@@ -140,7 +140,6 @@ public class AuditLogPost extends BaseAuditRetrievalWebScript
* @param record {@link NodeRef} The audit trail as record
* @return Response text as {@link String}
*/
- @SuppressWarnings("null")
private String createResponse(NodeRef record)
{
JSONObject responseJSON = new JSONObject();
diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java
index 6cf34e8d27..543a180ef9 100644
--- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java
+++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java
@@ -192,7 +192,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
)
public void onCreateTransfer(final ChildAssociationRef childAssocRef)
{
- setupPermissions(childAssocRef.getParentRef(), childAssocRef.getChildRef());
+ setupPermissions(childAssocRef.getParentRef(), childAssocRef.getChildRef(), false);
}
/**
@@ -204,12 +204,23 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
public void setupPermissions(final NodeRef parent, final NodeRef nodeRef)
{
ParameterCheck.mandatory("parent", parent);
- ParameterCheck.mandatory("nodeRef", nodeRef);
-
+ ParameterCheck.mandatory("nodeRef", nodeRef);
+ setupPermissions(parent, nodeRef, true);
+ }
+
+ /**
+ * Helper method to setup permissions.
+ *
+ * @param parent parent node reference
+ * @param nodeRef child node reference
+ * @param includeInPlace true if in-place permissions should be included, false otherwise
+ */
+ private void setupPermissions(final NodeRef parent, final NodeRef nodeRef, final boolean includeInPlace)
+ {
if (nodeService.exists(nodeRef))
{
// initialise permissions
- initPermissions(nodeRef);
+ initPermissions(nodeRef, includeInPlace);
if (nodeService.exists(parent))
{
@@ -352,13 +363,14 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
}
}, AuthenticationUtil.getSystemUserName());
}
-
+
/**
* Init the permissions for the given node.
*
- * @param nodeRef node reference
+ * @param nodeRef node reference
+ * @param includeInPlace true if in-place
*/
- private void initPermissions(final NodeRef nodeRef)
+ private void initPermissions(final NodeRef nodeRef, final boolean includeInPlace)
{
if (nodeService.exists(nodeRef))
{
@@ -372,9 +384,12 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl
// clear all existing permissions
permissionService.clearPermission(nodeRef, null);
- // set extended reader permissions
- permissionService.setPermission(nodeRef, ExtendedReaderDynamicAuthority.EXTENDED_READER, RMPermissionModel.READ_RECORDS, true);
- permissionService.setPermission(nodeRef, ExtendedWriterDynamicAuthority.EXTENDED_WRITER, RMPermissionModel.FILING, true);
+ if (includeInPlace)
+ {
+ // set extended reader permissions
+ permissionService.setPermission(nodeRef, ExtendedReaderDynamicAuthority.EXTENDED_READER, RMPermissionModel.READ_RECORDS, true);
+ permissionService.setPermission(nodeRef, ExtendedWriterDynamicAuthority.EXTENDED_WRITER, RMPermissionModel.FILING, true);
+ }
// remove owner
ownableService.setOwner(nodeRef, OwnableService.NO_OWNER);
diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/util/ServiceBaseImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/util/ServiceBaseImpl.java
index d9309fd426..fae3d04125 100644
--- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/util/ServiceBaseImpl.java
+++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/util/ServiceBaseImpl.java
@@ -116,6 +116,10 @@ public class ServiceBaseImpl implements RecordsManagementModel, ApplicationConte
{
result = FilePlanComponentKind.HOLD;
}
+ else if (instanceOf(nodeRef, TYPE_TRANSFER_CONTAINER))
+ {
+ result = FilePlanComponentKind.TRANSFER_CONTAINER;
+ }
else if (isTransfer(nodeRef))
{
result = FilePlanComponentKind.TRANSFER;
diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22RemoveInPlaceRolesFromAllPatchUnitTest.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22RemoveInPlaceRolesFromAllPatchUnitTest.java
new file mode 100644
index 0000000000..2be813297a
--- /dev/null
+++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/patch/v22/RMv22RemoveInPlaceRolesFromAllPatchUnitTest.java
@@ -0,0 +1,127 @@
+/*
+ * 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.v22;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.mock;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService;
+import org.alfresco.module.org_alfresco_module_rm.role.Role;
+import org.alfresco.module.org_alfresco_module_rm.test.util.BaseUnitTest;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+
+/**
+ * Unit test for remove in-place roles from 'all roles' group patch unit test.
+ *
+ * @author Roy Wetherall
+ * @since 2.2
+ */
+public class RMv22RemoveInPlaceRolesFromAllPatchUnitTest extends BaseUnitTest
+{
+ /** test data */
+ private static final String ALL_ROLES = "allroles";
+
+ /** patch */
+ @InjectMocks private RMv22RemoveInPlaceRolesFromAllPatch patch;
+
+ /**
+ * Given there are no file plans to update then the 'all roles' group should not
+ * be changed.
+ */
+ @Test
+ public void noFilePlans()
+ {
+ // given
+ doReturn(Collections.EMPTY_SET).when(mockedFilePlanService).getFilePlans();
+
+ // when
+ patch.applyInternal();
+
+ // then
+ verifyZeroInteractions(mockedAuthorityService);
+ }
+
+ /**
+ * Given that there is one file plan whose 'all roles' group does not contain the
+ * in-place roles the 'all roles' groups should not be changed.
+ */
+ @Test
+ public void rolesDontNeedRemovingFromGroup()
+ {
+ // given
+ doReturn(Collections.singleton(filePlan)).when(mockedFilePlanService).getFilePlans();
+ doReturn(getMockedRole(FilePlanRoleService.ROLE_EXTENDED_READERS)).when(mockedFilePlanRoleService).getRole(filePlan, FilePlanRoleService.ROLE_EXTENDED_READERS);
+ doReturn(getMockedRole(FilePlanRoleService.ROLE_EXTENDED_WRITERS)).when(mockedFilePlanRoleService).getRole(filePlan, FilePlanRoleService.ROLE_EXTENDED_WRITERS);
+ doReturn(ALL_ROLES).when(mockedFilePlanRoleService).getAllRolesContainerGroup(filePlan);
+ doReturn(Collections.EMPTY_SET).when(mockedAuthorityService).getContainedAuthorities(null, ALL_ROLES, true);
+
+ // when
+ patch.applyInternal();
+
+ // then
+ verify(mockedAuthorityService, times(1)).getContainedAuthorities(null, ALL_ROLES, true);
+ verifyNoMoreInteractions(mockedAuthorityService);
+ }
+
+ /**
+ * Given that there is one file plan whose 'all roles' group contains the in-place
+ * roles then they should be revoved.
+ */
+ @Test
+ public void removeRolesFromGroup()
+ {
+ // given
+ doReturn(Collections.singleton(filePlan)).when(mockedFilePlanService).getFilePlans();
+ doReturn(getMockedRole(FilePlanRoleService.ROLE_EXTENDED_READERS)).when(mockedFilePlanRoleService).getRole(filePlan, FilePlanRoleService.ROLE_EXTENDED_READERS);
+ doReturn(getMockedRole(FilePlanRoleService.ROLE_EXTENDED_WRITERS)).when(mockedFilePlanRoleService).getRole(filePlan, FilePlanRoleService.ROLE_EXTENDED_WRITERS);
+ doReturn(ALL_ROLES).when(mockedFilePlanRoleService).getAllRolesContainerGroup(filePlan);
+ Set contains = new HashSet(2);
+ contains.add(FilePlanRoleService.ROLE_EXTENDED_READERS);
+ contains.add(FilePlanRoleService.ROLE_EXTENDED_WRITERS);
+ doReturn(contains).when(mockedAuthorityService).getContainedAuthorities(null, ALL_ROLES, true);
+
+ // when
+ patch.applyInternal();
+
+ // then
+ verify(mockedAuthorityService, times(1)).getContainedAuthorities(null, ALL_ROLES, true);
+ verify(mockedAuthorityService, times(1)).removeAuthority(ALL_ROLES, FilePlanRoleService.ROLE_EXTENDED_READERS);
+ verify(mockedAuthorityService, times(1)).removeAuthority(ALL_ROLES, FilePlanRoleService.ROLE_EXTENDED_WRITERS);
+ verifyNoMoreInteractions(mockedAuthorityService);
+ }
+
+ /**
+ * Helper method to create a mocked role.
+ */
+ private Role getMockedRole(String name)
+ {
+ Role mockedRole = mock(Role.class);
+ doReturn(name).when(mockedRole).getRoleGroupName();
+ return mockedRole;
+ }
+}
diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/AllUnitTestSuite.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/AllUnitTestSuite.java
index 18527bbb90..b0c633e781 100644
--- a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/AllUnitTestSuite.java
+++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/AllUnitTestSuite.java
@@ -26,6 +26,7 @@ import org.alfresco.module.org_alfresco_module_rm.job.DispositionLifecycleJobExe
import org.alfresco.module.org_alfresco_module_rm.jscript.app.evaluator.FrozenEvaluatorUnitTest;
import org.alfresco.module.org_alfresco_module_rm.jscript.app.evaluator.TransferEvaluatorUnitTest;
import org.alfresco.module.org_alfresco_module_rm.model.compatibility.DictionaryBootstrapPostProcessorUnitTest;
+import org.alfresco.module.org_alfresco_module_rm.patch.v22.RMv22RemoveInPlaceRolesFromAllPatchUnitTest;
import org.alfresco.module.org_alfresco_module_rm.record.RecordMetadataBootstrapUnitTest;
import org.alfresco.module.org_alfresco_module_rm.record.RecordServiceImplUnitTest;
import org.alfresco.module.org_alfresco_module_rm.script.hold.HoldPostUnitTest;
@@ -70,7 +71,10 @@ import org.junit.runners.Suite.SuiteClasses;
HoldCapabilityConditionUnitTest.class,
// action implementations
- FileReportActionUnitTest.class
+ FileReportActionUnitTest.class,
+
+ // patches
+ RMv22RemoveInPlaceRolesFromAllPatchUnitTest.class
})
public class AllUnitTestSuite
{
diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseUnitTest.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseUnitTest.java
index e8655e93ec..8430654373 100644
--- a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseUnitTest.java
+++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseUnitTest.java
@@ -38,6 +38,7 @@ import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel;
import org.alfresco.module.org_alfresco_module_rm.record.RecordService;
import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService;
import org.alfresco.module.org_alfresco_module_rm.report.ReportService;
+import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService;
import org.alfresco.module.org_alfresco_module_rm.util.ServiceBaseImpl;
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
import org.alfresco.repo.transaction.RetryingTransactionHelper;
@@ -48,6 +49,7 @@ 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.SearchService;
+import org.alfresco.service.cmr.security.AuthorityService;
import org.alfresco.service.cmr.security.OwnableService;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.namespace.NamespaceService;
@@ -83,25 +85,27 @@ public class BaseUnitTest implements RecordsManagementModel
protected NodeRef record;
/** core service mocks */
- @Mock(name="nodeService") protected NodeService mockedNodeService;
- @Mock(name="dictionaryService") protected DictionaryService mockedDictionaryService;
- @Mock(name="namespaceService") protected NamespaceService mockedNamespaceService;
- @Mock(name="identifierService") protected IdentifierService mockedIdentifierService;
- @Mock(name="permissionService") protected PermissionService mockedPermissionService;
- @Mock(name="ownableService") protected OwnableService mockedOwnableService;
- @Mock(name="searchService") protected SearchService mockedSearchService;
- @Mock(name="retryingTransactionHelper") protected RetryingTransactionHelper mockedRetryingTransactionHelper;
+ @Mock(name="nodeService") protected NodeService mockedNodeService;
+ @Mock(name="dictionaryService") protected DictionaryService mockedDictionaryService;
+ @Mock(name="namespaceService") protected NamespaceService mockedNamespaceService;
+ @Mock(name="identifierService") protected IdentifierService mockedIdentifierService;
+ @Mock(name="permissionService") protected PermissionService mockedPermissionService;
+ @Mock(name="ownableService") protected OwnableService mockedOwnableService;
+ @Mock(name="searchService") protected SearchService mockedSearchService;
+ @Mock(name="retryingTransactionHelper") protected RetryingTransactionHelper mockedRetryingTransactionHelper;
+ @Mock(name="authorityService") protected AuthorityService mockedAuthorityService;
/** rm service mocks */
- @Mock(name="filePlanService") protected FilePlanService mockedFilePlanService;
- @Mock(name="recordFolderService") protected RecordFolderService mockedRecordFolderService;
- @Mock(name="recordService") protected RecordService mockedRecordService;
- @Mock(name="holdService") protected HoldService mockedHoldService;
+ @Mock(name="filePlanService") protected FilePlanService mockedFilePlanService;
+ @Mock(name="recordFolderService") protected RecordFolderService mockedRecordFolderService;
+ @Mock(name="recordService") protected RecordService mockedRecordService;
+ @Mock(name="holdService") protected HoldService mockedHoldService;
@Mock(name="recordsManagementActionService") protected RecordsManagementActionService mockedRecordsManagementActionService;
- @Mock(name="reportService") protected ReportService mockedReportService;
+ @Mock(name="reportService") protected ReportService mockedReportService;
+ @Mock(name="filePlanRoleService") protected FilePlanRoleService mockedFilePlanRoleService;
/** application context mock */
- @Mock(name="applicationContext") protected ApplicationContext mockedApplicationContext;
+ @Mock(name="applicationContext") protected ApplicationContext mockedApplicationContext;
/** expected exception rule */
@Rule