From 14ab9ee541da28c2b2570a7730b31374de6128c6 Mon Sep 17 00:00:00 2001 From: Raluca Munteanu Date: Thu, 1 Apr 2021 19:39:36 +0300 Subject: [PATCH 1/5] MNT-22138: Document Filed to RM File Plan under categories with cut off retention schedule no longer accessible to non admin users in collab site - Fixed access denied issue by running code as system. --- .../jscript/app/JSONConversionComponent.java | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/JSONConversionComponent.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/JSONConversionComponent.java index f6b2f8bf51..578c475847 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/JSONConversionComponent.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/JSONConversionComponent.java @@ -510,25 +510,31 @@ public class JSONConversionComponent extends org.alfresco.repo.jscript.app.JS // Set the indicators array setIndicators(rmNodeValues, nodeRef); - // Set the actions array - setActions(rmNodeValues, nodeRef); + AuthenticationUtil.runAsSystem(new RunAsWork() { + @Override + public Void doWork() { - - //Add details of the next incomplete event in the disposition schedule - if(dispositionService.getNextDispositionAction(nodeRef) != null) - { - for(EventCompletionDetails details: dispositionService.getNextDispositionAction(nodeRef).getEventCompletionDetails()) - { - if(!details.isEventComplete()) + // Set the actions array + setActions(rmNodeValues, nodeRef); + + //Add details of the next incomplete event in the disposition schedule + if (dispositionService.getNextDispositionAction(nodeRef) != null) { - HashMap properties = ((HashMap) rmNodeValues.get("properties")); - properties.put("combineDispositionStepConditions", nodeService.getProperty(dispositionService.getNextDispositionAction(nodeRef).getDispositionActionDefinition().getNodeRef(), PROP_COMBINE_DISPOSITION_STEP_CONDITIONS)); - properties.put("incompleteDispositionEvent", details.getEventName()); - properties.put("dispositionEventCombination", nodeService.getProperty(dispositionService.getNextDispositionAction(nodeRef).getDispositionActionDefinition().getNodeRef(), PROP_DISPOSITION_EVENT_COMBINATION)); - break; + for (EventCompletionDetails details : dispositionService.getNextDispositionAction(nodeRef).getEventCompletionDetails()) + { + if (!details.isEventComplete()) + { + HashMap properties = ((HashMap) rmNodeValues.get("properties")); + properties.put("combineDispositionStepConditions", nodeService.getProperty(dispositionService.getNextDispositionAction(nodeRef).getDispositionActionDefinition().getNodeRef(), PROP_COMBINE_DISPOSITION_STEP_CONDITIONS)); + properties.put("incompleteDispositionEvent", details.getEventName()); + properties.put("dispositionEventCombination", nodeService.getProperty(dispositionService.getNextDispositionAction(nodeRef).getDispositionActionDefinition().getNodeRef(), PROP_DISPOSITION_EVENT_COMBINATION)); + break; + } + } } + return null; } - } + }); return rmNodeValues; } From a6aa711657efe84c1195db564adee763b59162c3 Mon Sep 17 00:00:00 2001 From: Raluca Munteanu Date: Fri, 2 Apr 2021 17:23:23 +0300 Subject: [PATCH 2/5] MNT-22138: Document Filed to RM File Plan under categories with cut off retention schedule no longer accessible to non admin users in collab site - Limited to certain code blocks to run as system. --- .../disposition/DispositionServiceImpl.java | 119 ++++++++---------- .../jscript/app/JSONConversionComponent.java | 20 +-- 2 files changed, 66 insertions(+), 73 deletions(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java index 58631a2149..71261bb47f 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java @@ -894,79 +894,70 @@ public class DispositionServiceImpl extends ServiceBaseImpl @Override public boolean isNextDispositionActionEligible(NodeRef nodeRef) { - boolean result = false; - // Get the disposition instructions - DispositionSchedule di = getDispositionSchedule(nodeRef); - DispositionAction nextDa = getNextDispositionAction(nodeRef); - if (di != null && - this.nodeService.hasAspect(nodeRef, ASPECT_DISPOSITION_LIFECYCLE) && - nextDa != null) + return authenticationUtil.runAsSystem(new RunAsWork() { - // for accession step we can have also AND between step conditions - Boolean combineSteps = false; - if (nextDa.getName().equals("accession")) + public Boolean doWork() throws Exception { - NodeRef accessionNodeRef = di.getDispositionActionDefinitionByName("accession").getNodeRef(); - if (accessionNodeRef != null) { - Boolean combineStepsProp = (Boolean)this.nodeService.getProperty(accessionNodeRef, PROP_COMBINE_DISPOSITION_STEP_CONDITIONS); - if (combineStepsProp != null) - { - combineSteps = combineStepsProp; - } - } - } - Date asOf = (Date)this.nodeService.getProperty(nextDa.getNodeRef(), PROP_DISPOSITION_AS_OF); - Boolean asOfDateInPast = false; - if (asOf != null) - { - asOfDateInPast = asOf.before(new Date()); - } - if (asOfDateInPast && !combineSteps) - { - return true; - } - else if(!asOfDateInPast && combineSteps) - { - return false; - } - DispositionAction da = new DispositionActionImpl(serviceRegistry, nextDa.getNodeRef()); - DispositionActionDefinition dad = da.getDispositionActionDefinition(); - if (dad != null) - { - boolean firstComplete = dad.eligibleOnFirstCompleteEvent(); - - List assocs = this.nodeService.getChildAssocs(nextDa.getNodeRef(), ASSOC_EVENT_EXECUTIONS, RegexQNamePattern.MATCH_ALL); - for (ChildAssociationRef assoc : assocs) - { - NodeRef eventExecution = assoc.getChildRef(); - Boolean isCompleteValue = (Boolean)this.nodeService.getProperty(eventExecution, PROP_EVENT_EXECUTION_COMPLETE); - boolean isComplete = false; - if (isCompleteValue != null) - { - isComplete = isCompleteValue.booleanValue(); - - // implement AND and OR combination of event completions - if (isComplete) - { - result = true; - if (firstComplete) - { - break; + boolean result = false; + // Get the disposition instructions + DispositionSchedule di = getDispositionSchedule(nodeRef); + DispositionAction nextDa = getNextDispositionAction(nodeRef); + if (di != null && + nodeService.hasAspect(nodeRef, ASPECT_DISPOSITION_LIFECYCLE) && + nextDa != null) { + // for accession step we can have also AND between step conditions + Boolean combineSteps = false; + if (nextDa.getName().equals("accession")) { + NodeRef accessionNodeRef = di.getDispositionActionDefinitionByName("accession").getNodeRef(); + if (accessionNodeRef != null) { + Boolean combineStepsProp = (Boolean) nodeService.getProperty(accessionNodeRef, PROP_COMBINE_DISPOSITION_STEP_CONDITIONS); + if (combineStepsProp != null) { + combineSteps = combineStepsProp; } } - else - { - result = false; - if (!firstComplete) - { - break; + } + Date asOf = (Date) nodeService.getProperty(nextDa.getNodeRef(), PROP_DISPOSITION_AS_OF); + Boolean asOfDateInPast = false; + if (asOf != null) { + asOfDateInPast = asOf.before(new Date()); + } + if (asOfDateInPast && !combineSteps) { + return true; + } else if (!asOfDateInPast && combineSteps) { + return false; + } + DispositionAction da = new DispositionActionImpl(serviceRegistry, nextDa.getNodeRef()); + DispositionActionDefinition dad = da.getDispositionActionDefinition(); + if (dad != null) { + boolean firstComplete = dad.eligibleOnFirstCompleteEvent(); + + List assocs = nodeService.getChildAssocs(nextDa.getNodeRef(), ASSOC_EVENT_EXECUTIONS, RegexQNamePattern.MATCH_ALL); + for (ChildAssociationRef assoc : assocs) { + NodeRef eventExecution = assoc.getChildRef(); + Boolean isCompleteValue = (Boolean) nodeService.getProperty(eventExecution, PROP_EVENT_EXECUTION_COMPLETE); + boolean isComplete = false; + if (isCompleteValue != null) { + isComplete = isCompleteValue.booleanValue(); + + // implement AND and OR combination of event completions + if (isComplete) { + result = true; + if (firstComplete) { + break; + } + } else { + result = false; + if (!firstComplete) { + break; + } + } } } } } + return result; } - } - return result; + }); } /** diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/JSONConversionComponent.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/JSONConversionComponent.java index 578c475847..d1b0a50374 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/JSONConversionComponent.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/JSONConversionComponent.java @@ -510,13 +510,14 @@ public class JSONConversionComponent extends org.alfresco.repo.jscript.app.JS // Set the indicators array setIndicators(rmNodeValues, nodeRef); - AuthenticationUtil.runAsSystem(new RunAsWork() { - @Override - public Void doWork() { + // Set the actions array + setActions(rmNodeValues, nodeRef); + + AuthenticationUtil.runAsSystem(new RunAsWork() + { + public Void doWork() throws Exception + { - // Set the actions array - setActions(rmNodeValues, nodeRef); - //Add details of the next incomplete event in the disposition schedule if (dispositionService.getNextDispositionAction(nodeRef) != null) { @@ -525,9 +526,10 @@ public class JSONConversionComponent extends org.alfresco.repo.jscript.app.JS if (!details.isEventComplete()) { HashMap properties = ((HashMap) rmNodeValues.get("properties")); - properties.put("combineDispositionStepConditions", nodeService.getProperty(dispositionService.getNextDispositionAction(nodeRef).getDispositionActionDefinition().getNodeRef(), PROP_COMBINE_DISPOSITION_STEP_CONDITIONS)); - properties.put("incompleteDispositionEvent", details.getEventName()); - properties.put("dispositionEventCombination", nodeService.getProperty(dispositionService.getNextDispositionAction(nodeRef).getDispositionActionDefinition().getNodeRef(), PROP_DISPOSITION_EVENT_COMBINATION)); + properties.put("combineDispositionStepConditions", nodeService.getProperty(dispositionService.getNextDispositionAction(nodeRef).getDispositionActionDefinition().getNodeRef(), PROP_COMBINE_DISPOSITION_STEP_CONDITIONS)); + properties.put("incompleteDispositionEvent", details.getEventName()); + properties.put("dispositionEventCombination", nodeService.getProperty(dispositionService.getNextDispositionAction(nodeRef).getDispositionActionDefinition().getNodeRef(), PROP_DISPOSITION_EVENT_COMBINATION)); + break; } } From 63f7887f80fb07d966a83cd8ca27288dcbfb7474 Mon Sep 17 00:00:00 2001 From: Raluca Munteanu Date: Tue, 6 Apr 2021 15:38:19 +0300 Subject: [PATCH 3/5] MNT22138: Document Filed to RM File Plan under categories with cut off retention schedule no longer accessible to non admin users in collab site - Added fix for issue cought by ui tests --- .../disposition/DispositionScheduleImpl.java | 9 ++- .../disposition/DispositionServiceImpl.java | 75 +++++++++++-------- 2 files changed, 53 insertions(+), 31 deletions(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionScheduleImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionScheduleImpl.java index fb3d654032..e18177b349 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionScheduleImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionScheduleImpl.java @@ -133,7 +133,14 @@ public class DispositionScheduleImpl implements DispositionSchedule, { if (this.actions == null) { - getDispositionActionsImpl(); + authenticationUtil.runAsSystem(new AuthenticationUtil.RunAsWork() + { + public Void doWork() throws Exception + { + getDispositionActionsImpl(); + return null; + } + }); } DispositionActionDefinition actionDef = this.actionsById.get(id); diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java index 71261bb47f..fdc8a936dd 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java @@ -27,16 +27,6 @@ package org.alfresco.module.org_alfresco_module_rm.disposition; -import static org.apache.commons.lang3.BooleanUtils.isNotTrue; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -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.RecordsManagementPolicies; @@ -73,6 +63,11 @@ import org.alfresco.util.ParameterCheck; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.Serializable; +import java.util.*; + +import static org.apache.commons.lang3.BooleanUtils.isNotTrue; + /** * Disposition service implementation. * @@ -439,26 +434,30 @@ public class DispositionServiceImpl extends ServiceBaseImpl */ private NodeRef getAssociatedDispositionScheduleImpl(NodeRef nodeRef) { - NodeRef result = null; ParameterCheck.mandatory("nodeRef", nodeRef); - // Make sure we are dealing with an RM node - if (!filePlanService.isFilePlanComponent(nodeRef)) + return authenticationUtil.runAsSystem(new RunAsWork() { - throw new AlfrescoRuntimeException("Can not find the associated retention schedule for a non records management component. (nodeRef=" + nodeRef.toString() + ")"); - } - - if (this.nodeService.hasAspect(nodeRef, ASPECT_SCHEDULED)) - { - List childAssocs = this.nodeService.getChildAssocs(nodeRef, ASSOC_DISPOSITION_SCHEDULE, RegexQNamePattern.MATCH_ALL); - if (!childAssocs.isEmpty()) + public NodeRef doWork() throws Exception { - ChildAssociationRef firstChildAssocRef = childAssocs.get(0); - result = firstChildAssocRef.getChildRef(); + NodeRef result = null; + // Make sure we are dealing with an RM node + if (!filePlanService.isFilePlanComponent(nodeRef)) + { + throw new AlfrescoRuntimeException("Can not find the associated retention schedule for a non records management component. (nodeRef=" + nodeRef.toString() + ")"); + } + if (nodeService.hasAspect(nodeRef, ASPECT_SCHEDULED)) + { + List childAssocs = nodeService.getChildAssocs(nodeRef, ASSOC_DISPOSITION_SCHEDULE, RegexQNamePattern.MATCH_ALL); + if (!childAssocs.isEmpty()) + { + ChildAssociationRef firstChildAssocRef = childAssocs.get(0); + result = firstChildAssocRef.getChildRef(); + } + } + return result; } - } - - return result; + }); } /** @@ -894,14 +893,15 @@ public class DispositionServiceImpl extends ServiceBaseImpl @Override public boolean isNextDispositionActionEligible(NodeRef nodeRef) { + // Get the disposition instructions + DispositionSchedule di = getDispositionSchedule(nodeRef); + DispositionAction nextDa = getNextDispositionAction(nodeRef); return authenticationUtil.runAsSystem(new RunAsWork() { public Boolean doWork() throws Exception { boolean result = false; - // Get the disposition instructions - DispositionSchedule di = getDispositionSchedule(nodeRef); - DispositionAction nextDa = getNextDispositionAction(nodeRef); + if (di != null && nodeService.hasAspect(nodeRef, ASPECT_DISPOSITION_LIFECYCLE) && nextDa != null) { @@ -1218,7 +1218,15 @@ public class DispositionServiceImpl extends ServiceBaseImpl public Date getDispositionActionDate(NodeRef record, NodeRef dispositionSchedule, String dispositionActionName) { DispositionSchedule ds = new DispositionScheduleImpl(serviceRegistry, nodeService, dispositionSchedule); - List assocs = nodeService.getChildAssocs(dispositionSchedule); + List assocs = AuthenticationUtil.runAsSystem(new RunAsWork >() + { + @Override + public List doWork() + { + return nodeService.getChildAssocs(dispositionSchedule); + } + }); + if (assocs != null && !assocs.isEmpty()) { for (ChildAssociationRef assoc : assocs) @@ -1226,7 +1234,14 @@ public class DispositionServiceImpl extends ServiceBaseImpl if (assoc != null && assoc.getQName().getLocalName().contains(dispositionActionName)) { DispositionActionDefinition actionDefinition = ds.getDispositionActionDefinition(assoc.getChildRef().getId()); - return calculateAsOfDate(record, actionDefinition); + + return authenticationUtil.runAsSystem(new RunAsWork() + { + public Date doWork() throws Exception + { + return calculateAsOfDate(record, actionDefinition); + } + }); } } } From c9f6293c2653c4b1aad02923546bd3322c738707 Mon Sep 17 00:00:00 2001 From: Raluca Munteanu Date: Mon, 19 Apr 2021 14:07:03 +0300 Subject: [PATCH 4/5] MNT-22138: [AGS] Document Filed to RM File Plan under categories with cut off retention schedule no longer accessible to non admin users in collab site - Added changes proposed at review --- .../disposition/DispositionServiceImpl.java | 183 +++++++++--------- .../jscript/app/JSONConversionComponent.java | 27 ++- 2 files changed, 101 insertions(+), 109 deletions(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java index fdc8a936dd..8cfdaa818c 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java @@ -27,6 +27,16 @@ package org.alfresco.module.org_alfresco_module_rm.disposition; +import static org.apache.commons.lang3.BooleanUtils.isNotTrue; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +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.RecordsManagementPolicies; @@ -63,11 +73,6 @@ import org.alfresco.util.ParameterCheck; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.Serializable; -import java.util.*; - -import static org.apache.commons.lang3.BooleanUtils.isNotTrue; - /** * Disposition service implementation. * @@ -434,30 +439,25 @@ public class DispositionServiceImpl extends ServiceBaseImpl */ private NodeRef getAssociatedDispositionScheduleImpl(NodeRef nodeRef) { + NodeRef result = null; ParameterCheck.mandatory("nodeRef", nodeRef); - return authenticationUtil.runAsSystem(new RunAsWork() + // Make sure we are dealing with an RM node + if (!filePlanService.isFilePlanComponent(nodeRef)) { - public NodeRef doWork() throws Exception + throw new AlfrescoRuntimeException("Can not find the associated retention schedule for a non records management component. (nodeRef=" + nodeRef.toString() + ")"); + } + if (getInternalNodeService().hasAspect(nodeRef, ASPECT_SCHEDULED)) + { + List childAssocs = getInternalNodeService().getChildAssocs(nodeRef, ASSOC_DISPOSITION_SCHEDULE, RegexQNamePattern.MATCH_ALL); + if (!childAssocs.isEmpty()) { - NodeRef result = null; - // Make sure we are dealing with an RM node - if (!filePlanService.isFilePlanComponent(nodeRef)) - { - throw new AlfrescoRuntimeException("Can not find the associated retention schedule for a non records management component. (nodeRef=" + nodeRef.toString() + ")"); - } - if (nodeService.hasAspect(nodeRef, ASPECT_SCHEDULED)) - { - List childAssocs = nodeService.getChildAssocs(nodeRef, ASSOC_DISPOSITION_SCHEDULE, RegexQNamePattern.MATCH_ALL); - if (!childAssocs.isEmpty()) - { - ChildAssociationRef firstChildAssocRef = childAssocs.get(0); - result = firstChildAssocRef.getChildRef(); - } - } - return result; + ChildAssociationRef firstChildAssocRef = childAssocs.get(0); + result = firstChildAssocRef.getChildRef(); } - }); + } + + return result; } /** @@ -893,71 +893,81 @@ public class DispositionServiceImpl extends ServiceBaseImpl @Override public boolean isNextDispositionActionEligible(NodeRef nodeRef) { + boolean result = false; // Get the disposition instructions DispositionSchedule di = getDispositionSchedule(nodeRef); DispositionAction nextDa = getNextDispositionAction(nodeRef); - return authenticationUtil.runAsSystem(new RunAsWork() - { - public Boolean doWork() throws Exception - { - boolean result = false; - if (di != null && - nodeService.hasAspect(nodeRef, ASPECT_DISPOSITION_LIFECYCLE) && - nextDa != null) { - // for accession step we can have also AND between step conditions - Boolean combineSteps = false; - if (nextDa.getName().equals("accession")) { - NodeRef accessionNodeRef = di.getDispositionActionDefinitionByName("accession").getNodeRef(); - if (accessionNodeRef != null) { - Boolean combineStepsProp = (Boolean) nodeService.getProperty(accessionNodeRef, PROP_COMBINE_DISPOSITION_STEP_CONDITIONS); - if (combineStepsProp != null) { - combineSteps = combineStepsProp; + if (di != null && + nodeService.hasAspect(nodeRef, ASPECT_DISPOSITION_LIFECYCLE) && + nextDa != null) + { + // for accession step we can have also AND between step conditions + boolean combineSteps = false; + if (nextDa.getName().equals("accession")) + { + NodeRef accessionNodeRef = di.getDispositionActionDefinitionByName("accession").getNodeRef(); + if (accessionNodeRef != null) + { + Boolean combineStepsProp = (Boolean) getInternalNodeService().getProperty(accessionNodeRef, PROP_COMBINE_DISPOSITION_STEP_CONDITIONS); + if (combineStepsProp != null) + { + combineSteps = combineStepsProp; + } + } + } + Date asOf = (Date) getInternalNodeService().getProperty(nextDa.getNodeRef(), PROP_DISPOSITION_AS_OF); + boolean asOfDateInPast = false; + if (asOf != null) + { + asOfDateInPast = asOf.before(new Date()); + } + if (asOfDateInPast && !combineSteps) + { + return true; + } else if (!asOfDateInPast && combineSteps) + { + return false; + } + DispositionAction da = new DispositionActionImpl(serviceRegistry, nextDa.getNodeRef()); + DispositionActionDefinition dad = da.getDispositionActionDefinition(); + if (dad != null) + { + boolean firstComplete = authenticationUtil.runAsSystem(() -> dad.eligibleOnFirstCompleteEvent()); + + List assocs = getInternalNodeService().getChildAssocs(nextDa.getNodeRef(), ASSOC_EVENT_EXECUTIONS, + RegexQNamePattern.MATCH_ALL); + for (ChildAssociationRef assoc : assocs) + { + NodeRef eventExecution = assoc.getChildRef(); + Boolean isCompleteValue = (Boolean) getInternalNodeService().getProperty(eventExecution, PROP_EVENT_EXECUTION_COMPLETE); + boolean isComplete = false; + if (isCompleteValue != null) + { + isComplete = isCompleteValue.booleanValue(); + + // implement AND and OR combination of event completions + if (isComplete) + { + result = true; + if (firstComplete) + { + break; } } - } - Date asOf = (Date) nodeService.getProperty(nextDa.getNodeRef(), PROP_DISPOSITION_AS_OF); - Boolean asOfDateInPast = false; - if (asOf != null) { - asOfDateInPast = asOf.before(new Date()); - } - if (asOfDateInPast && !combineSteps) { - return true; - } else if (!asOfDateInPast && combineSteps) { - return false; - } - DispositionAction da = new DispositionActionImpl(serviceRegistry, nextDa.getNodeRef()); - DispositionActionDefinition dad = da.getDispositionActionDefinition(); - if (dad != null) { - boolean firstComplete = dad.eligibleOnFirstCompleteEvent(); - - List assocs = nodeService.getChildAssocs(nextDa.getNodeRef(), ASSOC_EVENT_EXECUTIONS, RegexQNamePattern.MATCH_ALL); - for (ChildAssociationRef assoc : assocs) { - NodeRef eventExecution = assoc.getChildRef(); - Boolean isCompleteValue = (Boolean) nodeService.getProperty(eventExecution, PROP_EVENT_EXECUTION_COMPLETE); - boolean isComplete = false; - if (isCompleteValue != null) { - isComplete = isCompleteValue.booleanValue(); - - // implement AND and OR combination of event completions - if (isComplete) { - result = true; - if (firstComplete) { - break; - } - } else { - result = false; - if (!firstComplete) { - break; - } - } + else + { + result = false; + if (!firstComplete) + { + break; } } } } - return result; } - }); + } + return result; } /** @@ -1218,14 +1228,7 @@ public class DispositionServiceImpl extends ServiceBaseImpl public Date getDispositionActionDate(NodeRef record, NodeRef dispositionSchedule, String dispositionActionName) { DispositionSchedule ds = new DispositionScheduleImpl(serviceRegistry, nodeService, dispositionSchedule); - List assocs = AuthenticationUtil.runAsSystem(new RunAsWork >() - { - @Override - public List doWork() - { - return nodeService.getChildAssocs(dispositionSchedule); - } - }); + List assocs = getInternalNodeService().getChildAssocs(dispositionSchedule); if (assocs != null && !assocs.isEmpty()) { @@ -1235,13 +1238,7 @@ public class DispositionServiceImpl extends ServiceBaseImpl { DispositionActionDefinition actionDefinition = ds.getDispositionActionDefinition(assoc.getChildRef().getId()); - return authenticationUtil.runAsSystem(new RunAsWork() - { - public Date doWork() throws Exception - { - return calculateAsOfDate(record, actionDefinition); - } - }); + return authenticationUtil.runAsSystem(() -> calculateAsOfDate(record, actionDefinition)); } } } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/JSONConversionComponent.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/JSONConversionComponent.java index d1b0a50374..073ada2b02 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/JSONConversionComponent.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/JSONConversionComponent.java @@ -513,29 +513,24 @@ public class JSONConversionComponent extends org.alfresco.repo.jscript.app.JS // Set the actions array setActions(rmNodeValues, nodeRef); - AuthenticationUtil.runAsSystem(new RunAsWork() - { - public Void doWork() throws Exception + AuthenticationUtil.runAsSystem((RunAsWork) () -> { + //Add details of the next incomplete event in the disposition schedule + if (dispositionService.getNextDispositionAction(nodeRef) != null) { - - //Add details of the next incomplete event in the disposition schedule - if (dispositionService.getNextDispositionAction(nodeRef) != null) + for (EventCompletionDetails details : dispositionService.getNextDispositionAction(nodeRef).getEventCompletionDetails()) { - for (EventCompletionDetails details : dispositionService.getNextDispositionAction(nodeRef).getEventCompletionDetails()) + if (!details.isEventComplete()) { - if (!details.isEventComplete()) - { - HashMap properties = ((HashMap) rmNodeValues.get("properties")); - properties.put("combineDispositionStepConditions", nodeService.getProperty(dispositionService.getNextDispositionAction(nodeRef).getDispositionActionDefinition().getNodeRef(), PROP_COMBINE_DISPOSITION_STEP_CONDITIONS)); - properties.put("incompleteDispositionEvent", details.getEventName()); - properties.put("dispositionEventCombination", nodeService.getProperty(dispositionService.getNextDispositionAction(nodeRef).getDispositionActionDefinition().getNodeRef(), PROP_DISPOSITION_EVENT_COMBINATION)); + HashMap properties = ((HashMap) rmNodeValues.get("properties")); + properties.put("combineDispositionStepConditions", nodeService.getProperty(dispositionService.getNextDispositionAction(nodeRef).getDispositionActionDefinition().getNodeRef(), PROP_COMBINE_DISPOSITION_STEP_CONDITIONS)); + properties.put("incompleteDispositionEvent", details.getEventName()); + properties.put("dispositionEventCombination", nodeService.getProperty(dispositionService.getNextDispositionAction(nodeRef).getDispositionActionDefinition().getNodeRef(), PROP_DISPOSITION_EVENT_COMBINATION)); - break; - } + break; } } - return null; } + return null; }); return rmNodeValues; From 6cdf32641212da512af72c9f73a7a42d3067a7f9 Mon Sep 17 00:00:00 2001 From: Raluca Munteanu Date: Mon, 26 Apr 2021 14:46:46 +0300 Subject: [PATCH 5/5] MNT-22138: [AGS] Document Filed to RM File Plan under categories with cut off retention schedule no longer accessible to non admin users in collab site - Adressed review comments and fixed ui test --- .../disposition/DispositionServiceImpl.java | 3 ++- .../jscript/app/JSONConversionComponent.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java index 8cfdaa818c..fb11b3da48 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/disposition/DispositionServiceImpl.java @@ -925,7 +925,8 @@ public class DispositionServiceImpl extends ServiceBaseImpl if (asOfDateInPast && !combineSteps) { return true; - } else if (!asOfDateInPast && combineSteps) + } + else if (!asOfDateInPast && combineSteps) { return false; } diff --git a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/JSONConversionComponent.java b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/JSONConversionComponent.java index 073ada2b02..ea09ba8d37 100644 --- a/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/JSONConversionComponent.java +++ b/rm-community/rm-community-repo/source/java/org/alfresco/module/org_alfresco_module_rm/jscript/app/JSONConversionComponent.java @@ -521,7 +521,7 @@ public class JSONConversionComponent extends org.alfresco.repo.jscript.app.JS { if (!details.isEventComplete()) { - HashMap properties = ((HashMap) rmNodeValues.get("properties")); + HashMap properties = (HashMap) rmNodeValues.get("properties"); properties.put("combineDispositionStepConditions", nodeService.getProperty(dispositionService.getNextDispositionAction(nodeRef).getDispositionActionDefinition().getNodeRef(), PROP_COMBINE_DISPOSITION_STEP_CONDITIONS)); properties.put("incompleteDispositionEvent", details.getEventName()); properties.put("dispositionEventCombination", nodeService.getProperty(dispositionService.getNextDispositionAction(nodeRef).getDispositionActionDefinition().getNodeRef(), PROP_DISPOSITION_EVENT_COMBINATION));