From bea661346eaa929785e5323a46467a08eda2efb5 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Wed, 16 Jul 2014 04:45:57 +0000 Subject: [PATCH] Merged HEAD to BRANCHES/V2.1.0.x: 75186: RM Performance Improvements git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@76601 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../documentlibrary/rm-treenode.get.js | 2 +- .../AbstractCapabilityCondition.java | 37 +++++++++ .../declarative/CapabilityCondition.java | 17 ++++ .../condition/AtLeastOneCondition.java | 13 +++- .../condition/ClosedCapabilityCondition.java | 2 +- .../condition/CutoffCapabilityCondition.java | 2 +- .../DeclaredCapabilityCondition.java | 2 +- .../DestroyedCapabilityCondition.java | 2 +- .../condition/FailCapabilityCondition.java | 2 +- .../FileableCapabilityCondition.java | 2 +- .../condition/FillingCapabilityCondition.java | 2 +- .../condition/FrozenCapabilityCondition.java | 2 +- .../condition/FrozenOrHoldCondition.java | 2 +- .../HasAspectCapabilityCondition.java | 2 +- ...HasDispositionDateCapabilityCondition.java | 2 +- .../HasEventsCapabilityCondition.java | 2 +- .../IsClassifiedCapabilityCondition.java | 2 +- .../condition/IsPropertySetCondition.java | 2 +- .../condition/IsRecordCategoryCondition.java | 2 +- .../condition/IsRecordCondition.java | 2 +- .../condition/IsRecordFolderCondition.java | 2 +- .../IsScheduledCapabilityCondition.java | 2 +- ...sTransferAccessionCapabilityCondition.java | 2 +- .../LastDispositionActionCondition.java | 2 +- .../MayBeScheduledCapabilityCondition.java | 2 +- .../RecordFiledCapabilityCondition.java | 2 +- .../TransferredCapabilityCondition.java | 2 +- ...italRecordOrFolderCapabilityCondition.java | 2 +- .../ExtendedSecurityBaseDynamicAuthority.java | 26 +++++-- .../util/ServiceBaseImpl.java | 78 +++++++++++-------- .../test/issue/RM1039Test.java | 13 +++- 31 files changed, 166 insertions(+), 68 deletions(-) diff --git a/rm-server/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/rm-treenode.get.js b/rm-server/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/rm-treenode.get.js index e6cc916b1c..91305ea9b9 100644 --- a/rm-server/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/rm-treenode.get.js +++ b/rm-server/config/alfresco/templates/webscripts/org/alfresco/slingshot/documentlibrary/rm-treenode.get.js @@ -20,7 +20,7 @@ function getTreenode() "{http://www.alfresco.org/model/recordsmanagement/1.0}unfiledRecordContainer":true }, skipPermissionCheck = args["perms"] == "false", - evalChildFolders = args["children"] !== "false", + evalChildFolders = false, item, rmNode, capabilities, cap; // Use helper function to get the arguments diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/AbstractCapabilityCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/AbstractCapabilityCondition.java index 1f6eb5dc23..5374771f2f 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/AbstractCapabilityCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/AbstractCapabilityCondition.java @@ -18,11 +18,16 @@ */ package org.alfresco.module.org_alfresco_module_rm.capability.declarative; +import java.util.Map; + import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService; 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.module.org_alfresco_module_rm.record.RecordService; +import org.alfresco.repo.security.authentication.AuthenticationUtil; +import org.alfresco.repo.transaction.TransactionalResourceHelper; +import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.security.PermissionService; import org.springframework.beans.factory.BeanNameAware; @@ -36,6 +41,9 @@ public abstract class AbstractCapabilityCondition implements CapabilityCondition BeanNameAware, RecordsManagementModel { + /** transaction cache key */ + private static final String KEY_EVALUATE = "rm.transaction.evaluate"; + /** Capability condition name */ protected String name; @@ -104,6 +112,35 @@ public abstract class AbstractCapabilityCondition implements CapabilityCondition return name; } + /** + * @see org.alfresco.module.org_alfresco_module_rm.capability.declarative.CapabilityCondition#evaluate(org.alfresco.service.cmr.repository.NodeRef) + */ + @Override + public boolean evaluate(NodeRef nodeRef) + { + boolean result = false; + + // check transaction cache + Map map = TransactionalResourceHelper.getMap(KEY_EVALUATE); + String key = getName() + "|" + nodeRef.toString() + "|" + AuthenticationUtil.getRunAsUser(); + if (map.containsKey(key)) + { + result = map.get(key); + } + else + { + result = evaluateImpl(nodeRef); + map.put(key, result); + } + + return result; + } + + /** + * Condition evaluate implementation + */ + public abstract boolean evaluateImpl(NodeRef nodeRef); + /** * @see org.springframework.beans.factory.BeanNameAware#setBeanName(java.lang.String) */ diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/CapabilityCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/CapabilityCondition.java index 08032bcd22..fd792140eb 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/CapabilityCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/CapabilityCondition.java @@ -20,9 +20,26 @@ package org.alfresco.module.org_alfresco_module_rm.capability.declarative; import org.alfresco.service.cmr.repository.NodeRef; +/** + * Capability condition. + * + * @author Roy Wetherall + * @since 2.0 + */ public interface CapabilityCondition { + /** + * Get capability condition name + * + * @return {@link String} capability condition name + */ String getName(); + /** + * Evaluates capability condition. + * + * @param nodeRef node reference + * @return boolean true if evaluate success, false otherwise + */ boolean evaluate(NodeRef nodeRef); } \ No newline at end of file diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/AtLeastOneCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/AtLeastOneCondition.java index 3f2d23d392..0a4e372740 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/AtLeastOneCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/AtLeastOneCondition.java @@ -44,10 +44,21 @@ public class AtLeastOneCondition extends AbstractCapabilityCondition } /** - * @see org.alfresco.module.org_alfresco_module_rm.capability.declarative.CapabilityCondition#evaluate(org.alfresco.service.cmr.repository.NodeRef) + * Don't use the transaction cache for the composite condition + * + * @see org.alfresco.module.org_alfresco_module_rm.capability.declarative.AbstractCapabilityCondition#evaluate(org.alfresco.service.cmr.repository.NodeRef) */ @Override public boolean evaluate(NodeRef nodeRef) + { + return evaluateImpl(nodeRef); + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.capability.declarative.CapabilityCondition#evaluate(org.alfresco.service.cmr.repository.NodeRef) + */ + @Override + public boolean evaluateImpl(NodeRef nodeRef) { boolean result = false; diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/ClosedCapabilityCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/ClosedCapabilityCondition.java index 80f81730c6..7e1bdfbedd 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/ClosedCapabilityCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/ClosedCapabilityCondition.java @@ -35,7 +35,7 @@ public class ClosedCapabilityCondition extends AbstractCapabilityCondition * @see org.alfresco.module.org_alfresco_module_rm.capability.declarative.CapabilityCondition#evaluate(org.alfresco.service.cmr.repository.NodeRef) */ @Override - public boolean evaluate(NodeRef nodeRef) + public boolean evaluateImpl(NodeRef nodeRef) { boolean result = false; if (rmService.isRecordFolder(nodeRef) == true) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/CutoffCapabilityCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/CutoffCapabilityCondition.java index 37eb259e98..0c1ae1d402 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/CutoffCapabilityCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/CutoffCapabilityCondition.java @@ -30,7 +30,7 @@ public class CutoffCapabilityCondition extends AbstractCapabilityCondition * @see org.alfresco.module.org_alfresco_module_rm.capability.declarative.CapabilityCondition#evaluate(org.alfresco.service.cmr.repository.NodeRef) */ @Override - public boolean evaluate(NodeRef nodeRef) + public boolean evaluateImpl(NodeRef nodeRef) { return rmService.isCutoff(nodeRef); } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/DeclaredCapabilityCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/DeclaredCapabilityCondition.java index 6b3a9441ae..7d5a24d3ba 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/DeclaredCapabilityCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/DeclaredCapabilityCondition.java @@ -28,7 +28,7 @@ import org.alfresco.service.cmr.repository.NodeRef; public class DeclaredCapabilityCondition extends AbstractCapabilityCondition { @Override - public boolean evaluate(NodeRef nodeRef) + public boolean evaluateImpl(NodeRef nodeRef) { boolean result = false; if (FilePlanComponentKind.RECORD.equals(filePlanService.getFilePlanComponentKind(nodeRef)) == true) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/DestroyedCapabilityCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/DestroyedCapabilityCondition.java index f91fa9a47c..f035ad8f89 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/DestroyedCapabilityCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/DestroyedCapabilityCondition.java @@ -29,7 +29,7 @@ import org.alfresco.service.cmr.repository.NodeRef; public class DestroyedCapabilityCondition extends AbstractCapabilityCondition { @Override - public boolean evaluate(NodeRef nodeRef) + public boolean evaluateImpl(NodeRef nodeRef) { return nodeService.hasAspect(nodeRef, ASPECT_GHOSTED); } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/FailCapabilityCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/FailCapabilityCondition.java index a93121a22c..71af26521b 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/FailCapabilityCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/FailCapabilityCondition.java @@ -30,7 +30,7 @@ import org.alfresco.service.cmr.repository.NodeRef; public class FailCapabilityCondition extends AbstractCapabilityCondition { @Override - public boolean evaluate(NodeRef nodeRef) + public boolean evaluateImpl(NodeRef nodeRef) { return false; } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/FileableCapabilityCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/FileableCapabilityCondition.java index 942d73c8eb..fced36abf9 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/FileableCapabilityCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/FileableCapabilityCondition.java @@ -47,7 +47,7 @@ public class FileableCapabilityCondition extends AbstractCapabilityCondition * @see org.alfresco.module.org_alfresco_module_rm.capability.declarative.CapabilityCondition#evaluate(org.alfresco.service.cmr.repository.NodeRef) */ @Override - public boolean evaluate(NodeRef nodeRef) + public boolean evaluateImpl(NodeRef nodeRef) { QName type = nodeService.getType(nodeRef); // TODO and not already a record? diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/FillingCapabilityCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/FillingCapabilityCondition.java index f199155f3e..253178f14e 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/FillingCapabilityCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/FillingCapabilityCondition.java @@ -34,7 +34,7 @@ public class FillingCapabilityCondition extends AbstractCapabilityCondition * @see org.alfresco.module.org_alfresco_module_rm.capability.declarative.CapabilityCondition#evaluate(org.alfresco.service.cmr.repository.NodeRef) */ @Override - public boolean evaluate(NodeRef nodeRef) + public boolean evaluateImpl(NodeRef nodeRef) { boolean result = false; diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/FrozenCapabilityCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/FrozenCapabilityCondition.java index 4dcf1c302f..d098095d37 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/FrozenCapabilityCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/FrozenCapabilityCondition.java @@ -34,7 +34,7 @@ private boolean checkChildren = false; } @Override - public boolean evaluate(NodeRef nodeRef) + public boolean evaluateImpl(NodeRef nodeRef) { boolean result = freezeService.isFrozen(nodeRef); if (result == false && checkChildren == true) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/FrozenOrHoldCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/FrozenOrHoldCondition.java index bad4166a1b..516bdeba57 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/FrozenOrHoldCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/FrozenOrHoldCondition.java @@ -33,7 +33,7 @@ public class FrozenOrHoldCondition extends AbstractCapabilityCondition * @see org.alfresco.module.org_alfresco_module_rm.capability.declarative.CapabilityCondition#evaluate(org.alfresco.service.cmr.repository.NodeRef) */ @Override - public boolean evaluate(NodeRef nodeRef) + public boolean evaluateImpl(NodeRef nodeRef) { FilePlanComponentKind kind = filePlanService.getFilePlanComponentKind(nodeRef); return (freezeService.isFrozen(nodeRef) || diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/HasAspectCapabilityCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/HasAspectCapabilityCondition.java index c31d91a3f4..7b445c7a1b 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/HasAspectCapabilityCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/HasAspectCapabilityCondition.java @@ -46,7 +46,7 @@ public class HasAspectCapabilityCondition extends AbstractCapabilityCondition * @see org.alfresco.module.org_alfresco_module_rm.capability.declarative.CapabilityCondition#evaluate(org.alfresco.service.cmr.repository.NodeRef) */ @Override - public boolean evaluate(NodeRef nodeRef) + public boolean evaluateImpl(NodeRef nodeRef) { boolean result = false; if (aspectName != null) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/HasDispositionDateCapabilityCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/HasDispositionDateCapabilityCondition.java index d8fb70dcbc..e9bddb14e0 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/HasDispositionDateCapabilityCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/HasDispositionDateCapabilityCondition.java @@ -45,7 +45,7 @@ public class HasDispositionDateCapabilityCondition extends AbstractCapabilityCon * @see org.alfresco.module.org_alfresco_module_rm.capability.declarative.CapabilityCondition#evaluate(org.alfresco.service.cmr.repository.NodeRef) */ @Override - public boolean evaluate(NodeRef nodeRef) + public boolean evaluateImpl(NodeRef nodeRef) { boolean result = false; diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/HasEventsCapabilityCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/HasEventsCapabilityCondition.java index c2270ddced..428c1a2adf 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/HasEventsCapabilityCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/HasEventsCapabilityCondition.java @@ -45,7 +45,7 @@ public class HasEventsCapabilityCondition extends AbstractCapabilityCondition * @see org.alfresco.module.org_alfresco_module_rm.capability.declarative.CapabilityCondition#evaluate(org.alfresco.service.cmr.repository.NodeRef) */ @Override - public boolean evaluate(NodeRef nodeRef) + public boolean evaluateImpl(NodeRef nodeRef) { boolean result = false; diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsClassifiedCapabilityCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsClassifiedCapabilityCondition.java index dedf7946fa..278af947d0 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsClassifiedCapabilityCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsClassifiedCapabilityCondition.java @@ -46,7 +46,7 @@ public class IsClassifiedCapabilityCondition extends AbstractCapabilityCondition * @see org.alfresco.module.org_alfresco_module_rm.capability.declarative.CapabilityCondition#evaluate(org.alfresco.service.cmr.repository.NodeRef) */ @Override - public boolean evaluate(NodeRef nodeRef) + public boolean evaluateImpl(NodeRef nodeRef) { boolean result = false; diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsPropertySetCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsPropertySetCondition.java index 20ced1a648..7ced7736d3 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsPropertySetCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsPropertySetCondition.java @@ -66,7 +66,7 @@ public class IsPropertySetCondition extends AbstractCapabilityCondition * @see org.alfresco.module.org_alfresco_module_rm.capability.declarative.CapabilityCondition#evaluate(org.alfresco.service.cmr.repository.NodeRef) */ @Override - public boolean evaluate(NodeRef nodeRef) + public boolean evaluateImpl(NodeRef nodeRef) { ParameterCheck.mandatory("nodeRef", nodeRef); diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsRecordCategoryCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsRecordCategoryCondition.java index dd637d0983..016d7e37b0 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsRecordCategoryCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsRecordCategoryCondition.java @@ -34,7 +34,7 @@ public class IsRecordCategoryCondition extends AbstractCapabilityCondition * @see org.alfresco.module.org_alfresco_module_rm.capability.declarative.CapabilityCondition#evaluate(org.alfresco.service.cmr.repository.NodeRef) */ @Override - public boolean evaluate(NodeRef nodeRef) + public boolean evaluateImpl(NodeRef nodeRef) { ParameterCheck.mandatory("nodeRef", nodeRef); diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsRecordCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsRecordCondition.java index 72e2fb7815..ccd285a3dd 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsRecordCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsRecordCondition.java @@ -34,7 +34,7 @@ public class IsRecordCondition extends AbstractCapabilityCondition * @see org.alfresco.module.org_alfresco_module_rm.capability.declarative.CapabilityCondition#evaluate(org.alfresco.service.cmr.repository.NodeRef) */ @Override - public boolean evaluate(NodeRef nodeRef) + public boolean evaluateImpl(NodeRef nodeRef) { ParameterCheck.mandatory("nodeRef", nodeRef); diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsRecordFolderCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsRecordFolderCondition.java index cda0bbf8ea..737f2675d6 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsRecordFolderCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsRecordFolderCondition.java @@ -34,7 +34,7 @@ public class IsRecordFolderCondition extends AbstractCapabilityCondition * @see org.alfresco.module.org_alfresco_module_rm.capability.declarative.CapabilityCondition#evaluate(org.alfresco.service.cmr.repository.NodeRef) */ @Override - public boolean evaluate(NodeRef nodeRef) + public boolean evaluateImpl(NodeRef nodeRef) { ParameterCheck.mandatory("nodeRef", nodeRef); diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsScheduledCapabilityCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsScheduledCapabilityCondition.java index afea96f7eb..6dc65f183f 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsScheduledCapabilityCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsScheduledCapabilityCondition.java @@ -56,7 +56,7 @@ public class IsScheduledCapabilityCondition extends AbstractCapabilityCondition * @see org.alfresco.module.org_alfresco_module_rm.capability.declarative.CapabilityCondition#evaluate(org.alfresco.service.cmr.repository.NodeRef) */ @Override - public boolean evaluate(NodeRef nodeRef) + public boolean evaluateImpl(NodeRef nodeRef) { boolean result = false; diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsTransferAccessionCapabilityCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsTransferAccessionCapabilityCondition.java index ae9a5b68b3..2cddff0ce5 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsTransferAccessionCapabilityCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsTransferAccessionCapabilityCondition.java @@ -31,7 +31,7 @@ public class IsTransferAccessionCapabilityCondition extends AbstractCapabilityCo * @see org.alfresco.module.org_alfresco_module_rm.capability.declarative.CapabilityCondition#evaluate(org.alfresco.service.cmr.repository.NodeRef) */ @Override - public boolean evaluate(NodeRef nodeRef) + public boolean evaluateImpl(NodeRef nodeRef) { boolean result = false; diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/LastDispositionActionCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/LastDispositionActionCondition.java index bfcfea81f3..3b33f1a218 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/LastDispositionActionCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/LastDispositionActionCondition.java @@ -48,7 +48,7 @@ public class LastDispositionActionCondition extends AbstractCapabilityCondition * @see org.alfresco.module.org_alfresco_module_rm.capability.declarative.CapabilityCondition#evaluate(org.alfresco.service.cmr.repository.NodeRef) */ @Override - public boolean evaluate(NodeRef nodeRef) + public boolean evaluateImpl(NodeRef nodeRef) { boolean result = false; DispositionAction dispositionAction = dispositionService.getLastCompletedDispostionAction(nodeRef); diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/MayBeScheduledCapabilityCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/MayBeScheduledCapabilityCondition.java index a3d5de7236..22ed4ec521 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/MayBeScheduledCapabilityCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/MayBeScheduledCapabilityCondition.java @@ -57,7 +57,7 @@ public class MayBeScheduledCapabilityCondition extends AbstractCapabilityConditi * @see org.alfresco.module.org_alfresco_module_rm.capability.declarative.CapabilityCondition#evaluate(org.alfresco.service.cmr.repository.NodeRef) */ @Override - public boolean evaluate(NodeRef nodeRef) + public boolean evaluateImpl(NodeRef nodeRef) { boolean result = false; diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/RecordFiledCapabilityCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/RecordFiledCapabilityCondition.java index 2a0f002b2e..0a4fb2b10f 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/RecordFiledCapabilityCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/RecordFiledCapabilityCondition.java @@ -33,7 +33,7 @@ public class RecordFiledCapabilityCondition extends AbstractCapabilityCondition * @see org.alfresco.module.org_alfresco_module_rm.capability.declarative.CapabilityCondition#evaluate(org.alfresco.service.cmr.repository.NodeRef) */ @Override - public boolean evaluate(NodeRef nodeRef) + public boolean evaluateImpl(NodeRef nodeRef) { return recordService.isFiled(nodeRef); } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/TransferredCapabilityCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/TransferredCapabilityCondition.java index 39cdc3ff24..b4aeb0a980 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/TransferredCapabilityCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/TransferredCapabilityCondition.java @@ -28,7 +28,7 @@ import org.alfresco.service.cmr.repository.NodeRef; public class TransferredCapabilityCondition extends AbstractCapabilityCondition { @Override - public boolean evaluate(NodeRef nodeRef) + public boolean evaluateImpl(NodeRef nodeRef) { return nodeService.hasAspect(nodeRef, RecordsManagementModel.ASPECT_TRANSFERRED); } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/VitalRecordOrFolderCapabilityCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/VitalRecordOrFolderCapabilityCondition.java index 26d1342e50..d3c6b463a9 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/VitalRecordOrFolderCapabilityCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/VitalRecordOrFolderCapabilityCondition.java @@ -28,7 +28,7 @@ import org.alfresco.service.cmr.repository.NodeRef; public class VitalRecordOrFolderCapabilityCondition extends AbstractCapabilityCondition { @Override - public boolean evaluate(NodeRef nodeRef) + public boolean evaluateImpl(NodeRef nodeRef) { boolean result = false; diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedSecurityBaseDynamicAuthority.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedSecurityBaseDynamicAuthority.java index d13facebea..2c439c3519 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedSecurityBaseDynamicAuthority.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedSecurityBaseDynamicAuthority.java @@ -18,15 +18,16 @@ */ package org.alfresco.module.org_alfresco_module_rm.security; +import java.util.Map; import java.util.Set; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; import org.alfresco.repo.security.permissions.DynamicAuthority; import org.alfresco.repo.security.permissions.PermissionReference; +import org.alfresco.repo.transaction.TransactionalResourceHelper; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.security.AuthorityService; -import org.alfresco.service.cmr.security.AuthorityType; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @@ -41,6 +42,9 @@ public abstract class ExtendedSecurityBaseDynamicAuthority implements DynamicAut RecordsManagementModel, ApplicationContextAware { + /** transaction cache key */ + private static final String KEY_HAS_AUTHORITY_CACHE = "rm.transaction.hasAuthority"; + /** Authority service */ private AuthorityService authorityService; @@ -133,14 +137,24 @@ public abstract class ExtendedSecurityBaseDynamicAuthority implements DynamicAut } else if (authority.startsWith("GROUP_") == true) { - // check group to see if the user is contained - Set contained = getAuthorityService().getContainedAuthorities(AuthorityType.USER, authority, false); - if (contained.isEmpty() == false && - contained.contains(userName) == true) + Map transactionCache = TransactionalResourceHelper.getMap(KEY_HAS_AUTHORITY_CACHE); + String key = authority + "|" + userName; + if (transactionCache.containsKey(key)) + { - result = true; + result = transactionCache.get(key); break; } + else + { + Set contained = getAuthorityService().getAuthoritiesForUser(userName); + if (contained.contains(authority)) + { + result = true; + transactionCache.put(key, result); + break; + } + } } else { 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 c4494ab4df..1dfe8d7010 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 @@ -27,6 +27,7 @@ import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; +import org.alfresco.repo.transaction.TransactionalResourceHelper; import org.alfresco.service.cmr.dictionary.DictionaryService; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; @@ -96,7 +97,7 @@ public class ServiceBaseImpl implements RecordsManagementModel, ApplicationConte return internalNodeService; } - + /** * Gets the file plan component kind from the given node reference * @@ -106,41 +107,54 @@ public class ServiceBaseImpl implements RecordsManagementModel, ApplicationConte { FilePlanComponentKind result = null; - if (isFilePlanComponent(nodeRef)) + Map map = TransactionalResourceHelper.getMap("rm.transaction.filePlanComponentByNodeRef"); + if (map.containsKey(nodeRef)) { - result = FilePlanComponentKind.FILE_PLAN_COMPONENT; - - if (isFilePlan(nodeRef)) + result = map.get(nodeRef); + } + else + { + if (isFilePlanComponent(nodeRef)) { - result = FilePlanComponentKind.FILE_PLAN; + result = FilePlanComponentKind.FILE_PLAN_COMPONENT; + + if (isFilePlan(nodeRef)) + { + result = FilePlanComponentKind.FILE_PLAN; + } + else if (isRecordCategory(nodeRef)) + { + result = FilePlanComponentKind.RECORD_CATEGORY; + } + else if (isRecordFolder(nodeRef)) + { + result = FilePlanComponentKind.RECORD_FOLDER; + } + else if (isRecord(nodeRef)) + { + result = FilePlanComponentKind.RECORD; + } + else if (isHold(nodeRef)) + { + result = FilePlanComponentKind.HOLD; + } + else if (isTransfer(nodeRef)) + { + result = FilePlanComponentKind.TRANSFER; + } + else if (instanceOf(nodeRef, TYPE_DISPOSITION_SCHEDULE) || instanceOf(nodeRef, TYPE_DISPOSITION_ACTION_DEFINITION)) + { + result = FilePlanComponentKind.DISPOSITION_SCHEDULE; + } + else if (instanceOf(nodeRef, TYPE_UNFILED_RECORD_CONTAINER)) + { + result = FilePlanComponentKind.UNFILED_RECORD_CONTAINER; + } } - else if (isRecordCategory(nodeRef)) + + if (result != null) { - result = FilePlanComponentKind.RECORD_CATEGORY; - } - else if (isRecordFolder(nodeRef)) - { - result = FilePlanComponentKind.RECORD_FOLDER; - } - else if (isRecord(nodeRef)) - { - result = FilePlanComponentKind.RECORD; - } - else if (isHold(nodeRef)) - { - result = FilePlanComponentKind.HOLD; - } - else if (isTransfer(nodeRef)) - { - result = FilePlanComponentKind.TRANSFER; - } - else if (instanceOf(nodeRef, TYPE_DISPOSITION_SCHEDULE) || instanceOf(nodeRef, TYPE_DISPOSITION_ACTION_DEFINITION)) - { - result = FilePlanComponentKind.DISPOSITION_SCHEDULE; - } - else if (instanceOf(nodeRef, TYPE_UNFILED_RECORD_CONTAINER)) - { - result = FilePlanComponentKind.UNFILED_RECORD_CONTAINER; + map.put(nodeRef, result); } } diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/issue/RM1039Test.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/issue/RM1039Test.java index d3d411ba9d..e00ccb47eb 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/issue/RM1039Test.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/issue/RM1039Test.java @@ -160,13 +160,18 @@ public class RM1039Test extends BaseRMTestCase // cutoff folder actionService.executeRecordsManagementAction(testFolder, CutOffAction.NAME); - - // take a look at the move capability - Capability moveCapability = capabilityService.getCapability("Move"); - assertEquals(AccessDecisionVoter.ACCESS_DENIED, moveCapability.evaluate(testFolder, destination)); return testFolder; } + + @Override + public void test(NodeRef result) throws Exception + { + // take a look at the move capability + Capability moveCapability = capabilityService.getCapability("Move"); + assertEquals(AccessDecisionVoter.ACCESS_DENIED, moveCapability.evaluate(result, destination)); + + } }); doTestInTransaction(new FailureTest()