From b222acd167db5c95fafff32204e9559c8d430b58 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Wed, 2 Jul 2014 02:45:53 +0000 Subject: [PATCH] RM-1465: RMv21CapabilityPatch takes ages to complete * observered performance of capability patches improved * RMv21CapabilityPatch observered at 4478ms (in profiler) down to 200ms after changes git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/HEAD@75530 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../patch/rm-patch-v21-context.xml | 4 +- .../patch/rm-patch-v22-context.xml | 12 +-- .../patch/AbstractModulePatch.java | 15 +++- .../patch/common/CapabilityPatch.java | 66 ++++++-------- .../compatibility/ModulePatchComponent.java | 2 +- .../patch/v21/RMv21CapabilityPatch.java | 85 ++++++++----------- 6 files changed, 80 insertions(+), 104 deletions(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v21-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v21-context.xml index d6abeca930..3652efbb00 100755 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v21-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/patch/rm-patch-v21-context.xml @@ -48,8 +48,8 @@ - - + + - - + + - - + + - - + + \ No newline at end of file diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/AbstractModulePatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/AbstractModulePatch.java index e1cd235e39..c5db8b4cc3 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/AbstractModulePatch.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/AbstractModulePatch.java @@ -146,6 +146,9 @@ public abstract class AbstractModulePatch implements ModulePatch, BeanNameAware return moduleId; } + /** + * @param fixesFromSchema fixes from schema value + */ public void setFixesFromSchema(int fixesFromSchema) { this.fixesFromSchema = fixesFromSchema; @@ -160,6 +163,9 @@ public abstract class AbstractModulePatch implements ModulePatch, BeanNameAware return fixesFromSchema; } + /** + * @param fixesToSchema fixes to schema value + */ public void setFixesToSchema(int fixesToSchema) { this.fixesToSchema = fixesToSchema; @@ -206,15 +212,16 @@ public abstract class AbstractModulePatch implements ModulePatch, BeanNameAware ",to=" + fixesToSchema + ",target=" + targetSchema); } - + + // do patch in transaction transactionService.getRetryingTransactionHelper().doInTransaction( new ApplyCallback(), true, false); - - if (LOGGER.isDebugEnabled()) + + if (LOGGER.isInfoEnabled()) { - LOGGER.debug(" ... module patch applied"); + LOGGER.info(" ... module patch applied"); } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/common/CapabilityPatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/common/CapabilityPatch.java index e977f71e96..0ac771a89d 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/common/CapabilityPatch.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/common/CapabilityPatch.java @@ -21,13 +21,12 @@ package org.alfresco.module.org_alfresco_module_rm.patch.common; import java.util.Set; import org.alfresco.error.AlfrescoRuntimeException; -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.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; +import org.alfresco.service.cmr.security.AuthorityType; +import org.alfresco.service.cmr.security.PermissionService; /** * Abstract implementation of capability patch. @@ -40,26 +39,26 @@ public abstract class CapabilityPatch extends AbstractModulePatch /** File plan service */ private FilePlanService filePlanService; - /** File plan role service */ - private FilePlanRoleService filePlanRoleService; - - /** Capability service */ - private CapabilityService capabilityService; - + /** authority service */ + private AuthorityService authorityService; + + /** permission service */ + private PermissionService permissionService; + /** - * @param filePlanRoleService file plan role service + * @param authorityService authority service */ - public void setFilePlanRoleService(FilePlanRoleService filePlanRoleService) + public void setAuthorityService(AuthorityService authorityService) { - this.filePlanRoleService = filePlanRoleService; + this.authorityService = authorityService; } - + /** - * @param capabilityService capability service + * @param permissionService permission service */ - public void setCapabilityService(CapabilityService capabilityService) + public void setPermissionService(PermissionService permissionService) { - this.capabilityService = capabilityService; + this.permissionService = permissionService; } /** @@ -89,32 +88,17 @@ public abstract class CapabilityPatch extends AbstractModulePatch */ protected void addCapability(NodeRef filePlan, String capabilityName, String ... roles) { - Capability capability = capabilityService.getCapability(capabilityName); - if (capability == null) + for (String role : roles) { - throw new AlfrescoRuntimeException("Can't patch capabilities, because capability " + capabilityName + " does not exist."); - } - - for (String roleName : roles) - { - Role role = filePlanRoleService.getRole(filePlan, roleName); - - if (role != null) + String fullRoleName = role + filePlan.getId(); + String roleAuthority = authorityService.getName(AuthorityType.GROUP, fullRoleName); + if (roleAuthority == null) { - // get the roles current capabilities - Set capabilities = role.getCapabilities(); - - // only update if the capability is missing - if (!capabilities.contains(capability)) - { - if (LOGGER.isDebugEnabled()) - { - LOGGER.debug(" ... adding capability " + capabilityName + " to role " + role.getName()); - } - - capabilities.add(capability); - filePlanRoleService.updateRole(filePlan, role.getName(), role.getDisplayLabel(), capabilities); - } + throw new AlfrescoRuntimeException("Role " + role + " does not exist."); + } + else + { + permissionService.setPermission(filePlan, roleAuthority, capabilityName, true); } } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/compatibility/ModulePatchComponent.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/compatibility/ModulePatchComponent.java index 2367da6b41..e2232b6d1b 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/compatibility/ModulePatchComponent.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/compatibility/ModulePatchComponent.java @@ -93,7 +93,7 @@ public abstract class ModulePatchComponent extends AbstractModuleComponent { LOGGER.info("Module patch component '" + getName() + "' is executing ..."); } - + // execute path within an isolated transaction retryingTransactionHelper.doInTransaction(new RetryingTransactionHelper.RetryingTransactionCallback() { diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21CapabilityPatch.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21CapabilityPatch.java index 6bd9855bfa..8844cba92b 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21CapabilityPatch.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/patch/v21/RMv21CapabilityPatch.java @@ -21,12 +21,12 @@ package org.alfresco.module.org_alfresco_module_rm.patch.v21; import java.util.Set; import org.alfresco.error.AlfrescoRuntimeException; -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.fileplan.FilePlanService; 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; +import org.alfresco.service.cmr.security.AuthorityType; +import org.alfresco.service.cmr.security.PermissionService; /** * RM v2.1 patch to updated modified capabilities. @@ -39,28 +39,12 @@ public class RMv21CapabilityPatch extends RMv21PatchComponent { /** File plan service */ private FilePlanService filePlanService; - - /** File plan role service */ - private FilePlanRoleService filePlanRoleService; - - /** Capability service */ - private CapabilityService capabilityService; - - /** - * @param filePlanRoleService file plan role service - */ - public void setFilePlanRoleService(FilePlanRoleService filePlanRoleService) - { - this.filePlanRoleService = filePlanRoleService; - } - - /** - * @param capabilityService capability service - */ - public void setCapabilityService(CapabilityService capabilityService) - { - this.capabilityService = capabilityService; - } + + /** authority service */ + private AuthorityService authorityService; + + /** permission service */ + private PermissionService permissionService; /** * @param filePlanService file plan service @@ -78,6 +62,22 @@ public class RMv21CapabilityPatch extends RMv21PatchComponent protected Set getFilePlans() { return filePlanService.getFilePlans(); + } + + /** + * @param authorityService authority service + */ + public void setAuthorityService(AuthorityService authorityService) + { + this.authorityService = authorityService; + } + + /** + * @param permissionService permission service + */ + public void setPermissionService(PermissionService permissionService) + { + this.permissionService = permissionService; } /** @@ -87,34 +87,19 @@ public class RMv21CapabilityPatch extends RMv21PatchComponent * @param capabilityName capability name * @param roles roles */ - protected void addCapability(NodeRef filePlan, String capabilityName, String ... roles) + private void addCapability(NodeRef filePlan, String capabilityName, String ... roles) { - Capability capability = capabilityService.getCapability(capabilityName); - if (capability == null) + for (String role : roles) { - throw new AlfrescoRuntimeException("Unable to bootstrap RMv21 capabilities, because capability " + capabilityName + " does not exist."); - } - - for (String roleName : roles) - { - Role role = filePlanRoleService.getRole(filePlan, roleName); - - if (role != null) + String fullRoleName = role + filePlan.getId(); + String roleAuthority = authorityService.getName(AuthorityType.GROUP, fullRoleName); + if (roleAuthority == null) { - // get the roles current capabilities - Set capabilities = role.getCapabilities(); - - // only update if the capability is missing - if (!capabilities.contains(capability)) - { - if (LOGGER.isDebugEnabled()) - { - LOGGER.debug(" ... adding capability " + capabilityName + " to role " + role.getName()); - } - - capabilities.add(capability); - filePlanRoleService.updateRole(filePlan, role.getName(), role.getDisplayLabel(), capabilities); - } + throw new AlfrescoRuntimeException("Role " + role + " does not exist."); + } + else + { + permissionService.setPermission(filePlan, roleAuthority, capabilityName, true); } } }