From 75c8dbc579fb7150d00a81bb886fd4c5e1135df1 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Sat, 28 Jun 2014 04:54:04 +0000 Subject: [PATCH] RM Performance Improvements: * focus on in-place scenarios with large numbers of DM users and large numbers of in-place records (based on issue informally reported by partner) * improve performance of dynamic authorities used for in-place security evaluation (L1 transaction cache and more preformant authority look up) * remove unwanted queries in tree (N+1 for every node) .. killed it for large file plans * L1 transaction cache for capability condition evaluation .. these are called a LOT so removes some of the bottle necks when evaluating the permissions of a large sets of nodes * extend helper system test used to load up fileplan and now also create in-place records * unit and integration tests run .. sanity testing done via the UI * overall performance of the display of 1000 in-place records in the file plan down from minutes to a few seconds! git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/HEAD@75186 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../documentlibrary/rm-treenode.get.js | 2 +- .../capability/RMSecurityCommon.java | 1 + .../AbstractCapabilityCondition.java | 34 ++++++ .../declarative/CapabilityCondition.java | 17 +++ .../condition/AtLeastOneCondition.java | 8 +- .../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 +- .../condition/HoldCapabilityCondition.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 | 25 +++-- .../util/ServiceBaseImpl.java | 102 ++++++++++-------- .../recordfolder/MoveRecordFolderTest.java | 8 +- .../legacy/action/FileReportActionTest.java | 25 +++-- .../test/system/DataLoadSystemTest.java | 71 +++++++++++- .../HoldCapabilityConditionUnitTest.java | 6 +- ...FilePlanPermissionServiceImplUnitTest.java | 12 +++ 37 files changed, 267 insertions(+), 94 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/RMSecurityCommon.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/RMSecurityCommon.java index f004cec040..2b53e8dabd 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/RMSecurityCommon.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/RMSecurityCommon.java @@ -38,6 +38,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; +import org.springframework.extensions.webscripts.GUID; /** 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 5f7313290c..b7d400a4e7 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,12 +18,17 @@ */ package org.alfresco.module.org_alfresco_module_rm.capability.declarative; +import java.util.Map; + import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionService; 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.module.org_alfresco_module_rm.recordfolder.RecordFolderService; +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; @@ -37,6 +42,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; @@ -113,6 +121,32 @@ 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; + } + + 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 de472c18ab..68c682c2fe 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 ab5a31fcad..4e3c80baf3 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 @@ -42,12 +42,18 @@ public class AtLeastOneCondition extends AbstractCapabilityCondition { this.conditions = conditions; } + + @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 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/ClosedCapabilityCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/ClosedCapabilityCondition.java index 21c5706e83..84ae618591 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 (recordFolderService.isRecordFolder(nodeRef)) 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 36a52daaa1..d9392db42c 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 @@ -32,7 +32,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) { // determine whether the item is already cutt off return dispositionService.isDisposableItemCutoff(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 c879563809..ebd7f8cff1 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))) 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 eb103fa25c..fda8922fc1 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 01e48b3c75..37be9ba386 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 427a47ccee..60e01ad3eb 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 610afba5ce..a443ed5d66 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 218ad96ee8..dd271ed432 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 && checkChildren) 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 445678fe95..12ada202ae 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 cc581525e9..f4e23f88a1 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 15c22884bd..ad2a75eb65 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 dac92b4ea0..8b5cac1239 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/HoldCapabilityCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/HoldCapabilityCondition.java index 535a9ebcc6..9666de3539 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/HoldCapabilityCondition.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/HoldCapabilityCondition.java @@ -58,7 +58,7 @@ public class HoldCapabilityCondition 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/capability/declarative/condition/IsClassifiedCapabilityCondition.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/IsClassifiedCapabilityCondition.java index ef578c5908..a2e3c4fc82 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 61b056b54e..00483e911c 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 9525c14390..44198c4caa 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 1cae0d2b7f..94dcdb4627 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 46f8fe558e..e3662049d6 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 c35656cc1b..902e94314d 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 bca0799c84..d75c5ff719 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 96c6d5758b..b6281ac3c7 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 8a09897d5f..2a2523760d 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 56cb1706f4..4ab2be8ec4 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 10cd49c9b5..7c19e3348a 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 b417501c7f..41071bd287 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 fa129f936e..170af81010 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.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @@ -40,6 +41,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; @@ -132,14 +136,23 @@ public abstract class ExtendedSecurityBaseDynamicAuthority implements DynamicAut } else if (authority.startsWith("GROUP_")) { - // check group to see if the user is contained - Set contained = getAuthorityService().getContainedAuthorities(AuthorityType.USER, authority, false); - if (!contained.isEmpty() && - contained.contains(userName)) + 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 db9e4d32f3..5492868b47 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 @@ -28,6 +28,7 @@ import org.alfresco.module.org_alfresco_module_rm.hold.HoldService; 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; @@ -97,7 +98,7 @@ public class ServiceBaseImpl implements RecordsManagementModel, ApplicationConte return internalNodeService; } - + /** * Gets the file plan component kind from the given node reference * @@ -107,53 +108,66 @@ 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 (instanceOf(nodeRef, TYPE_HOLD_CONTAINER)) + { + result = FilePlanComponentKind.HOLD_CONTAINER; + } + else if (isHold(nodeRef)) + { + result = FilePlanComponentKind.HOLD; + } + else if (instanceOf(nodeRef, TYPE_TRANSFER_CONTAINER)) + { + result = FilePlanComponentKind.TRANSFER_CONTAINER; + } + 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 (instanceOf(nodeRef, TYPE_UNFILED_RECORD_FOLDER)) + { + result = FilePlanComponentKind.UNFILED_RECORD_FOLDER; + } } - 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 (instanceOf(nodeRef, TYPE_HOLD_CONTAINER)) - { - result = FilePlanComponentKind.HOLD_CONTAINER; - } - else if (isHold(nodeRef)) - { - result = FilePlanComponentKind.HOLD; - } - else if (instanceOf(nodeRef, TYPE_TRANSFER_CONTAINER)) - { - result = FilePlanComponentKind.TRANSFER_CONTAINER; - } - 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 (instanceOf(nodeRef, TYPE_UNFILED_RECORD_FOLDER)) - { - result = FilePlanComponentKind.UNFILED_RECORD_FOLDER; + map.put(nodeRef, result); } } diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/recordfolder/MoveRecordFolderTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/recordfolder/MoveRecordFolderTest.java index 2e18dc091e..e0f383a5bf 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/recordfolder/MoveRecordFolderTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/recordfolder/MoveRecordFolderTest.java @@ -415,11 +415,15 @@ public class MoveRecordFolderTest extends BaseRMTestCase // cutoff folder rmActionService.executeRecordsManagementAction(testFolder, CutOffAction.NAME); + return testFolder; + } + + @Override + public void test(NodeRef testFolder) throws Exception + { // take a look at the move capability Capability moveCapability = capabilityService.getCapability("Move"); assertEquals(AccessDecisionVoter.ACCESS_DENIED, moveCapability.evaluate(testFolder, destination)); - - return testFolder; } }); diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/action/FileReportActionTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/action/FileReportActionTest.java index f1e17bfa7c..5b0c8a11b0 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/action/FileReportActionTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/action/FileReportActionTest.java @@ -55,7 +55,10 @@ public class FileReportActionTest extends BaseRMTestCase { // create record folder final NodeRef recordFolder = recordFolderService.createRecordFolder(rmContainer, GUID.generate()); - + + // close the record folder + recordFolderService.closeRecordFolder(recordFolder); + // create hold final NodeRef hold = holdService.createHold(filePlan, "holdName", "holdReason", "holdDescription"); @@ -63,10 +66,7 @@ public class FileReportActionTest extends BaseRMTestCase { @Override public void run() throws Exception - { - // close the record folder - recordFolderService.closeRecordFolder(recordFolder); - + { // execute action executeAction(mimeType, recordFolder, hold); } @@ -77,14 +77,17 @@ public class FileReportActionTest extends BaseRMTestCase public Void run() { // reopen the record folder - nodeService.setProperty(recordFolder, PROP_IS_CLOSED, false); - - // execute action - executeAction(mimeType, recordFolder, hold); - + rmActionService.executeRecordsManagementAction(recordFolder, "openRecordFolder"); return null; } - }, ADMIN_USER); + + @Override + public void test(Void result) throws Exception + { + // execute action + executeAction(mimeType, recordFolder, hold); + } + }); } private void executeAction(String mimeType, NodeRef recordFolder, NodeRef hold) diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/system/DataLoadSystemTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/system/DataLoadSystemTest.java index 9694368c04..3cb06071bd 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/system/DataLoadSystemTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/system/DataLoadSystemTest.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.Map; import org.alfresco.model.ContentModel; +import org.alfresco.module.org_alfresco_module_rm.action.RecordsManagementActionService; import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; import org.alfresco.module.org_alfresco_module_rm.record.RecordService; import org.alfresco.module.org_alfresco_module_rm.recordfolder.RecordFolderService; @@ -15,11 +16,15 @@ import org.alfresco.module.org_alfresco_module_rm.test.util.CommonRMTestUtils; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; +import org.alfresco.service.cmr.model.FileFolderService; 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.MutableAuthenticationService; import org.alfresco.service.cmr.security.PersonService; +import org.alfresco.service.cmr.site.SiteInfo; +import org.alfresco.service.cmr.site.SiteRole; +import org.alfresco.service.cmr.site.SiteService; import org.alfresco.service.namespace.QName; import org.alfresco.service.transaction.TransactionService; import org.alfresco.util.ApplicationContextHelper; @@ -40,6 +45,8 @@ public class DataLoadSystemTest protected MutableAuthenticationService authenticationService; protected PersonService personService; protected FilePlanRoleService filePlanRoleService; + protected SiteService siteService; + protected FileFolderService fileFolderService; /** config locations */ protected String[] getConfigLocations() @@ -63,6 +70,10 @@ public class DataLoadSystemTest private static final int RM_GROUP_COUNT = 0; private static final int RM_USER_COUNT = 0; + /** inplace sizing */ + private static final int USER_COUNT = 0; + private static final int INPLACE_RECORD_COUNT = 5000; + /** application context */ private ApplicationContext applicationContext; CommonRMTestUtils utils; @@ -86,13 +97,71 @@ public class DataLoadSystemTest authenticationService = (MutableAuthenticationService)applicationContext.getBean("AuthenticationService"); personService = (PersonService)applicationContext.getBean("personService"); filePlanRoleService = (FilePlanRoleService)applicationContext.getBean("filePlanRoleService"); + siteService = (SiteService)applicationContext.getBean("siteService"); + fileFolderService = (FileFolderService)applicationContext.getBean("fileFolderService"); } @Test - private void loadAllData() + public void loadAllData() { loadFilePlanData(); loadRMUsersAndGroups(); + loadInPlace(); + } + + private void loadInPlace() + { + AuthenticationUtil.runAs(new RunAsWork() + { + public Void doWork() throws Exception + { + final SiteInfo site = siteService.getSite("test"); + if (site == null) + { + Assert.fail("The collab site test is not present."); + } + + final NodeRef filePlan = filePlanService.getFilePlanBySiteId(FilePlanService.DEFAULT_RM_SITE_ID); + if (filePlan == null) + { + Assert.fail("The default RM site is not present."); + } + + // create users and add to site + repeatInTransactionBatches(new RunAsWork() + { + public Void doWork() throws Exception + { + // create user + String userName = GUID.generate(); + System.out.println("Creating user " + userName); + createPerson(userName, true); + + // add to collab site + siteService.setMembership("test", userName, SiteRole.SiteCollaborator.toString()); + + return null; + } + }, USER_COUNT); + + // create content and declare as record + repeatInTransactionBatches(new RunAsWork() + { + public Void doWork() throws Exception + { + // create document + NodeRef docLib = siteService.getContainer(site.getShortName(), SiteService.DOCUMENT_LIBRARY); + NodeRef document = fileFolderService.create(docLib, GUID.generate(), ContentModel.TYPE_CONTENT).getNodeRef(); + + recordService.createRecord(filePlan, document); + + return null; + } + }, INPLACE_RECORD_COUNT); + + return null; + } + }, AuthenticationUtil.getAdminUserName()); } diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/HoldCapabilityConditionUnitTest.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/HoldCapabilityConditionUnitTest.java index 2f4f312a20..14cee5c43a 100644 --- a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/HoldCapabilityConditionUnitTest.java +++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/condition/HoldCapabilityConditionUnitTest.java @@ -94,7 +94,7 @@ public class HoldCapabilityConditionUnitTest extends BaseUnitTest doReturn(Collections.EMPTY_LIST).when(mockedHoldService).heldBy(eq(recordFolder), anyBoolean()); // when - boolean result = evaluator.evaluate(recordFolder); + boolean result = evaluator.evaluateImpl(recordFolder); // then assertFalse(result); @@ -114,7 +114,7 @@ public class HoldCapabilityConditionUnitTest extends BaseUnitTest doReturn(AccessStatus.DENIED).when(mockedPermissionService).hasPermission(hold2, RMPermissionModel.FILING); // when - boolean result = evaluator.evaluate(recordFolder); + boolean result = evaluator.evaluateImpl(recordFolder); // then assertFalse(result); @@ -134,7 +134,7 @@ public class HoldCapabilityConditionUnitTest extends BaseUnitTest doReturn(AccessStatus.ALLOWED).when(mockedPermissionService).hasPermission(hold2, RMPermissionModel.FILING); // when - boolean result = evaluator.evaluate(recordFolder); + boolean result = evaluator.evaluateImpl(recordFolder); // then assertTrue(result); diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImplUnitTest.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImplUnitTest.java index ea570c3ed8..f3eac28f0b 100644 --- a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImplUnitTest.java +++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImplUnitTest.java @@ -31,6 +31,7 @@ import java.util.Set; import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel; +import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanComponentKind; import org.alfresco.module.org_alfresco_module_rm.test.util.BaseUnitTest; import org.alfresco.repo.security.permissions.impl.AccessPermissionImpl; import org.alfresco.service.cmr.repository.NodeRef; @@ -128,6 +129,17 @@ public class FilePlanPermissionServiceImplUnitTest extends BaseUnitTest makeChildrenOf(holdContainer, hold); makeChildrenOf(hold, heldRecord); + + doReturn(FilePlanComponentKind.FILE_PLAN).when(filePlanPermissionService).getFilePlanComponentKind(filePlan); + doReturn(FilePlanComponentKind.RECORD_CATEGORY).when(filePlanPermissionService).getFilePlanComponentKind(rootRecordCategory); + doReturn(FilePlanComponentKind.RECORD_CATEGORY).when(filePlanPermissionService).getFilePlanComponentKind(recordCategory); + doReturn(FilePlanComponentKind.RECORD_FOLDER).when(filePlanPermissionService).getFilePlanComponentKind(newRecordFolder); + doReturn(FilePlanComponentKind.RECORD).when(filePlanPermissionService).getFilePlanComponentKind(newRecord); + doReturn(FilePlanComponentKind.UNFILED_RECORD_FOLDER).when(filePlanPermissionService).getFilePlanComponentKind(unfiledRecordFolder); + doReturn(FilePlanComponentKind.UNFILED_RECORD_CONTAINER).when(filePlanPermissionService).getFilePlanComponentKind(unfiledRecordContainer); + doReturn(FilePlanComponentKind.RECORD).when(filePlanPermissionService).getFilePlanComponentKind(unfiledRecord); + doReturn(FilePlanComponentKind.HOLD_CONTAINER).when(filePlanPermissionService).getFilePlanComponentKind(holdContainer); + doReturn(FilePlanComponentKind.HOLD).when(filePlanPermissionService).getFilePlanComponentKind(hold); } /**