diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/log4j.properties b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/log4j.properties index 701dae81e6..a8fbf50130 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/log4j.properties +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/log4j.properties @@ -13,7 +13,7 @@ log4j.logger.org.alfresco.module.org_alfresco_module_rm.patch=info # Set to 'debug' to see details of capability failures when AccessDenied is thrown. May be # removed to enhance performance. # -log4j.logger.org.alfresco.module.org_alfresco_module_rm.security.RMMethodSecurityInterceptor=debug +log4j.logger.org.alfresco.module.org_alfresco_module_rm.security.RMMethodSecurityInterceptor=info # # RM permission debug diff --git a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-ui-evaluators-context.xml b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-ui-evaluators-context.xml index 3d8ea5c7e4..3c12a64720 100644 --- a/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-ui-evaluators-context.xml +++ b/rm-community/rm-community-repo/config/alfresco/module/org_alfresco_module_rm/rm-ui-evaluators-context.xml @@ -35,9 +35,10 @@ - + + availableKinds; /** * @param permissions permissions @@ -258,6 +262,27 @@ public class DeclarativeCapability extends AbstractCapability { return checkConditions(nodeRef, conditions); } + + /** + * Get list of available kinds + * + * @return list of available kinds + */ + + private Set getAvailableKinds() + { + if (kinds != null && availableKinds == null) + { + availableKinds = new HashSet(kinds.size()); + for (String kindString : kinds) + { + FilePlanComponentKind kind = FilePlanComponentKind.valueOf(kindString); + availableKinds.add(kind); + } + } + + return availableKinds; + } /** * Checks that the node ref is of the expected kind @@ -273,23 +298,9 @@ public class DeclarativeCapability extends AbstractCapability if (actualKind != null) { - if (kinds != null && !kinds.isEmpty()) + Set availableKinds = getAvailableKinds(); + if (availableKinds == null || availableKinds.contains(actualKind)) { - // need to check the actual file plan kind is in the list specified - for (String kindString : kinds) - { - FilePlanComponentKind kind = FilePlanComponentKind.valueOf(kindString); - if (actualKind.equals(kind)) - { - result = true; - break; - } - } - } - else - { - // we don't have any specific kinds to check, so we pass since we have a file - // plan component in our hands result = true; } } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/BaseEvaluator.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/BaseEvaluator.java index 2e734b6c2d..a75ed6d3d2 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/BaseEvaluator.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/BaseEvaluator.java @@ -40,20 +40,26 @@ import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; 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.util.TransactionalResourceHelper; +import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.security.AccessStatus; import org.alfresco.service.namespace.NamespaceService; +import org.springframework.beans.factory.BeanNameAware; /** * Base evaluator. * * @author Roy Wetherall */ -public abstract class BaseEvaluator implements RecordsManagementModel +public abstract class BaseEvaluator implements RecordsManagementModel, BeanNameAware { /** Name */ protected String name; + + /** bean name */ + protected String beanName; /** JSON conversion component */ protected JSONConversionComponent jsonConversionComponent; @@ -84,7 +90,19 @@ public abstract class BaseEvaluator implements RecordsManagementModel /** Record folder service */ protected RecordFolderService recordFolderService; + + /** transactional resource helper */ + protected TransactionalResourceHelper transactionalResourceHelper; + /** + * @param beanName bean name + */ + @Override + public void setBeanName(String beanName) + { + this.beanName = beanName; + } + /** * @param jsonConversionComponent json conversion component */ @@ -148,6 +166,14 @@ public abstract class BaseEvaluator implements RecordsManagementModel { this.recordFolderService = recordFolderService; } + + /** + * @param transactionalResourceHelper transactional resource helper + */ + public void setTransactionalResourceHelper(TransactionalResourceHelper transactionalResourceHelper) + { + this.transactionalResourceHelper = transactionalResourceHelper; + } /** * @param name @@ -217,17 +243,25 @@ public abstract class BaseEvaluator implements RecordsManagementModel */ public boolean evaluate(NodeRef nodeRef) { - boolean result = false; - - // Check that we are dealing with the correct kind of RM object - if ((kinds == null || checkKinds(nodeRef)) && - // Check we have the required capabilities - (capabilities == null || checkCapabilities(nodeRef))) + Map results = transactionalResourceHelper.getMap("BaseEvaluator.evaluate"); + String key = new StringBuffer(nodeRef.toString()).append(AuthenticationUtil.getRunAsUser()).append(beanName).toString(); + + if (!results.containsKey(key)) { - result = evaluateImpl(nodeRef); + boolean result = false; + + // Check that we are dealing with the correct kind of RM object + if ((kinds == null || checkKinds(nodeRef)) && + // Check we have the required capabilities + (capabilities == null || checkCapabilities(nodeRef))) + { + result = evaluateImpl(nodeRef); + } + + results.put(key, result); } - return result; + return results.get(key); } /**