You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by at...@apache.org on 2017/12/10 00:44:57 UTC

[1/2] commons-scxml git commit: SCXML-254 replace deprecated IOUtils.closeQuietly(InputStream) with try-with-resources block

Repository: commons-scxml
Updated Branches:
  refs/heads/master 35e75829e -> a61c3c544


SCXML-254 replace deprecated IOUtils.closeQuietly(InputStream) with try-with-resources block


Project: http://git-wip-us.apache.org/repos/asf/commons-scxml/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-scxml/commit/08233bfb
Tree: http://git-wip-us.apache.org/repos/asf/commons-scxml/tree/08233bfb
Diff: http://git-wip-us.apache.org/repos/asf/commons-scxml/diff/08233bfb

Branch: refs/heads/master
Commit: 08233bfb9c8f554fa7b236d3dc7bd622d0ce154e
Parents: 35e7582
Author: Ate Douma <at...@apache.org>
Authored: Sun Dec 10 01:23:36 2017 +0100
Committer: Ate Douma <at...@apache.org>
Committed: Sun Dec 10 01:23:36 2017 +0100

----------------------------------------------------------------------
 src/main/java/org/apache/commons/scxml2/io/ContentParser.java | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-scxml/blob/08233bfb/src/main/java/org/apache/commons/scxml2/io/ContentParser.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/scxml2/io/ContentParser.java b/src/main/java/org/apache/commons/scxml2/io/ContentParser.java
index eb044eb..e3ae09d 100644
--- a/src/main/java/org/apache/commons/scxml2/io/ContentParser.java
+++ b/src/main/java/org/apache/commons/scxml2/io/ContentParser.java
@@ -204,14 +204,9 @@ public class ContentParser {
      * @throws IOException In case of loading or parsing exceptions
      */
     public Object parseResource(final String resourceURL) throws IOException {
-        InputStream in = null;
-        try {
-            in = new URL(resourceURL).openStream();
+        try (InputStream in = new URL(resourceURL).openStream()) {
             String content = IOUtils.toString(in, "UTF-8");
             return parseContent(content);
         }
-        finally {
-            IOUtils.closeQuietly(in);
-        }
     }
 }


[2/2] commons-scxml git commit: SCXML-258 Add Evaluator strict mode (boolean) needed for Jexl to properly fail on incorrect expressions

Posted by at...@apache.org.
SCXML-258 Add Evaluator strict mode (boolean) needed for Jexl to properly fail on incorrect expressions

Also removed obsolete Evaluator.AssignType enum and parameters of the #evalAssign method, which no longer
are used/needed since dropping XPath support (SCXML-242)


Project: http://git-wip-us.apache.org/repos/asf/commons-scxml/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-scxml/commit/a61c3c54
Tree: http://git-wip-us.apache.org/repos/asf/commons-scxml/tree/a61c3c54
Diff: http://git-wip-us.apache.org/repos/asf/commons-scxml/diff/a61c3c54

Branch: refs/heads/master
Commit: a61c3c544a5d116f1a6503af08f010f33ead500b
Parents: 08233bf
Author: Ate Douma <at...@apache.org>
Authored: Sun Dec 10 01:44:50 2017 +0100
Committer: Ate Douma <at...@apache.org>
Committed: Sun Dec 10 01:44:50 2017 +0100

----------------------------------------------------------------------
 src/changes/changes.xml                         |  4 +++
 .../org/apache/commons/scxml2/Evaluator.java    | 37 ++------------------
 .../apache/commons/scxml2/EvaluatorFactory.java |  5 +--
 .../commons/scxml2/EvaluatorProvider.java       | 19 ++++++++++
 .../org/apache/commons/scxml2/SCInstance.java   | 20 +++++++++--
 .../apache/commons/scxml2/SCXMLExecutor.java    | 18 +++++++---
 .../scxml2/env/groovy/GroovyEvaluator.java      | 24 +++++++++++--
 .../scxml2/env/javascript/JSEvaluator.java      | 19 ++++++++--
 .../commons/scxml2/env/jexl/JexlEvaluator.java  | 27 +++++++++-----
 .../scxml2/env/minimal/MinimalEvaluator.java    | 17 ++++++++-
 .../scxml2/invoke/SimpleSCXMLInvoker.java       |  2 +-
 .../apache/commons/scxml2/io/SCXMLReader.java   | 18 ----------
 .../apache/commons/scxml2/io/SCXMLWriter.java   |  5 ---
 .../org/apache/commons/scxml2/model/Assign.java | 28 +--------------
 .../org/apache/commons/scxml2/model/Invoke.java |  2 +-
 .../org/apache/commons/scxml2/model/Send.java   |  3 +-
 .../apache/commons/scxml2/model/SendTest.java   |  1 +
 .../org/apache/commons/scxml2/w3c/W3CTests.java |  1 +
 .../org/apache/commons/scxml2/w3c/tests.xml     | 10 +++---
 19 files changed, 144 insertions(+), 116 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-scxml/blob/a61c3c54/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 30111b6..ab95786 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -35,6 +35,10 @@
     <release version="2.0" date="In Git master"
       description="Latest unreleased code">
 
+      <action dev="ate" type="update" issue="SCXML-258">
+        [12-10-2017] Add Evaluator strict mode (boolean) needed for Jexl to properly fail on incorrect expressions
+      </action>
+
       <action dev="ate" type="update" issue="SCXML-257">
         [12-10-2017] &lt;send&gt; delay must support decimal values
       </action>

http://git-wip-us.apache.org/repos/asf/commons-scxml/blob/a61c3c54/src/main/java/org/apache/commons/scxml2/Evaluator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/scxml2/Evaluator.java b/src/main/java/org/apache/commons/scxml2/Evaluator.java
index d6ddd77..15f64ec 100644
--- a/src/main/java/org/apache/commons/scxml2/Evaluator.java
+++ b/src/main/java/org/apache/commons/scxml2/Evaluator.java
@@ -33,38 +33,9 @@ public interface Evaluator {
     String DEFAULT_DATA_MODEL = "";
 
     /**
-     * The allowable types of &lt;assign/&gt; including and in particular when using XPath
+     * @return indicates if using strict / specification compliant behavior
      */
-    enum AssignType {
-
-        REPLACE_CHILDREN("replacechildren"),
-        FIRST_CHILD("firstchild"),
-        LAST_CHILD("lastchild"),
-        PREVIOUS_SIBLING("previoussibling"),
-        NEXT_SIBLING("nextsibling"),
-        REPLACE("replace"),
-        DELETE("delete"),
-        ADD_ATTRIBUTE("addattribute");
-
-        private final String value;
-
-        private AssignType(String value) {
-            this.value = value;
-        }
-
-        public String value() {
-            return value;
-        }
-
-        public static AssignType fromValue(String value) {
-            for (AssignType type : AssignType.values()) {
-                if (type.value().equals(value)) {
-                    return type;
-                }
-            }
-            return null;
-        }
-    }
+    boolean isStrict();
 
     /**
      * Get the datamodel type supported by this Evaluator
@@ -114,11 +85,9 @@ public interface Evaluator {
      * @param ctx variable context
      * @param location location expression
      * @param data the data to assign.
-     * @param type the type of assignment to perform, null assumes {@link AssignType#REPLACE_CHILDREN}
-     * @param attr the name of the attribute to add when using type {@link AssignType#ADD_ATTRIBUTE}
      * @throws SCXMLExpressionException A malformed expression exception
      */
-    void evalAssign(Context ctx, String location, Object data, AssignType type, String attr)
+    void evalAssign(Context ctx, String location, Object data)
             throws SCXMLExpressionException;
 
     /**

http://git-wip-us.apache.org/repos/asf/commons-scxml/blob/a61c3c54/src/main/java/org/apache/commons/scxml2/EvaluatorFactory.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/scxml2/EvaluatorFactory.java b/src/main/java/org/apache/commons/scxml2/EvaluatorFactory.java
index bb2074b..784affa 100644
--- a/src/main/java/org/apache/commons/scxml2/EvaluatorFactory.java
+++ b/src/main/java/org/apache/commons/scxml2/EvaluatorFactory.java
@@ -93,16 +93,17 @@ public class EvaluatorFactory {
     /**
      * Returns a dedicated Evaluator instance for a specific SCXML document its documentmodel.
      * <p>If no SCXML document is provided a default Evaluator will be returned.</p>
+     * @param strict flag if an evaluator with strict / specification compliant behavior should be provided
      * @param document The document to return a dedicated Evaluator for. May be null to retrieve the default Evaluator.
      * @return a new and not sharable Evaluator instance for the provided document, or a default Evaluator otherwise
      * @throws ModelException If the SCXML document datamodel is not supported.
      */
-    public static Evaluator getEvaluator(SCXML document) throws ModelException {
+    public static Evaluator getEvaluator(final boolean strict, final SCXML document) throws ModelException {
         String datamodelName = document != null ? document.getDatamodelName() : null;
         EvaluatorProvider provider = INSTANCE.providers.get(datamodelName == null ? DEFAULT_DATA_MODEL : datamodelName);
         if (provider == null) {
             throw new ModelException("Unsupported SCXML document datamodel \""+(datamodelName)+"\"");
         }
-        return document != null ? provider.getEvaluator(document) : provider.getEvaluator();
+        return document != null ? provider.getEvaluator(strict, document) : provider.getEvaluator(strict);
     }
 }

http://git-wip-us.apache.org/repos/asf/commons-scxml/blob/a61c3c54/src/main/java/org/apache/commons/scxml2/EvaluatorProvider.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/scxml2/EvaluatorProvider.java b/src/main/java/org/apache/commons/scxml2/EvaluatorProvider.java
index b7b7e67..157f65d 100644
--- a/src/main/java/org/apache/commons/scxml2/EvaluatorProvider.java
+++ b/src/main/java/org/apache/commons/scxml2/EvaluatorProvider.java
@@ -34,6 +34,13 @@ public interface EvaluatorProvider {
     Evaluator getEvaluator();
 
     /**
+     * @param strict flag if an evaluator with strict / specification compliant behavior should be provided
+     * @return a default or generic {@link Evaluator} supporting the {@link #getSupportedDatamodel()}
+     * with strict / specification compliant behavior, if specified
+     */
+    Evaluator getEvaluator(final boolean strict);
+
+    /**
      * Factory method to return a dedicated and optimized {@link Evaluator} instance for a specific SCXML document.
      * <p>
      * As the returned Evaluator <em>might</em> be optimized and dedicated for the SCXML document instance, the
@@ -43,4 +50,16 @@ public interface EvaluatorProvider {
      * @return a new and not sharable Evaluator instance
      */
     Evaluator getEvaluator(SCXML document);
+
+    /**
+     * Factory method to return a dedicated and optimized {@link Evaluator} instance for a specific SCXML document.
+     * <p>
+     * As the returned Evaluator <em>might</em> be optimized and dedicated for the SCXML document instance, the
+     * Evaluator may not be shareable and reusable for other SCXML documents.
+     * </p>
+     * @param strict flag if an evaluator with strict / specification compliant behavior should be provided
+     * @param document the SCXML document
+     * @return a new and not sharable Evaluator instance
+     */
+    Evaluator getEvaluator(final boolean strict, final SCXML document);
 }

http://git-wip-us.apache.org/repos/asf/commons-scxml/blob/a61c3c54/src/main/java/org/apache/commons/scxml2/SCInstance.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/scxml2/SCInstance.java b/src/main/java/org/apache/commons/scxml2/SCInstance.java
index 18a9757..299df9c 100644
--- a/src/main/java/org/apache/commons/scxml2/SCInstance.java
+++ b/src/main/java/org/apache/commons/scxml2/SCInstance.java
@@ -128,6 +128,11 @@ public class SCInstance implements Serializable {
     private boolean singleContext;
 
     /**
+     * Flag indicating if strict / specification compliant behavior is required
+     */
+    private boolean strict;
+
+    /**
      * Constructor
      * @param internalIOProcessor The I/O Processor for the internal event queue
      * @param evaluator The evaluator
@@ -153,7 +158,7 @@ public class SCInstance implements Serializable {
             throw new ModelException(ERR_NO_STATE_MACHINE);
         }
         if (evaluator == null) {
-            evaluator = EvaluatorFactory.getEvaluator(stateMachine);
+            evaluator = EvaluatorFactory.getEvaluator(isStrict(), stateMachine);
         }
         if (evaluator.requiresGlobalContext()) {
             singleContext = true;
@@ -188,7 +193,7 @@ public class SCInstance implements Serializable {
                     }
                 }
             }
-            if (stateMachine.isLateBinding() == null || Boolean.FALSE.equals(stateMachine.isLateBinding())) {
+            if ((stateMachine.isLateBinding() == null && isStrict()) || Boolean.FALSE.equals(stateMachine.isLateBinding())) {
                 // early binding
                 for (EnterableState es : stateMachine.getChildren()) {
                     getContext(es);
@@ -294,6 +299,17 @@ public class SCInstance implements Serializable {
         return singleContext;
     }
 
+    public void setStrict(final boolean strict) throws ModelException {
+        if (initialized) {
+            throw new ModelException("SCInstance: already initialized");
+        }
+        this.strict = strict;
+    }
+
+    public boolean isStrict() {
+        return strict;
+    }
+
     /**
      * Clone data model.
      *

http://git-wip-us.apache.org/repos/asf/commons-scxml/blob/a61c3c54/src/main/java/org/apache/commons/scxml2/SCXMLExecutor.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/scxml2/SCXMLExecutor.java b/src/main/java/org/apache/commons/scxml2/SCXMLExecutor.java
index 465ff35..d22fe1d 100644
--- a/src/main/java/org/apache/commons/scxml2/SCXMLExecutor.java
+++ b/src/main/java/org/apache/commons/scxml2/SCXMLExecutor.java
@@ -112,11 +112,13 @@ public class SCXMLExecutor implements SCXMLIOProcessor {
      *
      * @param parentSCXMLExecutor the parent SCXMLExecutor
      */
-    public SCXMLExecutor(final SCXMLExecutor parentSCXMLExecutor) {
+    public SCXMLExecutor(final SCXMLExecutor parentSCXMLExecutor) throws ModelException {
         this.parentSCXMLExecutor = parentSCXMLExecutor;
         this.semantics = parentSCXMLExecutor.semantics;
         this.exctx = new SCXMLExecutionContext(this, parentSCXMLExecutor.getEvaluator(),
                 parentSCXMLExecutor.getEventdispatcher(), parentSCXMLExecutor.getErrorReporter());
+        getSCInstance().setSingleContext(parentSCXMLExecutor.isSingleContext());
+        getSCInstance().setStrict(parentSCXMLExecutor.isStrict());
     }
 
     /**
@@ -148,7 +150,7 @@ public class SCXMLExecutor implements SCXMLIOProcessor {
      * @see SCXMLSemantics#isLegalConfiguration(java.util.Set, ErrorReporter)
      */
     public synchronized void setConfiguration(Set<String> atomicStateIds) throws ModelException {
-        semantics.initialize(exctx, Collections.EMPTY_MAP);
+        semantics.initialize(exctx, Collections.emptyMap());
         Set<EnterableState> states = new HashSet<>();
         for (String stateId : atomicStateIds) {
             TransitionTarget tt = getStateMachine().getTargets().get(stateId);
@@ -241,6 +243,14 @@ public class SCXMLExecutor implements SCXMLIOProcessor {
         return getSCInstance().isSingleContext();
     }
 
+    public void setStrict(final boolean strict) throws ModelException {
+        getSCInstance().setStrict(strict);
+    }
+
+    public boolean isStrict() {
+        return getSCInstance().isStrict();
+    }
+
     /**
      * Get the state machine that is being executed.
      * <b>NOTE:</b> This is the state machine definition or model used by this
@@ -409,7 +419,7 @@ public class SCXMLExecutor implements SCXMLIOProcessor {
     }
 
     public void go() throws ModelException {
-        go(Collections.EMPTY_MAP);
+        go(Collections.emptyMap());
     }
 
     /**
@@ -440,7 +450,7 @@ public class SCXMLExecutor implements SCXMLIOProcessor {
     }
 
     public Thread run() throws ModelException {
-        return run(Collections.EMPTY_MAP);
+        return run(Collections.emptyMap());
     }
 
     public Thread run(final Map<String, Object> data) throws ModelException {

http://git-wip-us.apache.org/repos/asf/commons-scxml/blob/a61c3c54/src/main/java/org/apache/commons/scxml2/env/groovy/GroovyEvaluator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/scxml2/env/groovy/GroovyEvaluator.java b/src/main/java/org/apache/commons/scxml2/env/groovy/GroovyEvaluator.java
index 4f2a8af..111ce0c 100644
--- a/src/main/java/org/apache/commons/scxml2/env/groovy/GroovyEvaluator.java
+++ b/src/main/java/org/apache/commons/scxml2/env/groovy/GroovyEvaluator.java
@@ -65,9 +65,18 @@ public class GroovyEvaluator extends AbstractBaseEvaluator {
         }
 
         @Override
+        public Evaluator getEvaluator(final boolean strict) {
+            return new GroovyEvaluator();
+        }
+
+        @Override
         public Evaluator getEvaluator(final SCXML document) {
             return new GroovyEvaluator();
         }
+        @Override
+        public Evaluator getEvaluator(final boolean strict, final SCXML document) {
+            return new GroovyEvaluator();
+        }
     }
 
     /** Error message if evaluation context is not a GroovyContext. */
@@ -123,6 +132,11 @@ public class GroovyEvaluator extends AbstractBaseEvaluator {
         this.scriptCache = newScriptCache();
     }
 
+    @Override
+    public boolean isStrict() {
+        return false;
+    }
+
     /**
      * Overridable factory method to create the GroovyExtendableScriptCache for this GroovyEvaluator.
      * <p>
@@ -227,14 +241,18 @@ public class GroovyEvaluator extends AbstractBaseEvaluator {
     }
 
     /**
-     * @see Evaluator#evalAssign(Context, String, Object, AssignType, String)
+     * @see Evaluator#evalAssign(Context, String, Object)
      */
-    public void evalAssign(final Context ctx, final String location, final Object data, final AssignType type,
-                           final String attr) throws SCXMLExpressionException {
+    public void evalAssign(final Context ctx, final String location, final Object data) throws SCXMLExpressionException {
         final StringBuilder sb = new StringBuilder(location).append("=").append(ASSIGN_VARIABLE_NAME);
         try {
             ctx.getVars().put(ASSIGN_VARIABLE_NAME, data);
             eval(ctx, sb.toString());
+        } catch (SCXMLExpressionException e) {
+            if (e.getCause() != null && e.getCause() != null && e.getCause().getMessage() != null) {
+                throw new SCXMLExpressionException("Error evaluating assign to location=\"" + location + "\": " + e.getCause().getMessage());
+            }
+            throw e;
         }
         finally {
             ctx.getVars().remove(ASSIGN_VARIABLE_NAME);

http://git-wip-us.apache.org/repos/asf/commons-scxml/blob/a61c3c54/src/main/java/org/apache/commons/scxml2/env/javascript/JSEvaluator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/scxml2/env/javascript/JSEvaluator.java b/src/main/java/org/apache/commons/scxml2/env/javascript/JSEvaluator.java
index d71933e..6686b19 100644
--- a/src/main/java/org/apache/commons/scxml2/env/javascript/JSEvaluator.java
+++ b/src/main/java/org/apache/commons/scxml2/env/javascript/JSEvaluator.java
@@ -74,9 +74,18 @@ public class JSEvaluator extends AbstractBaseEvaluator {
         }
 
         @Override
+        public Evaluator getEvaluator(final boolean strict) {
+            return new JSEvaluator();
+        }
+
+        @Override
         public Evaluator getEvaluator(final SCXML document) {
             return new JSEvaluator();
         }
+        @Override
+        public Evaluator getEvaluator(final boolean strict, final SCXML document) {
+            return new JSEvaluator();
+        }
     }
 
     private static final String SCXML_SYSTEM_CONTEXT = "_scxmlSystemContext";
@@ -174,6 +183,11 @@ public class JSEvaluator extends AbstractBaseEvaluator {
     }
 
     @Override
+    public boolean isStrict() {
+        return false;
+    }
+
+    @Override
     public String getSupportedDatamodel() {
         return SUPPORTED_DATA_MODEL;
     }
@@ -247,10 +261,9 @@ public class JSEvaluator extends AbstractBaseEvaluator {
     }
 
     /**
-     * @see Evaluator#evalAssign(Context, String, Object, AssignType, String)
+     * @see Evaluator#evalAssign(Context, String, Object)
      */
-    public void evalAssign(final Context ctx, final String location, final Object data, final AssignType type,
-                           final String attr) throws SCXMLExpressionException {
+    public void evalAssign(final Context ctx, final String location, final Object data) throws SCXMLExpressionException {
         StringBuilder sb = new StringBuilder(location).append("=").append(ASSIGN_VARIABLE_NAME);
         try {
             ctx.getVars().put(ASSIGN_VARIABLE_NAME, data);

http://git-wip-us.apache.org/repos/asf/commons-scxml/blob/a61c3c54/src/main/java/org/apache/commons/scxml2/env/jexl/JexlEvaluator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/scxml2/env/jexl/JexlEvaluator.java b/src/main/java/org/apache/commons/scxml2/env/jexl/JexlEvaluator.java
index bf7cbca..139446a 100644
--- a/src/main/java/org/apache/commons/scxml2/env/jexl/JexlEvaluator.java
+++ b/src/main/java/org/apache/commons/scxml2/env/jexl/JexlEvaluator.java
@@ -65,9 +65,19 @@ public class JexlEvaluator extends AbstractBaseEvaluator {
         }
 
         @Override
+        public Evaluator getEvaluator(final boolean strict) {
+            return new JexlEvaluator(strict);
+        }
+
+        @Override
         public Evaluator getEvaluator(final SCXML document) {
             return new JexlEvaluator();
         }
+
+        @Override
+        public Evaluator getEvaluator(final boolean strict, final SCXML document) {
+            return new JexlEvaluator(strict);
+        }
     }
 
     /** Error message if evaluation context is not a JexlContext. */
@@ -86,7 +96,12 @@ public class JexlEvaluator extends AbstractBaseEvaluator {
 
     /** Constructor. */
     public JexlEvaluator() {
+        this(false);
+    }
+
+    public JexlEvaluator(final boolean strict) {
         super();
+        jexlEngineStrict = strict;
         // create the internal JexlEngine initially
         jexlEngine = getJexlEngine();
         jexlEngineSilent = jexlEngine.isSilent();
@@ -101,11 +116,8 @@ public class JexlEvaluator extends AbstractBaseEvaluator {
         return jexlEngineSilent;
     }
 
-    /**
-     * Checks whether the internal Jexl engine behaves in strict or lenient mode.
-     * @return true for strict, false for lenient
-     */
-    public boolean isJexlEngineStrict() {
+    @Override
+    public boolean isStrict() {
         return jexlEngineStrict;
     }
 
@@ -169,10 +181,9 @@ public class JexlEvaluator extends AbstractBaseEvaluator {
     }
 
     /**
-     * @see Evaluator#evalAssign(Context, String, Object, AssignType, String)
+     * @see Evaluator#evalAssign(Context, String, Object)
      */
-    public void evalAssign(final Context ctx, final String location, final Object data, final AssignType type,
-                           final String attr) throws SCXMLExpressionException {
+    public void evalAssign(final Context ctx, final String location, final Object data) throws SCXMLExpressionException {
         StringBuilder sb = new StringBuilder(location).append("=").append(ASSIGN_VARIABLE_NAME);
         try {
             ctx.getVars().put(ASSIGN_VARIABLE_NAME, data);

http://git-wip-us.apache.org/repos/asf/commons-scxml/blob/a61c3c54/src/main/java/org/apache/commons/scxml2/env/minimal/MinimalEvaluator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/scxml2/env/minimal/MinimalEvaluator.java b/src/main/java/org/apache/commons/scxml2/env/minimal/MinimalEvaluator.java
index 0bad641..32a8ed7 100644
--- a/src/main/java/org/apache/commons/scxml2/env/minimal/MinimalEvaluator.java
+++ b/src/main/java/org/apache/commons/scxml2/env/minimal/MinimalEvaluator.java
@@ -51,9 +51,24 @@ public class MinimalEvaluator implements Evaluator, Serializable {
         }
 
         @Override
+        public Evaluator getEvaluator(final boolean strict) {
+            return new MinimalEvaluator();
+        }
+
+        @Override
         public Evaluator getEvaluator(final SCXML document) {
             return new MinimalEvaluator();
         }
+
+        @Override
+        public Evaluator getEvaluator(final boolean strict, final SCXML document) {
+            return new MinimalEvaluator();
+        }
+    }
+
+    @Override
+    public boolean isStrict() {
+        return true;
     }
 
     @Override
@@ -88,7 +103,7 @@ public class MinimalEvaluator implements Evaluator, Serializable {
     }
 
     @Override
-    public void evalAssign(final Context ctx, final String location, final Object data, final AssignType type, final String attr) throws SCXMLExpressionException {
+    public void evalAssign(final Context ctx, final String location, final Object data) throws SCXMLExpressionException {
         throw new UnsupportedOperationException("Assign expressions are not supported by the \"null\" datamodel");
     }
 

http://git-wip-us.apache.org/repos/asf/commons-scxml/blob/a61c3c54/src/main/java/org/apache/commons/scxml2/invoke/SimpleSCXMLInvoker.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/scxml2/invoke/SimpleSCXMLInvoker.java b/src/main/java/org/apache/commons/scxml2/invoke/SimpleSCXMLInvoker.java
index a83420c..44084a3 100644
--- a/src/main/java/org/apache/commons/scxml2/invoke/SimpleSCXMLInvoker.java
+++ b/src/main/java/org/apache/commons/scxml2/invoke/SimpleSCXMLInvoker.java
@@ -100,8 +100,8 @@ public class SimpleSCXMLInvoker implements Invoker, Serializable {
         } catch (XMLStreamException xse) {
             throw new InvokerException(xse.getMessage(), xse.getCause());
         }
-        executor = new SCXMLExecutor(parentSCXMLExecutor);
         try {
+            executor = new SCXMLExecutor(parentSCXMLExecutor);
             executor.setStateMachine(scxml);
         }
         catch (ModelException me) {

http://git-wip-us.apache.org/repos/asf/commons-scxml/blob/a61c3c54/src/main/java/org/apache/commons/scxml2/io/SCXMLReader.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/scxml2/io/SCXMLReader.java b/src/main/java/org/apache/commons/scxml2/io/SCXMLReader.java
index f2f4ff5..9f2adfa 100644
--- a/src/main/java/org/apache/commons/scxml2/io/SCXMLReader.java
+++ b/src/main/java/org/apache/commons/scxml2/io/SCXMLReader.java
@@ -47,7 +47,6 @@ import javax.xml.validation.SchemaFactory;
 import javax.xml.validation.Validator;
 
 import org.apache.commons.logging.LogFactory;
-import org.apache.commons.scxml2.Evaluator;
 import org.apache.commons.scxml2.PathResolver;
 import org.apache.commons.scxml2.env.SimpleErrorHandler;
 import org.apache.commons.scxml2.env.URLResolver;
@@ -272,7 +271,6 @@ public final class SCXMLReader {
 
     //---- ATTRIBUTE NAMES ----//
     private static final String ATTR_ARRAY = "array";
-    private static final String ATTR_ATTR = "attr";
     private static final String ATTR_AUTOFORWARD = "autoforward";
     static final String ATTR_BINDING = "binding";
     private static final String ATTR_COND = "cond";
@@ -1767,22 +1765,6 @@ public final class SCXMLReader {
         Assign assign = new Assign();
         assign.setExpr(readAV(reader, ATTR_EXPR));
         assign.setLocation(readRequiredAV(reader, ELEM_ASSIGN, ATTR_LOCATION));
-        String attrValue = readAV(reader, ATTR_TYPE);
-        if (attrValue != null) {
-            assign.setType(Evaluator.AssignType.fromValue(attrValue));
-            if (assign.getType() == null) {
-                reportIgnoredAttribute(reader, configuration, ELEM_ASSIGN, ATTR_TYPE, attrValue);
-            }
-        }
-        attrValue = readAV(reader, ATTR_ATTR);
-        if (attrValue != null) {
-            if (Evaluator.AssignType.ADD_ATTRIBUTE.equals(assign.getType())) {
-                assign.setAttr(attrValue);
-            }
-            else {
-                reportIgnoredAttribute(reader, configuration, ELEM_ASSIGN, ATTR_ATTR, attrValue);
-            }
-        }
         assign.setSrc(readAV(reader, ATTR_SRC));
         assign.setPathResolver(configuration.pathResolver);
         readNamespaces(configuration, assign);

http://git-wip-us.apache.org/repos/asf/commons-scxml/blob/a61c3c54/src/main/java/org/apache/commons/scxml2/io/SCXMLWriter.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/scxml2/io/SCXMLWriter.java b/src/main/java/org/apache/commons/scxml2/io/SCXMLWriter.java
index 11842c6..b9036ad 100644
--- a/src/main/java/org/apache/commons/scxml2/io/SCXMLWriter.java
+++ b/src/main/java/org/apache/commons/scxml2/io/SCXMLWriter.java
@@ -157,7 +157,6 @@ public class SCXMLWriter {
 
     //---- ATTRIBUTE NAMES ----//
     private static final String ATTR_ARRAY = "array";
-    private static final String ATTR_ATTR = "attr";
     private static final String ATTR_AUTOFORWARD = "autoforward";
     private static final String ATTR_COND = "cond";
     private static final String ATTR_DATAMODEL = "datamodel";
@@ -868,10 +867,6 @@ public class SCXMLWriter {
                 Assign asn = (Assign) a;
                 writer.writeStartElement(XMLNS_SCXML, ELEM_ASSIGN);
                 writeAV(writer, ATTR_LOCATION, asn.getLocation());
-                if (asn.getType() != null) {
-                    writeAV(writer, ATTR_TYPE, asn.getType().value());
-                }
-                writeAV(writer, ATTR_ATTR, asn.getAttr());
                 writeAV(writer, ATTR_SRC, asn.getSrc());
                 writeAV(writer, ATTR_EXPR, escapeXML(asn.getExpr()));
                 writer.writeEndElement();

http://git-wip-us.apache.org/repos/asf/commons-scxml/blob/a61c3c54/src/main/java/org/apache/commons/scxml2/model/Assign.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/scxml2/model/Assign.java b/src/main/java/org/apache/commons/scxml2/model/Assign.java
index 6d07b3e..6677520 100644
--- a/src/main/java/org/apache/commons/scxml2/model/Assign.java
+++ b/src/main/java/org/apache/commons/scxml2/model/Assign.java
@@ -54,16 +54,6 @@ public class Assign extends Action implements PathResolverHolder {
     private String expr;
 
     /**
-     * Defines the nature of the insertion to be performed, default {@link Evaluator.AssignType#REPLACE_CHILDREN}
-     */
-    private Evaluator.AssignType type;
-
-    /**
-     * The attribute name to add at the specified location when using {@link Evaluator.AssignType#ADD_ATTRIBUTE}
-     */
-    private String attr;
-
-    /**
      * {@link PathResolver} for resolving the "src" result.
      */
     private PathResolver pathResolver;
@@ -147,22 +137,6 @@ public class Assign extends Action implements PathResolverHolder {
         this.pathResolver = pathResolver;
     }
 
-    public Evaluator.AssignType getType() {
-        return type;
-    }
-
-    public void setType(final Evaluator.AssignType type) {
-        this.type = type;
-    }
-
-    public String getAttr() {
-        return attr;
-    }
-
-    public void setAttr(final String attr) {
-        this.attr = attr;
-    }
-
     /**
      * {@inheritDoc}
      */
@@ -179,7 +153,7 @@ public class Assign extends Action implements PathResolverHolder {
             data = evaluator.eval(ctx, expr);
         }
 
-        evaluator.evalAssign(ctx, location, data, type, attr);
+        evaluator.evalAssign(ctx, location, data);
         if (exctx.getAppLog().isDebugEnabled()) {
             exctx.getAppLog().debug("<assign>: '" + location + "' updated");
         }

http://git-wip-us.apache.org/repos/asf/commons-scxml/blob/a61c3c54/src/main/java/org/apache/commons/scxml2/model/Invoke.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/scxml2/model/Invoke.java b/src/main/java/org/apache/commons/scxml2/model/Invoke.java
index 34cc22c..4885cc7 100644
--- a/src/main/java/org/apache/commons/scxml2/model/Invoke.java
+++ b/src/main/java/org/apache/commons/scxml2/model/Invoke.java
@@ -360,7 +360,7 @@ public class Invoke extends NamelistHolder implements PathResolverHolder, Conten
                 invokeId = parentState.getId() + "." + ctx.get(SCXMLSystemContext.SESSIONID_KEY);
             }
             if (getId() == null && getIdlocation() != null) {
-                eval.evalAssign(ctx, idlocation, invokeId, Evaluator.AssignType.REPLACE_CHILDREN, null);
+                eval.evalAssign(ctx, idlocation, invokeId);
             }
             invoker.setInvokeId(invokeId);
 

http://git-wip-us.apache.org/repos/asf/commons-scxml/blob/a61c3c54/src/main/java/org/apache/commons/scxml2/model/Send.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/scxml2/model/Send.java b/src/main/java/org/apache/commons/scxml2/model/Send.java
index bae395a..3352056 100644
--- a/src/main/java/org/apache/commons/scxml2/model/Send.java
+++ b/src/main/java/org/apache/commons/scxml2/model/Send.java
@@ -19,7 +19,6 @@ package org.apache.commons.scxml2.model;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
-import org.apache.commons.logging.Log;
 import org.apache.commons.scxml2.ActionExecutionContext;
 import org.apache.commons.scxml2.Context;
 import org.apache.commons.scxml2.Evaluator;
@@ -358,7 +357,7 @@ public class Send extends NamelistHolder implements ContentContainer {
         if (id == null) {
             id = ctx.getSystemContext().generateSessionId();
             if (idlocation != null) {
-                eval.evalAssign(ctx, idlocation, id, Evaluator.AssignType.REPLACE_CHILDREN, null);
+                eval.evalAssign(ctx, idlocation, id);
             }
         }
         String targetValue = target;

http://git-wip-us.apache.org/repos/asf/commons-scxml/blob/a61c3c54/src/test/java/org/apache/commons/scxml2/model/SendTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/scxml2/model/SendTest.java b/src/test/java/org/apache/commons/scxml2/model/SendTest.java
index 7424fe8..e5ca7a6 100644
--- a/src/test/java/org/apache/commons/scxml2/model/SendTest.java
+++ b/src/test/java/org/apache/commons/scxml2/model/SendTest.java
@@ -33,6 +33,7 @@ import org.junit.Test;
 public class SendTest {
 
     @Test
+    @SuppressWarnings("unchecked")
     public void testNamelistOrderPreserved() throws Exception {
         final List<Object> payloads = new ArrayList<Object>();
         final SCXML scxml = SCXMLTestHelper.parse("org/apache/commons/scxml2/model/send-test-01.xml");

http://git-wip-us.apache.org/repos/asf/commons-scxml/blob/a61c3c54/src/test/java/org/apache/commons/scxml2/w3c/W3CTests.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/scxml2/w3c/W3CTests.java b/src/test/java/org/apache/commons/scxml2/w3c/W3CTests.java
index f86f22a..06731ab 100644
--- a/src/test/java/org/apache/commons/scxml2/w3c/W3CTests.java
+++ b/src/test/java/org/apache/commons/scxml2/w3c/W3CTests.java
@@ -658,6 +658,7 @@ public class W3CTests {
             }
             final SCXMLExecutor exec = new SCXMLExecutor(null, null, trc);
             exec.setSingleContext(true);
+            exec.setStrict(true);
             exec.setStateMachine(doc);
             exec.addListener(doc, trc);
             exec.registerInvokerClass("scxml", SimpleSCXMLInvoker.class);

http://git-wip-us.apache.org/repos/asf/commons-scxml/blob/a61c3c54/src/test/java/org/apache/commons/scxml2/w3c/tests.xml
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/scxml2/w3c/tests.xml b/src/test/java/org/apache/commons/scxml2/w3c/tests.xml
index ad41e3f..035e998 100644
--- a/src/test/java/org/apache/commons/scxml2/w3c/tests.xml
+++ b/src/test/java/org/apache/commons/scxml2/w3c/tests.xml
@@ -15,8 +15,8 @@
   <test id="388" mandatory="true"                    manual="false" jexl="true"  ecma="true"/>
   <test id="396" mandatory="true"                    manual="false" jexl="true"  ecma="true"/>
   <test id="399" mandatory="true"                    manual="false" jexl="true"  ecma="true"/>
-  <test id="401" mandatory="true"                    manual="false" jexl="false" ecma="true"/>
-  <test id="402" mandatory="true"                    manual="false" jexl="false" ecma="true"/>
+  <test id="401" mandatory="true"                    manual="false" jexl="true"  ecma="true"/>
+  <test id="402" mandatory="true"                    manual="false" jexl="true"  ecma="true"/>
   <test id="403" mandatory="true"                    manual="false" jexl="true"  ecma="true"/>
   <test id="404" mandatory="true"                    manual="false" jexl="true"  ecma="true"/>
   <test id="405" mandatory="true"                    manual="false" jexl="true"  ecma="true"/>
@@ -56,9 +56,9 @@
   <test id="279" mandatory="true"                    manual="false" jexl="true"  ecma="true"/>
   <test id="280" mandatory="true"                    manual="false" jexl="true"  ecma="true"/>
   <test id="550" mandatory="true"                    manual="false" jexl="true"  ecma="true"/>
-  <test id="551" mandatory="true"                    manual="false" jexl="true" ecma="true"/>
+  <test id="551" mandatory="true"                    manual="false" jexl="true"  ecma="true"/>
   <test id="552" mandatory="true"                    manual="false" jexl="false" ecma="false"/>
-  <test id="286" mandatory="true"                    manual="false" jexl="false" ecma="true"/>
+  <test id="286" mandatory="true"                    manual="false" jexl="true"  ecma="true"/>
   <test id="287" mandatory="true"                    manual="false" jexl="true"  ecma="true"/>
   <test id="487" mandatory="true"                    manual="false" jexl="true"  ecma="true"/>
   <test id="294" mandatory="true"                    manual="false" jexl="false" ecma="false"/>
@@ -186,7 +186,7 @@
   <test id="495" mandatory="true"                    manual="false" jexl="true"  ecma="true"/>
   <test id="496" mandatory="true"                    manual="false" jexl="false" ecma="false"/>
   <test id="500" mandatory="true"                    manual="false" jexl="false" ecma="false"/>
-  <test id="501" mandatory="true"                    manual="false" jexl="true"  ecma="false"/>
+  <test id="501" mandatory="true"                    manual="false" jexl="false" ecma="false"/>
 
   <test id="201" mandatory="false" profile="http io" manual="false" implemented="false"/>
   <test id="509" mandatory="false" profile="http io" manual="false" implemented="false"/>