This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-scxml.git
The following commit(s) were added to refs/heads/master by this push: new 20dadb9 No need to nest in else. 20dadb9 is described below commit 20dadb9d829ecf40ed8e227729afa1a3ebf83029 Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Fri Mar 5 14:59:00 2021 -0500 No need to nest in else. --- .../commons/scxml2/SCXMLExecutionContext.java | 3 +- .../org/apache/commons/scxml2/SCXMLExecutor.java | 22 ++-- .../commons/scxml2/env/AbstractBaseEvaluator.java | 20 ++-- .../apache/commons/scxml2/env/SimpleContext.java | 6 +- .../commons/scxml2/env/SimpleDispatcher.java | 116 ++++++++++----------- .../apache/commons/scxml2/io/ContentParser.java | 2 +- .../org/apache/commons/scxml2/io/SCXMLWriter.java | 5 +- .../org/apache/commons/scxml2/model/Action.java | 2 +- .../org/apache/commons/scxml2/model/Foreach.java | 72 +++++++------ .../org/apache/commons/scxml2/model/Invoke.java | 20 ++-- .../scxml2/semantics/SCXMLSemanticsImpl.java | 10 +- .../org/apache/commons/scxml2/w3c/W3CTests.java | 20 ++-- 12 files changed, 137 insertions(+), 161 deletions(-) diff --git a/src/main/java/org/apache/commons/scxml2/SCXMLExecutionContext.java b/src/main/java/org/apache/commons/scxml2/SCXMLExecutionContext.java index d8f7449..7af2fcb 100644 --- a/src/main/java/org/apache/commons/scxml2/SCXMLExecutionContext.java +++ b/src/main/java/org/apache/commons/scxml2/SCXMLExecutionContext.java @@ -216,7 +216,8 @@ public class SCXMLExecutionContext implements SCXMLIOProcessor { public void start() { if (scInstance.isRunning()) { throw new IllegalStateException("The state machine has already started."); - } else if (scInstance.getGlobalContext() == null) { + } + if (scInstance.getGlobalContext() == null) { throw new IllegalStateException("The state machine has not been initialized yet."); } scInstance.start(); diff --git a/src/main/java/org/apache/commons/scxml2/SCXMLExecutor.java b/src/main/java/org/apache/commons/scxml2/SCXMLExecutor.java index c5808d2..edfc262 100644 --- a/src/main/java/org/apache/commons/scxml2/SCXMLExecutor.java +++ b/src/main/java/org/apache/commons/scxml2/SCXMLExecutor.java @@ -165,25 +165,21 @@ public class SCXMLExecutor implements SCXMLIOProcessor { final Set<EnterableState> states = new HashSet<>(); for (final String stateId : atomicStateIds) { final TransitionTarget tt = getStateMachine().getTargets().get(stateId); - if (tt instanceof EnterableState && ((EnterableState)tt).isAtomicState()) { - EnterableState es = (EnterableState)tt; - while (es != null && !states.add(es)) { - es = es.getParent(); - } - } - else { + if (!(tt instanceof EnterableState) || !((EnterableState)tt).isAtomicState()) { throw new ModelException("Illegal atomic stateId "+stateId+": state unknown or not an atomic state"); } - } - if (semantics.isLegalConfiguration(states, getErrorReporter())) { - for (final EnterableState es : states) { - exctx.getScInstance().getStateConfiguration().enterState(es); + EnterableState es = (EnterableState)tt; + while (es != null && !states.add(es)) { + es = es.getParent(); } - logState(); } - else { + if (!semantics.isLegalConfiguration(states, getErrorReporter())) { throw new ModelException("Illegal state machine configuration!"); } + for (final EnterableState es : states) { + exctx.getScInstance().getStateConfiguration().enterState(es); + } + logState(); exctx.start(); } diff --git a/src/main/java/org/apache/commons/scxml2/env/AbstractBaseEvaluator.java b/src/main/java/org/apache/commons/scxml2/env/AbstractBaseEvaluator.java index db6e7f1..b53138e 100644 --- a/src/main/java/org/apache/commons/scxml2/env/AbstractBaseEvaluator.java +++ b/src/main/java/org/apache/commons/scxml2/env/AbstractBaseEvaluator.java @@ -67,7 +67,7 @@ public abstract class AbstractBaseEvaluator implements Evaluator, Serializable { if (data instanceof Node) { return ((Node)data).cloneNode(true); } - else if (data instanceof NodeList) { + if (data instanceof NodeList) { final NodeList nodeList = (NodeList)data; final ArrayList<Node> list = new ArrayList<>(); for (int i = 0, size = nodeList.getLength(); i < size; i++) { @@ -75,24 +75,22 @@ public abstract class AbstractBaseEvaluator implements Evaluator, Serializable { } return list; } - else if (data instanceof List) { + if (data instanceof List) { final ArrayList<Object> list = new ArrayList<>(); for (final Object v : (List)data) { list.add(cloneData(v)); } return list; } - else if (data instanceof Map) { - final Map<?,?> dataMap = (Map<?,?>)data; - final HashMap<Object, Object> map = new LinkedHashMap<>(); - for (final Map.Entry<?,?> entry : dataMap.entrySet()) { - map.put(cloneData(entry.getKey()), cloneData(entry.getValue())); - } - return map; - } - else { + if (!(data instanceof Map)) { return cloneUnknownDataType(data); } + final Map<?,?> dataMap = (Map<?,?>)data; + final HashMap<Object, Object> map = new LinkedHashMap<>(); + for (final Map.Entry<?,?> entry : dataMap.entrySet()) { + map.put(cloneData(entry.getKey()), cloneData(entry.getValue())); + } + return map; } return null; } diff --git a/src/main/java/org/apache/commons/scxml2/env/SimpleContext.java b/src/main/java/org/apache/commons/scxml2/env/SimpleContext.java index 256262e..68a1339 100644 --- a/src/main/java/org/apache/commons/scxml2/env/SimpleContext.java +++ b/src/main/java/org/apache/commons/scxml2/env/SimpleContext.java @@ -106,11 +106,11 @@ public class SimpleContext implements Context, Serializable { final Object localValue = getVars().get(name); if (localValue != null) { return localValue; - } else if (parent != null) { + } + if (parent != null) { return parent.get(name); - } else { - return null; } + return null; } /** diff --git a/src/main/java/org/apache/commons/scxml2/env/SimpleDispatcher.java b/src/main/java/org/apache/commons/scxml2/env/SimpleDispatcher.java index fe8eea4..6fb8cbc 100644 --- a/src/main/java/org/apache/commons/scxml2/env/SimpleDispatcher.java +++ b/src/main/java/org/apache/commons/scxml2/env/SimpleDispatcher.java @@ -171,75 +171,69 @@ public class SimpleDispatcher implements EventDispatcher, Serializable { // We only handle the "scxml" type (which is the default too) and optionally the #_internal target - if (type == null || type.equalsIgnoreCase(SCXMLIOProcessor.SCXML_EVENT_PROCESSOR) || - type.equals(SCXMLIOProcessor.DEFAULT_EVENT_PROCESSOR)) { - final String originType = SCXMLIOProcessor.DEFAULT_EVENT_PROCESSOR; - SCXMLIOProcessor ioProcessor; + if ((type != null) && !type.equalsIgnoreCase(SCXMLIOProcessor.SCXML_EVENT_PROCESSOR) && !type.equals(SCXMLIOProcessor.DEFAULT_EVENT_PROCESSOR)) { + ioProcessors.get(SCXMLIOProcessor.INTERNAL_EVENT_PROCESSOR) + .addEvent(new EventBuilder(TriggerEvent.ERROR_EXECUTION, TriggerEvent.ERROR_EVENT).sendId(id).build()); + throw new ActionExecutionError(true, "<send>: Unsupported type - " + type); + } + final String originType = SCXMLIOProcessor.DEFAULT_EVENT_PROCESSOR; + SCXMLIOProcessor ioProcessor; - boolean internal = false; + boolean internal = false; - String origin = target; - if (target == null) { - ioProcessor = ioProcessors.get(SCXMLIOProcessor.SCXML_EVENT_PROCESSOR); - origin = SCXMLIOProcessor.SCXML_EVENT_PROCESSOR; - } - else if (ioProcessors.containsKey(target)) { - ioProcessor = ioProcessors.get(target); - internal = SCXMLIOProcessor.INTERNAL_EVENT_PROCESSOR.equals(target); - } - else if (SCXMLIOProcessor.INTERNAL_EVENT_PROCESSOR.equals(target)) { - ioProcessor = ioProcessors.get(SCXMLIOProcessor.INTERNAL_EVENT_PROCESSOR); - internal = true; - } - else { - if (target.startsWith(SCXMLIOProcessor.EVENT_PROCESSOR_ALIAS_PREFIX)) { - ioProcessors.get(SCXMLIOProcessor.INTERNAL_EVENT_PROCESSOR).addEvent( - new EventBuilder(TriggerEvent.ERROR_COMMUNICATION, TriggerEvent.ERROR_EVENT) - .sendId(id).build()); - throw new ActionExecutionError(true, "<send>: Unavailable target - " + target); - } else { - ioProcessors.get(SCXMLIOProcessor.INTERNAL_EVENT_PROCESSOR).addEvent( - new EventBuilder(TriggerEvent.ERROR_EXECUTION, TriggerEvent.ERROR_EVENT) - .sendId(id).build()); - throw new ActionExecutionError(true, "<send>: Invalid or unsupported target - " + target); - } + String origin = target; + if (target == null) { + ioProcessor = ioProcessors.get(SCXMLIOProcessor.SCXML_EVENT_PROCESSOR); + origin = SCXMLIOProcessor.SCXML_EVENT_PROCESSOR; + } + else if (ioProcessors.containsKey(target)) { + ioProcessor = ioProcessors.get(target); + internal = SCXMLIOProcessor.INTERNAL_EVENT_PROCESSOR.equals(target); + } + else if (SCXMLIOProcessor.INTERNAL_EVENT_PROCESSOR.equals(target)) { + ioProcessor = ioProcessors.get(SCXMLIOProcessor.INTERNAL_EVENT_PROCESSOR); + internal = true; + } + else { + if (target.startsWith(SCXMLIOProcessor.EVENT_PROCESSOR_ALIAS_PREFIX)) { + ioProcessors.get(SCXMLIOProcessor.INTERNAL_EVENT_PROCESSOR).addEvent( + new EventBuilder(TriggerEvent.ERROR_COMMUNICATION, TriggerEvent.ERROR_EVENT) + .sendId(id).build()); + throw new ActionExecutionError(true, "<send>: Unavailable target - " + target); } + ioProcessors.get(SCXMLIOProcessor.INTERNAL_EVENT_PROCESSOR).addEvent( + new EventBuilder(TriggerEvent.ERROR_EXECUTION, TriggerEvent.ERROR_EVENT) + .sendId(id).build()); + throw new ActionExecutionError(true, "<send>: Invalid or unsupported target - " + target); + } - if (event == null) { - ioProcessors.get(SCXMLIOProcessor.INTERNAL_EVENT_PROCESSOR) - .addEvent(new EventBuilder(TriggerEvent.ERROR_EXECUTION, TriggerEvent.ERROR_EVENT).sendId(id).build()); - throw new ActionExecutionError(true, "<send>: Cannot send without event name"); + if (event == null) { + ioProcessors.get(SCXMLIOProcessor.INTERNAL_EVENT_PROCESSOR) + .addEvent(new EventBuilder(TriggerEvent.ERROR_EXECUTION, TriggerEvent.ERROR_EVENT).sendId(id).build()); + throw new ActionExecutionError(true, "<send>: Cannot send without event name"); + } + final EventBuilder eventBuilder = new EventBuilder(event, TriggerEvent.SIGNAL_EVENT) + .sendId(id) + .data(data); + if (!internal) { + eventBuilder.origin(origin).originType(originType); + if (SCXMLIOProcessor.PARENT_EVENT_PROCESSOR.equals(target)) { + eventBuilder.invokeId(((ParentSCXMLIOProcessor)ioProcessor).getInvokeId()); } - else { - final EventBuilder eventBuilder = new EventBuilder(event, TriggerEvent.SIGNAL_EVENT) - .sendId(id) - .data(data); - if (!internal) { - eventBuilder.origin(origin).originType(originType); - if (SCXMLIOProcessor.PARENT_EVENT_PROCESSOR.equals(target)) { - eventBuilder.invokeId(((ParentSCXMLIOProcessor)ioProcessor).getInvokeId()); - } - if (delay > 0L) { - // Need to schedule this one - final Timer timer = new Timer(true); - timer.schedule(new DelayedEventTask(id, eventBuilder.build(), ioProcessor), delay); - timers.put(id, timer); - if (log.isDebugEnabled()) { - log.debug("Scheduled event '" + event + "' with delay " - + delay + "ms, as specified by <send> with id '" - + id + "'"); - } - return; - } + if (delay > 0L) { + // Need to schedule this one + final Timer timer = new Timer(true); + timer.schedule(new DelayedEventTask(id, eventBuilder.build(), ioProcessor), delay); + timers.put(id, timer); + if (log.isDebugEnabled()) { + log.debug("Scheduled event '" + event + "' with delay " + + delay + "ms, as specified by <send> with id '" + + id + "'"); } - ioProcessor.addEvent(eventBuilder.build()); + return; } } - else { - ioProcessors.get(SCXMLIOProcessor.INTERNAL_EVENT_PROCESSOR) - .addEvent(new EventBuilder(TriggerEvent.ERROR_EXECUTION, TriggerEvent.ERROR_EVENT).sendId(id).build()); - throw new ActionExecutionError(true, "<send>: Unsupported type - " + type); - } + ioProcessor.addEvent(eventBuilder.build()); } } 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 0c6c766..3f9f45f 100644 --- a/src/main/java/org/apache/commons/scxml2/io/ContentParser.java +++ b/src/main/java/org/apache/commons/scxml2/io/ContentParser.java @@ -231,7 +231,7 @@ public class ContentParser { if (hasJsonSignature(src)) { return new JsonValue(parseJson(src), false); } - else if (hasXmlSignature(src)) { + if (hasXmlSignature(src)) { return new NodeValue(parseXml(src)); } return new TextValue(spaceNormalizeContent(src), false); 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 19757e1..20ed057 100644 --- a/src/main/java/org/apache/commons/scxml2/io/SCXMLWriter.java +++ b/src/main/java/org/apache/commons/scxml2/io/SCXMLWriter.java @@ -168,10 +168,9 @@ public class SCXMLWriter { writeInternal(scxml, configuration, null, null, null); if (configuration.usePrettyPrint) { return configuration.prettyPrintOutput; - } else { - configuration.internalWriter.flush(); - return configuration.internalWriter.toString(); } + configuration.internalWriter.flush(); + return configuration.internalWriter.toString(); } /** diff --git a/src/main/java/org/apache/commons/scxml2/model/Action.java b/src/main/java/org/apache/commons/scxml2/model/Action.java index 93ffa1b..b318816 100644 --- a/src/main/java/org/apache/commons/scxml2/model/Action.java +++ b/src/main/java/org/apache/commons/scxml2/model/Action.java @@ -73,7 +73,7 @@ public abstract class Action implements Serializable { // global script doesn't have a EnterableState return null; } - else if (parent == null) { + if (parent == null) { throw new ModelException("Action " + this.getClass().getName() + " instance missing required parent TransitionTarget"); } diff --git a/src/main/java/org/apache/commons/scxml2/model/Foreach.java b/src/main/java/org/apache/commons/scxml2/model/Foreach.java index b79824a..1603906 100644 --- a/src/main/java/org/apache/commons/scxml2/model/Foreach.java +++ b/src/main/java/org/apache/commons/scxml2/model/Foreach.java @@ -96,48 +96,46 @@ public class Foreach extends Action implements ActionsContainer { final Context ctx = exctx.getContext(getParentEnterableState()); final Evaluator eval = exctx.getEvaluator(); final Object arrayObject = eval.eval(ctx,array); - if (arrayObject != null && (arrayObject.getClass().isArray() || arrayObject instanceof Iterable || arrayObject instanceof Map)) { - if (arrayObject.getClass().isArray()) { - for (int currentIndex = 0, size = Array.getLength(arrayObject); currentIndex < size; currentIndex++) { - eval.evalAssign(ctx, item, Array.get(arrayObject, currentIndex)); - if (index != null) { - ctx.setLocal(index, currentIndex); - } - // The "foreach" statement is a "container" - for (final Action aa : actions) { - aa.execute(exctx); - } - } - } - else { - // In case of Javascript based arrays, the (Nashorn) engine returns a ScriptObjectMirror - // which (also) implements Map<String, Object), so then we can/must use the map values as Iterable - final Iterable iterable = arrayObject instanceof Iterable ? (Iterable)arrayObject : ((Map)arrayObject).values(); - - // Spec requires to iterate over a shallow copy of underlying array in a way that modifications to - // the collection during the execution of <foreach> must not affect the iteration behavior. - // For array objects (see above) this isn't needed, but for Iterables we don't have that guarantee - // so we make a copy first - final ArrayList<Object> arrayList = new ArrayList<>(); - for (final Object value: iterable) { - arrayList.add(value); + if ((arrayObject == null) || (!arrayObject.getClass().isArray() && !(arrayObject instanceof Iterable) && !(arrayObject instanceof Map))) { + throw new ActionExecutionError("<foreach> in state " + getParentEnterableState().getId()+": invalid array value '"+array+"'"); + } + if (arrayObject.getClass().isArray()) { + for (int currentIndex = 0, size = Array.getLength(arrayObject); currentIndex < size; currentIndex++) { + eval.evalAssign(ctx, item, Array.get(arrayObject, currentIndex)); + if (index != null) { + ctx.setLocal(index, currentIndex); } - int currentIndex = 0; - for (final Object value : arrayList) { - eval.evalAssign(ctx, item, value); - if (index != null) { - ctx.setLocal(index, currentIndex); - } - // The "foreach" statement is a "container" - for (final Action aa : actions) { - aa.execute(exctx); - } - currentIndex++; + // The "foreach" statement is a "container" + for (final Action aa : actions) { + aa.execute(exctx); } } } else { - throw new ActionExecutionError("<foreach> in state " + getParentEnterableState().getId()+": invalid array value '"+array+"'"); + // In case of Javascript based arrays, the (Nashorn) engine returns a ScriptObjectMirror + // which (also) implements Map<String, Object), so then we can/must use the map values as Iterable + final Iterable iterable = arrayObject instanceof Iterable ? (Iterable)arrayObject : ((Map)arrayObject).values(); + + // Spec requires to iterate over a shallow copy of underlying array in a way that modifications to + // the collection during the execution of <foreach> must not affect the iteration behavior. + // For array objects (see above) this isn't needed, but for Iterables we don't have that guarantee + // so we make a copy first + final ArrayList<Object> arrayList = new ArrayList<>(); + for (final Object value: iterable) { + arrayList.add(value); + } + int currentIndex = 0; + for (final Object value : arrayList) { + eval.evalAssign(ctx, item, value); + if (index != null) { + ctx.setLocal(index, currentIndex); + } + // The "foreach" statement is a "container" + for (final Action aa : actions) { + aa.execute(exctx); + } + currentIndex++; + } } } } 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 50530b3..9279a17 100644 --- a/src/main/java/org/apache/commons/scxml2/model/Invoke.java +++ b/src/main/java/org/apache/commons/scxml2/model/Invoke.java @@ -420,20 +420,18 @@ public class Invoke extends Action implements ContentContainer, ParamsContainer } else if (contentValue instanceof Element) { // xml based content (must be assigned through data) final Element contentElement = (Element)contentValue; - if (SCXMLConstants.ELEM_SCXML.equals(contentElement.getLocalName()) && - SCXMLConstants.XMLNS_SCXML.equals(contentElement.getNamespaceURI())) { - // statemachine definition: transform to string as we cannot (yet) pass XML directly to invoker - try { - contentValue = ContentParser.DEFAULT_PARSER.toXml(contentElement); - } - catch (final IOException e) { - throw new ActionExecutionError("<invoke> for state "+parentState.getId() + - ": invalid <content><scxml> definition"); - } - } else { + if (!SCXMLConstants.ELEM_SCXML.equals(contentElement.getLocalName()) || !SCXMLConstants.XMLNS_SCXML.equals(contentElement.getNamespaceURI())) { throw new ActionExecutionError("<invoke> for state "+parentState.getId() + ": invalid <content> definition"); } + // statemachine definition: transform to string as we cannot (yet) pass XML directly to invoker + try { + contentValue = ContentParser.DEFAULT_PARSER.toXml(contentElement); + } + catch (final IOException e) { + throw new ActionExecutionError("<invoke> for state "+parentState.getId() + + ": invalid <content><scxml> definition"); + } } else { throw new ActionExecutionError("<invoke> for state "+parentState.getId() + ": invalid <content> definition"); diff --git a/src/main/java/org/apache/commons/scxml2/semantics/SCXMLSemanticsImpl.java b/src/main/java/org/apache/commons/scxml2/semantics/SCXMLSemanticsImpl.java index 87975c8..73e48fb 100644 --- a/src/main/java/org/apache/commons/scxml2/semantics/SCXMLSemanticsImpl.java +++ b/src/main/java/org/apache/commons/scxml2/semantics/SCXMLSemanticsImpl.java @@ -580,9 +580,7 @@ public class SCXMLSemanticsImpl implements SCXMLSemantics { throw new ModelException("Illegal state machine configuration: encountered top level <final> " + "state while processing an event"); } - else { - es = es.getParent(); - } + es = es.getParent(); } final TransitionalState state = (TransitionalState)es; TransitionalState current = state; @@ -643,13 +641,11 @@ public class SCXMLSemanticsImpl implements SCXMLSemantics { } } if (hasIntersection) { - if (t1.getParent().isDescendantOf(t2.getParent())) { - preemptedTransitions.add(t2); - } - else { + if (!t1.getParent().isDescendantOf(t2.getParent())) { t1Preempted = true; break; } + preemptedTransitions.add(t2); } } if (t1Preempted) { 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 9b08420..0d73df1 100644 --- a/src/test/java/org/apache/commons/scxml2/w3c/W3CTests.java +++ b/src/test/java/org/apache/commons/scxml2/w3c/W3CTests.java @@ -274,7 +274,7 @@ public class W3CTests { if ("#minimal-profile".equals(specid)) { return Datamodel.MINIMAL; } - else if ("#ecma-profile".equals(specid)) { + if ("#ecma-profile".equals(specid)) { return Datamodel.ECMA; } return null; @@ -414,11 +414,11 @@ public class W3CTests { new W3CTests().getTests(); return; } - else if ("make".equals(args[0])) { + if ("make".equals(args[0])) { new W3CTests().makeTests(); return; } - else if ("run".equals(args[0])) { + if ("run".equals(args[0])) { final Datamodel datamodel = Datamodel.fromValue(System.getProperty("datamodel")); final String testId = System.getProperty("test"); new W3CTests().runTests(testId, datamodel); @@ -566,12 +566,10 @@ public class W3CTests { final boolean enabled = Boolean.parseBoolean(System.getProperty("enabled", "true")); if (testId != null) { final Assertions.Assertion assertion = assertions.getAssertions().get(testId); - if (assertion != null) { - runAssert(assertion, tests, datamodel, enabled, true, results); - } - else { + if (assertion == null) { throw new IllegalArgumentException("Unknown test with id: "+testId); } + runAssert(assertion, tests, datamodel, enabled, true, results); } else { for (final Assertions.Assertion entry : assertions.getAssertions().values()) { @@ -677,13 +675,11 @@ public class W3CTests { if (!testCase.isManual()) { return end.getId().equals("pass"); } - else if (test.getFinalState() != null) { + if (test.getFinalState() != null) { return end.getId().equals(test.getFinalState()); } - else { - // todo: manual verification for specific tests - return false; - } + // todo: manual verification for specific tests + return false; } catch (final Exception e) { if (test.isManual() && e.getMessage() != null && e.getMessage().equals(test.getFinalState())) {