From 36a54bc6ab3a7048c7d4303b7a26057455b7aee4 Mon Sep 17 00:00:00 2001 From: Frederik Heremans Date: Thu, 12 Jul 2012 12:31:40 +0000 Subject: [PATCH] Merged BRANCHES/DEV/V4.1-BUG-FIX/root to HEAD/root: 39191: ALF-14863: no scope is available when ScriptNode is used from within Activiti expression, causes issue when scope is needed (eg. creating javascript-arrays) + fixed typo in activiti-source jars git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@39196 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../workflow/activiti/ActivitiScriptNode.java | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/source/java/org/alfresco/repo/workflow/activiti/ActivitiScriptNode.java b/source/java/org/alfresco/repo/workflow/activiti/ActivitiScriptNode.java index 884fdc822e..63a65da7d7 100644 --- a/source/java/org/alfresco/repo/workflow/activiti/ActivitiScriptNode.java +++ b/source/java/org/alfresco/repo/workflow/activiti/ActivitiScriptNode.java @@ -22,10 +22,10 @@ import java.io.Serializable; import java.util.Date; import org.alfresco.repo.jscript.ScriptNode; -import org.alfresco.repo.workflow.jbpm.JBPMNode; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.namespace.QName; +import org.mozilla.javascript.Context; import org.mozilla.javascript.Scriptable; /** @@ -80,9 +80,14 @@ public class ActivitiScriptNode extends ScriptNode @Override public Serializable convertValueForScript(ServiceRegistry serviceRegistry, Scriptable theScope, QName qname, Serializable value) { + // ALF-14863: If script-node is used outside of Script-call (eg. Activiti evaluating an expression that contains variables of type ScriptNode) + // a scope should be created solely for this conversion. The scope will ALWAYS be set when value-conversion is called from the + // ScriptProcessor + ensureScopePresent(); + if (value instanceof NodeRef) { - return new JBPMNode(((NodeRef)value), serviceRegistry); + return new ActivitiScriptNode(((NodeRef)value), serviceRegistry); } else if (value instanceof Date) { @@ -93,5 +98,27 @@ public class ActivitiScriptNode extends ScriptNode return super.convertValueForScript(serviceRegistry, theScope, qname, value); } } + + private void ensureScopePresent() { + if(scope == null) { + // Create a scope for the value conversion. This scope will be an empty scope exposing basic Object and Function, sufficient for value-conversion. + // In case no context is active for the current thread, we can safely enter end exit one to get hold of a scope + Context ctx = Context.getCurrentContext(); + boolean closeContext = false; + if(ctx == null) + { + ctx = Context.enter(); + closeContext = true; + } + + scope = ctx.initStandardObjects(); + scope.setParentScope(null); + + if(closeContext) { + // Only an exit call should be done when context didn't exist before + Context.exit(); + } + } + } } } \ No newline at end of file