Hi Woosan, 2015-04-09 5:43 GMT+02:00 <[email protected]>:
> Author: woonsan > Date: Thu Apr 9 03:43:19 2015 > New Revision: 1672236 > > URL: http://svn.apache.org/r1672236 > Log: > SCXML-227: Applying Michael Goerlich's patch with validating unit tests > > Added: > > commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/model/CancelTest.java > > commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/model/cancel-test-01.xml > > commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/model/cancel-test-02.xml > Modified: > > commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/io/SCXMLReader.java > > commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/model/Cancel.java > Don't forget to add fixed issues to changes.xml. :-) Benedikt > > Modified: > commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/io/SCXMLReader.java > URL: > http://svn.apache.org/viewvc/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/io/SCXMLReader.java?rev=1672236&r1=1672235&r2=1672236&view=diff > > ============================================================================== > --- > commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/io/SCXMLReader.java > (original) > +++ > commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/io/SCXMLReader.java > Thu Apr 9 03:43:19 2015 > @@ -63,9 +63,6 @@ import org.apache.commons.scxml2.model.D > import org.apache.commons.scxml2.model.Else; > import org.apache.commons.scxml2.model.ElseIf; > import org.apache.commons.scxml2.model.EnterableState; > -import org.apache.commons.scxml2.model.ParamsContainer; > -import org.apache.commons.scxml2.model.TransitionalState; > -import org.apache.commons.scxml2.model.Raise; > import org.apache.commons.scxml2.model.Executable; > import org.apache.commons.scxml2.model.ExternalContent; > import org.apache.commons.scxml2.model.Final; > @@ -82,6 +79,8 @@ import org.apache.commons.scxml2.model.O > import org.apache.commons.scxml2.model.OnExit; > import org.apache.commons.scxml2.model.Parallel; > import org.apache.commons.scxml2.model.Param; > +import org.apache.commons.scxml2.model.ParamsContainer; > +import org.apache.commons.scxml2.model.Raise; > import org.apache.commons.scxml2.model.SCXML; > import org.apache.commons.scxml2.model.Script; > import org.apache.commons.scxml2.model.Send; > @@ -89,6 +88,7 @@ import org.apache.commons.scxml2.model.S > import org.apache.commons.scxml2.model.State; > import org.apache.commons.scxml2.model.Transition; > import org.apache.commons.scxml2.model.TransitionType; > +import org.apache.commons.scxml2.model.TransitionalState; > import org.apache.commons.scxml2.model.Var; > import org.w3c.dom.Attr; > import org.w3c.dom.Document; > @@ -294,6 +294,7 @@ public final class SCXMLReader { > private static final String ATTR_NAMELIST = "namelist"; > private static final String ATTR_PROFILE = "profile"; > private static final String ATTR_SENDID = "sendid"; > + private static final String ATTR_SENDIDEXPR = "sendidexpr"; > private static final String ATTR_SRC = "src"; > private static final String ATTR_SRCEXPR = "srcexpr"; > private static final String ATTR_TARGET = "target"; > @@ -1882,9 +1883,19 @@ public final class SCXMLReader { > */ > private static void readCancel(final XMLStreamReader reader, final > Configuration configuration, > final Executable executable, final > ActionsContainer parent) > - throws XMLStreamException { > + throws XMLStreamException, ModelException { > > Cancel cancel = new Cancel(); > + cancel.setSendid(readAV(reader, ATTR_SENDID)); > + String attrValue = readAV(reader, ATTR_SENDIDEXPR); > + if (attrValue != null) { > + if (cancel.getSendid() != null) { > + reportConflictingAttribute(reader, configuration, > ELEM_CANCEL, ATTR_SENDID, ATTR_SENDIDEXPR); > + } > + else { > + cancel.setSendidexpr(attrValue); > + } > + } > readNamespaces(configuration, cancel); > cancel.setParent(executable); > if (parent != null) { > > Modified: > commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/model/Cancel.java > URL: > http://svn.apache.org/viewvc/commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/model/Cancel.java?rev=1672236&r1=1672235&r2=1672236&view=diff > > ============================================================================== > --- > commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/model/Cancel.java > (original) > +++ > commons/proper/scxml/trunk/src/main/java/org/apache/commons/scxml2/model/Cancel.java > Thu Apr 9 03:43:19 2015 > @@ -17,6 +17,8 @@ > package org.apache.commons.scxml2.model; > > import org.apache.commons.scxml2.ActionExecutionContext; > +import org.apache.commons.scxml2.Context; > +import org.apache.commons.scxml2.Evaluator; > import org.apache.commons.scxml2.SCXMLExpressionException; > > /** > @@ -44,6 +46,11 @@ public class Cancel extends Action { > private String sendid; > > /** > + * The expression that evaluates to the ID of the send message that > should be cancelled. > + */ > + private String sendidexpr; > + > + /** > * Get the ID of the send message that should be cancelled. > * > * @return Returns the sendid. > @@ -62,11 +69,44 @@ public class Cancel extends Action { > } > > /** > + * Get the expression that evaluates to the ID of the send message > that should be cancelled. > + * > + * @return the expression that evaluates to the ID of the send > message that should be cancelled. > + */ > + public String getSendidexpr() { > + return sendidexpr; > + } > + > + /** > + * Set the expression that evaluates to the ID of the send message > that should be cancelled. > + * > + * @param sendidexpr the expression that evaluates to the ID of the > send message that should be cancelled. > + */ > + public void setSendidexpr(String sendidexpr) { > + this.sendidexpr = sendidexpr; > + } > + > + /** > * {@inheritDoc} > */ > @Override > public void execute(ActionExecutionContext exctx) throws > ModelException, SCXMLExpressionException { > - exctx.getEventDispatcher().cancel(sendid); > + EnterableState parentState = getParentEnterableState(); > + Context ctx = exctx.getContext(parentState); > + ctx.setLocal(getNamespacesKey(), getNamespaces()); > + Evaluator eval = exctx.getEvaluator(); > + > + String sendidValue = sendid; > + if (sendidValue == null && sendidexpr != null) { > + sendidValue = (String) > getTextContentIfNodeResult(eval.eval(ctx, sendidexpr)); > + if ((sendidValue == null || sendidValue.trim().length() == 0) > + && exctx.getAppLog().isWarnEnabled()) { > + exctx.getAppLog().warn("<send>: sendid expression \"" + > sendidexpr > + + "\" evaluated to null or empty String"); > + } > + } > + > + exctx.getEventDispatcher().cancel(sendidValue); > } > } > > > Added: > commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/model/CancelTest.java > URL: > http://svn.apache.org/viewvc/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/model/CancelTest.java?rev=1672236&view=auto > > ============================================================================== > --- > commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/model/CancelTest.java > (added) > +++ > commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/model/CancelTest.java > Thu Apr 9 03:43:19 2015 > @@ -0,0 +1,50 @@ > +/* > + * 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. > + */ > +package org.apache.commons.scxml2.model; > + > +import org.apache.commons.scxml2.SCXMLExecutor; > +import org.apache.commons.scxml2.SCXMLTestHelper; > +import org.apache.commons.scxml2.TriggerEvent; > +import org.apache.commons.scxml2.env.SimpleDispatcher; > +import org.junit.Test; > + > +public class CancelTest { > + > + @Test > + public void testCancelBySendId() throws Exception { > + final SCXML scxml = > SCXMLTestHelper.parse("org/apache/commons/scxml2/model/cancel-test-01.xml"); > + final SCXMLExecutor exec = SCXMLTestHelper.getExecutor(scxml, > null, new SimpleDispatcher()); > + exec.go(); > + TriggerEvent te = new TriggerEvent("event.foo", > TriggerEvent.SIGNAL_EVENT); > + SCXMLTestHelper.fireEvent(exec, te); > + Thread.sleep(3000); > + exec.triggerEvents(); > + SCXMLTestHelper.assertState(exec, "twenty"); > + } > + > + @Test > + public void testCancelBySendIdExpr() throws Exception { > + final SCXML scxml = > SCXMLTestHelper.parse("org/apache/commons/scxml2/model/cancel-test-02.xml"); > + final SCXMLExecutor exec = SCXMLTestHelper.getExecutor(scxml, > null, new SimpleDispatcher()); > + exec.go(); > + TriggerEvent te = new TriggerEvent("event.foo", > TriggerEvent.SIGNAL_EVENT); > + SCXMLTestHelper.fireEvent(exec, te); > + Thread.sleep(3000); > + exec.triggerEvents(); > + SCXMLTestHelper.assertState(exec, "twenty"); > + } > +} > > Added: > commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/model/cancel-test-01.xml > URL: > http://svn.apache.org/viewvc/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/model/cancel-test-01.xml?rev=1672236&view=auto > > ============================================================================== > --- > commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/model/cancel-test-01.xml > (added) > +++ > commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/model/cancel-test-01.xml > Thu Apr 9 03:43:19 2015 > @@ -0,0 +1,56 @@ > +<?xml version="1.0" encoding="UTF-8"?> > +<!-- > + * 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. > +--> > +<scxml xmlns="http://www.w3.org/2005/07/scxml" > + xmlns:cs="http://commons.apache.org/scxml" > + version="1.0" > + datamodel="jexl" > + initial="ten"> > + > + <datamodel> > + <data id="rootdata"> > + <root xmlns=""> > + <one>1</one> > + <two>2</two> > + </root> > + </data> > + </datamodel> > + > + <state id="ten"> > + > + <transition event="event.foo" target="twenty" /> > + > + <onexit> > + <cs:var name="one" expr="Data('number($rootdata/root/one)')" > /> > + <cs:var name="two" expr="Data('number($rootdata/root/two)')" > /> > + <send id="send123" event="event.bar" namelist="one two" > delay="1500" /> > + </onexit> > + > + </state> > + > + <state id="twenty"> > + <onentry> > + <cancel sendid="send123" /> > + </onentry> > + > + <transition event="event.bar" target="thirty" /> > + > + </state> > + > + <final id="thirty" /> > + > +</scxml> > > Added: > commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/model/cancel-test-02.xml > URL: > http://svn.apache.org/viewvc/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/model/cancel-test-02.xml?rev=1672236&view=auto > > ============================================================================== > --- > commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/model/cancel-test-02.xml > (added) > +++ > commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/model/cancel-test-02.xml > Thu Apr 9 03:43:19 2015 > @@ -0,0 +1,56 @@ > +<?xml version="1.0" encoding="UTF-8"?> > +<!-- > + * 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. > +--> > +<scxml xmlns="http://www.w3.org/2005/07/scxml" > + xmlns:cs="http://commons.apache.org/scxml" > + version="1.0" > + datamodel="jexl" > + initial="ten"> > + > + <datamodel> > + <data id="rootdata"> > + <root xmlns=""> > + <one>1</one> > + <two>2</two> > + </root> > + </data> > + </datamodel> > + > + <state id="ten"> > + > + <transition event="event.foo" target="twenty" /> > + > + <onexit> > + <cs:var name="one" expr="Data('number($rootdata/root/one)')" > /> > + <cs:var name="two" expr="Data('number($rootdata/root/two)')" > /> > + <send id="send123" event="event.bar" namelist="one two" > delay="1500" /> > + </onexit> > + > + </state> > + > + <state id="twenty"> > + <onentry> > + <cancel sendidexpr="'send123'" /> > + </onentry> > + > + <transition event="event.bar" target="thirty" /> > + > + </state> > + > + <final id="thirty" /> > + > +</scxml> > > > -- http://people.apache.org/~britter/ http://www.systemoutprintln.de/ http://twitter.com/BenediktRitter http://github.com/britter
