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 2014/10/10 00:52:55 UTC
svn commit: r1630612 - in /commons/proper/scxml/trunk/src:
main/java/org/apache/commons/scxml2/io/ test/java/org/apache/commons/scxml2/
test/java/org/apache/commons/scxml2/io/
Author: ate
Date: Thu Oct 9 22:52:54 2014
New Revision: 1630612
URL: http://svn.apache.org/r1630612
Log:
SCXML-209: improve and fix legal state configuration check in ModelUpdater
Added:
commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/scxml-invalid-transition-targets-test1.xml (with props)
commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/scxml-invalid-transition-targets-test2.xml (with props)
commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/scxml-valid-transition-targets-test.xml (with props)
Modified:
commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/io/ModelUpdater.java
commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/SCXMLTestHelper.java
commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/SCXMLReaderTest.java
Modified: commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/io/ModelUpdater.java
URL: http://svn.apache.org/viewvc/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/io/ModelUpdater.java?rev=1630612&r1=1630611&r2=1630612&view=diff
==============================================================================
--- commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/io/ModelUpdater.java (original)
+++ commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/io/ModelUpdater.java Thu Oct 9 22:52:54 2014
@@ -17,7 +17,6 @@
package org.apache.commons.scxml2.io;
import java.text.MessageFormat;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -472,35 +471,35 @@ final class ModelUpdater {
*
* @param tts The transition targets
* @return Whether this is a legal configuration
- * @see <a href=http://www.w3.org/TR/2014/CR-scxml-20140313/#LegalStateConfigurations">
- * http://www.w3.org/TR/2014/CR-scxml-20140313/#LegalStateConfigurations</a>
+ * @see <a href=http://www.w3.org/TR/scxml/#LegalStateConfigurations">
+ * http://www.w3.org/TR/scxml/#LegalStateConfigurations</a>
*/
private static boolean verifyTransitionTargets(final Set<TransitionTarget> tts) {
- if (tts.size() <= 1) { // No contention
+ if (tts.size() < 2) { // No contention
return true;
}
-
- Set<EnterableState> parents = new HashSet<EnterableState>();
+ TransitionTarget first = null;
+ int i = 0;
for (TransitionTarget tt : tts) {
- boolean hasParallelParent = false;
- for (int i = tt.getNumberOfAncestors()-1; i > -1; i--) {
- EnterableState parent = tt.getAncestor(i);
- if (parent instanceof Parallel) {
- hasParallelParent = true;
- // keep on 'reading' as a parallel may have a parent parallel (and even intermediate states)
- }
- else {
- if (!parents.add(parent)) {
- // this TransitionTarget is an descendant of another, or shares the same Parallel region
- return false;
- }
- }
- }
- if (!hasParallelParent || !(tt.getAncestor(0) instanceof Parallel)) {
- // multiple targets MUST all be children of a shared parallel
+ if (first == null) {
+ first = tt;
+ i = tt.getNumberOfAncestors();
+ continue;
+ }
+ // find least common ancestor
+ for (i = Math.min(i, tt.getNumberOfAncestors()); i > 0 && first.getAncestor(i-1) != tt.getAncestor(i-1); i--) ;
+ if (i == 0) {
+ // no common ancestor
return false;
}
+ // ensure no target is an ancestor of any other target on the list
+ for (TransitionTarget other : tts) {
+ if (other != tt && other.isDescendantOf(tt) || tt.isDescendantOf(other)) {
+ return false;
+ }
+ }
}
- return true;
+ // least common ancestor must be a parallel
+ return first != null && i > 0 && first.getAncestor(i-1) instanceof Parallel;
}
}
\ No newline at end of file
Modified: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/SCXMLTestHelper.java
URL: http://svn.apache.org/viewvc/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/SCXMLTestHelper.java?rev=1630612&r1=1630611&r2=1630612&view=diff
==============================================================================
--- commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/SCXMLTestHelper.java (original)
+++ commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/SCXMLTestHelper.java Thu Oct 9 22:52:54 2014
@@ -66,6 +66,10 @@ public class SCXMLTestHelper {
return Integer.toString(++sequence);
}
+ public static URL getResource(String name) {
+ return SCXMLTestHelper.class.getClassLoader().getResource(name);
+ }
+
public static SCXML parse(final URL url) throws Exception {
return parse(url, null);
}
Modified: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/SCXMLReaderTest.java
URL: http://svn.apache.org/viewvc/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/SCXMLReaderTest.java?rev=1630612&r1=1630611&r2=1630612&view=diff
==============================================================================
--- commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/SCXMLReaderTest.java (original)
+++ commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/SCXMLReaderTest.java Thu Oct 9 22:52:54 2014
@@ -192,7 +192,25 @@ public class SCXMLReaderTest {
Final foo = (Final) scxml.getInitialTransition().getTargets().iterator().next();
Assert.assertEquals("foo", foo.getId());
}
-
+
+ @Test
+ public void testSCXMLValidTransitionTargets() throws Exception {
+ // ModelUpdater will fail on invalid transition targets
+ SCXMLTestHelper.parse(SCXMLTestHelper.getResource("org/apache/commons/scxml2/io/scxml-valid-transition-targets-test.xml"));
+ }
+
+ @Test(expected=org.apache.commons.scxml2.model.ModelException.class)
+ public void testSCXMLInValidTransitionTargets1() throws Exception {
+ // ModelUpdater will fail on invalid transition targets
+ SCXMLTestHelper.parse(SCXMLTestHelper.getResource("org/apache/commons/scxml2/io/scxml-invalid-transition-targets-test1.xml"));
+ }
+
+ @Test(expected=org.apache.commons.scxml2.model.ModelException.class)
+ public void testSCXMLInValidTransitionTargets2() throws Exception {
+ // ModelUpdater will fail on invalid transition targets
+ SCXMLTestHelper.parse(SCXMLTestHelper.getResource("org/apache/commons/scxml2/io/scxml-invalid-transition-targets-test2.xml"));
+ }
+
@Test
public void testSCXMLReaderCustomActionWithBodyTextSample() throws Exception {
List<CustomAction> cas = new ArrayList<CustomAction>();
Added: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/scxml-invalid-transition-targets-test1.xml
URL: http://svn.apache.org/viewvc/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/scxml-invalid-transition-targets-test1.xml?rev=1630612&view=auto
==============================================================================
--- commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/scxml-invalid-transition-targets-test1.xml (added)
+++ commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/scxml-invalid-transition-targets-test1.xml Thu Oct 9 22:52:54 2014
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+-->
+<!-- used in SCXMLReaderTest to ensure that multiple transition targets of which one or more is an ancestor of another
+ will be marked invalid by ModuleUpdater#verifyTransitionTargets and according to the rules in
+ http://www.w3.org/TR/scxml/#LegalStateConfigurations
+-->
+<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0"
+ initial="s1c1p1s0 s1c1p1s1 s1c1p1s1s1">
+ <state id="s1">
+ <state id="s1s1">
+ <state id="s1s1s1"/>
+ <parallel id="s1s1p1">
+ <state id="s1c1p1s0"/>
+ <state id="s1c1p1s1">
+ <state id="s1c1p1s1s1"/>
+ </state>
+ <state id="s1c1p1s2"/>
+ </parallel>
+ </state>
+ </state>
+</scxml>
Propchange: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/scxml-invalid-transition-targets-test1.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/scxml-invalid-transition-targets-test1.xml
------------------------------------------------------------------------------
svn:keywords = Id
Propchange: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/scxml-invalid-transition-targets-test1.xml
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/scxml-invalid-transition-targets-test2.xml
URL: http://svn.apache.org/viewvc/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/scxml-invalid-transition-targets-test2.xml?rev=1630612&view=auto
==============================================================================
--- commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/scxml-invalid-transition-targets-test2.xml (added)
+++ commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/scxml-invalid-transition-targets-test2.xml Thu Oct 9 22:52:54 2014
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+-->
+<!-- used in SCXMLReaderTest to ensure that multiple transition targets without a least common parallel ancestor
+ will be marked invalid by ModuleUpdater#verifyTransitionTargets and according to the rules in
+ http://www.w3.org/TR/scxml/#LegalStateConfigurations
+-->
+<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0"
+ initial="s1c1p1s0 s1c1p1s1 s1c1p2s0">
+ <state id="s1">
+ <state id="s1s1">
+ <state id="s1s1s1"/>
+ <parallel id="s1s1p1">
+ <state id="s1c1p1s0"/>
+ <state id="s1c1p1s1"/>
+ <state id="s1c1p1s2"/>
+ </parallel>
+ <parallel id="s1s1p2">
+ <state id="s1c1p2s0"/>
+ </parallel>
+ </state>
+ </state>
+</scxml>
Propchange: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/scxml-invalid-transition-targets-test2.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/scxml-invalid-transition-targets-test2.xml
------------------------------------------------------------------------------
svn:keywords = Id
Propchange: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/scxml-invalid-transition-targets-test2.xml
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/scxml-valid-transition-targets-test.xml
URL: http://svn.apache.org/viewvc/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/scxml-valid-transition-targets-test.xml?rev=1630612&view=auto
==============================================================================
--- commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/scxml-valid-transition-targets-test.xml (added)
+++ commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/scxml-valid-transition-targets-test.xml Thu Oct 9 22:52:54 2014
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+-->
+<!-- used in SCXMLReaderTest to validate that multiple transition targets within a deeply nested parallel
+ can be reached as validated by ModuleUpdater#verifyTransitionTargets and according to the rules in
+ http://www.w3.org/TR/scxml/#LegalStateConfigurations
+-->
+<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0"
+ initial="s1c1p1s1 s1c1p1s2 s1c1p1s3">
+ <state id="s1">
+ <state id="s1s1">
+ <state id="s1s1s1"/>
+ <parallel id="s1s1p1">
+ <state id="s1c1p1s1"/>
+ <state id="s1c1p1s2"/>
+ <state id="s1c1p1s3"/>
+ </parallel>
+ </state>
+ </state>
+</scxml>
Propchange: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/scxml-valid-transition-targets-test.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/scxml-valid-transition-targets-test.xml
------------------------------------------------------------------------------
svn:keywords = Id
Propchange: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/io/scxml-valid-transition-targets-test.xml
------------------------------------------------------------------------------
svn:mime-type = text/plain