You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by wo...@apache.org on 2013/11/08 04:53:58 UTC

svn commit: r1539916 - in /commons/proper/scxml/trunk/src: main/java/org/apache/commons/scxml2/semantics/TransitionTargetComparator.java test/java/org/apache/commons/scxml2/semantics/TransitionTargetComparatorTest.java

Author: woonsan
Date: Fri Nov  8 03:53:58 2013
New Revision: 1539916

URL: http://svn.apache.org/r1539916
Log:
SCXML-160: fixing cast exception in case that the state machine has nested parallels

Modified:
    commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/semantics/TransitionTargetComparator.java
    commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/semantics/TransitionTargetComparatorTest.java

Modified: commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/semantics/TransitionTargetComparator.java
URL: http://svn.apache.org/viewvc/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/semantics/TransitionTargetComparator.java?rev=1539916&r1=1539915&r2=1539916&view=diff
==============================================================================
--- commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/semantics/TransitionTargetComparator.java (original)
+++ commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/semantics/TransitionTargetComparator.java Fri Nov  8 03:53:58 2013
@@ -17,11 +17,11 @@
 package org.apache.commons.scxml2.semantics;
 
 import java.io.Serializable;
+import java.util.Collection;
 import java.util.Comparator;
 
 import org.apache.commons.scxml2.SCXMLHelper;
 import org.apache.commons.scxml2.model.Parallel;
-import org.apache.commons.scxml2.model.State;
 import org.apache.commons.scxml2.model.TransitionTarget;
 
 
@@ -75,7 +75,7 @@ final class TransitionTargetComparator<T
                 // - not a requirement
                 // - though useful for an impl to have repeatable behavior
                 // - downside is users may rely on this behavior
-                Parallel lca = (Parallel) SCXMLHelper.getLCA(tt1, tt2);
+                TransitionTarget lca = SCXMLHelper.getLCA(tt1, tt2);
                 TransitionTarget parent1 = tt1;
                 while (parent1.getParent() != lca) {
                     parent1 = parent1.getParent();
@@ -84,12 +84,17 @@ final class TransitionTargetComparator<T
                 while (parent2.getParent() != lca) {
                     parent2 = parent2.getParent();
                 }
-                for (TransitionTarget tt : lca.getChildren()) {
-                    State s = (State) tt;
-                    if (s == parent1) {
-                        return 1;
-                    } else if (s == parent2) {
-                        return -1;
+                Collection<TransitionTarget> children = null;
+                if (lca instanceof Parallel) {
+                    children = ((Parallel) lca).getChildren();
+                }
+                if (children != null) {
+                    for (TransitionTarget tt : children) {
+                        if (tt == parent1) {
+                            return 1;
+                        } else if (tt == parent2) {
+                            return -1;
+                        }
                     }
                 }
             }

Modified: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/semantics/TransitionTargetComparatorTest.java
URL: http://svn.apache.org/viewvc/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/semantics/TransitionTargetComparatorTest.java?rev=1539916&r1=1539915&r2=1539916&view=diff
==============================================================================
--- commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/semantics/TransitionTargetComparatorTest.java (original)
+++ commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/semantics/TransitionTargetComparatorTest.java Fri Nov  8 03:53:58 2013
@@ -108,4 +108,28 @@ public class TransitionTargetComparatorT
         
         Assert.assertEquals(1, comparator.compare(target1, target2));
     }
+
+    @Test
+    public void testComparatorSiblingParallels() {
+        Parallel ancestor = new Parallel();
+
+        State target1 = new State();
+        Parallel parent1 = new Parallel();
+        target1.setParent(parent1);
+        parent1.addChild(target1);
+
+        State target2 = new State();
+        Parallel parent2 = new Parallel();
+        target1.setParent(parent2);
+        parent1.addChild(target2);
+
+        parent1.setParent(ancestor);
+        ancestor.addChild(parent1);
+        parent2.setParent(ancestor);
+        ancestor.addChild(parent2);
+
+        Assert.assertEquals(1, comparator.compare(parent1, parent2));
+        Assert.assertEquals(-1, comparator.compare(parent2, parent1));
+    }
+
 }