SCXML-278 Code cleanup and Java8 alignment
authorAte Douma <ate@apache.org>
Sun, 7 Jan 2018 15:26:10 +0000 (16:26 +0100)
committerAte Douma <ate@apache.org>
Sun, 7 Jan 2018 15:34:06 +0000 (16:34 +0100)
- remove obsolete code, unused imports
- remove duplicate code, move repeated code up to parent class
- cleanup exception handling
- align with Java8, remove unnessesary type casting, make use of lamba's where useful
- fixup references to current/final SCXML spec urls
- apply protected, private, static, and/or final scoping of fields and methods where possible

83 files changed:
src/changes/changes.xml
src/main/java/org/apache/commons/scxml2/EvaluatorFactory.java
src/main/java/org/apache/commons/scxml2/ExternalSCXMLIOProcessor.java
src/main/java/org/apache/commons/scxml2/NotificationRegistry.java
src/main/java/org/apache/commons/scxml2/SCInstance.java
src/main/java/org/apache/commons/scxml2/SCXMLExecutionContext.java
src/main/java/org/apache/commons/scxml2/SCXMLExecutor.java
src/main/java/org/apache/commons/scxml2/SCXMLExpressionException.java
src/main/java/org/apache/commons/scxml2/SCXMLSemantics.java
src/main/java/org/apache/commons/scxml2/SCXMLSystemContext.java
src/main/java/org/apache/commons/scxml2/StateConfiguration.java
src/main/java/org/apache/commons/scxml2/env/AbstractBaseEvaluator.java
src/main/java/org/apache/commons/scxml2/env/AbstractStateMachine.java
src/main/java/org/apache/commons/scxml2/env/LogUtils.java
src/main/java/org/apache/commons/scxml2/env/SimpleContext.java
src/main/java/org/apache/commons/scxml2/env/SimpleDispatcher.java
src/main/java/org/apache/commons/scxml2/env/SimpleErrorHandler.java
src/main/java/org/apache/commons/scxml2/env/SimpleErrorReporter.java
src/main/java/org/apache/commons/scxml2/env/SimpleSCXMLListener.java
src/main/java/org/apache/commons/scxml2/env/SimpleXMLReporter.java
src/main/java/org/apache/commons/scxml2/env/Tracer.java
src/main/java/org/apache/commons/scxml2/env/URLResolver.java
src/main/java/org/apache/commons/scxml2/env/groovy/GroovyContextBinding.java
src/main/java/org/apache/commons/scxml2/env/groovy/GroovyEvaluator.java
src/main/java/org/apache/commons/scxml2/env/groovy/GroovyExtendableScriptCache.java
src/main/java/org/apache/commons/scxml2/env/groovy/GroovySCXMLScript.java
src/main/java/org/apache/commons/scxml2/env/javascript/JSBindings.java
src/main/java/org/apache/commons/scxml2/env/javascript/JSEvaluator.java
src/main/java/org/apache/commons/scxml2/env/javascript/init_global.js
src/main/java/org/apache/commons/scxml2/env/jexl/JexlEvaluator.java
src/main/java/org/apache/commons/scxml2/invoke/InvokerException.java
src/main/java/org/apache/commons/scxml2/invoke/SimpleSCXMLInvoker.java
src/main/java/org/apache/commons/scxml2/io/ContentParser.java
src/main/java/org/apache/commons/scxml2/io/ModelUpdater.java
src/main/java/org/apache/commons/scxml2/io/SCXMLReader.java
src/main/java/org/apache/commons/scxml2/io/SCXMLWriter.java
src/main/java/org/apache/commons/scxml2/model/Action.java
src/main/java/org/apache/commons/scxml2/model/Datamodel.java
src/main/java/org/apache/commons/scxml2/model/DocumentOrder.java
src/main/java/org/apache/commons/scxml2/model/EnterableState.java
src/main/java/org/apache/commons/scxml2/model/Executable.java
src/main/java/org/apache/commons/scxml2/model/Final.java
src/main/java/org/apache/commons/scxml2/model/Foreach.java
src/main/java/org/apache/commons/scxml2/model/If.java
src/main/java/org/apache/commons/scxml2/model/NodeTextValue.java
src/main/java/org/apache/commons/scxml2/model/Param.java
src/main/java/org/apache/commons/scxml2/model/PayloadBuilder.java
src/main/java/org/apache/commons/scxml2/model/PayloadProvider.java [deleted file]
src/main/java/org/apache/commons/scxml2/model/SCXML.java
src/main/java/org/apache/commons/scxml2/model/Send.java
src/main/java/org/apache/commons/scxml2/model/SimpleTransition.java
src/main/java/org/apache/commons/scxml2/model/Transition.java
src/main/java/org/apache/commons/scxml2/model/TransitionType.java
src/main/java/org/apache/commons/scxml2/model/TransitionalState.java
src/main/java/org/apache/commons/scxml2/model/Var.java
src/main/java/org/apache/commons/scxml2/semantics/SCXMLSemanticsImpl.java
src/main/java/org/apache/commons/scxml2/semantics/Step.java
src/main/java/org/apache/commons/scxml2/test/StandaloneUtils.java
src/test/java/org/apache/commons/scxml2/EventDataTest.java
src/test/java/org/apache/commons/scxml2/SCInstanceTest.java
src/test/java/org/apache/commons/scxml2/SCXMLExecutorTest.java
src/test/java/org/apache/commons/scxml2/SCXMLTestHelper.java
src/test/java/org/apache/commons/scxml2/WizardsTest.java
src/test/java/org/apache/commons/scxml2/env/AbstractStateMachineTest.java
src/test/java/org/apache/commons/scxml2/env/StopWatch.java
src/test/java/org/apache/commons/scxml2/env/StopWatchDisplay.java
src/test/java/org/apache/commons/scxml2/env/groovy/GroovyContextTest.java
src/test/java/org/apache/commons/scxml2/env/javascript/JSEvaluatorTest.java
src/test/java/org/apache/commons/scxml2/env/javascript/JSExampleTest.java
src/test/java/org/apache/commons/scxml2/env/jexl/JexlContextTest.java
src/test/java/org/apache/commons/scxml2/env/jexl/JexlEvaluatorTest.java
src/test/java/org/apache/commons/scxml2/invoke/InvokeParamNameTest.java
src/test/java/org/apache/commons/scxml2/io/ContentParserTest.java
src/test/java/org/apache/commons/scxml2/io/SCXMLReaderTest.java
src/test/java/org/apache/commons/scxml2/io/SCXMLRequiredAttributesTest.java
src/test/java/org/apache/commons/scxml2/io/SCXMLWriterTest.java
src/test/java/org/apache/commons/scxml2/issues/Issue112Test.java
src/test/java/org/apache/commons/scxml2/model/ActionsTest.java
src/test/java/org/apache/commons/scxml2/model/CustomActionTest.java
src/test/java/org/apache/commons/scxml2/model/Hello.java
src/test/java/org/apache/commons/scxml2/model/SendTest.java
src/test/java/org/apache/commons/scxml2/semantics/SCXMLSemanticsImplTest.java
src/test/java/org/apache/commons/scxml2/w3c/W3CTests.java

index 6645a8b..cadc1ba 100644 (file)
     <release version="2.0" date="In Git master"
       description="Latest unreleased code">
 
+      <action dev="ate" type="add" issue="SCXML-278">
+        [07-01-2018] Code cleanup and Java8 alignment
+      </action>
+
       <action dev="ate" type="add" issue="SCXML-271">
         [12-11-2017] Support Groovy for running the SCXML IRP tests
       </action>
@@ -60,7 +64,7 @@
       </action>
 
       <action dev="ate" type="add" issue="SCXML-264">
-        [12-10-2017] Support &lt;invoke&gt; with inline (<content> body) SCXML statemachine definition
+        [12-10-2017] Support &lt;invoke&gt; with inline (&lt;content&gt; body) SCXML statemachine definition
       </action>
 
       <action dev="ate" type="fix" issue="SCXML-263">
index 784affa..0024d4c 100644 (file)
@@ -54,7 +54,7 @@ import static org.apache.commons.scxml2.Evaluator.DEFAULT_DATA_MODEL;
  */
 public class EvaluatorFactory {
 
-    private static EvaluatorFactory INSTANCE = new EvaluatorFactory();
+    private static final EvaluatorFactory INSTANCE = new EvaluatorFactory();
 
     private final Map<String, EvaluatorProvider> providers = new ConcurrentHashMap<>();
 
index be14a3d..a68fb55 100644 (file)
@@ -25,7 +25,7 @@ package org.apache.commons.scxml2;
  */
 public class ExternalSCXMLIOProcessor implements SCXMLIOProcessor {
 
-    private SCXMLIOProcessor processor;
+    private final SCXMLIOProcessor processor;
 
     public ExternalSCXMLIOProcessor(final SCXMLIOProcessor processor) {
         this.processor = processor;
index 6db5836..34291ea 100644 (file)
@@ -46,7 +46,7 @@ public final class NotificationRegistry {
      * Constructor.
      */
     public NotificationRegistry() {
-        this.regs = new HashMap<Integer, Set<SCXMLListener>>();
+        this.regs = new HashMap<>();
     }
 
     /**
@@ -57,11 +57,7 @@ public final class NotificationRegistry {
      */
     synchronized void addListener(final Observable source, final SCXMLListener lst) {
         if (source != null && source.getObservableId() != null) {
-            Set<SCXMLListener> entries = regs.get(source.getObservableId());
-            if (entries == null) {
-                entries = new LinkedHashSet<SCXMLListener>();
-                regs.put(source.getObservableId(), entries);
-            }
+            Set<SCXMLListener> entries = regs.computeIfAbsent(source.getObservableId(), k -> new LinkedHashSet<>());
             entries.add(lst);
         }
     }
index c293afa..baa35e3 100644 (file)
@@ -419,7 +419,7 @@ public class SCInstance implements Serializable {
      * @throws IllegalStateException Exception thrown if trying to start the state machine when in a Final state
      */
     public void start() throws IllegalStateException {
-        if (!this.running && running && currentStatus.isFinal()) {
+        if (!this.running &&  currentStatus.isFinal()) {
             throw new IllegalStateException("The state machine is in a Final state and cannot be set running again");
         }
         this.running = true;
index ec4dcea..6f827f1 100644 (file)
@@ -52,7 +52,7 @@ public class SCXMLExecutionContext implements SCXMLIOProcessor {
     /**
      * SCXML Execution Logger for the application.
      */
-    private Log appLog = LogFactory.getLog(SCXMLExecutionContext.class);
+    private static final Log appLog = LogFactory.getLog(SCXMLExecutionContext.class);
 
     /**
      * The action execution context instance, providing restricted access to this execution context
@@ -77,7 +77,7 @@ public class SCXMLExecutionContext implements SCXMLIOProcessor {
     /**
      * The external IOProcessor for Invokers to communicate back on
      */
-    private SCXMLIOProcessor externalIOProcessor;
+    private final SCXMLIOProcessor externalIOProcessor;
 
     /**
      * The event dispatcher to interface with external documents etc.
@@ -92,32 +92,32 @@ public class SCXMLExecutionContext implements SCXMLIOProcessor {
     /**
      * The notification registry.
      */
-    private NotificationRegistry notificationRegistry;
+    private final NotificationRegistry notificationRegistry;
 
     /**
      * The internal event queue
      */
-    private final Queue<TriggerEvent> internalEventQueue = new LinkedList<TriggerEvent>();
+    private final Queue<TriggerEvent> internalEventQueue = new LinkedList<>();
 
     /**
      * The Invoker classes map, keyed by invoke target types (specified using "type" attribute).
      */
-    private final Map<String, Class<? extends Invoker>> invokerClasses = new HashMap<String, Class<? extends Invoker>>();
+    private final Map<String, Class<? extends Invoker>> invokerClasses = new HashMap<>();
 
     /**
      * The map storing the unique invokeId for an Invoke with an active Invoker
      */
-    private final Map<Invoke, String> invokeIds = new HashMap<Invoke, String>();
+    private final Map<Invoke, String> invokeIds = new HashMap<>();
 
     /**
      * The Map of active Invoker, keyed by their unique invokeId.
      */
-    private final Map<String, Invoker> invokers = new HashMap<String, Invoker>();
+    private final Map<String, Invoker> invokers = new HashMap<>();
 
     /**
      * The Map of the current ioProcessors
      */
-    private final Map<String, SCXMLIOProcessor> ioProcessors = new HashMap<String, SCXMLIOProcessor>();
+    private final Map<String, SCXMLIOProcessor> ioProcessors = new HashMap<>();
 
     /**
      * Flag indicating if the SCXML configuration should be checked before execution (default = true)
@@ -211,10 +211,8 @@ public class SCXMLExecutionContext implements SCXMLIOProcessor {
     }
     /**
      * (re)start the state machine.
-     *
-     * @throws ModelException if the state machine instance failed to initialize.
      */
-    public void start() throws ModelException {
+    public void start() {
         if (scInstance.isRunning()) {
             throw new IllegalStateException("The state machine has already started.");
         } else if (scInstance.getGlobalContext() == null) {
@@ -268,15 +266,6 @@ public class SCXMLExecutionContext implements SCXMLIOProcessor {
     }
 
     /**
-     * The SCXML specification section "C.1.1 _ioprocessors Value" states that the SCXMLEventProcessor <em>must</em>
-     * maintain a 'location' field inside its entry in the _ioprocessors environment variable.
-     * @return the 'location' of the SCXMLEventProcessor
-     */
-    public String getLocation() {
-        return null;
-    }
-
-    /**
      * @return Returns the SCInstance
      */
     public SCInstance getScInstance() {
@@ -419,7 +408,7 @@ public class SCXMLExecutionContext implements SCXMLIOProcessor {
      * @param uri
      * @return
      */
-    private final String stripTrailingSlash(final String uri) {
+    private String stripTrailingSlash(final String uri) {
         return uri.endsWith("/") ? uri.substring(0, uri.length()-1) : uri;
     }
 
@@ -458,10 +447,8 @@ public class SCXMLExecutionContext implements SCXMLIOProcessor {
         }
         try {
             return invokerClass.newInstance();
-        } catch (InstantiationException ie) {
+        } catch (InstantiationException | IllegalAccessException ie) {
             throw new InvokerException(ie.getMessage(), ie.getCause());
-        } catch (IllegalAccessException iae) {
-            throw new InvokerException(iae.getMessage(), iae.getCause());
         }
     }
 
index 3be0c7f..5e6ad90 100644 (file)
@@ -51,7 +51,7 @@ public class SCXMLExecutor implements SCXMLIOProcessor {
     /**
      * The Logger for the SCXMLExecutor.
      */
-    private Log log = LogFactory.getLog(SCXMLExecutor.class);
+    private static final Log log = LogFactory.getLog(SCXMLExecutor.class);
 
     /**
      * Parent SCXMLIOProcessor
@@ -61,17 +61,17 @@ public class SCXMLExecutor implements SCXMLIOProcessor {
     /**
      *  Interpretation semantics.
      */
-    private SCXMLSemantics semantics;
+    private final SCXMLSemantics semantics;
 
     /**
      * The state machine execution context
      */
-    private SCXMLExecutionContext exctx;
+    private final SCXMLExecutionContext exctx;
 
     /**
      * The external event queue
      */
-    private final Queue<TriggerEvent> externalEventQueue = new ConcurrentLinkedQueue<TriggerEvent>();
+    private final Queue<TriggerEvent> externalEventQueue = new ConcurrentLinkedQueue<>();
 
     /**
      * Convenience constructor.
@@ -468,7 +468,7 @@ public class SCXMLExecutor implements SCXMLIOProcessor {
                 while (exctx.isRunning()) {
                     triggerEvents();
                 }
-            } catch (ModelException e) {
+            } catch (ModelException ignored) {
             }
         });
         t.start();
index 8e3ace2..b05b54b 100644 (file)
@@ -32,7 +32,6 @@ public class SCXMLExpressionException extends Exception {
      * @see java.lang.Exception#Exception()
      */
     public SCXMLExpressionException() {
-        super();
     }
 
     /**
index 9daca8c..15c254d 100644 (file)
@@ -25,7 +25,7 @@ import org.apache.commons.scxml2.model.SCXML;
 
 /**
  * <p>The purpose of this interface is to separate the the
- * <a href="http://www.w3.org/TR/2014/CR-scxml-20140313/#AlgorithmforSCXMLInterpretation">
+ * <a href="https://www.w3.org/TR/2015/REC-scxml-20150901/#AlgorithmforSCXMLInterpretation">
  *     W3C SCXML Algorithm for SCXML Interpretation</a>
  * from the <code>SCXMLExecutor</code> and therefore make it pluggable.</p>
  * <p>
@@ -180,5 +180,5 @@ public interface SCXMLSemantics {
      * @param errRep ErrorReporter to report detailed error info if needed
      * @return true if a given state configuration is legal, false otherwise
      */
-    public boolean isLegalConfiguration(final Set<EnterableState> states, final ErrorReporter errRep);
+    boolean isLegalConfiguration(final Set<EnterableState> states, final ErrorReporter errRep);
 }
index acbcc8e..e865d9f 100644 (file)
@@ -59,9 +59,8 @@ public class SCXMLSystemContext implements Context, Serializable {
     /**
      * The set of protected system variables names
      */
-    private static final Set<String> PROTECTED_NAMES = new HashSet<String>(Arrays.asList(
-            new String[] {EVENT_KEY, SESSIONID_KEY, SCXML_NAME_KEY, IOPROCESSORS_KEY, X_KEY}
-    ));
+    private static final Set<String> PROTECTED_NAMES = new HashSet<>(Arrays.asList(
+            EVENT_KEY, SESSIONID_KEY, SCXML_NAME_KEY, IOPROCESSORS_KEY, X_KEY));
 
     /**
      * The wrapped system context
index 1a7ce23..f8f1322 100644 (file)
@@ -35,13 +35,13 @@ public class StateConfiguration implements Serializable {
     /**
      * The states that are currently active.
      */
-    private final Set<EnterableState> activeStates = new HashSet<EnterableState>();
+    private final Set<EnterableState> activeStates = new HashSet<>();
     private final Set<EnterableState> activeStatesSet = Collections.unmodifiableSet(activeStates);
 
     /**
      * The atomic states that are currently active.
      */
-    private final Set<EnterableState> atomicStates = new HashSet<EnterableState>();
+    private final Set<EnterableState> atomicStates = new HashSet<>();
     private final Set<EnterableState> atomicStatesSet = Collections.unmodifiableSet(atomicStates);
 
     /**
index abd96a4..44239c7 100644 (file)
@@ -22,8 +22,11 @@ import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.UUID;
 
+import org.apache.commons.scxml2.Context;
 import org.apache.commons.scxml2.Evaluator;
+import org.apache.commons.scxml2.SCXMLExpressionException;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
@@ -32,6 +35,29 @@ import org.w3c.dom.NodeList;
  */
 public abstract class AbstractBaseEvaluator implements Evaluator, Serializable {
 
+    /**
+     * Unique context variable name used for temporary reference to assign data (thus must be a valid variable name)
+     */
+    private static final String ASSIGN_VARIABLE_NAME = "a"+ UUID.randomUUID().toString().replace('-','x');
+
+    /**
+     * @see Evaluator#evalAssign(Context, String, Object)
+     */
+    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);
+            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);
+        }
+    }
+
     @Override
     public Object cloneData(final Object data) {
         if (data != null) {
@@ -68,7 +94,7 @@ public abstract class AbstractBaseEvaluator implements Evaluator, Serializable {
                 return cloneUnknownDataType(data);
             }
         }
-        return data;
+        return null;
     }
 
     /**
index d72ec77..eae5822 100644 (file)
@@ -124,12 +124,8 @@ public abstract class AbstractStateMachine {
         log = LogFactory.getLog(this.getClass());
         try {
             stateMachine = SCXMLReader.read(scxmlDocument);
-        } catch (IOException ioe) {
+        } catch (IOException | XMLStreamException | ModelException ioe) {
             logError(ioe);
-        } catch (XMLStreamException xse) {
-            logError(xse);
-        } catch (ModelException me) {
-            logError(me);
         }
         initialize(stateMachine, rootCtx, evaluator);
     }
@@ -246,21 +242,10 @@ public abstract class AbstractStateMachine {
         try {
             Method method = clas.getDeclaredMethod(methodName, SIGNATURE);
             method.invoke(this, PARAMETERS);
-        } catch (SecurityException se) {
+        } catch (SecurityException | NoSuchMethodException | IllegalAccessException | IllegalArgumentException |
+                InvocationTargetException se) {
             logError(se);
             return false;
-        } catch (NoSuchMethodException nsme) {
-            logError(nsme);
-            return false;
-        } catch (IllegalArgumentException iae) {
-            logError(iae);
-            return false;
-        } catch (IllegalAccessException iae) {
-            logError(iae);
-            return false;
-        } catch (InvocationTargetException ite) {
-            logError(ite);
-            return false;
         }
         return true;
     }
index bf27a43..0faf929 100644 (file)
@@ -36,13 +36,11 @@ public final class LogUtils {
      */
     public static String transToString(final TransitionTarget from,
             final TransitionTarget to, final Transition transition, String event) {
-        StringBuffer buf = new StringBuffer("(");
-        buf.append("event = ").append(event);
-        buf.append(", cond = ").append(transition.getCond());
-        buf.append(", from = ").append(getTTPath(from));
-        buf.append(", to = ").append(getTTPath(to));
-        buf.append(')');
-        return buf.toString();
+        return "(" + "event = " + event +
+                ", cond = " + transition.getCond() +
+                ", from = " + getTTPath(from) +
+                ", to = " + getTTPath(to) +
+                ')';
     }
 
     /**
index 50b650a..7d155d1 100644 (file)
@@ -34,10 +34,9 @@ public class SimpleContext implements Context, Serializable {
     /** Serial version UID. */
     private static final long serialVersionUID = 1L;
     /** Implementation independent log category. */
-    private static final Log DEFAULT_LOG = LogFactory.getLog(Context.class);
-    private Log log = DEFAULT_LOG;
+    private static final Log log = LogFactory.getLog(Context.class);
     /** The parent Context to this Context. */
-    private Context parent;
+    private final Context parent;
     /** The Map of variables and their values in this Context. */
     private Map<String, Object> vars;
 
@@ -71,7 +70,7 @@ public class SimpleContext implements Context, Serializable {
         this.systemContext = parent instanceof SCXMLSystemContext ?
                 (SCXMLSystemContext) parent : parent != null ? parent.getSystemContext() : null;
         if (initialVars == null) {
-            setVars(new HashMap<String, Object>());
+            setVars(new HashMap<>());
         } else {
             setVars(this.vars = initialVars);
         }
@@ -199,15 +198,6 @@ public class SimpleContext implements Context, Serializable {
     }
 
     /**
-     * Set the log used by this <code>Context</code> instance.
-     *
-     * @param log The new log.
-     */
-    protected void setLog(final Log log) {
-        this.log = log;
-    }
-
-    /**
      * Get the log used by this <code>Context</code> instance.
      *
      * @return Log The log being used.
@@ -215,6 +205,5 @@ public class SimpleContext implements Context, Serializable {
     protected Log getLog() {
         return log;
     }
-
 }
 
index 60ae51f..eec3f17 100644 (file)
@@ -58,17 +58,17 @@ public class SimpleDispatcher implements EventDispatcher, Serializable {
         /**
          * The ID of the &lt;send&gt; element.
          */
-        private String id;
+        private final String id;
 
         /**
          * The event
          */
-        private TriggerEvent event;
+        private final TriggerEvent event;
 
         /**
          * The target io processor
          */
-        private SCXMLIOProcessor target;
+        private final SCXMLIOProcessor target;
 
         /**
          * Constructor for events with payload.
@@ -99,13 +99,13 @@ public class SimpleDispatcher implements EventDispatcher, Serializable {
     }
 
     /** Implementation independent log category. */
-     private Log log = LogFactory.getLog(EventDispatcher.class);
+     private static final Log log = LogFactory.getLog(EventDispatcher.class);
 
     /**
      * The <code>Map</code> of active <code>Timer</code>s, keyed by
      * &lt;send&gt; element <code>id</code>s.
      */
-    private Map<String, Timer> timers = Collections.synchronizedMap(new HashMap<String, Timer>());
+    private final Map<String, Timer> timers = Collections.synchronizedMap(new HashMap<String, Timer>());
 
     /**
      * Get the log instance.
@@ -117,15 +117,6 @@ public class SimpleDispatcher implements EventDispatcher, Serializable {
     }
 
     /**
-     * Sets the log instance
-     *
-     * @param log the new log instance
-     */
-    protected void setLog(Log log) {
-        this.log = log;
-    }
-
-    /**
      * Get the current timers.
      *
      * @return The currently scheduled timers
@@ -167,16 +158,16 @@ public class SimpleDispatcher implements EventDispatcher, Serializable {
     public void send(final Map<String, SCXMLIOProcessor> ioProcessors, final String id, final String target,
             final String type, final String event, final Object data, final Object hints, final long delay) {
         if (log.isInfoEnabled()) {
-            StringBuilder buf = new StringBuilder();
-            buf.append("send ( id: ").append(id);
-            buf.append(", target: ").append(target);
-            buf.append(", type: ").append(type);
-            buf.append(", event: ").append(event);
-            buf.append(", data: ").append(String.valueOf(data));
-            buf.append(", hints: ").append(String.valueOf(hints));
-            buf.append(", delay: ").append(delay);
-            buf.append(')');
-            log.info(buf.toString());
+            final String buf =
+                    "send ( id: " + id +
+                    ", target: " + target +
+                    ", type: " + type +
+                    ", event: " + event +
+                    ", data: " + String.valueOf(data) +
+                    ", hints: " + String.valueOf(hints) +
+                    ", delay: " + delay +
+                    ')';
+            log.info(buf);
         }
 
         // We only handle the "scxml" type (which is the default too) and optionally the #_internal target
index 59fa254..90ff955 100644 (file)
@@ -37,7 +37,7 @@ public class SimpleErrorHandler implements ErrorHandler, Serializable {
     private static final String MSG_POSTFIX = " Correct the SCXML document.";
 
     /** Log. */
-    private Log log = LogFactory.getLog(getClass());
+    private static final Log log = LogFactory.getLog(SimpleErrorHandler.class);
 
     /**
      * Constructor.
index aa39d47..f51a279 100644 (file)
@@ -40,7 +40,7 @@ public class SimpleErrorReporter implements ErrorReporter, Serializable {
     /** Serial version UID. */
     private static final long serialVersionUID = 1L;
     /** Log. */
-    private Log log = LogFactory.getLog(getClass());
+    private static final Log log = LogFactory.getLog(SimpleErrorReporter.class);
 
     /**
      * Constructor.
@@ -68,11 +68,11 @@ public class SimpleErrorReporter implements ErrorReporter, Serializable {
             } else if (errCtx instanceof State) {
                 //determineInitialStates
                 //determineTargetStates
-                msg.append("State " + LogUtils.getTTPath((State) errCtx));
+                msg.append("State ").append(LogUtils.getTTPath((State) errCtx));
             }
         } else if (errCode == ErrorConstants.UNKNOWN_ACTION) {
             //executeActionList
-            msg.append("Action: " + errCtx.getClass().getName());
+            msg.append("Action: ").append(errCtx.getClass().getName());
         } else if (errCode == ErrorConstants.ILLEGAL_CONFIG) {
             //isLegalConfig
             if (errCtx instanceof Map.Entry) { //unchecked cast below
@@ -80,7 +80,7 @@ public class SimpleErrorReporter implements ErrorReporter, Serializable {
                     (Map.Entry<EnterableState, Set<EnterableState>>) errCtx;
                 EnterableState es = badConfigMap.getKey();
                 Set<EnterableState> vals = badConfigMap.getValue();
-                msg.append(LogUtils.getTTPath(es) + " : [");
+                msg.append(LogUtils.getTTPath(es)).append(" : [");
                 for (Iterator<EnterableState> i = vals.iterator(); i.hasNext();) {
                     EnterableState ex = i.next();
                     msg.append(LogUtils.getTTPath(ex));
@@ -104,11 +104,11 @@ public class SimpleErrorReporter implements ErrorReporter, Serializable {
         } else if (errCode == ErrorConstants.EXPRESSION_ERROR) {
             if (errCtx instanceof Executable) {
                 TransitionTarget parent = ((Executable) errCtx).getParent();
-                msg.append("Expression error inside " + LogUtils.getTTPath(parent));
+                msg.append("Expression error inside ").append(LogUtils.getTTPath(parent));
             }
             else if (errCtx instanceof Data) {
                 // Data expression error
-                msg.append("Expression error for data element with id "+((Data)errCtx).getId());
+                msg.append("Expression error for data element with id ").append(((Data) errCtx).getId());
             }
             else if (errCtx instanceof SCXML) {
                 // Global Script
index 451bfab..4ad7730 100644 (file)
@@ -34,7 +34,7 @@ public class SimpleSCXMLListener implements SCXMLListener, Serializable {
     /** Serial version UID. */
     private static final long serialVersionUID = 1L;
     /** Log. */
-    private Log log = LogFactory.getLog(getClass());
+    private static final Log log = LogFactory.getLog(SimpleSCXMLListener.class);
 
 
     /**
index e12ad02..e293c00 100644 (file)
@@ -37,7 +37,7 @@ public class SimpleXMLReporter implements XMLReporter, Serializable {
     private static final long serialVersionUID = 1L;
 
     /** Log. */
-    private Log log = LogFactory.getLog(getClass());
+    private static final Log log = LogFactory.getLog(SimpleXMLReporter.class);
 
     /**
      * Constructor.
index 631550b..d8955f1 100644 (file)
@@ -41,13 +41,13 @@ public class Tracer implements ErrorHandler, ErrorReporter,
     /** Serial version UID. */
     private static final long serialVersionUID = 1L;
     /** ErrorHandler delegate. */
-    private ErrorHandler errHandler;
+    private final ErrorHandler errHandler;
     /** ErrorReporter delegate. */
-    private ErrorReporter errReporter;
+    private final ErrorReporter errReporter;
     /** SCXMLListener delegate. */
-    private SCXMLListener scxmlListener;
+    private final SCXMLListener scxmlListener;
     /** XMLReporter delegate. */
-    private XMLReporter xmlReporter;
+    private final XMLReporter xmlReporter;
 
     /**
      * Constructor.
index ba7dc47..6e2447b 100644 (file)
@@ -35,7 +35,7 @@ public class URLResolver implements PathResolver, Serializable {
     private static final long serialVersionUID = 1L;
 
     /** Implementation independent log category. */
-    private Log log = LogFactory.getLog(PathResolver.class);
+    private static final Log log = LogFactory.getLog(PathResolver.class);
 
     /** The base URL to resolve against. */
     private URL baseURL = null;
index d3ea5db..e1bf007 100644 (file)
@@ -68,7 +68,7 @@ public class GroovyContextBinding extends Binding implements Serializable {
 
     @Override
     public Map<String, Object> getVariables() {
-        return new LinkedHashMap<String, Object>(context.getVars());
+        return new LinkedHashMap<>(context.getVars());
     }
 
     @Override
index 111ce0c..e26aaaf 100644 (file)
@@ -21,7 +21,6 @@ import groovy.lang.Script;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.UUID;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -45,11 +44,6 @@ public class GroovyEvaluator extends AbstractBaseEvaluator {
     /** Serial version UID. */
     private static final long serialVersionUID = 1L;
 
-    /**
-     * Unique context variable name used for temporary reference to assign data (thus must be a valid variable name)
-     */
-    private static final String ASSIGN_VARIABLE_NAME = "a"+UUID.randomUUID().toString().replace('-','x');
-
     public static final String SUPPORTED_DATA_MODEL = "groovy";
 
     public static class GroovyEvaluatorProvider implements EvaluatorProvider {
@@ -241,25 +235,6 @@ public class GroovyEvaluator extends AbstractBaseEvaluator {
     }
 
     /**
-     * @see Evaluator#evalAssign(Context, String, Object)
-     */
-    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);
-        }
-    }
-
-    /**
      * @see Evaluator#evalScript(Context, String)
      */
     @Override
index e9424e0..2c8764d 100644 (file)
@@ -96,18 +96,12 @@ public class GroovyExtendableScriptCache implements Serializable {
     public static final String DEFAULT_SCRIPT_CODE_BASE = "/groovy/scxml/script";
 
     /** Default factory for the Groovy parent ClassLoader, returning this class its ClassLoader */
-    public static final ParentClassLoaderFactory DEFAULT_PARENT_CLASS_LOADER_FACTORY = new ParentClassLoaderFactory() {
-        public ClassLoader getClassLoader() {
-            return GroovyExtendableScriptCache.class.getClassLoader();
-        }
-    };
+    public static final ParentClassLoaderFactory DEFAULT_PARENT_CLASS_LOADER_FACTORY =
+            (ParentClassLoaderFactory) GroovyExtendableScriptCache.class::getClassLoader;
 
     /** Default factory for the Groovy CompilerConfiguration, returning a new and unmodified CompilerConfiguration instance */
-    public static final CompilerConfigurationFactory DEFAULT_COMPILER_CONFIGURATION_FACTORY = new CompilerConfigurationFactory() {
-        public CompilerConfiguration getCompilerConfiguration() {
-            return new CompilerConfiguration();
-        }
-    };
+    public static final CompilerConfigurationFactory DEFAULT_COMPILER_CONFIGURATION_FACTORY =
+            (CompilerConfigurationFactory) CompilerConfiguration::new;
 
     protected static class ScriptCacheElement implements Serializable {
         private static final long serialVersionUID = 1L;
@@ -170,7 +164,7 @@ public class GroovyExtendableScriptCache implements Serializable {
         }
     }
 
-    private final LinkedHashMap<ScriptCacheElement, ScriptCacheElement> scriptCache = new LinkedHashMap<ScriptCacheElement, ScriptCacheElement>();
+    private final LinkedHashMap<ScriptCacheElement, ScriptCacheElement> scriptCache = new LinkedHashMap<>();
 
     private String scriptCodeBase = DEFAULT_SCRIPT_CODE_BASE;
     private String scriptBaseClass;
@@ -239,11 +233,8 @@ public class GroovyExtendableScriptCache implements Serializable {
                 compilerConfiguration.setScriptBaseClass(getScriptBaseClass());
             }
 
-            groovyClassLoader = AccessController.doPrivileged(new PrivilegedAction<GroovyClassLoader>() {
-                public GroovyClassLoader run() {
-                    return new GroovyClassLoader(getParentClassLoaderFactory().getClassLoader(), compilerConfiguration);
-                }
-            });
+            groovyClassLoader = AccessController.doPrivileged((PrivilegedAction<GroovyClassLoader>)
+                    () -> new GroovyClassLoader(getParentClassLoaderFactory().getClassLoader(), compilerConfiguration));
             if (!scriptCache.isEmpty()) {
                 // de-serialized: need to re-generate all previously compiled scripts (this can cause a hick-up...):
                 for (ScriptCacheElement element : scriptCache.keySet()) {
@@ -257,11 +248,8 @@ public class GroovyExtendableScriptCache implements Serializable {
     protected Class<Script> compileScript(final String scriptBaseClass, String scriptSource, final String scriptName) {
         final String script = preProcessScript(scriptSource);
 
-        GroovyCodeSource codeSource = AccessController.doPrivileged(new PrivilegedAction<GroovyCodeSource>() {
-            public GroovyCodeSource run() {
-                return new GroovyCodeSource(script, scriptName, getScriptCodeBase());
-            }
-        });
+        GroovyCodeSource codeSource = AccessController.doPrivileged((PrivilegedAction<GroovyCodeSource>)
+                () -> new GroovyCodeSource(script, scriptName, getScriptCodeBase()));
 
         String currentScriptBaseClass = compilerConfiguration.getScriptBaseClass();
         try {
index 5980211..cdd1dcb 100644 (file)
@@ -32,8 +32,7 @@ import org.apache.commons.scxml2.Builtin;
  */
 public abstract class GroovySCXMLScript extends Script {
 
-    GroovyContext context;
-    GroovyContextBinding binding;
+    private GroovyContext context;
 
     protected GroovySCXMLScript() {
         super(null);
@@ -42,8 +41,7 @@ public abstract class GroovySCXMLScript extends Script {
     @Override
     public void setBinding(final Binding binding) {
         super.setBinding(binding);
-        this.binding = (GroovyContextBinding)binding;
-        this.context = this.binding.getContext();
+        this.context = ((GroovyContextBinding) binding).getContext();
     }
 
     /**
index dc9ab7c..0132142 100644 (file)
@@ -147,8 +147,8 @@ public class JSBindings implements Bindings {
      * @param toMerge the map of variables to merge
      */
     @Override
-    public void putAll(Map<? extends String, ? extends Object> toMerge) {
-        for (Map.Entry<? extends String, ? extends Object> entry : toMerge.entrySet()) {
+    public void putAll(Map<? extends String, ?> toMerge) {
+        for (Map.Entry<? extends String, ?> entry : toMerge.entrySet()) {
             put(entry.getKey(), entry.getValue());
         }
     }
index 91ec4a8..1ec2d58 100644 (file)
@@ -19,7 +19,6 @@ package org.apache.commons.scxml2.env.javascript;
 
 import java.io.IOException;
 import java.util.List;
-import java.util.UUID;
 
 import javax.script.Bindings;
 import javax.script.ScriptContext;
@@ -55,11 +54,6 @@ import org.apache.commons.scxml2.model.SCXML;
  */
 public class JSEvaluator extends AbstractBaseEvaluator {
 
-    /**
-     * Unique context variable name used for temporary reference to assign data (thus must be a valid variable name)
-     */
-    private static final String ASSIGN_VARIABLE_NAME = "a"+UUID.randomUUID().toString().replace('-','x');
-
     public static final String SUPPORTED_DATA_MODEL = Evaluator.ECMASCRIPT_DATA_MODEL;
 
     public static class JSEvaluatorProvider implements EvaluatorProvider {
@@ -265,24 +259,6 @@ public class JSEvaluator extends AbstractBaseEvaluator {
     }
 
     /**
-     * @see Evaluator#evalAssign(Context, String, Object)
-     */
-    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);
-            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);
-        }
-    }
-
-    /**
      * Executes the Javascript script using the <code>eval()</code> method
      *
      * @param ctx    SCXML context.
index fccb6cb..cbaa1f0 100644 (file)
@@ -105,7 +105,7 @@ Object.defineProperties(this, {
         },
         writable : false,
         configurable : false,
-        enumeratable : false,
+        enumeratable : false
     },
     "_event":
     {
index 5ff6440..ea7f5a8 100644 (file)
@@ -18,7 +18,6 @@ package org.apache.commons.scxml2.env.jexl;
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.UUID;
 
 import org.apache.commons.jexl3.JexlBuilder;
 import org.apache.commons.jexl3.JexlExpression;
@@ -45,11 +44,6 @@ public class JexlEvaluator extends AbstractBaseEvaluator {
     /** Serial version UID. */
     private static final long serialVersionUID = 1L;
 
-    /**
-     * Unique context variable name used for temporary reference to assign data (thus must be a valid variable name)
-     */
-    private static final String ASSIGN_VARIABLE_NAME = "a"+UUID.randomUUID().toString().replace('-','x');
-
     public static final String SUPPORTED_DATA_MODEL = "jexl";
 
     public static class JexlEvaluatorProvider implements EvaluatorProvider {
@@ -90,7 +84,7 @@ public class JexlEvaluator extends AbstractBaseEvaluator {
     private transient volatile JexlEngine jexlEngine;
 
     /** The current JexlEngine silent mode, stored locally to be reapplied after deserialization of the engine */
-    private boolean jexlEngineSilent;
+    private final boolean jexlEngineSilent;
     /** The current JexlEngine strict mode, stored locally to be reapplied after deserialization of the engine */
     private boolean jexlEngineStrict;
 
@@ -100,7 +94,6 @@ public class JexlEvaluator extends AbstractBaseEvaluator {
     }
 
     public JexlEvaluator(final boolean strict) {
-        super();
         jexlEngineStrict = strict;
         // create the internal JexlEngine initially
         jexlEngine = getJexlEngine();
@@ -181,25 +174,6 @@ public class JexlEvaluator extends AbstractBaseEvaluator {
     }
 
     /**
-     * @see Evaluator#evalAssign(Context, String, Object)
-     */
-    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);
-            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);
-        }
-    }
-
-    /**
      * @see Evaluator#evalScript(Context, String)
      */
     public Object evalScript(final Context ctx, final String script)
index bb25161..937e67f 100644 (file)
@@ -29,13 +29,6 @@ public class InvokerException extends Exception {
     private static final long serialVersionUID = 1L;
 
     /**
-     * @see java.lang.Exception#Exception()
-     */
-    public InvokerException() {
-        super();
-    }
-
-    /**
      * @see java.lang.Exception#Exception(java.lang.String)
      * @param message The error message
      */
index 9277e0a..5cdcb63 100644 (file)
@@ -94,12 +94,8 @@ public class SimpleSCXMLInvoker implements Invoker, Serializable {
         SCXML scxml;
         try {
             scxml = SCXMLReader.read(new URL(url));
-        } catch (ModelException me) {
+        } catch (ModelException | IOException | XMLStreamException me) {
             throw new InvokerException(me.getMessage(), me.getCause());
-        } catch (IOException ioe) {
-            throw new InvokerException(ioe.getMessage(), ioe.getCause());
-        } catch (XMLStreamException xse) {
-            throw new InvokerException(xse.getMessage(), xse.getCause());
         }
         execute(scxml, params);
     }
@@ -113,12 +109,8 @@ public class SimpleSCXMLInvoker implements Invoker, Serializable {
         SCXML scxml;
         try {
             scxml = SCXMLReader.read(new StringReader(content));
-        } catch (ModelException me) {
+        } catch (ModelException | IOException | XMLStreamException me) {
             throw new InvokerException(me.getMessage(), me.getCause());
-        } catch (IOException ioe) {
-            throw new InvokerException(ioe.getMessage(), ioe.getCause());
-        } catch (XMLStreamException xse) {
-            throw new InvokerException(xse.getMessage(), xse.getCause());
         }
         execute(scxml, params);
     }
index a4b07ad..800d082 100644 (file)
@@ -53,7 +53,7 @@ public class ContentParser {
     /**
      * Jackson JSON ObjectMapper
      */
-    private ObjectMapper jsonObjectMapper;
+    private final ObjectMapper jsonObjectMapper;
 
     /**
      * Default constructor initializing a Jackson ObjectMapper allowing embedded comments, including YAML style
@@ -183,12 +183,10 @@ public class ContentParser {
      * @throws IOException
      */
     public Node parseXml(final String xmlString) throws IOException {
-        Document doc = null;
+        Document doc;
         try {
             doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(xmlString);
-        } catch (SAXException e) {
-            throw new IOException(e);
-        } catch (ParserConfigurationException e) {
+        } catch (SAXException | ParserConfigurationException e) {
             throw new IOException(e);
         }
         return doc != null ? doc.getDocumentElement() : null;
index 770cdaf..fc9a451 100644 (file)
@@ -158,13 +158,7 @@ final class ModelUpdater {
 
         scxml.setInitialTransition(initialTransition);
         Map<String, TransitionTarget> targets = scxml.getTargets();
-        for (EnterableState es : scxml.getChildren()) {
-            if (es instanceof State) {
-                updateState((State) es, targets);
-            } else if (es instanceof Parallel) {
-                updateParallel((Parallel) es, targets);
-            }
-        }
+        updateEnterableStates(scxml.getChildren(), targets);
 
         scxml.getInitialTransition().setObservableId(1);
         initObservables(scxml.getChildren(), 2);
@@ -281,13 +275,7 @@ final class ModelUpdater {
             }
         }
 
-        for (EnterableState es : children) {
-            if (es instanceof State) {
-                updateState((State) es, targets);
-            } else if (es instanceof Parallel) {
-                updateParallel((Parallel) es, targets);
-            }
-        }
+        updateEnterableStates(children, targets);
     }
 
     /**
@@ -299,13 +287,7 @@ final class ModelUpdater {
      */
     private static void updateParallel(final Parallel parallel, final Map<String, TransitionTarget> targets)
             throws ModelException {
-        for (EnterableState es : parallel.getChildren()) {
-            if (es instanceof State) {
-                updateState((State) es, targets);
-            } else if (es instanceof Parallel) {
-                updateParallel((Parallel) es, targets);
-            }
-        }
+        updateEnterableStates(parallel.getChildren(), targets);
         for (Transition transition : parallel.getTransitionsList()) {
             updateTransition(transition, targets);
         }
@@ -317,6 +299,25 @@ final class ModelUpdater {
     }
 
     /**
+     * Update the EnterableState objects (part of post-read processing).
+     *
+     * @param states The EnterableState objects
+     * @param targets The global Map of all transition targets
+     * @throws ModelException If the object model is flawed
+     */
+    private static void updateEnterableStates(final List<EnterableState> states,
+                                              final Map<String, TransitionTarget> targets)
+        throws ModelException {
+        for (EnterableState es : states) {
+            if (es instanceof State) {
+                updateState((State) es, targets);
+            } else if (es instanceof Parallel) {
+                updateParallel((Parallel) es, targets);
+            }
+        }
+    }
+
+    /**
      * Update this History object (part of post-read processing).
      *
      * @param history The History object
index 4b3c8dd..8402725 100644 (file)
@@ -855,13 +855,12 @@ public final class SCXMLReader {
      * @param configuration The {@link Configuration} to use while parsing.
      * @param parent The parent {@link State} for this final (null for top level state).
      *
-     * @throws IOException An IO error during parsing.
      * @throws XMLStreamException An exception processing the underlying {@link XMLStreamReader}.
      * @throws ModelException The Commons SCXML object model is incomplete or inconsistent (includes
      *                        errors in the SCXML document that may not be identified by the schema).
      */
     private static void readDoneData(final XMLStreamReader reader, final Configuration configuration, final Final parent)
-            throws XMLStreamException, ModelException, IOException {
+            throws XMLStreamException, ModelException {
 
         DoneData doneData = new DoneData();
         parent.setDoneData(doneData);
@@ -911,14 +910,11 @@ public final class SCXMLReader {
      * @param src The "src" attribute value.
      * @param ts The parent {@link TransitionalState} that specifies this "src" attribute.
      *
-     * @throws IOException An IO error during parsing.
-     * @throws ModelException The Commons SCXML object model is incomplete or inconsistent (includes
-     *                        errors in the SCXML document that may not be identified by the schema).
      * @throws XMLStreamException An exception processing the underlying {@link XMLStreamReader}.
      */
     private static void readTransitionalStateSrc(final Configuration configuration, final String src,
                                                  final TransitionalState ts)
-            throws IOException, ModelException, XMLStreamException {
+            throws ModelException {
 
         // Check for URI fragment
         String[] fragments = src.split("#", 2);
@@ -1546,7 +1542,7 @@ public final class SCXMLReader {
             throws XMLStreamException, ModelException {
 
         if (executable instanceof Finalize) {
-            // http://www.w3.org/TR/2013/WD-scxml-20130801/#finalize
+            // https://www.w3.org/TR/2015/REC-scxml-20150901/#finalize
             // [...] the executable content inside <finalize> MUST NOT raise events or invoke external actions.
             // In particular, the <send> and <raise> elements MUST NOT occur.
             reportIgnoredElement(reader, configuration, SCXMLConstants.ELEM_FINALIZE, SCXMLConstants.XMLNS_SCXML, SCXMLConstants.ELEM_RAISE);
@@ -1751,7 +1747,7 @@ public final class SCXMLReader {
             throws XMLStreamException, ModelException {
 
         if (executable instanceof Finalize) {
-            // http://www.w3.org/TR/2013/WD-scxml-20130801/#finalize
+            // https://www.w3.org/TR/2015/REC-scxml-20150901/#finalize
             // [...] the executable content inside <finalize> MUST NOT raise events or invoke external actions.
             // In particular, the <send> and <raise> elements MUST NOT occur.
             reportIgnoredElement(reader, configuration, SCXMLConstants.ELEM_FINALIZE, SCXMLConstants.XMLNS_SCXML, SCXMLConstants.ELEM_SEND);
@@ -1913,8 +1909,8 @@ public final class SCXMLReader {
 
     /**
      * Read the contents of the initial &lt;script&gt; element.
-     * @see <a href="http://www.w3.org/TR/2013/WD-scxml-20130801/#scxml">
-     *     http://www.w3.org/TR/2013/WD-scxml-20130801/#scxml<a> section 3.2.2
+     * @see <a href="https://www.w3.org/TR/2015/REC-scxml-20150901/#scxml">
+     *     https://www.w3.org/TR/2015/REC-scxml-20150901/#scxml<a> section 3.2.2
      *
      * @param reader The {@link XMLStreamReader} providing the SCXML document to parse.
      * @param configuration The {@link Configuration} to use while parsing.
@@ -2016,10 +2012,12 @@ public final class SCXMLReader {
             actionWrapper.getNamespaces().putAll(namespaces);
         }
 
+        Map<String, String> attributes = new HashMap<>();
         for (int i = 0; i < reader.getAttributeCount(); i++) {
             String name = reader.getAttributeLocalName(i);
             String qname = createQualifiedName(reader.getAttributePrefix(i), name);
             String value = reader.getAttributeValue(i);
+            attributes.put(qname, value);
             String setter = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
             Method method;
             try {
@@ -2036,6 +2034,9 @@ public final class SCXMLReader {
                         + className, iae);
             }
         }
+        if (!attributes.isEmpty()) {
+            actionWrapper.setAttributes(attributes);
+        }
 
         // Add any body content if necessary
         if (action instanceof ParsedValueContainer) {
@@ -2721,7 +2722,7 @@ public final class SCXMLReader {
          */
         boolean strict;
 
-        ContentParser contentParser;
+        final ContentParser contentParser;
 
         /*
          * Public constructors
@@ -2881,7 +2882,7 @@ public final class SCXMLReader {
             this.factoryId = factoryId;
             this.factoryClassLoader = factoryClassLoader;
             this.allocator = allocator;
-            this.properties = (properties == null ? new HashMap<String, Object>() : properties);
+            this.properties = (properties == null ? new HashMap<>() : properties);
             this.resolver = resolver;
             this.reporter = reporter;
             this.encoding = encoding;
@@ -2889,7 +2890,7 @@ public final class SCXMLReader {
             this.validate = validate;
             this.pathResolver = pathResolver;
             this.parent = parent;
-            this.customActions = (customActions == null ? new ArrayList<CustomAction>() : customActions);
+            this.customActions = (customActions == null ? new ArrayList<>() : customActions);
             this.customActionClassLoader = customActionClassLoader;
             this.useContextClassLoaderForCustomActions = useContextClassLoaderForCustomActions;
             this.silent = silent;
index d3f7b33..940bf4e 100644 (file)
@@ -55,7 +55,6 @@ import org.apache.commons.scxml2.model.ElseIf;
 import org.apache.commons.scxml2.model.EnterableState;
 import org.apache.commons.scxml2.model.JsonValue;
 import org.apache.commons.scxml2.model.NodeListValue;
-import org.apache.commons.scxml2.model.NodeTextValue;
 import org.apache.commons.scxml2.model.NodeValue;
 import org.apache.commons.scxml2.model.ParsedValue;
 import org.apache.commons.scxml2.model.Raise;
@@ -456,15 +455,7 @@ public class SCXMLWriter {
 
         // Children
         writeDatamodel(writer, scxml.getDatamodel());
-        for (EnterableState es : scxml.getChildren()) {
-            if (es instanceof Final) {
-                writeFinal(writer, (Final) es);
-            } else if (es instanceof State) {
-                writeState(writer, (State) es);
-            } else if (es instanceof Parallel) {
-                writeParallel(writer, (Parallel) es);
-            }
-        }
+        writeEnterableStates(writer, scxml.getChildren());
 
         // End
         writer.writeEndElement();
@@ -539,15 +530,7 @@ public class SCXMLWriter {
             writeInvoke(writer, inv);
         }
 
-        for (EnterableState es : state.getChildren()) {
-            if (es instanceof Final) {
-                writeFinal(writer, (Final) es);
-            } else if (es instanceof State) {
-                writeState(writer, (State) es);
-            } else if (es instanceof Parallel) {
-                writeParallel(writer, (Parallel) es);
-            }
-        }
+        writeEnterableStates(writer, state.getChildren());
 
         for (OnExit onexit : state.getOnExits()) {
             writeOnExit(writer, onexit);
@@ -583,15 +566,7 @@ public class SCXMLWriter {
             writeInvoke(writer, inv);
         }
 
-        for (EnterableState es : parallel.getChildren()) {
-            if (es instanceof Final) {
-                writeFinal(writer, (Final) es);
-            } else if (es instanceof State) {
-                writeState(writer, (State) es);
-            } else if (es instanceof Parallel) {
-                writeParallel(writer, (Parallel) es);
-            }
-        }
+        writeEnterableStates(writer, parallel.getChildren());
 
         for (OnExit onexit : parallel.getOnExits()) {
             writeOnExit(writer, onexit);
@@ -620,13 +595,7 @@ public class SCXMLWriter {
         }
         if (end.getDoneData() != null) {
             writer.writeStartElement(SCXMLConstants.ELEM_DONEDATA);
-            for (Param p : end.getDoneData().getParams()) {
-                writer.writeStartElement(SCXMLConstants.ELEM_PARAM);
-                writeAV(writer, SCXMLConstants.ATTR_NAME, p.getName());
-                writeAV(writer, SCXMLConstants.ATTR_LOCATION, p.getLocation());
-                writeAV(writer, SCXMLConstants.ATTR_EXPR, escapeXML(p.getExpr()));
-                writer.writeEndElement();
-            }
+            writeParams(writer, end.getDoneData().getParams());
             writeContent(writer, end.getDoneData().getContent());
             writer.writeEndElement();
         }
@@ -634,6 +603,27 @@ public class SCXMLWriter {
     }
 
     /**
+     * Write out the {@link EnterableState} objects into its serialization.
+     *
+     * @param writer The {@link XMLStreamWriter} in use for the serialization.
+     * @param states The {@link EnterableState}s to serialize.
+     *
+     * @throws XMLStreamException An exception processing the underlying {@link XMLStreamWriter}.
+     */
+    private static void writeEnterableStates(final XMLStreamWriter writer, final List<EnterableState> states)
+            throws XMLStreamException {
+        for (EnterableState es : states) {
+            if (es instanceof Final) {
+                writeFinal(writer, (Final) es);
+            } else if (es instanceof State) {
+                writeState(writer, (State) es);
+            } else if (es instanceof Parallel) {
+                writeParallel(writer, (Parallel) es);
+            }
+        }
+    }
+
+    /**
      * Write out this {@link Initial} object into its serialization as the corresponding &lt;initial&gt; element.
      *
      * @param writer The {@link XMLStreamWriter} in use for the serialization.
@@ -765,13 +755,7 @@ public class SCXMLWriter {
         writeAV(writer, SCXMLConstants.ATTR_AUTOFORWARD, invoke.getAutoForward());
         writeAV(writer, SCXMLConstants.ATTR_NAMELIST, invoke.getNamelist());
 
-        for (Param p : invoke.getParams()) {
-            writer.writeStartElement(SCXMLConstants.ELEM_PARAM);
-            writeAV(writer, SCXMLConstants.ATTR_NAME, p.getName());
-            writeAV(writer, SCXMLConstants.ATTR_LOCATION, p.getLocation());
-            writeAV(writer, SCXMLConstants.ATTR_EXPR, escapeXML(p.getExpr()));
-            writer.writeEndElement();
-        }
+        writeParams(writer, invoke.getParams());
         writeFinalize(writer, invoke.getFinalize());
         writeContent(writer, invoke.getContent());
 
@@ -911,16 +895,29 @@ public class SCXMLWriter {
         writeAV(writer, SCXMLConstants.ATTR_NAMELIST, send.getNamelist());
         writeAV(writer, SCXMLConstants.ATTR_HINTS, send.getHints());
 
-        for (Param p : send.getParams()) {
+        writeParams(writer, send.getParams());
+        writeContent(writer, send.getContent());
+
+        writer.writeEndElement();
+    }
+
+    /**
+     * Write out the {@link Param} objects into its serialization.
+     *
+     * @param writer The {@link XMLStreamWriter} in use for the serialization.
+     * @param params The {@link Param}s to serialize.
+     *
+     * @throws XMLStreamException An exception processing the underlying {@link XMLStreamWriter}.
+     */
+    private static void writeParams(final XMLStreamWriter writer, final List<Param> params)
+            throws XMLStreamException {
+        for (Param p : params) {
             writer.writeStartElement(SCXMLConstants.ELEM_PARAM);
             writeAV(writer, SCXMLConstants.ATTR_NAME, p.getName());
             writeAV(writer, SCXMLConstants.ATTR_LOCATION, p.getLocation());
             writeAV(writer, SCXMLConstants.ATTR_EXPR, escapeXML(p.getExpr()));
             writer.writeEndElement();
         }
-        writeContent(writer, send.getContent());
-
-        writer.writeEndElement();
     }
 
     /**
@@ -1202,14 +1199,10 @@ public class SCXMLWriter {
             TransformerFactory tfFactory = TransformerFactory.newInstance();
             transformer = tfFactory.newTransformer();
             transformer.setOutputProperties(outputProps);
-        } catch (TransformerFactoryConfigurationError t) {
+        } catch (TransformerFactoryConfigurationError | TransformerConfigurationException t) {
             org.apache.commons.logging.Log log = LogFactory.getLog(SCXMLWriter.class);
             log.error(t.getMessage(), t);
             return null;
-        } catch (TransformerConfigurationException e) {
-            org.apache.commons.logging.Log log = LogFactory.getLog(SCXMLWriter.class);
-            log.error(e.getMessage(), e);
-            return null;
         }
         return transformer;
     }
@@ -1359,7 +1352,7 @@ public class SCXMLWriter {
 
             this.factoryId = factoryId;
             this.factoryClassLoader = factoryClassLoader;
-            this.properties = (properties == null ? new HashMap<String, Object>() : properties);
+            this.properties = (properties == null ? new HashMap<>() : properties);
             this.encoding = encoding;
             this.usePrettyPrint = usePrettyPrint;
             this.closeUnderlyingWhenDone = closeUnderlyingWhenDone;
index ee2f401..ed32bde 100644 (file)
@@ -17,7 +17,6 @@
 package org.apache.commons.scxml2.model;
 
 import java.io.Serializable;
-import java.util.Map;
 
 import org.apache.commons.scxml2.ActionExecutionContext;
 import org.apache.commons.scxml2.SCXMLExpressionException;
@@ -79,15 +78,7 @@ public abstract class Action implements Serializable {
             throw new ModelException("Action "
                     + this.getClass().getName() + " instance missing required parent TransitionTarget");
         }
-        TransitionTarget tt = parent.getParent();
-        if (tt instanceof EnterableState) {
-            return (EnterableState)tt;
-        } else if (tt instanceof History) {
-            return ((History)tt).getParent();
-        } else {
-            throw new ModelException("Unknown TransitionTarget subclass:"
-                    + (tt != null ? tt.getClass().getName() : "(null)"));
-        }
+        return parent.getParent();
     }
 
     /**
index d3b9a53..0394e9f 100644 (file)
@@ -36,13 +36,13 @@ public class Datamodel implements Serializable {
     * The set of &lt;data&gt; elements, parsed as Elements, that are
     * children of this &lt;datamodel&gt; element.
     */
-   private List<Data> data;
+   private final List<Data> data;
 
    /**
     * Constructor.
     */
    public Datamodel() {
-       this.data = new ArrayList<Data>();
+       this.data = new ArrayList<>();
    }
 
    /**
index e469e91..80f0c85 100644 (file)
@@ -29,19 +29,9 @@ import java.util.Comparator;
  */
 public interface DocumentOrder {
 
-    Comparator<DocumentOrder> documentOrderComparator = new Comparator<DocumentOrder>() {
-        @Override
-        public int compare(final DocumentOrder o1, final DocumentOrder o2) {
-            return o1.getOrder() - o2.getOrder();
-        }
-    };
+    Comparator<DocumentOrder> documentOrderComparator = Comparator.comparingInt(DocumentOrder::getOrder);
 
-    Comparator<DocumentOrder> reverseDocumentOrderComparator = new Comparator<DocumentOrder>() {
-        @Override
-        public int compare(final DocumentOrder o1, final DocumentOrder o2) {
-            return o2.getOrder() - o1.getOrder();
-        }
-    };
+    Comparator<DocumentOrder> reverseDocumentOrderComparator = (o1, o2) -> o2.getOrder() - o1.getOrder();
 
     /**
      * @return the relative document order within the SCXML document of this element
index cba7fb6..39f5917 100644 (file)
@@ -33,18 +33,17 @@ public abstract class EnterableState extends TransitionTarget implements Documen
      * List of optional OnEntry elements holding executable content to be run upon
      * entering this transition target.
      */
-    private List<OnEntry> onEntries;
+    private final List<OnEntry> onEntries;
 
     /**
      * List of optional OnExit elements holding executable content to be run upon
      * exiting this transition target.
      */
-    private List<OnExit> onExits;
+    private final List<OnExit> onExits;
 
     public EnterableState() {
-        super();
-        onEntries = new ArrayList<OnEntry>();
-        onExits = new ArrayList<OnExit>();
+        onEntries = new ArrayList<>();
+        onExits = new ArrayList<>();
     }
 
     /**
index eb5eec6..a141bde 100644 (file)
@@ -31,7 +31,7 @@ public abstract class Executable implements Serializable {
      * The set of executable elements (those that inheriting from
      * Action) that are contained in this Executable.
      */
-    private List<Action> actions;
+    private final List<Action> actions;
 
     /**
      * The parent container, for traceability.
@@ -42,8 +42,7 @@ public abstract class Executable implements Serializable {
      * Constructor.
      */
     public Executable() {
-        super();
-        this.actions = new ArrayList<Action>();
+        this.actions = new ArrayList<>();
     }
 
     /**
index ff8f95d..bfc0a8e 100644 (file)
@@ -90,7 +90,7 @@ public class Final extends EnterableState {
                 Context ctx = exctx.getScInstance().getGlobalContext();
                 if (content != null) {
                     if (content.getExpr() != null) {
-                        Object evalResult = null;
+                        Object evalResult;
                         try {
                             evalResult = eval.eval(ctx, content.getExpr());
                         } catch (SCXMLExpressionException e) {
index 9f15beb..73ace8f 100644 (file)
@@ -46,10 +46,9 @@ public class Foreach extends Action implements ActionsContainer {
      * The set of executable elements (those that inheriting from
      * Action) that are contained in this &lt;if&gt; element.
      */
-    private List<Action> actions;
+    private final List<Action> actions;
 
     public Foreach() {
-        super();
         this.actions = new ArrayList<>();
     }
 
index 7f90ade..0243bd9 100644 (file)
@@ -51,7 +51,7 @@ public class If extends Action implements ActionsContainer {
      * The set of executable elements (those that inheriting from
      * Action) that are contained in this &lt;if&gt; element.
      */
-    private List<Action> actions;
+    private final List<Action> actions;
 
     /**
      * The boolean value that dictates whether the particular child action
@@ -64,7 +64,7 @@ public class If extends Action implements ActionsContainer {
      */
     public If() {
         super();
-        this.actions = new ArrayList<Action>();
+        this.actions = new ArrayList<>();
         this.execute = false;
     }
 
index af1c9b5..a798699 100644 (file)
@@ -24,7 +24,7 @@ public class NodeTextValue implements ParsedValue {
     /**
      * the XML node as text
      */
-    private String nodeText;
+    private final String nodeText;
 
     public NodeTextValue(final String nodeText) {
         this.nodeText = nodeText;
index 23eaab2..327b828 100644 (file)
@@ -17,7 +17,6 @@
 package org.apache.commons.scxml2.model;
 
 import java.io.Serializable;
-import java.util.Map;
 
 /**
  * The class in this SCXML object model that corresponds to the
index dfd7c82..8ba5cf7 100644 (file)
@@ -93,13 +93,12 @@ public class PayloadBuilder {
      * @param evaluator the evaluator to evaluate/lookup the data
      * @param paramsList the list of params
      * @param payload the payload data map to be updated
-     * @throws ModelException if this action has not an EnterableState as parent
      * @throws SCXMLExpressionException if a malformed or invalid expression is evaluated
-     * @see PayloadProvider#addToPayload(String, Object, java.util.Map)
+     * @see PayloadBuilder#addToPayload(String, Object, java.util.Map)
      */
     public static void addParamsToPayload(final Context ctx, final Evaluator evaluator, final List<Param> paramsList,
                                           Map<String, Object> payload)
-            throws ModelException, SCXMLExpressionException {
+            throws SCXMLExpressionException {
         if (!paramsList.isEmpty()) {
             Object paramValue;
             for (Param p : paramsList) {
@@ -128,14 +127,13 @@ public class PayloadBuilder {
      * @param errorReporter to report errors
      * @param namelist the namelist
      * @param payload the payload data map to be updated
-     * @throws ModelException if this action has not an EnterableState as parent
      * @throws SCXMLExpressionException if a malformed or invalid expression is evaluated
-     * @see PayloadProvider#addToPayload(String, Object, java.util.Map)
+     * @see PayloadBuilder#addToPayload(String, Object, java.util.Map)
      */
     public static void addNamelistDataToPayload(final EnterableState parentState, final Context ctx,
                                                 final Evaluator evaluator, final ErrorReporter errorReporter,
                                                 final String namelist, Map<String, Object> payload)
-            throws ModelException, SCXMLExpressionException {
+            throws SCXMLExpressionException {
         if (namelist != null) {
             StringTokenizer tkn = new StringTokenizer(namelist);
             while (tkn.hasMoreTokens()) {
diff --git a/src/main/java/org/apache/commons/scxml2/model/PayloadProvider.java b/src/main/java/org/apache/commons/scxml2/model/PayloadProvider.java
deleted file mode 100644 (file)
index 84ae749..0000000
+++ /dev/null
@@ -1,84 +0,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.
- */
-package org.apache.commons.scxml2.model;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * A <code>PayloadProvider</code> is an element in the SCXML document
- * that can provide payload data for an event or an external process.
- */
-public abstract class PayloadProvider extends Action {
-
-    /**
-     * Payload data values wrapper list needed when multiple variable entries use the same names.
-     * The multiple values are then wrapped in a list. The PayloadBuilder uses this 'marker' list
-     * to distinguish between entry values which are a list themselves and the wrapper list.
-     */
-    private static class DataValueList extends ArrayList {
-    }
-
-    /**
-     * Adds an attribute and value to a payload data map.
-     * <p>
-     * As the SCXML specification allows for multiple payload attributes with the same name, this
-     * method takes care of merging multiple values for the same attribute in a list of values.
-     * </p>
-     * <p>
-     * Furthermore, as modifications of payload data on either the sender or receiver side should affect the
-     * the other side, attribute values (notably: {@link Node} value only for now) is cloned first before being added
-     * to the payload data map. This includes 'nested' values within a {@link NodeList}, {@link List} or {@link Map}.
-     * </p>
-     * @param attrName the name of the attribute to add
-     * @param attrValue the value of the attribute to add
-     * @param payload the payload data map to be updated
-     */
-    @SuppressWarnings("unchecked")
-    protected void addToPayload(final String attrName, final Object attrValue, Map<String, Object> payload) {
-        DataValueList valueList = null;
-        Object value = payload.get(attrName);
-        if (value != null) {
-            if (value instanceof DataValueList) {
-                valueList = (DataValueList)value;
-            }
-            else {
-                valueList = new DataValueList();
-                valueList.add(value);
-                payload.put(attrName, valueList);
-            }
-        }
-        value = attrValue;
-        if (value instanceof List) {
-            if (valueList == null) {
-                valueList = new DataValueList();
-                payload.put(attrName, valueList);
-            }
-            valueList.addAll((List)value);
-        }
-        else if (valueList != null) {
-            valueList.add(value);
-        }
-        else {
-            payload.put(attrName, value);
-        }
-    }
-}
index 062289c..8610d99 100644 (file)
@@ -48,12 +48,6 @@ public class SCXML implements Serializable, Observable {
     private static final Integer SCXML_OBSERVABLE_ID = 0;
 
     /**
-     * The xmlns attribute on the root &lt;smxml&gt; element.
-     * This must match XMLNS above.
-     */
-    private String xmlns;
-
-    /**
      * The SCXML version of this document.
      */
     private String version;
@@ -113,13 +107,13 @@ public class SCXML implements Serializable, Observable {
     /**
      * The immediate child targets of this SCXML document root.
      */
-    private List<EnterableState> children;
+    private final List<EnterableState> children;
 
     /**
      * A global map of all States and Parallels associated with this
      * state machine, keyed by their id.
      */
-    private Map<String, TransitionTarget> targets;
+    private final Map<String, TransitionTarget> targets;
 
     /**
      * The XML namespaces defined on the SCXML document root node,
@@ -137,8 +131,8 @@ public class SCXML implements Serializable, Observable {
      * Constructor.
      */
     public SCXML() {
-        this.children = new ArrayList<EnterableState>();
-        this.targets = new HashMap<String, TransitionTarget>();
+        this.children = new ArrayList<>();
+        this.targets = new HashMap<>();
     }
 
     /**
@@ -305,24 +299,6 @@ public class SCXML implements Serializable, Observable {
     }
 
     /**
-     * Get the xmlns of this SCXML document.
-     *
-     * @return Returns the xmlns.
-     */
-    public final String getXmlns() {
-        return xmlns;
-    }
-
-    /**
-     * Set the xmlns of this SCXML document.
-     *
-     * @param xmlns The xmlns to set.
-     */
-    public final void setXmlns(final String xmlns) {
-        this.xmlns = xmlns;
-    }
-
-    /**
      * Get the namespace definitions specified on the SCXML element.
      * May be <code>null</code>.
      *
index 32d9d23..5bd7bcc 100644 (file)
@@ -434,7 +434,7 @@ public class Send extends Action implements ContentContainer, ParamsContainer {
         }
         else if (content != null) {
             if (content.getExpr() != null) {
-                Object evalResult = null;
+                Object evalResult;
                 try {
                     evalResult = eval.eval(ctx, content.getExpr());
                 } catch (SCXMLExpressionException e) {
index 4334b7f..20b58d2 100644 (file)
@@ -17,7 +17,6 @@
 package org.apache.commons.scxml2.model;
 
 import java.util.HashSet;
-import java.util.Map;
 import java.util.Set;
 
 /**
@@ -67,7 +66,7 @@ public class SimpleTransition extends Executable implements Observable {
      * If multiple state(s) are specified, they must belong to the regions
      * of the same parallel.
      */
-    private Set<TransitionTarget> targets;
+    private final Set<TransitionTarget> targets;
 
     /**
      * The transition target ID
@@ -79,7 +78,7 @@ public class SimpleTransition extends Executable implements Observable {
      */
     public SimpleTransition() {
         super();
-        this.targets = new HashSet<TransitionTarget>();
+        this.targets = new HashSet<>();
     }
 
     private boolean isCompoundStateParent(TransitionalState ts) {
@@ -151,8 +150,8 @@ public class SimpleTransition extends Executable implements Observable {
      * <p>
      * Otherwise it is treated (for determining its exit states) as if it is of type {@link TransitionType#external}
      * </p>
-     * @see <a href="http://www.w3.org/TR/2014/CR-scxml-20140313/#SelectingTransitions">
-     *     http://www.w3.org/TR/2014/CR-scxml-20140313/#SelectingTransitions</a>
+     * @see <a href="https://www.w3.org/TR/2015/REC-scxml-20150901/#SelectingTransitions">
+     *     https://www.w3.org/TR/2015/REC-scxml-20150901/#SelectingTransitions</a>
      * @return true if the effective Transition type is {@link TransitionType#internal}
      */
     public final boolean isTypeInternal() {
index 08d45c7..69f5d38 100644 (file)
@@ -124,7 +124,7 @@ public class Transition extends SimpleTransition implements DocumentOrder {
         this.event = event == null ? null : event.trim();
         if (this.event != null) {
             // 'event' is a space separated list of event descriptors
-            events = new ArrayList<String>();
+            events = new ArrayList<>();
             StringTokenizer st = new StringTokenizer(this.event);
             while (st.hasMoreTokens()) {
                 String token = st.nextToken();
index a1a104e..d8f0778 100644 (file)
@@ -22,8 +22,8 @@ package org.apache.commons.scxml2.model;
  * The Transition type determines whether the source state is exited in transitions
  * whose target state is a descendant of the source state.
  * </p>
- * @see <a href="http://www.w3.org/TR/2014/CR-scxml-20140313/#transition">
- *     http://www.w3.org/TR/2014/CR-scxml-20140313/#transition</a>
+ * @see <a href="https://www.w3.org/TR/2015/REC-scxml-20150901/#transition">
+ *     https://www.w3.org/TR/2015/REC-scxml-20150901/#transition</a>
  */
 public enum TransitionType {
     internal,
index e7adfd0..5642dbc 100644 (file)
@@ -27,7 +27,7 @@ public abstract class TransitionalState extends EnterableState {
     /**
      * A list of outgoing Transitions from this state, by document order.
      */
-    private List<Transition> transitions;
+    private final List<Transition> transitions;
 
     /**
      * Optional property holding the data model for this state.
@@ -38,7 +38,7 @@ public abstract class TransitionalState extends EnterableState {
      * List of history states owned by a given state (applies to non-leaf
      * states).
      */
-    private List<History> history;
+    private final List<History> history;
 
     /**
      * The Invoke children, each which defines an external process that should
@@ -47,19 +47,18 @@ public abstract class TransitionalState extends EnterableState {
      * process has completed its execution.
      * May occur 0 or more times.
      */
-    private List<Invoke> invokes;
+    private final List<Invoke> invokes;
 
     /**
      * The set of EnterableState children contained in this TransitionalState
      */
-    private List<EnterableState> children;
+    private final List<EnterableState> children;
 
     public TransitionalState() {
-        super();
-        transitions = new ArrayList<Transition>();
-        history = new ArrayList<History>();
-        children = new ArrayList<EnterableState>();
-        invokes = new ArrayList<Invoke>();
+        transitions = new ArrayList<>();
+        history = new ArrayList<>();
+        children = new ArrayList<>();
+        invokes = new ArrayList<>();
     }
 
     /**
@@ -118,7 +117,7 @@ public abstract class TransitionalState extends EnterableState {
             if ((event == null && t.getEvent() == null)
                     || (event != null && event.equals(t.getEvent()))) {
                 if (matchingTransitions == null) {
-                    matchingTransitions = new ArrayList<Transition>();
+                    matchingTransitions = new ArrayList<>();
                 }
                 matchingTransitions.add(t);
             }
index 205076a..ee6ff71 100644 (file)
@@ -60,13 +60,6 @@ public class Var extends Action {
     private String expr;
 
     /**
-     * Constructor.
-     */
-    public Var() {
-        super();
-    }
-
-    /**
      * Get the expression that evaluates to the initial value
      * of the variable.
      *
index abc1a22..5fb5f2a 100644 (file)
@@ -17,7 +17,6 @@
 package org.apache.commons.scxml2.semantics;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
@@ -62,7 +61,7 @@ import org.apache.commons.scxml2.system.EventVariable;
 
 /**
  * This class encapsulate and implements the
- * <a href="http://www.w3.org/TR/2014/CR-scxml-20140313/#AlgorithmforSCXMLInterpretation">
+ * <a href="https://www.w3.org/TR/2015/REC-scxml-20150901/#AlgorithmforSCXMLInterpretation">
  *     W3C SCXML Algorithm for SCXML Interpretation</a>
  *
  * <p>Custom semantics can be created by sub-classing this implementation.</p>
@@ -72,12 +71,6 @@ import org.apache.commons.scxml2.system.EventVariable;
 public class SCXMLSemanticsImpl implements SCXMLSemantics {
 
     /**
-     * Suffix for error event that are triggered in reaction to invalid data
-     * model locations.
-     */
-    public static final String ERR_ILLEGAL_ALLOC = ".error.illegalalloc";
-
-    /**
      * Optional post processing immediately following SCXMLReader. May be used
      * for removing pseudo-states etc.
      *
@@ -122,7 +115,7 @@ public class SCXMLSemanticsImpl implements SCXMLSemantics {
         // execute global script if defined
         executeGlobalScript(exctx);
         // enter initial states
-        HashSet<TransitionalState> statesToInvoke = new HashSet<TransitionalState>();
+        HashSet<TransitionalState> statesToInvoke = new HashSet<>();
         Step step = new Step(null);
         step.getTransitList().add(exctx.getStateMachine().getInitialTransition());
         microStep(exctx, step, statesToInvoke);
@@ -176,7 +169,7 @@ public class SCXMLSemanticsImpl implements SCXMLSemantics {
             Step step = new Step(event);
             selectTransitions(exctx, step);
             if (!step.getTransitList().isEmpty()) {
-                HashSet<TransitionalState> statesToInvoke = new HashSet<TransitionalState>();
+                HashSet<TransitionalState> statesToInvoke = new HashSet<>();
                 microStep(exctx, step, statesToInvoke);
                 if (exctx.isRunning()) {
                     macroStep(exctx, statesToInvoke);
@@ -209,7 +202,7 @@ public class SCXMLSemanticsImpl implements SCXMLSemantics {
             return;
         }
         ArrayList<EnterableState> configuration = new ArrayList<>(exctx.getScInstance().getStateConfiguration().getActiveStates());
-        Collections.sort(configuration, DocumentOrder.reverseDocumentOrderComparator);
+        configuration.sort(DocumentOrder.reverseDocumentOrderComparator);
         for (EnterableState es : configuration) {
             for (OnExit onexit : es.getOnExits()) {
                 executeContent(exctx, onexit);
@@ -283,7 +276,7 @@ public class SCXMLSemanticsImpl implements SCXMLSemantics {
         Set<EnterableState> states = step.getEntrySet();
         if (!step.getExitSet().isEmpty()) {
             // calculate result states by taking current states, subtracting exitSet and adding entrySet
-            states = new HashSet<EnterableState>(exctx.getScInstance().getStateConfiguration().getStates());
+            states = new HashSet<>(exctx.getScInstance().getStateConfiguration().getStates());
             states.removeAll(step.getExitSet());
             states.addAll(step.getEntrySet());
         }
@@ -409,7 +402,7 @@ public class SCXMLSemanticsImpl implements SCXMLSemantics {
                     if (h.isDeep()) {
                         if (deep == null) {
                             //calculate deep history for a given state once
-                            deep = new HashSet<EnterableState>();
+                            deep = new HashSet<>();
                             for (EnterableState ott : atomicStates) {
                                 if (ott.isDescendantOf(es)) {
                                     deep.add(ott);
@@ -420,7 +413,7 @@ public class SCXMLSemanticsImpl implements SCXMLSemantics {
                     } else {
                         if (shallow == null) {
                             //calculate shallow history for a given state once
-                            shallow = new HashSet<EnterableState>(ts.getChildren());
+                            shallow = new HashSet<>(ts.getChildren());
                             shallow.retainAll(activeStates);
                         }
                         step.getNewHistoryConfigurations().put(h, shallow);
@@ -439,8 +432,8 @@ public class SCXMLSemanticsImpl implements SCXMLSemantics {
      * @param step The step containing the list of transitions to be taken
      */
     public void computeEntrySet(final SCXMLExecutionContext exctx, final Step step) {
-        Set<History> historyTargets = new HashSet<History>();
-        Set<EnterableState> entrySet = new HashSet<EnterableState>();
+        Set<History> historyTargets = new HashSet<>();
+        Set<EnterableState> entrySet = new HashSet<>();
         for (SimpleTransition st : step.getTransitList()) {
             for (TransitionTarget tt : st.getTargets()) {
                 if (tt instanceof EnterableState) {
@@ -503,7 +496,7 @@ public class SCXMLSemanticsImpl implements SCXMLSemantics {
             step.getEntrySet().add(es);
             if (es instanceof Parallel) {
                 for (EnterableState child : ((Parallel)es).getChildren()) {
-                    if (!containsDescendant(step.getEntrySet(), child)) {
+                    if (containsNoDescendant(step.getEntrySet(), child)) {
                         addDescendantStatesToEnter(exctx, step, child);
                     }
                 }
@@ -539,7 +532,7 @@ public class SCXMLSemanticsImpl implements SCXMLSemantics {
             step.getEntrySet().add(anc);
             if (anc instanceof Parallel) {
                 for (EnterableState child : ((Parallel)anc).getChildren()) {
-                    if (!containsDescendant(step.getEntrySet(), child)) {
+                    if (containsNoDescendant(step.getEntrySet(), child)) {
                         addDescendantStatesToEnter(exctx, step, child);
                     }
                 }
@@ -549,17 +542,17 @@ public class SCXMLSemanticsImpl implements SCXMLSemantics {
     }
 
     /**
-     * @return Returns true if a member of the provided states set is a descendant of the provided state.
+     * @return Returns true if no member of the provided states set is a descendant of the provided state.
      * @param states the set of states to check for descendants
      * @param state the state to check with
      */
-    public boolean containsDescendant(Set<EnterableState> states, EnterableState state) {
+    public boolean containsNoDescendant(Set<EnterableState> states, EnterableState state) {
         for (EnterableState es : states) {
             if (es.isDescendantOf(state)) {
-                return true;
+                return false;
             }
         }
-        return false;
+        return true;
     }
 
     /**
@@ -572,12 +565,12 @@ public class SCXMLSemanticsImpl implements SCXMLSemantics {
      */
     public void selectTransitions(final SCXMLExecutionContext exctx, final Step step) throws ModelException {
         step.getTransitList().clear();
-        ArrayList<Transition> enabledTransitions = new ArrayList<Transition>();
+        ArrayList<Transition> enabledTransitions = new ArrayList<>();
 
-        ArrayList<EnterableState> configuration = new ArrayList<EnterableState>(exctx.getScInstance().getStateConfiguration().getActiveStates());
-        Collections.sort(configuration,DocumentOrder.documentOrderComparator);
+        ArrayList<EnterableState> configuration = new ArrayList<>(exctx.getScInstance().getStateConfiguration().getActiveStates());
+        configuration.sort(DocumentOrder.documentOrderComparator);
 
-        HashSet<EnterableState> visited = new HashSet<EnterableState>();
+        HashSet<EnterableState> visited = new HashSet<>();
 
         String eventName = step.getEvent() != null ? step.getEvent().getName() : null;
         for (EnterableState es : configuration) {
@@ -620,25 +613,25 @@ public class SCXMLSemanticsImpl implements SCXMLSemantics {
      */
     public void removeConflictingTransitions(final SCXMLExecutionContext exctx, final Step step,
                                              final List<Transition> enabledTransitions) {
-        LinkedHashSet<Transition> filteredTransitions = new LinkedHashSet<Transition>();
-        LinkedHashSet<Transition> preemptedTransitions = new LinkedHashSet<Transition>();
-        Map<Transition, Set<EnterableState>> exitSets = new HashMap<Transition, Set<EnterableState>>();
+        LinkedHashSet<Transition> filteredTransitions = new LinkedHashSet<>();
+        LinkedHashSet<Transition> preemptedTransitions = new LinkedHashSet<>();
+        Map<Transition, Set<EnterableState>> exitSets = new HashMap<>();
 
         Set<EnterableState> configuration = exctx.getScInstance().getStateConfiguration().getActiveStates();
-        Collections.sort(enabledTransitions, DocumentOrder.documentOrderComparator);
+        enabledTransitions.sort(DocumentOrder.documentOrderComparator);
 
         for (Transition t1 : enabledTransitions) {
             boolean t1Preempted = false;
             Set<EnterableState> t1ExitSet = exitSets.get(t1);
             for (Transition t2 : filteredTransitions) {
                 if (t1ExitSet == null) {
-                    t1ExitSet = new HashSet<EnterableState>();
+                    t1ExitSet = new HashSet<>();
                     computeExitSet(t1, t1ExitSet, configuration);
                     exitSets.put(t1, t1ExitSet);
                 }
                 Set<EnterableState> t2ExitSet = exitSets.get(t2);
                 if (t2ExitSet == null) {
-                    t2ExitSet = new HashSet<EnterableState>();
+                    t2ExitSet = new HashSet<>();
                     computeExitSet(t2, t2ExitSet, configuration);
                     exitSets.put(t2, t2ExitSet);
                 }
@@ -783,16 +776,12 @@ public class SCXMLSemanticsImpl implements SCXMLSemantics {
          * states = active configuration.
          */
         boolean legalConfig = true; // let's be optimists
-        Map<EnterableState, Set<EnterableState>> counts = new HashMap<EnterableState, Set<EnterableState>>();
-        Set<EnterableState> scxmlCount = new HashSet<EnterableState>();
+        Map<EnterableState, Set<EnterableState>> counts = new HashMap<>();
+        Set<EnterableState> scxmlCount = new HashSet<>();
         for (EnterableState es : states) {
             EnterableState parent;
             while ((parent = es.getParent()) != null) {
-                Set<EnterableState> cnt = counts.get(parent);
-                if (cnt == null) {
-                    cnt = new HashSet<EnterableState>();
-                    counts.put(parent, cnt);
-                }
+                Set<EnterableState> cnt = counts.computeIfAbsent(parent, k -> new HashSet<>());
                 cnt.add(es);
                 es = parent;
             }
@@ -889,8 +878,8 @@ public class SCXMLSemanticsImpl implements SCXMLSemantics {
         if (step.getExitSet().isEmpty()) {
             return;
         }
-        ArrayList<EnterableState> exitList = new ArrayList<EnterableState>(step.getExitSet());
-        Collections.sort(exitList, DocumentOrder.reverseDocumentOrderComparator);
+        ArrayList<EnterableState> exitList = new ArrayList<>(step.getExitSet());
+        exitList.sort(DocumentOrder.reverseDocumentOrderComparator);
 
         for (EnterableState es : exitList) {
 
@@ -1002,8 +991,8 @@ public class SCXMLSemanticsImpl implements SCXMLSemantics {
         if (step.getEntrySet().isEmpty()) {
             return;
         }
-        ArrayList<EnterableState> entryList = new ArrayList<EnterableState>(step.getEntrySet());
-        Collections.sort(entryList, DocumentOrder.documentOrderComparator);
+        ArrayList<EnterableState> entryList = new ArrayList<>(step.getEntrySet());
+        entryList.sort(DocumentOrder.documentOrderComparator);
         for (EnterableState es : entryList) {
             exctx.getScInstance().getStateConfiguration().enterState(es);
             // ensure state context creation and datamodel cloned
index 46000ae..86495db 100644 (file)
@@ -38,49 +38,49 @@ public class Step {
     /**
      * The event in this step.
      */
-    private TriggerEvent event;
+    private final TriggerEvent event;
 
     /**
      * The set of states that were exited during this step.
      */
-    private Set<EnterableState> exitSet;
+    private final Set<EnterableState> exitSet;
 
     /**
      * The set of states that were entered during this step.
      */
-    private Set<EnterableState> entrySet;
+    private final Set<EnterableState> entrySet;
 
     /**
      * The set of states that were entered during this step by default
      */
-    private Set<EnterableState> defaultEntrySet;
+    private final Set<EnterableState> defaultEntrySet;
 
     /**
      * The map of default History transitions to be executed as result of entering states in this step.
      */
-    private Map<TransitionalState, SimpleTransition> defaultHistoryTransitions;
+    private final Map<TransitionalState, SimpleTransition> defaultHistoryTransitions;
 
     /**
      * The map of new History configurations created as result of exiting states in this step
      */
-    private Map<History, Set<EnterableState>> newHistoryConfigurations;
+    private final Map<History, Set<EnterableState>> newHistoryConfigurations;
 
     /**
      * The list of Transitions taken during this step.
      */
-    private List<SimpleTransition> transitList;
+    private final List<SimpleTransition> transitList;
 
     /**
      * @param event The event received in this unit of progression
      */
     public Step(TriggerEvent event) {
         this.event = event;
-        this.exitSet = new HashSet<EnterableState>();
-        this.entrySet = new HashSet<EnterableState>();
-        this.defaultEntrySet = new HashSet<EnterableState>();
-        this.defaultHistoryTransitions = new HashMap<TransitionalState, SimpleTransition>();
-        this.newHistoryConfigurations = new HashMap<History, Set<EnterableState>>();
-        this.transitList = new ArrayList<SimpleTransition>();
+        this.exitSet = new HashSet<>();
+        this.entrySet = new HashSet<>();
+        this.defaultEntrySet = new HashSet<>();
+        this.defaultHistoryTransitions = new HashMap<>();
+        this.newHistoryConfigurations = new HashMap<>();
+        this.transitList = new ArrayList<>();
     }
 
     /**
index 12c860e..c3c40e3 100644 (file)
@@ -130,12 +130,8 @@ public final class StandaloneUtils {
                     }
                 }
             }
-        } catch (IOException e) {
+        } catch (IOException | ModelException | XMLStreamException e) {
             e.printStackTrace();
-        } catch (ModelException e) {
-            e.printStackTrace();
-        } catch (XMLStreamException e) {
-               e.printStackTrace();
         }
     }
 
index 885c182..baa5f67 100644 (file)
@@ -39,16 +39,16 @@ public class EventDataTest {
         Set<EnterableState> currentStates = exec.getStatus().getStates();
         Assert.assertEquals(1, currentStates.size());
         Assert.assertEquals("state1", currentStates.iterator().next().getId());
-        TriggerEvent te = new EventBuilder("event.foo", TriggerEvent.SIGNAL_EVENT).data(new Integer(3)).build();
+        TriggerEvent te = new EventBuilder("event.foo", TriggerEvent.SIGNAL_EVENT).data(3).build();
         currentStates = SCXMLTestHelper.fireEvent(exec, te);
         Assert.assertEquals(1, currentStates.size());
         Assert.assertEquals("state3", currentStates.iterator().next().getId());
         TriggerEvent[] evts = new TriggerEvent[] { te,
-            new EventBuilder("event.bar", TriggerEvent.SIGNAL_EVENT).data(new Integer(6)).build()};
+            new EventBuilder("event.bar", TriggerEvent.SIGNAL_EVENT).data(6).build()};
         currentStates = SCXMLTestHelper.fireEvents(exec, evts);
         Assert.assertEquals(1, currentStates.size());
         Assert.assertEquals("state6", currentStates.iterator().next().getId());
-        te = new EventBuilder("event.baz", TriggerEvent.SIGNAL_EVENT).data(new Integer(7)).build();
+        te = new EventBuilder("event.baz", TriggerEvent.SIGNAL_EVENT).data(7).build();
         currentStates = SCXMLTestHelper.fireEvent(exec, te);
         Assert.assertEquals(1, currentStates.size());
         Assert.assertEquals("state7", currentStates.iterator().next().getId());
@@ -98,12 +98,14 @@ public class EventDataTest {
 
     public static class ConnectionAlertingPayload {
         private int line;
-        public ConnectionAlertingPayload(int line) {
+        ConnectionAlertingPayload(int line) {
             this.line = line;
         }
+        @SuppressWarnings("unsed")
         public void setLine(int line) {
             this.line = line;
         }
+        @SuppressWarnings("unsed")
         public int getLine() {
             return line;
         }
index 5f63754..4ef8706 100644 (file)
@@ -112,7 +112,7 @@ public class SCInstanceTest {
         History history = new History();
         history.setId("1");
         
-        Set<EnterableState> configuration = new HashSet<EnterableState>();
+        Set<EnterableState> configuration = new HashSet<>();
         EnterableState tt1 = new State();
         EnterableState tt2 = new State();
         configuration.add(tt1);
@@ -137,7 +137,7 @@ public class SCInstanceTest {
         History history = new History();
         history.setId("1");
         
-        Set<EnterableState> configuration = new HashSet<EnterableState>();
+        Set<EnterableState> configuration = new HashSet<>();
         EnterableState tt1 = new State();
         configuration.add(tt1);
         
@@ -151,7 +151,7 @@ public class SCInstanceTest {
         History history = new History();
         history.setId("1");
 
-        Set<EnterableState> configuration = new HashSet<EnterableState>();
+        Set<EnterableState> configuration = new HashSet<>();
         EnterableState tt1 = new State();
         configuration.add(tt1);
         
index 947d211..425ad8b 100644 (file)
@@ -151,7 +151,7 @@ public class SCXMLExecutorTest {
         exec.go();
         Set<EnterableState> currentStates = SCXMLTestHelper.fireEvent(exec, "done.state.ten");
         Assert.assertEquals(3, currentStates.size());
-        Set<String> expected = new HashSet<String>();
+        Set<String> expected = new HashSet<>();
         expected.add("twenty_one_2");
         expected.add("twenty_two_2");
         expected.add("twenty_three_2");
@@ -169,7 +169,7 @@ public class SCXMLExecutorTest {
         exec.go();
         Set<EnterableState> currentStates = SCXMLTestHelper.fireEvent(exec, "done.state.ten");
         Assert.assertEquals(3, currentStates.size());
-        Set<String> expected = new HashSet<String>();
+        Set<String> expected = new HashSet<>();
         expected.add("twenty_one_1");
         expected.add("twenty_two_1");
         expected.add("twenty_three_1");
@@ -228,7 +228,7 @@ public class SCXMLExecutorTest {
     public void testSCXMLExecutorTransitionsWithCond01Sample() throws Exception {
         SCXMLExecutor exec = SCXMLTestHelper.getExecutor("org/apache/commons/scxml2/transitions-with-cond-01.xml");
         exec.go();
-        Map<String, Object> payload = new HashMap<String, Object>();
+        Map<String, Object> payload = new HashMap<>();
 
         // with _event.data set to true, transition should happen as expected.
         payload.put("keyed", Boolean.TRUE);
@@ -257,7 +257,7 @@ public class SCXMLExecutorTest {
     public void testSCXMLExecutorSystemEventVariable() throws Exception {
         SCXMLExecutor exec = SCXMLTestHelper.getExecutor("org/apache/commons/scxml2/transitions-event-variable.xml");
         exec.go();
-        Map<String, Object> payload = new HashMap<String, Object>();
+        Map<String, Object> payload = new HashMap<>();
         payload.put("keyed", Boolean.TRUE);
         SCXMLTestHelper.assertPostTriggerState(exec, "open", payload, "opened");
     }
@@ -272,7 +272,7 @@ public class SCXMLExecutorTest {
         currentStates = SCXMLTestHelper.fireEvent(exec, "done.state.twenty_one");
         Assert.assertEquals(1, currentStates.size());
         Assert.assertEquals("twenty_two", currentStates.iterator().next().getId());
-        Set<String> stateIds = new HashSet<String>();
+        Set<String> stateIds = new HashSet<>();
         stateIds.add("twenty_one");
         exec.setConfiguration(stateIds);
         Assert.assertEquals(1, exec.getStatus().getStates().size());
index fef7a9d..62039b9 100644 (file)
@@ -82,8 +82,7 @@ public class SCXMLTestHelper {
         Configuration configuration = new Configuration(null, null, customActions);
         SCXML scxml = SCXMLReader.read(url, configuration);
         Assert.assertNotNull(scxml);
-        SCXML roundtrip = testModelSerializability(scxml);
-        return roundtrip;
+        return testModelSerializability(scxml);
     }
 
     public static SCXML parse(final Reader scxmlReader, final List<CustomAction> customActions) throws Exception {
@@ -91,8 +90,7 @@ public class SCXMLTestHelper {
         Configuration configuration = new Configuration(null, null, customActions);
         SCXML scxml = SCXMLReader.read(scxmlReader, configuration);
         Assert.assertNotNull(scxml);
-        SCXML roundtrip = testModelSerializability(scxml);
-        return roundtrip;
+        return testModelSerializability(scxml);
     }
 
     public static SCXMLExecutor getExecutor(final URL url) throws Exception {
@@ -135,7 +133,7 @@ public class SCXMLTestHelper {
         return exec.getSCInstance().lookupContext((EnterableState)tt);
     }
 
-    public static void assertState(SCXMLExecutor exec, String expectedStateId) throws Exception {
+    public static void assertState(SCXMLExecutor exec, String expectedStateId) {
         Set<EnterableState> currentStates = exec.getStatus().getStates();
         Assert.assertEquals("Expected 1 simple (leaf) state with id '"
             + expectedStateId + "' but found " + currentStates.size() + " states instead.",
@@ -209,7 +207,7 @@ public class SCXMLTestHelper {
             + " on firing event " + triggerEvent + " but found "
             + currentStates.size() + " states instead.",
             n, currentStates.size());
-        List<String> expectedStateIdList = new ArrayList<String>(Arrays.asList(expectedStateIds));
+        List<String> expectedStateIdList = new ArrayList<>(Arrays.asList(expectedStateIds));
         for (TransitionTarget tt : currentStates) {
             String stateId = tt.getId();
             if(!expectedStateIdList.remove(stateId)) {
@@ -219,7 +217,7 @@ public class SCXMLTestHelper {
             }
         }
         Assert.assertEquals("More states in current configuration than those"
-            + "specified in the expected state ids '" + expectedStateIds
+            + "specified in the expected state ids '" + Arrays.toString(expectedStateIds)
             + "'", 0, expectedStateIdList.size());
     }
 
@@ -230,7 +228,7 @@ public class SCXMLTestHelper {
         }
         String filename = SERIALIZATION_FILE_PREFIX
             + getSequenceNumber() + SERIALIZATION_FILE_SUFFIX;
-        SCXML roundtrip = null;
+        SCXML roundtrip;
         ObjectOutputStream out =
             new ObjectOutputStream(new FileOutputStream(filename));
         out.writeObject(scxml);
index f62c38a..c134153 100644 (file)
@@ -74,9 +74,8 @@ public class WizardsTest {
     }
 
     static class TestEventDispatcher extends SimpleDispatcher {
-        private static final long serialVersionUID = 1L;
-        // If you change this, you must also change testWizard02Sample()
 
+        // If you change this, you must also change testWizard02Sample()
         int callback = 0;
 
         @SuppressWarnings("unchecked")
index 0766e14..28f5c30 100644 (file)
@@ -43,7 +43,7 @@ public class AbstractStateMachineTest {
 
         private boolean fooCalled;
 
-        public Foo(final URL scxmlDocument) throws ModelException {
+        Foo(final URL scxmlDocument) throws ModelException {
             super(scxmlDocument);
         }
 
@@ -51,7 +51,7 @@ public class AbstractStateMachineTest {
             fooCalled = true;
         }
 
-        public boolean fooCalled() {
+        boolean fooCalled() {
             return fooCalled;
         }
     }
@@ -60,7 +60,7 @@ public class AbstractStateMachineTest {
 
         private boolean barCalled;
 
-        public Bar(final URL scxmlDocument) throws ModelException {
+        Bar(final URL scxmlDocument) throws ModelException {
             super(scxmlDocument);
         }
 
@@ -68,7 +68,7 @@ public class AbstractStateMachineTest {
             barCalled = true;
         }
 
-        public boolean barCalled() {
+        boolean barCalled() {
             return barCalled;
         }
     }
index d32a6f4..96d0d9e 100644 (file)
@@ -87,9 +87,7 @@ public class StopWatch extends AbstractStateMachine {
         String padhr = dhr > 9 ? EMPTY : ZERO;
         String padmin = dmin > 9 ? EMPTY : ZERO;
         String padsec = dsec > 9 ? EMPTY : ZERO;
-        return new StringBuffer().append(padhr).append(dhr).append(DELIM).
-            append(padmin).append(dmin).append(DELIM).append(padsec).
-            append(dsec).append(DOT).append(dfract).toString();
+        return padhr + dhr + DELIM + padmin + dmin + DELIM + padsec + dsec + DOT + dfract;
     }
 
     // used by the demonstration (see StopWatchDisplay usecase)
index e8b18f5..7828316 100644 (file)
@@ -48,9 +48,8 @@ import org.apache.commons.scxml2.model.ModelException;
 public class StopWatchDisplay extends JFrame
         implements ActionListener {
 
-    private static final long serialVersionUID = 1L;
     private StopWatch stopWatch;
-    private Image watchImage, watchIcon;
+    private Image watchImage;
 
     public StopWatchDisplay() throws ModelException {
         super("SCXML stopwatch");
@@ -92,7 +91,7 @@ public class StopWatchDisplay extends JFrame
             getResource("org/apache/commons/scxml2/env/stopwatchicon.gif");
         Toolkit kit = Toolkit.getDefaultToolkit();
         watchImage = kit.createImage(imageURL);
-        watchIcon = kit.createImage(iconURL);
+        Image watchIcon = kit.createImage(iconURL);
         WatchPanel panel = new WatchPanel();
         panel.setLayout(new BorderLayout());
         setContentPane(panel);
@@ -135,8 +134,6 @@ public class StopWatchDisplay extends JFrame
     }
 
     class WatchPanel extends JPanel {
-        private static final long serialVersionUID = 1L;
-
         @Override
         public void paintComponent(Graphics g) {
             if(watchImage != null) {
index 04eeb87..3d916f4 100644 (file)
@@ -32,7 +32,7 @@ public class GroovyContextTest {
     
     @Test
     public void testPrepopulated() {
-        Map<String, Object> m = new HashMap<String, Object>();
+        Map<String, Object> m = new HashMap<>();
         m.put("foo", "bar");
         GroovyContext ctx = new GroovyContext(null, m, null);
         Assert.assertNotNull(ctx);
index 73b27ce..3e4f049 100644 (file)
@@ -68,16 +68,16 @@ public class JSEvaluatorTest {
                                                  "</scxml>";
 
     private static final TestItem[] SIMPLE_EXPRESSIONS = {
-            new TestItem("'FIB: ' + (1 + 1 + 2 + 3 + 5)",new String("FIB: 12")),
-            new TestItem("1 + 1 + 2 + 3 + 5",            new Integer(12)), // Force comparison using intValue
-            new TestItem("1.1 + 1.1 + 2.1 + 3.1 + 5.1",  new Double(12.5)),
-            new TestItem("(1 + 1 + 2 + 3 + 5) == 12",    new Boolean(true)),
-            new TestItem("(1 + 1 + 2 + 3 + 5) == 13",    new Boolean(false)),
+            new TestItem("'FIB: ' + (1 + 1 + 2 + 3 + 5)", "FIB: 12"),
+            new TestItem("1 + 1 + 2 + 3 + 5",            12), // Force comparison using intValue
+            new TestItem("1.1 + 1.1 + 2.1 + 3.1 + 5.1",  12.5),
+            new TestItem("(1 + 1 + 2 + 3 + 5) == 12",    true),
+            new TestItem("(1 + 1 + 2 + 3 + 5) == 13",    false),
     };
 
     private static final TestItem[] VAR_EXPRESSIONS = {
-            new TestItem("'FIB: ' + fibonacci",new String("FIB: 12")),
-            new TestItem("fibonacci * 2",      new Double(24)),
+            new TestItem("'FIB: ' + fibonacci", "FIB: 12"),
+            new TestItem("fibonacci * 2",      24.0),
     };
 
     private static final String FUNCTION = "function factorial(N) {\r\n" +
@@ -97,7 +97,6 @@ public class JSEvaluatorTest {
 
     private Context       context;
     private Evaluator     evaluator;
-    private SCXMLExecutor fsm;
 
     // TEST SETUP
 
@@ -107,10 +106,10 @@ public class JSEvaluatorTest {
      */
     @Before
     public void setUp() throws Exception {
-            fsm = SCXMLTestHelper.getExecutor(SCXMLReader.read(new StringReader(SCRIPT)));
-            fsm.go();
-            evaluator = fsm.getEvaluator();
-            context = fsm.getGlobalContext();
+        SCXMLExecutor fsm = SCXMLTestHelper.getExecutor(SCXMLReader.read(new StringReader(SCRIPT)));
+        fsm.go();
+        evaluator = fsm.getEvaluator();
+        context = fsm.getGlobalContext();
     }
 
     // CLASS METHODS
@@ -137,7 +136,7 @@ public class JSEvaluatorTest {
         Evaluator evaluator = new JSEvaluator();
 
         Assert.assertNotNull(evaluator);
-        Assert.assertTrue   (((Boolean) evaluator.eval(context, "1+1 == 2")).booleanValue());
+        Assert.assertTrue   ((Boolean) evaluator.eval(context, "1+1 == 2"));
     }
 
     @Test
@@ -201,11 +200,11 @@ public class JSEvaluatorTest {
      */    
     @Test
     public void testVarExpressions() throws Exception {
-        context.set("fibonacci",Integer.valueOf(12));
+        context.set("fibonacci", 12.0);
 
         for (TestItem item: VAR_EXPRESSIONS) {
             Assert.assertNotNull(context.get("fibonacci"));
-            Assert.assertEquals (Integer.valueOf(12),context.get("fibonacci"));
+            Assert.assertEquals (12.0,context.get("fibonacci"));
             Assert.assertEquals ("Invalid result: " + item.expression,
                           item.result,
                           evaluator.eval(context,item.expression));
@@ -288,17 +287,17 @@ public class JSEvaluatorTest {
      */    
     @Test
     public void testScriptFunctions() throws Exception {
-        context.set("FIVE",Integer.valueOf(5));
-        Assert.assertEquals(Integer.valueOf(5),context.get("FIVE"));
-        Assert.assertEquals("Invalid function result",Double.valueOf(120.0),evaluator.eval(context,FUNCTION));
+        context.set("FIVE", 5);
+        Assert.assertEquals(5,context.get("FIVE"));
+        Assert.assertEquals("Invalid function result", 120.0,evaluator.eval(context,FUNCTION));
     }
 
 
     // INNER CLASSES
 
     private static class TestItem {
-        private String expression;
-        private Object result;
+        private final String expression;
+        private final Object result;
 
         private TestItem(String expression,Object result) {
             this.expression = expression;
index bf33d61..345bcdf 100644 (file)
@@ -46,7 +46,7 @@ public class JSExampleTest {
     @Test
     public void testExample01Sample() throws Exception {
 
-        List<CustomAction> actions  = new ArrayList<CustomAction>();        
+        List<CustomAction> actions  = new ArrayList<>();
         actions.add(new CustomAction("http://my.custom-actions.domain", "eventdatamaptest", EventDataMapTest.class));
 
         SCXML scxml = SCXMLTestHelper.parse("org/apache/commons/scxml2/env/javascript/example-01.xml", actions);
@@ -60,8 +60,6 @@ public class JSExampleTest {
     // INNER CLASSES
     
     public static class EventDataMapTest extends Action {
-        private static final long serialVersionUID = 1L;
-
         @Override
         public void execute(ActionExecutionContext exctx) throws ModelException, SCXMLExpressionException {
             exctx.getInternalIOProcessor()
index 2f62544..ebeb04c 100644 (file)
@@ -32,18 +32,7 @@ public class JexlContextTest {
     
     @Test
     public void testPrepopulated() {
-        Map<String, Object> m = new HashMap<String, Object>();
-        m.put("foo", "bar");
-        JexlContext ctx = new JexlContext(null, m);
-        Assert.assertNotNull(ctx);
-        Assert.assertEquals(1, ctx.getVars().size());
-        String fooValue = (String) ctx.get("foo");
-        Assert.assertEquals("bar", fooValue);
-    }
-    
-    @Test
-    public void testSetVars() {
-        Map<String, Object> m = new HashMap<String, Object>();
+        Map<String, Object> m = new HashMap<>();
         m.put("foo", "bar");
         JexlContext ctx = new JexlContext(null, m);
         Assert.assertNotNull(ctx);
index e3f42de..440a5ce 100644 (file)
@@ -24,13 +24,13 @@ import org.junit.Test;
 
 public class JexlEvaluatorTest {
 
-    private String BAD_EXPRESSION = ">";
-    private Context ctx = new JexlContext();
+    private static final String BAD_EXPRESSION = ">";
+    private final Context ctx = new JexlContext();
 
     @Test
     public void testPristine() throws SCXMLExpressionException {
         Evaluator eval = new JexlEvaluator();
-        Assert.assertTrue(((Boolean) eval.eval(ctx, "1+1 eq 2")).booleanValue());
+        Assert.assertTrue((Boolean) eval.eval(ctx, "1+1 eq 2"));
     }
 
     @Test
index f828cfa..9bcb040 100644 (file)
@@ -34,8 +34,8 @@ public class InvokeParamNameTest {
 
     private SCXMLExecutor exec;
 
-    static String lastURL;
-    static Map<String, Object> lastParams;
+    private static String lastURL;
+    private static Map<String, Object> lastParams;
     
     @Before
     public void setUp() throws Exception {
index 5ded49c..3312e26 100644 (file)
@@ -65,7 +65,7 @@ public class ContentParserTest {
         String jsonObjectString = "{ /*comment*/ 'string' : 'foobar', 'int' : 1, 'boolean' : false, 'null' : null }";
         LinkedHashMap<String, Object> jsonObject = new LinkedHashMap<>();
         jsonObject.put("string", "foobar");
-        jsonObject.put("int",new Integer(1));
+        jsonObject.put("int", 1);
         jsonObject.put("boolean", Boolean.FALSE);
         jsonObject.put("null", null);
         Assert.assertEquals(jsonObject, contentParser.parseJson(jsonObjectString));
index cb5707b..f69858c 100644 (file)
@@ -169,7 +169,7 @@ public class SCXMLReaderTest {
 
     @Test
     public void testSCXMLReaderCustomActionWithBodyTextSample() throws Exception {
-        List<CustomAction> cas = new ArrayList<CustomAction>();
+        List<CustomAction> cas = new ArrayList<>();
         CustomAction ca = new CustomAction("http://my.custom-actions.domain",
             "action", MyAction.class);
         cas.add(ca);
@@ -207,11 +207,10 @@ public class SCXMLReaderTest {
         // In the lenient/silent mode (strict == false && silent == true),
         // no model exception is logged.
         clearRecordedLogMessages();
-        scxml = null;
         configuration = new Configuration();
         configuration.setStrict(false);
         configuration.setSilent(true);
-        scxml = SCXMLReader.read(SCXMLTestHelper.getResource("org/apache/commons/scxml2/io/scxml-with-invalid-elems.xml"),
+        SCXMLReader.read(SCXMLTestHelper.getResource("org/apache/commons/scxml2/io/scxml-with-invalid-elems.xml"),
                 configuration);
         Assert.assertNotNull(scxml);
         Assert.assertNotNull(serialize(scxml));
@@ -230,21 +229,21 @@ public class SCXMLReaderTest {
         // In strict/verbose mode (strict == true && silent == false), it should fail to read the model and catch a model exception
         // with warning logs because of the invalid <baddata> element.
         clearRecordedLogMessages();
-        scxml = null;
         configuration = new Configuration();
         configuration.setStrict(true);
         configuration.setSilent(false);
         try {
-            scxml = SCXMLReader.read(SCXMLTestHelper.getResource("org/apache/commons/scxml2/io/scxml-with-invalid-elems.xml"),
+            SCXMLReader.read(SCXMLTestHelper.getResource("org/apache/commons/scxml2/io/scxml-with-invalid-elems.xml"),
                     configuration);
             Assert.fail("In strict mode, it should have thrown a model exception.");
         } catch (ModelException e) {
             Assert.assertTrue(e.getMessage().contains("Ignoring unknown or invalid element <baddata>"));
         }
+
         assertContainsRecordedLogMessage("Ignoring unknown or invalid element <baddata> in namespace \"http://www.w3.org/2005/07/scxml\" as child of <datamodel>");
-        assertContainsRecordedLogMessage("Ignoring unknown or invalid element <baddata> in namespace \"http://www.example.com/scxml\" as child of <datamodel>");
-        assertContainsRecordedLogMessage("Ignoring unknown or invalid element <trace> in namespace \"http://www.w3.org/2005/07/scxml\" as child of <onentry>");
-        assertContainsRecordedLogMessage("Ignoring unknown or invalid element <onbeforeexit> in namespace \"http://www.w3.org/2005/07/scxml\" as child of <final>");
+        assertNotContainsRecordedLogMessage("Ignoring unknown or invalid element <baddata> in namespace \"http://www.example.com/scxml\" as child of <datamodel>");
+        assertNotContainsRecordedLogMessage("Ignoring unknown or invalid element <trace> in namespace \"http://www.w3.org/2005/07/scxml\" as child of <onentry>");
+        assertNotContainsRecordedLogMessage("Ignoring unknown or invalid element <onbeforeexit> in namespace \"http://www.w3.org/2005/07/scxml\" as child of <final>");
 
         // In strict/silent mode (strict == true && silent == true), it should fail to read the model and catch a model exception
         // without warning logs because of the invalid <baddata> element.
@@ -333,15 +332,13 @@ public class SCXMLReaderTest {
 
     private void assertContainsRecordedLogMessage(final String message) {
         if (scxmlReaderLog instanceof RecordingSimpleLog) {
-            Assert.assertTrue(((RecordingSimpleLog) scxmlReaderLog).containsMessage(
-                    "Ignoring unknown or invalid element <baddata> in namespace \"http://www.w3.org/2005/07/scxml\" as child of <datamodel>"));
+            Assert.assertTrue(((RecordingSimpleLog) scxmlReaderLog).containsMessage(message));
         }
     }
 
     private void assertNotContainsRecordedLogMessage(final String message) {
         if (scxmlReaderLog instanceof RecordingSimpleLog) {
-            Assert.assertFalse(((RecordingSimpleLog) scxmlReaderLog).containsMessage(
-                    "Ignoring unknown or invalid element <baddata> in namespace \"http://www.w3.org/2005/07/scxml\" as child of <datamodel>"));
+            Assert.assertFalse(((RecordingSimpleLog) scxmlReaderLog).containsMessage(message));
         }
     }
 
@@ -352,7 +349,6 @@ public class SCXMLReaderTest {
     }
 
     public static class MyAction extends Action implements ParsedValueContainer {
-        private static final long serialVersionUID = 1L;
 
         private ParsedValue parsedValue;
 
@@ -387,18 +383,16 @@ public class SCXMLReaderTest {
      */
     public static class RecordingSimpleLog extends SimpleLog {
 
-        private static final long serialVersionUID = 1L;
-
-        private List<String> messages = new LinkedList<String>();
+        private final List<String> messages = new LinkedList<>();
 
-        public RecordingSimpleLog(String name) {
+        RecordingSimpleLog(String name) {
             super(name);
         }
 
         /**
          * Clear all the recorded log messages.
          */
-        public void clearMessages() {
+        void clearMessages() {
             messages.clear();
         }
 
@@ -407,7 +401,7 @@ public class SCXMLReaderTest {
          * @param msg
          * @return
          */
-        public boolean containsMessage(final String msg) {
+        boolean containsMessage(final String msg) {
             for (String message : messages) {
                 if (message.contains(msg)) {
                     return true;
@@ -423,7 +417,6 @@ public class SCXMLReaderTest {
 
         @Override
         protected void log(int type, Object message, Throwable t) {
-            super.log(type, message, t);
             messages.add(message.toString());
         }
     }
index 7c7feb1..94ea225 100644 (file)
@@ -29,7 +29,7 @@ import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 /**
- * Test enforcement of required SCXML element attributes, spec http://www.w3.org/TR/2013/WD-scxml-20130801
+ * Test enforcement of required SCXML element attributes, spec https://www.w3.org/TR/2015/REC-scxml-20150901
  * <p>
  * TODO required attributes for elements:
  * <ul>
index 6ce85da..20c3b3e 100644 (file)
@@ -21,12 +21,10 @@ import java.util.LinkedHashMap;
 
 import org.apache.commons.scxml2.model.CommonsSCXML;
 import org.apache.commons.scxml2.model.ModelException;
-import org.apache.commons.scxml2.model.OnEntry;
 import org.apache.commons.scxml2.model.Parallel;
 import org.apache.commons.scxml2.model.SCXML;
 import org.apache.commons.scxml2.model.Script;
 import org.apache.commons.scxml2.model.State;
-import org.apache.commons.scxml2.model.Var;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -38,7 +36,7 @@ public class SCXMLWriterTest {
     public void testSerializeSCXMLNoStates() throws IOException, XMLStreamException {
         SCXML scxml = new CommonsSCXML();
         // ensure namespaces are stored in insertion order for write->read comparision below
-        LinkedHashMap namespaces = new LinkedHashMap(scxml.getNamespaces());
+        LinkedHashMap<String, String> namespaces = new LinkedHashMap<>(scxml.getNamespaces());
         namespaces.put("foo", "http://f.o.o");
         namespaces.put("bar", "http://b.a.r");
         scxml.setNamespaces(namespaces);
index ad27e00..dce0e4c 100644 (file)
@@ -54,7 +54,7 @@ public class Issue112Test {
 
         CustomAction ca1 =
             new CustomAction("http://my.custom-actions.domain/CUSTOM", "enqueue", Enqueue.class);
-        List<CustomAction> customActions = new ArrayList<CustomAction>();
+        List<CustomAction> customActions = new ArrayList<>();
         customActions.add(ca1);
 
         SCXML scxml = SCXMLTestHelper.parse("org/apache/commons/scxml2/issues/queue-01.xml", customActions);
@@ -87,13 +87,8 @@ public class Issue112Test {
      */
     public static class Enqueue extends Action {
 
-        private static final long serialVersionUID = 1L;
         private String event;
 
-        public Enqueue() {
-            super();
-        }
-
         public String getEvent() {
             return event;
         }
@@ -113,7 +108,7 @@ public class Issue112Test {
 
     // Test external event queue
     private static final class Application {
-        private static final Queue<String> QUEUE = new LinkedList<String>();
+        private static final Queue<String> QUEUE = new LinkedList<>();
     }
 
 }
index feb288c..7f81491 100644 (file)
@@ -54,7 +54,7 @@ public class ActionsTest {
         runTest(exec);
     }
 
-    private void runTest(SCXMLExecutor exec) throws Exception {
+    private void runTest(SCXMLExecutor exec) {
         Context ctx = SCXMLTestHelper.lookupContext(exec, "actionsTest");
         Assert.assertEquals(ctx.get("foo"), "foobar");
         Assert.assertEquals("Missed event transition",
index 0a85c80..63f3213 100644 (file)
@@ -119,7 +119,7 @@ public class CustomActionTest {
         CustomAction ca2 =
             new CustomAction("http://my.custom-actions.domain/CUSTOM2",
                              "bar", Hello.class);
-        List<CustomAction> customActions = new ArrayList<CustomAction>();
+        List<CustomAction> customActions = new ArrayList<>();
         customActions.add(ca1);
         customActions.add(ca2);
         // (2) Parse the document
@@ -146,7 +146,7 @@ public class CustomActionTest {
         CustomAction ca =
             new CustomAction("http://my.custom-actions.domain/CUSTOM",
                              "hello", Hello.class);
-        List<CustomAction> customActions = new ArrayList<CustomAction>();
+        List<CustomAction> customActions = new ArrayList<>();
         customActions.add(ca);
         // (2) Parse the document
         SCXML scxml = SCXMLTestHelper.parse("org/apache/commons/scxml2/external-hello-world.xml", customActions);
@@ -170,7 +170,7 @@ public class CustomActionTest {
         CustomAction ca =
             new CustomAction("http://my.custom-actions.domain/CUSTOM",
                              "send", Hello.class);
-        List<CustomAction> customActions = new ArrayList<CustomAction>();
+        List<CustomAction> customActions = new ArrayList<>();
         customActions.add(ca);
         // (2) Parse the document
         SCXML scxml = SCXMLTestHelper.parse("org/apache/commons/scxml2/custom-hello-world-03.xml", customActions);
@@ -195,7 +195,7 @@ public class CustomActionTest {
         CustomAction ca =
             new CustomAction("http://my.custom-actions.domain/CUSTOM",
                              "hello", Hello.class);
-        List<CustomAction> customActions = new ArrayList<CustomAction>();
+        List<CustomAction> customActions = new ArrayList<>();
         customActions.add(ca);
         // (2) Parse the document
         SCXML scxml = SCXMLTestHelper.parse("org/apache/commons/scxml2/custom-hello-world-04-jexl.xml", customActions);
index c01cbfc..4094e39 100644 (file)
@@ -26,8 +26,6 @@ import org.apache.commons.scxml2.EventBuilder;
  */
 public class Hello extends Action {
 
-    /** Serial version UID. */
-    private static final long serialVersionUID = 1L;
     /** This is who we say hello to. */
     private String name;
     /** We count callbacks to execute() as part of the test suite. */
index 2a315f7..2dbab93 100644 (file)
@@ -36,7 +36,7 @@ public class SendTest {
     @Test
     @SuppressWarnings("unchecked")
     public void testNamelistOrderPreserved() throws Exception {
-        final List<Object> payloads = new ArrayList<Object>();
+        final List<Object> payloads = new ArrayList<>();
         final SCXML scxml = SCXMLTestHelper.parse("org/apache/commons/scxml2/model/send-test-01.xml");
         final SCXMLExecutor exec = SCXMLTestHelper.getExecutor(scxml, null, new SimpleDispatcher() {
             @Override
@@ -47,7 +47,7 @@ public class SendTest {
             }
         });
         exec.go();
-        TriggerEvent te = new EventBuilder("event.foo", TriggerEvent.SIGNAL_EVENT).data(new Integer(3)).build();
+        TriggerEvent te = new EventBuilder("event.foo", TriggerEvent.SIGNAL_EVENT).data(3).build();
         SCXMLTestHelper.fireEvent(exec, te);
 
         Assert.assertFalse("Payloads empty.", payloads.isEmpty());
index 9aa1a54..b3e0dd4 100644 (file)
@@ -31,14 +31,14 @@ public class SCXMLSemanticsImplTest {
 
     @Test
     public void testIsLegalConfigNoStates() {
-        Set<EnterableState> states = new HashSet<EnterableState>();
+        Set<EnterableState> states = new HashSet<>();
 
         Assert.assertTrue(new SCXMLSemanticsImpl().isLegalConfiguration(states, new SimpleErrorReporter()));
     }
 
     @Test
     public void testIsLegalConfigInvalidParallel() {
-        Set<EnterableState> states = new HashSet<EnterableState>();
+        Set<EnterableState> states = new HashSet<>();
         Parallel parallel = new Parallel();
 
         Parallel parent = new Parallel();
@@ -65,7 +65,7 @@ public class SCXMLSemanticsImplTest {
 
     @Test
     public void testIsLegalConfigMultipleTopLevel() {
-        Set<EnterableState> states = new HashSet<EnterableState>();
+        Set<EnterableState> states = new HashSet<>();
 
         State state1 = new State();
         state1.setId("1");
@@ -84,7 +84,7 @@ public class SCXMLSemanticsImplTest {
 
     @Test
     public void testIsLegalConfigMultipleStatesActive() {
-        Set<EnterableState> states = new HashSet<EnterableState>();
+        Set<EnterableState> states = new HashSet<>();
 
         State state1 = new State();
         state1.setId("1");
index 1761300..29a1d49 100644 (file)
@@ -267,7 +267,7 @@ public class W3CTests {
             }
 
             public List<TestCase> getTestCases() {
-                return testCases != null ? testCases : Collections.<TestCase>emptyList();
+                return testCases != null ? testCases : Collections.emptyList();
             }
 
             public Datamodel getDatamodel() {
@@ -314,12 +314,12 @@ public class W3CTests {
             }
 
             public List<Resource> getScxmlResources() {
-                return scxmlResources != null ? scxmlResources : Collections.<Resource>emptyList();
+                return scxmlResources != null ? scxmlResources : Collections.emptyList();
             }
 
             public List<Resource> getResources() {
                 if (resources == null) {
-                    resources = new ArrayList<Resource>();
+                    resources = new ArrayList<>();
                     if (scxmlResources != null) {
                         resources.addAll(scxmlResources);
                     }
@@ -385,10 +385,10 @@ public class W3CTests {
      * Simple TestResult data struct for tracking test results
      */
     protected static class TestResults {
-        Map<Datamodel, Integer> passed = new HashMap<>();
-        Map<Datamodel, Integer> failed = new HashMap<>();
-        Map<Datamodel, Integer> skipped = new HashMap<>();
-        ArrayList<String> changedStatusTests = new ArrayList<>();
+        final Map<Datamodel, Integer> passed = new HashMap<>();
+        final Map<Datamodel, Integer> failed = new HashMap<>();
+        final Map<Datamodel, Integer> skipped = new HashMap<>();
+        final ArrayList<String> changedStatusTests = new ArrayList<>();
 
         public int passed(final Datamodel dm) {
             return passed.get(dm) != null ? passed.get(dm) : 0;
@@ -510,18 +510,20 @@ public class W3CTests {
             throws Exception {
         System.out.println("processing IRP test file " + resource.getFilename());
         FileUtils.copyURLToFile(new URL(SCXML_IRP_BASE_URL + resource.getUri()), new File(TXML_TESTS_DIR + resource.getFilename()));
-        if (specid.equals("#minimal-profile")) {
-            transformResource(resource, transformers.get(Datamodel.MINIMAL), Datamodel.MINIMAL.testDir());
-        }
-        else if (specid.equals("#ecma-profile")) {
-            transformResource(resource, transformers.get(Datamodel.ECMA), Datamodel.ECMA.testDir());
-        }
-        else {
-            for (Datamodel dm : transformers.keySet()) {
-                if (dm != Datamodel.MINIMAL) {
-                    transformResource(resource, transformers.get(dm), dm.testDir());
+        switch (specid) {
+            case "#minimal-profile":
+                transformResource(resource, transformers.get(Datamodel.MINIMAL), Datamodel.MINIMAL.testDir());
+                break;
+            case "#ecma-profile":
+                transformResource(resource, transformers.get(Datamodel.ECMA), Datamodel.ECMA.testDir());
+                break;
+            default:
+                for (Datamodel dm : transformers.keySet()) {
+                    if (dm != Datamodel.MINIMAL) {
+                        transformResource(resource, transformers.get(dm), dm.testDir());
+                    }
                 }
-            }
+                break;
         }
     }