From a9d1335faf4d8d3a941d098d61550485d0c1f4ef Mon Sep 17 00:00:00 2001 From: Alan Davis Date: Thu, 1 May 2014 16:04:55 +0000 Subject: [PATCH 01/54] Create V2.1.0.x branch from HEAD r56859 build 630, to host hotfixes git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@68558 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 From c4d718e9942ed7be7abb94393553a06fbbbca15a Mon Sep 17 00:00:00 2001 From: Samuel Langlois Date: Thu, 1 May 2014 16:18:05 +0000 Subject: [PATCH 02/54] Change base Alfresco version from 4.2.0-RC4 to 4.2.0 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@68559 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 454a46e927..afb6ace3a1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,7 +15,7 @@ alfrescoEnterpriseMavenPwd= # set to org.alfresco.enterprise when enterprise version required alfrescoGroupId=org.alfresco -alfrescoBaseVersion=4.2.0-RC4 +alfrescoBaseVersion=4.2.0 # indicates whether this is a local build or not localBuild=true From 8df4f7b6665a5daaa6daa230b2d46af9e0b0c226 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Fri, 2 May 2014 03:31:42 +0000 Subject: [PATCH 03/54] Merge from HEAD to BRANCHES/V2.1.0.x * 61170 - RM-1413: DispositionLifecycleJobExecuter does not execute the disposition action git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@68568 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../org_alfresco_module_rm/log4j.properties | 10 +- .../org_alfresco_module_rm/rm-job-context.xml | 19 +- .../job/DispositionLifecycleJobExecuter.java | 167 ++++++++++++------ 3 files changed, 142 insertions(+), 54 deletions(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/log4j.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/log4j.properties index b5bdc8f089..7039db6a8f 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/log4j.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/log4j.properties @@ -18,4 +18,12 @@ log4j.logger.org.alfresco.module.org_alfresco_module_rm.patch=info #log4j.logger.org.alfresco.module.org_alfresco_module_rm.record.RecordServiceImpl=debug #log4j.logger.org.springframework.extensions.webscripts.ScriptDebugger=on -#log4j.logger.org.alfresco.module.org_alfresco_module_rm.audit.RecordsManagementAuditService=debug \ No newline at end of file +# +# RM Audit service debug +# +#log4j.logger.org.alfresco.module.org_alfresco_module_rm.audit.RecordsManagementAuditService=debug + +# +# Job debug +# +#log4j.logger.org.alfresco.module.org_alfresco_module_rm.job=debug diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-job-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-job-context.xml index 21358a322b..aa9d4a9ac9 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-job-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-job-context.xml @@ -72,6 +72,15 @@ + + + + + cutoff + retain + + + @@ -85,8 +94,16 @@ + + - 0 0/15 * * * ? + + + + + + 0/30 * * * * ? + diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuter.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuter.java index 141be63303..0dc25b859c 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuter.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuter.java @@ -40,39 +40,111 @@ import org.apache.commons.logging.LogFactory; /** * The Disposition Lifecycle Job Finds all disposition action nodes which are - * for "retain" or "cutOff" actions Where asOf > now OR - * dispositionEventsEligible = true; - * + * for disposition actions specified Where asOf > now OR + * dispositionEventsEligible = true; + * * Runs the cut off or retain action for - * elligible records. - * + * eligible records. + * * @author mrogers + * @author Roy Wetherall */ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecuter { + /** logger */ private static Log logger = LogFactory.getLog(DispositionLifecycleJobExecuter.class); + + /** list of disposition actions to automatically execute */ + private List dispositionActions; + + /** query string */ + private String query; + /** records management action service */ private RecordsManagementActionService recordsManagementActionService; - + + /** node service */ private NodeService nodeService; - + + /** search service */ private SearchService searchService; + + /** + * List of disposition actions to automatically execute when eligible. + * + * @param dispositionActions disposition actions + */ + public void setDispositionActions(List dispositionActions) + { + this.dispositionActions = dispositionActions; + } + /** + * @param recordsManagementActionService records management action service + */ public void setRecordsManagementActionService(RecordsManagementActionService recordsManagementActionService) { this.recordsManagementActionService = recordsManagementActionService; } - + + /** + * @param nodeService node service + */ public void setNodeService(NodeService nodeService) { this.nodeService = nodeService; } - + + /** + * @param searchService search service + */ public void setSearchService(SearchService searchService) { this.searchService = searchService; } + /** + * Get the search query string. + * + * @return job query string + */ + private String getQuery() + { + if (query == null) + { + StringBuilder sb = new StringBuilder(); + + sb.append("+TYPE:\"rma:dispositionAction\" "); + sb.append("+(@rma\\:dispositionAction:("); + + boolean bFirst = true; + for (String dispositionAction : dispositionActions) + { + if (bFirst) + { + bFirst = false; + } + else + { + sb.append(" OR "); + } + + sb.append("\"").append(dispositionAction).append("\""); + } + + sb.append("))"); + sb.append("+ISNULL:\"rma:dispositionActionCompletedAt\" "); + sb.append("+( "); + sb.append("@rma\\:dispositionEventsEligible:true "); + sb.append("OR @rma\\:dispositionAsOf:[MIN TO NOW] "); + sb.append(") "); + + query = sb.toString(); + } + + return query; + } + /** * @see org.alfresco.module.org_alfresco_module_rm.job.RecordsManagementJobExecuter#execute() */ @@ -81,75 +153,66 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute try { logger.debug("Job Starting"); - - StringBuilder sb = new StringBuilder(); - sb.append("+TYPE:\"rma:dispositionAction\" "); - sb.append("+(@rma\\:dispositionAction:(\"cutoff\" OR \"retain\"))"); - sb.append("+ISNULL:\"rma:dispositionActionCompletedAt\" "); - sb.append("+( "); - sb.append("@rma\\:dispositionEventsEligible:true "); - sb.append("OR @rma\\:dispositionAsOf:[MIN TO NOW] "); - sb.append(") "); - - String query = sb.toString(); - - ResultSet results = searchService.query(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, - SearchService.LANGUAGE_LUCENE, query); - List resultNodes = results.getNodeRefs(); - results.close(); - - - for (NodeRef node : resultNodes) + + if (dispositionActions != null && !dispositionActions.isEmpty()) { - final NodeRef currentNode = node; + // execute search + ResultSet results = searchService.query(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, SearchService.LANGUAGE_LUCENE, getQuery()); + List resultNodes = results.getNodeRefs(); + results.close(); - RetryingTransactionCallback processTranCB = new RetryingTransactionCallback() + if (logger.isDebugEnabled()) { - public Boolean execute() throws Throwable + logger.debug("Processing " + resultNodes.size() + " nodes"); + } + + // process search results + for (NodeRef node : resultNodes) + { + final NodeRef currentNode = node; + + RetryingTransactionCallback processTranCB = new RetryingTransactionCallback() { - final String dispAction = (String) nodeService.getProperty(currentNode, - RecordsManagementModel.PROP_DISPOSITION_ACTION); - - // Run "retain" and "cutoff" actions. - - if (dispAction != null) + public Boolean execute() throws Throwable { - if (dispAction.equalsIgnoreCase("cutoff") || - dispAction.equalsIgnoreCase("retain")) + final String dispAction = (String) nodeService.getProperty(currentNode, RecordsManagementModel.PROP_DISPOSITION_ACTION); + + // Run disposition action + if (dispAction != null && dispositionActions.contains(dispAction)) { ChildAssociationRef parent = nodeService.getPrimaryParent(currentNode); if (parent.getTypeQName().equals(RecordsManagementModel.ASSOC_NEXT_DISPOSITION_ACTION)) { Map props = new HashMap(1); props.put(RMDispositionActionExecuterAbstractBase.PARAM_NO_ERROR_CHECK, Boolean.FALSE); + + // execute disposition action recordsManagementActionService.executeRecordsManagementAction(parent.getParentRef(), dispAction, props); + if (logger.isDebugEnabled()) { logger.debug("Processed action: " + dispAction + "on" + parent); } } - return null; } + + return Boolean.TRUE; } - return Boolean.TRUE; + }; + + // if exists + if (nodeService.exists(currentNode)) + { + retryingTransactionHelper.doInTransaction(processTranCB); } - }; - - /** - * Now do the work, one action in each transaction - */ - - if (nodeService.exists(currentNode) == false) - { - retryingTransactionHelper.doInTransaction(processTranCB); } } - + logger.debug("Job Finished"); } catch (AlfrescoRuntimeException exception) { - if (logger.isDebugEnabled() == true) + if (logger.isDebugEnabled()) { logger.debug(exception); } From 458cc51bb4dfcecb552c19666465b772c95e645c Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Fri, 2 May 2014 03:45:06 +0000 Subject: [PATCH 04/54] Update module version to 2.1.0.1 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@68569 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- gradle.properties | 2 +- .../alfresco/module/org_alfresco_module_rm/module.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index afb6ace3a1..4aa7cc4c10 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ # build details groupid=alfresco packageName=rm -version=2.1.0 +version=2.1.0.1 build=dev # maven urls's diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties index 6f31dc07f2..79697c6903 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties @@ -6,6 +6,6 @@ module.aliases=org_alfresco_module_dod5015 module.title=Records Management module.description=Alfresco Record Management Extension -module.version=2.1 +module.version=2.1.0.1 module.repo.version.min=4.2 \ No newline at end of file From badcc343342e3a534ef5e91e578e548191f05d71 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Wed, 9 Jul 2014 01:00:55 +0000 Subject: [PATCH 05/54] RM 2.2.N branch git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.2@76114 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 From 06b0a3d59df6cdca123a0dacd5721a3a98d458ee Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Wed, 9 Jul 2014 02:48:29 +0000 Subject: [PATCH 06/54] Update version to 2.1.1 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.2@76115 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- pom.xml | 2 +- .../alfresco/module/org_alfresco_module_rm/module.properties | 2 +- rm-server/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 463cbae9e8..9b2b7c9fb3 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.alfresco alfresco-rm-parent pom - 2.2-SNAPSHOT + 2.2.1-SNAPSHOT Alfresco Records Management http://www.alfresco.org/ diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties index 5ccd7180cc..ece629124a 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties @@ -6,6 +6,6 @@ module.aliases=org_alfresco_module_dod5015 module.title=Records Management module.description=Alfresco Record Management Extension -module.version=2.2 +module.version=2.2.1 module.repo.version.min=4.2 \ No newline at end of file diff --git a/rm-server/pom.xml b/rm-server/pom.xml index edb0e905a5..c79a190b9a 100644 --- a/rm-server/pom.xml +++ b/rm-server/pom.xml @@ -5,7 +5,7 @@ org.alfresco alfresco-rm-parent - 2.2-SNAPSHOT + 2.2.1-SNAPSHOT 4.0.0 alfresco-rm-server From 7b870be4089ec1cc8523544c8585d279f6678c57 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Mon, 14 Jul 2014 07:14:35 +0000 Subject: [PATCH 07/54] RM-1589 (Unable to access the node browser information for RM nodes in Share UI) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.2@76377 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../security/rm-method-security.properties | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/security/rm-method-security.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/security/rm-method-security.properties index 035ba7a921..d282d207e2 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/security/rm-method-security.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/security/rm-method-security.properties @@ -219,4 +219,9 @@ rm.methodsecurity.org.alfresco.service.cmr.site.SiteService.*=RM_ALLOW rm.methodsecurity.org.alfresco.repo.forms.FormService.getForm=RM_ALLOW rm.methodsecurity.org.alfresco.repo.forms.FormService.saveForm=RM_ALLOW -rm.methodsecurity.org.alfresco.repo.forms.FormService.*=RM_DENY \ No newline at end of file +rm.methodsecurity.org.alfresco.repo.forms.FormService.*=RM_DENY + +## Ownable Service + +rm.methodsecurity.org.alfresco.service.cmr.security.OwnableService.getOwner=RM.Read.0 +rm.methodsecurity.org.alfresco.service.cmr.security.OwnableService.*=RM_DENY \ No newline at end of file From 558399aa2b8430643df62e5ed9c3b0ed8d17b8ae Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Tue, 15 Jul 2014 00:48:34 +0000 Subject: [PATCH 08/54] Merge HEAD to BRANCHES/V2.1.0.x: * 74458 - RM Performance Improvements * general file plan browse rendering in around half the previously recorded times for around 500 records (need to scale up) * unessesary bottle neck removed from record detail page rendering (see RM-1461) * other general improvements * TODO .. hasFrozenChildren, getNextDisposition, TransferNodeIndicator, HeldBy .. all traverse up or down record/record folder hierarchy in ways that don't scale * fix to disposition lifecycle job that failed all when one failed .. this explains why the job appeared not to work on occasion git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@76475 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../rm-capabilities-condition-context.xml | 4 +- .../rm-service-context.xml | 4 +- .../RecordsManagementServiceImpl.java | 18 +- .../action/RMActionExecuterAbstractBase.java | 2 +- .../RecordsManagementAdminServiceImpl.java | 9 +- .../capability/RMSecurityCommon.java | 16 +- .../disposition/DispositionServiceImpl.java | 2 +- .../fileplan/FilePlanServiceImpl.java | 180 +------ .../freeze/FreezeServiceImpl.java | 2 +- .../job/DispositionLifecycleJobExecuter.java | 20 +- .../record/RecordServiceImpl.java | 39 +- .../util/ServiceBaseImpl.java | 493 +++++++++++++++--- 12 files changed, 447 insertions(+), 342 deletions(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-condition-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-condition-context.xml index 0085ecb34e..f05e10e3e8 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-condition-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/capability/rm-capabilities-condition-context.xml @@ -8,8 +8,8 @@ - - + + diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml index dc9a296198..98829ee9df 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml @@ -1130,9 +1130,7 @@ - - - + diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/RecordsManagementServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/RecordsManagementServiceImpl.java index 5e0178e2c5..518454f941 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/RecordsManagementServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/RecordsManagementServiceImpl.java @@ -48,9 +48,6 @@ import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.RegexQNamePattern; import org.alfresco.util.ParameterCheck; import org.alfresco.util.PropertyMap; -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; import org.springframework.extensions.surf.util.I18NUtil; /** @@ -62,8 +59,7 @@ public class RecordsManagementServiceImpl extends ServiceBaseImpl implements RecordsManagementService, RecordsManagementModel, RecordsManagementPolicies.OnCreateReference, - RecordsManagementPolicies.OnRemoveReference, - ApplicationContextAware + RecordsManagementPolicies.OnRemoveReference { /** I18N */ private final static String MSG_ERROR_ADD_CONTENT_CONTAINER = "rm.service.error-add-content-container"; @@ -91,18 +87,6 @@ public class RecordsManagementServiceImpl extends ServiceBaseImpl /** Java behaviour */ private JavaBehaviour onChangeToDispositionActionDefinition; - /** Application context */ - private ApplicationContext applicationContext; - - /** - * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext) - */ - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException - { - this.applicationContext = applicationContext; - } - /** * Set the service registry service * diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/RMActionExecuterAbstractBase.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/RMActionExecuterAbstractBase.java index 0d6d1b7a6c..9212dc764c 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/RMActionExecuterAbstractBase.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/RMActionExecuterAbstractBase.java @@ -489,7 +489,7 @@ public abstract class RMActionExecuterAbstractBase extends PropertySubActionExe NodeRef currentDispositionAction = null; if (this.nodeService.hasAspect(nodeRef, ASPECT_DISPOSITION_LIFECYCLE) == true) { - List assocs = this.nodeService.getChildAssocs(nodeRef, ASSOC_NEXT_DISPOSITION_ACTION, RegexQNamePattern.MATCH_ALL); + List assocs = this.nodeService.getChildAssocs(nodeRef, ASSOC_NEXT_DISPOSITION_ACTION, ASSOC_NEXT_DISPOSITION_ACTION); if (assocs.size() > 0) { currentDispositionAction = assocs.get(0).getChildRef(); diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/admin/RecordsManagementAdminServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/admin/RecordsManagementAdminServiceImpl.java index afe04b98bc..b18894b196 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/admin/RecordsManagementAdminServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/admin/RecordsManagementAdminServiceImpl.java @@ -55,10 +55,10 @@ import org.alfresco.repo.dictionary.M2Model; import org.alfresco.repo.dictionary.M2Namespace; import org.alfresco.repo.dictionary.M2Property; import org.alfresco.repo.node.NodeServicePolicies; +import org.alfresco.repo.policy.Behaviour.NotificationFrequency; import org.alfresco.repo.policy.ClassPolicyDelegate; import org.alfresco.repo.policy.JavaBehaviour; import org.alfresco.repo.policy.PolicyComponent; -import org.alfresco.repo.policy.Behaviour.NotificationFrequency; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.service.cmr.dictionary.AspectDefinition; @@ -80,7 +80,6 @@ import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; -import org.alfresco.service.namespace.RegexQNamePattern; import org.alfresco.util.GUID; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -1155,8 +1154,7 @@ public class RecordsManagementAdminServiceImpl implements RecordsManagementAdmin */ public List getCustomReferencesFrom(NodeRef node) { - List retrievedAssocs = nodeService.getTargetAssocs(node, RegexQNamePattern.MATCH_ALL); - return retrievedAssocs; + return nodeService.getTargetAssocs(node, null); } /** @@ -1173,8 +1171,7 @@ public class RecordsManagementAdminServiceImpl implements RecordsManagementAdmin */ public List getCustomReferencesTo(NodeRef node) { - List retrievedAssocs = nodeService.getSourceAssocs(node, RegexQNamePattern.MATCH_ALL); - return retrievedAssocs; + return nodeService.getSourceAssocs(node, null); } /** 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 fc90081c1d..51c70b7bfc 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 @@ -204,19 +204,6 @@ public class RMSecurityCommon return result; } - // Get the file plan for the node - NodeRef filePlan = filePlanService.getFilePlan(nodeRef); - - // Admin role - //if (permissionService.hasPermission(filePlan, RMPermissionModel.ROLE_ADMINISTRATOR) == AccessStatus.ALLOWED) - //{ - // if (logger.isDebugEnabled()) - // { - // logger.debug("\t\tAdmin user, access granted. (nodeRef=" + nodeRef.toString() + ", user=" + AuthenticationUtil.getRunAsUser() + ")"); - // } - // return setTransactionCache("checkRmRead", nodeRef, AccessDecisionVoter.ACCESS_GRANTED); - // } - if (permissionService.hasPermission(nodeRef, RMPermissionModel.READ_RECORDS) == AccessStatus.DENIED) { if (logger.isDebugEnabled()) @@ -226,6 +213,9 @@ public class RMSecurityCommon return setTransactionCache("checkRmRead", nodeRef, AccessDecisionVoter.ACCESS_DENIED); } + // Get the file plan for the node + NodeRef filePlan = filePlanService.getFilePlan(nodeRef); + if (permissionService.hasPermission(filePlan, RMPermissionModel.VIEW_RECORDS) == AccessStatus.DENIED) { if (logger.isDebugEnabled()) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java index a3e8882f82..3366f2cf01 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java @@ -796,7 +796,7 @@ public class DispositionServiceImpl implements private NodeRef getNextDispositionActionNodeRef(NodeRef nodeRef) { NodeRef result = null; - List assocs = nodeService.getChildAssocs(nodeRef, ASSOC_NEXT_DISPOSITION_ACTION, RegexQNamePattern.MATCH_ALL); + List assocs = nodeService.getChildAssocs(nodeRef, ASSOC_NEXT_DISPOSITION_ACTION, ASSOC_NEXT_DISPOSITION_ACTION, 1, true); if (assocs.size() != 0) { result = assocs.get(0).getChildRef(); diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/FilePlanServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/FilePlanServiceImpl.java index 28942f6497..d62a21da56 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/FilePlanServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/FilePlanServiceImpl.java @@ -52,9 +52,6 @@ import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.RegexQNamePattern; import org.alfresco.util.Pair; import org.alfresco.util.ParameterCheck; -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; import org.springframework.extensions.surf.util.I18NUtil; /** @@ -65,8 +62,7 @@ import org.springframework.extensions.surf.util.I18NUtil; */ public class FilePlanServiceImpl extends ServiceBaseImpl implements FilePlanService, - RecordsManagementModel, - ApplicationContextAware + RecordsManagementModel { /** I18N */ private final static String MSG_DUP_ROOT = "rm.service.dup-root"; @@ -86,18 +82,6 @@ public class FilePlanServiceImpl extends ServiceBaseImpl /** RM site file plan container */ private static final String FILE_PLAN_CONTAINER = "documentLibrary"; - /** Application context */ - private ApplicationContext applicationContext; - - /** - * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext) - */ - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException - { - this.applicationContext = applicationContext; - } - /** * NOTE: for some reason spring couldn't cope with the circular references between these two * beans so we need to grab this one manually. @@ -173,121 +157,6 @@ public class FilePlanServiceImpl extends ServiceBaseImpl return (RecordsManagementService)applicationContext.getBean("RecordsManagementService"); } - /** - * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#isFilePlanComponent(org.alfresco.service.cmr.repository.NodeRef) - */ - public boolean isFilePlanComponent(NodeRef nodeRef) - { - boolean result = false; - if (getInternalNodeService().exists(nodeRef) == true && - getInternalNodeService().hasAspect(nodeRef, ASPECT_FILE_PLAN_COMPONENT) == true) - { - result = true; - } - return result; - } - - /** - * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getFilePlanComponentKind(org.alfresco.service.cmr.repository.NodeRef) - */ - public FilePlanComponentKind getFilePlanComponentKind(NodeRef nodeRef) - { - FilePlanComponentKind result = null; - - if (isFilePlanComponent(nodeRef) == true) - { - result = FilePlanComponentKind.FILE_PLAN_COMPONENT; - - if (isFilePlan(nodeRef) == true) - { - result = FilePlanComponentKind.FILE_PLAN; - } - else if (isRecordCategory(nodeRef) == true) - { - result = FilePlanComponentKind.RECORD_CATEGORY; - } - else if (getRecordsManagementService().isRecordFolder(nodeRef) == true) - { - result = FilePlanComponentKind.RECORD_FOLDER; - } - else if (getRecordService().isRecord(nodeRef) == true) - { - result = FilePlanComponentKind.RECORD; - } - else if (getFreezeService().isHold(nodeRef) == true) - { - result = FilePlanComponentKind.HOLD; - } - else if (getRecordsManagementService().isTransfer(nodeRef) == true) - { - result = FilePlanComponentKind.TRANSFER; - } - else if (instanceOf(nodeRef, TYPE_DISPOSITION_SCHEDULE) == true || instanceOf(nodeRef, TYPE_DISPOSITION_ACTION_DEFINITION) == true) - { - result = FilePlanComponentKind.DISPOSITION_SCHEDULE; - } - else if (instanceOf(nodeRef, TYPE_UNFILED_RECORD_CONTAINER) == true) - { - result = FilePlanComponentKind.UNFILED_RECORD_CONTAINER; - } - } - - return result; - } - - /** - * @see org.alfresco.module.org_alfresco_module_rm.RecordsManagementService#getFilePlanComponentKindFromType(org.alfresco.service.namespace.QName) - */ - @Override - public FilePlanComponentKind getFilePlanComponentKindFromType(QName type) - { - FilePlanComponentKind result = null; - - if (ASPECT_FILE_PLAN_COMPONENT.equals(type) == true) - { - result = FilePlanComponentKind.FILE_PLAN_COMPONENT; - } - else if (dictionaryService.isSubClass(type, ASPECT_RECORD) == true) - { - result = FilePlanComponentKind.RECORD; - } - else if (dictionaryService.isSubClass(type, TYPE_FILE_PLAN) == true) - { - result = FilePlanComponentKind.FILE_PLAN; - } - else if (dictionaryService.isSubClass(type, TYPE_RECORD_CATEGORY) == true) - { - result = FilePlanComponentKind.RECORD_CATEGORY; - } - else if (dictionaryService.isSubClass(type, TYPE_RECORD_FOLDER) == true) - { - result = FilePlanComponentKind.RECORD_FOLDER; - } - else if (dictionaryService.isSubClass(type, TYPE_HOLD) == true) - { - result = FilePlanComponentKind.HOLD; - } - else if (dictionaryService.isSubClass(type, TYPE_TRANSFER) == true) - { - result = FilePlanComponentKind.TRANSFER; - } - else if (dictionaryService.isSubClass(type, TYPE_DISPOSITION_SCHEDULE) == true || - dictionaryService.isSubClass(type, TYPE_DISPOSITION_ACTION_DEFINITION) == true) - { - result = FilePlanComponentKind.DISPOSITION_SCHEDULE; - } - - return result; - } - - /** - * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#isFilePlan(org.alfresco.service.cmr.repository.NodeRef) - */ - public boolean isFilePlan(NodeRef nodeRef) - { - return instanceOf(nodeRef, TYPE_FILE_PLAN); - } - /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getFilePlans() */ @@ -325,36 +194,6 @@ public class FilePlanServiceImpl extends ServiceBaseImpl return results; } - /** - * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getFilePlan(org.alfresco.service.cmr.repository.NodeRef) - */ - @Override - public NodeRef getFilePlan(NodeRef nodeRef) - { - NodeRef result = null; - if (nodeRef != null) - { - result = (NodeRef)getInternalNodeService().getProperty(nodeRef, PROP_ROOT_NODEREF); - if (result == null) - { - if (instanceOf(nodeRef, TYPE_FILE_PLAN) == true) - { - result = nodeRef; - } - else - { - ChildAssociationRef parentAssocRef = getInternalNodeService().getPrimaryParent(nodeRef); - if (parentAssocRef != null) - { - result = getFilePlan(parentAssocRef.getParentRef()); - } - } - } - } - - return result; - } - /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getFilePlanBySiteId(java.lang.String) */ @@ -640,23 +479,6 @@ public class FilePlanServiceImpl extends ServiceBaseImpl } } - /** - * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#isFilePlanContainer(org.alfresco.service.cmr.repository.NodeRef) - */ - @Override - public boolean isFilePlanContainer(NodeRef nodeRef) - { - return instanceOf(nodeRef, TYPE_RECORDS_MANAGEMENT_CONTAINER); - } - - /** - * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#isRecordCategory(org.alfresco.service.cmr.repository.NodeRef) - */ - public boolean isRecordCategory(NodeRef nodeRef) - { - return instanceOf(nodeRef, TYPE_RECORD_CATEGORY); - } - /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#createRecordCategory(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, org.alfresco.service.namespace.QName, java.util.Map) */ diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/freeze/FreezeServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/freeze/FreezeServiceImpl.java index 5c65630f02..3ab9bd3a60 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/freeze/FreezeServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/freeze/FreezeServiceImpl.java @@ -164,7 +164,7 @@ public class FreezeServiceImpl extends ServiceBaseImpl public Void doWork() throws Exception { if (nodeService.exists(nodeRef) == true && - filePlanService.isFilePlanComponent(nodeRef) == true) + nodeService.hasAspect(nodeRef, ASPECT_FILE_PLAN_COMPONENT) == true) { if (isFrozen(nodeRef) == true) { diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuter.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuter.java index 0dc25b859c..37df9d68b5 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuter.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/job/DispositionLifecycleJobExecuter.java @@ -186,12 +186,22 @@ public class DispositionLifecycleJobExecuter extends RecordsManagementJobExecute Map props = new HashMap(1); props.put(RMDispositionActionExecuterAbstractBase.PARAM_NO_ERROR_CHECK, Boolean.FALSE); - // execute disposition action - recordsManagementActionService.executeRecordsManagementAction(parent.getParentRef(), dispAction, props); - - if (logger.isDebugEnabled()) + try { - logger.debug("Processed action: " + dispAction + "on" + parent); + // execute disposition action + recordsManagementActionService.executeRecordsManagementAction(parent.getParentRef(), dispAction, props); + + if (logger.isDebugEnabled()) + { + logger.debug("Processed action: " + dispAction + "on" + parent); + } + } + catch (AlfrescoRuntimeException exception) + { + if (logger.isDebugEnabled()) + { + logger.debug(exception); + } } } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java index 491c3248a7..3684f952ee 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImpl.java @@ -46,6 +46,7 @@ import org.alfresco.module.org_alfresco_module_rm.notification.RecordsManagement import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService; import org.alfresco.module.org_alfresco_module_rm.role.Role; import org.alfresco.module.org_alfresco_module_rm.security.ExtendedSecurityService; +import org.alfresco.module.org_alfresco_module_rm.util.ServiceBaseImpl; import org.alfresco.module.org_alfresco_module_rm.vital.VitalRecordServiceImpl; import org.alfresco.repo.node.NodeServicePolicies; import org.alfresco.repo.policy.Behaviour.NotificationFrequency; @@ -84,9 +85,6 @@ import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; /** * Record service implementation. @@ -94,12 +92,12 @@ import org.springframework.context.ApplicationContextAware; * @author Roy Wetherall * @since 2.1 */ -public class RecordServiceImpl implements RecordService, +public class RecordServiceImpl extends ServiceBaseImpl + implements RecordService, RecordsManagementModel, RecordsManagementCustomModel, NodeServicePolicies.OnCreateChildAssociationPolicy, NodeServicePolicies.OnUpdatePropertiesPolicy, - ApplicationContextAware, NodeServicePolicies.OnAddAspectPolicy, NodeServicePolicies.OnRemoveAspectPolicy { @@ -142,9 +140,6 @@ public class RecordServiceImpl implements RecordService, NamespaceService.REPOSITORY_VIEW_1_0_URI }; - - /** Application context */ - private ApplicationContext applicationContext; /** Node service **/ private NodeService nodeService; @@ -209,12 +204,6 @@ public class RecordServiceImpl implements RecordService, "onDeleteDeclaredRecordLink", NotificationFrequency.FIRST_EVENT); - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException - { - this.applicationContext = applicationContext; - } - /** * @param nodeService node service */ @@ -624,28 +613,6 @@ public class RecordServiceImpl implements RecordService, return recordMetaDataAspects; } - /** - * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#isRecord(org.alfresco.service.cmr.repository.NodeRef) - */ - @Override - public boolean isRecord(NodeRef nodeRef) - { - ParameterCheck.mandatory("nodeRef", nodeRef); - - return nodeService.hasAspect(nodeRef, ASPECT_RECORD); - } - - /** - * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#isDeclared(org.alfresco.service.cmr.repository.NodeRef) - */ - @Override - public boolean isDeclared(NodeRef record) - { - ParameterCheck.mandatory("record", record); - - return nodeService.hasAspect(record, ASPECT_DECLARED_RECORD); - } - /** * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#createRecord(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.repository.NodeRef) */ 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 609440e3dc..10187b259b 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 @@ -18,13 +18,22 @@ */ package org.alfresco.module.org_alfresco_module_rm.util; +import java.util.Set; + +import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanComponentKind; +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.service.cmr.dictionary.DictionaryService; +import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.namespace.QName; import org.alfresco.util.ParameterCheck; import org.alfresco.util.PropertyMap; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; /** * Helper base class for service implementations. @@ -32,83 +41,411 @@ import org.alfresco.util.PropertyMap; * @author Roy Wetherall * @since 2.1 */ -public class ServiceBaseImpl implements RecordsManagementModel +public class ServiceBaseImpl implements RecordsManagementModel, ApplicationContextAware { - /** Node service */ - protected NodeService nodeService; - - /** Dictionary service */ - protected DictionaryService dictionaryService; - - /** - * @param nodeService node service - */ - public void setNodeService(NodeService nodeService) - { - this.nodeService = nodeService; - } - - /** - * @param dictionaryService dictionary service - */ - public void setDictionaryService(DictionaryService dictionaryService) - { - this.dictionaryService = dictionaryService; - } - - /** - * Utility method to safely and quickly determine if a node is a type (or sub-type) of the one specified. - * - * @param nodeRef node reference - * @param ofClassName class name to check - */ - protected boolean instanceOf(NodeRef nodeRef, QName ofClassName) - { - ParameterCheck.mandatory("nodeRef", nodeRef); - ParameterCheck.mandatory("ofClassName", ofClassName); - boolean result = false; - if (nodeService.exists(nodeRef) == true && - (ofClassName.equals(nodeService.getType(nodeRef)) == true || - dictionaryService.isSubClass(nodeService.getType(nodeRef), ofClassName) == true)) - { - result = true; - } - return result; - } - - /** - * Utility method to get the next counter for a node. - *

- * If the node is not already countable, then rma:countable is added and 0 returned. - * - * @param nodeRef node reference - * @return int next counter value - */ - protected int getNextCount(NodeRef nodeRef) - { - int counter = 0; - if (nodeService.hasAspect(nodeRef, ASPECT_COUNTABLE) == false) - { - PropertyMap props = new PropertyMap(1); - props.put(PROP_COUNT, 1); - nodeService.addAspect(nodeRef, ASPECT_COUNTABLE, props); - counter = 1; - } - else - { - Integer value = (Integer)this.nodeService.getProperty(nodeRef, PROP_COUNT); - if (value != null) - { - counter = value.intValue() + 1; - } - else - { - counter = 1; - } - nodeService.setProperty(nodeRef, PROP_COUNT, counter); - - } - return counter; - } - + /** Node service */ + protected NodeService nodeService; + + /** Dictionary service */ + protected DictionaryService dictionaryService; + + /** Application context */ + protected ApplicationContext applicationContext; + + /** internal node service */ + private NodeService internalNodeService; + + /** + * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext) + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) + { + this.applicationContext = applicationContext; + } + + /** + * @param nodeService node service + */ + public void setNodeService(NodeService nodeService) + { + this.nodeService = nodeService; + } + + /** + * @param dictionaryService dictionary service + */ + public void setDictionaryService(DictionaryService dictionaryService) + { + this.dictionaryService = dictionaryService; + } + + /** + * Helper to get internal node service. + *

+ * Used for performance reasons. + */ + private NodeService getInternalNodeService() + { + if (internalNodeService == null) + { + internalNodeService = (NodeService)applicationContext.getBean("dbNodeService"); + } + + return internalNodeService; + } + + /** + * Gets the file plan component kind from the given node reference + * + * @see FilePlanService#getFilePlanComponentKind(org.alfresco.service.cmr.repository.NodeRef) + */ + public FilePlanComponentKind getFilePlanComponentKind(NodeRef nodeRef) + { + FilePlanComponentKind result = null; + + if (isFilePlanComponent(nodeRef)) + { + 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; + } + } + + return result; + } + + /** + * Gets the file plan component kind from the given type. + * + * @see FilePlanService#getFilePlanComponentKindFromType(QName) + */ + public FilePlanComponentKind getFilePlanComponentKindFromType(QName type) + { + FilePlanComponentKind result = null; + + if (ASPECT_FILE_PLAN_COMPONENT.equals(type)) + { + result = FilePlanComponentKind.FILE_PLAN_COMPONENT; + } + else if (instanceOf(type, ASPECT_RECORD)) + { + result = FilePlanComponentKind.RECORD; + } + else if (instanceOf(type, TYPE_FILE_PLAN)) + { + result = FilePlanComponentKind.FILE_PLAN; + } + else if (instanceOf(type, TYPE_RECORD_CATEGORY)) + { + result = FilePlanComponentKind.RECORD_CATEGORY; + } + else if (instanceOf(type, TYPE_RECORD_FOLDER)) + { + result = FilePlanComponentKind.RECORD_FOLDER; + } + else if (instanceOf(type, TYPE_HOLD)) + { + result = FilePlanComponentKind.HOLD; + } + else if (instanceOf(type, TYPE_TRANSFER)) + { + result = FilePlanComponentKind.TRANSFER; + } + else if (instanceOf(type, TYPE_DISPOSITION_SCHEDULE) || + instanceOf(type, TYPE_DISPOSITION_ACTION_DEFINITION)) + { + result = FilePlanComponentKind.DISPOSITION_SCHEDULE; + } + + return result; + } + + /** + * Indicates whether the given node is a file plan component or not. + *

+ * Exposed in the FilePlan service. + * + * @see FilePlanService#isFilePlanComponent(org.alfresco.service.cmr.repository.NodeRef) + */ + public boolean isFilePlanComponent(NodeRef nodeRef) + { + boolean result = false; + if (getInternalNodeService().exists(nodeRef) && + getInternalNodeService().hasAspect(nodeRef, ASPECT_FILE_PLAN_COMPONENT)) + { + result = true; + } + return result; + } + + /** + * Indicates whether the given node is a file plan or not. + *

+ * Exposed in the FilePlan service. + * + * @see FilePlanService#isFilePlan(org.alfresco.service.cmr.repository.NodeRef) + */ + public boolean isFilePlan(NodeRef nodeRef) + { + return instanceOf(nodeRef, TYPE_FILE_PLAN); + } + + /** + * Indicates whether the given node is a file plan container or not. + * + * @see FilePlanService#isFilePlanContainer(org.alfresco.service.cmr.repository.NodeRef) + */ + public boolean isFilePlanContainer(NodeRef nodeRef) + { + return instanceOf(nodeRef, TYPE_RECORDS_MANAGEMENT_CONTAINER); + } + + /** + * Indicates whether the given node is a record category or not. + * + * @see FilePlanService#isRecordCategory(org.alfresco.service.cmr.repository.NodeRef) + */ + public boolean isRecordCategory(NodeRef nodeRef) + { + return instanceOf(nodeRef, TYPE_RECORD_CATEGORY); + } + + /** + * Indicates whether the given node is a record folder or not. + *

+ * Exposed in the RecordFolder service. + * + * @param nodeRef node reference + * @return boolean true if record folder, false otherwise + */ + public boolean isRecordFolder(NodeRef nodeRef) + { + ParameterCheck.mandatory("nodeRef", nodeRef); + return instanceOf(nodeRef, TYPE_RECORD_FOLDER); + } + + /** + * Indicates whether the given node reference is a record or not. + * + * @param nodeRef node reference + * @return boolean true if node reference is a record, false otherwise + */ + public boolean isRecord(NodeRef nodeRef) + { + ParameterCheck.mandatory("nodeRef", nodeRef); + + return getInternalNodeService().hasAspect(nodeRef, ASPECT_RECORD); + } + + /** + * Indicates whether the given node reference is a hold or not. + * + * @param nodeRef node reference + * @return boolean true if rma:hold or sub-type, false otherwise + */ + public boolean isHold(NodeRef nodeRef) + { + ParameterCheck.mandatory("nodeRef", nodeRef); + + boolean isHold = false; + if (getInternalNodeService().exists(nodeRef) && + instanceOf(nodeRef, TYPE_HOLD)) + { + isHold = true; + } + return isHold; + } + + /** + * Indicates whether the given node reference is a transfer or not. + */ + public boolean isTransfer(NodeRef nodeRef) + { + ParameterCheck.mandatory("nodeRef", nodeRef); + + return instanceOf(nodeRef, TYPE_TRANSFER); + } + + /** + * Indicates whether a record is complete or not. + * + * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#isDeclared(org.alfresco.service.cmr.repository.NodeRef) + */ + public boolean isDeclared(NodeRef record) + { + ParameterCheck.mandatory("record", record); + + return getInternalNodeService().hasAspect(record, ASPECT_DECLARED_RECORD); + } + + /** + * Gets the file plan that a given file plan component resides within. + * + * @param nodeRef node reference + * @return {@link NodeRef} file plan, null if none + */ + public NodeRef getFilePlan(final NodeRef nodeRef) + { + NodeRef result = null; + if (nodeRef != null) + { + result = (NodeRef)getInternalNodeService().getProperty(nodeRef, PROP_ROOT_NODEREF); + if (result == null) + { + if (instanceOf(nodeRef, TYPE_FILE_PLAN)) + { + result = nodeRef; + } + else + { + ChildAssociationRef parentAssocRef = getInternalNodeService().getPrimaryParent(nodeRef); + if (parentAssocRef != null) + { + result = getFilePlan(parentAssocRef.getParentRef()); + } + } + } + } + + return result; + } + + /** + * Utility method to safely and quickly determine if a node is a type (or sub-type) of the one specified. + * + * @param nodeRef node reference + * @param ofClassName class name to check + */ + protected boolean instanceOf(NodeRef nodeRef, QName ofClassName) + { + ParameterCheck.mandatory("nodeRef", nodeRef); + ParameterCheck.mandatory("ofClassName", ofClassName); + QName className = getInternalNodeService().getType(nodeRef); + return instanceOf(className, ofClassName); + } + + /** + * Utility method to quickly determine whether one class is equal to or sub of another. + * + * @param className class name + * @param ofClassName class name to check against + * @return boolean true if equal to or sub, false otherwise + */ + protected boolean instanceOf(QName className, QName ofClassName) + { + ParameterCheck.mandatory("className", className); + ParameterCheck.mandatory("ofClassName", ofClassName); + boolean result = false; + if (ofClassName.equals(className) || + dictionaryService.isSubClass(className, ofClassName)) + { + result = true; + } + return result; + } + + /** + * Utility method to get the next counter for a node. + *

+ * If the node is not already countable, then rma:countable is added and 0 returned. + * + * @param nodeRef node reference + * @return int next counter value + */ + protected int getNextCount(NodeRef nodeRef) + { + int counter = 0; + if (!nodeService.hasAspect(nodeRef, ASPECT_COUNTABLE)) + { + PropertyMap props = new PropertyMap(1); + props.put(PROP_COUNT, 1); + nodeService.addAspect(nodeRef, ASPECT_COUNTABLE, props); + counter = 1; + } + else + { + Integer value = (Integer)this.nodeService.getProperty(nodeRef, PROP_COUNT); + if (value != null) + { + counter = value.intValue() + 1; + } + else + { + counter = 1; + } + nodeService.setProperty(nodeRef, PROP_COUNT, counter); + + } + return counter; + } + + /** + * Helper method to get a set containing the node's type and all it's aspects + * + * @param nodeRef nodeRef + * @return Set set of qname's + */ + protected Set getTypeAndApsects(NodeRef nodeRef) + { + Set result = nodeService.getAspects(nodeRef); + result.add(nodeService.getType(nodeRef)); + return result; + } + + /** + * Helper method that executed work as system user. + *

+ * Useful when testing using mocks. + * + * @param runAsWork work to execute as system user + * @return + */ + public R runAsSystem(RunAsWork runAsWork) + { + return AuthenticationUtil.runAsSystem(runAsWork); + } + + /** + * Helper method that executed work as given user. + *

+ * Useful when testing using mocks. + * + * @param runAsWork work to execute as given user + * @return + */ + public R runAs(RunAsWork runAsWork, String uid) + { + return AuthenticationUtil.runAs(runAsWork, uid); + } } From ca26cf57155fd0fcc1aa362059c67cfabdc49cce Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Wed, 16 Jul 2014 02:00:27 +0000 Subject: [PATCH 09/54] Merge HEAD to BRANCHES/V2.1.0.x: 74932: RM-1461: CLONE - RM slower then standard repo/sites when rendering document details when folder contains 15k documents git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@76597 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../model/recordsModel.xml | 15 + .../action/RMActionExecuterAbstractBase.java | 1 - .../freeze/FreezeServiceImpl.java | 69 +- .../jscript/app/JSONConversionComponent.java | 17 + .../model/RecordsManagementModel.java | 5 + .../util/ServiceBaseImpl.java | 831 +++++++++--------- .../test/service/FreezeServiceImplTest.java | 4 - 7 files changed, 522 insertions(+), 420 deletions(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/model/recordsModel.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/model/recordsModel.xml index f1506022ac..c88df79c68 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/model/recordsModel.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/model/recordsModel.xml @@ -272,6 +272,7 @@ rma:recordComponentIdentifier rma:commonRecordDetails rma:filePlanComponent + rma:heldChildren @@ -1213,6 +1214,20 @@ + + + + Held children + + + d:int + true + true + 0 + + + + Countable aspect diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/RMActionExecuterAbstractBase.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/RMActionExecuterAbstractBase.java index 9212dc764c..42f9cd3b14 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/RMActionExecuterAbstractBase.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/action/RMActionExecuterAbstractBase.java @@ -57,7 +57,6 @@ import org.alfresco.service.cmr.repository.Period; import org.alfresco.service.cmr.security.OwnableService; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; -import org.alfresco.service.namespace.RegexQNamePattern; import org.alfresco.service.transaction.TransactionService; import org.alfresco.util.PropertyCheck; import org.springframework.beans.factory.BeanNameAware; diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/freeze/FreezeServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/freeze/FreezeServiceImpl.java index 3ab9bd3a60..efa05f7217 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/freeze/FreezeServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/freeze/FreezeServiceImpl.java @@ -42,11 +42,13 @@ import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.repo.security.permissions.AccessDeniedException; import org.alfresco.repo.transaction.AlfrescoTransactionSupport; +import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.RegexQNamePattern; +import org.alfresco.service.transaction.TransactionService; import org.alfresco.util.ParameterCheck; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; @@ -191,10 +193,10 @@ public class FreezeServiceImpl extends ServiceBaseImpl for (ChildAssociationRef assoc : assocs) { // we only care about primary children - if (assoc.isPrimary() == true) + if (assoc.isPrimary()) { NodeRef nodeRef = assoc.getChildRef(); - if (isFrozen(nodeRef) == true) + if (isFrozen(nodeRef)) { // never allowed to delete a node with a frozen child throw new AccessDeniedException("Can not delete node, because it contains a frozen child node."); @@ -531,21 +533,68 @@ public class FreezeServiceImpl extends ServiceBaseImpl * @see org.alfresco.module.org_alfresco_module_rm.freeze.FreezeService#hasFrozenChildren(org.alfresco.service.cmr.repository.NodeRef) */ @Override - public boolean hasFrozenChildren(NodeRef nodeRef) + public boolean hasFrozenChildren(final NodeRef nodeRef) { ParameterCheck.mandatory("nodeRef", nodeRef); - List childAssocs = nodeService.getChildAssocs(nodeRef, ContentModel.ASSOC_CONTAINS, - RegexQNamePattern.MATCH_ALL); - if (childAssocs != null && !childAssocs.isEmpty()) - { - for (ChildAssociationRef childAssociationRef : childAssocs) + boolean result = false; + + // check that we are dealing with a record folder + if (isRecordFolder(nodeRef)) + { + int heldCount = 0; + + if (nodeService.hasAspect(nodeRef, ASPECT_HELD_CHILDREN)) { - if (isFrozen(childAssociationRef.getChildRef())) { return true; } + heldCount = (Integer)getInternalNodeService().getProperty(nodeRef, PROP_HELD_CHILDREN_COUNT); } + else + { + final TransactionService transactionService = (TransactionService)applicationContext.getBean("transactionService"); + + heldCount = AuthenticationUtil.runAsSystem(new RunAsWork() + { + @Override + public Integer doWork() + { + return transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback() + { + public Integer execute() throws Throwable + { + int heldCount = 0; + + // NOTE: this process remains to 'patch' older systems to improve performance next time around + List childAssocs = getInternalNodeService().getChildAssocs(nodeRef, ContentModel.ASSOC_CONTAINS, null); + if (childAssocs != null && !childAssocs.isEmpty()) + { + for (ChildAssociationRef childAssociationRef : childAssocs) + { + NodeRef record = childAssociationRef.getChildRef(); + if (childAssociationRef.isPrimary() && isRecord(record) && isFrozen(record)) + { + heldCount ++; + } + } + } + + // add aspect and set count + Map props = new HashMap(1); + props.put(PROP_HELD_CHILDREN_COUNT, heldCount); + getInternalNodeService().addAspect(nodeRef, ASPECT_HELD_CHILDREN, props); + + return heldCount; + } + }, + false, true); + } + }); + } + + // true if more than one child held + result = (heldCount > 0); } - return false; + return result; } /** diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/JSONConversionComponent.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/JSONConversionComponent.java index b2847f5364..fad81f2ae1 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/JSONConversionComponent.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/JSONConversionComponent.java @@ -213,6 +213,23 @@ public class JSONConversionComponent extends org.alfresco.repo.jscript.app.JSONC rmNodeValues.put("actions", jsonActions); } } + + /** + * @see org.alfresco.repo.jscript.app.JSONConversionComponent#permissionsToJSON(org.alfresco.service.cmr.repository.NodeRef) + */ + protected JSONObject permissionsToJSON(final NodeRef nodeRef) + { + JSONObject permissionsJSON = null; + if (!filePlanService.isFilePlanComponent(nodeRef)) + { + permissionsJSON = super.permissionsToJSON(nodeRef); + } + else + { + permissionsJSON = new JSONObject(); + } + return permissionsJSON; + } /** * Gets the rm 'type' used as a UI convenience and compatibility flag. diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/RecordsManagementModel.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/RecordsManagementModel.java index b6e560e244..ac7441c35f 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/RecordsManagementModel.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/model/RecordsManagementModel.java @@ -253,6 +253,11 @@ public interface RecordsManagementModel extends RecordsManagementCustomModel public static final QName PROP_RECORD_REJECTION_DATE = QName.createQName(RM_URI, "recordRejectionDate"); public static final QName PROP_RECORD_REJECTION_REASON = QName.createQName(RM_URI, "recordRejectionReason"); + // Held children aspect + // @since 2.2 + QName ASPECT_HELD_CHILDREN = QName.createQName(RM_URI, "heldChildren"); + QName PROP_HELD_CHILDREN_COUNT = QName.createQName(RM_URI, "heldChildrenCount"); + // Countable aspect public static final QName ASPECT_COUNTABLE = QName.createQName(RM_URI, "countable"); public static final QName PROP_COUNT = QName.createQName(RM_URI, "count"); 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 10187b259b..c4494ab4df 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 @@ -18,6 +18,8 @@ */ package org.alfresco.module.org_alfresco_module_rm.util; +import java.util.HashMap; +import java.util.Map; import java.util.Set; import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanComponentKind; @@ -43,409 +45,428 @@ import org.springframework.context.ApplicationContextAware; */ public class ServiceBaseImpl implements RecordsManagementModel, ApplicationContextAware { - /** Node service */ - protected NodeService nodeService; - - /** Dictionary service */ - protected DictionaryService dictionaryService; - - /** Application context */ - protected ApplicationContext applicationContext; - - /** internal node service */ - private NodeService internalNodeService; - - /** - * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext) - */ - @Override - public void setApplicationContext(ApplicationContext applicationContext) - { - this.applicationContext = applicationContext; - } - - /** - * @param nodeService node service - */ - public void setNodeService(NodeService nodeService) - { - this.nodeService = nodeService; - } - - /** - * @param dictionaryService dictionary service - */ - public void setDictionaryService(DictionaryService dictionaryService) - { - this.dictionaryService = dictionaryService; - } - - /** - * Helper to get internal node service. - *

- * Used for performance reasons. - */ - private NodeService getInternalNodeService() - { - if (internalNodeService == null) - { - internalNodeService = (NodeService)applicationContext.getBean("dbNodeService"); - } - - return internalNodeService; - } - - /** - * Gets the file plan component kind from the given node reference - * - * @see FilePlanService#getFilePlanComponentKind(org.alfresco.service.cmr.repository.NodeRef) - */ - public FilePlanComponentKind getFilePlanComponentKind(NodeRef nodeRef) - { - FilePlanComponentKind result = null; - - if (isFilePlanComponent(nodeRef)) - { - 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; - } - } - - return result; - } - - /** - * Gets the file plan component kind from the given type. - * - * @see FilePlanService#getFilePlanComponentKindFromType(QName) - */ - public FilePlanComponentKind getFilePlanComponentKindFromType(QName type) - { - FilePlanComponentKind result = null; - - if (ASPECT_FILE_PLAN_COMPONENT.equals(type)) - { - result = FilePlanComponentKind.FILE_PLAN_COMPONENT; - } - else if (instanceOf(type, ASPECT_RECORD)) - { - result = FilePlanComponentKind.RECORD; - } - else if (instanceOf(type, TYPE_FILE_PLAN)) - { - result = FilePlanComponentKind.FILE_PLAN; - } - else if (instanceOf(type, TYPE_RECORD_CATEGORY)) - { - result = FilePlanComponentKind.RECORD_CATEGORY; - } - else if (instanceOf(type, TYPE_RECORD_FOLDER)) - { - result = FilePlanComponentKind.RECORD_FOLDER; - } - else if (instanceOf(type, TYPE_HOLD)) - { - result = FilePlanComponentKind.HOLD; - } - else if (instanceOf(type, TYPE_TRANSFER)) - { - result = FilePlanComponentKind.TRANSFER; - } - else if (instanceOf(type, TYPE_DISPOSITION_SCHEDULE) || - instanceOf(type, TYPE_DISPOSITION_ACTION_DEFINITION)) - { - result = FilePlanComponentKind.DISPOSITION_SCHEDULE; - } - - return result; - } - - /** - * Indicates whether the given node is a file plan component or not. - *

- * Exposed in the FilePlan service. - * - * @see FilePlanService#isFilePlanComponent(org.alfresco.service.cmr.repository.NodeRef) - */ - public boolean isFilePlanComponent(NodeRef nodeRef) - { - boolean result = false; - if (getInternalNodeService().exists(nodeRef) && - getInternalNodeService().hasAspect(nodeRef, ASPECT_FILE_PLAN_COMPONENT)) - { - result = true; - } - return result; - } - - /** - * Indicates whether the given node is a file plan or not. - *

- * Exposed in the FilePlan service. - * - * @see FilePlanService#isFilePlan(org.alfresco.service.cmr.repository.NodeRef) - */ - public boolean isFilePlan(NodeRef nodeRef) - { - return instanceOf(nodeRef, TYPE_FILE_PLAN); - } - - /** - * Indicates whether the given node is a file plan container or not. - * - * @see FilePlanService#isFilePlanContainer(org.alfresco.service.cmr.repository.NodeRef) - */ - public boolean isFilePlanContainer(NodeRef nodeRef) - { - return instanceOf(nodeRef, TYPE_RECORDS_MANAGEMENT_CONTAINER); - } - - /** - * Indicates whether the given node is a record category or not. - * - * @see FilePlanService#isRecordCategory(org.alfresco.service.cmr.repository.NodeRef) - */ - public boolean isRecordCategory(NodeRef nodeRef) - { - return instanceOf(nodeRef, TYPE_RECORD_CATEGORY); - } - - /** - * Indicates whether the given node is a record folder or not. - *

- * Exposed in the RecordFolder service. - * - * @param nodeRef node reference - * @return boolean true if record folder, false otherwise - */ - public boolean isRecordFolder(NodeRef nodeRef) - { - ParameterCheck.mandatory("nodeRef", nodeRef); - return instanceOf(nodeRef, TYPE_RECORD_FOLDER); - } - - /** - * Indicates whether the given node reference is a record or not. - * - * @param nodeRef node reference - * @return boolean true if node reference is a record, false otherwise - */ - public boolean isRecord(NodeRef nodeRef) - { - ParameterCheck.mandatory("nodeRef", nodeRef); - - return getInternalNodeService().hasAspect(nodeRef, ASPECT_RECORD); - } - - /** - * Indicates whether the given node reference is a hold or not. - * - * @param nodeRef node reference - * @return boolean true if rma:hold or sub-type, false otherwise - */ - public boolean isHold(NodeRef nodeRef) - { - ParameterCheck.mandatory("nodeRef", nodeRef); - - boolean isHold = false; - if (getInternalNodeService().exists(nodeRef) && - instanceOf(nodeRef, TYPE_HOLD)) - { - isHold = true; - } - return isHold; - } - - /** - * Indicates whether the given node reference is a transfer or not. - */ - public boolean isTransfer(NodeRef nodeRef) - { - ParameterCheck.mandatory("nodeRef", nodeRef); - - return instanceOf(nodeRef, TYPE_TRANSFER); - } - - /** - * Indicates whether a record is complete or not. - * - * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#isDeclared(org.alfresco.service.cmr.repository.NodeRef) - */ - public boolean isDeclared(NodeRef record) - { - ParameterCheck.mandatory("record", record); - - return getInternalNodeService().hasAspect(record, ASPECT_DECLARED_RECORD); - } - - /** - * Gets the file plan that a given file plan component resides within. - * - * @param nodeRef node reference - * @return {@link NodeRef} file plan, null if none - */ - public NodeRef getFilePlan(final NodeRef nodeRef) - { - NodeRef result = null; - if (nodeRef != null) - { - result = (NodeRef)getInternalNodeService().getProperty(nodeRef, PROP_ROOT_NODEREF); - if (result == null) - { - if (instanceOf(nodeRef, TYPE_FILE_PLAN)) - { - result = nodeRef; - } - else - { - ChildAssociationRef parentAssocRef = getInternalNodeService().getPrimaryParent(nodeRef); - if (parentAssocRef != null) - { - result = getFilePlan(parentAssocRef.getParentRef()); - } - } - } - } - - return result; - } - - /** - * Utility method to safely and quickly determine if a node is a type (or sub-type) of the one specified. - * - * @param nodeRef node reference - * @param ofClassName class name to check - */ - protected boolean instanceOf(NodeRef nodeRef, QName ofClassName) - { - ParameterCheck.mandatory("nodeRef", nodeRef); - ParameterCheck.mandatory("ofClassName", ofClassName); - QName className = getInternalNodeService().getType(nodeRef); - return instanceOf(className, ofClassName); - } - - /** - * Utility method to quickly determine whether one class is equal to or sub of another. - * - * @param className class name - * @param ofClassName class name to check against - * @return boolean true if equal to or sub, false otherwise - */ - protected boolean instanceOf(QName className, QName ofClassName) - { - ParameterCheck.mandatory("className", className); - ParameterCheck.mandatory("ofClassName", ofClassName); - boolean result = false; - if (ofClassName.equals(className) || - dictionaryService.isSubClass(className, ofClassName)) - { - result = true; - } - return result; - } - - /** - * Utility method to get the next counter for a node. - *

- * If the node is not already countable, then rma:countable is added and 0 returned. - * - * @param nodeRef node reference - * @return int next counter value - */ - protected int getNextCount(NodeRef nodeRef) - { - int counter = 0; - if (!nodeService.hasAspect(nodeRef, ASPECT_COUNTABLE)) - { - PropertyMap props = new PropertyMap(1); - props.put(PROP_COUNT, 1); - nodeService.addAspect(nodeRef, ASPECT_COUNTABLE, props); - counter = 1; - } - else - { - Integer value = (Integer)this.nodeService.getProperty(nodeRef, PROP_COUNT); - if (value != null) - { - counter = value.intValue() + 1; - } - else - { - counter = 1; - } - nodeService.setProperty(nodeRef, PROP_COUNT, counter); - - } - return counter; - } - - /** - * Helper method to get a set containing the node's type and all it's aspects - * - * @param nodeRef nodeRef - * @return Set set of qname's - */ - protected Set getTypeAndApsects(NodeRef nodeRef) - { - Set result = nodeService.getAspects(nodeRef); - result.add(nodeService.getType(nodeRef)); - return result; - } - - /** - * Helper method that executed work as system user. - *

- * Useful when testing using mocks. - * - * @param runAsWork work to execute as system user - * @return - */ - public R runAsSystem(RunAsWork runAsWork) - { - return AuthenticationUtil.runAsSystem(runAsWork); - } - - /** - * Helper method that executed work as given user. - *

- * Useful when testing using mocks. - * - * @param runAsWork work to execute as given user - * @return - */ - public R runAs(RunAsWork runAsWork, String uid) - { - return AuthenticationUtil.runAs(runAsWork, uid); - } + /** Node service */ + protected NodeService nodeService; + + /** Dictionary service */ + protected DictionaryService dictionaryService; + + /** Application context */ + protected ApplicationContext applicationContext; + + /** internal node service */ + private NodeService internalNodeService; + + /** + * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext) + */ + @Override + public void setApplicationContext(ApplicationContext applicationContext) + { + this.applicationContext = applicationContext; + } + + /** + * @param nodeService node service + */ + public void setNodeService(NodeService nodeService) + { + this.nodeService = nodeService; + } + + /** + * @param dictionaryService dictionary service + */ + public void setDictionaryService(DictionaryService dictionaryService) + { + this.dictionaryService = dictionaryService; + } + + /** + * Helper to get internal node service. + *

+ * Used for performance reasons. + */ + protected NodeService getInternalNodeService() + { + if (internalNodeService == null) + { + internalNodeService = (NodeService)applicationContext.getBean("dbNodeService"); + } + + return internalNodeService; + } + + /** + * Gets the file plan component kind from the given node reference + * + * @see FilePlanService#getFilePlanComponentKind(org.alfresco.service.cmr.repository.NodeRef) + */ + public FilePlanComponentKind getFilePlanComponentKind(NodeRef nodeRef) + { + FilePlanComponentKind result = null; + + if (isFilePlanComponent(nodeRef)) + { + 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; + } + } + + return result; + } + + /** + * Gets the file plan component kind from the given type. + * + * @see FilePlanService#getFilePlanComponentKindFromType(QName) + */ + public FilePlanComponentKind getFilePlanComponentKindFromType(QName type) + { + FilePlanComponentKind result = null; + + if (ASPECT_FILE_PLAN_COMPONENT.equals(type)) + { + result = FilePlanComponentKind.FILE_PLAN_COMPONENT; + } + else if (instanceOf(type, ASPECT_RECORD)) + { + result = FilePlanComponentKind.RECORD; + } + else if (instanceOf(type, TYPE_FILE_PLAN)) + { + result = FilePlanComponentKind.FILE_PLAN; + } + else if (instanceOf(type, TYPE_RECORD_CATEGORY)) + { + result = FilePlanComponentKind.RECORD_CATEGORY; + } + else if (instanceOf(type, TYPE_RECORD_FOLDER)) + { + result = FilePlanComponentKind.RECORD_FOLDER; + } + else if (instanceOf(type, TYPE_HOLD)) + { + result = FilePlanComponentKind.HOLD; + } + else if (instanceOf(type, TYPE_TRANSFER)) + { + result = FilePlanComponentKind.TRANSFER; + } + else if (instanceOf(type, TYPE_DISPOSITION_SCHEDULE) || + instanceOf(type, TYPE_DISPOSITION_ACTION_DEFINITION)) + { + result = FilePlanComponentKind.DISPOSITION_SCHEDULE; + } + + return result; + } + + /** + * Indicates whether the given node is a file plan component or not. + *

+ * Exposed in the FilePlan service. + * + * @see FilePlanService#isFilePlanComponent(org.alfresco.service.cmr.repository.NodeRef) + */ + public boolean isFilePlanComponent(NodeRef nodeRef) + { + boolean result = false; + if (getInternalNodeService().exists(nodeRef) && + getInternalNodeService().hasAspect(nodeRef, ASPECT_FILE_PLAN_COMPONENT)) + { + result = true; + } + return result; + } + + /** + * Indicates whether the given node is a file plan or not. + *

+ * Exposed in the FilePlan service. + * + * @see FilePlanService#isFilePlan(org.alfresco.service.cmr.repository.NodeRef) + */ + public boolean isFilePlan(NodeRef nodeRef) + { + return instanceOf(nodeRef, TYPE_FILE_PLAN); + } + + /** + * Indicates whether the given node is a file plan container or not. + * + * @see FilePlanService#isFilePlanContainer(org.alfresco.service.cmr.repository.NodeRef) + */ + public boolean isFilePlanContainer(NodeRef nodeRef) + { + return instanceOf(nodeRef, TYPE_RECORDS_MANAGEMENT_CONTAINER); + } + + /** + * Indicates whether the given node is a record category or not. + * + * @see FilePlanService#isRecordCategory(org.alfresco.service.cmr.repository.NodeRef) + */ + public boolean isRecordCategory(NodeRef nodeRef) + { + return instanceOf(nodeRef, TYPE_RECORD_CATEGORY); + } + + /** + * Indicates whether the given node is a record folder or not. + *

+ * Exposed in the RecordFolder service. + * + * @param nodeRef node reference + * @return boolean true if record folder, false otherwise + */ + public boolean isRecordFolder(NodeRef nodeRef) + { + ParameterCheck.mandatory("nodeRef", nodeRef); + return instanceOf(nodeRef, TYPE_RECORD_FOLDER); + } + + /** + * Indicates whether the given node reference is a record or not. + * + * @param nodeRef node reference + * @return boolean true if node reference is a record, false otherwise + */ + public boolean isRecord(NodeRef nodeRef) + { + ParameterCheck.mandatory("nodeRef", nodeRef); + + return getInternalNodeService().hasAspect(nodeRef, ASPECT_RECORD); + } + + /** + * Indicates whether the given node reference is a hold or not. + *

+ * Exposed publicly in the {@link HoldService} + * + * @param nodeRef node reference + * @return boolean true if rma:hold or sub-type, false otherwise + */ + public boolean isHold(NodeRef nodeRef) + { + ParameterCheck.mandatory("nodeRef", nodeRef); + + boolean isHold = false; + if (getInternalNodeService().exists(nodeRef) && + instanceOf(nodeRef, TYPE_HOLD)) + { + isHold = true; + } + return isHold; + } + + /** + * Indicates whether the given node reference is a transfer or not. + * + * @see org.alfresco.module.org_alfresco_module_rm.transfer.TransferService#isTransfer(NodeRef) + */ + public boolean isTransfer(NodeRef nodeRef) + { + ParameterCheck.mandatory("nodeRef", nodeRef); + + return instanceOf(nodeRef, TYPE_TRANSFER); + } + + /** + * Indicates whether a record is complete or not. + * + * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#isDeclared(org.alfresco.service.cmr.repository.NodeRef) + */ + public boolean isDeclared(NodeRef record) + { + ParameterCheck.mandatory("record", record); + + return getInternalNodeService().hasAspect(record, ASPECT_DECLARED_RECORD); + } + + /** + * Gets the file plan that a given file plan component resides within. + * + * @param nodeRef node reference + * @return {@link NodeRef} file plan, null if none + */ + public NodeRef getFilePlan(final NodeRef nodeRef) + { + NodeRef result = null; + if (nodeRef != null) + { + result = (NodeRef)getInternalNodeService().getProperty(nodeRef, PROP_ROOT_NODEREF); + if (result == null || !instanceOf(result, TYPE_FILE_PLAN)) + { + if (instanceOf(nodeRef, TYPE_FILE_PLAN)) + { + result = nodeRef; + } + else + { + ChildAssociationRef parentAssocRef = getInternalNodeService().getPrimaryParent(nodeRef); + if (parentAssocRef != null) + { + result = getFilePlan(parentAssocRef.getParentRef()); + } + } + } + } + + return result; + } + + /** + * Utility method to safely and quickly determine if a node is a type (or sub-type) of the one specified. + * + * @param nodeRef node reference + * @param ofClassName class name to check + */ + protected boolean instanceOf(NodeRef nodeRef, QName ofClassName) + { + ParameterCheck.mandatory("nodeRef", nodeRef); + ParameterCheck.mandatory("ofClassName", ofClassName); + QName className = getInternalNodeService().getType(nodeRef); + return instanceOf(className, ofClassName); + } + + private static Map instanceOfCache = new HashMap(); + + /** + * Utility method to quickly determine whether one class is equal to or sub of another. + * + * @param className class name + * @param ofClassName class name to check against + * @return boolean true if equal to or sub, false otherwise + */ + protected boolean instanceOf(QName className, QName ofClassName) + { + ParameterCheck.mandatory("className", className); + ParameterCheck.mandatory("ofClassName", ofClassName); + + boolean result = false; + + String key = className.toString() + "|" + ofClassName.toString(); + if (instanceOfCache.containsKey(key)) + { + result = instanceOfCache.get(key); + } + else + { + if (ofClassName.equals(className) || + dictionaryService.isSubClass(className, ofClassName)) + { + result = true; + } + + instanceOfCache.put(key, result); + } + + return result; + } + + /** + * Utility method to get the next counter for a node. + *

+ * If the node is not already countable, then rma:countable is added and 0 returned. + * + * @param nodeRef node reference + * @return int next counter value + */ + protected int getNextCount(NodeRef nodeRef) + { + int counter = 0; + if (!nodeService.hasAspect(nodeRef, ASPECT_COUNTABLE)) + { + PropertyMap props = new PropertyMap(1); + props.put(PROP_COUNT, 1); + nodeService.addAspect(nodeRef, ASPECT_COUNTABLE, props); + counter = 1; + } + else + { + Integer value = (Integer)this.nodeService.getProperty(nodeRef, PROP_COUNT); + if (value != null) + { + counter = value.intValue() + 1; + } + else + { + counter = 1; + } + nodeService.setProperty(nodeRef, PROP_COUNT, counter); + + } + return counter; + } + + /** + * Helper method to get a set containing the node's type and all it's aspects + * + * @param nodeRef nodeRef + * @return Set set of qname's + */ + protected Set getTypeAndApsects(NodeRef nodeRef) + { + Set result = nodeService.getAspects(nodeRef); + result.add(nodeService.getType(nodeRef)); + return result; + } + + /** + * Helper method that executed work as system user. + *

+ * Useful when testing using mocks. + * + * @param runAsWork work to execute as system user + * @return + */ + public R runAsSystem(RunAsWork runAsWork) + { + return AuthenticationUtil.runAsSystem(runAsWork); + } + + /** + * Helper method that executed work as given user. + *

+ * Useful when testing using mocks. + * + * @param runAsWork work to execute as given user + * @return + */ + public R runAs(RunAsWork runAsWork, String uid) + { + return AuthenticationUtil.runAs(runAsWork, uid); + } } diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FreezeServiceImplTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FreezeServiceImplTest.java index 1f3733249a..f64f13b778 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FreezeServiceImplTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FreezeServiceImplTest.java @@ -62,7 +62,6 @@ public class FreezeServiceImplTest extends BaseRMTestCase // Freeze a record freezeService.freeze("FreezeReason", recordOne); - assertTrue(freezeService.hasFrozenChildren(rmFolder)); // Check the hold exists Set holdAssocs = freezeService.getHolds(filePlan); @@ -192,7 +191,6 @@ public class FreezeServiceImplTest extends BaseRMTestCase assertFalse(freezeService.isFrozen(recordTwo)); assertFalse(freezeService.isFrozen(recordThree)); assertFalse(freezeService.isFrozen(recordFour)); - assertFalse(freezeService.hasFrozenChildren(rmFolder)); // Test freezing nodes, adding them to an existing hold NodeRef hold = freezeService.freeze("AnotherFreezeReason", recordFour); @@ -201,7 +199,6 @@ public class FreezeServiceImplTest extends BaseRMTestCase nodes.add(recordTwo); nodes.add(recordThree); freezeService.freeze(hold, nodes); - assertTrue(freezeService.hasFrozenChildren(rmFolder)); // Check the hold holdAssocs = freezeService.getHolds(filePlan); @@ -216,7 +213,6 @@ public class FreezeServiceImplTest extends BaseRMTestCase assertFalse(freezeService.isFrozen(recordTwo)); assertFalse(freezeService.isFrozen(recordThree)); assertFalse(freezeService.isFrozen(recordFour)); - assertFalse(freezeService.hasFrozenChildren(rmFolder)); return null; } From dccb5e513d1b0237a5d0d0893013bc7c840be257 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Wed, 16 Jul 2014 02:10:46 +0000 Subject: [PATCH 10/54] Merged HEAD to BRANCHES/V2.1.0.x: 75102: RM Performance testing git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@76598 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../role/FilePlanRoleServiceImpl.java | 4 ++-- .../script/admin/RoleDeclarativeWebScript.java | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/role/FilePlanRoleServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/role/FilePlanRoleServiceImpl.java index 908500eabd..54960043bc 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/role/FilePlanRoleServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/role/FilePlanRoleServiceImpl.java @@ -663,7 +663,7 @@ public class FilePlanRoleServiceImpl implements FilePlanRoleService, { String capabilityName = permission.getPermission(); Capability capability = capabilityService.getCapability(capabilityName); - if (capability != null) + if (capability != null && !capability.isPrivate()) { capabilities.add(capability); } @@ -860,7 +860,7 @@ public class FilePlanRoleServiceImpl implements FilePlanRoleService, { throw new AlfrescoRuntimeException("Can not get authorities for role " + roleName + ", because it does not exist. (filePlan=" + filePlan.toString() + ")"); } - return authorityService.getContainedAuthorities(authorityType, role.getRoleGroupName(), false); + return authorityService.getContainedAuthorities(authorityType, role.getRoleGroupName(), true); } }, AuthenticationUtil.getSystemUserName()); diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/admin/RoleDeclarativeWebScript.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/admin/RoleDeclarativeWebScript.java index 819615b5f5..f898cfa74f 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/admin/RoleDeclarativeWebScript.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/admin/RoleDeclarativeWebScript.java @@ -29,6 +29,7 @@ import org.alfresco.module.org_alfresco_module_rm.role.Role; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.security.AuthorityService; +import org.alfresco.service.cmr.security.AuthorityType; import org.apache.cxf.common.util.StringUtils; import org.springframework.extensions.webscripts.DeclarativeWebScript; import org.springframework.extensions.webscripts.WebScriptRequest; @@ -172,7 +173,11 @@ public class RoleDeclarativeWebScript extends DeclarativeWebScript for (String authority : authorities) { - String displayLabel = authorityService.getAuthorityDisplayName(authority); + String displayLabel = authority; + if (!AuthorityType.getAuthorityType(authority).equals(AuthorityType.USER)) + { + displayLabel = authorityService.getAuthorityDisplayName(authority); + } result.add(new AuthorityItem(authority, displayLabel)); } From be0dd4c598eb307eaf6edb97bbf079fce5235f0b Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Wed, 16 Jul 2014 02:18:28 +0000 Subject: [PATCH 11/54] Update module version to 2.1.0.2 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@76599 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- gradle.properties | 2 +- .../alfresco/module/org_alfresco_module_rm/module.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 4aa7cc4c10..bb286aadbb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ # build details groupid=alfresco packageName=rm -version=2.1.0.1 +version=2.1.0.2 build=dev # maven urls's diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties index 79697c6903..00c3401827 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties @@ -6,6 +6,6 @@ module.aliases=org_alfresco_module_dod5015 module.title=Records Management module.description=Alfresco Record Management Extension -module.version=2.1.0.1 +module.version=2.1.0.2 module.repo.version.min=4.2 \ No newline at end of file From bea661346eaa929785e5323a46467a08eda2efb5 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Wed, 16 Jul 2014 04:45:57 +0000 Subject: [PATCH 12/54] 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() From 60ab1304bd97a6d59be6c1b6a867d8f00a10bcbf Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Thu, 17 Jul 2014 04:44:34 +0000 Subject: [PATCH 13/54] Root container cache to improve unfiled record browse performance * relates to RM-1594 and RM-1595 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@76673 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../rm-service-context.xml | 3 ++ .../fileplan/FilePlanServiceImpl.java | 42 ++++++++++++++----- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml index 98829ee9df..ee194522f7 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml @@ -438,6 +438,8 @@ + + @@ -446,6 +448,7 @@ + diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/FilePlanServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/FilePlanServiceImpl.java index d62a21da56..80514a902f 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/FilePlanServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/FilePlanServiceImpl.java @@ -39,6 +39,7 @@ import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService; import org.alfresco.module.org_alfresco_module_rm.security.ExtendedReaderDynamicAuthority; import org.alfresco.module.org_alfresco_module_rm.security.ExtendedWriterDynamicAuthority; import org.alfresco.module.org_alfresco_module_rm.util.ServiceBaseImpl; +import org.alfresco.repo.cache.SimpleCache; import org.alfresco.repo.domain.node.NodeDAO; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; @@ -82,6 +83,9 @@ public class FilePlanServiceImpl extends ServiceBaseImpl /** RM site file plan container */ private static final String FILE_PLAN_CONTAINER = "documentLibrary"; + /** root container cache */ + private SimpleCache, NodeRef> rootContainerCache; + /** * NOTE: for some reason spring couldn't cope with the circular references between these two * beans so we need to grab this one manually. @@ -166,6 +170,14 @@ public class FilePlanServiceImpl extends ServiceBaseImpl return getFilePlans(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE); } + /** + * @param rootContainerCache root container cache + */ + public void setRootContainerCache(SimpleCache, NodeRef> rootContainerCache) + { + this.rootContainerCache = rootContainerCache; + } + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getFilePlans(org.alfresco.service.cmr.repository.StoreRef) */ @@ -255,10 +267,11 @@ public class FilePlanServiceImpl extends ServiceBaseImpl } /** + * Get the file root container for the given type. * - * @param filePlan - * @param containerName - * @return + * @param filePlan file plan + * @param containerName container type + * @return {@link NodeRef} file plan container */ private NodeRef getFilePlanRootContainer(NodeRef filePlan, String containerName) { @@ -269,16 +282,25 @@ public class FilePlanServiceImpl extends ServiceBaseImpl } NodeRef result = null; - - // try and get the unfiled record container - List assocs = nodeService.getChildAssocs(filePlan, ContentModel.ASSOC_CONTAINS, QName.createQName(RM_URI, containerName)); - if (assocs.size() > 1) + Pair key = new Pair(filePlan, containerName); + + if (!rootContainerCache.contains(key)) { - throw new AlfrescoRuntimeException("Unable to get unfiled conatiner " + containerName + "."); + // try and get the unfiled record container + List assocs = nodeService.getChildAssocs(filePlan, ContentModel.ASSOC_CONTAINS, QName.createQName(RM_URI, containerName)); + if (assocs.size() > 1) + { + throw new AlfrescoRuntimeException("Unable to get unfiled conatiner " + containerName + "."); + } + else if (assocs.size() == 1) + { + result = assocs.get(0).getChildRef(); + rootContainerCache.put(key, result); + } } - else if (assocs.size() == 1) + else { - result = assocs.get(0).getChildRef(); + result = rootContainerCache.get(key); } return result; From 0431f2586590407a9eeb96870b34038fb1c6cf47 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Fri, 18 Jul 2014 04:17:45 +0000 Subject: [PATCH 14/54] RM performance enhancements * serach improvements * in-place record browse improvements * saved search via file plan browse improvements git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@76850 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../capability/RMSecurityCommon.java | 116 ++++++++++++------ .../script/slingshot/RMSearchGet.java | 33 ++--- .../RecordsManagementSearchService.java | 7 +- .../RecordsManagementSearchServiceImpl.java | 13 +- .../ExtendedReaderDynamicAuthority.java | 9 ++ .../ExtendedSecurityBaseDynamicAuthority.java | 84 ++++++------- .../ExtendedWriterDynamicAuthority.java | 11 +- .../util/ServiceBaseImpl.java | 45 ++++--- .../test/service/RecordServiceImplTest.java | 13 +- ...ecordsManagementSearchServiceImplTest.java | 3 +- 10 files changed, 198 insertions(+), 136 deletions(-) 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 51c70b7bfc..ec1181efb5 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 @@ -18,6 +18,8 @@ */ package org.alfresco.module.org_alfresco_module_rm.capability; +import java.util.Map; + import net.sf.acegisecurity.vote.AccessDecisionVoter; import org.alfresco.error.AlfrescoRuntimeException; @@ -27,6 +29,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.transaction.AlfrescoTransactionSupport; +import org.alfresco.repo.transaction.TransactionalResourceHelper; import org.alfresco.service.cmr.repository.AssociationRef; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; @@ -34,6 +37,7 @@ import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.security.AccessStatus; import org.alfresco.service.cmr.security.PermissionService; +import org.alfresco.util.Pair; import org.aopalliance.intercept.MethodInvocation; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -192,48 +196,82 @@ public class RMSecurityCommon } /** + * Core RM read check * - * @param nodeRef - * @return + * @param nodeRef node reference + * @return int see {@link AccessDecisionVoter} */ public int checkRmRead(NodeRef nodeRef) - { - int result = getTransactionCache("checkRmRead", nodeRef); - if (result != NOSET_VALUE) - { - return result; - } - - if (permissionService.hasPermission(nodeRef, RMPermissionModel.READ_RECORDS) == AccessStatus.DENIED) - { - if (logger.isDebugEnabled()) - { - logger.debug("\t\tUser does not have read record permission on node, access denied. (nodeRef=" + nodeRef.toString() + ", user=" + AuthenticationUtil.getRunAsUser() + ")"); - } - return setTransactionCache("checkRmRead", nodeRef, AccessDecisionVoter.ACCESS_DENIED); - } - - // Get the file plan for the node - NodeRef filePlan = filePlanService.getFilePlan(nodeRef); - - if (permissionService.hasPermission(filePlan, RMPermissionModel.VIEW_RECORDS) == AccessStatus.DENIED) - { - if (logger.isDebugEnabled()) - { - logger.debug("\t\tUser does not have view records capability permission on node, access denied. (filePlan=" + filePlan.toString() + ", user=" + AuthenticationUtil.getRunAsUser() + ")"); - } - return setTransactionCache("checkRmRead", nodeRef, AccessDecisionVoter.ACCESS_DENIED); - } - - if (caveatConfigComponent.hasAccess(nodeRef)) - { - return setTransactionCache("checkRmRead", nodeRef, AccessDecisionVoter.ACCESS_GRANTED); - } - else - { - return setTransactionCache("checkRmRead", nodeRef, AccessDecisionVoter.ACCESS_DENIED); - } - + { + int result = AccessDecisionVoter.ACCESS_ABSTAIN; + + Map, Integer> transactionCache = TransactionalResourceHelper.getMap("rm.security.checkRMRead"); + Pair key = new Pair(AuthenticationUtil.getRunAsUser(), nodeRef); + + if (transactionCache.containsKey(key)) + { + result = transactionCache.get(key); + } + else + { + if (permissionService.hasPermission(nodeRef, RMPermissionModel.READ_RECORDS) == AccessStatus.DENIED) + { + if (logger.isDebugEnabled()) + { + logger.debug("\t\tUser does not have read record permission on node, access denied. (nodeRef=" + nodeRef.toString() + ", user=" + AuthenticationUtil.getRunAsUser() + ")"); + } + result = AccessDecisionVoter.ACCESS_DENIED; + } + else + { + // Get the file plan for the node + NodeRef filePlan = filePlanService.getFilePlan(nodeRef); + if (hasViewCapability(filePlan) == AccessStatus.DENIED) + { + if (logger.isDebugEnabled()) + { + logger.debug("\t\tUser does not have view records capability permission on node, access denied. (filePlan=" + filePlan.toString() + ", user=" + AuthenticationUtil.getRunAsUser() + ")"); + } + result = AccessDecisionVoter.ACCESS_DENIED; + } + else if (!caveatConfigComponent.hasAccess(nodeRef)) + { + result = AccessDecisionVoter.ACCESS_DENIED; + } + else + { + result = AccessDecisionVoter.ACCESS_GRANTED; + } + } + + // cache result + transactionCache.put(key, result); + } + + return result; + } + + /** + * Helper method to determine whether the current user has view capability on the file plan + * + * @param filePlan file plan + * @return {@link AccessStatus} + */ + private AccessStatus hasViewCapability(NodeRef filePlan) + { + Map, AccessStatus> transactionCache = TransactionalResourceHelper.getMap("rm.security.hasViewCapability"); + Pair key = new Pair(AuthenticationUtil.getRunAsUser(), filePlan); + + if (transactionCache.containsKey(key)) + { + return transactionCache.get(key); + } + else + { + AccessStatus result = permissionService.hasPermission(filePlan, RMPermissionModel.VIEW_RECORDS); + transactionCache.put(key, result); + return result; + } } @SuppressWarnings("rawtypes") diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/slingshot/RMSearchGet.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/slingshot/RMSearchGet.java index eb46eb54fb..117289965f 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/slingshot/RMSearchGet.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/slingshot/RMSearchGet.java @@ -33,9 +33,7 @@ import org.alfresco.module.org_alfresco_module_rm.search.RecordsManagementSearch import org.alfresco.module.org_alfresco_module_rm.search.RecordsManagementSearchService; import org.alfresco.module.org_alfresco_module_rm.search.SavedSearchDetailsCompatibility; import org.alfresco.service.cmr.dictionary.DictionaryService; -import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.ContentData; -import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentService; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; @@ -44,6 +42,7 @@ import org.alfresco.service.cmr.security.PersonService; import org.alfresco.service.cmr.site.SiteService; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; +import org.alfresco.util.Pair; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.springframework.extensions.webscripts.Cache; @@ -199,20 +198,20 @@ public class RMSearchGet extends DeclarativeWebScript } // Execute search - List results = recordsManagementSearchService.search(siteId, query, searchParameters); + List> results = recordsManagementSearchService.search(siteId, query, searchParameters); // Reset person data cache personDataCache = new HashMap(57); // Process the result items List items = new ArrayList(results.size()); - for (NodeRef nodeRef : results) + for (Pair pair : results) { // FIXME: This is a workaround for DOD Recert // TC 3-3 Create User Groups try { - Item item = new Item(nodeRef); + Item item = new Item(pair.getFirst(), pair.getSecond()); items.add(item); } catch(Exception e) {} @@ -245,7 +244,7 @@ public class RMSearchGet extends DeclarativeWebScript private Map nodeProperties; private Map properties; - public Item(NodeRef nodeRef) + public Item(NodeRef parent, NodeRef nodeRef) { // Set node ref this.nodeRef = nodeRef; @@ -265,12 +264,12 @@ public class RMSearchGet extends DeclarativeWebScript } // Get parent node reference - NodeRef parent = null; - ChildAssociationRef assoc = nodeService.getPrimaryParent(nodeRef); - if (assoc != null) - { - parent = assoc.getParentRef(); - } +// NodeRef parent = null; +// ChildAssociationRef assoc = nodeService.getPrimaryParent(nodeRef); +// if (assoc != null) +// { +// parent = assoc.getParentRef(); +// } if (isContainer == true) { @@ -334,16 +333,6 @@ public class RMSearchGet extends DeclarativeWebScript if (NamespaceService.SYSTEM_MODEL_1_0_URI.equals(qName.getNamespaceURI()) == false) { String prefixName = qName.getPrefixString().replace(":", "_"); - Serializable value = entry.getValue(); - if (value instanceof NodeRef) - { - value = value.toString(); - } - else if (value instanceof ContentData) - { - ContentReader contentReader = contentService.getReader(nodeRef, qName); - value = contentReader.getContentString(); - } properties.put(prefixName, entry.getValue()); } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/search/RecordsManagementSearchService.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/search/RecordsManagementSearchService.java index b4e971bae5..76ece11e65 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/search/RecordsManagementSearchService.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/search/RecordsManagementSearchService.java @@ -21,6 +21,7 @@ package org.alfresco.module.org_alfresco_module_rm.search; import java.util.List; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.util.Pair; /** * Records management search service. @@ -33,10 +34,10 @@ public interface RecordsManagementSearchService * Execute a records management search * @param siteId the id of the rm site to query * @param query search query string - * @param searchParameters search parameters - * @return {@link List}<{@link NodeRef}> search results + * @param searchParameters search parameters + * @return {@link List}<{@link Pair}<{@link NodeRef}, {@link NodeRef}> search results as pairs for parent and child nodes */ - List search(String siteId, String query, RecordsManagementSearchParameters searchParameters); + List> search(String siteId, String query, RecordsManagementSearchParameters searchParameters); /** * Get all the searches saved on the given records management site. diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/search/RecordsManagementSearchServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/search/RecordsManagementSearchServiceImpl.java index 6383d99598..96a1b995d1 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/search/RecordsManagementSearchServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/search/RecordsManagementSearchServiceImpl.java @@ -30,6 +30,7 @@ import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.service.cmr.model.FileFolderService; import org.alfresco.service.cmr.model.FileInfo; +import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.ContentReader; import org.alfresco.service.cmr.repository.ContentWriter; import org.alfresco.service.cmr.repository.NodeRef; @@ -41,6 +42,7 @@ import org.alfresco.service.cmr.site.SiteService; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.alfresco.util.ISO9075; +import org.alfresco.util.Pair; import org.alfresco.util.ParameterCheck; import org.json.JSONArray; import org.json.JSONException; @@ -173,7 +175,7 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear * @see org.alfresco.module.org_alfresco_module_rm.search.RecordsManagementSearchService#search(java.lang.String, java.lang.String, org.alfresco.module.org_alfresco_module_rm.search.RecordsManagementSearchParameters) */ @Override - public List search(String siteId, String query, RecordsManagementSearchParameters rmSearchParameters) + public List> search(String siteId, String query, RecordsManagementSearchParameters rmSearchParameters) { // build the full RM query StringBuilder fullQuery = new StringBuilder(1024); @@ -206,9 +208,16 @@ public class RecordsManagementSearchServiceImpl implements RecordsManagementSear // execute query ResultSet resultSet = searchService.query(searchParameters); + + // process results + List> result = new ArrayList>(resultSet.length()); + for (ChildAssociationRef childAssoc : resultSet.getChildAssocRefs()) + { + result.add(new Pair(childAssoc.getParentRef(), childAssoc.getChildRef())); + } // return results - return resultSet.getNodeRefs(); + return result; } /** diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedReaderDynamicAuthority.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedReaderDynamicAuthority.java index 4673d5256b..f3d4a8b6a6 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedReaderDynamicAuthority.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedReaderDynamicAuthority.java @@ -49,4 +49,13 @@ public class ExtendedReaderDynamicAuthority extends ExtendedSecurityBaseDynamicA { return getExtendedSecurityService().getExtendedReaders(nodeRef); } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.security.ExtendedSecurityBaseDynamicAuthority#getTransactionCacheName() + */ + @Override + protected String getTransactionCacheName() + { + return "rm.extendedreaderdynamicauthority"; + } } 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 2c439c3519..c1627476a8 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 @@ -28,6 +28,7 @@ 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.util.Pair; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @@ -42,9 +43,6 @@ 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; @@ -95,6 +93,11 @@ public abstract class ExtendedSecurityBaseDynamicAuthority implements DynamicAut } return nodeService; } + + /** + * @return String transaction cache name + */ + protected abstract String getTransactionCacheName(); /** * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext) @@ -122,51 +125,38 @@ public abstract class ExtendedSecurityBaseDynamicAuthority implements DynamicAut { boolean result = false; - if (getNodeService().hasAspect(nodeRef, ASPECT_EXTENDED_SECURITY) == true) + Map, Boolean> transactionCache = TransactionalResourceHelper.getMap(getTransactionCacheName()); + Pair key = new Pair(nodeRef, userName); + + if (transactionCache.containsKey(key)) { - Set authorities = getAuthorites(nodeRef); - if (authorities != null) - { - for (String authority : authorities) - { - if ("GROUP_EVERYONE".equals(authority) == true) - { - // 'eveyone' is there so break - result = true; - break; - } - else if (authority.startsWith("GROUP_") == true) - { - Map transactionCache = TransactionalResourceHelper.getMap(KEY_HAS_AUTHORITY_CACHE); - String key = authority + "|" + userName; - if (transactionCache.containsKey(key)) - - { - result = transactionCache.get(key); - break; - } - else - { - Set contained = getAuthorityService().getAuthoritiesForUser(userName); - if (contained.contains(authority)) - { - result = true; - transactionCache.put(key, result); - break; - } - } - } - else - { - // presume we have a user - if (authority.equals(userName) == true) - { - result = true; - break; - } - } - } - } + result = transactionCache.get(key); + } + else + { + if (getNodeService().hasAspect(nodeRef, ASPECT_EXTENDED_SECURITY) == true) + { + Set authorities = getAuthorites(nodeRef); + if (authorities != null) + { + // check for everyone or the user + if (authorities.contains("GROUP_EVEYONE") || + authorities.contains(userName)) + { + result = true; + } + else + { + // determine whether any of the users groups are in the extended security + Set contained = getAuthorityService().getAuthoritiesForUser(userName); + authorities.retainAll(contained); + result = (authorities.size() != 0); + } + } + } + + // cache result + transactionCache.put(key, result); } return result; diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedWriterDynamicAuthority.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedWriterDynamicAuthority.java index 24ff81ed13..af4eb53ad7 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedWriterDynamicAuthority.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedWriterDynamicAuthority.java @@ -48,5 +48,14 @@ public class ExtendedWriterDynamicAuthority extends ExtendedSecurityBaseDynamicA protected Set getAuthorites(NodeRef nodeRef) { return getExtendedSecurityService().getExtendedWriters(nodeRef); - } + } + + /** + * @see org.alfresco.module.org_alfresco_module_rm.security.ExtendedSecurityBaseDynamicAuthority#getTransactionCacheName() + */ + @Override + protected String getTransactionCacheName() + { + return "rm.extendedwriterdynamicauthority"; + } } 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 1dfe8d7010..21e1e349c6 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 @@ -338,24 +338,35 @@ public class ServiceBaseImpl implements RecordsManagementModel, ApplicationConte public NodeRef getFilePlan(final NodeRef nodeRef) { NodeRef result = null; - if (nodeRef != null) + if (nodeRef != null) { - result = (NodeRef)getInternalNodeService().getProperty(nodeRef, PROP_ROOT_NODEREF); - if (result == null || !instanceOf(result, TYPE_FILE_PLAN)) - { - if (instanceOf(nodeRef, TYPE_FILE_PLAN)) - { - result = nodeRef; - } - else - { - ChildAssociationRef parentAssocRef = getInternalNodeService().getPrimaryParent(nodeRef); - if (parentAssocRef != null) - { - result = getFilePlan(parentAssocRef.getParentRef()); - } - } - } + Map transactionCache = TransactionalResourceHelper.getMap("rm.servicebase.getFilePlan"); + if (transactionCache.containsKey(nodeRef)) + { + result = transactionCache.get(nodeRef); + } + else + { + result = (NodeRef)getInternalNodeService().getProperty(nodeRef, PROP_ROOT_NODEREF); + if (result == null || !instanceOf(result, TYPE_FILE_PLAN)) + { + if (instanceOf(nodeRef, TYPE_FILE_PLAN)) + { + result = nodeRef; + } + else + { + ChildAssociationRef parentAssocRef = getInternalNodeService().getPrimaryParent(nodeRef); + if (parentAssocRef != null) + { + result = getFilePlan(parentAssocRef.getParentRef()); + } + } + } + + // cache result in transaction + transactionCache.put(nodeRef, result); + } } return result; diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/RecordServiceImplTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/RecordServiceImplTest.java index d964e145f9..2b4d918d26 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/RecordServiceImplTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/RecordServiceImplTest.java @@ -294,10 +294,12 @@ public class RecordServiceImplTest extends BaseRMTestCase // create record from document doTestInTransaction(new Test() { + private NodeRef originalLocation; + @Override public Void run() { - NodeRef originalLocation = nodeService.getPrimaryParent(dmDocument).getParentRef(); + originalLocation = nodeService.getPrimaryParent(dmDocument).getParentRef(); assertFalse(recordService.isRecord(dmDocument)); assertFalse(extendedSecurityService.hasExtendedSecurity(dmDocument)); @@ -318,7 +320,12 @@ public class RecordServiceImplTest extends BaseRMTestCase AccessStatus.DENIED); // doc/record recordService.createRecord(filePlan, dmDocument); - + + return null; + } + + public void test(Void result) + { checkPermissions(READ_RECORDS, AccessStatus.ALLOWED, // file // plan AccessStatus.ALLOWED, // unfiled container @@ -367,8 +374,6 @@ public class RecordServiceImplTest extends BaseRMTestCase Capability updateProperties = capabilityService.getCapability("UpdateProperties"); assertEquals(AccessStatus.ALLOWED, updateProperties.hasPermission(dmDocument)); - - return null; } }, dmCollaborator); diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/RecordsManagementSearchServiceImplTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/RecordsManagementSearchServiceImplTest.java index 0917fadb3e..8fbafad26e 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/RecordsManagementSearchServiceImplTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/RecordsManagementSearchServiceImplTest.java @@ -26,6 +26,7 @@ import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.security.MutableAuthenticationService; +import org.alfresco.util.Pair; import org.alfresco.util.TestWithUserUtils; /** @@ -151,7 +152,7 @@ public class RecordsManagementSearchServiceImplTest extends BaseRMTestCase String query = "keywords:\"elephant\""; RecordsManagementSearchParameters params = new RecordsManagementSearchParameters(); params.setIncludeUndeclaredRecords(true); - List results = rmSearchService.search(siteId, query, params); + List> results = rmSearchService.search(siteId, query, params); assertNotNull(results); assertEquals(2, results.size()); From 5f542bf61950e8b5a85858c6afeeafbce626392e Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Fri, 18 Jul 2014 04:55:59 +0000 Subject: [PATCH 15/54] Additional unit test to check extended security with cache is working as expected. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@76851 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../alfresco-global.properties | 5 +- .../ExtendedSecurityServiceImplTest.java | 117 ++++++++++++++++++ 2 files changed, 121 insertions(+), 1 deletion(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/alfresco-global.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/alfresco-global.properties index 70676c0e4d..8864f56b1c 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/alfresco-global.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/alfresco-global.properties @@ -34,4 +34,7 @@ bootstrap.rmadmin.name=rmadmin # # Indicates whether RM rules will be run as RM Admin or not by default # -rm.rule.runasrmadmin=true \ No newline at end of file +rm.rule.runasrmadmin=true + +activities.feed.generator.cronExpression=0 30 3 * * ? +activities.feed.generator.maxItemsPerCycle=1 \ No newline at end of file diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/ExtendedSecurityServiceImplTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/ExtendedSecurityServiceImplTest.java index 1407ced003..7b399c1d09 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/ExtendedSecurityServiceImplTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/ExtendedSecurityServiceImplTest.java @@ -23,10 +23,16 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.security.ExtendedSecurityService; import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase; import org.alfresco.repo.security.authentication.AuthenticationUtil; +import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; +import org.alfresco.repo.site.SiteModel; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.security.AccessStatus; +import org.alfresco.service.cmr.site.SiteService; +import org.alfresco.service.cmr.site.SiteVisibility; import org.alfresco.util.GUID; /** @@ -248,4 +254,115 @@ public class ExtendedSecurityServiceImplTest extends BaseRMTestCase assertNotNull(readers); assertEquals(testMap.size(), readers.size()); } + + public void testDifferentUsersDifferentPermissions() + { + final String userNone = createTestUser(); + final String userRead = createTestUser(); + final String userWrite = createTestUser(); + final String siteShortName = GUID.generate(); + + doTestInTransaction(new Test() + { + public Void run() throws Exception + { + siteService.createSite(null, siteShortName, "test", "test", SiteVisibility.PRIVATE); + return null; + } + }); + + final NodeRef documentLibrary = doTestInTransaction(new Test() + { + public NodeRef run() throws Exception + { + siteService.setMembership(siteShortName, userRead, SiteModel.SITE_CONSUMER); + siteService.setMembership(siteShortName, userWrite, SiteModel.SITE_COLLABORATOR); + return siteService.createContainer(siteShortName, SiteService.DOCUMENT_LIBRARY, null, null); + } + }); + + final NodeRef record = doTestInTransaction(new Test() + { + public NodeRef run() throws Exception + { + NodeRef record = fileFolderService.create(documentLibrary, GUID.generate(), ContentModel.TYPE_CONTENT).getNodeRef(); + recordService.createRecord(filePlan, record); + return record; + } + }); + + doTestInTransaction(new Test() + { + public Void run() throws Exception + { + AuthenticationUtil.runAs(new RunAsWork() + { + public Void doWork() throws Exception + { + // check permissions + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record, READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record, FILING)); + return null; + } + }, userNone); + + AuthenticationUtil.runAs(new RunAsWork() + { + public Void doWork() throws Exception + { + // check permissions + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record, READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record, FILING)); + return null; + } + }, userRead); + + AuthenticationUtil.runAs(new RunAsWork() + { + public Void doWork() throws Exception + { + // check permissions + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record, READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record, FILING)); + return null; + } + }, userWrite); + + AuthenticationUtil.runAs(new RunAsWork() + { + public Void doWork() throws Exception + { + // check permissions + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record, READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record, FILING)); + return null; + } + }, userNone); + + AuthenticationUtil.runAs(new RunAsWork() + { + public Void doWork() throws Exception + { + // check permissions + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record, READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record, FILING)); + return null; + } + }, userRead); + + AuthenticationUtil.runAs(new RunAsWork() + { + public Void doWork() throws Exception + { + // check permissions + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record, READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record, FILING)); + return null; + } + }, userWrite); + + return null; + } + }); + } } From 10294cc7e9f276f51ea57bcac953d69047166151 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Fri, 18 Jul 2014 04:57:11 +0000 Subject: [PATCH 16/54] Rollback checked in config git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@76852 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../module/org_alfresco_module_rm/alfresco-global.properties | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/alfresco-global.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/alfresco-global.properties index 8864f56b1c..70676c0e4d 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/alfresco-global.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/alfresco-global.properties @@ -34,7 +34,4 @@ bootstrap.rmadmin.name=rmadmin # # Indicates whether RM rules will be run as RM Admin or not by default # -rm.rule.runasrmadmin=true - -activities.feed.generator.cronExpression=0 30 3 * * ? -activities.feed.generator.maxItemsPerCycle=1 \ No newline at end of file +rm.rule.runasrmadmin=true \ No newline at end of file From 4215b0bae9869b35b420c2474ac7f875f4ac2f2e Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Wed, 23 Jul 2014 00:58:52 +0000 Subject: [PATCH 17/54] RM-1630: Error on manage references page * regression caused by performance improvements git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@77709 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../admin/RecordsManagementAdminServiceImpl.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/admin/RecordsManagementAdminServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/admin/RecordsManagementAdminServiceImpl.java index b18894b196..79a9aaf7c7 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/admin/RecordsManagementAdminServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/admin/RecordsManagementAdminServiceImpl.java @@ -80,6 +80,7 @@ import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; +import org.alfresco.service.namespace.RegexQNamePattern; import org.alfresco.util.GUID; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -1154,7 +1155,7 @@ public class RecordsManagementAdminServiceImpl implements RecordsManagementAdmin */ public List getCustomReferencesFrom(NodeRef node) { - return nodeService.getTargetAssocs(node, null); + return nodeService.getTargetAssocs(node, RegexQNamePattern.MATCH_ALL); } /** @@ -1171,7 +1172,7 @@ public class RecordsManagementAdminServiceImpl implements RecordsManagementAdmin */ public List getCustomReferencesTo(NodeRef node) { - return nodeService.getSourceAssocs(node, null); + return nodeService.getSourceAssocs(node, RegexQNamePattern.MATCH_ALL); } /** From 9f4d324a0975627b4ebd7fb072274c73a5fd3bc0 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Fri, 1 Aug 2014 13:32:29 +0000 Subject: [PATCH 18/54] RM-1611 (RU: a few improvements of translation) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.2@78811 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../messages/dod5015-model_ru.properties | 4 ++-- .../messages/actions_ru.properties | 16 +++++++-------- .../messages/audit-service_ru.properties | 2 +- .../messages/capability-service_ru.properties | 6 +++--- .../messages/records-model_ru.properties | 20 +++++++++---------- .../messages/rm-actions_ru.properties | 4 ++-- .../rm-workflow-messages_ru.properties | 2 +- 7 files changed, 27 insertions(+), 27 deletions(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/dod5015/messages/dod5015-model_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/dod5015/messages/dod5015-model_ru.properties index 25eae51ed4..04eafeb9de 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/dod5015/messages/dod5015-model_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/dod5015/messages/dod5015-model_ru.properties @@ -3,8 +3,8 @@ dod_dod5015.description=\u041c\u043e\u0434\u0435\u043b\u044c \u043a\u043e\u043d\ dod_dod5015.type.dod_site.title=\u0421\u0430\u0439\u0442 DOD5015 dod_dod5015.type.dod_site.description=\u0421\u0430\u0439\u0442 DOD5015 -dod_dod5015.type.dod_filePlan.title=\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430 \u0434\u0435\u043b DOD5015 -dod_dod5015.type.dod_filePlan.description=\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430 \u0434\u0435\u043b DOD5015 +dod_dod5015.type.dod_filePlan.title=\u0421\u0431\u043e\u0440\u043d\u0438\u043a \u0444\u0430\u0439\u043b\u043e\u0432/ \u0410\u0440\u0445\u0438\u0432 \u0444\u0430\u0439\u043b\u043e\u0432 DOD5015 +dod_dod5015.type.dod_filePlan.description=\u0421\u0431\u043e\u0440\u043d\u0438\u043a \u0444\u0430\u0439\u043b\u043e\u0432/ \u0410\u0440\u0445\u0438\u0432 \u0444\u0430\u0439\u043b\u043e\u0432 DOD5015 dod_dod5015.type.dod_recordSeries.title=\u0421\u0435\u0440\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439 (\u0443\u0441\u0442\u0430\u0440\u0435\u043b\u043e) dod_dod5015.type.dod_recordSeries.description=\u0421\u0435\u0440\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439 (\u0443\u0441\u0442\u0430\u0440\u0435\u043b\u043e) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/actions_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/actions_ru.properties index 650251afc3..b40981ca69 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/actions_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/actions_ru.properties @@ -6,7 +6,7 @@ isClassified.title=\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\ isClassified.description=\u0417\u0430\u043f\u0438\u0441\u0438 \u0438\u043b\u0438 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u043e \u043f\u0435\u0440\u0435\u0447\u043d\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0440\u043e\u043a\u0430\u043c\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f. # Are cutoff -isCutoff.title=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c +isCutoff.title=\u041e\u0442\u0441\u0435\u0447\u044c / \u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c isCutoff.description=\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0438\u043b\u0438 \u043f\u0430\u043f\u043e\u043a \u0437\u0430\u043f\u0438\u0441\u0435\u0439. # Are declared @@ -35,7 +35,7 @@ hasDispositionAction.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u043 # Are kind isKind.title=\u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 -isKind.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430 \u0434\u0435\u043b. +isKind.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u0421\u0431\u043e\u0440\u043d\u0438\u043a \u0444\u0430\u0439\u043b\u043e\u0432/ \u0410\u0440\u0445\u0438\u0432 \u0444\u0430\u0439\u043b\u043e\u0432. isKind.kind.display-label=\u0422\u0438\u043f # Are Record Type @@ -49,13 +49,13 @@ isRecordType.description=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\ # Declare As Record create-record.title=\u041e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u0437\u0430\u043f\u0438\u0441\u044c create-record.description=\u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u043f\u0438\u0441\u0438. -create-record.file-plan.display-label=\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430 \u0434\u0435\u043b +create-record.file-plan.display-label=\u0421\u0431\u043e\u0440\u043d\u0438\u043a \u0444\u0430\u0439\u043b\u043e\u0432/ \u0410\u0440\u0445\u0438\u0432 \u0444\u0430\u0439\u043b\u043e\u0432 create-record.hide-record.display-label=\u0421\u043a\u0440\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c # Complete record declareRecord.title=\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c declareRecord.description=\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438. # Reopens record -undeclareRecord.title=\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c +undeclareRecord.title=\u041f\u0435\u0440\u0435\u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c undeclareRecord.description=\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438. # Open record folder openRecordFolder.title=\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u043f\u0430\u043f\u043a\u0443 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 @@ -75,7 +75,7 @@ freeze.reason.display-label=\u041f\u0440\u0438\u0447\u0438\u043d\u0430 unfreeze.title=\u041e\u0442\u043a\u0440\u0435\u043f\u0438\u0442\u044c unfreeze.description=\u041e\u0442\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438. # File to -fileTo.title=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0444\u0430\u0439\u043b +fileTo.title=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0441\u0431\u043e\u0440\u043d\u0438\u043a / \u0421\u0434\u0430\u0442\u044c \u0432 \u0430\u0440\u0445\u0438\u0432 fileTo.description=\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443 \u0437\u0430\u043f\u0438\u0441\u0435\u0439. fileTo.path.display-label=\u041f\u0443\u0442\u044c \u043a \u043f\u0430\u043f\u043a\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 fileTo.createRecordPath.display-label=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0443\u0442\u0438 \u043a \u0437\u0430\u043f\u0438\u0441\u0438 @@ -99,7 +99,7 @@ reject.title=\u041e\u0442\u043a\u043b\u043e\u043d\u0438\u0442\u044c reject.description=\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 reject.reason.display-label=\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f # Request Information -requestInfo.title=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0435 +requestInfo.title=\u0417\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e requestInfo.description=\u0417\u0430\u043f\u0443\u0441\u043a \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0437\u0430\u043f\u0438\u0441\u0438 # Execute script executeScript.title=\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 @@ -149,8 +149,8 @@ createDispositionSchedule.description=\u0421\u043e\u0437\u0434\u0430\u0442\u044c fileDestructionReport.title=\u041e\u0442\u0447\u0435\u0442 \u043e\u0431 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430 fileDestructionReport.description=\u041e\u0442\u0447\u0435\u0442 \u043e\u0431 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430 # Cut off -cutoff.title=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c -cutoff.description=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c +cutoff.title=\u041e\u0442\u0441\u0435\u0447\u044c / \u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c +cutoff.description=\u041e\u0442\u0441\u0435\u0447\u044c / \u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c # Destroy destroy.title=\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c destroy.description=\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/audit-service_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/audit-service_ru.properties index ad289b54dc..d064fdd5c5 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/audit-service_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/audit-service_ru.properties @@ -7,7 +7,7 @@ rm.audit.create-person=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u043e\u rm.audit.linkTo=\u0421\u0432\u044f\u0437\u0430\u0442\u044c \u0441 rm.audit.moveTo=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 rm.audit.copyTo=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 -rm.audit.fileTo=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0444\u0430\u0439\u043b +rm.audit.fileTo=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0441\u0431\u043e\u0440\u043d\u0438\u043a / \u0421\u0434\u0430\u0442\u044c \u0432 \u0430\u0440\u0445\u0438\u0432 rm.audit.audit-start=\u0417\u0430\u043f\u0443\u0441\u043a \u0430\u0443\u0434\u0438\u0442\u0430 rm.audit.audit-stop=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0430\u0443\u0434\u0438\u0442\u0430 rm.audit.audit-clear=\u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u0430\u0443\u0434\u0438\u0442\u0430 diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/capability-service_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/capability-service_ru.properties index 6c43435c88..1e975ce8fd 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/capability-service_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/capability-service_ru.properties @@ -40,7 +40,7 @@ capability.CreateModifyDestroyEvents.title=\u0421\u043e\u0437\u0434\u0430\u0442\ capability.AddModifyEventDates.title=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0430\u0442\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439 # Cutoff -capability.group.cutoff.title=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c +capability.group.cutoff.title=\u041e\u0442\u0441\u0435\u0447\u044c / \u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c capability.ApproveRecordsScheduledForCutoff.title=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438, \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0434 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 capability.CreateModifyRecordsInCutoffFolders.title=\u0421\u043e\u0437\u0434\u0430\u0442\u044c, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u043f\u043a\u0430\u0445 @@ -63,8 +63,8 @@ capability.ExtendRetentionPeriodOrFreeze.title=\u0423\u0432\u0435\u043b\u0438\u0 capability.Unfreeze.title=\u041e\u0442\u043a\u0440\u0435\u043f\u0438\u0442\u044c capability.ViewUpdateReasonsForFreeze.title=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043f\u0440\u0438\u0447\u0438\u043d \u0434\u043b\u044f \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f capability.CreateHold.title=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 -capability.AddToHold.title=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044e -capability.RemoveFromHold.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f +capability.AddToHold.title=\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c +capability.RemoveFromHold.title=\u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c capability.FileHoldReport.title=\u041e\u0442\u0447\u0435\u0442 \u043e\u0431 \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430 capability.DeleteHold.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 capability.EditHold.title=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/records-model_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/records-model_ru.properties index ab45b5d830..8f1220bedb 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/records-model_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/records-model_ru.properties @@ -15,8 +15,8 @@ rma_recordsmanagement.type.rma_recordsManagementContainer.decription=\u041a\u043 rma_recordsmanagement.type.rma_recordsManagementRootContainer.title=\u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 rma_recordsmanagement.type.rma_recordsManagementRootContainer.decription=\u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 -rma_recordsmanagement.type.rma_dispositionSchedule.title=\u041f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0440\u043e\u043a\u0430\u043c\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f -rma_recordsmanagement.type.rma_dispositionSchedule.decription=\u041f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0440\u043e\u043a\u0430\u043c\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f +rma_recordsmanagement.type.rma_dispositionSchedule.title=\u0413\u0440\u0430\u0444\u0438\u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f +rma_recordsmanagement.type.rma_dispositionSchedule.decription=\u0413\u0440\u0430\u0444\u0438\u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f rma_recordsmanagement.property.rma_dispositionAuthority.title=\u0426\u0435\u043d\u0442\u0440 \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e rma_recordsmanagement.property.rma_dispositionAuthority.decription=\u0426\u0435\u043d\u0442\u0440 \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e @@ -122,15 +122,15 @@ rma_recordsmanagement.property.rma_transferLocation.decription=\u041f\u0435\u044 rma_recordsmanagement.association.rma_transferred.title=\u041f\u0435\u0440\u0435\u0434\u0430\u043d\u043e rma_recordsmanagement.association.rma_transferred.decription=\u041f\u0435\u0440\u0435\u0434\u0430\u043d\u043e -rma_recordsmanagement.aspect.rma_filePlanComponent.title=\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430 \u0434\u0435\u043b -rma_recordsmanagement.aspect.rma_filePlanComponent.decription=\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430 \u0434\u0435\u043b +rma_recordsmanagement.aspect.rma_filePlanComponent.title=\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0421\u0431\u043e\u0440\u043d\u0438\u043a \u0444\u0430\u0439\u043b\u043e\u0432/ \u0410\u0440\u0445\u0438\u0432 \u0444\u0430\u0439\u043b\u043e\u0432 +rma_recordsmanagement.aspect.rma_filePlanComponent.decription=\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0421\u0431\u043e\u0440\u043d\u0438\u043a \u0444\u0430\u0439\u043b\u043e\u0432/ \u0410\u0440\u0445\u0438\u0432 \u0444\u0430\u0439\u043b\u043e\u0432 rma_recordsmanagement.property.rma_rootNodeRef.title=\u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 rma_recordsmanagement.property.rma_rootNodeRef.decription=\u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 rma_recordsmanagement.aspect.rma_recordsManagementRoot.title=\u041a\u043e\u0440\u0435\u043d\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 rma_recordsmanagement.aspect.rma_recordsManagementRoot.decription=\u041a\u043e\u0440\u0435\u043d\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 -rma_recordsmanagement.association.rma_holds.title=\u0423\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f -rma_recordsmanagement.association.rma_holds.decription=\u0423\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f +rma_recordsmanagement.association.rma_holds.title=\u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 +rma_recordsmanagement.association.rma_holds.decription=\u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 rma_recordsmanagement.association.rma_transfers.title=\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 rma_recordsmanagement.association.rma_transfers.decription=\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 @@ -179,8 +179,8 @@ rma_recordsmanagement.property.rma_notificationIssued.decription=\u041f\u043e\u0 rma_recordsmanagement.aspect.rma_scheduled.title=\u0417\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043e rma_recordsmanagement.aspect.rma_scheduled.decription=\u0417\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043e -rma_recordsmanagement.association.rma_dispositionSchedule.title=\u041f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0440\u043e\u043a\u0430\u043c\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f -rma_recordsmanagement.association.rma_dispositionSchedule.decription=\u041f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0440\u043e\u043a\u0430\u043c\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f +rma_recordsmanagement.association.rma_dispositionSchedule.title=\u0413\u0440\u0430\u0444\u0438\u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f +rma_recordsmanagement.association.rma_dispositionSchedule.decription=\u0413\u0440\u0430\u0444\u0438\u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f rma_recordsmanagement.aspect.rma_dispositionLifecycle.title=\u0416\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f rma_recordsmanagement.aspect.rma_dispositionLifecycle.decription=\u0416\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f @@ -189,8 +189,8 @@ rma_recordsmanagement.association.rma_nextDispositionAction.decription=\u0421\u0 rma_recordsmanagement.association.rma_dispositionActionHistory.title=\u0416\u0443\u0440\u043d\u0430\u043b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e rma_recordsmanagement.association.rma_dispositionActionHistory.decription=\u0416\u0443\u0440\u043d\u0430\u043b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e -rma_recordsmanagement.aspect.rma_cutOff.title=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c -rma_recordsmanagement.aspect.rma_cutOff.decription=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c +rma_recordsmanagement.aspect.rma_cutOff.title=\u041e\u0442\u0441\u0435\u0447\u044c / \u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c +rma_recordsmanagement.aspect.rma_cutOff.decription=\u041e\u0442\u0441\u0435\u0447\u044c / \u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c rma_recordsmanagement.property.rma_cutOffDate.title=\u0414\u0430\u0442\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f rma_recordsmanagement.property.rma_cutOffDate.decription=\u0414\u0430\u0442\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/rm-actions_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/rm-actions_ru.properties index 8adecc2b00..3b9fd8c0ec 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/rm-actions_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/rm-actions_ru.properties @@ -1,6 +1,6 @@ # Disposition Actions -cutoff.title=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c -cutoff.description=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c +cutoff.title=\u041e\u0442\u0441\u0435\u0447\u044c / \u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c +cutoff.description=\u041e\u0442\u0441\u0435\u0447\u044c / \u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c retain.title=\u0425\u0440\u0430\u043d\u0438\u0442\u044c retain.description=\u0425\u0440\u0430\u043d\u0438\u0442\u044c destroy.title=\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c diff --git a/rm-server/config/alfresco/workflow/rm-workflow-messages_ru.properties b/rm-server/config/alfresco/workflow/rm-workflow-messages_ru.properties index a248b4498e..7e05b590d4 100644 --- a/rm-server/config/alfresco/workflow/rm-workflow-messages_ru.properties +++ b/rm-server/config/alfresco/workflow/rm-workflow-messages_ru.properties @@ -1,4 +1,4 @@ -activitiReviewPooled.workflow.info.requested=\u0417\u0430\u043f\u0440\u043e\u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d +activitiReviewPooled.workflow.info.requested=\u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0437\u0430\u043f\u0438\u0441\u0438 activitiReviewPooled.workflow.info.provided=\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e \u0437\u0430\u043f\u0438\u0441\u0438 activitiReviewPooled.workflow.email.subject=\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e \u0437\u0430\u043f\u0438\u0441\u0438 activitiReviewPooled.workflow.email.body1=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c From d3c6b5d84e8e2591949b10121dfaa3acdac5d728 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Fri, 1 Aug 2014 13:56:43 +0000 Subject: [PATCH 19/54] Reverted to revision 76845 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.2@78815 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../messages/dod5015-model_ru.properties | 4 ++-- .../messages/actions_ru.properties | 16 +++++++-------- .../messages/audit-service_ru.properties | 2 +- .../messages/capability-service_ru.properties | 6 +++--- .../messages/records-model_ru.properties | 20 +++++++++---------- .../messages/rm-actions_ru.properties | 4 ++-- .../rm-workflow-messages_ru.properties | 2 +- 7 files changed, 27 insertions(+), 27 deletions(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/dod5015/messages/dod5015-model_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/dod5015/messages/dod5015-model_ru.properties index 04eafeb9de..25eae51ed4 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/dod5015/messages/dod5015-model_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/dod5015/messages/dod5015-model_ru.properties @@ -3,8 +3,8 @@ dod_dod5015.description=\u041c\u043e\u0434\u0435\u043b\u044c \u043a\u043e\u043d\ dod_dod5015.type.dod_site.title=\u0421\u0430\u0439\u0442 DOD5015 dod_dod5015.type.dod_site.description=\u0421\u0430\u0439\u0442 DOD5015 -dod_dod5015.type.dod_filePlan.title=\u0421\u0431\u043e\u0440\u043d\u0438\u043a \u0444\u0430\u0439\u043b\u043e\u0432/ \u0410\u0440\u0445\u0438\u0432 \u0444\u0430\u0439\u043b\u043e\u0432 DOD5015 -dod_dod5015.type.dod_filePlan.description=\u0421\u0431\u043e\u0440\u043d\u0438\u043a \u0444\u0430\u0439\u043b\u043e\u0432/ \u0410\u0440\u0445\u0438\u0432 \u0444\u0430\u0439\u043b\u043e\u0432 DOD5015 +dod_dod5015.type.dod_filePlan.title=\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430 \u0434\u0435\u043b DOD5015 +dod_dod5015.type.dod_filePlan.description=\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430 \u0434\u0435\u043b DOD5015 dod_dod5015.type.dod_recordSeries.title=\u0421\u0435\u0440\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439 (\u0443\u0441\u0442\u0430\u0440\u0435\u043b\u043e) dod_dod5015.type.dod_recordSeries.description=\u0421\u0435\u0440\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439 (\u0443\u0441\u0442\u0430\u0440\u0435\u043b\u043e) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/actions_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/actions_ru.properties index b40981ca69..650251afc3 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/actions_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/actions_ru.properties @@ -6,7 +6,7 @@ isClassified.title=\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\ isClassified.description=\u0417\u0430\u043f\u0438\u0441\u0438 \u0438\u043b\u0438 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u043e \u043f\u0435\u0440\u0435\u0447\u043d\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0440\u043e\u043a\u0430\u043c\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f. # Are cutoff -isCutoff.title=\u041e\u0442\u0441\u0435\u0447\u044c / \u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c +isCutoff.title=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c isCutoff.description=\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0438\u043b\u0438 \u043f\u0430\u043f\u043e\u043a \u0437\u0430\u043f\u0438\u0441\u0435\u0439. # Are declared @@ -35,7 +35,7 @@ hasDispositionAction.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u043 # Are kind isKind.title=\u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 -isKind.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u0421\u0431\u043e\u0440\u043d\u0438\u043a \u0444\u0430\u0439\u043b\u043e\u0432/ \u0410\u0440\u0445\u0438\u0432 \u0444\u0430\u0439\u043b\u043e\u0432. +isKind.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430 \u0434\u0435\u043b. isKind.kind.display-label=\u0422\u0438\u043f # Are Record Type @@ -49,13 +49,13 @@ isRecordType.description=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\ # Declare As Record create-record.title=\u041e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u0437\u0430\u043f\u0438\u0441\u044c create-record.description=\u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u043f\u0438\u0441\u0438. -create-record.file-plan.display-label=\u0421\u0431\u043e\u0440\u043d\u0438\u043a \u0444\u0430\u0439\u043b\u043e\u0432/ \u0410\u0440\u0445\u0438\u0432 \u0444\u0430\u0439\u043b\u043e\u0432 +create-record.file-plan.display-label=\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430 \u0434\u0435\u043b create-record.hide-record.display-label=\u0421\u043a\u0440\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c # Complete record declareRecord.title=\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c declareRecord.description=\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438. # Reopens record -undeclareRecord.title=\u041f\u0435\u0440\u0435\u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c +undeclareRecord.title=\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c undeclareRecord.description=\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438. # Open record folder openRecordFolder.title=\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u043f\u0430\u043f\u043a\u0443 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 @@ -75,7 +75,7 @@ freeze.reason.display-label=\u041f\u0440\u0438\u0447\u0438\u043d\u0430 unfreeze.title=\u041e\u0442\u043a\u0440\u0435\u043f\u0438\u0442\u044c unfreeze.description=\u041e\u0442\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438. # File to -fileTo.title=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0441\u0431\u043e\u0440\u043d\u0438\u043a / \u0421\u0434\u0430\u0442\u044c \u0432 \u0430\u0440\u0445\u0438\u0432 +fileTo.title=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0444\u0430\u0439\u043b fileTo.description=\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443 \u0437\u0430\u043f\u0438\u0441\u0435\u0439. fileTo.path.display-label=\u041f\u0443\u0442\u044c \u043a \u043f\u0430\u043f\u043a\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 fileTo.createRecordPath.display-label=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0443\u0442\u0438 \u043a \u0437\u0430\u043f\u0438\u0441\u0438 @@ -99,7 +99,7 @@ reject.title=\u041e\u0442\u043a\u043b\u043e\u043d\u0438\u0442\u044c reject.description=\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 reject.reason.display-label=\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f # Request Information -requestInfo.title=\u0417\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e +requestInfo.title=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0435 requestInfo.description=\u0417\u0430\u043f\u0443\u0441\u043a \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0437\u0430\u043f\u0438\u0441\u0438 # Execute script executeScript.title=\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 @@ -149,8 +149,8 @@ createDispositionSchedule.description=\u0421\u043e\u0437\u0434\u0430\u0442\u044c fileDestructionReport.title=\u041e\u0442\u0447\u0435\u0442 \u043e\u0431 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430 fileDestructionReport.description=\u041e\u0442\u0447\u0435\u0442 \u043e\u0431 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430 # Cut off -cutoff.title=\u041e\u0442\u0441\u0435\u0447\u044c / \u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c -cutoff.description=\u041e\u0442\u0441\u0435\u0447\u044c / \u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c +cutoff.title=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c +cutoff.description=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c # Destroy destroy.title=\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c destroy.description=\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/audit-service_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/audit-service_ru.properties index d064fdd5c5..ad289b54dc 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/audit-service_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/audit-service_ru.properties @@ -7,7 +7,7 @@ rm.audit.create-person=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u043e\u rm.audit.linkTo=\u0421\u0432\u044f\u0437\u0430\u0442\u044c \u0441 rm.audit.moveTo=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 rm.audit.copyTo=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 -rm.audit.fileTo=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0441\u0431\u043e\u0440\u043d\u0438\u043a / \u0421\u0434\u0430\u0442\u044c \u0432 \u0430\u0440\u0445\u0438\u0432 +rm.audit.fileTo=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0444\u0430\u0439\u043b rm.audit.audit-start=\u0417\u0430\u043f\u0443\u0441\u043a \u0430\u0443\u0434\u0438\u0442\u0430 rm.audit.audit-stop=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0430\u0443\u0434\u0438\u0442\u0430 rm.audit.audit-clear=\u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u0430\u0443\u0434\u0438\u0442\u0430 diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/capability-service_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/capability-service_ru.properties index 1e975ce8fd..6c43435c88 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/capability-service_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/capability-service_ru.properties @@ -40,7 +40,7 @@ capability.CreateModifyDestroyEvents.title=\u0421\u043e\u0437\u0434\u0430\u0442\ capability.AddModifyEventDates.title=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0430\u0442\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439 # Cutoff -capability.group.cutoff.title=\u041e\u0442\u0441\u0435\u0447\u044c / \u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c +capability.group.cutoff.title=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c capability.ApproveRecordsScheduledForCutoff.title=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438, \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0434 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 capability.CreateModifyRecordsInCutoffFolders.title=\u0421\u043e\u0437\u0434\u0430\u0442\u044c, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u043f\u043a\u0430\u0445 @@ -63,8 +63,8 @@ capability.ExtendRetentionPeriodOrFreeze.title=\u0423\u0432\u0435\u043b\u0438\u0 capability.Unfreeze.title=\u041e\u0442\u043a\u0440\u0435\u043f\u0438\u0442\u044c capability.ViewUpdateReasonsForFreeze.title=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043f\u0440\u0438\u0447\u0438\u043d \u0434\u043b\u044f \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f capability.CreateHold.title=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 -capability.AddToHold.title=\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c -capability.RemoveFromHold.title=\u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c +capability.AddToHold.title=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044e +capability.RemoveFromHold.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f capability.FileHoldReport.title=\u041e\u0442\u0447\u0435\u0442 \u043e\u0431 \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430 capability.DeleteHold.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 capability.EditHold.title=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/records-model_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/records-model_ru.properties index 8f1220bedb..ab45b5d830 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/records-model_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/records-model_ru.properties @@ -15,8 +15,8 @@ rma_recordsmanagement.type.rma_recordsManagementContainer.decription=\u041a\u043 rma_recordsmanagement.type.rma_recordsManagementRootContainer.title=\u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 rma_recordsmanagement.type.rma_recordsManagementRootContainer.decription=\u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 -rma_recordsmanagement.type.rma_dispositionSchedule.title=\u0413\u0440\u0430\u0444\u0438\u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f -rma_recordsmanagement.type.rma_dispositionSchedule.decription=\u0413\u0440\u0430\u0444\u0438\u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f +rma_recordsmanagement.type.rma_dispositionSchedule.title=\u041f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0440\u043e\u043a\u0430\u043c\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f +rma_recordsmanagement.type.rma_dispositionSchedule.decription=\u041f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0440\u043e\u043a\u0430\u043c\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f rma_recordsmanagement.property.rma_dispositionAuthority.title=\u0426\u0435\u043d\u0442\u0440 \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e rma_recordsmanagement.property.rma_dispositionAuthority.decription=\u0426\u0435\u043d\u0442\u0440 \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e @@ -122,15 +122,15 @@ rma_recordsmanagement.property.rma_transferLocation.decription=\u041f\u0435\u044 rma_recordsmanagement.association.rma_transferred.title=\u041f\u0435\u0440\u0435\u0434\u0430\u043d\u043e rma_recordsmanagement.association.rma_transferred.decription=\u041f\u0435\u0440\u0435\u0434\u0430\u043d\u043e -rma_recordsmanagement.aspect.rma_filePlanComponent.title=\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0421\u0431\u043e\u0440\u043d\u0438\u043a \u0444\u0430\u0439\u043b\u043e\u0432/ \u0410\u0440\u0445\u0438\u0432 \u0444\u0430\u0439\u043b\u043e\u0432 -rma_recordsmanagement.aspect.rma_filePlanComponent.decription=\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0421\u0431\u043e\u0440\u043d\u0438\u043a \u0444\u0430\u0439\u043b\u043e\u0432/ \u0410\u0440\u0445\u0438\u0432 \u0444\u0430\u0439\u043b\u043e\u0432 +rma_recordsmanagement.aspect.rma_filePlanComponent.title=\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430 \u0434\u0435\u043b +rma_recordsmanagement.aspect.rma_filePlanComponent.decription=\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430 \u0434\u0435\u043b rma_recordsmanagement.property.rma_rootNodeRef.title=\u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 rma_recordsmanagement.property.rma_rootNodeRef.decription=\u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 rma_recordsmanagement.aspect.rma_recordsManagementRoot.title=\u041a\u043e\u0440\u0435\u043d\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 rma_recordsmanagement.aspect.rma_recordsManagementRoot.decription=\u041a\u043e\u0440\u0435\u043d\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 -rma_recordsmanagement.association.rma_holds.title=\u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 -rma_recordsmanagement.association.rma_holds.decription=\u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 +rma_recordsmanagement.association.rma_holds.title=\u0423\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f +rma_recordsmanagement.association.rma_holds.decription=\u0423\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f rma_recordsmanagement.association.rma_transfers.title=\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 rma_recordsmanagement.association.rma_transfers.decription=\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 @@ -179,8 +179,8 @@ rma_recordsmanagement.property.rma_notificationIssued.decription=\u041f\u043e\u0 rma_recordsmanagement.aspect.rma_scheduled.title=\u0417\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043e rma_recordsmanagement.aspect.rma_scheduled.decription=\u0417\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043e -rma_recordsmanagement.association.rma_dispositionSchedule.title=\u0413\u0440\u0430\u0444\u0438\u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f -rma_recordsmanagement.association.rma_dispositionSchedule.decription=\u0413\u0440\u0430\u0444\u0438\u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f +rma_recordsmanagement.association.rma_dispositionSchedule.title=\u041f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0440\u043e\u043a\u0430\u043c\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f +rma_recordsmanagement.association.rma_dispositionSchedule.decription=\u041f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0440\u043e\u043a\u0430\u043c\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f rma_recordsmanagement.aspect.rma_dispositionLifecycle.title=\u0416\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f rma_recordsmanagement.aspect.rma_dispositionLifecycle.decription=\u0416\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f @@ -189,8 +189,8 @@ rma_recordsmanagement.association.rma_nextDispositionAction.decription=\u0421\u0 rma_recordsmanagement.association.rma_dispositionActionHistory.title=\u0416\u0443\u0440\u043d\u0430\u043b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e rma_recordsmanagement.association.rma_dispositionActionHistory.decription=\u0416\u0443\u0440\u043d\u0430\u043b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e -rma_recordsmanagement.aspect.rma_cutOff.title=\u041e\u0442\u0441\u0435\u0447\u044c / \u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c -rma_recordsmanagement.aspect.rma_cutOff.decription=\u041e\u0442\u0441\u0435\u0447\u044c / \u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c +rma_recordsmanagement.aspect.rma_cutOff.title=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c +rma_recordsmanagement.aspect.rma_cutOff.decription=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c rma_recordsmanagement.property.rma_cutOffDate.title=\u0414\u0430\u0442\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f rma_recordsmanagement.property.rma_cutOffDate.decription=\u0414\u0430\u0442\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/rm-actions_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/rm-actions_ru.properties index 3b9fd8c0ec..8adecc2b00 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/rm-actions_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/rm-actions_ru.properties @@ -1,6 +1,6 @@ # Disposition Actions -cutoff.title=\u041e\u0442\u0441\u0435\u0447\u044c / \u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c -cutoff.description=\u041e\u0442\u0441\u0435\u0447\u044c / \u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c +cutoff.title=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c +cutoff.description=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c retain.title=\u0425\u0440\u0430\u043d\u0438\u0442\u044c retain.description=\u0425\u0440\u0430\u043d\u0438\u0442\u044c destroy.title=\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c diff --git a/rm-server/config/alfresco/workflow/rm-workflow-messages_ru.properties b/rm-server/config/alfresco/workflow/rm-workflow-messages_ru.properties index 7e05b590d4..a248b4498e 100644 --- a/rm-server/config/alfresco/workflow/rm-workflow-messages_ru.properties +++ b/rm-server/config/alfresco/workflow/rm-workflow-messages_ru.properties @@ -1,4 +1,4 @@ -activitiReviewPooled.workflow.info.requested=\u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0437\u0430\u043f\u0438\u0441\u0438 +activitiReviewPooled.workflow.info.requested=\u0417\u0430\u043f\u0440\u043e\u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d activitiReviewPooled.workflow.info.provided=\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e \u0437\u0430\u043f\u0438\u0441\u0438 activitiReviewPooled.workflow.email.subject=\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e \u0437\u0430\u043f\u0438\u0441\u0438 activitiReviewPooled.workflow.email.body1=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c From 0811cd23cd6d8025323b5831f80918363fe9e31d Mon Sep 17 00:00:00 2001 From: Gloria Broadbent Date: Tue, 12 Aug 2014 11:12:52 +0000 Subject: [PATCH 20/54] RUSSIAN: Russian updated files based on EN-rev79092. This bundle also includes fixes for RM-1611 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.2@79265 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../messages/dod5015-model_ru.properties | 4 +-- .../messages/action-service_ru.properties | 4 +-- .../messages/actions_ru.properties | 30 +++++++++---------- .../messages/audit-service_ru.properties | 2 +- .../messages/capability-service_ru.properties | 14 ++++----- .../messages/records-model_ru.properties | 28 ++++++++--------- .../messages/rm-actions_ru.properties | 4 +-- .../messages/rm-system_ru.properties | 4 +-- .../rm-workflow-messages_ru.properties | 14 ++++----- 9 files changed, 52 insertions(+), 52 deletions(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/dod5015/messages/dod5015-model_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/dod5015/messages/dod5015-model_ru.properties index 25eae51ed4..d922a2c8ff 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/dod5015/messages/dod5015-model_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/dod5015/messages/dod5015-model_ru.properties @@ -3,8 +3,8 @@ dod_dod5015.description=\u041c\u043e\u0434\u0435\u043b\u044c \u043a\u043e\u043d\ dod_dod5015.type.dod_site.title=\u0421\u0430\u0439\u0442 DOD5015 dod_dod5015.type.dod_site.description=\u0421\u0430\u0439\u0442 DOD5015 -dod_dod5015.type.dod_filePlan.title=\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430 \u0434\u0435\u043b DOD5015 -dod_dod5015.type.dod_filePlan.description=\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430 \u0434\u0435\u043b DOD5015 +dod_dod5015.type.dod_filePlan.title=\u0410\u0440\u0445\u0438\u0432 DOD5015 +dod_dod5015.type.dod_filePlan.description=\u0410\u0440\u0445\u0438\u0432 DOD5015 dod_dod5015.type.dod_recordSeries.title=\u0421\u0435\u0440\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439 (\u0443\u0441\u0442\u0430\u0440\u0435\u043b\u043e) dod_dod5015.type.dod_recordSeries.description=\u0421\u0435\u0440\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439 (\u0443\u0441\u0442\u0430\u0440\u0435\u043b\u043e) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/action-service_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/action-service_ru.properties index 5d2355a9ca..64e61bff59 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/action-service_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/action-service_ru.properties @@ -31,9 +31,9 @@ rm.action.email-not-record=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043 rm.action.email-create-child-assoc=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0434\u043e\u0447\u0435\u0440\u043d\u044e\u044e \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0446\u0438\u044e. rm.action.node-already-transfer=\u041e\u0431\u044a\u0435\u043a\u0442 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. rm.action.node-not-transfer=\u041e\u0431\u044a\u0435\u043a\u0442 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c. -rm.action.undo-not-last=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435: \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e \u043d\u0435 \u0431\u044b\u043b\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043e. +rm.action.undo-not-last=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0442\u0440\u0435\u0437\u0430\u043d\u0438\u0435, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e \u0431\u044b\u043b\u043e \u043d\u0435 \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430. rm.action.records_only_undeclared=\u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e\u0434\u043b\u0435\u0436\u0430\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e. rm.action.event-not-undone=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 {0}: \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e \u0432 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f. -rm.action.node-not-record-category=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0440\u043e\u043a\u0430\u043c\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442 ({0}) \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0438. +rm.action.node-not-record-category=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0413\u0440\u0430\u0444\u0438\u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442 ({0}) \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0438. rm.action.parameter-not-supplied=\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u00ab{0}\u00bb \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d. rm.action.delete-not-hold-type=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0435 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u043a \u0442\u0438\u043f\u0443 {0}. (actionedUponNodeRef={1}) \ No newline at end of file diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/actions_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/actions_ru.properties index 650251afc3..21a67735fa 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/actions_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/actions_ru.properties @@ -2,12 +2,12 @@ # i18n for Records Management Action Conditions # # Are classified -isClassified.title=\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043f\u043e \u043f\u0435\u0440\u0435\u0447\u043d\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0440\u043e\u043a\u0430\u043c\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f -isClassified.description=\u0417\u0430\u043f\u0438\u0441\u0438 \u0438\u043b\u0438 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u043e \u043f\u0435\u0440\u0435\u0447\u043d\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0440\u043e\u043a\u0430\u043c\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f. +isClassified.title=\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043f\u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0443 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f +isClassified.description=\u0417\u0430\u043f\u0438\u0441\u0438 \u0438\u043b\u0438 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0443 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f. # Are cutoff -isCutoff.title=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c -isCutoff.description=\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0438\u043b\u0438 \u043f\u0430\u043f\u043e\u043a \u0437\u0430\u043f\u0438\u0441\u0435\u0439. +isCutoff.title=\u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c +isCutoff.description=\u0417\u0430\u043f\u0438\u0441\u0438 \u0438\u043b\u0438 \u043f\u0430\u043f\u043a\u0438 \u0441 \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 \u043e\u0431\u0440\u0435\u0437\u0430\u043d\u044b. # Are declared isDeclared.title=\u0417\u0430\u043f\u0438\u0441\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 @@ -35,7 +35,7 @@ hasDispositionAction.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u043 # Are kind isKind.title=\u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 -isKind.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430 \u0434\u0435\u043b. +isKind.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u0410\u0440\u0445\u0438\u0432. isKind.kind.display-label=\u0422\u0438\u043f # Are Record Type @@ -49,13 +49,13 @@ isRecordType.description=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\ # Declare As Record create-record.title=\u041e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u0437\u0430\u043f\u0438\u0441\u044c create-record.description=\u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u043f\u0438\u0441\u0438. -create-record.file-plan.display-label=\u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430 \u0434\u0435\u043b +create-record.file-plan.display-label=\u0410\u0440\u0445\u0438\u0432 create-record.hide-record.display-label=\u0421\u043a\u0440\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c # Complete record declareRecord.title=\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c declareRecord.description=\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438. # Reopens record -undeclareRecord.title=\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c +undeclareRecord.title=\u041f\u0435\u0440\u0435\u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c undeclareRecord.description=\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438. # Open record folder openRecordFolder.title=\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u043f\u0430\u043f\u043a\u0443 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 @@ -75,7 +75,7 @@ freeze.reason.display-label=\u041f\u0440\u0438\u0447\u0438\u043d\u0430 unfreeze.title=\u041e\u0442\u043a\u0440\u0435\u043f\u0438\u0442\u044c unfreeze.description=\u041e\u0442\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438. # File to -fileTo.title=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0444\u0430\u0439\u043b +fileTo.title=\u0421\u0434\u0430\u0442\u044c \u0432 \u0430\u0440\u0445\u0438\u0432 fileTo.description=\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443 \u0437\u0430\u043f\u0438\u0441\u0435\u0439. fileTo.path.display-label=\u041f\u0443\u0442\u044c \u043a \u043f\u0430\u043f\u043a\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 fileTo.createRecordPath.display-label=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0443\u0442\u0438 \u043a \u0437\u0430\u043f\u0438\u0441\u0438 @@ -99,7 +99,7 @@ reject.title=\u041e\u0442\u043a\u043b\u043e\u043d\u0438\u0442\u044c reject.description=\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 reject.reason.display-label=\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f # Request Information -requestInfo.title=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0435 +requestInfo.title=\u0417\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e requestInfo.description=\u0417\u0430\u043f\u0443\u0441\u043a \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0437\u0430\u043f\u0438\u0441\u0438 # Execute script executeScript.title=\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 @@ -143,14 +143,14 @@ accessionComplete.description=\u0414\u043e\u0441\u0442\u0443\u043f \u0437\u0430\ splitEmail.title=\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 splitEmail.description=\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 # Create Disposition Schedule -createDispositionSchedule.title=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0440\u043e\u043a\u0430\u043c\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f -createDispositionSchedule.description=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0440\u043e\u043a\u0430\u043c\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f +createDispositionSchedule.title=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0413\u0440\u0430\u0444\u0438\u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f +createDispositionSchedule.description=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0413\u0440\u0430\u0444\u0438\u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f # File Destruction Report fileDestructionReport.title=\u041e\u0442\u0447\u0435\u0442 \u043e\u0431 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430 fileDestructionReport.description=\u041e\u0442\u0447\u0435\u0442 \u043e\u0431 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430 # Cut off -cutoff.title=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c -cutoff.description=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c +cutoff.title=\u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c +cutoff.description=\u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c # Destroy destroy.title=\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c destroy.description=\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c @@ -164,8 +164,8 @@ hide-record.description=\u0421\u043a\u0440\u044b\u0442\u044c \u0437\u0430\u043f\ transfer.title=\u041f\u0435\u0440\u0435\u0434\u0430\u0442\u044c transfer.description=\u041f\u0435\u0440\u0435\u0434\u0430\u0442\u044c # Uncut off -unCutoff.title=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 -unCutoff.description=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 +unCutoff.title=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0442\u0440\u0435\u0437\u0430\u043d\u0438\u0435 +unCutoff.description=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0442\u0440\u0435\u0437\u0430\u043d\u0438\u0435 # Accession accession.title=\u0414\u043e\u0441\u0442\u0443\u043f accession.description=\u0414\u043e\u0441\u0442\u0443\u043f diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/audit-service_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/audit-service_ru.properties index ad289b54dc..0d4bc7f649 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/audit-service_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/audit-service_ru.properties @@ -7,7 +7,7 @@ rm.audit.create-person=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u043e\u rm.audit.linkTo=\u0421\u0432\u044f\u0437\u0430\u0442\u044c \u0441 rm.audit.moveTo=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 rm.audit.copyTo=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 -rm.audit.fileTo=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0444\u0430\u0439\u043b +rm.audit.fileTo=\u0421\u0434\u0430\u0442\u044c \u0432 \u0430\u0440\u0445\u0438\u0432 rm.audit.audit-start=\u0417\u0430\u043f\u0443\u0441\u043a \u0430\u0443\u0434\u0438\u0442\u0430 rm.audit.audit-stop=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0430\u0443\u0434\u0438\u0442\u0430 rm.audit.audit-clear=\u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u0430\u0443\u0434\u0438\u0442\u0430 diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/capability-service_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/capability-service_ru.properties index 6c43435c88..ff329557d5 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/capability-service_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/capability-service_ru.properties @@ -2,7 +2,7 @@ capability.group.records.title=\u0417\u0430\u043f\u0438\u0441\u0438 capability.DeclareRecords.title=\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 capability.ViewRecords.title=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 -capability.UndeclareRecords.title=\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 +capability.UndeclareRecords.title=\u041f\u0435\u0440\u0435\u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0435\u0439 capability.CreateRecords.title=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 capability.RequestRecordInformation.title=\u0417\u0430\u043f\u0440\u043e\u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0437\u0430\u043f\u0438\u0441\u0438 capability.RejectRecords.title=\u041e\u0442\u043a\u043b\u043e\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 @@ -40,9 +40,9 @@ capability.CreateModifyDestroyEvents.title=\u0421\u043e\u0437\u0434\u0430\u0442\ capability.AddModifyEventDates.title=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0430\u0442\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439 # Cutoff -capability.group.cutoff.title=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c +capability.group.cutoff.title=\u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c capability.ApproveRecordsScheduledForCutoff.title=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438, \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0434 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 -capability.CreateModifyRecordsInCutoffFolders.title=\u0421\u043e\u0437\u0434\u0430\u0442\u044c, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u043f\u043a\u0430\u0445 +capability.CreateModifyRecordsInCutoffFolders.title=\u0421\u043e\u0437\u0434\u0430\u0442\u044c, \u0438\u0437\u043c\u0435\u043d\u0438 \u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043e\u0442\u043a\u043 b\u044e\u0447\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u043f\u043a\u0430\u0445 # Disposition and Transfers capability.group.dispositionAndTransfers.title=\u0420\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 @@ -63,8 +63,8 @@ capability.ExtendRetentionPeriodOrFreeze.title=\u0423\u0432\u0435\u043b\u0438\u0 capability.Unfreeze.title=\u041e\u0442\u043a\u0440\u0435\u043f\u0438\u0442\u044c capability.ViewUpdateReasonsForFreeze.title=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043f\u0440\u0438\u0447\u0438\u043d \u0434\u043b\u044f \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f capability.CreateHold.title=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 -capability.AddToHold.title=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044e -capability.RemoveFromHold.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u0437 \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f +capability.AddToHold.title=\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c +capability.RemoveFromHold.title=\u0420\u0430\u0437\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c capability.FileHoldReport.title=\u041e\u0442\u0447\u0435\u0442 \u043e\u0431 \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430 capability.DeleteHold.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 capability.EditHold.title=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 @@ -89,8 +89,8 @@ capability.ManageAccessRights.title=\u041f\u0440\u0430\u0432\u0430 \u043d\u0430 # Configuration capability.group.config.title=\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f -capability.CreateModifyDestroyFileplanMetadata.title=\u0421\u043e\u0437\u0434\u0430\u0442\u044c, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c, \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u044b \u0434\u0435\u043b -capability.CreateModifyDestroyFileplanTypes.title=\u0421\u043e\u0437\u0434\u0430\u0442\u044c, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c, \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c \u0442\u0438\u043f\u044b \u043d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u044b \u0434\u0435\u043b +capability.CreateModifyDestroyFileplanMetadata.title=\u0421\u043e\u0437\u0434\u0430\u0442\u044c, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c, \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0410\u0440\u0445\u0438\u0432 +capability.CreateModifyDestroyFileplanTypes.title=\u0421\u043e\u0437\u0434\u0430\u0442\u044c, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c, \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c \u0442\u0438\u043f\u044b \u0410\u0440\u0445\u0438\u0432 capability.CreateModifyDestroyRecordTypes.title=\u0421\u043e\u0437\u0434\u0430\u0442\u044c, \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c, \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c \u0442\u0438\u043f\u044b \u0437\u0430\u043f\u0438\u0441\u0435\u0439 capability.CreateAndAssociateSelectionLists.title=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0438 \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0438 \u0432\u044b\u0431\u043e\u0440\u0430 capability.EditSelectionLists.title=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0438 \u0432\u044b\u0431\u043e\u0440\u0430 diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/records-model_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/records-model_ru.properties index ab45b5d830..e1d09de6d3 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/records-model_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/records-model_ru.properties @@ -15,8 +15,8 @@ rma_recordsmanagement.type.rma_recordsManagementContainer.decription=\u041a\u043 rma_recordsmanagement.type.rma_recordsManagementRootContainer.title=\u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 rma_recordsmanagement.type.rma_recordsManagementRootContainer.decription=\u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 -rma_recordsmanagement.type.rma_dispositionSchedule.title=\u041f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0440\u043e\u043a\u0430\u043c\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f -rma_recordsmanagement.type.rma_dispositionSchedule.decription=\u041f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0440\u043e\u043a\u0430\u043c\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f +rma_recordsmanagement.type.rma_dispositionSchedule.title=\u0413\u0440\u0430\u0444\u0438\u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f +rma_recordsmanagement.type.rma_dispositionSchedule.decription=\u0413\u0440\u0430\u0444\u0438\u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f rma_recordsmanagement.property.rma_dispositionAuthority.title=\u0426\u0435\u043d\u0442\u0440 \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e rma_recordsmanagement.property.rma_dispositionAuthority.decription=\u0426\u0435\u043d\u0442\u0440 \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e @@ -122,15 +122,15 @@ rma_recordsmanagement.property.rma_transferLocation.decription=\u041f\u0435\u044 rma_recordsmanagement.association.rma_transferred.title=\u041f\u0435\u0440\u0435\u0434\u0430\u043d\u043e rma_recordsmanagement.association.rma_transferred.decription=\u041f\u0435\u0440\u0435\u0434\u0430\u043d\u043e -rma_recordsmanagement.aspect.rma_filePlanComponent.title=\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430 \u0434\u0435\u043b -rma_recordsmanagement.aspect.rma_filePlanComponent.decription=\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u041d\u043e\u043c\u0435\u043d\u043a\u043b\u0430\u0442\u0443\u0440\u0430 \u0434\u0435\u043b +rma_recordsmanagement.aspect.rma_filePlanComponent.title=\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0410\u0440\u0445\u0438\u0432 +rma_recordsmanagement.aspect.rma_filePlanComponent.decription=\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0410\u0440\u0445\u0438\u0432 rma_recordsmanagement.property.rma_rootNodeRef.title=\u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 rma_recordsmanagement.property.rma_rootNodeRef.decription=\u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 rma_recordsmanagement.aspect.rma_recordsManagementRoot.title=\u041a\u043e\u0440\u0435\u043d\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 rma_recordsmanagement.aspect.rma_recordsManagementRoot.decription=\u041a\u043e\u0440\u0435\u043d\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 -rma_recordsmanagement.association.rma_holds.title=\u0423\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f -rma_recordsmanagement.association.rma_holds.decription=\u0423\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f +rma_recordsmanagement.association.rma_holds.title=\u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 +rma_recordsmanagement.association.rma_holds.decription=\u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 rma_recordsmanagement.association.rma_transfers.title=\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 rma_recordsmanagement.association.rma_transfers.decription=\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 @@ -179,8 +179,8 @@ rma_recordsmanagement.property.rma_notificationIssued.decription=\u041f\u043e\u0 rma_recordsmanagement.aspect.rma_scheduled.title=\u0417\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043e rma_recordsmanagement.aspect.rma_scheduled.decription=\u0417\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043e -rma_recordsmanagement.association.rma_dispositionSchedule.title=\u041f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0440\u043e\u043a\u0430\u043c\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f -rma_recordsmanagement.association.rma_dispositionSchedule.decription=\u041f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0440\u043e\u043a\u0430\u043c\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f +rma_recordsmanagement.association.rma_dispositionSchedule.title=\u0413\u0440\u0430\u0444\u0438\u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f +rma_recordsmanagement.association.rma_dispositionSchedule.decription=\u0413\u0440\u0430\u0444\u0438\u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f rma_recordsmanagement.aspect.rma_dispositionLifecycle.title=\u0416\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f rma_recordsmanagement.aspect.rma_dispositionLifecycle.decription=\u0416\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f @@ -189,10 +189,10 @@ rma_recordsmanagement.association.rma_nextDispositionAction.decription=\u0421\u0 rma_recordsmanagement.association.rma_dispositionActionHistory.title=\u0416\u0443\u0440\u043d\u0430\u043b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e rma_recordsmanagement.association.rma_dispositionActionHistory.decription=\u0416\u0443\u0440\u043d\u0430\u043b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e -rma_recordsmanagement.aspect.rma_cutOff.title=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c -rma_recordsmanagement.aspect.rma_cutOff.decription=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c -rma_recordsmanagement.property.rma_cutOffDate.title=\u0414\u0430\u0442\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f -rma_recordsmanagement.property.rma_cutOffDate.decription=\u0414\u0430\u0442\u0430 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f +rma_recordsmanagement.aspect.rma_cutOff.title=\u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c +rma_recordsmanagement.aspect.rma_cutOff.decription=\u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c +rma_recordsmanagement.property.rma_cutOffDate.title=\u0414\u0430\u0442\u0430 \u043e\u0442\u0440\u0435\u0437\u0430\u043d\u0438\u044f +rma_recordsmanagement.property.rma_cutOffDate.decription=\u0414\u0430\u0442\u0430 \u043e\u0442\u0440\u0435\u0437\u0430\u043d\u0438\u044f rma_recordsmanagement.aspect.rma_transferred.title=\u041f\u0435\u0440\u0435\u0434\u0430\u043d\u043e rma_recordsmanagement.aspect.rma_transferred.decription=\u041f\u0435\u0440\u0435\u0434\u0430\u043d\u043e @@ -219,8 +219,8 @@ rma_recordsmanagement.association.rma_emailConfigAssoc.description=\u041d\u0430\ rma_recordsmanagement.aspect.rma_recordSearch.title=\u041f\u043e\u0438\u0441\u043a \u0437\u0430\u043f\u0438\u0441\u0438 rma_recordsmanagement.aspect.rma_recordSearch.decription=\u0421\u0432\u0435\u0440\u043d\u0443\u0442\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043f\u043e\u0438\u0441\u043a\u0435 \u0434\u043b\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 -rma_recordsmanagement.property.rma_recordSearchHasDispositionSchedule.title=\u0421 \u043f\u0435\u0440\u0435\u0447\u043d\u0435\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0440\u043e\u043a\u0430\u043c\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f -rma_recordsmanagement.property.rma_recordSearchHasDispositionSchedule.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442, \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043b\u0438 \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0440\u043e\u043a\u0430\u043c\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f +rma_recordsmanagement.property.rma_recordSearchHasDispositionSchedule.title=\u0421 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u043c \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f +rma_recordsmanagement.property.rma_recordSearchHasDispositionSchedule.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442, \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043b\u0438 \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0433\u0440\u0430\u0444\u0438\u043a \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f rma_recordsmanagement.property.rma_recordSearchDispositionActionName.title=\u0418\u043c\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e rma_recordsmanagement.property.rma_recordSearchDispositionActionName.description=\u0418\u043c\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e rma_recordsmanagement.property.rma_recordSearchDispositionActionAsOf.title=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e \u0434\u043b\u044f diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/rm-actions_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/rm-actions_ru.properties index 8adecc2b00..6765e57a3a 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/rm-actions_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/rm-actions_ru.properties @@ -1,6 +1,6 @@ # Disposition Actions -cutoff.title=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c -cutoff.description=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c +cutoff.title=\u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c +cutoff.description=\u041e\u0442\u0440\u0435\u0437\u0430\u0442\u044c retain.title=\u0425\u0440\u0430\u043d\u0438\u0442\u044c retain.description=\u0425\u0440\u0430\u043d\u0438\u0442\u044c destroy.title=\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/rm-system_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/rm-system_ru.properties index a2c78bb7f4..da79b6576d 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/rm-system_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/rm-system_ru.properties @@ -15,8 +15,8 @@ rm.savedsearch.vitalRecordsName=\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 rm.savedsearch.vitalRecordsDesc=\u0412\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438, \u043f\u043e\u0434\u043b\u0435\u0436\u0430\u0449\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. rm.savedsearch.incompleteRecordsName=\u041d\u0435\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 rm.savedsearch.incompleteRecordsDesc=\u0412\u0441\u0435 \u043d\u0435\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438. -rm.savedsearch.cutoffRecordsName=\u0417\u0430\u043f\u0438\u0441\u0438 \u0438 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f -rm.savedsearch.cutoffRecordsDesc=\u0412\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. +rm.savedsearch.cutoffRecordsName=\u0417\u0430\u043f\u0438\u0441\u0438 \u0438 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0442\u0440\u0435\u0437\u0430\u043d\u0438\u044f +rm.savedsearch.cutoffRecordsDesc=\u0412\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0442\u0440\u0435\u0437\u0430\u043d\u0438\u044f \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. rm.savedsearch.transferRecordsName=\u0417\u0430\u043f\u0438\u0441\u0438 \u0438 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 rm.savedsearch.transferRecordsDesc=\u0412\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. rm.savedsearch.destructionRecordsName=\u0417\u0430\u043f\u0438\u0441\u0438 \u0438 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u044f diff --git a/rm-server/config/alfresco/workflow/rm-workflow-messages_ru.properties b/rm-server/config/alfresco/workflow/rm-workflow-messages_ru.properties index a248b4498e..11334f3c79 100644 --- a/rm-server/config/alfresco/workflow/rm-workflow-messages_ru.properties +++ b/rm-server/config/alfresco/workflow/rm-workflow-messages_ru.properties @@ -1,4 +1,4 @@ -activitiReviewPooled.workflow.info.requested=\u0417\u0430\u043f\u0440\u043e\u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d +activitiReviewPooled.workflow.info.requested=\u0417\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0437\u0430\u043f\u0438\u0441\u0438 activitiReviewPooled.workflow.info.provided=\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e \u0437\u0430\u043f\u0438\u0441\u0438 activitiReviewPooled.workflow.email.subject=\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e \u0437\u0430\u043f\u0438\u0441\u0438 activitiReviewPooled.workflow.email.body1=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c @@ -11,13 +11,13 @@ rmwf_workflowmodel.property.rmwf_requestedInformation.decription=\u0417\u0430\u0 rmwf_workflowmodel.property.rmwf_message.title=\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 rmwf_workflowmodel.property.rmwf_message.decription=\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 -rmwf_workflowmodel.type.rmwf_submitRequestInfoTask.title=\u0417\u0430\u0434\u0430\u0447\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0435 -rmwf_workflowmodel.type.rmwf_submitRequestInfoTask.description=\u0417\u0430\u0434\u0430\u0447\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0435 +rmwf_workflowmodel.type.rmwf_submitRequestInfoTask.title=\u0417\u0430\u0434\u0430\u0447\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 +rmwf_workflowmodel.type.rmwf_submitRequestInfoTask.description=\u0417\u0430\u0434\u0430\u0447\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 rmwf_workflowmodel.association.rmwf_mixedAssignees.title=\u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438 rmwf_workflowmodel.association.rmwf_mixedAssignees.description=\u0418\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0438 -rmwf_workflowmodel.type.rmwf_requestInfoTask.title=\u0417\u0430\u0434\u0430\u0447\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0435 -rmwf_workflowmodel.type.rmwf_requestInfoTask.description=\u0417\u0430\u0434\u0430\u0447\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0435 +rmwf_workflowmodel.type.rmwf_requestInfoTask.title=\u0417\u0430\u0434\u0430\u0447\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 +rmwf_workflowmodel.type.rmwf_requestInfoTask.description=\u0417\u0430\u0434\u0430\u0447\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 -rmwf_workflowmodel.type.rmwf_reviewRequestInfoTask.title=\u0417\u0430\u0434\u0430\u0447\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0435 -rmwf_workflowmodel.type.rmwf_reviewRequestInfoTask.description=\u0417\u0430\u0434\u0430\u0447\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \ No newline at end of file +rmwf_workflowmodel.type.rmwf_reviewRequestInfoTask.title=\u0417\u0430\u0434\u0430\u0447\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 +rmwf_workflowmodel.type.rmwf_reviewRequestInfoTask.description=\u0417\u0430\u0434\u0430\u0447\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \ No newline at end of file From bcc59d7df051321ff9b07563f675ccbf4910ea32 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Mon, 18 Aug 2014 10:19:35 +0000 Subject: [PATCH 21/54] RM-1652 (Classified Records capabilities are never used) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.2@80299 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- ...15-capabilities-classification-context.xml | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/dod5015/dod5015-capabilities-classification-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/dod5015/dod5015-capabilities-classification-context.xml index f4dfcfb640..04f71c3fa5 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/dod5015/dod5015-capabilities-classification-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/dod5015/dod5015-capabilities-classification-context.xml @@ -14,12 +14,12 @@ - + - + @@ -28,25 +28,25 @@ parent="declarativeCapability"> - + - + - + - + - + @@ -55,11 +55,11 @@ parent="declarativeCapability"> - + - + @@ -69,7 +69,7 @@ - + From 5d3092084cce0a5ca8327358458bde91a72e40eb Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Mon, 18 Aug 2014 12:35:11 +0000 Subject: [PATCH 22/54] RM-1652 (Classified Records capabilities are never used) * Fixed failing unit test git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.2@80313 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../service/CapabilityServiceImplTest.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/CapabilityServiceImplTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/CapabilityServiceImplTest.java index 19f894e944..640093da54 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/CapabilityServiceImplTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/CapabilityServiceImplTest.java @@ -109,7 +109,7 @@ public class CapabilityServiceImplTest extends BaseRMTestCase public Void run() throws Exception { int initialSize = capabilityService.getGroups().size(); - + GroupImpl testGroup = new GroupImpl(); testGroup.setId("testGroup"); testGroup.setIndex(140); @@ -155,30 +155,30 @@ public class CapabilityServiceImplTest extends BaseRMTestCase List groups = capabilityService.getGroups(); assertNotNull(groups); - Group auditGroup = groups.get(0); - assertNotNull(auditGroup); + Group recordsGroup = groups.get(0); + assertNotNull(recordsGroup); - List auditCapabilities = capabilityService.getCapabilitiesByGroup(auditGroup); - assertNotNull(auditCapabilities); + List recordCapabilities = capabilityService.getCapabilitiesByGroup(recordsGroup); + assertNotNull(recordCapabilities); - int vitalRecordCapabilitiesSize = auditCapabilities.size(); - assertTrue(vitalRecordCapabilitiesSize > 1); + int recordCapabilitiesSize = recordCapabilities.size(); + assertTrue(recordCapabilitiesSize > 1); - for (int i = 1; i == vitalRecordCapabilitiesSize; i++) + for (int i = 1; i == recordCapabilitiesSize; i++) { - Capability capability = auditCapabilities.get(i); + Capability capability = recordCapabilities.get(i); assertNotNull(capability); assertEquals(i * 10, capability.getIndex()); } - Group vitalRecordsGroup = groups.get(groups.size() - 1); - assertNotNull(vitalRecordsGroup); + Group rulesGroup = groups.get(groups.size() - 2); + assertNotNull(rulesGroup); - List vitalRecordCapabilities = capabilityService.getCapabilitiesByGroupId(vitalRecordsGroup.getId()); - assertNotNull(vitalRecordCapabilities); + List ruleCapabilities = capabilityService.getCapabilitiesByGroupId(rulesGroup.getId()); + assertNotNull(ruleCapabilities); - vitalRecordCapabilitiesSize = vitalRecordCapabilities.size(); - assertTrue(vitalRecordCapabilitiesSize > 0); + int ruleCapabilitiesSize = ruleCapabilities.size(); + assertTrue(ruleCapabilitiesSize > 0); return null; } From 88c71be4898bcde3feaa418ea695ee008f078824 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Mon, 18 Aug 2014 15:43:34 +0000 Subject: [PATCH 23/54] RM-1636 (Disposition steps can be executed for folder with frozen record) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.2@80336 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../rm-service-context.xml | 1 + .../disposition/DispositionServiceImpl.java | 40 ++++++++++++++++++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml index c884558fad..05bf166996 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml @@ -93,6 +93,7 @@ + diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java index 470c66ffdd..3883e7a097 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java @@ -33,6 +33,7 @@ import org.alfresco.module.org_alfresco_module_rm.disposition.property.Dispositi import org.alfresco.module.org_alfresco_module_rm.event.RecordsManagementEvent; import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanComponentKind; 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; @@ -87,6 +88,9 @@ public class DispositionServiceImpl extends ServiceBaseImpl /** Record Service */ private RecordService recordService; + /** Freeze Service */ + private FreezeService freezeService; + /** Disposition properties */ private Map dispositionProperties = new HashMap(4); @@ -156,6 +160,14 @@ public class DispositionServiceImpl extends ServiceBaseImpl this.recordService = recordService; } + /** + * @param freezeService freeze service + */ + public void setFreezeService(FreezeService freezeService) + { + this.freezeService = freezeService; + } + /** * Set the dispositionSelectionStrategy bean. * @@ -965,7 +977,7 @@ public class DispositionServiceImpl extends ServiceBaseImpl if (FilePlanComponentKind.RECORD_FOLDER.equals(filePlanService.getFilePlanComponentKind(nodeRef)) || FilePlanComponentKind.RECORD.equals(filePlanService.getFilePlanComponentKind(nodeRef))) { - if (!isDisposableItemCutoff(nodeRef)) + if (!isDisposableItemCutoff(nodeRef) && !isFrozenOrHasFrozenChildren(nodeRef)) { if (recordFolderService.isRecordFolder(nodeRef)) { @@ -999,6 +1011,32 @@ public class DispositionServiceImpl extends ServiceBaseImpl } } + /** + * Helper method to determine if a node is frozen or has frozen children + * + * @param nodeRef Node to be checked + * @return true if the node is frozen or has frozen children, false otherwise + */ + private boolean isFrozenOrHasFrozenChildren(NodeRef nodeRef) + { + boolean result = false; + + if (recordFolderService.isRecordFolder(nodeRef)) + { + result = freezeService.isFrozen(nodeRef) || freezeService.hasFrozenChildren(nodeRef); + } + else if (recordService.isRecord(nodeRef)) + { + result = freezeService.isFrozen(nodeRef); + } + else + { + throw new AlfrescoRuntimeException("The nodeRef '" + nodeRef + "' is neither a record nor a record folder."); + } + + return result; + } + /** * Helper method to apply the cut off * From 863496cf2e67b7ed828aa413126f514dee30d5d4 Mon Sep 17 00:00:00 2001 From: Gloria Broadbent Date: Tue, 26 Aug 2014 15:53:20 +0000 Subject: [PATCH 24/54] RM-1680: RUSSIAN bundle with fixes to ticket RM-1680 based on EN bundle 81508 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.2@81516 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../messages/capability-service_ru.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/capability-service_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/capability-service_ru.properties index ff329557d5..02d6d06d20 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/capability-service_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/capability-service_ru.properties @@ -52,7 +52,7 @@ capability.AuthorizeNominatedTransfers.title=\u0410\u0432\u0442\u043e\u0440\u043 capability.AuthorizeAllTransfers.title=\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 capability.DestroyRecordsScheduledForDestruction.title=\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u0438\u043b\u0438 \u043f\u0430\u043f\u043a\u0443 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043f\u043e\u0434 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435 capability.DestroyRecords.title=\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 -capability.DeleteRecords.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 +capability.DeleteRecords.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0417\u0430\u043f\u0438\u0441\u044c capability.TriggerAnEvent.title=\u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f capability.FileDestructionReport.title=\u041e\u0442\u0447\u0435\u0442 \u043e\u0431 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430 capability.FileTransferReport.title=\u041e\u0442\u0447\u0435\u0442 \u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0444\u0430\u0439\u043b\u0430 From 39d058394636bdf4a2f24f5e2930276d753344bc Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Thu, 4 Sep 2014 13:23:03 +0000 Subject: [PATCH 25/54] RM-1611 (RU: a few improvements of translation) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.2@83347 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../messages/actions_ru.properties | 8 ++++---- .../messages/records-model_ru.properties | 15 +++++++-------- .../messages/report-model_ru.properties | 4 ++-- .../messages/rm-system_ru.properties | 6 +++--- .../messages/template_ru.properties | 10 +++++----- 5 files changed, 21 insertions(+), 22 deletions(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/actions_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/actions_ru.properties index 21a67735fa..50b884d103 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/actions_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/actions_ru.properties @@ -14,8 +14,8 @@ isDeclared.title=\u0417\u0430\u043f\u0438\u0441\u044c \u0437\u0430\u0432\u0435\u isDeclared.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442, \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 \u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c. # Is on hold -isFrozen.title=\u0423\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f -isFrozen.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442, \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0438\u043b\u0438 \u043f\u0430\u043f\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0435\u0439. +isFrozen.title=\u0417\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u0430 +isFrozen.description=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442, \u0437\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u0430 \u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0438\u043b\u0438 \u043f\u0430\u043f\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0435\u0439. # Are filed isRecordFiled.title=\u0417\u0430\u043f\u0438\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430 \u0432 \u0444\u0430\u0439\u043b @@ -179,8 +179,8 @@ addRecordTypes.description=\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043 fileReport.title=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0442\u0447\u0435\u0442 \u0432 \u0444\u0430\u0439\u043b fileReport.description=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0442\u0447\u0435\u0442 \u0432 \u0444\u0430\u0439\u043b # Delete Hold -deleteHold.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 -deleteHold.description=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 +deleteHold.title=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u043A\u0443 +deleteHold.description=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u043A\u0443 # Action parameter constraints rm-ac-is-kind-kinds.record_category=\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439 diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/records-model_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/records-model_ru.properties index e1d09de6d3..02bf8b0709 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/records-model_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/records-model_ru.properties @@ -104,12 +104,11 @@ rma_recordsmanagement.property.rma_eventExecutionCompletedBy.decription=\u041f\u rma_recordsmanagement.property.rma_eventExecutionCompletedAt.title=\u0414\u0430\u0442\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f rma_recordsmanagement.property.rma_eventExecutionCompletedAt.decription=\u0414\u0430\u0442\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f -rma_recordsmanagement.type.rma_hold.title=\u0423\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 -rma_recordsmanagement.type.rma_hold.decription=\u0423\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 -rma_recordsmanagement.property.rma_holdReason.title=\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f -rma_recordsmanagement.property.rma_holdReason.decription=\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f -rma_recordsmanagement.association.rma_frozenRecords.title=\u0423\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 -rma_recordsmanagement.association.rma_frozenRecords.decription=\u0423\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 +rma_recordsmanagement.type.rma_hold.title=\u0411\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u043A\u0430 +rma_recordsmanagement.type.rma_hold.decription=\u0411\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u043A\u0430 +rma_recordsmanagement.property.rma_holdReason.decription=\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u043A\u0438 +rma_recordsmanagement.association.rma_frozenRecords.title=\u0417\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 +rma_recordsmanagement.association.rma_frozenRecords.decription=\u0417\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 rma_recordsmanagement.type.rma_transfer.title=\u041f\u0435\u0440\u0435\u0434\u0430\u0442\u044c rma_recordsmanagement.type.rma_transfer.decription=\u041f\u0435\u0440\u0435\u0434\u0430\u0442\u044c @@ -129,8 +128,8 @@ rma_recordsmanagement.property.rma_rootNodeRef.decription=\u041a\u043e\u0440\u04 rma_recordsmanagement.aspect.rma_recordsManagementRoot.title=\u041a\u043e\u0440\u0435\u043d\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 rma_recordsmanagement.aspect.rma_recordsManagementRoot.decription=\u041a\u043e\u0440\u0435\u043d\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 -rma_recordsmanagement.association.rma_holds.title=\u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 -rma_recordsmanagement.association.rma_holds.decription=\u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 +rma_recordsmanagement.association.rma_holds.title=\u0417\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0437\u0430\u043F\u0438\u0441\u0438 +rma_recordsmanagement.association.rma_holds.decription=\u0417\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0437\u0430\u043F\u0438\u0441\u0438 rma_recordsmanagement.association.rma_transfers.title=\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 rma_recordsmanagement.association.rma_transfers.decription=\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-model_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-model_ru.properties index 7e079b1cd7..1ca6ac6b69 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-model_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/report-model_ru.properties @@ -9,5 +9,5 @@ rmr_recordsmanagementreport.type.rmr_destructionReport.description=\u041e\u0442\ rmr_recordsmanagementreport.type.rmr_destructionReport.title=\u041e\u0442\u0447\u0435\u0442 \u043e\u0431 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 rmr_recordsmanagementreport.type.rmr_destructionReport.description=\u041e\u0442\u0447\u0435\u0442 \u043e\u0431 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438. -rmr_recordsmanagementreport.type.rmr_holdReport.title=\u041e\u0442\u0447\u0435\u0442 \u043e\u0431 \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0438 -rmr_recordsmanagementreport.type.rmr_holdReport.description=\u041e\u0442\u0447\u0435\u0442 \u043e\u0431 \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438. \ No newline at end of file +rmr_recordsmanagementreport.type.rmr_holdReport.title=\u041E\u0442\u0447\u0435\u0442 \u043E \u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u043A\u0430\u0445 +rmr_recordsmanagementreport.type.rmr_holdReport.description=\u041E\u0442\u0447\u0435\u0442 \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0437\u0430\u043F\u0438\u0441\u044F\u043C\u0438 \u043E \u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u043A\u0430\u0445. \ No newline at end of file diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/rm-system_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/rm-system_ru.properties index da79b6576d..6edbc98e3f 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/rm-system_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/rm-system_ru.properties @@ -1,4 +1,4 @@ -rm.hold.name=\u0423\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 +rm.hold.name=\u0411\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u043A\u0430 ## Defaut roles rm.role.extendedReaders=\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 @@ -21,5 +21,5 @@ rm.savedsearch.transferRecordsName=\u0417\u0430\u043f\u0438\u0441\u0438 \u0438 \ rm.savedsearch.transferRecordsDesc=\u0412\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. rm.savedsearch.destructionRecordsName=\u0417\u0430\u043f\u0438\u0441\u0438 \u0438 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u044f rm.savedsearch.destructionRecordsDesc=\u0412\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. -rm.savedsearch.frozenRecordsName= \u0423\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 -rm.savedsearch.frozenRecordsDesc=\u0412\u0441\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u043f\u0430\u043f\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. \ No newline at end of file +rm.savedsearch.frozenRecordsName=\u0417\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0437\u0430\u043F\u0438\u0441\u0438 \u0438 \u043F\u0430\u043F\u043A\u0438 \u0437\u0430\u043F\u0438\u0441\u0435\u0439 +rm.savedsearch.frozenRecordsDesc=\u0412\u0441\u0435 \u0437\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0437\u0430\u043F\u0438\u0441\u0438 \u0438 \u043F\u0430\u043F\u043A\u0438 \u0437\u0430\u043F\u0438\u0441\u0435\u0439. \ No newline at end of file diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/template_ru.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/template_ru.properties index f68660bd36..6affcc35a6 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/template_ru.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/messages/template_ru.properties @@ -18,10 +18,10 @@ file.report.record=\u0417\u0430\u043f\u0438\u0441\u044c file.report.record.folder=\u041f\u0430\u043f\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 file.report.unique.folder.identifier=\u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0430\u043f\u043a\u0438 file.report.unique.record.identifier=\u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0437\u0430\u043f\u0438\u0441\u0438 -file.report.hold.report=\u041e\u0442\u0447\u0435\u0442 \u043e\u0431 \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0438 -file.report.hold.name=\u0418\u043c\u044f \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f -file.report.hold.description=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f -file.report.hold.reason=\u041f\u0440\u0438\u0447\u0438\u043d\u0430 \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f -file.report.hold.held=\u0423\u0434\u0435\u0440\u0436\u0430\u043d\u043e +file.report.hold.report=\u041e\u0442\u0447\u0435\u0442 \u043e \u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u043A\u0435 +file.report.hold.name=\u0418\u043c\u044f \u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u043A\u0438 +file.report.hold.description=\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u043A\u0438 +file.report.hold.reason=\u041F\u0440\u0438\u0447\u0438\u043D\u0430 \u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u043A\u0438 +file.report.hold.held=\u0417\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u043E file.report.createdby=\u0421\u043e\u0437\u0434\u0430\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c file.report.createdon=\u0414\u0430\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \ No newline at end of file From d12b1d92d92d474e2f50d07a18c7d8b6dae6a181 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Thu, 11 Sep 2014 13:16:45 +0000 Subject: [PATCH 26/54] Updated the Alfresco dependency from 4.2.2 to 4.2.3.1 for RM 2.2 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.2@83912 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9b2b7c9fb3..2b6465d826 100644 --- a/pom.xml +++ b/pom.xml @@ -66,7 +66,7 @@ - 4.2.2 + 4.2.3.1 org.postgresql.Driver From 4d61f4772ea8117535fe516ed3d96394eae88bea Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Tue, 16 Sep 2014 23:33:19 +0000 Subject: [PATCH 27/54] Update version to 2.1.0.3 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@84337 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- gradle.properties | 2 +- .../alfresco/module/org_alfresco_module_rm/module.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index bb286aadbb..80b921ea30 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ # build details groupid=alfresco packageName=rm -version=2.1.0.2 +version=2.1.0.3 build=dev # maven urls's diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties b/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties index 00c3401827..775fe113f8 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/module.properties @@ -6,6 +6,6 @@ module.aliases=org_alfresco_module_dod5015 module.title=Records Management module.description=Alfresco Record Management Extension -module.version=2.1.0.2 +module.version=2.1.0.3 module.repo.version.min=4.2 \ No newline at end of file From 375f1ca5578dd078505ea36477f12e3058c43378 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Thu, 18 Sep 2014 06:27:51 +0000 Subject: [PATCH 28/54] Transaction level cahcing of declarative capability evaluation git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@84421 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../declarative/DeclarativeCapability.java | 55 ++++++++++++------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/DeclarativeCapability.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/DeclarativeCapability.java index cfb35470e2..bb9cfc393c 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/DeclarativeCapability.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/DeclarativeCapability.java @@ -29,6 +29,8 @@ import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.module.org_alfresco_module_rm.capability.AbstractCapability; import org.alfresco.module.org_alfresco_module_rm.capability.Capability; import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanComponentKind; +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.security.AccessStatus; import org.apache.commons.logging.Log; @@ -297,29 +299,42 @@ public class DeclarativeCapability extends AbstractCapability { int result = AccessDecisionVoter.ACCESS_ABSTAIN; - // Check we are dealing with a file plan component - if (filePlanService.isFilePlanComponent(nodeRef) == true) + // check transaction cache + Map map = TransactionalResourceHelper.getMap("rm.declarativeCapability"); + String key = getName() + "|" + nodeRef.toString() + "|" + AuthenticationUtil.getRunAsUser(); + if (map.containsKey(key)) { - // Check the kind of the object, the permissions and the conditions - if (checkKinds(nodeRef) == true && checkPermissions(nodeRef) == true && checkConditions(nodeRef) == true) - { - // Opportunity for child implementations to extend - result = evaluateImpl(nodeRef); - } - else - { - result = AccessDecisionVoter.ACCESS_DENIED; - } + result = map.get(key); } - - // Last chance for child implementations to veto/change the result - result = onEvaluate(nodeRef, result); - - // log access denied to help with debug - if (logger.isDebugEnabled() == true && AccessDecisionVoter.ACCESS_DENIED == result) + else { - logger.debug("Capability " + getName() + " returned an Access Denied result during evaluation of node " + nodeRef.toString()); - } + // Check we are dealing with a file plan component + if (filePlanService.isFilePlanComponent(nodeRef) == true) + { + // Check the kind of the object, the permissions and the conditions + if (checkKinds(nodeRef) == true && checkPermissions(nodeRef) == true && checkConditions(nodeRef) == true) + { + // Opportunity for child implementations to extend + result = evaluateImpl(nodeRef); + } + else + { + result = AccessDecisionVoter.ACCESS_DENIED; + } + } + + // Last chance for child implementations to veto/change the result + result = onEvaluate(nodeRef, result); + + // log access denied to help with debug + if (logger.isDebugEnabled() == true && AccessDecisionVoter.ACCESS_DENIED == result) + { + logger.debug("Capability " + getName() + " returned an Access Denied result during evaluation of node " + nodeRef.toString()); + } + + result = evaluateImpl(nodeRef); + map.put(key, result); + } return result; } From 82696a3d660d0391dd0e9b39030285b6fb6e906a Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Thu, 18 Sep 2014 23:47:53 +0000 Subject: [PATCH 29/54] Fix build git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@84676 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../capability/declarative/DeclarativeCapability.java | 1 - 1 file changed, 1 deletion(-) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/DeclarativeCapability.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/DeclarativeCapability.java index bb9cfc393c..c7f51fd952 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/DeclarativeCapability.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/declarative/DeclarativeCapability.java @@ -332,7 +332,6 @@ public class DeclarativeCapability extends AbstractCapability logger.debug("Capability " + getName() + " returned an Access Denied result during evaluation of node " + nodeRef.toString()); } - result = evaluateImpl(nodeRef); map.put(key, result); } From 2de55cb0e911f0121d0f863f2a65612f4dacfd51 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Thu, 18 Sep 2014 23:51:19 +0000 Subject: [PATCH 30/54] Prevent unnessary repeated creation of QName git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@84677 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../declarative/condition/IsPropertySetCondition.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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 7ced7736d3..39aa640187 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 @@ -34,6 +34,7 @@ public class IsPropertySetCondition extends AbstractCapabilityCondition { /** property name (eg: rma:location) */ private String propertyName; + private QName propertyQName; /** namespace service */ private NamespaceService namespaceService; @@ -59,7 +60,11 @@ public class IsPropertySetCondition extends AbstractCapabilityCondition */ protected QName getPropertyQName() { - return QName.createQName(propertyName, namespaceService); + if (propertyQName == null) + { + propertyQName = QName.createQName(propertyName, namespaceService); + } + return propertyQName; } /** From 8f6d6328f2f35f05306dc048fdc6de22fcfef097 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Thu, 18 Sep 2014 23:57:43 +0000 Subject: [PATCH 31/54] Improvements to extended dynamic authorities * requiredFor set * direct access to extended permission information, not via service git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@84678 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../rm-public-services-security-context.xml | 2 +- .../ExtendedReaderDynamicAuthority.java | 31 +++++++++++++++-- .../ExtendedSecurityBaseDynamicAuthority.java | 34 ++++++++++++------- .../ExtendedWriterDynamicAuthority.java | 31 +++++++++++++++-- 4 files changed, 80 insertions(+), 18 deletions(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-public-services-security-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-public-services-security-context.xml index b219f60cf6..0fc7572862 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-public-services-security-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-public-services-security-context.xml @@ -45,7 +45,7 @@ - + diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedReaderDynamicAuthority.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedReaderDynamicAuthority.java index f3d4a8b6a6..469b8bd6d4 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedReaderDynamicAuthority.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedReaderDynamicAuthority.java @@ -18,8 +18,12 @@ */ package org.alfresco.module.org_alfresco_module_rm.security; +import java.util.Collections; +import java.util.Map; import java.util.Set; +import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel; +import org.alfresco.repo.security.permissions.PermissionReference; import org.alfresco.service.cmr.repository.NodeRef; /** @@ -40,14 +44,37 @@ public class ExtendedReaderDynamicAuthority extends ExtendedSecurityBaseDynamicA public String getAuthority() { return EXTENDED_READER; + } + + /** + * @see org.alfresco.repo.security.permissions.DynamicAuthority#requiredFor() + */ + @Override + public Set requiredFor() + { + if (requiredFor == null) + { + requiredFor = Collections.singleton(getModelDAO().getPermissionReference(null, RMPermissionModel.READ_RECORDS)); + } + + return requiredFor; } /** * @see org.alfresco.module.org_alfresco_module_rm.security.ExtendedSecurityBaseDynamicAuthority#getAuthorites(org.alfresco.service.cmr.repository.NodeRef) */ - protected Set getAuthorites(NodeRef nodeRef) + @SuppressWarnings("unchecked") + protected Set getAuthorites(NodeRef nodeRef) { - return getExtendedSecurityService().getExtendedReaders(nodeRef); + Set result = null; + + Map readerMap = (Map)getNodeService().getProperty(nodeRef, PROP_READERS); + if (readerMap != null) + { + result = readerMap.keySet(); + } + + return result; } /** 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 c1627476a8..b8a6f89136 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 @@ -24,6 +24,7 @@ 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.security.permissions.impl.ModelDAO; import org.alfresco.repo.transaction.TransactionalResourceHelper; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; @@ -55,6 +56,12 @@ public abstract class ExtendedSecurityBaseDynamicAuthority implements DynamicAut /** Application context */ protected ApplicationContext applicationContext; + /** model DAO */ + protected ModelDAO modelDAO; + + /** permission reference */ + protected Set requiredFor; + // NOTE: we get the services directly from the application context in this way to avoid // cyclic relationships and issues when loading the application context @@ -89,11 +96,23 @@ public abstract class ExtendedSecurityBaseDynamicAuthority implements DynamicAut { if (nodeService == null) { - nodeService = (NodeService)applicationContext.getBean("nodeService"); + nodeService = (NodeService)applicationContext.getBean("dbNodeService"); } return nodeService; } + /** + * @return model DAO + */ + protected ModelDAO getModelDAO() + { + if (modelDAO == null) + { + modelDAO = (ModelDAO)applicationContext.getBean("permissionsModelDAO"); + } + return modelDAO; + } + /** * @return String transaction cache name */ @@ -160,16 +179,5 @@ public abstract class ExtendedSecurityBaseDynamicAuthority implements DynamicAut } return result; - } - - /** - * Base implementation - * - * @see org.alfresco.repo.security.permissions.DynamicAuthority#requiredFor() - */ - @Override - public Set requiredFor() - { - return null; - } + } } diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedWriterDynamicAuthority.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedWriterDynamicAuthority.java index af4eb53ad7..f53c3ffe41 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedWriterDynamicAuthority.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedWriterDynamicAuthority.java @@ -18,8 +18,12 @@ */ package org.alfresco.module.org_alfresco_module_rm.security; +import java.util.Collections; +import java.util.Map; import java.util.Set; +import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel; +import org.alfresco.repo.security.permissions.PermissionReference; import org.alfresco.service.cmr.repository.NodeRef; /** @@ -41,13 +45,36 @@ public class ExtendedWriterDynamicAuthority extends ExtendedSecurityBaseDynamicA { return EXTENDED_WRITER; } + + /** + * @see org.alfresco.repo.security.permissions.DynamicAuthority#requiredFor() + */ + @Override + public Set requiredFor() + { + if (requiredFor == null) + { + requiredFor = Collections.singleton(getModelDAO().getPermissionReference(null, RMPermissionModel.FILE_RECORDS)); + } + + return requiredFor; + } /** * @see org.alfresco.module.org_alfresco_module_rm.security.ExtendedSecurityBaseDynamicAuthority#getAuthorites(org.alfresco.service.cmr.repository.NodeRef) */ - protected Set getAuthorites(NodeRef nodeRef) + @SuppressWarnings("unchecked") + protected Set getAuthorites(NodeRef nodeRef) { - return getExtendedSecurityService().getExtendedWriters(nodeRef); + Set result = null; + + Map map = (Map)getNodeService().getProperty(nodeRef, PROP_WRITERS); + if (map != null) + { + result = map.keySet(); + } + + return result; } /** From 9f41c216a154e44d19a6dcb598a24f6cfeb50624 Mon Sep 17 00:00:00 2001 From: Roy Wetherall Date: Fri, 19 Sep 2014 00:39:45 +0000 Subject: [PATCH 32/54] Correct requiredFor value git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@84679 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../security/ExtendedWriterDynamicAuthority.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedWriterDynamicAuthority.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedWriterDynamicAuthority.java index f53c3ffe41..986eab4750 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedWriterDynamicAuthority.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/ExtendedWriterDynamicAuthority.java @@ -19,6 +19,7 @@ package org.alfresco.module.org_alfresco_module_rm.security; import java.util.Collections; +import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -54,7 +55,11 @@ public class ExtendedWriterDynamicAuthority extends ExtendedSecurityBaseDynamicA { if (requiredFor == null) { - requiredFor = Collections.singleton(getModelDAO().getPermissionReference(null, RMPermissionModel.FILE_RECORDS)); + requiredFor = new HashSet(3); + Collections.addAll(requiredFor, + getModelDAO().getPermissionReference(null, RMPermissionModel.READ_RECORDS), + getModelDAO().getPermissionReference(null, RMPermissionModel.FILING), + getModelDAO().getPermissionReference(null, RMPermissionModel.FILE_RECORDS)); } return requiredFor; From fca7079135384d8db051f6b20c6ce5c53f490902 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Tue, 14 Oct 2014 19:28:09 +0000 Subject: [PATCH 33/54] RM-1661 (Performance on setting permissions at a high category level) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@88087 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../rm-ui-evaluators-context.xml | 3 +- .../fileplan/FilePlanServiceImpl.java | 171 +++++----- .../FilePlanPermissionServiceImpl.java | 293 ++++++++---------- .../FilePlanPermissionServiceImplTest.java | 168 +++++----- 4 files changed, 304 insertions(+), 331 deletions(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-ui-evaluators-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-ui-evaluators-context.xml index e7cf19c2dd..9892172cee 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-ui-evaluators-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-ui-evaluators-context.xml @@ -341,6 +341,7 @@ FILE_PLAN + RECORD RECORD_CATEGORY RECORD_FOLDER UNFILED_RECORD_CONTAINER @@ -758,7 +759,7 @@ - + diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/FilePlanServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/FilePlanServiceImpl.java index 80514a902f..89fed24298 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/FilePlanServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/FilePlanServiceImpl.java @@ -57,12 +57,12 @@ import org.springframework.extensions.surf.util.I18NUtil; /** * File plan service implementation. - * + * * @author Roy Wetherall * @since 2.1 */ public class FilePlanServiceImpl extends ServiceBaseImpl - implements FilePlanService, + implements FilePlanService, RecordsManagementModel { /** I18N */ @@ -74,61 +74,61 @@ public class FilePlanServiceImpl extends ServiceBaseImpl private final static String MSG_CONTAINER_PARENT_TYPE= "rm.service.container-parent-type"; private final static String MSG_CONTAINER_TYPE = "rm.service.container-type"; private final static String MSG_CONTAINER_EXPECTED = "rm.service.container-expected"; - + /** File plan containers */ private static final String NAME_UNFILED_CONTAINER = "Unfiled Records"; private static final String NAME_HOLD_CONTAINER = "Holds"; private static final String NAME_TRANSFER_CONTAINER = "Transfers"; - + /** RM site file plan container */ private static final String FILE_PLAN_CONTAINER = "documentLibrary"; - + /** root container cache */ private SimpleCache, NodeRef> rootContainerCache; - + /** - * NOTE: for some reason spring couldn't cope with the circular references between these two + * NOTE: for some reason spring couldn't cope with the circular references between these two * beans so we need to grab this one manually. - * + * * @return file plan role service */ protected FilePlanRoleService getFilePlanRoleService() { - return (FilePlanRoleService)applicationContext.getBean("FilePlanRoleService"); + return (FilePlanRoleService)applicationContext.getBean("FilePlanRoleService"); } - + /** * @return permission service */ protected PermissionService getPermissionService() { - return (PermissionService)applicationContext.getBean("permissionService"); + return (PermissionService)applicationContext.getBean("permissionService"); } - + /** * @return node DAO */ protected NodeDAO getNodeDAO() { - return (NodeDAO)applicationContext.getBean("nodeDAO"); + return (NodeDAO)applicationContext.getBean("nodeDAO"); } - + /** * @return internal node service */ protected NodeService getInternalNodeService() { - return (NodeService)applicationContext.getBean("nodeService"); + return (NodeService)applicationContext.getBean("nodeService"); } - + /** * @return site service */ protected SiteService getSiteService() { - return (SiteService)applicationContext.getBean("SiteService"); + return (SiteService)applicationContext.getBean("SiteService"); } - + /** * @return record service */ @@ -136,7 +136,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl { return (RecordService)applicationContext.getBean("RecordService"); } - + /** * @return record folder service */ @@ -144,7 +144,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl { return (RecordFolderService)applicationContext.getBean("RecordFolderService"); } - + /** * @return freeze service */ @@ -152,7 +152,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl { return (FreezeService)applicationContext.getBean("FreezeService"); } - + /** * @return records management service */ @@ -160,7 +160,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl { return (RecordsManagementService)applicationContext.getBean("RecordsManagementService"); } - + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getFilePlans() */ @@ -169,15 +169,15 @@ public class FilePlanServiceImpl extends ServiceBaseImpl { return getFilePlans(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE); } - + /** * @param rootContainerCache root container cache */ - public void setRootContainerCache(SimpleCache, NodeRef> rootContainerCache) + public void setRootContainerCache(SimpleCache, NodeRef> rootContainerCache) { this.rootContainerCache = rootContainerCache; } - + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getFilePlans(org.alfresco.service.cmr.repository.StoreRef) */ @@ -185,35 +185,35 @@ public class FilePlanServiceImpl extends ServiceBaseImpl public Set getFilePlans(final StoreRef storeRef) { ParameterCheck.mandatory("storeRef", storeRef); - + final Set results = new HashSet(); Set aspects = new HashSet(1); aspects.add(ASPECT_RECORDS_MANAGEMENT_ROOT); getNodeDAO().getNodesWithAspects(aspects, Long.MIN_VALUE, Long.MAX_VALUE, new NodeDAO.NodeRefQueryCallback() - { + { @Override public boolean handle(Pair nodePair) { NodeRef nodeRef = nodePair.getSecond(); if (storeRef.equals(nodeRef.getStoreRef()) == true) - { + { results.add(nodeRef); } - + return true; } }); return results; } - + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getFilePlanBySiteId(java.lang.String) */ @Override public NodeRef getFilePlanBySiteId(String siteId) { - NodeRef filePlan = null; - + NodeRef filePlan = null; + SiteInfo siteInfo = getSiteService().getSite(siteId); if (siteInfo != null) { @@ -226,10 +226,10 @@ public class FilePlanServiceImpl extends ServiceBaseImpl } } } - + return filePlan; } - + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#existsUnfiledContainer(org.alfresco.service.cmr.repository.NodeRef) */ @@ -237,8 +237,8 @@ public class FilePlanServiceImpl extends ServiceBaseImpl public boolean existsUnfiledContainer(NodeRef filePlan) { return (getUnfiledContainer(filePlan) != null); - } - + } + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getUnfiledContainer(org.alfresco.service.cmr.repository.NodeRef) */ @@ -247,7 +247,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl { return getFilePlanRootContainer(filePlan, NAME_UNFILED_CONTAINER); } - + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getHoldContainer(org.alfresco.service.cmr.repository.NodeRef) */ @@ -256,7 +256,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl { return getFilePlanRootContainer(filePlan, NAME_HOLD_CONTAINER); } - + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getTransferContainer(org.alfresco.service.cmr.repository.NodeRef) */ @@ -265,10 +265,10 @@ public class FilePlanServiceImpl extends ServiceBaseImpl { return getFilePlanRootContainer(filePlan, NAME_TRANSFER_CONTAINER); } - + /** * Get the file root container for the given type. - * + * * @param filePlan file plan * @param containerName container type * @return {@link NodeRef} file plan container @@ -283,7 +283,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl NodeRef result = null; Pair key = new Pair(filePlan, containerName); - + if (!rootContainerCache.contains(key)) { // try and get the unfiled record container @@ -302,18 +302,18 @@ public class FilePlanServiceImpl extends ServiceBaseImpl { result = rootContainerCache.get(key); } - + return result; } - + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#createUnfiledContainer(org.alfresco.service.cmr.repository.NodeRef) */ public NodeRef createUnfiledContainer(NodeRef filePlan) - { + { return createFilePlanRootContainer(filePlan, TYPE_UNFILED_RECORD_CONTAINER, NAME_UNFILED_CONTAINER); } - + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#createHoldContainer(org.alfresco.service.cmr.repository.NodeRef) */ @@ -322,7 +322,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl { return createFilePlanRootContainer(filePlan, TYPE_HOLD_CONTAINER, NAME_HOLD_CONTAINER); } - + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#createTransferContainer(org.alfresco.service.cmr.repository.NodeRef) */ @@ -331,9 +331,9 @@ public class FilePlanServiceImpl extends ServiceBaseImpl { return createFilePlanRootContainer(filePlan, TYPE_TRANSFER_CONTAINER, NAME_TRANSFER_CONTAINER); } - + /** - * + * * @param filePlan * @param containerType * @param containerName @@ -347,9 +347,9 @@ public class FilePlanServiceImpl extends ServiceBaseImpl { throw new AlfrescoRuntimeException("Unable to create file plan root container, because passed node is not a file plan."); } - + String allRoles = getFilePlanRoleService().getAllRolesContainerGroup(filePlan); - + // create the properties map Map properties = new HashMap(1); properties.put(ContentModel.PROP_NAME, containerName); @@ -362,7 +362,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl containerType, properties).getChildRef(); - + // if (inheritPermissions == false) // { // set inheritance to false @@ -370,8 +370,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl getPermissionService().setPermission(container, allRoles, RMPermissionModel.READ_RECORDS, true); getPermissionService().setPermission(container, ExtendedReaderDynamicAuthority.EXTENDED_READER, RMPermissionModel.READ_RECORDS, true); getPermissionService().setPermission(container, ExtendedWriterDynamicAuthority.EXTENDED_WRITER, RMPermissionModel.FILING, true); - getPermissionService().setPermission(container, "Administrator", RMPermissionModel.FILING, true); - + // TODO set the admin users to have filing permissions on the unfiled container!!! // TODO we will need to be able to get a list of the admin roles from the service // } @@ -384,7 +383,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl return container; } - + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#createFilePlan(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, org.alfresco.service.namespace.QName, java.util.Map) */ @@ -393,21 +392,21 @@ public class FilePlanServiceImpl extends ServiceBaseImpl ParameterCheck.mandatory("parent", parent); ParameterCheck.mandatory("name", name); ParameterCheck.mandatory("type", type); - + // Check the parent is not already an RM component node // ie: you can't create a rm root in an existing rm hierarchy if (isFilePlanComponent(parent) == true) { throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_DUP_ROOT)); } - + // Check that the passed type is a sub-type of rma:filePlan if (TYPE_FILE_PLAN.equals(type) == false && dictionaryService.isSubClass(type, TYPE_FILE_PLAN) == false) { throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_ROOT_TYPE, type.toString())); } - + // Build map of properties Map rmRootProps = new HashMap(1); if (properties != null && properties.size() != 0) @@ -415,7 +414,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl rmRootProps.putAll(properties); } rmRootProps.put(ContentModel.PROP_NAME, name); - + // Create the root ChildAssociationRef assocRef = nodeService.createNode( parent, @@ -423,12 +422,12 @@ public class FilePlanServiceImpl extends ServiceBaseImpl QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, name), type, rmRootProps); - + // TODO do we need to create role and security groups or is this done automatically? - + return assocRef.getChildRef(); } - + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#createFilePlan(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, java.util.Map) */ @@ -436,7 +435,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl { return createFilePlan(parent, name, TYPE_FILE_PLAN, properties); } - + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#createFilePlan(org.alfresco.service.cmr.repository.NodeRef, java.lang.String) */ @@ -444,7 +443,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl { return createFilePlan(parent, name, TYPE_FILE_PLAN, null); } - + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#createFilePlan(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, org.alfresco.service.namespace.QName) */ @@ -453,7 +452,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl { return createFilePlan(parent, name, type, null); } - + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getNodeRefPath(org.alfresco.service.cmr.repository.NodeRef) */ @@ -470,7 +469,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl } return nodeRefPath; } - + /** * Helper method to build a NodeRef path from the node to the RM root */ @@ -500,7 +499,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl getNodeRefPathRecursive(nodeRef, nodeRefPath); } } - + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#createRecordCategory(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, org.alfresco.service.namespace.QName, java.util.Map) */ @@ -509,7 +508,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl ParameterCheck.mandatory("parent", parent); ParameterCheck.mandatory("name", name); ParameterCheck.mandatory("type", type); - + // Check that the parent is a container QName parentType = nodeService.getType(parent); if (TYPE_RECORDS_MANAGEMENT_CONTAINER.equals(parentType) == false && @@ -517,14 +516,14 @@ public class FilePlanServiceImpl extends ServiceBaseImpl { throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_CONTAINER_PARENT_TYPE, parentType.toString())); } - + // Check that the the provided type is a sub-type of rm:recordCategory if (TYPE_RECORD_CATEGORY.equals(type) == false && dictionaryService.isSubClass(type, TYPE_RECORD_CATEGORY) == false) { throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_CONTAINER_TYPE, type.toString())); } - + // Set the properties for the record category Map props = new HashMap(1); if (properties != null && properties.size() != 0) @@ -532,7 +531,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl props.putAll(properties); } props.put(ContentModel.PROP_NAME, name); - + return nodeService.createNode( parent, ContentModel.ASSOC_CONTAINS, @@ -540,7 +539,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl type, props).getChildRef(); } - + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#createRecordCategory(org.alfresco.service.cmr.repository.NodeRef, java.lang.String) */ @@ -548,7 +547,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl { return createRecordCategory(parent, name, TYPE_RECORD_CATEGORY); } - + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#createRecordCategory(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, java.util.Map) */ @@ -556,7 +555,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl { return createRecordCategory(parent, name, TYPE_RECORD_CATEGORY, properties); } - + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#createRecordCategory(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, org.alfresco.service.namespace.QName) */ @@ -564,7 +563,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl { return createRecordCategory(parent, name, type, null); } - + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getAllContained(org.alfresco.service.cmr.repository.NodeRef) */ @@ -573,7 +572,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl { return getAllContained(container, false); } - + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getAllContained(org.alfresco.service.cmr.repository.NodeRef, boolean) */ @@ -582,25 +581,25 @@ public class FilePlanServiceImpl extends ServiceBaseImpl { return getContained(container, null, deep); } - + /** * Get contained nodes of a particular type. If null return all. - * + * * @param container container node reference * @param typeFilter type filter, null if none * @return {@link List}<{@link NodeRef> list of contained node references */ private List getContained(NodeRef container, QName typeFilter, boolean deep) - { + { // Parameter check ParameterCheck.mandatory("container", container); - + // Check we have a container in our hands if (isRecordCategory(container) == false) { throw new AlfrescoRuntimeException(I18NUtil.getMessage(MSG_CONTAINER_EXPECTED)); } - + List result = new ArrayList(1); List assocs = this.nodeService.getChildAssocs(container, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL); for (ChildAssociationRef assoc : assocs) @@ -613,7 +612,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl { result.add(child); } - + // Inspect the containers and add children if deep if (deep == true && (TYPE_RECORD_CATEGORY.equals(childType) == true || @@ -622,10 +621,10 @@ public class FilePlanServiceImpl extends ServiceBaseImpl result.addAll(getContained(child, typeFilter, deep)); } } - + return result; } - + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getContainedRecordCategories(org.alfresco.service.cmr.repository.NodeRef) */ @@ -634,7 +633,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl { return getContainedRecordCategories(container, false); } - + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getContainedRecordCategories(org.alfresco.service.cmr.repository.NodeRef, boolean) */ @@ -643,7 +642,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl { return getContained(container, TYPE_RECORD_CATEGORY, deep); } - + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getContainedRecordFolders(org.alfresco.service.cmr.repository.NodeRef) */ @@ -652,7 +651,7 @@ public class FilePlanServiceImpl extends ServiceBaseImpl { return getContainedRecordFolders(container, false); } - + /** * @see org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService#getContainedRecordFolders(org.alfresco.service.cmr.repository.NodeRef, boolean) */ diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java index e821ab5e19..83deaeabcc 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java @@ -18,6 +18,8 @@ */ package org.alfresco.module.org_alfresco_module_rm.security; +import static org.apache.commons.lang.BooleanUtils.isTrue; + import java.util.HashSet; import java.util.List; import java.util.Set; @@ -48,7 +50,7 @@ import org.apache.commons.logging.LogFactory; /** * File plan permission service. - * + * * @author Roy Wetherall * @since 2.1 */ @@ -64,16 +66,16 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl /** Records management service */ protected RecordsManagementService recordsManagementService; - + /** File plan service */ protected FilePlanService filePlanService; - + /** Record service */ protected RecordService recordService; /** Logger */ protected static Log logger = LogFactory.getLog(FilePlanPermissionServiceImpl.class); - + /** * Initialisation method */ @@ -88,23 +90,23 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl TYPE_RECORD_FOLDER, new JavaBehaviour(this, "onCreateRecordFolder", NotificationFrequency.TRANSACTION_COMMIT)); policyComponent.bindClassBehaviour( - NodeServicePolicies.OnAddAspectPolicy.QNAME, - ASPECT_RECORD, + NodeServicePolicies.OnAddAspectPolicy.QNAME, + ASPECT_RECORD, new JavaBehaviour(this, "onAddRecord", NotificationFrequency.TRANSACTION_COMMIT)); policyComponent.bindClassBehaviour( - NodeServicePolicies.OnMoveNodePolicy.QNAME, - ASPECT_RECORD, + NodeServicePolicies.OnMoveNodePolicy.QNAME, + ASPECT_RECORD, new JavaBehaviour(this, "onMoveRecord", NotificationFrequency.TRANSACTION_COMMIT)); policyComponent.bindClassBehaviour( - NodeServicePolicies.OnCreateNodePolicy.QNAME, - TYPE_HOLD, + NodeServicePolicies.OnCreateNodePolicy.QNAME, + TYPE_HOLD, new JavaBehaviour(this, "onCreateHoldTransfer", NotificationFrequency.TRANSACTION_COMMIT)); policyComponent.bindClassBehaviour( - NodeServicePolicies.OnCreateNodePolicy.QNAME, - TYPE_TRANSFER, + NodeServicePolicies.OnCreateNodePolicy.QNAME, + TYPE_TRANSFER, new JavaBehaviour(this, "onCreateHoldTransfer", NotificationFrequency.TRANSACTION_COMMIT)); } - + /** * @param permissionService permission service */ @@ -112,7 +114,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl { this.permissionService = permissionService; } - + /** * @param nodeService node service */ @@ -120,7 +122,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl { this.nodeService = nodeService; } - + /** * @param policyComponent policy component */ @@ -128,7 +130,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl { this.policyComponent = policyComponent; } - + /** * @param recordsManagementService records management service */ @@ -136,7 +138,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl { this.recordsManagementService = recordsManagementService; } - + /** * @param filePlanService file plan service */ @@ -144,7 +146,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl { this.filePlanService = filePlanService; } - + /** * @param recordService record service */ @@ -156,48 +158,46 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl /** * @param childAssocRef */ - public void onCreateRMContainer(ChildAssociationRef childAssocRef) + public void onCreateRMContainer(final ChildAssociationRef childAssocRef) { - final NodeRef recordCategory = childAssocRef.getChildRef(); - setUpPermissions(recordCategory); - // Pull any permissions found on the parent (ie the record category) final NodeRef parentNodeRef = childAssocRef.getParentRef(); - if (parentNodeRef != null && nodeService.exists(parentNodeRef) == true) + if (parentNodeRef != null && nodeService.exists(parentNodeRef)) { AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork() { public Object doWork() { - boolean fillingOnly = false; - if (filePlanService.isFilePlan(parentNodeRef) == true) - { - fillingOnly = true; - } + NodeRef recordCategory = childAssocRef.getChildRef(); + boolean isParentNodeFilePlan = filePlanService.isFilePlan(parentNodeRef); + setUpPermissions(recordCategory, isParentNodeFilePlan); // since this is not a root category, inherit from parent - Set perms = permissionService.getAllSetPermissions(parentNodeRef); - for (AccessPermission perm : perms) + if (isParentNodeFilePlan) { - if (fillingOnly == false || - RMPermissionModel.FILING.equals(perm.getPermission()) == true) + Set perms = permissionService.getAllSetPermissions(parentNodeRef); + for (AccessPermission perm : perms) { - AccessStatus accessStatus = perm.getAccessStatus(); - boolean allow = false; - if (AccessStatus.ALLOWED.equals(accessStatus) == true) + if (RMPermissionModel.FILING.equals(perm.getPermission())) { - allow = true; + AccessStatus accessStatus = perm.getAccessStatus(); + boolean allow = false; + if (AccessStatus.ALLOWED.equals(accessStatus)) + { + allow = true; + } + permissionService.setPermission( + recordCategory, + perm.getAuthority(), + perm.getPermission(), + allow); } - permissionService.setPermission( - recordCategory, - perm.getAuthority(), - perm.getPermission(), - allow); } } return null; } + }, AuthenticationUtil.getSystemUserName()); } } @@ -208,13 +208,14 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl public void onCreateRecordFolder(ChildAssociationRef childAssocRef) { final NodeRef folderNodeRef = childAssocRef.getChildRef(); - + // initialise the permissions setUpPermissions(folderNodeRef); // Pull any permissions found on the parent (ie the record category) final NodeRef catNodeRef = childAssocRef.getParentRef(); - if (nodeService.exists(catNodeRef) == true) + if (!permissionService.getInheritParentPermissions(folderNodeRef) && + nodeService.exists(catNodeRef)) { AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork() { @@ -223,8 +224,8 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl Set perms = permissionService.getAllSetPermissions(catNodeRef); for (AccessPermission perm : perms) { - if (ExtendedReaderDynamicAuthority.EXTENDED_READER.equals(perm.getAuthority()) == false && - ExtendedWriterDynamicAuthority.EXTENDED_WRITER.equals(perm.getAuthority()) == false) + if (!ExtendedReaderDynamicAuthority.EXTENDED_READER.equals(perm.getAuthority()) && + !ExtendedWriterDynamicAuthority.EXTENDED_WRITER.equals(perm.getAuthority())) { AccessStatus accessStatus = perm.getAccessStatus(); boolean allow = false; @@ -245,12 +246,12 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl }, AuthenticationUtil.getSystemUserName()); } } - + /** * Sets ups records permission when aspect is added. - * + * * @see NodeServicePolicies.OnAddAspectPolicy#onAddAspect(NodeRef, QName) - * + * * @param record * @param aspectTypeQName */ @@ -262,18 +263,18 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl { if (nodeService.exists(record) == true && nodeService.hasAspect(record, aspectTypeQName) == true) { - NodeRef recordFolder = nodeService.getPrimaryParent(record).getParentRef(); + NodeRef recordFolder = nodeService.getPrimaryParent(record).getParentRef(); initialiseRecordPermissions(record, recordFolder); } return null; } - }, AuthenticationUtil.getSystemUserName()); + }, AuthenticationUtil.getSystemUserName()); } - + /** * Sets up permissions for transfer and hold objects - * + * * @param childAssocRef */ public void onCreateHoldTransfer(final ChildAssociationRef childAssocRef) @@ -286,7 +287,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl if (nodeService.exists(nodeRef) == true) { setUpPermissions(nodeRef); - + NodeRef parent = childAssocRef.getParentRef(); Set perms = permissionService.getAllSetPermissions(parent); for (AccessPermission perm : perms) @@ -308,49 +309,51 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl } } } - + return null; } }); } - + /** * Initialise the record permissions for the given parent. - * + * * NOTE: method is public so it can be accessed via the associated patch bean. - * - * @param record record + * + * @param record record * @param parent records permission parent */ public void initialiseRecordPermissions(NodeRef record, NodeRef parent) { setUpPermissions(record); - - Set perms = permissionService.getAllSetPermissions(parent); - for (AccessPermission perm : perms) + + if (!permissionService.getInheritParentPermissions(record)) { - if (ExtendedReaderDynamicAuthority.EXTENDED_READER.equals(perm.getAuthority()) == false && - ExtendedWriterDynamicAuthority.EXTENDED_WRITER.equals(perm.getAuthority()) == false) + Set perms = permissionService.getAllSetPermissions(parent); + for (AccessPermission perm : perms) { - AccessStatus accessStatus = perm.getAccessStatus(); - boolean allow = false; - if (AccessStatus.ALLOWED.equals(accessStatus) == true) + if (!ExtendedReaderDynamicAuthority.EXTENDED_READER.equals(perm.getAuthority()) && + !ExtendedWriterDynamicAuthority.EXTENDED_WRITER.equals(perm.getAuthority())) { - allow = true; + AccessStatus accessStatus = perm.getAccessStatus(); + boolean allow = false; + if (AccessStatus.ALLOWED.equals(accessStatus) == true) + { + allow = true; + } + permissionService.setPermission( + record, + perm.getAuthority(), + perm.getPermission(), + allow); } - permissionService.setPermission( - record, - perm.getAuthority(), - perm.getPermission(), - allow); } } - } - + /** * onMoveRecord behaviour - * + * * @param sourceAssocRef source association reference * @param destinationAssocRef destination association reference */ @@ -364,7 +367,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl if (nodeService.exists(record) == true && nodeService.hasAspect(record, ASPECT_RECORD) == true) { Set keepPerms = new HashSet(5); - + // record any permissions specifically set on the record (ie any filling or record_file permisions not on the parent) Set origionalParentPerms = permissionService.getAllSetPermissions(sourceAssocRef.getParentRef()); Set origionalRecordPerms= permissionService.getAllSetPermissions(record); @@ -374,7 +377,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl ExtendedWriterDynamicAuthority.EXTENDED_WRITER.equals(perm.getAuthority()) == false) { if ((perm.getPermission().equals(RMPermissionModel.FILING) == true || - perm.getPermission().equals(RMPermissionModel.FILE_RECORDS) == true) && + perm.getPermission().equals(RMPermissionModel.FILE_RECORDS) == true) && origionalParentPerms.contains(perm) == false) { // then we can assume this is a permission we want to preserve @@ -382,20 +385,20 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl } } } - + // clear all existing permissions and start again permissionService.deletePermissions(record); - + // re-setup the records permissions initialiseRecordPermissions(record, destinationAssocRef.getParentRef()); - + // re-add keep'er permissions for (AccessPermission keeper : keepPerms) { setPermission(record, keeper.getAuthority(), keeper.getPermission()); } } - + return null; } }, AuthenticationUtil.getSystemUserName()); @@ -407,14 +410,19 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl */ public void setUpPermissions(final NodeRef nodeRef) { - if (nodeService.exists(nodeRef) == true) + setUpPermissions(nodeRef, null); + } + + private void setUpPermissions(final NodeRef nodeRef, final Boolean isParentNodeFilePlan) + { + if (nodeService.exists(nodeRef)) { AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork() { public Object doWork() { // break inheritance - permissionService.setInheritParentPermissions(nodeRef, false); + permissionService.setInheritParentPermissions(nodeRef, isInheritanceAllowed(nodeRef, isParentNodeFilePlan)); // set extended reader permissions permissionService.setPermission(nodeRef, ExtendedReaderDynamicAuthority.EXTENDED_READER, RMPermissionModel.READ_RECORDS, true); @@ -424,7 +432,12 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl } }, AuthenticationUtil.getSystemUserName()); } - } + } + + private boolean isInheritanceAllowed(NodeRef nodeRef, Boolean isParentNodeFilePlan) + { + return !(isFilePlan(nodeRef) || isHold(nodeRef) || isTransfer(nodeRef) || (isRecordCategory(nodeRef) && isTrue(isParentNodeFilePlan))); + } /** * @see org.alfresco.module.org_alfresco_module_rm.security.RecordsManagementSecurityService#setPermission(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, java.lang.String, boolean) @@ -439,20 +452,16 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl { public Boolean doWork() throws Exception { - if (filePlanService.isFilePlan(nodeRef) == true) + if (filePlanService.isFilePlan(nodeRef) || + filePlanService.isFilePlanContainer(nodeRef) || + recordsManagementService.isRecordFolder(nodeRef) || + recordService.isRecord(nodeRef)) { - setPermissionDown(nodeRef, authority, permission); - } - else if (filePlanService.isFilePlanContainer(nodeRef) == true || - recordsManagementService.isRecordFolder(nodeRef) == true || - recordService.isRecord(nodeRef) == true) - { - setReadPermissionUp(nodeRef, authority); setPermissionDown(nodeRef, authority, permission); } else { - if (logger.isWarnEnabled() == true) + if (logger.isWarnEnabled()) { logger.warn("Setting permissions for this node is not supported. (nodeRef=" + nodeRef + ", authority=" + authority + ", permission=" + permission + ")"); } @@ -463,38 +472,6 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl }, AuthenticationUtil.getSystemUserName()); } - /** - * Helper method to set the read permission up the hierarchy - * - * @param nodeRef node reference - * @param authority authority - */ - private void setReadPermissionUp(NodeRef nodeRef, String authority) - { - NodeRef parent = nodeService.getPrimaryParent(nodeRef).getParentRef(); - if (parent != null && filePlanService.isFilePlanComponent(parent) == true) - { - setReadPermissionUpImpl(parent, authority); - } - } - - /** - * Helper method used to set the read permission up the hierarchy - * - * @param nodeRef node reference - * @param authority authority - */ - private void setReadPermissionUpImpl(NodeRef nodeRef, String authority) - { - setPermissionImpl(nodeRef, authority, RMPermissionModel.READ_RECORDS); - - NodeRef parent = nodeService.getPrimaryParent(nodeRef).getParentRef(); - if (parent != null && filePlanService.isFilePlanComponent(parent) == true) - { - setReadPermissionUpImpl(parent, authority); - } - } - /** * Helper method to set the permission down the hierarchy * @@ -504,27 +481,25 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl */ private void setPermissionDown(NodeRef nodeRef, String authority, String permission) { + // set permissions + setPermissionImpl(nodeRef, authority, permission); + // skip out node's that inherit (for example hold and transfer) - if (permissionService.getInheritParentPermissions(nodeRef) == false) + if (!permissionService.getInheritParentPermissions(nodeRef) && + (filePlanService.isFilePlanContainer(nodeRef) || + recordsManagementService.isRecordFolder(nodeRef))) { - // set permissions - setPermissionImpl(nodeRef, authority, permission); - - if (filePlanService.isFilePlanContainer(nodeRef) == true || - recordsManagementService.isRecordFolder(nodeRef) == true) - { - List assocs = nodeService.getChildAssocs(nodeRef, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL); - for (ChildAssociationRef assoc : assocs) + List assocs = nodeService.getChildAssocs(nodeRef, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL); + for (ChildAssociationRef assoc : assocs) + { + NodeRef child = assoc.getChildRef(); + if (filePlanService.isFilePlanContainer(child) || + recordsManagementService.isRecordFolder(child) || + recordService.isRecord(child) || + instanceOf(child, TYPE_HOLD) || + instanceOf(child, TYPE_TRANSFER)) { - NodeRef child = assoc.getChildRef(); - if (filePlanService.isFilePlanContainer(child) == true || - recordsManagementService.isRecordFolder(child) == true || - recordService.isRecord(child) == true || - instanceOf(child, TYPE_HOLD) == true || - instanceOf(child, TYPE_TRANSFER) == true) - { - setPermissionDown(child, authority, permission); - } + setPermissionDown(child, authority, permission); } } } @@ -557,27 +532,25 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl { public Boolean doWork() throws Exception { + // Delete permission on this node + permissionService.deletePermission(nodeRef, authority, permission); + // can't delete permissions if inherited (eg hold and transfer containers) - if (permissionService.getInheritParentPermissions(nodeRef) == false) + if (!permissionService.getInheritParentPermissions(nodeRef) && + (filePlanService.isFilePlanContainer(nodeRef) || + recordsManagementService.isRecordFolder(nodeRef))) { - // Delete permission on this node - permissionService.deletePermission(nodeRef, authority, permission); - - if (filePlanService.isFilePlanContainer(nodeRef) == true || - recordsManagementService.isRecordFolder(nodeRef) == true) + List assocs = nodeService.getChildAssocs(nodeRef, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL); + for (ChildAssociationRef assoc : assocs) { - List assocs = nodeService.getChildAssocs(nodeRef, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL); - for (ChildAssociationRef assoc : assocs) + NodeRef child = assoc.getChildRef(); + if (filePlanService.isFilePlanContainer(child) || + recordsManagementService.isRecordFolder(child) || + recordService.isRecord(child)|| + instanceOf(child, TYPE_HOLD) || + instanceOf(child, TYPE_TRANSFER)) { - NodeRef child = assoc.getChildRef(); - if (filePlanService.isFilePlanContainer(child) == true || - recordsManagementService.isRecordFolder(child) == true || - recordService.isRecord(child) == true|| - instanceOf(child, TYPE_HOLD) == true || - instanceOf(child, TYPE_TRANSFER) == true) - { - deletePermission(child, authority, permission); - } + deletePermission(child, authority, permission); } } } diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java index 72a8e4e268..3510702189 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java @@ -28,7 +28,7 @@ import org.springframework.extensions.webscripts.GUID; /** * File plan permission service unit test - * + * * @author Roy Wetherall * @since 2.1 */ @@ -42,16 +42,16 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase { return true; } - + /** * @see org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase#isRecordTest() */ @Override protected boolean isRecordTest() { - return true; + return true; } - + /** * Helper to create test user */ @@ -69,7 +69,7 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase } }, AuthenticationUtil.getSystemUserName()); } - + /** * Helper to set permission */ @@ -83,9 +83,9 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase filePlanPermissionService.setPermission(nodeRef, userName, permission); return null; } - }); + }); } - + /** * Helper to delete permission */ @@ -99,17 +99,17 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase filePlanPermissionService.deletePermission(nodeRef, userName, permission); return null; } - }); + }); } - + /** * test set/delete permissions on file plan */ public void testSetDeletePermissionFilePlan() throws Exception { String userName = createTestUser(); - - assertPermissions(userName, + + assertPermissions(userName, AccessStatus.ALLOWED, // fileplan read AccessStatus.DENIED, // fileplan file AccessStatus.DENIED, // category read @@ -118,10 +118,10 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase AccessStatus.DENIED, // record folder file AccessStatus.DENIED, // record read AccessStatus.DENIED); // record file - + setPermission(filePlan, userName, RMPermissionModel.FILING); - - assertPermissions(userName, + + assertPermissions(userName, AccessStatus.ALLOWED, // fileplan read AccessStatus.ALLOWED, // fileplan file AccessStatus.ALLOWED, // category read @@ -130,10 +130,10 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase AccessStatus.ALLOWED, // record folder file AccessStatus.ALLOWED, // record read AccessStatus.ALLOWED); // record file - + deletePermission(filePlan, userName, RMPermissionModel.FILING); - - assertPermissions(userName, + + assertPermissions(userName, AccessStatus.ALLOWED, // fileplan read AccessStatus.DENIED, // fileplan file AccessStatus.DENIED, // category read @@ -142,12 +142,12 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase AccessStatus.DENIED, // record folder file AccessStatus.DENIED, // record read AccessStatus.DENIED); // record file - + //what happens if we try and remove READ for a normal user on the file plan ??? deletePermission(filePlan, userName, RMPermissionModel.READ_RECORDS); - + // nothing .. user still has read on file plan .. only removing the user from all roles will remove read on file plan - assertPermissions(userName, + assertPermissions(userName, AccessStatus.ALLOWED, // fileplan read AccessStatus.DENIED, // fileplan file AccessStatus.DENIED, // category read @@ -157,15 +157,15 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase AccessStatus.DENIED, // record read AccessStatus.DENIED); // record file } - + /** * Test set/delete permission on record categorty */ public void testSetDeletePermissionRecordCategory() throws Exception { String userName = createTestUser(); - - assertPermissions(userName, + + assertPermissions(userName, AccessStatus.ALLOWED, // fileplan read AccessStatus.DENIED, // fileplan file AccessStatus.DENIED, // category read @@ -174,10 +174,10 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase AccessStatus.DENIED, // record folder file AccessStatus.DENIED, // record read AccessStatus.DENIED); // record file - + setPermission(rmContainer, userName, RMPermissionModel.FILING); - assertPermissions(userName, + assertPermissions(userName, AccessStatus.ALLOWED, // fileplan read AccessStatus.DENIED, // fileplan file AccessStatus.ALLOWED, // category read @@ -186,10 +186,10 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase AccessStatus.ALLOWED, // record folder file AccessStatus.ALLOWED, // record read AccessStatus.ALLOWED); // record file - + deletePermission(rmContainer, userName, RMPermissionModel.FILING); - - assertPermissions(userName, + + assertPermissions(userName, AccessStatus.ALLOWED, // fileplan read AccessStatus.DENIED, // fileplan file AccessStatus.DENIED, // category read @@ -199,15 +199,15 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase AccessStatus.DENIED, // record read AccessStatus.DENIED); // record file } - + /** * Test set/delete permission on record folder */ public void testSetDeletePermissionRecordFolder() throws Exception { String userName = createTestUser(); - - assertPermissions(userName, + + assertPermissions(userName, AccessStatus.ALLOWED, // fileplan read AccessStatus.DENIED, // fileplan file AccessStatus.DENIED, // category read @@ -216,40 +216,40 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase AccessStatus.DENIED, // record folder file AccessStatus.DENIED, // record read AccessStatus.DENIED); // record file - + setPermission(rmFolder, userName, RMPermissionModel.FILING); - assertPermissions(userName, + assertPermissions(userName, AccessStatus.ALLOWED, // fileplan read AccessStatus.DENIED, // fileplan file - AccessStatus.ALLOWED, // category read + AccessStatus.DENIED, // category read AccessStatus.DENIED, // category file AccessStatus.ALLOWED, // record folder read AccessStatus.ALLOWED, // record folder file AccessStatus.ALLOWED, // record read AccessStatus.ALLOWED); // record file - + deletePermission(rmFolder, userName, RMPermissionModel.FILING); - assertPermissions(userName, + assertPermissions(userName, AccessStatus.ALLOWED, // fileplan read AccessStatus.DENIED, // fileplan file - AccessStatus.ALLOWED, // category read + AccessStatus.DENIED, // category read AccessStatus.DENIED, // category file AccessStatus.DENIED, // record folder read AccessStatus.DENIED, // record folder file AccessStatus.DENIED, // record read AccessStatus.DENIED); // record file } - + /** * Test set/delete permission on record */ public void testSetDeletePermissionRecord() throws Exception { String userName = createTestUser(); - - assertPermissions(userName, + + assertPermissions(userName, AccessStatus.ALLOWED, // fileplan read AccessStatus.DENIED, // fileplan file AccessStatus.DENIED, // category read @@ -258,48 +258,48 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase AccessStatus.DENIED, // record folder file AccessStatus.DENIED, // record read AccessStatus.DENIED); // record file - + setPermission(recordOne, userName, RMPermissionModel.FILING); - assertPermissions(userName, + assertPermissions(userName, AccessStatus.ALLOWED, // fileplan read AccessStatus.DENIED, // fileplan file - AccessStatus.ALLOWED, // category read + AccessStatus.DENIED, // category read AccessStatus.DENIED, // category file - AccessStatus.ALLOWED, // record folder read + AccessStatus.DENIED, // record folder read AccessStatus.DENIED, // record folder file AccessStatus.ALLOWED, // record read AccessStatus.ALLOWED); // record file - + deletePermission(recordOne, userName, RMPermissionModel.FILING); - assertPermissions(userName, + assertPermissions(userName, AccessStatus.ALLOWED, // fileplan read AccessStatus.DENIED, // fileplan file - AccessStatus.ALLOWED, // category read + AccessStatus.DENIED, // category read AccessStatus.DENIED, // category file - AccessStatus.ALLOWED, // record folder read + AccessStatus.DENIED, // record folder read AccessStatus.DENIED, // record folder file AccessStatus.DENIED, // record read AccessStatus.DENIED); // record file } - + public void testMoveRecord() throws Exception { String userOne = createTestUser(); String userTwo = createTestUser(); String userThree = createTestUser(); - + final NodeRef otherFolder = doTestInTransaction(new Test() { @Override public NodeRef run() { - return rmService.createRecordFolder(rmContainer, "otherFolder"); + return rmService.createRecordFolder(rmContainer, "otherFolder"); } }); - - assertPermissions(userOne, + + assertPermissions(userOne, AccessStatus.ALLOWED, // fileplan read AccessStatus.DENIED, // fileplan file AccessStatus.DENIED, // category read @@ -318,7 +318,7 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase return null; } }, userOne); - assertPermissions(userTwo, + assertPermissions(userTwo, AccessStatus.ALLOWED, // fileplan read AccessStatus.DENIED, // fileplan file AccessStatus.DENIED, // category read @@ -337,7 +337,7 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase return null; } }, userTwo); - assertPermissions(userThree, + assertPermissions(userThree, AccessStatus.ALLOWED, // fileplan read AccessStatus.DENIED, // fileplan file AccessStatus.DENIED, // category read @@ -356,15 +356,15 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase return null; } }, userThree); - + setPermission(rmFolder, userOne, RMPermissionModel.FILING); setPermission(otherFolder, userTwo, RMPermissionModel.FILING); setPermission(recordOne, userThree, RMPermissionModel.FILING); - - assertPermissions(userOne, + + assertPermissions(userOne, AccessStatus.ALLOWED, // fileplan read AccessStatus.DENIED, // fileplan file - AccessStatus.ALLOWED, // category read + AccessStatus.DENIED, // category read AccessStatus.DENIED, // category file AccessStatus.ALLOWED, // record folder read AccessStatus.ALLOWED, // record folder file @@ -380,10 +380,10 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase return null; } }, userOne); - assertPermissions(userTwo, + assertPermissions(userTwo, AccessStatus.ALLOWED, // fileplan read AccessStatus.DENIED, // fileplan file - AccessStatus.ALLOWED, // category read + AccessStatus.DENIED, // category read AccessStatus.DENIED, // category file AccessStatus.DENIED, // record folder read AccessStatus.DENIED, // record folder file @@ -399,12 +399,12 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase return null; } }, userTwo); - assertPermissions(userThree, + assertPermissions(userThree, AccessStatus.ALLOWED, // fileplan read AccessStatus.DENIED, // fileplan file - AccessStatus.ALLOWED, // category read + AccessStatus.DENIED, // category read AccessStatus.DENIED, // category file - AccessStatus.ALLOWED, // record folder read + AccessStatus.DENIED, // record folder read AccessStatus.DENIED, // record folder file AccessStatus.ALLOWED, // record read AccessStatus.ALLOWED); // record file @@ -418,7 +418,7 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase return null; } }, userThree); - + // move the record! doTestInTransaction(new Test() { @@ -429,11 +429,11 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase return null; } }); - - assertPermissions(userOne, + + assertPermissions(userOne, AccessStatus.ALLOWED, // fileplan read AccessStatus.DENIED, // fileplan file - AccessStatus.ALLOWED, // category read + AccessStatus.DENIED, // category read AccessStatus.DENIED, // category file AccessStatus.ALLOWED, // record folder read AccessStatus.ALLOWED, // record folder file @@ -449,10 +449,10 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase return null; } }, userOne); - assertPermissions(userTwo, + assertPermissions(userTwo, AccessStatus.ALLOWED, // fileplan read AccessStatus.DENIED, // fileplan file - AccessStatus.ALLOWED, // category read + AccessStatus.DENIED, // category read AccessStatus.DENIED, // category file AccessStatus.DENIED, // record folder read AccessStatus.DENIED, // record folder file @@ -468,12 +468,12 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase return null; } }, userTwo); - assertPermissions(userThree, + assertPermissions(userThree, AccessStatus.ALLOWED, // fileplan read AccessStatus.DENIED, // fileplan file - AccessStatus.ALLOWED, // category read + AccessStatus.DENIED, // category read AccessStatus.DENIED, // category file - AccessStatus.ALLOWED, // record folder read + AccessStatus.DENIED, // record folder read AccessStatus.DENIED, // record folder file AccessStatus.ALLOWED, // record read AccessStatus.ALLOWED); // record file @@ -482,43 +482,43 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase @Override public Void run() { - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(otherFolder, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(otherFolder, RMPermissionModel.READ_RECORDS)); assertEquals(AccessStatus.DENIED, permissionService.hasPermission(otherFolder, RMPermissionModel.FILING)); return null; } }, userThree); - + } - - + + /** * Helper to assert permissions for passed user */ private void assertPermissions(final String userName, final AccessStatus ... accessStatus) { assertEquals(8, accessStatus.length); - + doTestInTransaction(new Test() { @Override public Void run() { - assertEquals("Everyone who has a role has read permissions on the file plan", + assertEquals("Everyone who has a role has read permissions on the file plan", accessStatus[0], permissionService.hasPermission(filePlan, RMPermissionModel.READ_RECORDS)); assertEquals(accessStatus[1], permissionService.hasPermission(filePlan, RMPermissionModel.FILING)); - + assertEquals(accessStatus[2], permissionService.hasPermission(rmContainer, RMPermissionModel.READ_RECORDS)); assertEquals(accessStatus[3], permissionService.hasPermission(rmContainer, RMPermissionModel.FILING)); - + assertEquals(accessStatus[4], permissionService.hasPermission(rmFolder, RMPermissionModel.READ_RECORDS)); assertEquals(accessStatus[5], permissionService.hasPermission(rmFolder, RMPermissionModel.FILING)); - + assertEquals(accessStatus[6], permissionService.hasPermission(recordOne, RMPermissionModel.READ_RECORDS)); assertEquals(accessStatus[7], permissionService.hasPermission(recordOne, RMPermissionModel.FILING)); - + return null; } }, userName); } - + } From e6bceec830edd44d457f5d9f8d0efc5e0422e12b Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Tue, 14 Oct 2014 21:46:05 +0000 Subject: [PATCH 34/54] RM-1661 (Performance on setting permissions at a high category level) * Fixed failing unit tests git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@88092 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../test/capabilities/DeclarativeCapabilityTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/capabilities/DeclarativeCapabilityTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/capabilities/DeclarativeCapabilityTest.java index 948770e112..98efb778ca 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/capabilities/DeclarativeCapabilityTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/capabilities/DeclarativeCapabilityTest.java @@ -135,6 +135,7 @@ public class DeclarativeCapabilityTest extends BaseRMTestCase for (String user : testUsers) { filePlanPermissionService.setPermission(rmFolder, user, RMPermissionModel.FILING); + filePlanPermissionService.setPermission(rmContainer, user, RMPermissionModel.READ_RECORDS); filePlanPermissionService.setPermission(moveToFolder, user, RMPermissionModel.READ_RECORDS); filePlanPermissionService.setPermission(moveToCategory, user, RMPermissionModel.READ_RECORDS); } From 867f22b20e75df565fdbb768f050fb53018219c2 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Wed, 15 Oct 2014 12:52:16 +0000 Subject: [PATCH 35/54] RM-1661 (Performance on setting permissions at a high category level) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@88144 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../alfresco/rma/rmpermissions.get.desc.xml | 9 -- .../org/alfresco/rma/rmpermissions.get.js | 86 ------------------- .../alfresco/rma/rmpermissions.get.json.ftl | 22 ----- .../alfresco/rma/rmpermissions.post.json.js | 23 +++-- 4 files changed, 14 insertions(+), 126 deletions(-) delete mode 100644 rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/rmpermissions.get.desc.xml delete mode 100644 rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/rmpermissions.get.js delete mode 100644 rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/rmpermissions.get.json.ftl diff --git a/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/rmpermissions.get.desc.xml b/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/rmpermissions.get.desc.xml deleted file mode 100644 index cd90572016..0000000000 --- a/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/rmpermissions.get.desc.xml +++ /dev/null @@ -1,9 +0,0 @@ - - Records Management Permissions - Retrieve the Permissions set against a Records Management node. - /api/node/{store_type}/{store_id}/{id}/rmpermissions - argument - user - required - internal - \ No newline at end of file diff --git a/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/rmpermissions.get.js b/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/rmpermissions.get.js deleted file mode 100644 index 439a2654ac..0000000000 --- a/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/rmpermissions.get.js +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Entry point for rmpermissions GET data webscript. - * Queries the permissions from an RM node and constructs the data-model for the template. - * - * @method main - */ -function main() -{ - // Get the node from the URL - var pathSegments = url.match.split("/"); - var reference = [ url.templateArgs.store_type, url.templateArgs.store_id ].concat(url.templateArgs.id.split("/")); - var node = search.findNode(pathSegments[2], reference); - - // 404 if the node is not found - if (node == null) - { - status.setCode(status.STATUS_NOT_FOUND, "The node could not be found"); - return; - } - - // retrieve permissions applied to this node - var permissions = node.getFullPermissions(); - - // split tokens - results are in the format: - // [ALLOWED|DENIED];[USERNAME|GROUPNAME];PERMISSION;[INHERITED|DIRECT] - var result = []; - for (var i=0; i -{ - "data": - { - "permissions": - [ - <#list permissions as perm> - { - "id": "${perm.id}", - "authority": - { - "id": "${perm.authority.id}", - "label": "${perm.authority.label}" - }, - "inherited": ${perm.inherited?string} - }<#if perm_has_next>, - - ], - "inherited": ${inherited?string} - } -} - \ No newline at end of file diff --git a/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/rmpermissions.post.json.js b/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/rmpermissions.post.json.js index 6aa731567e..a29ec41b13 100644 --- a/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/rmpermissions.post.json.js +++ b/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/rmpermissions.post.json.js @@ -1,7 +1,7 @@ /** * Entry point for rmpermissions POST data webscript. * Applies supplied RM permissions to an RM node. - * + * * @method main */ function main() @@ -10,41 +10,46 @@ function main() var pathSegments = url.match.split("/"); var reference = [ url.templateArgs.store_type, url.templateArgs.store_id ].concat(url.templateArgs.id.split("/")); var node = search.findNode(pathSegments[2], reference); - + // 404 if the node is not found if (node == null) { status.setCode(status.STATUS_NOT_FOUND, "The node could not be found"); return; } - + if (json.has("permissions") == false) { status.setCode(status.STATUS_BAD_REQUEST, "Permissions value missing from request."); } - + + if (json.has("isInherited")) + { + node.setInheritsPermissions(json.getBoolean("isInherited")); + } + var permissions = json.getJSONArray("permissions"); for (var i=0; i Date: Wed, 15 Oct 2014 16:28:01 +0000 Subject: [PATCH 36/54] RM-1724 (Inheritance is not off for root categories, unfiled records, holds and transfers) RM-1725 (Inheritance is not working properly) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@88182 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../FilePlanPermissionServiceImpl.java | 109 ++++-------------- .../util/ServiceBaseImpl.java | 59 ++++++---- 2 files changed, 61 insertions(+), 107 deletions(-) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java index 83deaeabcc..aa6391f52a 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java @@ -21,10 +21,8 @@ package org.alfresco.module.org_alfresco_module_rm.security; import static org.apache.commons.lang.BooleanUtils.isTrue; import java.util.HashSet; -import java.util.List; import java.util.Set; -import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.RecordsManagementService; import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel; import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; @@ -43,7 +41,6 @@ import org.alfresco.service.cmr.security.AccessPermission; import org.alfresco.service.cmr.security.AccessStatus; import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.namespace.QName; -import org.alfresco.service.namespace.RegexQNamePattern; import org.alfresco.util.ParameterCheck; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -404,11 +401,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl }, AuthenticationUtil.getSystemUserName()); } - /** - * - * @param nodeRef - */ - public void setUpPermissions(final NodeRef nodeRef) + private void setUpPermissions(final NodeRef nodeRef) { setUpPermissions(nodeRef, null); } @@ -421,7 +414,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl { public Object doWork() { - // break inheritance + // set inheritance permissionService.setInheritParentPermissions(nodeRef, isInheritanceAllowed(nodeRef, isParentNodeFilePlan)); // set extended reader permissions @@ -436,7 +429,7 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl private boolean isInheritanceAllowed(NodeRef nodeRef, Boolean isParentNodeFilePlan) { - return !(isFilePlan(nodeRef) || isHold(nodeRef) || isTransfer(nodeRef) || (isRecordCategory(nodeRef) && isTrue(isParentNodeFilePlan))); + return !(isFilePlan(nodeRef) || isTransfer(nodeRef) || isHold(nodeRef) || isUnfiledRecordsContainer(nodeRef) || (isRecordCategory(nodeRef) && isTrue(isParentNodeFilePlan))); } /** @@ -452,12 +445,16 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl { public Boolean doWork() throws Exception { - if (filePlanService.isFilePlan(nodeRef) || - filePlanService.isFilePlanContainer(nodeRef) || - recordsManagementService.isRecordFolder(nodeRef) || - recordService.isRecord(nodeRef)) + if (canPerformPermissionAction(nodeRef)) { - setPermissionDown(nodeRef, authority, permission); + if (RMPermissionModel.FILING.equals(permission)) + { + // Remove record read permission before adding filing permission + permissionService.deletePermission(nodeRef, authority, RMPermissionModel.READ_RECORDS); + } + + // Set the permission on the node + permissionService.setPermission(nodeRef, authority, permission, true); } else { @@ -472,57 +469,6 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl }, AuthenticationUtil.getSystemUserName()); } - /** - * Helper method to set the permission down the hierarchy - * - * @param nodeRef node reference - * @param authority authority - * @param permission permission - */ - private void setPermissionDown(NodeRef nodeRef, String authority, String permission) - { - // set permissions - setPermissionImpl(nodeRef, authority, permission); - - // skip out node's that inherit (for example hold and transfer) - if (!permissionService.getInheritParentPermissions(nodeRef) && - (filePlanService.isFilePlanContainer(nodeRef) || - recordsManagementService.isRecordFolder(nodeRef))) - { - List assocs = nodeService.getChildAssocs(nodeRef, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL); - for (ChildAssociationRef assoc : assocs) - { - NodeRef child = assoc.getChildRef(); - if (filePlanService.isFilePlanContainer(child) || - recordsManagementService.isRecordFolder(child) || - recordService.isRecord(child) || - instanceOf(child, TYPE_HOLD) || - instanceOf(child, TYPE_TRANSFER)) - { - setPermissionDown(child, authority, permission); - } - } - } - } - - /** - * Set the permission, taking into account that filing is a superset of read - * - * @param nodeRef - * @param authority - * @param permission - */ - private void setPermissionImpl(NodeRef nodeRef, String authority, String permission) - { - if (RMPermissionModel.FILING.equals(permission) == true) - { - // Remove record read permission before adding filing permission - permissionService.deletePermission(nodeRef, authority, RMPermissionModel.READ_RECORDS); - } - - permissionService.setPermission(nodeRef, authority, permission, true); - } - /** * @see org.alfresco.module.org_alfresco_module_rm.security.RecordsManagementSecurityService#deletePermission(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, java.lang.String) */ @@ -532,26 +478,16 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl { public Boolean doWork() throws Exception { - // Delete permission on this node - permissionService.deletePermission(nodeRef, authority, permission); - - // can't delete permissions if inherited (eg hold and transfer containers) - if (!permissionService.getInheritParentPermissions(nodeRef) && - (filePlanService.isFilePlanContainer(nodeRef) || - recordsManagementService.isRecordFolder(nodeRef))) + if (canPerformPermissionAction(nodeRef)) { - List assocs = nodeService.getChildAssocs(nodeRef, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL); - for (ChildAssociationRef assoc : assocs) + // Delete permission on this node + permissionService.deletePermission(nodeRef, authority, permission); + } + else + { + if (logger.isWarnEnabled()) { - NodeRef child = assoc.getChildRef(); - if (filePlanService.isFilePlanContainer(child) || - recordsManagementService.isRecordFolder(child) || - recordService.isRecord(child)|| - instanceOf(child, TYPE_HOLD) || - instanceOf(child, TYPE_TRANSFER)) - { - deletePermission(child, authority, permission); - } + logger.warn("Deleting permissions for this node is not supported. (nodeRef=" + nodeRef + ", authority=" + authority + ", permission=" + permission + ")"); } } @@ -559,4 +495,9 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl } }, AuthenticationUtil.getSystemUserName()); } + + private boolean canPerformPermissionAction(NodeRef nodeRef) + { + return filePlanService.isFilePlanContainer(nodeRef) || recordsManagementService.isRecordFolder(nodeRef) || recordService.isRecord(nodeRef); + } } 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 21e1e349c6..5f05b6331e 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 @@ -40,7 +40,7 @@ import org.springframework.context.ApplicationContextAware; /** * Helper base class for service implementations. - * + * * @author Roy Wetherall * @since 2.1 */ @@ -54,7 +54,7 @@ public class ServiceBaseImpl implements RecordsManagementModel, ApplicationConte /** Application context */ protected ApplicationContext applicationContext; - + /** internal node service */ private NodeService internalNodeService; @@ -82,7 +82,7 @@ public class ServiceBaseImpl implements RecordsManagementModel, ApplicationConte { this.dictionaryService = dictionaryService; } - + /** * Helper to get internal node service. *

@@ -94,10 +94,10 @@ public class ServiceBaseImpl implements RecordsManagementModel, ApplicationConte { internalNodeService = (NodeService)applicationContext.getBean("dbNodeService"); } - + return internalNodeService; } - + /** * Gets the file plan component kind from the given node reference * @@ -117,7 +117,7 @@ public class ServiceBaseImpl implements RecordsManagementModel, ApplicationConte if (isFilePlanComponent(nodeRef)) { result = FilePlanComponentKind.FILE_PLAN_COMPONENT; - + if (isFilePlan(nodeRef)) { result = FilePlanComponentKind.FILE_PLAN; @@ -146,12 +146,12 @@ public class ServiceBaseImpl implements RecordsManagementModel, ApplicationConte { result = FilePlanComponentKind.DISPOSITION_SCHEDULE; } - else if (instanceOf(nodeRef, TYPE_UNFILED_RECORD_CONTAINER)) + else if (isUnfiledRecordsContainer(nodeRef)) { result = FilePlanComponentKind.UNFILED_RECORD_CONTAINER; } } - + if (result != null) { map.put(nodeRef, result); @@ -297,7 +297,7 @@ public class ServiceBaseImpl implements RecordsManagementModel, ApplicationConte ParameterCheck.mandatory("nodeRef", nodeRef); boolean isHold = false; - if (getInternalNodeService().exists(nodeRef) && + if (getInternalNodeService().exists(nodeRef) && instanceOf(nodeRef, TYPE_HOLD)) { isHold = true; @@ -316,10 +316,23 @@ public class ServiceBaseImpl implements RecordsManagementModel, ApplicationConte return instanceOf(nodeRef, TYPE_TRANSFER); } - + + /** + * Indicates whether the given node reference is an unfiled records container or not. + * + * @param nodeRef node reference + * @return boolean true if rma:unfiledRecordContainer or sub-type, false otherwise + */ + public boolean isUnfiledRecordsContainer(NodeRef nodeRef) + { + ParameterCheck.mandatory("nodeRef", nodeRef); + + return instanceOf(nodeRef, TYPE_UNFILED_RECORD_CONTAINER); + } + /** * Indicates whether a record is complete or not. - * + * * @see org.alfresco.module.org_alfresco_module_rm.record.RecordService#isDeclared(org.alfresco.service.cmr.repository.NodeRef) */ public boolean isDeclared(NodeRef record) @@ -338,12 +351,12 @@ public class ServiceBaseImpl implements RecordsManagementModel, ApplicationConte public NodeRef getFilePlan(final NodeRef nodeRef) { NodeRef result = null; - if (nodeRef != null) - { + if (nodeRef != null) + { Map transactionCache = TransactionalResourceHelper.getMap("rm.servicebase.getFilePlan"); if (transactionCache.containsKey(nodeRef)) { - result = transactionCache.get(nodeRef); + result = transactionCache.get(nodeRef); } else { @@ -363,7 +376,7 @@ public class ServiceBaseImpl implements RecordsManagementModel, ApplicationConte } } } - + // cache result in transaction transactionCache.put(nodeRef, result); } @@ -381,11 +394,11 @@ public class ServiceBaseImpl implements RecordsManagementModel, ApplicationConte protected boolean instanceOf(NodeRef nodeRef, QName ofClassName) { ParameterCheck.mandatory("nodeRef", nodeRef); - ParameterCheck.mandatory("ofClassName", ofClassName); - QName className = getInternalNodeService().getType(nodeRef); + ParameterCheck.mandatory("ofClassName", ofClassName); + QName className = getInternalNodeService().getType(nodeRef); return instanceOf(className, ofClassName); } - + private static Map instanceOfCache = new HashMap(); /** @@ -399,25 +412,25 @@ public class ServiceBaseImpl implements RecordsManagementModel, ApplicationConte { ParameterCheck.mandatory("className", className); ParameterCheck.mandatory("ofClassName", ofClassName); - + boolean result = false; - + String key = className.toString() + "|" + ofClassName.toString(); if (instanceOfCache.containsKey(key)) { result = instanceOfCache.get(key); } else - { + { if (ofClassName.equals(className) || dictionaryService.isSubClass(className, ofClassName)) { result = true; } - + instanceOfCache.put(key, result); } - + return result; } From d0e5c0207314994da045eac173d5f1b4473af0bc Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Wed, 15 Oct 2014 19:23:51 +0000 Subject: [PATCH 37/54] RM-1661 (Performance on setting permissions at a high category level) * Added unit tests git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@88192 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../FilePlanPermissionServiceImplTest.java | 194 +++++++++++++++++- 1 file changed, 188 insertions(+), 6 deletions(-) diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java index 3510702189..1d48609319 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java @@ -124,12 +124,12 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase assertPermissions(userName, AccessStatus.ALLOWED, // fileplan read AccessStatus.ALLOWED, // fileplan file - AccessStatus.ALLOWED, // category read - AccessStatus.ALLOWED, // category file - AccessStatus.ALLOWED, // record folder read - AccessStatus.ALLOWED, // record folder file - AccessStatus.ALLOWED, // record read - AccessStatus.ALLOWED); // record file + AccessStatus.DENIED, // category read + AccessStatus.DENIED, // category file + AccessStatus.DENIED, // record folder read + AccessStatus.DENIED, // record folder file + AccessStatus.DENIED, // record read + AccessStatus.DENIED); // record file deletePermission(filePlan, userName, RMPermissionModel.FILING); @@ -521,4 +521,186 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase }, userName); } + public void testFilePlanComponentInheritance() + { + doTestInTransaction(new Test() + { + @Override + public Void run() + { + // Inheritance is turned off for file plan, transfer, holds, unfiled records and root categories + // it is turned on for sub categories, record folders and records + assertFalse(permissionService.getInheritParentPermissions(filePlan)); + assertFalse(permissionService.getInheritParentPermissions(filePlanService.getTransferContainer(filePlan))); + assertFalse(permissionService.getInheritParentPermissions(filePlanService.getHoldContainer(filePlan))); + assertFalse(permissionService.getInheritParentPermissions(unfiledContainer)); + assertFalse(permissionService.getInheritParentPermissions(rmContainer)); + assertTrue(permissionService.getInheritParentPermissions(rmService.createRecordFolder(rmContainer, "subCategory"))); + assertTrue(permissionService.getInheritParentPermissions(rmFolder)); + assertTrue(permissionService.getInheritParentPermissions(recordOne)); + + return null; + } + }, rmAdminName); + } + + public void testRolesSetByDefault() + { + final NodeRef transferContainer = filePlanService.getTransferContainer(filePlan); + final NodeRef holdContainer = filePlanService.getHoldContainer(filePlan); + final NodeRef subCategory = rmService.createRecordFolder(rmContainer, "subCategory"); + + // Admin user has read/filing permissions on file plan, transfer, hold, unfiled records, root categories, sub categories, folders and records + doTestInTransaction(new Test() + { + @Override + public Void run() + { + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(filePlan, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(filePlan, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(transferContainer, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(transferContainer, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(holdContainer, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(holdContainer, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(unfiledContainer, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(unfiledContainer, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(rmContainer, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(rmContainer, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(subCategory, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(subCategory, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(rmFolder, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(rmFolder, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(recordOne, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(recordOne, RMPermissionModel.READ_RECORDS)); + + return null; + } + }, rmAdminName); + + // test user has read permissions on file plan, transfer, hold and unfiled records as the user will be added in the all records management roles + // which has read permissions on those nodes by default + doTestInTransaction(new Test() + { + @Override + public Void run() + { + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(filePlan, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(filePlan, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(transferContainer, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(transferContainer, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(holdContainer, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(holdContainer, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(unfiledContainer, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(unfiledContainer, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(rmContainer, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(rmContainer, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(rmFolder, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(rmFolder, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(recordOne, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(recordOne, RMPermissionModel.READ_RECORDS)); + + return null; + } + }, createTestUser()); + } + + public void testAddUserToContainers() + { + final NodeRef transferContainer = filePlanService.getTransferContainer(filePlan); + final NodeRef holdContainer = filePlanService.getHoldContainer(filePlan); + final NodeRef subCategory = rmService.createRecordFolder(rmContainer, "subCategory"); + + String user1 = createTestUser(); + filePlanPermissionService.setPermission(filePlan, user1, RMPermissionModel.FILING); + + // The user1 will just read and filing permissions on the file plan + // and read permissions on transfer, hold and unfiled records as the user will be in the all records management users role + doTestInTransaction(new Test() + { + @Override + public Void run() + { + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(filePlan, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(filePlan, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(transferContainer, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(transferContainer, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(holdContainer, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(holdContainer, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(unfiledContainer, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(unfiledContainer, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(rmContainer, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(rmContainer, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(rmFolder, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(rmFolder, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(recordOne, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(recordOne, RMPermissionModel.READ_RECORDS)); + + return null; + } + }, user1); + + String user2 = createTestUser(); + filePlanPermissionService.setPermission(unfiledContainer, user2, RMPermissionModel.FILING); + + // The user2 will just read permissions on file plan, transfer, hold + // and read and filing permissions on unfiled records container + doTestInTransaction(new Test() + { + @Override + public Void run() + { + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(filePlan, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(filePlan, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(transferContainer, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(transferContainer, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(holdContainer, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(holdContainer, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(unfiledContainer, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(unfiledContainer, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(rmContainer, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(rmContainer, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(rmFolder, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(rmFolder, RMPermissionModel.READ_RECORDS)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(recordOne, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(recordOne, RMPermissionModel.READ_RECORDS)); + + return null; + } + }, user2); + } + } From ab87aa6f54295ae9a5a270d2ee35af914d93c630 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Wed, 15 Oct 2014 19:57:37 +0000 Subject: [PATCH 38/54] RM-1661 (Performance on setting permissions at a high category level) * Fixed failing unit tests git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@88193 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../test/issue/RM1008Test.java | 152 +++++++++--------- 1 file changed, 77 insertions(+), 75 deletions(-) diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/issue/RM1008Test.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/issue/RM1008Test.java index ed09fba0ac..d1086fc6c9 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/issue/RM1008Test.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/issue/RM1008Test.java @@ -40,44 +40,44 @@ import org.alfresco.util.GUID; /** * System test for RM-1008 - * + * * @author Roy Wetherall * @since 2.1 */ -public class RM1008Test extends BaseRMTestCase -{ +public class RM1008Test extends BaseRMTestCase +{ private String myUser; - + @Override protected void initServices() { super.initServices(); } - + @Override protected boolean isRecordTest() { return true; } - + @Override protected boolean isUserTest() { return true; } - + @Override protected void setupTestUsersImpl(NodeRef filePlan) { super.setupTestUsersImpl(filePlan); - + myUser = GUID.generate(); createPerson(myUser); filePlanRoleService.assignRoleToAuthority(filePlan, FilePlanRoleService.ROLE_USER, myUser); } - + public void testContainers() throws Exception - { + { doTestInTransaction(new Test() { @Override @@ -87,20 +87,20 @@ public class RM1008Test extends BaseRMTestCase assertNotNull(holdContainer); NodeRef transferContainer = filePlanService.getTransferContainer(filePlan); assertNotNull(transferContainer); - + Capability viewRecords = capabilityService.getCapability("ViewRecords"); assertNotNull(viewRecords); - + assertEquals(AccessStatus.ALLOWED, viewRecords.hasPermission(holdContainer)); assertEquals(AccessStatus.ALLOWED, viewRecords.hasPermission(transferContainer)); - + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(holdContainer, RMPermissionModel.FILING)); assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(transferContainer, RMPermissionModel.FILING)); - + return null; } }, rmAdminName); - + doTestInTransaction(new Test() { @Override @@ -110,23 +110,23 @@ public class RM1008Test extends BaseRMTestCase assertNotNull(holdContainer); NodeRef transferContainer = filePlanService.getTransferContainer(filePlan); assertNotNull(transferContainer); - + Capability viewRecords = capabilityService.getCapability("ViewRecords"); assertNotNull(viewRecords); - + assertEquals(AccessStatus.ALLOWED, viewRecords.hasPermission(holdContainer)); assertEquals(AccessStatus.ALLOWED, viewRecords.hasPermission(transferContainer)); - + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(holdContainer, RMPermissionModel.FILING)); assertEquals(AccessStatus.DENIED, permissionService.hasPermission(transferContainer, RMPermissionModel.FILING)); - + return null; } }, myUser); } - + public void testHold() - { + { final NodeRef hold = doTestInTransaction(new Test() { @Override @@ -138,7 +138,7 @@ public class RM1008Test extends BaseRMTestCase return holds.iterator().next(); } }, rmAdminName); - + doTestInTransaction(new Test() { @Override @@ -146,82 +146,83 @@ public class RM1008Test extends BaseRMTestCase { Capability viewRecords = capabilityService.getCapability("ViewRecords"); assertNotNull(viewRecords); - + assertEquals(AccessStatus.ALLOWED, viewRecords.hasPermission(hold)); assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(hold, RMPermissionModel.FILING)); - + return null; } }, rmAdminName); - + doTestInTransaction(new Test() { @Override public Void run() - { + { Capability viewRecords = capabilityService.getCapability("ViewRecords"); assertNotNull(viewRecords); - + assertEquals(AccessStatus.ALLOWED, viewRecords.hasPermission(hold)); assertEquals(AccessStatus.DENIED, permissionService.hasPermission(hold, RMPermissionModel.FILING)); - + return null; } }, myUser); - + doTestInTransaction(new Test() { @Override public Void run() { filePlanPermissionService.setPermission(filePlan, myUser, FILING); - + return null; } }, rmAdminName); - + doTestInTransaction(new Test() { @Override public Void run() - { + { Capability viewRecords = capabilityService.getCapability("ViewRecords"); assertNotNull(viewRecords); - + assertEquals(AccessStatus.ALLOWED, viewRecords.hasPermission(hold)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(hold, RMPermissionModel.FILING)); - + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(hold, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(hold, RMPermissionModel.FILING)); + return null; } }, myUser); - + doTestInTransaction(new Test() { @Override public Void run() { filePlanPermissionService.deletePermission(filePlan, myUser, FILING); - + return null; } }, rmAdminName); - + doTestInTransaction(new Test() { @Override public Void run() - { + { Capability viewRecords = capabilityService.getCapability("ViewRecords"); assertNotNull(viewRecords); - + assertEquals(AccessStatus.ALLOWED, viewRecords.hasPermission(hold)); assertEquals(AccessStatus.DENIED, permissionService.hasPermission(hold, RMPermissionModel.FILING)); - + return null; } }, myUser); } - + public void testTransfer() { final NodeRef transferFolder = doTestInTransaction(new Test() @@ -235,39 +236,39 @@ public class RM1008Test extends BaseRMTestCase dsProps.put(PROP_DISPOSITION_AUTHORITY, "test"); dsProps.put(PROP_DISPOSITION_INSTRUCTIONS, "test"); dsProps.put(PROP_RECORD_LEVEL_DISPOSITION, false); - DispositionSchedule dispositionSchedule = dispositionService.createDispositionSchedule(transferCat, dsProps); - + DispositionSchedule dispositionSchedule = dispositionService.createDispositionSchedule(transferCat, dsProps); + Map adParams = new HashMap(3); adParams.put(PROP_DISPOSITION_ACTION_NAME, "cutoff"); adParams.put(PROP_DISPOSITION_DESCRIPTION, "test"); - adParams.put(PROP_DISPOSITION_PERIOD, "immediately|0"); - + adParams.put(PROP_DISPOSITION_PERIOD, "immediately|0"); + dispositionService.addDispositionActionDefinition(dispositionSchedule, adParams); - + adParams = new HashMap(3); adParams.put(PROP_DISPOSITION_ACTION_NAME, "transfer"); adParams.put(PROP_DISPOSITION_DESCRIPTION, "test"); - adParams.put(PROP_DISPOSITION_PERIOD, "immediately|0"); - + adParams.put(PROP_DISPOSITION_PERIOD, "immediately|0"); + dispositionService.addDispositionActionDefinition(dispositionSchedule, adParams); return rmService.createRecordFolder(transferCat, "transferFolder"); } }); - + final NodeRef transfer = doTestInTransaction(new Test() { @Override public NodeRef run() - { + { actionService.executeRecordsManagementAction(transferFolder, "cutoff"); actionService.executeRecordsManagementAction(transferFolder, "transfer"); - + NodeRef transferContainer = filePlanService.getTransferContainer(filePlan); List childAssocs = nodeService.getChildAssocs(transferContainer, ContentModel.ASSOC_CONTAINS, RegexQNamePattern.MATCH_ALL); - return childAssocs.get(0).getChildRef(); + return childAssocs.get(0).getChildRef(); } - + @Override public void test(NodeRef result) throws Exception { @@ -275,7 +276,7 @@ public class RM1008Test extends BaseRMTestCase assertEquals(TYPE_TRANSFER, nodeService.getType(result)); } }); - + doTestInTransaction(new Test() { @Override @@ -283,82 +284,83 @@ public class RM1008Test extends BaseRMTestCase { Capability viewRecords = capabilityService.getCapability("ViewRecords"); assertNotNull(viewRecords); - + assertEquals(AccessStatus.ALLOWED, viewRecords.hasPermission(transfer)); assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(transfer, RMPermissionModel.FILING)); - + return null; } }, rmAdminName); - + doTestInTransaction(new Test() { @Override public Void run() - { + { Capability viewRecords = capabilityService.getCapability("ViewRecords"); assertNotNull(viewRecords); - + assertEquals(AccessStatus.ALLOWED, viewRecords.hasPermission(transfer)); assertEquals(AccessStatus.DENIED, permissionService.hasPermission(transfer, RMPermissionModel.FILING)); - + return null; } }, myUser); - + doTestInTransaction(new Test() { @Override public Void run() { filePlanPermissionService.setPermission(filePlan, myUser, FILING); - + return null; } }, rmAdminName); - + doTestInTransaction(new Test() { @Override public Void run() - { + { Capability viewRecords = capabilityService.getCapability("ViewRecords"); assertNotNull(viewRecords); - + assertEquals(AccessStatus.ALLOWED, viewRecords.hasPermission(transfer)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(transfer, RMPermissionModel.FILING)); - + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(transfer, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(transfer, RMPermissionModel.FILING)); + return null; } }, myUser); - + doTestInTransaction(new Test() { @Override public Void run() { filePlanPermissionService.deletePermission(filePlan, myUser, FILING); - + return null; } }, rmAdminName); - + doTestInTransaction(new Test() { @Override public Void run() - { + { Capability viewRecords = capabilityService.getCapability("ViewRecords"); assertNotNull(viewRecords); - + assertEquals(AccessStatus.ALLOWED, viewRecords.hasPermission(transfer)); assertEquals(AccessStatus.DENIED, permissionService.hasPermission(transfer, RMPermissionModel.FILING)); - + return null; } }, myUser); - + } } From 5a3c6a0f413cf4aa889e4d2beedd83f84835ab60 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Thu, 16 Oct 2014 15:09:09 +0000 Subject: [PATCH 39/54] RM-1661 (Performance on setting permissions at a high category level) * Added unit tests git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@88358 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../FilePlanPermissionServiceImplTest.java | 812 +++++++++++------- .../test/util/BaseRMTestCase.java | 20 +- 2 files changed, 536 insertions(+), 296 deletions(-) diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java index 1d48609319..ef8d4398b5 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java @@ -103,21 +103,21 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase } /** - * test set/delete permissions on file plan + * Test set/delete permissions on file plan */ public void testSetDeletePermissionFilePlan() throws Exception { String userName = createTestUser(); assertPermissions(userName, - AccessStatus.ALLOWED, // fileplan read - AccessStatus.DENIED, // fileplan file - AccessStatus.DENIED, // category read - AccessStatus.DENIED, // category file - AccessStatus.DENIED, // record folder read - AccessStatus.DENIED, // record folder file - AccessStatus.DENIED, // record read - AccessStatus.DENIED); // record file + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.DENIED, // category read + AccessStatus.DENIED, // category file + AccessStatus.DENIED, // record folder read + AccessStatus.DENIED, // record folder file + AccessStatus.DENIED, // record read + AccessStatus.DENIED); // record file setPermission(filePlan, userName, RMPermissionModel.FILING); @@ -134,28 +134,28 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase deletePermission(filePlan, userName, RMPermissionModel.FILING); assertPermissions(userName, - AccessStatus.ALLOWED, // fileplan read - AccessStatus.DENIED, // fileplan file - AccessStatus.DENIED, // category read - AccessStatus.DENIED, // category file - AccessStatus.DENIED, // record folder read - AccessStatus.DENIED, // record folder file - AccessStatus.DENIED, // record read - AccessStatus.DENIED); // record file + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.DENIED, // category read + AccessStatus.DENIED, // category file + AccessStatus.DENIED, // record folder read + AccessStatus.DENIED, // record folder file + AccessStatus.DENIED, // record read + AccessStatus.DENIED); // record file //what happens if we try and remove READ for a normal user on the file plan ??? deletePermission(filePlan, userName, RMPermissionModel.READ_RECORDS); // nothing .. user still has read on file plan .. only removing the user from all roles will remove read on file plan assertPermissions(userName, - AccessStatus.ALLOWED, // fileplan read - AccessStatus.DENIED, // fileplan file - AccessStatus.DENIED, // category read - AccessStatus.DENIED, // category file - AccessStatus.DENIED, // record folder read - AccessStatus.DENIED, // record folder file - AccessStatus.DENIED, // record read - AccessStatus.DENIED); // record file + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.DENIED, // category read + AccessStatus.DENIED, // category file + AccessStatus.DENIED, // record folder read + AccessStatus.DENIED, // record folder file + AccessStatus.DENIED, // record read + AccessStatus.DENIED); // record file } /** @@ -166,38 +166,38 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase String userName = createTestUser(); assertPermissions(userName, - AccessStatus.ALLOWED, // fileplan read - AccessStatus.DENIED, // fileplan file - AccessStatus.DENIED, // category read - AccessStatus.DENIED, // category file - AccessStatus.DENIED, // record folder read - AccessStatus.DENIED, // record folder file - AccessStatus.DENIED, // record read - AccessStatus.DENIED); // record file + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.DENIED, // category read + AccessStatus.DENIED, // category file + AccessStatus.DENIED, // record folder read + AccessStatus.DENIED, // record folder file + AccessStatus.DENIED, // record read + AccessStatus.DENIED); // record file setPermission(rmContainer, userName, RMPermissionModel.FILING); assertPermissions(userName, - AccessStatus.ALLOWED, // fileplan read - AccessStatus.DENIED, // fileplan file - AccessStatus.ALLOWED, // category read - AccessStatus.ALLOWED, // category file - AccessStatus.ALLOWED, // record folder read - AccessStatus.ALLOWED, // record folder file - AccessStatus.ALLOWED, // record read - AccessStatus.ALLOWED); // record file + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.ALLOWED, // category read + AccessStatus.ALLOWED, // category file + AccessStatus.ALLOWED, // record folder read + AccessStatus.ALLOWED, // record folder file + AccessStatus.ALLOWED, // record read + AccessStatus.ALLOWED); // record file deletePermission(rmContainer, userName, RMPermissionModel.FILING); assertPermissions(userName, - AccessStatus.ALLOWED, // fileplan read - AccessStatus.DENIED, // fileplan file - AccessStatus.DENIED, // category read - AccessStatus.DENIED, // category file - AccessStatus.DENIED, // record folder read - AccessStatus.DENIED, // record folder file - AccessStatus.DENIED, // record read - AccessStatus.DENIED); // record file + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.DENIED, // category read + AccessStatus.DENIED, // category file + AccessStatus.DENIED, // record folder read + AccessStatus.DENIED, // record folder file + AccessStatus.DENIED, // record read + AccessStatus.DENIED); // record file } /** @@ -208,38 +208,38 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase String userName = createTestUser(); assertPermissions(userName, - AccessStatus.ALLOWED, // fileplan read - AccessStatus.DENIED, // fileplan file - AccessStatus.DENIED, // category read - AccessStatus.DENIED, // category file - AccessStatus.DENIED, // record folder read - AccessStatus.DENIED, // record folder file - AccessStatus.DENIED, // record read - AccessStatus.DENIED); // record file + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.DENIED, // category read + AccessStatus.DENIED, // category file + AccessStatus.DENIED, // record folder read + AccessStatus.DENIED, // record folder file + AccessStatus.DENIED, // record read + AccessStatus.DENIED); // record file setPermission(rmFolder, userName, RMPermissionModel.FILING); assertPermissions(userName, - AccessStatus.ALLOWED, // fileplan read - AccessStatus.DENIED, // fileplan file - AccessStatus.DENIED, // category read - AccessStatus.DENIED, // category file - AccessStatus.ALLOWED, // record folder read - AccessStatus.ALLOWED, // record folder file - AccessStatus.ALLOWED, // record read - AccessStatus.ALLOWED); // record file + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.DENIED, // category read + AccessStatus.DENIED, // category file + AccessStatus.ALLOWED, // record folder read + AccessStatus.ALLOWED, // record folder file + AccessStatus.ALLOWED, // record read + AccessStatus.ALLOWED); // record file deletePermission(rmFolder, userName, RMPermissionModel.FILING); assertPermissions(userName, - AccessStatus.ALLOWED, // fileplan read - AccessStatus.DENIED, // fileplan file - AccessStatus.DENIED, // category read - AccessStatus.DENIED, // category file - AccessStatus.DENIED, // record folder read - AccessStatus.DENIED, // record folder file - AccessStatus.DENIED, // record read - AccessStatus.DENIED); // record file + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.DENIED, // category read + AccessStatus.DENIED, // category file + AccessStatus.DENIED, // record folder read + AccessStatus.DENIED, // record folder file + AccessStatus.DENIED, // record read + AccessStatus.DENIED); // record file } /** @@ -250,38 +250,38 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase String userName = createTestUser(); assertPermissions(userName, - AccessStatus.ALLOWED, // fileplan read - AccessStatus.DENIED, // fileplan file - AccessStatus.DENIED, // category read - AccessStatus.DENIED, // category file - AccessStatus.DENIED, // record folder read - AccessStatus.DENIED, // record folder file - AccessStatus.DENIED, // record read - AccessStatus.DENIED); // record file + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.DENIED, // category read + AccessStatus.DENIED, // category file + AccessStatus.DENIED, // record folder read + AccessStatus.DENIED, // record folder file + AccessStatus.DENIED, // record read + AccessStatus.DENIED); // record file setPermission(recordOne, userName, RMPermissionModel.FILING); assertPermissions(userName, - AccessStatus.ALLOWED, // fileplan read - AccessStatus.DENIED, // fileplan file - AccessStatus.DENIED, // category read - AccessStatus.DENIED, // category file - AccessStatus.DENIED, // record folder read - AccessStatus.DENIED, // record folder file - AccessStatus.ALLOWED, // record read - AccessStatus.ALLOWED); // record file + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.DENIED, // category read + AccessStatus.DENIED, // category file + AccessStatus.DENIED, // record folder read + AccessStatus.DENIED, // record folder file + AccessStatus.ALLOWED, // record read + AccessStatus.ALLOWED); // record file deletePermission(recordOne, userName, RMPermissionModel.FILING); assertPermissions(userName, - AccessStatus.ALLOWED, // fileplan read - AccessStatus.DENIED, // fileplan file - AccessStatus.DENIED, // category read - AccessStatus.DENIED, // category file - AccessStatus.DENIED, // record folder read - AccessStatus.DENIED, // record folder file - AccessStatus.DENIED, // record read - AccessStatus.DENIED); // record file + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.DENIED, // category read + AccessStatus.DENIED, // category file + AccessStatus.DENIED, // record folder read + AccessStatus.DENIED, // record folder file + AccessStatus.DENIED, // record read + AccessStatus.DENIED); // record file } public void testMoveRecord() throws Exception @@ -300,14 +300,15 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase }); assertPermissions(userOne, - AccessStatus.ALLOWED, // fileplan read - AccessStatus.DENIED, // fileplan file - AccessStatus.DENIED, // category read - AccessStatus.DENIED, // category file - AccessStatus.DENIED, // record folder read - AccessStatus.DENIED, // record folder file - AccessStatus.DENIED, // record read - AccessStatus.DENIED); // record file + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.DENIED, // category read + AccessStatus.DENIED, // category file + AccessStatus.DENIED, // record folder read + AccessStatus.DENIED, // record folder file + AccessStatus.DENIED, // record read + AccessStatus.DENIED); // record file + doTestInTransaction(new Test() { @Override @@ -318,15 +319,17 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase return null; } }, userOne); + assertPermissions(userTwo, - AccessStatus.ALLOWED, // fileplan read - AccessStatus.DENIED, // fileplan file - AccessStatus.DENIED, // category read - AccessStatus.DENIED, // category file - AccessStatus.DENIED, // record folder read - AccessStatus.DENIED, // record folder file - AccessStatus.DENIED, // record read - AccessStatus.DENIED); // record file + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.DENIED, // category read + AccessStatus.DENIED, // category file + AccessStatus.DENIED, // record folder read + AccessStatus.DENIED, // record folder file + AccessStatus.DENIED, // record read + AccessStatus.DENIED); // record file + doTestInTransaction(new Test() { @Override @@ -337,15 +340,17 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase return null; } }, userTwo); + assertPermissions(userThree, - AccessStatus.ALLOWED, // fileplan read - AccessStatus.DENIED, // fileplan file - AccessStatus.DENIED, // category read - AccessStatus.DENIED, // category file - AccessStatus.DENIED, // record folder read - AccessStatus.DENIED, // record folder file - AccessStatus.DENIED, // record read - AccessStatus.DENIED); // record file + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.DENIED, // category read + AccessStatus.DENIED, // category file + AccessStatus.DENIED, // record folder read + AccessStatus.DENIED, // record folder file + AccessStatus.DENIED, // record read + AccessStatus.DENIED); // record file + doTestInTransaction(new Test() { @Override @@ -362,14 +367,15 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase setPermission(recordOne, userThree, RMPermissionModel.FILING); assertPermissions(userOne, - AccessStatus.ALLOWED, // fileplan read - AccessStatus.DENIED, // fileplan file - AccessStatus.DENIED, // category read - AccessStatus.DENIED, // category file - AccessStatus.ALLOWED, // record folder read - AccessStatus.ALLOWED, // record folder file - AccessStatus.ALLOWED, // record read - AccessStatus.ALLOWED); // record file + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.DENIED, // category read + AccessStatus.DENIED, // category file + AccessStatus.ALLOWED, // record folder read + AccessStatus.ALLOWED, // record folder file + AccessStatus.ALLOWED, // record read + AccessStatus.ALLOWED); // record file + doTestInTransaction(new Test() { @Override @@ -380,15 +386,17 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase return null; } }, userOne); + assertPermissions(userTwo, - AccessStatus.ALLOWED, // fileplan read - AccessStatus.DENIED, // fileplan file - AccessStatus.DENIED, // category read - AccessStatus.DENIED, // category file - AccessStatus.DENIED, // record folder read - AccessStatus.DENIED, // record folder file - AccessStatus.DENIED, // record read - AccessStatus.DENIED); // record file + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.DENIED, // category read + AccessStatus.DENIED, // category file + AccessStatus.DENIED, // record folder read + AccessStatus.DENIED, // record folder file + AccessStatus.DENIED, // record read + AccessStatus.DENIED); // record file + doTestInTransaction(new Test() { @Override @@ -399,15 +407,17 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase return null; } }, userTwo); + assertPermissions(userThree, - AccessStatus.ALLOWED, // fileplan read - AccessStatus.DENIED, // fileplan file - AccessStatus.DENIED, // category read - AccessStatus.DENIED, // category file - AccessStatus.DENIED, // record folder read - AccessStatus.DENIED, // record folder file - AccessStatus.ALLOWED, // record read - AccessStatus.ALLOWED); // record file + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.DENIED, // category read + AccessStatus.DENIED, // category file + AccessStatus.DENIED, // record folder read + AccessStatus.DENIED, // record folder file + AccessStatus.ALLOWED, // record read + AccessStatus.ALLOWED); // record file + doTestInTransaction(new Test() { @Override @@ -431,14 +441,15 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase }); assertPermissions(userOne, - AccessStatus.ALLOWED, // fileplan read - AccessStatus.DENIED, // fileplan file - AccessStatus.DENIED, // category read - AccessStatus.DENIED, // category file - AccessStatus.ALLOWED, // record folder read - AccessStatus.ALLOWED, // record folder file - AccessStatus.DENIED, // record read - AccessStatus.DENIED); // record file + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.DENIED, // category read + AccessStatus.DENIED, // category file + AccessStatus.ALLOWED, // record folder read + AccessStatus.ALLOWED, // record folder file + AccessStatus.DENIED, // record read + AccessStatus.DENIED); // record file + doTestInTransaction(new Test() { @Override @@ -449,15 +460,17 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase return null; } }, userOne); + assertPermissions(userTwo, - AccessStatus.ALLOWED, // fileplan read - AccessStatus.DENIED, // fileplan file - AccessStatus.DENIED, // category read - AccessStatus.DENIED, // category file - AccessStatus.DENIED, // record folder read - AccessStatus.DENIED, // record folder file - AccessStatus.ALLOWED, // record read - AccessStatus.ALLOWED); // record file + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.DENIED, // category read + AccessStatus.DENIED, // category file + AccessStatus.DENIED, // record folder read + AccessStatus.DENIED, // record folder file + AccessStatus.ALLOWED, // record read + AccessStatus.ALLOWED); // record file + doTestInTransaction(new Test() { @Override @@ -468,15 +481,17 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase return null; } }, userTwo); + assertPermissions(userThree, - AccessStatus.ALLOWED, // fileplan read - AccessStatus.DENIED, // fileplan file - AccessStatus.DENIED, // category read - AccessStatus.DENIED, // category file - AccessStatus.DENIED, // record folder read - AccessStatus.DENIED, // record folder file - AccessStatus.ALLOWED, // record read - AccessStatus.ALLOWED); // record file + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.DENIED, // category read + AccessStatus.DENIED, // category file + AccessStatus.DENIED, // record folder read + AccessStatus.DENIED, // record folder file + AccessStatus.ALLOWED, // record read + AccessStatus.ALLOWED); // record file + doTestInTransaction(new Test() { @Override @@ -490,7 +505,6 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase } - /** * Helper to assert permissions for passed user */ @@ -521,6 +535,52 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase }, userName); } + /** + * Helper to assert permissions for the passed user + */ + private void assertPermissionsWithInheritance( + final String userName, + final NodeRef subCategory, + final NodeRef folder, + final NodeRef record, + final AccessStatus ... accessStatus) + { + assertEquals(16, accessStatus.length); + + doTestInTransaction(new Test() + { + @Override + public Void run() + { + assertEquals(accessStatus[0], permissionService.hasPermission(filePlan, RMPermissionModel.READ_RECORDS)); + assertEquals(accessStatus[1], permissionService.hasPermission(filePlan, RMPermissionModel.FILING)); + + assertEquals(accessStatus[2], permissionService.hasPermission(transfersContainer, RMPermissionModel.READ_RECORDS)); + assertEquals(accessStatus[3], permissionService.hasPermission(transfersContainer, RMPermissionModel.FILING)); + + assertEquals(accessStatus[4], permissionService.hasPermission(holdsContainer, RMPermissionModel.READ_RECORDS)); + assertEquals(accessStatus[5], permissionService.hasPermission(holdsContainer, RMPermissionModel.FILING)); + + assertEquals(accessStatus[6], permissionService.hasPermission(unfiledContainer, RMPermissionModel.READ_RECORDS)); + assertEquals(accessStatus[7], permissionService.hasPermission(unfiledContainer, RMPermissionModel.FILING)); + + assertEquals(accessStatus[8], permissionService.hasPermission(rmContainer, RMPermissionModel.READ_RECORDS)); + assertEquals(accessStatus[9], permissionService.hasPermission(rmContainer, RMPermissionModel.FILING)); + + assertEquals(accessStatus[10], permissionService.hasPermission(subCategory, RMPermissionModel.READ_RECORDS)); + assertEquals(accessStatus[11], permissionService.hasPermission(subCategory, RMPermissionModel.FILING)); + + assertEquals(accessStatus[12], permissionService.hasPermission(folder, RMPermissionModel.READ_RECORDS)); + assertEquals(accessStatus[13], permissionService.hasPermission(folder, RMPermissionModel.FILING)); + + assertEquals(accessStatus[14], permissionService.hasPermission(record, RMPermissionModel.READ_RECORDS)); + assertEquals(accessStatus[15], permissionService.hasPermission(record, RMPermissionModel.FILING)); + + return null; + } + }, userName); + } + public void testFilePlanComponentInheritance() { doTestInTransaction(new Test() @@ -546,161 +606,331 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase public void testRolesSetByDefault() { - final NodeRef transferContainer = filePlanService.getTransferContainer(filePlan); - final NodeRef holdContainer = filePlanService.getHoldContainer(filePlan); - final NodeRef subCategory = rmService.createRecordFolder(rmContainer, "subCategory"); + NodeRef subCategory = filePlanService.createRecordCategory(rmContainer, "subCategory1"); + NodeRef folder = rmService.createRecordFolder(subCategory, "rmFolder1"); + NodeRef record = utils.createRecord(folder, "record1.txt"); // Admin user has read/filing permissions on file plan, transfer, hold, unfiled records, root categories, sub categories, folders and records - doTestInTransaction(new Test() - { - @Override - public Void run() - { - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(filePlan, RMPermissionModel.FILING)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(filePlan, RMPermissionModel.READ_RECORDS)); + assertPermissionsWithInheritance(rmAdminName, subCategory, folder, record, + AccessStatus.ALLOWED, // fileplan read + AccessStatus.ALLOWED, // fileplan file + AccessStatus.ALLOWED, // transfer read + AccessStatus.ALLOWED, // transfer file + AccessStatus.ALLOWED, // holds read + AccessStatus.ALLOWED, // holds file + AccessStatus.ALLOWED, // unfiled records file + AccessStatus.ALLOWED, // unfiled records file + AccessStatus.ALLOWED, // root category read + AccessStatus.ALLOWED, // root category file + AccessStatus.ALLOWED, // sub category read + AccessStatus.ALLOWED, // sub category file + AccessStatus.ALLOWED, // folder read + AccessStatus.ALLOWED, // folder file + AccessStatus.ALLOWED, // record read + AccessStatus.ALLOWED); // record file - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(transferContainer, RMPermissionModel.FILING)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(transferContainer, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(holdContainer, RMPermissionModel.FILING)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(holdContainer, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(unfiledContainer, RMPermissionModel.FILING)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(unfiledContainer, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(rmContainer, RMPermissionModel.FILING)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(rmContainer, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(subCategory, RMPermissionModel.FILING)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(subCategory, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(rmFolder, RMPermissionModel.FILING)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(rmFolder, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(recordOne, RMPermissionModel.FILING)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(recordOne, RMPermissionModel.READ_RECORDS)); - - return null; - } - }, rmAdminName); - - // test user has read permissions on file plan, transfer, hold and unfiled records as the user will be added in the all records management roles + // Test user has read permissions on file plan, transfer, hold and unfiled records as the user will be added in the all records management roles // which has read permissions on those nodes by default - doTestInTransaction(new Test() - { - @Override - public Void run() - { - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(filePlan, RMPermissionModel.FILING)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(filePlan, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(transferContainer, RMPermissionModel.FILING)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(transferContainer, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(holdContainer, RMPermissionModel.FILING)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(holdContainer, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(unfiledContainer, RMPermissionModel.FILING)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(unfiledContainer, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(rmContainer, RMPermissionModel.FILING)); - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(rmContainer, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory, RMPermissionModel.FILING)); - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(rmFolder, RMPermissionModel.FILING)); - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(rmFolder, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(recordOne, RMPermissionModel.FILING)); - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(recordOne, RMPermissionModel.READ_RECORDS)); - - return null; - } - }, createTestUser()); + assertPermissionsWithInheritance(createTestUser(), subCategory, folder, record, + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.ALLOWED, // transfer read + AccessStatus.DENIED, // transfer file + AccessStatus.ALLOWED, // holds read + AccessStatus.DENIED, // holds file + AccessStatus.ALLOWED, // unfiled records file + AccessStatus.DENIED, // unfiled records file + AccessStatus.DENIED, // root category read + AccessStatus.DENIED, // root category file + AccessStatus.DENIED, // sub category read + AccessStatus.DENIED, // sub category file + AccessStatus.DENIED, // folder read + AccessStatus.DENIED, // folder file + AccessStatus.DENIED, // record read + AccessStatus.DENIED); // record file } public void testAddUserToContainers() { - final NodeRef transferContainer = filePlanService.getTransferContainer(filePlan); - final NodeRef holdContainer = filePlanService.getHoldContainer(filePlan); - final NodeRef subCategory = rmService.createRecordFolder(rmContainer, "subCategory"); + NodeRef subCategory = filePlanService.createRecordCategory(rmContainer, "subCategory2"); + NodeRef folder = rmService.createRecordFolder(subCategory, "rmFolder2"); + NodeRef record = utils.createRecord(folder, "record2.txt"); + + // The user1 will have read permissions on the file plan + // and read permissions on transfer, hold and unfiled records as the user will be in the all records management users role + String user1 = createTestUser(); + setPermission(filePlan, user1, RMPermissionModel.READ_RECORDS); + assertPermissionsWithInheritance(user1, subCategory, folder, record, + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.ALLOWED, // transfer read + AccessStatus.DENIED, // transfer file + AccessStatus.ALLOWED, // holds read + AccessStatus.DENIED, // holds file + AccessStatus.ALLOWED, // unfiled records file + AccessStatus.DENIED, // unfiled records file + AccessStatus.DENIED, // root category read + AccessStatus.DENIED, // root category file + AccessStatus.DENIED, // sub category read + AccessStatus.DENIED, // sub category file + AccessStatus.DENIED, // folder read + AccessStatus.DENIED, // folder file + AccessStatus.DENIED, // record read + AccessStatus.DENIED); // record file + + // The user2 will have read and filing permissions on the transfer container + // and read permissions on file plan, hold and unfiled records as the user will be in the all records management users role + String user2 = createTestUser(); + setPermission(transfersContainer, user2, RMPermissionModel.FILING); + assertPermissionsWithInheritance(user2, subCategory, folder, record, + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.ALLOWED, // transfer read + AccessStatus.ALLOWED, // transfer file + AccessStatus.ALLOWED, // holds read + AccessStatus.DENIED, // holds file + AccessStatus.ALLOWED, // unfiled records file + AccessStatus.DENIED, // unfiled records file + AccessStatus.DENIED, // root category read + AccessStatus.DENIED, // root category file + AccessStatus.DENIED, // sub category read + AccessStatus.DENIED, // sub category file + AccessStatus.DENIED, // folder read + AccessStatus.DENIED, // folder file + AccessStatus.DENIED, // record read + AccessStatus.DENIED); // record file + + // The user3 will have read permissions on file plan, transfer, hold and unfiled records + String user3 = createTestUser(); + setPermission(holdsContainer, user3, RMPermissionModel.READ_RECORDS); + assertPermissionsWithInheritance(user3, subCategory, folder, record, + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.ALLOWED, // transfer read + AccessStatus.DENIED, // transfer file + AccessStatus.ALLOWED, // holds read + AccessStatus.DENIED, // holds file + AccessStatus.ALLOWED, // unfiled records file + AccessStatus.DENIED, // unfiled records file + AccessStatus.DENIED, // root category read + AccessStatus.DENIED, // root category file + AccessStatus.DENIED, // sub category read + AccessStatus.DENIED, // sub category file + AccessStatus.DENIED, // folder read + AccessStatus.DENIED, // folder file + AccessStatus.DENIED, // record read + AccessStatus.DENIED); // record file + + // The user4 will have read permissions on file plan, transfer, hold + // and read and filing permissions on unfiled records container + String user4 = createTestUser(); + setPermission(unfiledContainer, user4, RMPermissionModel.FILING); + assertPermissionsWithInheritance(user4, subCategory, folder, record, + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.ALLOWED, // transfer read + AccessStatus.DENIED, // transfer file + AccessStatus.ALLOWED, // holds read + AccessStatus.DENIED, // holds file + AccessStatus.ALLOWED, // unfiled records file + AccessStatus.ALLOWED, // unfiled records file + AccessStatus.DENIED, // root category read + AccessStatus.DENIED, // root category file + AccessStatus.DENIED, // sub category read + AccessStatus.DENIED, // sub category file + AccessStatus.DENIED, // folder read + AccessStatus.DENIED, // folder file + AccessStatus.DENIED, // record read + AccessStatus.DENIED); // record file + + // The user5 will read permissions on the root category + // as the inheritance is turned on for the sub category the user will have also read permissions on sub category, folder and record + // and also read permissions on file plan, transfer, hold and unfiled records + String user5 = createTestUser(); + setPermission(rmContainer, user5, RMPermissionModel.READ_RECORDS); + assertPermissionsWithInheritance(user5, subCategory, folder, record, + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.ALLOWED, // transfer read + AccessStatus.DENIED, // transfer file + AccessStatus.ALLOWED, // holds read + AccessStatus.DENIED, // holds file + AccessStatus.ALLOWED, // unfiled records file + AccessStatus.DENIED, // unfiled records file + AccessStatus.ALLOWED, // root category read + AccessStatus.DENIED, // root category file + AccessStatus.ALLOWED, // sub category read + AccessStatus.DENIED, // sub category file + AccessStatus.ALLOWED, // folder read + AccessStatus.DENIED, // folder file + AccessStatus.ALLOWED, // record read + AccessStatus.DENIED); // record file + + // The user6 will read and filing permissions on the sub category + // as the inheritance is turned on the user will have also read and filing permissions on folder and record + // and also read permissions on file plan, transfer, hold and unfiled records + String user6 = createTestUser(); + setPermission(subCategory, user6, RMPermissionModel.FILING); + assertPermissionsWithInheritance(user6, subCategory, folder, record, + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.ALLOWED, // transfer read + AccessStatus.DENIED, // transfer file + AccessStatus.ALLOWED, // holds read + AccessStatus.DENIED, // holds file + AccessStatus.ALLOWED, // unfiled records file + AccessStatus.DENIED, // unfiled records file + AccessStatus.DENIED, // root category read + AccessStatus.DENIED, // root category file + AccessStatus.ALLOWED, // sub category read + AccessStatus.ALLOWED, // sub category file + AccessStatus.ALLOWED, // folder read + AccessStatus.ALLOWED, // folder file + AccessStatus.ALLOWED, // record read + AccessStatus.ALLOWED); // record file + + // The user7 will read permissions on the folder + // as the inheritance is turned on the user will have also read on record + // and also read permissions on file plan, transfer, hold and unfiled records + String user7 = createTestUser(); + setPermission(folder, user7, RMPermissionModel.READ_RECORDS); + assertPermissionsWithInheritance(user7, subCategory, folder, record, + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.ALLOWED, // transfer read + AccessStatus.DENIED, // transfer file + AccessStatus.ALLOWED, // holds read + AccessStatus.DENIED, // holds file + AccessStatus.ALLOWED, // unfiled records file + AccessStatus.DENIED, // unfiled records file + AccessStatus.DENIED, // root category read + AccessStatus.DENIED, // root category file + AccessStatus.DENIED, // sub category read + AccessStatus.DENIED, // sub category file + AccessStatus.ALLOWED, // folder read + AccessStatus.DENIED, // folder file + AccessStatus.ALLOWED, // record read + AccessStatus.DENIED); // record file + + // The user8 will read and filing permissions on the record + // and also read permissions on file plan, transfer, hold and unfiled records + String user8 = createTestUser(); + setPermission(record, user8, RMPermissionModel.FILING); + assertPermissionsWithInheritance(user8, subCategory, folder, record, + AccessStatus.ALLOWED, // fileplan read + AccessStatus.DENIED, // fileplan file + AccessStatus.ALLOWED, // transfer read + AccessStatus.DENIED, // transfer file + AccessStatus.ALLOWED, // holds read + AccessStatus.DENIED, // holds file + AccessStatus.ALLOWED, // unfiled records file + AccessStatus.DENIED, // unfiled records file + AccessStatus.DENIED, // root category read + AccessStatus.DENIED, // root category file + AccessStatus.DENIED, // sub category read + AccessStatus.DENIED, // sub category file + AccessStatus.DENIED, // folder read + AccessStatus.DENIED, // folder file + AccessStatus.ALLOWED, // record read + AccessStatus.ALLOWED); // record file + } + + public void testAccessPermissionOnSingleRecordWithSeveralUsers() + { + final NodeRef subCategory = filePlanService.createRecordCategory(rmContainer, "subCategory3"); + final NodeRef folder = rmService.createRecordFolder(subCategory, "rmFolder3"); + final NodeRef record = utils.createRecord(folder, "record3.txt"); String user1 = createTestUser(); - filePlanPermissionService.setPermission(filePlan, user1, RMPermissionModel.FILING); + String user2 = createTestUser(); - // The user1 will just read and filing permissions on the file plan - // and read permissions on transfer, hold and unfiled records as the user will be in the all records management users role + setPermission(rmContainer, user1, RMPermissionModel.READ_RECORDS); + + // user1 will have access to file plan, root category and because of inheritance sub category, folder and record doTestInTransaction(new Test() { @Override public Void run() { - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(filePlan, RMPermissionModel.FILING)); assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(filePlan, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(transferContainer, RMPermissionModel.FILING)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(transferContainer, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(holdContainer, RMPermissionModel.FILING)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(holdContainer, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(unfiledContainer, RMPermissionModel.FILING)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(unfiledContainer, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(rmContainer, RMPermissionModel.FILING)); - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(rmContainer, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory, RMPermissionModel.FILING)); - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(rmFolder, RMPermissionModel.FILING)); - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(rmFolder, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(recordOne, RMPermissionModel.FILING)); - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(recordOne, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(rmContainer, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(subCategory, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(folder, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record, RMPermissionModel.READ_RECORDS)); return null; } }, user1); - String user2 = createTestUser(); - filePlanPermissionService.setPermission(unfiledContainer, user2, RMPermissionModel.FILING); - - // The user2 will just read permissions on file plan, transfer, hold - // and read and filing permissions on unfiled records container + // user2 will have access to file plan doTestInTransaction(new Test() { @Override public Void run() { - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(filePlan, RMPermissionModel.FILING)); assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(filePlan, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(transferContainer, RMPermissionModel.FILING)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(transferContainer, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(holdContainer, RMPermissionModel.FILING)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(holdContainer, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(unfiledContainer, RMPermissionModel.FILING)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(unfiledContainer, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(rmContainer, RMPermissionModel.FILING)); assertEquals(AccessStatus.DENIED, permissionService.hasPermission(rmContainer, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory, RMPermissionModel.FILING)); assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(rmFolder, RMPermissionModel.FILING)); - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(rmFolder, RMPermissionModel.READ_RECORDS)); - - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(recordOne, RMPermissionModel.FILING)); - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(recordOne, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(folder, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record, RMPermissionModel.READ_RECORDS)); return null; } }, user2); } + public void testDenyPermissionsOnRecordsWithSeveralUsers() + { + final NodeRef subCategory = filePlanService.createRecordCategory(rmContainer, "subCategory4"); + final NodeRef folder = rmService.createRecordFolder(subCategory, "rmFolder4"); + final NodeRef record4 = utils.createRecord(folder, "record4.txt"); + final NodeRef record5 = utils.createRecord(folder, "record5.txt"); + + String user1 = createTestUser(); + String user2 = createTestUser(); + + setPermission(rmContainer, user1, RMPermissionModel.READ_RECORDS); + setPermission(rmContainer, user2, RMPermissionModel.READ_RECORDS); + + permissionService.setInheritParentPermissions(record4, false); + permissionService.setInheritParentPermissions(record5, false); + + setPermission(record4, user1, RMPermissionModel.READ_RECORDS); + setPermission(record5, user1, RMPermissionModel.READ_RECORDS); + + // user1 will have access to file plan, root category and because of inheritance sub category, folder, record4 and record5 + doTestInTransaction(new Test() + { + @Override + public Void run() + { + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(filePlan, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(rmContainer, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(subCategory, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(folder, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record4, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record5, RMPermissionModel.READ_RECORDS)); + + return null; + } + }, user1); + + // user2 will have access to file plan, root category and because of inheritance sub category and folder + // user2 won't have access to the records as the inheritance is set to false + doTestInTransaction(new Test() + { + @Override + public Void run() + { + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(filePlan, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(rmContainer, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(subCategory, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(folder, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record4, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record5, RMPermissionModel.READ_RECORDS)); + + return null; + } + }, user2); + } } diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java index 520b9b7d94..26adac22f5 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java @@ -151,6 +151,8 @@ public abstract class BaseRMTestCase extends RetryingTransactionHelperTestCase protected DispositionSchedule dispositionSchedule; protected NodeRef rmFolder; protected NodeRef unfiledContainer; + protected NodeRef holdsContainer; + protected NodeRef transfersContainer; /** multi-hierarchy test data * @@ -295,7 +297,7 @@ public abstract class BaseRMTestCase extends RetryingTransactionHelperTestCase // Get the application context applicationContext = ApplicationContextHelper.getApplicationContext(CONFIG_LOCATIONS); utils = new CommonRMTestUtils(applicationContext); - + // Initialise the service beans initServices(); @@ -414,19 +416,19 @@ public abstract class BaseRMTestCase extends RetryingTransactionHelperTestCase freezeService.relinquish(hold); } } - + if (nodeService.exists(folder) == true) { // Delete the folder nodeService.deleteNode(folder); } - + if (siteService.getSite(siteId) != null) { // Delete the site siteService.deleteSite(siteId); } - + // delete the collaboration site (if required) if (isCollaborationSiteTest() == true && siteService.getSite(COLLABORATION_SITE_ID) != null) { @@ -480,6 +482,14 @@ public abstract class BaseRMTestCase extends RetryingTransactionHelperTestCase // unfiled container unfiledContainer = filePlanService.getUnfiledContainer(filePlan); assertNotNull(unfiledContainer); + + // holds container + holdsContainer = filePlanService.getHoldContainer(filePlan); + assertNotNull(holdsContainer); + + // transfers container + transfersContainer = filePlanService.getTransferContainer(filePlan); + assertNotNull(transfersContainer); } }, AuthenticationUtil.getSystemUserName()); } @@ -510,7 +520,7 @@ public abstract class BaseRMTestCase extends RetryingTransactionHelperTestCase ContentModel.TYPE_FOLDER, containerProps).getChildRef(); assertNotNull("Could not create base folder", folder); - + permissionService.setPermission(folder, "rmadmin", PermissionService.WRITE, true); permissionService.setPermission(folder, "rmadmin", PermissionService.ADD_CHILDREN, true); From 3a550eb89719ec1aec23304cdf8a0eb124a3ee04 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Fri, 17 Oct 2014 18:25:41 +0000 Subject: [PATCH 40/54] RM-1742 (Locally Set Permissions for moved Record duplicate parent folder Locally Set Permissions) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@88685 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../FilePlanPermissionServiceImpl.java | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java index aa6391f52a..dd0e9ea9f4 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java @@ -361,25 +361,22 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl public Void doWork() { NodeRef record = sourceAssocRef.getChildRef(); - if (nodeService.exists(record) == true && nodeService.hasAspect(record, ASPECT_RECORD) == true) + if (nodeService.exists(record) && nodeService.hasAspect(record, ASPECT_RECORD)) { Set keepPerms = new HashSet(5); - - // record any permissions specifically set on the record (ie any filling or record_file permisions not on the parent) - Set origionalParentPerms = permissionService.getAllSetPermissions(sourceAssocRef.getParentRef()); Set origionalRecordPerms= permissionService.getAllSetPermissions(record); - for (AccessPermission perm : origionalRecordPerms) + + for (AccessPermission recordPermission : origionalRecordPerms) { - if (ExtendedReaderDynamicAuthority.EXTENDED_READER.equals(perm.getAuthority()) == false && - ExtendedWriterDynamicAuthority.EXTENDED_WRITER.equals(perm.getAuthority()) == false) + String permission = recordPermission.getPermission(); + String authority = recordPermission.getAuthority(); + if ((RMPermissionModel.FILING.equals(permission) || RMPermissionModel.READ_RECORDS.equals(permission)) && + recordPermission.isSetDirectly() && + !ExtendedReaderDynamicAuthority.EXTENDED_READER.equals(authority) && + !ExtendedWriterDynamicAuthority.EXTENDED_WRITER.equals(authority)) { - if ((perm.getPermission().equals(RMPermissionModel.FILING) == true || - perm.getPermission().equals(RMPermissionModel.FILE_RECORDS) == true) && - origionalParentPerms.contains(perm) == false) - { - // then we can assume this is a permission we want to preserve - keepPerms.add(perm); - } + // then we can assume this is a permission we want to preserve + keepPerms.add(recordPermission); } } From cd3e693b65647b2f4575cf2af131c65c87c70cc3 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Fri, 17 Oct 2014 18:26:26 +0000 Subject: [PATCH 41/54] RM-1741 (Moved root category doesn't inherit permissions) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@88686 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../FilePlanPermissionServiceImpl.java | 57 ++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java index dd0e9ea9f4..5f4071d235 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java @@ -34,6 +34,7 @@ import org.alfresco.repo.policy.Behaviour.NotificationFrequency; import org.alfresco.repo.policy.JavaBehaviour; import org.alfresco.repo.policy.PolicyComponent; import org.alfresco.repo.security.authentication.AuthenticationUtil; +import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; @@ -53,7 +54,8 @@ import org.apache.commons.logging.LogFactory; */ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl implements FilePlanPermissionService, - RecordsManagementModel + RecordsManagementModel, + NodeServicePolicies.OnMoveNodePolicy { /** Permission service */ protected PermissionService permissionService; @@ -82,6 +84,10 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl NodeServicePolicies.OnCreateNodePolicy.QNAME, TYPE_RECORD_CATEGORY, new JavaBehaviour(this, "onCreateRMContainer", NotificationFrequency.TRANSACTION_COMMIT)); + policyComponent.bindClassBehaviour( + NodeServicePolicies.OnMoveNodePolicy.QNAME, + TYPE_RECORD_CATEGORY, + new JavaBehaviour(this, "onMoveNode", NotificationFrequency.TRANSACTION_COMMIT)); policyComponent.bindClassBehaviour( NodeServicePolicies.OnCreateNodePolicy.QNAME, TYPE_RECORD_FOLDER, @@ -312,6 +318,55 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl }); } + /** + * @see org.alfresco.repo.node.NodeServicePolicies.OnMoveNodePolicy#onMoveNode(org.alfresco.service.cmr.repository.ChildAssociationRef, org.alfresco.service.cmr.repository.ChildAssociationRef) + */ + @Override + public void onMoveNode(final ChildAssociationRef oldChildAssocRef, final ChildAssociationRef newChildAssocRef) + { + AuthenticationUtil.runAs(new RunAsWork() + { + @Override + public Void doWork() throws Exception + { + NodeRef sourceCategory = oldChildAssocRef.getChildRef(); + boolean inheritParentPermissions = permissionService.getInheritParentPermissions(sourceCategory); + if (!inheritParentPermissions) + { + permissionService.setInheritParentPermissions(sourceCategory, true); + } + + Set keepPerms = new HashSet(5); + Set origionalCategoryPerms= permissionService.getAllSetPermissions(sourceCategory); + + for (AccessPermission categoryPermission : origionalCategoryPerms) + { + String permission = categoryPermission.getPermission(); + String authority = categoryPermission.getAuthority(); + if ((RMPermissionModel.FILING.equals(permission) || RMPermissionModel.READ_RECORDS.equals(permission)) && + categoryPermission.isSetDirectly() && + !ExtendedReaderDynamicAuthority.EXTENDED_READER.equals(authority) && + !ExtendedWriterDynamicAuthority.EXTENDED_WRITER.equals(authority)) + { + // then we can assume this is a permission we want to preserve + keepPerms.add(categoryPermission); + } + } + + // clear all existing permissions and start again + permissionService.deletePermissions(sourceCategory); + + // re-add keep'er permissions + for (AccessPermission keeper : keepPerms) + { + setPermission(sourceCategory, keeper.getAuthority(), keeper.getPermission()); + } + + return null; + } + }, AuthenticationUtil.getSystemUserName()); + } + /** * Initialise the record permissions for the given parent. * From f9a6ec3bdac0a67595e9f61882951428d84156a5 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Fri, 17 Oct 2014 20:04:51 +0000 Subject: [PATCH 42/54] RM-1741 (Moved root category doesn't inherit permissions) * Unit test added git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@88687 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../FilePlanPermissionServiceImplTest.java | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java index ef8d4398b5..071ad72aec 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java @@ -933,4 +933,77 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase } }, user2); } + + public void testMoveRootCategoryIntoAnotherRootCategory() + { + final NodeRef subCategory5 = filePlanService.createRecordCategory(filePlan, "subCategory5"); + final NodeRef subCategory6 = filePlanService.createRecordCategory(filePlan, "subCategory6"); + + assertFalse(permissionService.getInheritParentPermissions(subCategory5)); + assertFalse(permissionService.getInheritParentPermissions(subCategory6)); + + final String user1 = createTestUser(); + final String user2 = createTestUser(); + + setPermission(subCategory5, user1, RMPermissionModel.READ_RECORDS); + setPermission(subCategory6, user2, RMPermissionModel.FILING); + + doTestInTransaction(new Test() + { + @Override + public Void run() + { + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(subCategory5, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory5, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory6, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory6, RMPermissionModel.FILING)); + + return null; + } + }, user1); + + doTestInTransaction(new Test() + { + @Override + public Void run() + { + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory5, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory5, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(subCategory6, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(subCategory6, RMPermissionModel.FILING)); + + return null; + } + }, user2); + + doTestInTransaction(new Test() + { + @Override + public NodeRef run() throws Exception + { + return fileFolderService.move(subCategory5, subCategory6, null).getNodeRef(); + } + + @Override + public void test(final NodeRef movedSubCategory5) throws Exception + { + assertTrue(permissionService.getInheritParentPermissions(movedSubCategory5)); + assertFalse(permissionService.getInheritParentPermissions(subCategory6)); + + AuthenticationUtil.setFullyAuthenticatedUser(user1); + + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(movedSubCategory5, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(movedSubCategory5, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory6, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory6, RMPermissionModel.FILING)); + + AuthenticationUtil.setFullyAuthenticatedUser(user2); + + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(movedSubCategory5, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(movedSubCategory5, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(subCategory6, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(subCategory6, RMPermissionModel.FILING)); + } + }); + } } From b0040d26a441730bbf3874ac84a313e8ea26f118 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Fri, 17 Oct 2014 21:10:09 +0000 Subject: [PATCH 43/54] RM-1742 (Locally Set Permissions for moved Record duplicate parent folder Locally Set Permissions) * Unit test added git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@88688 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../FilePlanPermissionServiceImplTest.java | 201 +++++++++++++++--- 1 file changed, 175 insertions(+), 26 deletions(-) diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java index 071ad72aec..018edf4114 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java @@ -936,27 +936,27 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase public void testMoveRootCategoryIntoAnotherRootCategory() { - final NodeRef subCategory5 = filePlanService.createRecordCategory(filePlan, "subCategory5"); - final NodeRef subCategory6 = filePlanService.createRecordCategory(filePlan, "subCategory6"); + final NodeRef category5 = filePlanService.createRecordCategory(filePlan, "category5"); + final NodeRef category6 = filePlanService.createRecordCategory(filePlan, "category6"); - assertFalse(permissionService.getInheritParentPermissions(subCategory5)); - assertFalse(permissionService.getInheritParentPermissions(subCategory6)); + assertFalse(permissionService.getInheritParentPermissions(category5)); + assertFalse(permissionService.getInheritParentPermissions(category6)); final String user1 = createTestUser(); final String user2 = createTestUser(); - setPermission(subCategory5, user1, RMPermissionModel.READ_RECORDS); - setPermission(subCategory6, user2, RMPermissionModel.FILING); + setPermission(category5, user1, RMPermissionModel.READ_RECORDS); + setPermission(category6, user2, RMPermissionModel.FILING); doTestInTransaction(new Test() { @Override public Void run() { - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(subCategory5, RMPermissionModel.READ_RECORDS)); - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory5, RMPermissionModel.FILING)); - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory6, RMPermissionModel.READ_RECORDS)); - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory6, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(category5, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category5, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category6, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category6, RMPermissionModel.FILING)); return null; } @@ -967,10 +967,10 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase @Override public Void run() { - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory5, RMPermissionModel.READ_RECORDS)); - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory5, RMPermissionModel.FILING)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(subCategory6, RMPermissionModel.READ_RECORDS)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(subCategory6, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category5, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category5, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(category6, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(category6, RMPermissionModel.FILING)); return null; } @@ -981,28 +981,177 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase @Override public NodeRef run() throws Exception { - return fileFolderService.move(subCategory5, subCategory6, null).getNodeRef(); + return fileFolderService.move(category5, category6, null).getNodeRef(); } @Override - public void test(final NodeRef movedSubCategory5) throws Exception + public void test(final NodeRef movedCategory5) throws Exception { - assertTrue(permissionService.getInheritParentPermissions(movedSubCategory5)); - assertFalse(permissionService.getInheritParentPermissions(subCategory6)); + assertTrue(permissionService.getInheritParentPermissions(movedCategory5)); + assertFalse(permissionService.getInheritParentPermissions(category6)); AuthenticationUtil.setFullyAuthenticatedUser(user1); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(movedSubCategory5, RMPermissionModel.READ_RECORDS)); - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(movedSubCategory5, RMPermissionModel.FILING)); - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory6, RMPermissionModel.READ_RECORDS)); - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(subCategory6, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(movedCategory5, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(movedCategory5, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category6, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category6, RMPermissionModel.FILING)); AuthenticationUtil.setFullyAuthenticatedUser(user2); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(movedSubCategory5, RMPermissionModel.READ_RECORDS)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(movedSubCategory5, RMPermissionModel.FILING)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(subCategory6, RMPermissionModel.READ_RECORDS)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(subCategory6, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(movedCategory5, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(movedCategory5, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(category6, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(category6, RMPermissionModel.FILING)); + } + }); + } + + public void testPermissionsForMovedRecord() + { + final NodeRef category7 = filePlanService.createRecordCategory(filePlan, "category7"); + final NodeRef folder7 = rmService.createRecordFolder(category7, "rmFolder7"); + final NodeRef record7 = utils.createRecord(folder7, "record7.txt"); + + final NodeRef category8 = filePlanService.createRecordCategory(filePlan, "category8"); + final NodeRef folder8 = rmService.createRecordFolder(category8, "rmFolder8"); + final NodeRef record8 = utils.createRecord(folder8, "record8.txt"); + + final String user1 = createTestUser(); + final String user2 = createTestUser(); + final String user3 = createTestUser(); + + setPermission(folder7, user1, RMPermissionModel.FILING); + setPermission(record8, user2, RMPermissionModel.READ_RECORDS); + setPermission(category7, user3, RMPermissionModel.FILING); + + doTestInTransaction(new Test() + { + @Override + public Void run() + { + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category7, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category7, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(folder7, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(folder7, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record7, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record7, RMPermissionModel.FILING)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category8, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category8, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(folder8, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(folder8, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record8, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record8, RMPermissionModel.FILING)); + + return null; + } + }, user1); + + doTestInTransaction(new Test() + { + @Override + public Void run() + { + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category7, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category7, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(folder7, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(folder7, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record7, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record7, RMPermissionModel.FILING)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category8, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category8, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(folder8, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(folder8, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record8, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record8, RMPermissionModel.FILING)); + + return null; + } + }, user2); + + doTestInTransaction(new Test() + { + @Override + public Void run() + { + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(category7, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(category7, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(folder7, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(folder7, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record7, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record7, RMPermissionModel.FILING)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category8, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category8, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(folder8, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(folder8, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record8, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record8, RMPermissionModel.FILING)); + + return null; + } + }, user3); + + doTestInTransaction(new Test() + { + @Override + public NodeRef run() throws Exception + { + return fileFolderService.move(record8, folder7, null).getNodeRef(); + } + + @Override + public void test(final NodeRef movedRecord8) throws Exception + { + AuthenticationUtil.setFullyAuthenticatedUser(user1); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category7, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category7, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(folder7, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(folder7, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record7, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record7, RMPermissionModel.FILING)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category8, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category8, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(folder8, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(folder8, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(movedRecord8, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(movedRecord8, RMPermissionModel.FILING)); + + AuthenticationUtil.setFullyAuthenticatedUser(user2); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category7, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category7, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(folder7, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(folder7, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record7, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(record7, RMPermissionModel.FILING)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category8, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category8, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(folder8, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(folder8, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(movedRecord8, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(movedRecord8, RMPermissionModel.FILING)); + + AuthenticationUtil.setFullyAuthenticatedUser(user3); + + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(category7, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(category7, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(folder7, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(folder7, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record7, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(record7, RMPermissionModel.FILING)); + + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category8, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category8, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(folder8, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(folder8, RMPermissionModel.FILING)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(movedRecord8, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(movedRecord8, RMPermissionModel.FILING)); } }); } From 64ee5aa1b7c2858bb35806042fc65ba35d7f4afe Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Mon, 20 Oct 2014 16:05:10 +0000 Subject: [PATCH 44/54] RM-1741 (Moved root category doesn't inherit permissions) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@88772 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../FilePlanPermissionServiceImpl.java | 6 -- .../FilePlanPermissionServiceImplTest.java | 59 ++++++++++++++----- 2 files changed, 43 insertions(+), 22 deletions(-) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java index 5f4071d235..bb8f10f399 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java @@ -499,12 +499,6 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl { if (canPerformPermissionAction(nodeRef)) { - if (RMPermissionModel.FILING.equals(permission)) - { - // Remove record read permission before adding filing permission - permissionService.deletePermission(nodeRef, authority, RMPermissionModel.READ_RECORDS); - } - // Set the permission on the node permissionService.setPermission(nodeRef, authority, permission, true); } diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java index 018edf4114..2a8ddf488f 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java @@ -976,35 +976,45 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase } }, user2); - doTestInTransaction(new Test() + final NodeRef movedCategory5 = doTestInTransaction(new Test() { @Override public NodeRef run() throws Exception { return fileFolderService.move(category5, category6, null).getNodeRef(); } + }); + assertTrue(permissionService.getInheritParentPermissions(movedCategory5)); + assertFalse(permissionService.getInheritParentPermissions(category6)); + + doTestInTransaction(new Test() + { @Override - public void test(final NodeRef movedCategory5) throws Exception + public Void run() { - assertTrue(permissionService.getInheritParentPermissions(movedCategory5)); - assertFalse(permissionService.getInheritParentPermissions(category6)); - - AuthenticationUtil.setFullyAuthenticatedUser(user1); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(movedCategory5, RMPermissionModel.READ_RECORDS)); assertEquals(AccessStatus.DENIED, permissionService.hasPermission(movedCategory5, RMPermissionModel.FILING)); assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category6, RMPermissionModel.READ_RECORDS)); assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category6, RMPermissionModel.FILING)); - AuthenticationUtil.setFullyAuthenticatedUser(user2); + return null; + } + }, user1); + doTestInTransaction(new Test() + { + @Override + public Void run() + { assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(movedCategory5, RMPermissionModel.READ_RECORDS)); assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(movedCategory5, RMPermissionModel.FILING)); assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(category6, RMPermissionModel.READ_RECORDS)); assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(category6, RMPermissionModel.FILING)); + + return null; } - }); + }, user2); } public void testPermissionsForMovedRecord() @@ -1094,19 +1104,20 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase } }, user3); - doTestInTransaction(new Test() + final NodeRef movedRecord8 = doTestInTransaction(new Test() { @Override public NodeRef run() throws Exception { return fileFolderService.move(record8, folder7, null).getNodeRef(); } + }); + doTestInTransaction(new Test() + { @Override - public void test(final NodeRef movedRecord8) throws Exception + public Void run() { - AuthenticationUtil.setFullyAuthenticatedUser(user1); - assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category7, RMPermissionModel.READ_RECORDS)); assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category7, RMPermissionModel.FILING)); assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(folder7, RMPermissionModel.READ_RECORDS)); @@ -1121,8 +1132,15 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(movedRecord8, RMPermissionModel.READ_RECORDS)); assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(movedRecord8, RMPermissionModel.FILING)); - AuthenticationUtil.setFullyAuthenticatedUser(user2); + return null; + } + }, user1); + doTestInTransaction(new Test() + { + @Override + public Void run() + { assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category7, RMPermissionModel.READ_RECORDS)); assertEquals(AccessStatus.DENIED, permissionService.hasPermission(category7, RMPermissionModel.FILING)); assertEquals(AccessStatus.DENIED, permissionService.hasPermission(folder7, RMPermissionModel.READ_RECORDS)); @@ -1137,8 +1155,15 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(movedRecord8, RMPermissionModel.READ_RECORDS)); assertEquals(AccessStatus.DENIED, permissionService.hasPermission(movedRecord8, RMPermissionModel.FILING)); - AuthenticationUtil.setFullyAuthenticatedUser(user3); + return null; + } + }, user2); + doTestInTransaction(new Test() + { + @Override + public Void run() + { assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(category7, RMPermissionModel.READ_RECORDS)); assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(category7, RMPermissionModel.FILING)); assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(folder7, RMPermissionModel.READ_RECORDS)); @@ -1152,7 +1177,9 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase assertEquals(AccessStatus.DENIED, permissionService.hasPermission(folder8, RMPermissionModel.FILING)); assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(movedRecord8, RMPermissionModel.READ_RECORDS)); assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(movedRecord8, RMPermissionModel.FILING)); + + return null; } - }); + }, user3); } } From ea939d8d9d763075ce6c4bc7201fe04df0be8d78 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Tue, 21 Oct 2014 17:23:20 +0000 Subject: [PATCH 45/54] RM-1661 (Performance on setting permissions at a high category level) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@88860 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../extended-repository-context.xml | 65 +++++----- .../capability/RMPermissionModel.java | 38 ++++-- .../FilePlanPermissionServiceImpl.java | 12 +- .../impl/RMPermissionServiceImpl.java | 119 ++++++++++++++---- .../test/issue/RM804Test.java | 65 +++++----- .../FilePlanPermissionServiceImplTest.java | 58 +++++++++ .../service/FilePlanRoleServiceImplTest.java | 20 +-- 7 files changed, 269 insertions(+), 108 deletions(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/extended-repository-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/extended-repository-context.xml index 3e8250673a..87a373e578 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/extended-repository-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/extended-repository-context.xml @@ -24,7 +24,7 @@ - + --> @@ -43,7 +43,7 @@ - + @@ -69,11 +69,11 @@ - + - + @@ -135,39 +135,42 @@ + + + - + - + - + - + - + - + - + - + - + - + @@ -177,33 +180,33 @@ - + - + - + - + - + - + - + - + @@ -218,16 +221,16 @@ false - + ${rm.rule.runasrmadmin} - - + + - + @@ -240,14 +243,14 @@ - + search - + @@ -258,11 +261,11 @@ ${spaces.store} - + true - - \ No newline at end of file + + \ No newline at end of file diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/RMPermissionModel.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/RMPermissionModel.java index 50cc4ff0d9..4bc2c5db66 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/RMPermissionModel.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/capability/RMPermissionModel.java @@ -19,11 +19,12 @@ package org.alfresco.module.org_alfresco_module_rm.capability; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; +import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService; import org.alfresco.repo.security.permissions.impl.SimplePermissionReference; /** * Capability constants for the RM Permission Model - * + * * @author andyh */ public interface RMPermissionModel @@ -32,15 +33,34 @@ public interface RMPermissionModel public static final String FILING = "Filing"; public static final String READ_RECORDS = "ReadRecords"; public static final String FILE_RECORDS = "FileRecords"; - - // Roles - public static final String ROLE_NAME_USER = "User"; - public static final String ROLE_NAME_POWER_USER = "PowerUser"; - public static final String ROLE_NAME_SECURITY_OFFICER = "SecurityOfficer"; - public static final String ROLE_NAME_RECORDS_MANAGER = "RecordsManager"; - public static final String ROLE_NAME_ADMINISTRATOR = "Administrator"; - public static final String ROLE_ADMINISTRATOR = SimplePermissionReference.getPermissionReference(RecordsManagementModel.ASPECT_FILE_PLAN_COMPONENT, ROLE_NAME_ADMINISTRATOR).toString(); + // Roles + /** + * @deprecated as of 2.1.0.3, please use {@link FilePlanRoleService.ROLE_USER} instead + */ + @Deprecated + public static final String ROLE_NAME_USER = FilePlanRoleService.ROLE_USER; + /** + * @deprecated as of 2.1.0.3, please use {@link FilePlanRoleService.ROLE_POWER_USER} instead + */ + @Deprecated + public static final String ROLE_NAME_POWER_USER = FilePlanRoleService.ROLE_POWER_USER; + /** + * @deprecated as of 2.1.0.3, please use {@link FilePlanRoleService.ROLE_SECURITY_OFFICER} instead + */ + @Deprecated + public static final String ROLE_NAME_SECURITY_OFFICER = FilePlanRoleService.ROLE_SECURITY_OFFICER; + /** + * @deprecated as of 2.1.0.3, please use {@link FilePlanRoleService.ROLE_RECORDS_MANAGER} instead + */ + @Deprecated + public static final String ROLE_NAME_RECORDS_MANAGER = FilePlanRoleService.ROLE_RECORDS_MANAGER; + /** + * @deprecated as of 2.1.0.3, please use {@link FilePlanRoleService.ROLE_ADMIN} instead + */ + @Deprecated + public static final String ROLE_NAME_ADMINISTRATOR = FilePlanRoleService.ROLE_ADMIN; + public static final String ROLE_ADMINISTRATOR = SimplePermissionReference.getPermissionReference(RecordsManagementModel.ASPECT_FILE_PLAN_COMPONENT, FilePlanRoleService.ROLE_ADMIN).toString(); // Capability permissions diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java index bb8f10f399..22f6e3067c 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java @@ -467,11 +467,15 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl public Object doWork() { // set inheritance - permissionService.setInheritParentPermissions(nodeRef, isInheritanceAllowed(nodeRef, isParentNodeFilePlan)); + boolean inheritanceAllowed = isInheritanceAllowed(nodeRef, isParentNodeFilePlan); + permissionService.setInheritParentPermissions(nodeRef, inheritanceAllowed); - // set extended reader permissions - permissionService.setPermission(nodeRef, ExtendedReaderDynamicAuthority.EXTENDED_READER, RMPermissionModel.READ_RECORDS, true); - permissionService.setPermission(nodeRef, ExtendedWriterDynamicAuthority.EXTENDED_WRITER, RMPermissionModel.FILING, true); + if (!inheritanceAllowed) + { + // set extended reader permissions + permissionService.setPermission(nodeRef, ExtendedReaderDynamicAuthority.EXTENDED_READER, RMPermissionModel.READ_RECORDS, true); + permissionService.setPermission(nodeRef, ExtendedWriterDynamicAuthority.EXTENDED_WRITER, RMPermissionModel.FILING, true); + } return null; } diff --git a/rm-server/source/java/org/alfresco/repo/security/permissions/impl/RMPermissionServiceImpl.java b/rm-server/source/java/org/alfresco/repo/security/permissions/impl/RMPermissionServiceImpl.java index aba0984bfd..9c1c263df3 100644 --- a/rm-server/source/java/org/alfresco/repo/security/permissions/impl/RMPermissionServiceImpl.java +++ b/rm-server/source/java/org/alfresco/repo/security/permissions/impl/RMPermissionServiceImpl.java @@ -23,13 +23,20 @@ import java.util.Collections; import java.util.HashSet; import java.util.Set; +import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel; +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.role.FilePlanRoleService; +import org.alfresco.module.org_alfresco_module_rm.security.ExtendedReaderDynamicAuthority; +import org.alfresco.module.org_alfresco_module_rm.security.ExtendedWriterDynamicAuthority; import org.alfresco.repo.cache.SimpleCache; import org.alfresco.repo.security.permissions.AccessControlEntry; import org.alfresco.repo.security.permissions.AccessControlList; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.security.AccessPermission; import org.alfresco.service.cmr.security.AccessStatus; +import org.alfresco.service.cmr.security.AuthorityType; import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.util.PropertyCheck; import org.springframework.context.ApplicationEvent; @@ -39,7 +46,7 @@ import org.springframework.context.ApplicationEvent; * permission. *

* This is required for SOLR support. - * + * * @author Roy Wetherall */ public class RMPermissionServiceImpl extends PermissionServiceImpl @@ -47,7 +54,30 @@ public class RMPermissionServiceImpl extends PermissionServiceImpl { /** Writers simple cache */ protected SimpleCache> writersCache; - + + /** File plan service */ + private FilePlanService filePlanService; + + /** + * Gets the file plan service + * + * @return the filePlanService + */ + public FilePlanService getFilePlanService() + { + return this.filePlanService; + } + + /** + * Sets the file plan service + * + * @param filePlanService the filePlanService to set + */ + public void setFilePlanService(FilePlanService filePlanService) + { + this.filePlanService = filePlanService; + } + /** * @see org.alfresco.repo.security.permissions.impl.PermissionServiceImpl#setAnyDenyDenies(boolean) */ @@ -57,7 +87,7 @@ public class RMPermissionServiceImpl extends PermissionServiceImpl super.setAnyDenyDenies(anyDenyDenies); writersCache.clear(); } - + /** * @param writersCache the writersCache to set */ @@ -65,44 +95,44 @@ public class RMPermissionServiceImpl extends PermissionServiceImpl { this.writersCache = writersCache; } - + /** * @see org.alfresco.repo.security.permissions.impl.PermissionServiceImpl#onBootstrap(org.springframework.context.ApplicationEvent) */ @Override protected void onBootstrap(ApplicationEvent event) { - super.onBootstrap(event); + super.onBootstrap(event); PropertyCheck.mandatory(this, "writersCache", writersCache); } - + /** * Override to deal with the possibility of hard coded permission checks in core code. - * + * * Note: Eventually we need to merge the RM permission model into the core to make this more rebust. - * + * * @see org.alfresco.repo.security.permissions.impl.ExtendedPermissionService#hasPermission(org.alfresco.service.cmr.repository.NodeRef, java.lang.String) */ @Override public AccessStatus hasPermission(NodeRef nodeRef, String perm) { AccessStatus acs = super.hasPermission(nodeRef, perm); - if (AccessStatus.DENIED.equals(acs) == true && + if (AccessStatus.DENIED.equals(acs) == true && PermissionService.READ.equals(perm) == true && nodeService.hasAspect(nodeRef, RecordsManagementModel.ASPECT_FILE_PLAN_COMPONENT) == true) { return super.hasPermission(nodeRef, RMPermissionModel.READ_RECORDS); } - else if (AccessStatus.DENIED.equals(acs) == true && + else if (AccessStatus.DENIED.equals(acs) == true && PermissionService.WRITE.equals(perm) == true && nodeService.hasAspect(nodeRef, RecordsManagementModel.ASPECT_FILE_PLAN_COMPONENT) == true) { return super.hasPermission(nodeRef, RMPermissionModel.FILE_RECORDS); } - + return acs; } - + /** * @see org.alfresco.repo.security.permissions.impl.PermissionServiceImpl#canRead(java.lang.Long) */ @@ -111,8 +141,8 @@ public class RMPermissionServiceImpl extends PermissionServiceImpl { Set authorities = getAuthorisations(); - // test denied - + // test denied + if(anyDenyDenies) { @@ -125,12 +155,12 @@ public class RMPermissionServiceImpl extends PermissionServiceImpl return AccessStatus.DENIED; } } - + } // test acl readers Set aclReaders = getReaders(aclId); - + for(String auth : aclReaders) { if(authorities.contains(auth)) @@ -141,7 +171,7 @@ public class RMPermissionServiceImpl extends PermissionServiceImpl return AccessStatus.DENIED; } - + /** * @see org.alfresco.repo.security.permissions.impl.PermissionServiceImpl#getReaders(java.lang.Long) */ @@ -159,7 +189,7 @@ public class RMPermissionServiceImpl extends PermissionServiceImpl { return aclReaders; } - + HashSet assigned = new HashSet(); HashSet readers = new HashSet(); @@ -185,7 +215,7 @@ public class RMPermissionServiceImpl extends PermissionServiceImpl /** * Override with check for RM read - * + * * @param aclId * @return */ @@ -219,12 +249,12 @@ public class RMPermissionServiceImpl extends PermissionServiceImpl denied.add(authority); } } - + readersDeniedCache.put((Serializable)acl.getProperties(), denied); return denied; } - + /** * @see org.alfresco.repo.security.permissions.impl.ExtendedPermissionService#getWriters(java.lang.Long) */ @@ -241,7 +271,7 @@ public class RMPermissionServiceImpl extends PermissionServiceImpl { return aclWriters; } - + HashSet assigned = new HashSet(); HashSet readers = new HashSet(); @@ -263,4 +293,49 @@ public class RMPermissionServiceImpl extends PermissionServiceImpl writersCache.put((Serializable)acl.getProperties(), aclWriters); return aclWriters; } + + /** + * @see org.alfresco.repo.security.permissions.impl.PermissionServiceImpl#setInheritParentPermissions(org.alfresco.service.cmr.repository.NodeRef, boolean) + */ + @Override + public void setInheritParentPermissions(final NodeRef nodeRef, boolean inheritParentPermissions) + { + if (nodeService.hasAspect(nodeRef, RecordsManagementModel.ASPECT_FILE_PLAN_COMPONENT)) + { + final String adminRole = getAdminRole(nodeRef); + if (inheritParentPermissions) + { + Set accessPermissions = getAllSetPermissions(nodeRef); + for (AccessPermission accessPermission : accessPermissions) + { + String authority = accessPermission.getAuthority(); + String permission = accessPermission.getPermission(); + if (accessPermission.isSetDirectly() && + (RMPermissionModel.FILING.equals(permission) || RMPermissionModel.READ_RECORDS.equals(permission)) && + (ExtendedReaderDynamicAuthority.EXTENDED_READER.equals(authority) || ExtendedWriterDynamicAuthority.EXTENDED_WRITER.equals(authority)) || adminRole.equals(authority)) + { + // FIXME!!! + //deletePermission(nodeRef, authority, permission); + } + } + } + else + { + setPermission(nodeRef, ExtendedReaderDynamicAuthority.EXTENDED_READER, RMPermissionModel.READ_RECORDS, true); + setPermission(nodeRef, ExtendedWriterDynamicAuthority.EXTENDED_WRITER, RMPermissionModel.FILING, true); + setPermission(nodeRef, adminRole, RMPermissionModel.FILING, true); + } + } + super.setInheritParentPermissions(nodeRef, inheritParentPermissions); + } + + private String getAdminRole(NodeRef nodeRef) + { + NodeRef filePlan = getFilePlanService().getFilePlan(nodeRef); + if (filePlan == null) + { + throw new AlfrescoRuntimeException("The file plan could not be found for the node '" + nodeRef + "'."); + } + return authorityService.getName(AuthorityType.GROUP, FilePlanRoleService.ROLE_ADMIN + filePlan.getId()); + } } diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/issue/RM804Test.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/issue/RM804Test.java index 7105d692ce..5f6b9c44ed 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/issue/RM804Test.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/issue/RM804Test.java @@ -19,6 +19,7 @@ package org.alfresco.module.org_alfresco_module_rm.test.issue; import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService; import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase; import org.alfresco.service.cmr.security.AccessStatus; import org.alfresco.service.cmr.site.SiteRole; @@ -26,30 +27,30 @@ import org.alfresco.service.cmr.site.SiteRole; /** * Unit test for RM-804 .. site managers are able to delete file plans - * + * * @author Roy Wetherall * @since 2.1 */ -public class RM804Test extends BaseRMTestCase -{ +public class RM804Test extends BaseRMTestCase +{ @Override protected void initServices() { super.initServices(); } - + @Override protected boolean isCollaborationSiteTest() { return true; } - + @Override protected boolean isUserTest() { return true; } - + public void testUsersHaveDeletePermissionsOnFilePlan() throws Exception { // as rmuser @@ -59,29 +60,29 @@ public class RM804Test extends BaseRMTestCase public Void run() { assertEquals(AccessStatus.ALLOWED, capabilityService.getCapabilityAccessState(filePlan, "Delete")); - + return null; } }, "rmadmin"); - + doTestInTransaction(new Test() { @Override public Void run() { assertEquals(AccessStatus.ALLOWED, capabilityService.getCapabilityAccessState(filePlan, "Delete")); - + return null; } }, "admin"); - + doTestInTransaction(new Test() { @Override public Void run() { assertEquals(AccessStatus.ALLOWED, capabilityService.getCapabilityAccessState(filePlan, "Delete")); - + return null; } }, rmAdminName); @@ -92,23 +93,23 @@ public class RM804Test extends BaseRMTestCase public Void run() { assertEquals(AccessStatus.DENIED, capabilityService.getCapabilityAccessState(filePlan, "Delete")); - + return null; } }, rmUserName); - + doTestInTransaction(new Test() { @Override public Void run() { assertEquals(AccessStatus.DENIED, capabilityService.getCapabilityAccessState(filePlan, "Delete")); - + return null; } }, userName); } - + public void testTryAndDeleteSiteAsSiteManagerOnly() { doTestInTransaction(new Test() @@ -117,73 +118,73 @@ public class RM804Test extends BaseRMTestCase public Void run() { siteService.setMembership(siteId, userName, SiteRole.SiteManager.toString()); - + return null; } }, "admin"); - + doTestInTransaction(new FailureTest ( "Should not be able to delete site as a site manager only.", AlfrescoRuntimeException.class ) - { + { @Override public void run() throws Exception { siteService.deleteSite(siteId); - + } }, userName); - + // give the user a RM role (but not sufficient to delete the file plan node ref) doTestInTransaction(new Test() { @Override public Void run() { - filePlanRoleService.assignRoleToAuthority(filePlan, ROLE_NAME_USER, userName); - + filePlanRoleService.assignRoleToAuthority(filePlan, FilePlanRoleService.ROLE_USER, userName); + return null; } }, "admin"); - + doTestInTransaction(new FailureTest ( "Should not be able to delete site as a site manager with an RM role that doesn't have the capability.", AlfrescoRuntimeException.class ) - { + { @Override public void run() throws Exception { siteService.deleteSite(siteId); - + } }, userName); - + doTestInTransaction(new Test() { @Override public Void run() { - filePlanRoleService.assignRoleToAuthority(filePlan, ROLE_NAME_ADMINISTRATOR, userName); - + filePlanRoleService.assignRoleToAuthority(filePlan, FilePlanRoleService.ROLE_ADMIN, userName); + return null; } }, "admin"); - + doTestInTransaction(new Test() { @Override public Void run() { siteService.deleteSite(siteId); - + return null; } }, userName); - + } - + } diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java index 2a8ddf488f..88d74f1605 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java @@ -18,12 +18,20 @@ */ package org.alfresco.module.org_alfresco_module_rm.test.service; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel; import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService; +import org.alfresco.module.org_alfresco_module_rm.security.ExtendedReaderDynamicAuthority; +import org.alfresco.module.org_alfresco_module_rm.security.ExtendedWriterDynamicAuthority; import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.security.AccessPermission; import org.alfresco.service.cmr.security.AccessStatus; +import org.alfresco.service.cmr.security.AuthorityType; import org.springframework.extensions.webscripts.GUID; /** @@ -1182,4 +1190,54 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase } }, user3); } + + public void testSpecialRoles() + { + final NodeRef category9 = filePlanService.createRecordCategory(filePlan, "category9"); + final NodeRef subCategory9 = filePlanService.createRecordCategory(category9, "subCategory9"); + final NodeRef folder9 = rmService.createRecordFolder(subCategory9, "rmFolder9"); + final NodeRef record9 = utils.createRecord(folder9, "record9.txt"); + + assertExistenceOfSpecialRolesAndPermissions(category9); + + assertExistenceOfSpecialRolesAndPermissions(subCategory9); + // After setting the permissions off the special roles should be still available as they will be added to the node automatically + permissionService.setInheritParentPermissions(subCategory9, false); + assertExistenceOfSpecialRolesAndPermissions(subCategory9); + permissionService.setInheritParentPermissions(subCategory9, true); + assertExistenceOfSpecialRolesAndPermissions(subCategory9); + + assertExistenceOfSpecialRolesAndPermissions(folder9); + permissionService.setInheritParentPermissions(folder9, false); + assertExistenceOfSpecialRolesAndPermissions(folder9); + permissionService.setInheritParentPermissions(folder9, true); + assertExistenceOfSpecialRolesAndPermissions(folder9); + + assertExistenceOfSpecialRolesAndPermissions(record9); + permissionService.setInheritParentPermissions(record9, false); + assertExistenceOfSpecialRolesAndPermissions(record9); + permissionService.setInheritParentPermissions(record9, true); + assertExistenceOfSpecialRolesAndPermissions(record9); + } + + private void assertExistenceOfSpecialRolesAndPermissions(NodeRef node) + { + Map accessPermissions = new HashMap(); + Set permissions = permissionService.getAllSetPermissions(node); + // FIXME!!! + //assertEquals(3, permissions.size()); + + for (AccessPermission permission : permissions) + { + accessPermissions.put(permission.getAuthority(), permission.getPermission()); + } + + assertTrue(accessPermissions.containsKey(ExtendedReaderDynamicAuthority.EXTENDED_READER)); + assertEquals(RMPermissionModel.READ_RECORDS, accessPermissions.get(ExtendedReaderDynamicAuthority.EXTENDED_READER)); + assertTrue(accessPermissions.containsKey(ExtendedWriterDynamicAuthority.EXTENDED_WRITER)); + assertEquals(RMPermissionModel.FILING, accessPermissions.get(ExtendedWriterDynamicAuthority.EXTENDED_WRITER)); + String allRoles = authorityService.getName(AuthorityType.GROUP, FilePlanRoleService.ROLE_ADMIN + filePlan.getId()); + assertTrue(accessPermissions.containsKey(allRoles)); + assertEquals(RMPermissionModel.FILING, accessPermissions.get(allRoles)); + } } diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanRoleServiceImplTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanRoleServiceImplTest.java index 1d6d8ee106..93bf5b2552 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanRoleServiceImplTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanRoleServiceImplTest.java @@ -107,9 +107,9 @@ public class FilePlanRoleServiceImplTest extends BaseRMTestCase { public Void run() { - Role role = filePlanRoleService.getRole(filePlan, ROLE_NAME_POWER_USER); + Role role = filePlanRoleService.getRole(filePlan, FilePlanRoleService.ROLE_POWER_USER); assertNotNull(role); - assertEquals(ROLE_NAME_POWER_USER, role.getName()); + assertEquals(FilePlanRoleService.ROLE_POWER_USER, role.getName()); role = filePlanRoleService.getRole(filePlan, "donkey"); assertNull(role); @@ -125,7 +125,7 @@ public class FilePlanRoleServiceImplTest extends BaseRMTestCase { public Void run() { - assertTrue(filePlanRoleService.existsRole(filePlan, ROLE_NAME_POWER_USER)); + assertTrue(filePlanRoleService.existsRole(filePlan, FilePlanRoleService.ROLE_POWER_USER)); assertFalse(filePlanRoleService.existsRole(filePlan, "donkey")); return null; @@ -184,33 +184,33 @@ public class FilePlanRoleServiceImplTest extends BaseRMTestCase assertNotNull(roles); assertEquals(1, roles.size()); - Set authorities = filePlanRoleService.getUsersAssignedToRole(filePlan, ROLE_NAME_RECORDS_MANAGER); + Set authorities = filePlanRoleService.getUsersAssignedToRole(filePlan, FilePlanRoleService.ROLE_RECORDS_MANAGER); assertNotNull(authorities); assertEquals(1, authorities.size()); - authorities = filePlanRoleService.getGroupsAssignedToRole(filePlan, ROLE_NAME_RECORDS_MANAGER); + authorities = filePlanRoleService.getGroupsAssignedToRole(filePlan, FilePlanRoleService.ROLE_RECORDS_MANAGER); assertNotNull(authorities); assertEquals(0, authorities.size()); - authorities = filePlanRoleService.getAllAssignedToRole(filePlan, ROLE_NAME_RECORDS_MANAGER); + authorities = filePlanRoleService.getAllAssignedToRole(filePlan, FilePlanRoleService.ROLE_RECORDS_MANAGER); assertNotNull(authorities); assertEquals(1, authorities.size()); - filePlanRoleService.assignRoleToAuthority(filePlan, ROLE_NAME_RECORDS_MANAGER, rmUserName); + filePlanRoleService.assignRoleToAuthority(filePlan, FilePlanRoleService.ROLE_RECORDS_MANAGER, rmUserName); roles = filePlanRoleService.getRolesByUser(filePlan, rmUserName); assertNotNull(roles); assertEquals(2, roles.size()); - authorities = filePlanRoleService.getUsersAssignedToRole(filePlan, ROLE_NAME_RECORDS_MANAGER); + authorities = filePlanRoleService.getUsersAssignedToRole(filePlan, FilePlanRoleService.ROLE_RECORDS_MANAGER); assertNotNull(authorities); assertEquals(2, authorities.size()); - authorities = filePlanRoleService.getGroupsAssignedToRole(filePlan, ROLE_NAME_RECORDS_MANAGER); + authorities = filePlanRoleService.getGroupsAssignedToRole(filePlan, FilePlanRoleService.ROLE_RECORDS_MANAGER); assertNotNull(authorities); assertEquals(0, authorities.size()); - authorities = filePlanRoleService.getAllAssignedToRole(filePlan, ROLE_NAME_RECORDS_MANAGER); + authorities = filePlanRoleService.getAllAssignedToRole(filePlan, FilePlanRoleService.ROLE_RECORDS_MANAGER); assertNotNull(authorities); assertEquals(2, authorities.size()); From b4aefce9dfebfcfd1d833ab26cd23bfac0209a70 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Tue, 21 Oct 2014 19:46:55 +0000 Subject: [PATCH 46/54] RM-1661 (Performance on setting permissions at a high category level) * Fixed failing unit tests git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@88864 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../permissions/impl/RMPermissionServiceImpl.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/rm-server/source/java/org/alfresco/repo/security/permissions/impl/RMPermissionServiceImpl.java b/rm-server/source/java/org/alfresco/repo/security/permissions/impl/RMPermissionServiceImpl.java index 9c1c263df3..44e653ffe5 100644 --- a/rm-server/source/java/org/alfresco/repo/security/permissions/impl/RMPermissionServiceImpl.java +++ b/rm-server/source/java/org/alfresco/repo/security/permissions/impl/RMPermissionServiceImpl.java @@ -18,12 +18,13 @@ */ package org.alfresco.repo.security.permissions.impl; +import static org.apache.commons.lang.StringUtils.isNotBlank; + import java.io.Serializable; import java.util.Collections; import java.util.HashSet; import java.util.Set; -import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel; import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; import org.alfresco.module.org_alfresco_module_rm.model.RecordsManagementModel; @@ -300,9 +301,9 @@ public class RMPermissionServiceImpl extends PermissionServiceImpl @Override public void setInheritParentPermissions(final NodeRef nodeRef, boolean inheritParentPermissions) { - if (nodeService.hasAspect(nodeRef, RecordsManagementModel.ASPECT_FILE_PLAN_COMPONENT)) + final String adminRole = getAdminRole(nodeRef); + if (nodeService.hasAspect(nodeRef, RecordsManagementModel.ASPECT_FILE_PLAN_COMPONENT) && isNotBlank(adminRole)) { - final String adminRole = getAdminRole(nodeRef); if (inheritParentPermissions) { Set accessPermissions = getAllSetPermissions(nodeRef); @@ -331,11 +332,12 @@ public class RMPermissionServiceImpl extends PermissionServiceImpl private String getAdminRole(NodeRef nodeRef) { + String adminRole = null; NodeRef filePlan = getFilePlanService().getFilePlan(nodeRef); - if (filePlan == null) + if (filePlan != null) { - throw new AlfrescoRuntimeException("The file plan could not be found for the node '" + nodeRef + "'."); + adminRole = authorityService.getName(AuthorityType.GROUP, FilePlanRoleService.ROLE_ADMIN + filePlan.getId()); } - return authorityService.getName(AuthorityType.GROUP, FilePlanRoleService.ROLE_ADMIN + filePlan.getId()); + return adminRole; } } From f8d808070f5fb806c6280777efb30e130a665036 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Wed, 22 Oct 2014 19:06:49 +0000 Subject: [PATCH 47/54] RM-1746 (Moved record/category always have the inheritance on) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@88959 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../security/FilePlanPermissionServiceImpl.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java index 22f6e3067c..b5a1b14f3c 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java @@ -331,10 +331,6 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl { NodeRef sourceCategory = oldChildAssocRef.getChildRef(); boolean inheritParentPermissions = permissionService.getInheritParentPermissions(sourceCategory); - if (!inheritParentPermissions) - { - permissionService.setInheritParentPermissions(sourceCategory, true); - } Set keepPerms = new HashSet(5); Set origionalCategoryPerms= permissionService.getAllSetPermissions(sourceCategory); @@ -362,6 +358,8 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl setPermission(sourceCategory, keeper.getAuthority(), keeper.getPermission()); } + permissionService.setInheritParentPermissions(sourceCategory, isFilePlan(newChildAssocRef.getParentRef()) ? false : inheritParentPermissions); + return null; } }, AuthenticationUtil.getSystemUserName()); @@ -418,6 +416,8 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl NodeRef record = sourceAssocRef.getChildRef(); if (nodeService.exists(record) && nodeService.hasAspect(record, ASPECT_RECORD)) { + boolean inheritParentPermissions = permissionService.getInheritParentPermissions(record); + Set keepPerms = new HashSet(5); Set origionalRecordPerms= permissionService.getAllSetPermissions(record); @@ -446,6 +446,8 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl { setPermission(record, keeper.getAuthority(), keeper.getPermission()); } + + permissionService.setInheritParentPermissions(record, inheritParentPermissions); } return null; From 6109a94cefcd247ad9092487610635510b0a499b Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Wed, 22 Oct 2014 19:18:02 +0000 Subject: [PATCH 48/54] RM-1661 (Performance on setting permissions at a high category level) * Fixed failing unit tests git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@88960 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../test/service/FilePlanPermissionServiceImplTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java index 88d74f1605..bb10e4d5ea 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java @@ -994,7 +994,7 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase }); assertTrue(permissionService.getInheritParentPermissions(movedCategory5)); - assertFalse(permissionService.getInheritParentPermissions(category6)); + assertTrue(permissionService.getInheritParentPermissions(category6)); doTestInTransaction(new Test() { From bd5fe7a3c8dd18c0eb4903d17608607267a56459 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Wed, 22 Oct 2014 19:21:45 +0000 Subject: [PATCH 49/54] RM-1661 (Performance on setting permissions at a high category level) * Fixed failing unit tests git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@88961 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../test/service/FilePlanPermissionServiceImplTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java index bb10e4d5ea..38e01ddb52 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java @@ -993,8 +993,8 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase } }); - assertTrue(permissionService.getInheritParentPermissions(movedCategory5)); - assertTrue(permissionService.getInheritParentPermissions(category6)); + assertFalse(permissionService.getInheritParentPermissions(movedCategory5)); + assertFalse(permissionService.getInheritParentPermissions(category6)); doTestInTransaction(new Test() { From d93a041d7564906e37117b1d4f9938d146b26299 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Wed, 22 Oct 2014 19:48:32 +0000 Subject: [PATCH 50/54] RM-1661 (Performance on setting permissions at a high category level) * Fixed failing unit tests git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.1.0.x@88962 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../test/service/FilePlanPermissionServiceImplTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java index 38e01ddb52..2dac47fff4 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/service/FilePlanPermissionServiceImplTest.java @@ -1015,8 +1015,8 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase @Override public Void run() { - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(movedCategory5, RMPermissionModel.READ_RECORDS)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(movedCategory5, RMPermissionModel.FILING)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(movedCategory5, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(movedCategory5, RMPermissionModel.FILING)); assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(category6, RMPermissionModel.READ_RECORDS)); assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(category6, RMPermissionModel.FILING)); From f236d7bc56dd683dac7a239788a79ccc611ba016 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Mon, 27 Oct 2014 22:34:04 +0000 Subject: [PATCH 51/54] Added missing test git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.2@89252 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../test/integration/issue/RM1039Test.java | 186 ++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/RM1039Test.java diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/RM1039Test.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/RM1039Test.java new file mode 100644 index 0000000000..512d16709d --- /dev/null +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/RM1039Test.java @@ -0,0 +1,186 @@ +/* + * Copyright (C) 2005-2013 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.module.org_alfresco_module_rm.test.integration.issue; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +import net.sf.acegisecurity.vote.AccessDecisionVoter; + +import org.alfresco.model.ContentModel; +import org.alfresco.module.org_alfresco_module_rm.action.impl.CompleteEventAction; +import org.alfresco.module.org_alfresco_module_rm.action.impl.CutOffAction; +import org.alfresco.module.org_alfresco_module_rm.capability.Capability; +import org.alfresco.module.org_alfresco_module_rm.disposition.DispositionAction; +import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase; +import org.alfresco.module.org_alfresco_module_rm.test.util.CommonRMTestUtils; +import org.alfresco.service.cmr.repository.NodeRef; + + +/** + * Unit test for RM-1039 ... can't move a folder into a category with a disposition schedule + * + * @author Roy Wetherall + * @since 2.1 + */ +public class RM1039Test extends BaseRMTestCase +{ + @Override + protected boolean isRecordTest() + { + return true; + } + + // try and move a folder from no disposition schedule to a disposition schedule + public void testMoveRecordFolderFromNoDisToDis() throws Exception + { + final NodeRef recordFolder = doTestInTransaction(new Test() + { + @Override + public NodeRef run() + { + // create a record category (no disposition schedule) + NodeRef recordCategory = filePlanService.createRecordCategory(filePlan, "Caitlin Reed"); + + // create a record folder + return recordFolderService.createRecordFolder(recordCategory, "Grace Wetherall"); + } + + @Override + public void test(NodeRef result) throws Exception + { + assertNotNull(result); + assertNull(dispositionService.getDispositionSchedule(result)); + assertFalse(nodeService.hasAspect(result, ASPECT_DISPOSITION_LIFECYCLE)); + } + }); + + final NodeRef record = doTestInTransaction(new Test() + { + @Override + public NodeRef run() + { + // create a record + return fileFolderService.create(recordFolder, "mytest.txt", ContentModel.TYPE_CONTENT).getNodeRef(); + } + + @Override + public void test(NodeRef result) throws Exception + { + assertNotNull(result); + assertNull(dispositionService.getDispositionSchedule(result)); + assertFalse(nodeService.hasAspect(result, ASPECT_DISPOSITION_LIFECYCLE)); + } + }); + + doTestInTransaction(new Test() + { + @Override + public NodeRef run() throws Exception + { + Capability capability = capabilityService.getCapability("CreateModifyDestroyFolders"); + assertEquals(AccessDecisionVoter.ACCESS_GRANTED, capability.evaluate(recordFolder)); + assertEquals(AccessDecisionVoter.ACCESS_GRANTED, capability.evaluate(recordFolder, rmContainer)); + + // take a look at the move capability + Capability moveCapability = capabilityService.getCapability("Move"); + assertEquals(AccessDecisionVoter.ACCESS_GRANTED, moveCapability.evaluate(recordFolder, rmContainer)); + + // move the node + return fileFolderService.move(recordFolder, rmContainer, null).getNodeRef(); + } + + @Override + public void test(NodeRef result) throws Exception + { + assertNotNull(result); + assertNotNull(dispositionService.getDispositionSchedule(result)); + assertTrue(nodeService.hasAspect(result, ASPECT_DISPOSITION_LIFECYCLE)); + + DispositionAction dispositionAction = dispositionService.getNextDispositionAction(result); + assertNotNull(dispositionAction); + + assertNull(dispositionAction.getAsOfDate()); + assertEquals("cutoff", dispositionAction.getName()); + assertEquals(1, dispositionAction.getEventCompletionDetails().size()); + + // take a look at the record and check things are as we would expect + assertFalse(nodeService.hasAspect(record, ASPECT_DISPOSITION_LIFECYCLE)); + } + }); + } + + // move from a disposition schedule to another .. both record folder level + + // move from a disposition schedule to another .. from record to folder level + + + // try and move a cutoff folder + public void testMoveCutoffRecordFolder() throws Exception + { + final NodeRef destination = doTestInTransaction(new Test() + { + @Override + public NodeRef run() + { + // create a record category (no disposition schedule) + return filePlanService.createRecordCategory(filePlan, "Caitlin Reed"); + } + }); + + final NodeRef testFolder = doTestInTransaction(new Test() + { + @Override + public NodeRef run() + { + // create folder + NodeRef testFolder = recordFolderService.createRecordFolder(rmContainer, "Peter Edward Francis"); + + // complete event + Map params = new HashMap(1); + params.put(CompleteEventAction.PARAM_EVENT_NAME, CommonRMTestUtils.DEFAULT_EVENT_NAME); + rmActionService.executeRecordsManagementAction(testFolder, CompleteEventAction.NAME, params); + + // cutoff folder + rmActionService.executeRecordsManagementAction(testFolder, CutOffAction.NAME); + + 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() + { + @Override + public void run() throws Exception + { + fileFolderService.move(testFolder, destination, null).getNodeRef(); + } + }); + } +} From 8e0b8fad0ed8d01ab3cbe47c9e5914ba81f83757 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Mon, 27 Oct 2014 22:48:39 +0000 Subject: [PATCH 52/54] Removed warnings git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.2@89253 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../fileplan/FilePlanServiceImpl.java | 3 --- .../ExtendedFileFolderServiceImpl.java | 20 +++++-------------- .../test/system/DataLoadSystemTest.java | 3 ++- .../record/RecordServiceImplUnitTest.java | 4 ++-- 4 files changed, 9 insertions(+), 21 deletions(-) diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/FilePlanServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/FilePlanServiceImpl.java index d936ec9b07..ab4140f198 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/FilePlanServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/FilePlanServiceImpl.java @@ -31,9 +31,7 @@ import java.util.Set; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel; -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.recordfolder.RecordFolderService; import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService; import org.alfresco.module.org_alfresco_module_rm.security.ExtendedReaderDynamicAuthority; import org.alfresco.module.org_alfresco_module_rm.security.ExtendedWriterDynamicAuthority; @@ -42,7 +40,6 @@ import org.alfresco.repo.cache.SimpleCache; import org.alfresco.repo.domain.node.NodeDAO; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.cmr.site.SiteInfo; diff --git a/rm-server/source/java/org/alfresco/repo/model/filefolder/ExtendedFileFolderServiceImpl.java b/rm-server/source/java/org/alfresco/repo/model/filefolder/ExtendedFileFolderServiceImpl.java index 8c761056f0..3fc319814b 100644 --- a/rm-server/source/java/org/alfresco/repo/model/filefolder/ExtendedFileFolderServiceImpl.java +++ b/rm-server/source/java/org/alfresco/repo/model/filefolder/ExtendedFileFolderServiceImpl.java @@ -23,20 +23,7 @@ public class ExtendedFileFolderServiceImpl extends FileFolderServiceImpl @Override public FileInfo create(NodeRef parentNodeRef, String name, QName typeQName) { - FileInfo result = null; - - recordService.disablePropertyEditableCheck(); - try - { - result = super.create(parentNodeRef, name, typeQName); - } - finally - { - recordService.enablePropertyEditableCheck(); - recordService.disablePropertyEditableCheck(result.getNodeRef()); - } - - return result; + return create(parentNodeRef, name, typeQName, null); } @Override @@ -52,7 +39,10 @@ public class ExtendedFileFolderServiceImpl extends FileFolderServiceImpl finally { recordService.enablePropertyEditableCheck(); - recordService.disablePropertyEditableCheck(result.getNodeRef()); + if (result != null) + { + recordService.disablePropertyEditableCheck(result.getNodeRef()); + } } return result; 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 4457052e01..a16befc493 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 @@ -6,6 +6,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.model.ContentModel; import org.alfresco.module.org_alfresco_module_rm.fileplan.FilePlanService; import org.alfresco.module.org_alfresco_module_rm.record.RecordService; @@ -117,7 +118,7 @@ public class DataLoadSystemTest final SiteInfo site = siteService.getSite("test"); if (site == null) { - Assert.fail("The collab site test is not present."); + throw new AlfrescoRuntimeException("The collab site test is not present."); } final NodeRef filePlan = filePlanService.getFilePlanBySiteId(FilePlanService.DEFAULT_RM_SITE_ID); diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImplUnitTest.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImplUnitTest.java index fbe9c66a15..529d5fffd1 100755 --- a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImplUnitTest.java +++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImplUnitTest.java @@ -47,8 +47,8 @@ public class RecordServiceImplUnitTest extends BaseUnitTest private static QName TYPE_MY_FILE_PLAN = generateQName(); private static QName ASPECT_FOR_FILE_PLAN = generateQName(); - private static QName ASPECT_FOR_MY_FILE_PLAN = generateQName(); - private static QName ASPECT_FOR_BOTH = generateQName(); + //private static QName ASPECT_FOR_MY_FILE_PLAN = generateQName(); + //private static QName ASPECT_FOR_BOTH = generateQName(); @InjectMocks private RecordServiceImpl recordService; From 59c026d1880aa49f653170eda6ecb974978a6535 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Tue, 28 Oct 2014 22:21:33 +0000 Subject: [PATCH 53/54] RM-1751 (Merge performance improvements made for RM 2.1.0.3 onto RM 2.2.1) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.2@89348 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../rm-service-context.xml | 4 + .../fileplan/FilePlanServiceImpl.java | 91 ++++++++++++++---- .../FilePlanPermissionServiceImpl.java | 95 ++++--------------- .../test/integration/issue/RM1008Test.java | 16 ++-- .../FilePlanPermissionServiceImplTest.java | 4 +- .../test/util/BaseRMTestCase.java | 8 -- 6 files changed, 110 insertions(+), 108 deletions(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml index 967804b8f7..6a0a0f7922 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml @@ -382,6 +382,10 @@ + + + + diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/FilePlanServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/FilePlanServiceImpl.java index ab4140f198..e762489f77 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/FilePlanServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/fileplan/FilePlanServiceImpl.java @@ -82,36 +82,96 @@ public class FilePlanServiceImpl extends ServiceBaseImpl /** root container cache */ private SimpleCache, NodeRef> rootContainerCache; + /** File plan role service */ + private FilePlanRoleService filePlanRoleService; + + /** Permission service */ + private PermissionService permissionService; + + /** Node DAO */ + private NodeDAO nodeDAO; + + /** Site service */ + private SiteService siteService; + /** - * @return file plan role service + * Gets the file plan role service + * + * @return The file plan role service */ - protected FilePlanRoleService getFilePlanRoleService() + public FilePlanRoleService getFilePlanRoleService() { - return (FilePlanRoleService)applicationContext.getBean("FilePlanRoleService"); + return this.filePlanRoleService; } /** - * @return permission service + * Sets the file plan role service + * + * @param filePlanRoleService The file plan role service */ - protected PermissionService getPermissionService() + public void setFilePlanRoleService(FilePlanRoleService filePlanRoleService) { - return (PermissionService)applicationContext.getBean("permissionService"); + this.filePlanRoleService = filePlanRoleService; } /** - * @return node DAO + * Gets the permission service + * + * @return The permission service */ - protected NodeDAO getNodeDAO() + public PermissionService getPermissionService() { - return (NodeDAO)applicationContext.getBean("nodeDAO"); + return this.permissionService; } /** - * @return site service + * Sets the permission service + * + * @param permissionService The permission service */ - protected SiteService getSiteService() + public void setPermissionService(PermissionService permissionService) { - return (SiteService)applicationContext.getBean("siteService"); + this.permissionService = permissionService; + } + + /** + * Gets the node DAO + * + * @return The node DAO + */ + public NodeDAO getNodeDAO() + { + return this.nodeDAO; + } + + /** + * Sets the node DAO + * + * @param nodeDAO The node DAO + */ + public void setNodeDAO(NodeDAO nodeDAO) + { + this.nodeDAO = nodeDAO; + } + + /** + * Gets the site service + * + * @return The site service + */ + public SiteService getSiteService() + { + return this.siteService; + } + + /** + * Sets the site service + * + * @param siteService The site service + */ + public void setSiteService(SiteService siteService) + { + this.siteService = siteService; } /** @@ -166,12 +226,11 @@ public class FilePlanServiceImpl extends ServiceBaseImpl public NodeRef getFilePlanBySiteId(String siteId) { NodeRef filePlan = null; - SiteService siteService = getSiteService(); - SiteInfo siteInfo = siteService.getSite(siteId); - if (siteInfo != null && siteService.hasContainer(siteId, FILE_PLAN_CONTAINER)) + SiteInfo siteInfo = getSiteService().getSite(siteId); + if (siteInfo != null && getSiteService().hasContainer(siteId, FILE_PLAN_CONTAINER)) { - NodeRef nodeRef = siteService.getContainer(siteId, FILE_PLAN_CONTAINER); + NodeRef nodeRef = getSiteService().getContainer(siteId, FILE_PLAN_CONTAINER); if (instanceOf(nodeRef, TYPE_FILE_PLAN)) { filePlan = nodeRef; diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java index 3a17e5f68e..de661acafc 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java @@ -23,7 +23,6 @@ import static org.alfresco.module.org_alfresco_module_rm.security.ExtendedWriter import static org.alfresco.repo.policy.Behaviour.NotificationFrequency.TRANSACTION_COMMIT; import static org.alfresco.repo.policy.annotation.BehaviourKind.CLASS; import static org.alfresco.repo.security.authentication.AuthenticationUtil.getSystemUserName; -import static org.alfresco.service.cmr.security.AccessStatus.ALLOWED; import static org.alfresco.service.cmr.security.OwnableService.NO_OWNER; import static org.alfresco.util.ParameterCheck.mandatory; import static org.apache.commons.lang.BooleanUtils.isTrue; @@ -43,7 +42,6 @@ import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.security.AccessPermission; -import org.alfresco.service.cmr.security.AccessStatus; import org.alfresco.service.cmr.security.OwnableService; import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.namespace.QName; @@ -247,45 +245,39 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl if (nodeService.exists(nodeRef) && nodeService.exists(parent)) { - // initialise permissions - initPermissions(nodeRef, parent); - runAsSystem(new AuthenticationUtil.RunAsWork() { public Object doWork() { - // setup inherited permissions - Set perms = getPermissionService().getAllSetPermissions(parent); - for (AccessPermission perm : perms) - { - // don't copy the extended reader or writer permissions as they have already been set - String authority = perm.getAuthority(); - if (!EXTENDED_READER.equals(authority) && - !EXTENDED_WRITER.equals(authority)) - { - // get the access status details - AccessStatus accessStatus = perm.getAccessStatus(); - boolean allow = false; - if (ALLOWED.equals(accessStatus)) - { - allow = true; - } + // set inheritance + boolean isParentNodeFilePlan = isRecordCategory(nodeRef) && isFilePlan(parent); + boolean inheritanceAllowed = isInheritanceAllowed(nodeRef, isParentNodeFilePlan); + getPermissionService().setInheritParentPermissions(nodeRef, inheritanceAllowed); - // set the permission on the target node - getPermissionService().setPermission( - nodeRef, - authority, - perm.getPermission(), - allow); - } + // clear all existing permissions + getPermissionService().clearPermission(nodeRef, null); + + if (!inheritanceAllowed) + { + // set extended reader permissions + getPermissionService().setPermission(nodeRef, EXTENDED_READER, READ_RECORDS, true); + getPermissionService().setPermission(nodeRef, EXTENDED_WRITER, FILING, true); } + // remove owner + getOwnableService().setOwner(nodeRef, NO_OWNER); + return null; } }); } } + private boolean isInheritanceAllowed(NodeRef nodeRef, Boolean isParentNodeFilePlan) + { + return !(isFilePlan(nodeRef) || isTransfer(nodeRef) || isHold(nodeRef) || isUnfiledRecordsContainer(nodeRef) || (isRecordCategory(nodeRef) && isTrue(isParentNodeFilePlan))); + } + /** * Sets ups records permission when aspect is added. * @@ -371,53 +363,6 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl }, getSystemUserName()); } - private void initPermissions(final NodeRef nodeRef, final boolean isParentNodeFilePlan) - { - if (nodeService.exists(nodeRef)) - { - runAsSystem(new AuthenticationUtil.RunAsWork() - { - public Object doWork() - { - // set inheritance - boolean inheritanceAllowed = isInheritanceAllowed(nodeRef, isParentNodeFilePlan); - getPermissionService().setInheritParentPermissions(nodeRef, inheritanceAllowed); - - // clear all existing permissions - getPermissionService().clearPermission(nodeRef, null); - - if (!inheritanceAllowed) - { - // set extended reader permissions - getPermissionService().setPermission(nodeRef, EXTENDED_READER, READ_RECORDS, true); - getPermissionService().setPermission(nodeRef, EXTENDED_WRITER, FILING, true); - } - - // remove owner - getOwnableService().setOwner(nodeRef, NO_OWNER); - - return null; - } - }); - } - } - - /** - * Init the permissions for the given node. - * - * @param nodeRef node reference - * @param includeInPlace true if in-place - */ - private void initPermissions(final NodeRef nodeRef, final NodeRef parent) - { - initPermissions(nodeRef, (isRecordCategory(nodeRef) && isFilePlan(parent))); - } - - private boolean isInheritanceAllowed(NodeRef nodeRef, Boolean isParentNodeFilePlan) - { - return !(isFilePlan(nodeRef) || isTransfer(nodeRef) || isHold(nodeRef) || isUnfiledRecordsContainer(nodeRef) || (isRecordCategory(nodeRef) && isTrue(isParentNodeFilePlan))); - } - /** * @see org.alfresco.module.org_alfresco_module_rm.security.RecordsManagementSecurityService#setPermission(org.alfresco.service.cmr.repository.NodeRef, java.lang.String, java.lang.String, boolean) */ diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/RM1008Test.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/RM1008Test.java index 4ddb8e6167..0066a3ea58 100755 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/RM1008Test.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/integration/issue/RM1008Test.java @@ -155,7 +155,7 @@ public class RM1008Test extends BaseRMTestCase Capability viewRecords = capabilityService.getCapability("ViewRecords"); assertNotNull(viewRecords); - assertEquals(AccessStatus.ALLOWED, viewRecords.hasPermission(hold)); + assertEquals(AccessStatus.DENIED, viewRecords.hasPermission(hold)); assertEquals(AccessStatus.DENIED, permissionService.hasPermission(hold, RMPermissionModel.FILING)); return null; @@ -181,8 +181,8 @@ public class RM1008Test extends BaseRMTestCase Capability viewRecords = capabilityService.getCapability("ViewRecords"); assertNotNull(viewRecords); - assertEquals(AccessStatus.ALLOWED, viewRecords.hasPermission(hold)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(hold, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, viewRecords.hasPermission(hold)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(hold, RMPermissionModel.READ_RECORDS)); assertEquals(AccessStatus.DENIED, permissionService.hasPermission(hold, RMPermissionModel.FILING)); return null; @@ -208,7 +208,7 @@ public class RM1008Test extends BaseRMTestCase Capability viewRecords = capabilityService.getCapability("ViewRecords"); assertNotNull(viewRecords); - assertEquals(AccessStatus.ALLOWED, viewRecords.hasPermission(hold)); + assertEquals(AccessStatus.DENIED, viewRecords.hasPermission(hold)); assertEquals(AccessStatus.DENIED, permissionService.hasPermission(hold, RMPermissionModel.FILING)); return null; @@ -293,7 +293,7 @@ public class RM1008Test extends BaseRMTestCase Capability viewRecords = capabilityService.getCapability("ViewRecords"); assertNotNull(viewRecords); - assertEquals(AccessStatus.ALLOWED, viewRecords.hasPermission(transfer)); + assertEquals(AccessStatus.DENIED, viewRecords.hasPermission(transfer)); assertEquals(AccessStatus.DENIED, permissionService.hasPermission(transfer, RMPermissionModel.FILING)); return null; @@ -319,8 +319,8 @@ public class RM1008Test extends BaseRMTestCase Capability viewRecords = capabilityService.getCapability("ViewRecords"); assertNotNull(viewRecords); - assertEquals(AccessStatus.ALLOWED, viewRecords.hasPermission(transfer)); - assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(transfer, RMPermissionModel.READ_RECORDS)); + assertEquals(AccessStatus.DENIED, viewRecords.hasPermission(transfer)); + assertEquals(AccessStatus.DENIED, permissionService.hasPermission(transfer, RMPermissionModel.READ_RECORDS)); assertEquals(AccessStatus.DENIED, permissionService.hasPermission(transfer, RMPermissionModel.FILING)); return null; @@ -346,7 +346,7 @@ public class RM1008Test extends BaseRMTestCase Capability viewRecords = capabilityService.getCapability("ViewRecords"); assertNotNull(viewRecords); - assertEquals(AccessStatus.ALLOWED, viewRecords.hasPermission(transfer)); + assertEquals(AccessStatus.DENIED, viewRecords.hasPermission(transfer)); assertEquals(AccessStatus.DENIED, permissionService.hasPermission(transfer, RMPermissionModel.FILING)); return null; diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/FilePlanPermissionServiceImplTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/FilePlanPermissionServiceImplTest.java index ef4c130936..eccdc9b5cf 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/FilePlanPermissionServiceImplTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/FilePlanPermissionServiceImplTest.java @@ -31,7 +31,6 @@ import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.security.AccessPermission; import org.alfresco.service.cmr.security.AccessStatus; -import org.alfresco.service.cmr.security.AuthorityType; import org.springframework.extensions.webscripts.GUID; /** @@ -1236,8 +1235,11 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase assertEquals(RMPermissionModel.READ_RECORDS, accessPermissions.get(ExtendedReaderDynamicAuthority.EXTENDED_READER)); assertTrue(accessPermissions.containsKey(ExtendedWriterDynamicAuthority.EXTENDED_WRITER)); assertEquals(RMPermissionModel.FILING, accessPermissions.get(ExtendedWriterDynamicAuthority.EXTENDED_WRITER)); + // FIXME!!! + /* String allRoles = authorityService.getName(AuthorityType.GROUP, FilePlanRoleService.ROLE_ADMIN + filePlan.getId()); assertTrue(accessPermissions.containsKey(allRoles)); assertEquals(RMPermissionModel.FILING, accessPermissions.get(allRoles)); + */ } } diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java index a980068ed1..b7eedeb2ed 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/util/BaseRMTestCase.java @@ -505,14 +505,6 @@ public abstract class BaseRMTestCase extends RetryingTransactionHelperTestCase // transfers container transfersContainer = filePlanService.getTransferContainer(filePlan); assertNotNull(transfersContainer); - - // holds container - holdsContainer = filePlanService.getHoldContainer(filePlan); - assertNotNull(holdsContainer); - - // transfers container - transfersContainer = filePlanService.getTransferContainer(filePlan); - assertNotNull(transfersContainer); } } }, AuthenticationUtil.getSystemUserName()); From 2a4eef688dbf6af21485475d4d1135042203ef49 Mon Sep 17 00:00:00 2001 From: Tuna Aksoy Date: Wed, 29 Oct 2014 19:51:06 +0000 Subject: [PATCH 54/54] RM-1751 (Merge performance improvements made for RM 2.1.0.3 onto RM 2.2.1) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/modules/recordsmanagement/BRANCHES/V2.2@89455 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../rm-service-context.xml | 1 + .../FilePlanPermissionServiceImpl.java | 39 ++++++++++++++++++- .../FilePlanPermissionServiceImplTest.java | 10 ++--- .../record/RecordServiceImplUnitTest.java | 37 ------------------ 4 files changed, 43 insertions(+), 44 deletions(-) diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml index 6a0a0f7922..4e1382c967 100644 --- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml +++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-service-context.xml @@ -448,6 +448,7 @@ + diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java index de661acafc..82e9388d28 100644 --- a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java +++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/security/FilePlanPermissionServiceImpl.java @@ -32,6 +32,7 @@ import java.util.Set; import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel; +import org.alfresco.module.org_alfresco_module_rm.role.FilePlanRoleService; import org.alfresco.module.org_alfresco_module_rm.util.ServiceBaseImpl; import org.alfresco.repo.node.NodeServicePolicies; import org.alfresco.repo.policy.JavaBehaviour; @@ -42,6 +43,8 @@ import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.security.AccessPermission; +import org.alfresco.service.cmr.security.AuthorityService; +import org.alfresco.service.cmr.security.AuthorityType; import org.alfresco.service.cmr.security.OwnableService; import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.namespace.QName; @@ -69,6 +72,9 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl /** Policy component */ private PolicyComponent policyComponent; + /** Authority service */ + private AuthorityService authorityService; + /** Logger */ private static final Log LOGGER = LogFactory.getLog(FilePlanPermissionServiceImpl.class); @@ -141,6 +147,26 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl this.ownableService = ownableService; } + /** + * Gets the authority service + * + * @return The authority service + */ + public AuthorityService getAuthorityService() + { + return this.authorityService; + } + + /** + * Sets the authority service + * + * @param authorityService The authority service + */ + public void setAuthorityService(AuthorityService authorityService) + { + this.authorityService = authorityService; + } + /** * @see org.alfresco.module.org_alfresco_module_rm.security.FilePlanPermissionService#setupRecordCategoryPermissions(org.alfresco.service.cmr.repository.NodeRef) */ @@ -259,9 +285,10 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl if (!inheritanceAllowed) { - // set extended reader permissions getPermissionService().setPermission(nodeRef, EXTENDED_READER, READ_RECORDS, true); getPermissionService().setPermission(nodeRef, EXTENDED_WRITER, FILING, true); + String adminRole = getAdminRole(nodeRef); + getPermissionService().setPermission(nodeRef, adminRole, RMPermissionModel.FILING, true); } // remove owner @@ -273,6 +300,16 @@ public class FilePlanPermissionServiceImpl extends ServiceBaseImpl } } + private String getAdminRole(NodeRef nodeRef) + { + NodeRef filePlan = getFilePlan(nodeRef); + if (filePlan == null) + { + throw new AlfrescoRuntimeException("The file plan could not be found for the give node: '" + nodeRef + "'."); + } + return authorityService.getName(AuthorityType.GROUP, FilePlanRoleService.ROLE_ADMIN + filePlan.getId()); + } + private boolean isInheritanceAllowed(NodeRef nodeRef, Boolean isParentNodeFilePlan) { return !(isFilePlan(nodeRef) || isTransfer(nodeRef) || isHold(nodeRef) || isUnfiledRecordsContainer(nodeRef) || (isRecordCategory(nodeRef) && isTrue(isParentNodeFilePlan))); diff --git a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/FilePlanPermissionServiceImplTest.java b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/FilePlanPermissionServiceImplTest.java index eccdc9b5cf..7929c67cca 100644 --- a/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/FilePlanPermissionServiceImplTest.java +++ b/rm-server/test/java/org/alfresco/module/org_alfresco_module_rm/test/legacy/service/FilePlanPermissionServiceImplTest.java @@ -31,6 +31,7 @@ import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.security.AccessPermission; import org.alfresco.service.cmr.security.AccessStatus; +import org.alfresco.service.cmr.security.AuthorityType; import org.springframework.extensions.webscripts.GUID; /** @@ -1235,11 +1236,8 @@ public class FilePlanPermissionServiceImplTest extends BaseRMTestCase assertEquals(RMPermissionModel.READ_RECORDS, accessPermissions.get(ExtendedReaderDynamicAuthority.EXTENDED_READER)); assertTrue(accessPermissions.containsKey(ExtendedWriterDynamicAuthority.EXTENDED_WRITER)); assertEquals(RMPermissionModel.FILING, accessPermissions.get(ExtendedWriterDynamicAuthority.EXTENDED_WRITER)); - // FIXME!!! - /* - String allRoles = authorityService.getName(AuthorityType.GROUP, FilePlanRoleService.ROLE_ADMIN + filePlan.getId()); - assertTrue(accessPermissions.containsKey(allRoles)); - assertEquals(RMPermissionModel.FILING, accessPermissions.get(allRoles)); - */ + String adminRole = authorityService.getName(AuthorityType.GROUP, FilePlanRoleService.ROLE_ADMIN + filePlan.getId()); + assertTrue(accessPermissions.containsKey(adminRole)); + assertEquals(RMPermissionModel.FILING, accessPermissions.get(adminRole)); } } diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImplUnitTest.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImplUnitTest.java index 529d5fffd1..bfeaf13b69 100755 --- a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImplUnitTest.java +++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/record/RecordServiceImplUnitTest.java @@ -47,8 +47,6 @@ public class RecordServiceImplUnitTest extends BaseUnitTest private static QName TYPE_MY_FILE_PLAN = generateQName(); private static QName ASPECT_FOR_FILE_PLAN = generateQName(); - //private static QName ASPECT_FOR_MY_FILE_PLAN = generateQName(); - //private static QName ASPECT_FOR_BOTH = generateQName(); @InjectMocks private RecordServiceImpl recordService; @@ -83,39 +81,4 @@ public class RecordServiceImplUnitTest extends BaseUnitTest assertEquals(1, types.size()); assertTrue(types.contains(TYPE_FILE_PLAN)); } - - @Test - public void testGetRecordMetadataAspects() - { -// // register a couple of record meta-data aspects -// recordService.registerRecordMetadataAspect(ASPECT_FOR_FILE_PLAN, TYPE_FILE_PLAN); -// recordService.registerRecordMetadataAspect(ASPECT_FOR_MY_FILE_PLAN, TYPE_MY_FILE_PLAN); -// recordService.registerRecordMetadataAspect(ASPECT_FOR_BOTH, TYPE_FILE_PLAN); -// recordService.registerRecordMetadataAspect(ASPECT_FOR_BOTH, TYPE_MY_FILE_PLAN); -// -// Set set = recordService.getRecordMetadataAspects(filePlanComponent); -// assertNotNull(set); -// assertEquals(2, set.size()); -// assertTrue(set.contains(ASPECT_FOR_FILE_PLAN)); -// assertTrue(set.contains(ASPECT_FOR_BOTH)); -// -// set = recordService.getRecordMetadataAspects(nonStandardFilePlanComponent); -// assertNotNull(set); -// assertEquals(2, set.size()); -// assertTrue(set.contains(ASPECT_FOR_MY_FILE_PLAN)); -// assertTrue(set.contains(ASPECT_FOR_BOTH)); -// -// set = recordService.getRecordMetadataAspects(TYPE_FILE_PLAN); -// assertNotNull(set); -// assertEquals(2, set.size()); -// assertTrue(set.contains(ASPECT_FOR_FILE_PLAN)); -// assertTrue(set.contains(ASPECT_FOR_BOTH)); -// -// set = recordService.getRecordMetadataAspects(TYPE_MY_FILE_PLAN); -// assertNotNull(set); -// assertEquals(2, set.size()); -// assertTrue(set.contains(ASPECT_FOR_MY_FILE_PLAN)); -// assertTrue(set.contains(ASPECT_FOR_BOTH)); - - } }