You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ra...@apache.org on 2006/02/10 06:28:38 UTC

svn commit: r376563 - /jakarta/commons/sandbox/scxml/trunk/src/main/java/org/apache/commons/scxml/env/jexl/JexlEvaluator.java

Author: rahul
Date: Thu Feb  9 21:28:36 2006
New Revision: 376563

URL: http://svn.apache.org/viewcvs?rev=376563&view=rev
Log:
Bah, we stopped using flat contexts a couple of days ago, missed this change then.

Problem reported by: sungchan <schanpark AT gmail DOT com>

Modified:
    jakarta/commons/sandbox/scxml/trunk/src/main/java/org/apache/commons/scxml/env/jexl/JexlEvaluator.java

Modified: jakarta/commons/sandbox/scxml/trunk/src/main/java/org/apache/commons/scxml/env/jexl/JexlEvaluator.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/scxml/trunk/src/main/java/org/apache/commons/scxml/env/jexl/JexlEvaluator.java?rev=376563&r1=376562&r2=376563&view=diff
==============================================================================
--- jakarta/commons/sandbox/scxml/trunk/src/main/java/org/apache/commons/scxml/env/jexl/JexlEvaluator.java (original)
+++ jakarta/commons/sandbox/scxml/trunk/src/main/java/org/apache/commons/scxml/env/jexl/JexlEvaluator.java Thu Feb  9 21:28:36 2006
@@ -17,11 +17,14 @@
  */
 package org.apache.commons.scxml.env.jexl;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.regex.Pattern;
 
 import org.apache.commons.jexl.Expression;
 import org.apache.commons.jexl.ExpressionFactory;
-import org.apache.commons.jexl.JexlContext;
 import org.apache.commons.scxml.Context;
 import org.apache.commons.scxml.Evaluator;
 import org.apache.commons.scxml.SCXMLExpressionException;
@@ -67,7 +70,7 @@
             String evalExpr = inFct.matcher(expr).
                 replaceAll("_builtin.isMember(_ALL_STATES, ");
             exp = ExpressionFactory.createExpression(evalExpr);
-            return exp.evaluate(jexlCtx);
+            return exp.evaluate(getEffectiveContext(jexlCtx));
         } catch (Exception e) {
             throw new SCXMLExpressionException(e);
         }
@@ -81,7 +84,7 @@
      * @see Evaluator#newContext(Context)
      */
     public Context newContext(final Context parent) {
-        return new org.apache.commons.scxml.env.jexl.JexlContext(parent);
+        return new JexlContext(parent);
     }
 
     /**
@@ -100,10 +103,35 @@
             String evalExpr = inFct.matcher(expr).
                 replaceAll("_builtin.isMember(_ALL_STATES, ");
             exp = ExpressionFactory.createExpression(evalExpr);
-            return (Boolean) exp.evaluate(jexlCtx);
+            return (Boolean) exp.evaluate(getEffectiveContext(jexlCtx));
         } catch (Exception e) {
             throw new SCXMLExpressionException(e);
         }
+    }
+
+    /**
+     * Create a new context which is the summation of contexts from the
+     * current state to document root, child has priority over parent
+     * in scoping rules.
+     *
+     * @param nodeCtx The JexlContext for this state.
+     * @return The effective JexlContext for the path leading up to
+     *         document root.
+     */
+    private JexlContext getEffectiveContext(final JexlContext nodeCtx) {
+        List contexts = new ArrayList();
+        // trace path to root
+        JexlContext currentCtx = nodeCtx;
+        while (currentCtx != null) {
+            contexts.add(currentCtx);
+            currentCtx = (JexlContext) currentCtx.getParent();
+        }
+        Map vars = new HashMap();
+        // summation of the contexts, parent first, child wins
+        for (int i = contexts.size() - 1; i > -1; i--) {
+            vars.putAll(((JexlContext) contexts.get(i)).getVars());
+        }
+        return new JexlContext(vars);
     }
 
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org