From b1292a82d79f7599d1bedbed2fe4ccbd5e436743 Mon Sep 17 00:00:00 2001 From: dsyer Date: Thu, 30 Oct 2008 09:29:51 +0000 Subject: [PATCH] OPEN - issue BATCH-679: Non-sequential execution Remove generic features of flow abstraction --- .../batch/core/job/flow/AbstractState.java | 4 +- .../batch/core/job/flow/DecisionState.java | 6 +- .../batch/core/job/flow/EndState.java | 8 +-- .../batch/core/job/flow/Flow.java | 9 ++- .../core/job/flow/FlowExecutionListener.java | 29 --------- .../flow/FlowExecutionListenerSupport.java | 31 ---------- .../batch/core/job/flow/FlowJob.java | 7 +-- .../batch/core/job/flow/JobFlowExecutor.java | 6 ++ .../batch/core/job/flow/PauseState.java | 6 +- .../batch/core/job/flow/SimpleFlow.java | 62 +++++++++---------- .../batch/core/job/flow/SplitState.java | 14 ++--- .../batch/core/job/flow/State.java | 6 +- .../batch/core/job/flow/StateTransition.java | 20 +++--- .../batch/core/job/flow/StepState.java | 6 +- .../batch/core/job/flow/BasicFlowTests.java | 43 ++++++------- .../batch/core/job/flow/FlowJobTests.java | 38 ++++++------ .../core/job/flow/JobFlowExecutorSupport.java | 3 + .../batch/core/job/flow/SplitStateTests.java | 23 +++---- .../batch/core/job/flow/StateSupport.java | 4 +- .../core/job/flow/StateTransitionTests.java | 39 ++++++------ 20 files changed, 147 insertions(+), 217 deletions(-) delete mode 100644 spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/FlowExecutionListener.java delete mode 100644 spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/FlowExecutionListenerSupport.java diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/AbstractState.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/AbstractState.java index 6470ff832..c7f7cd303 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/AbstractState.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/AbstractState.java @@ -20,7 +20,7 @@ package org.springframework.batch.core.job.flow; * @author Dave Syer * */ -public abstract class AbstractState implements State { +public abstract class AbstractState implements State { private final String name; @@ -43,6 +43,6 @@ public abstract class AbstractState implements State { return getClass().getSimpleName()+": name=["+name+"]"; } - public abstract String handle(T context) throws Exception; + public abstract String handle(JobFlowExecutor executor) throws Exception; } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/DecisionState.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/DecisionState.java index badcfdb50..df045c5fb 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/DecisionState.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/DecisionState.java @@ -5,7 +5,7 @@ package org.springframework.batch.core.job.flow; * @author Dave Syer * */ -public class DecisionState extends AbstractState { +public class DecisionState extends AbstractState { private final JobExecutionDecider decider; @@ -18,8 +18,8 @@ public class DecisionState extends AbstractState { } @Override - public String handle(JobFlowExecutor context) throws Exception { - return decider.decide(context.getJobExecution(), context.getStepExecution()); + public String handle(JobFlowExecutor executor) throws Exception { + return decider.decide(executor.getJobExecution(), executor.getStepExecution()); } } \ No newline at end of file diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/EndState.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/EndState.java index 1067127ad..39e03e607 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/EndState.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/EndState.java @@ -10,7 +10,7 @@ import org.springframework.batch.core.JobExecution; * @author Dave Syer * */ -public class EndState extends AbstractState { +public class EndState extends AbstractState { private final BatchStatus status; @@ -27,11 +27,11 @@ public class EndState extends AbstractState { * is the first place we came after a restart we do nothing (otherwise the * same outcome that ended the job on the last run will occur). * - * @see State#handle(Object) + * @see State#handle(JobFlowExecutor) */ @Override - public String handle(JobFlowExecutor context) throws Exception { - JobExecution jobExecution = context.getJobExecution(); + public String handle(JobFlowExecutor executor) throws Exception { + JobExecution jobExecution = executor.getJobExecution(); // If there are no step executions, then we are at the beginning of a // restart if (!jobExecution.getStepExecutions().isEmpty()) { diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/Flow.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/Flow.java index 8cb10b5da..bb741ed79 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/Flow.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/Flow.java @@ -19,9 +19,8 @@ package org.springframework.batch.core.job.flow; /** * @author Dave Syer * - * @param */ -public interface Flow { +public interface Flow { /** * @return the name of the flow @@ -31,14 +30,14 @@ public interface Flow { /** * @throws FlowExecutionException */ - FlowExecution start(T context) throws FlowExecutionException; + FlowExecution start(JobFlowExecutor executor) throws FlowExecutionException; /** * @param stateName the name of the {@link State} to resume on - * @param context the context to be passed into each {@link State} executed + * @param executor the context to be passed into each {@link State} executed * @return a {@link FlowExecution} containing the exit status of the flow * @throws FlowExecutionException */ - FlowExecution resume(String stateName, T context) throws FlowExecutionException; + FlowExecution resume(String stateName, JobFlowExecutor executor) throws FlowExecutionException; } \ No newline at end of file diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/FlowExecutionListener.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/FlowExecutionListener.java deleted file mode 100644 index f9ddd0769..000000000 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/FlowExecutionListener.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2006-2007 the original author or authors. - * - * Licensed 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.springframework.batch.core.job.flow; - -/** - * @author Dave Syer - * - */ -public interface FlowExecutionListener { - - /** - * @param result - */ - void close(FlowExecution result); - -} diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/FlowExecutionListenerSupport.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/FlowExecutionListenerSupport.java deleted file mode 100644 index 91037f27b..000000000 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/FlowExecutionListenerSupport.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2006-2007 the original author or authors. - * - * Licensed 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.springframework.batch.core.job.flow; - -/** - * @author Dave Syer - * - */ -public class FlowExecutionListenerSupport implements FlowExecutionListener { - - /** - * No-op implementation. - * @see FlowExecutionListener#close(FlowExecution) - */ - public void close(FlowExecution result) { - } - -} diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/FlowJob.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/FlowJob.java index d1451527f..c9bd62891 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/FlowJob.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/FlowJob.java @@ -32,7 +32,7 @@ import org.springframework.util.Assert; */ public class FlowJob extends AbstractJob { - private Flow flow; + private Flow flow; /** * Create a {@link FlowJob} with null name and no flow (invalid state). @@ -52,7 +52,7 @@ public class FlowJob extends AbstractJob { * Public setter for the flow. * @param flow the flow to set */ - public void setFlow(Flow flow) { + public void setFlow(Flow flow) { this.flow = flow; } @@ -121,7 +121,7 @@ public class FlowJob extends AbstractJob { * @author Dave Syer * */ - private class SimpleJobFlowExecutor extends FlowExecutionListenerSupport implements JobFlowExecutor { + private class SimpleJobFlowExecutor implements JobFlowExecutor { private final ThreadLocal stepExecutionHolder = new ThreadLocal(); private final JobExecution execution; @@ -148,7 +148,6 @@ public class FlowJob extends AbstractJob { return stepExecutionHolder.get(); } - @Override public void close(FlowExecution result) { stepExecutionHolder.set(null); } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/JobFlowExecutor.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/JobFlowExecutor.java index 3cfdef1e6..448f8f47b 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/JobFlowExecutor.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/JobFlowExecutor.java @@ -49,5 +49,11 @@ public interface JobFlowExecutor { * @return the latest {@link StepExecution} or null if there is none */ StepExecution getStepExecution(); + + /** + * Chance to clean up resources at the end of a flow (whether it completed successfully or not). + * @param result the final {@link FlowExecution} + */ + void close(FlowExecution result); } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/PauseState.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/PauseState.java index fba8b4df2..17acd05c0 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/PauseState.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/PauseState.java @@ -7,7 +7,7 @@ import org.springframework.batch.core.JobExecution; * @author Dave Syer * */ -public class PauseState extends AbstractState { +public class PauseState extends AbstractState { /** * @param name @@ -17,9 +17,9 @@ public class PauseState extends AbstractState { } @Override - public String handle(JobFlowExecutor context) throws Exception { + public String handle(JobFlowExecutor executor) throws Exception { - JobExecution jobExecution = context.getJobExecution(); + JobExecution jobExecution = executor.getJobExecution(); // This state is just a toggle for the status of the job execution. If // not already paused we pause it, and expect the flow to respect the diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/SimpleFlow.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/SimpleFlow.java index 0d6a8e682..573b1f735 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/SimpleFlow.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/SimpleFlow.java @@ -23,6 +23,7 @@ import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; +import org.springframework.batch.core.JobExecutionException; import org.springframework.beans.factory.InitializingBean; import com.sun.org.apache.xerces.internal.impl.xpath.XPath.Step; @@ -37,17 +38,17 @@ import com.sun.org.apache.xerces.internal.impl.xpath.XPath.Step; * @author Dave Syer * */ -public class SimpleFlow implements Flow, InitializingBean { +public class SimpleFlow implements Flow, InitializingBean { - private State startState; + private State startState; - private Map>> transitionMap = new HashMap>>(); + private Map> transitionMap = new HashMap>(); - private Map> stateMap = new HashMap>(); + private Map stateMap = new HashMap(); private String startStateName; - private Collection> stateTransitions = new HashSet>(); + private Collection stateTransitions = new HashSet(); private final String name; @@ -81,7 +82,7 @@ public class SimpleFlow implements Flow, InitializingBean { * Public setter for the stateTransitions. * @param stateTransitions the stateTransitions to set */ - public void setStateTransitions(Collection> stateTransitions) { + public void setStateTransitions(Collection stateTransitions) { this.stateTransitions = stateTransitions; } @@ -96,29 +97,24 @@ public class SimpleFlow implements Flow, InitializingBean { } /** - * @see Flow#start(Object) + * @see Flow#start(JobFlowExecutor) */ - public FlowExecution start(T context) throws FlowExecutionException { + public FlowExecution start(JobFlowExecutor executor) throws FlowExecutionException { if (startState == null) { initializeTransitions(); } - State state = startState; + State state = startState; String stateName = state.getName(); - return resume(stateName, context); + return resume(stateName, executor); } /** - * @see Flow#resume(String, Object) + * @see Flow#resume(String, JobFlowExecutor) */ - public FlowExecution resume(String stateName, T context) throws FlowExecutionException { + public FlowExecution resume(String stateName, JobFlowExecutor executor) throws FlowExecutionException { String status = FlowExecution.UNKNOWN; - State state = stateMap.get(stateName); - - FlowExecutionListener listener = new FlowExecutionListenerSupport(); - if (context instanceof FlowExecutionListener) { - listener = (FlowExecutionListener)context; - } + State state = stateMap.get(stateName); // Terminate if there are no more states while (state != null) { @@ -126,10 +122,10 @@ public class SimpleFlow implements Flow, InitializingBean { stateName = state.getName(); try { - status = state.handle(context); + status = state.handle(executor); } catch (Exception e) { - listener.close(new FlowExecution(stateName, status)); + executor.close(new FlowExecution(stateName, status)); throw new FlowExecutionException(String.format("Ended flow=%s at state=%s with exception", name, stateName), e); } @@ -139,7 +135,7 @@ public class SimpleFlow implements Flow, InitializingBean { } FlowExecution result = new FlowExecution(stateName, status); - listener.close(result); + executor.close(result); return result; } @@ -148,7 +144,7 @@ public class SimpleFlow implements Flow, InitializingBean { * @return the next {@link Step} (or null if this is the end) * @throws JobExecutionException */ - private State nextState(String stateName, String status) throws FlowExecutionException { + private State nextState(String stateName, String status) throws FlowExecutionException { // Special status value indicating that a state wishes to pause // execution @@ -156,7 +152,7 @@ public class SimpleFlow implements Flow, InitializingBean { return null; } - Set> set = transitionMap.get(stateName); + Set set = transitionMap.get(stateName); if (set == null) { throw new FlowExecutionException(String.format("No transitions found in flow=%s for state=%s", getName(), @@ -164,7 +160,7 @@ public class SimpleFlow implements Flow, InitializingBean { } String next = null; - for (StateTransition stateTransition : set) { + for (StateTransition stateTransition : set) { if (stateTransition.matches(status)) { if (stateTransition.isEnd()) { // End of job @@ -199,14 +195,14 @@ public class SimpleFlow implements Flow, InitializingBean { stateMap.clear(); boolean hasEndStep = false; - for (StateTransition stateTransition : stateTransitions) { - State state = stateTransition.getState(); + for (StateTransition stateTransition : stateTransitions) { + State state = stateTransition.getState(); stateMap.put(state.getName(), state); } - for (StateTransition stateTransition : stateTransitions) { + for (StateTransition stateTransition : stateTransitions) { - State state = stateTransition.getState(); + State state = stateTransition.getState(); if (!stateTransition.isEnd()) { @@ -223,9 +219,9 @@ public class SimpleFlow implements Flow, InitializingBean { String name = state.getName(); - SortedSet> set = transitionMap.get(name); + SortedSet set = transitionMap.get(name); if (set == null) { - set = new TreeSet>(); + set = new TreeSet(); transitionMap.put(name, set); } set.add(stateTransition); @@ -253,12 +249,12 @@ public class SimpleFlow implements Flow, InitializingBean { Set nextStateNames = new HashSet(); - for (StateTransition stateTransition : stateTransitions) { + for (StateTransition stateTransition : stateTransitions) { nextStateNames.add(stateTransition.getNext()); } - for (StateTransition stateTransition : stateTransitions) { - State state = stateTransition.getState(); + for (StateTransition stateTransition : stateTransitions) { + State state = stateTransition.getState(); if (!nextStateNames.contains(state.getName())) { if (startState != null && !startState.getName().equals(state.getName())) { throw new IllegalArgumentException(String.format( diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/SplitState.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/SplitState.java index 701953780..961cb417f 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/SplitState.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/SplitState.java @@ -31,9 +31,9 @@ import org.springframework.core.task.TaskRejectedException; * @author Dave Syer * */ -public class SplitState extends AbstractState { +public class SplitState extends AbstractState { - private final Collection> flows; + private final Collection flows; private TaskExecutor taskExecutor = new SyncTaskExecutor(); @@ -42,7 +42,7 @@ public class SplitState extends AbstractState { /** * @param name */ - public SplitState(Collection> flows, String name) { + public SplitState(Collection flows, String name) { super(name); this.flows = flows; } @@ -59,18 +59,18 @@ public class SplitState extends AbstractState { * Execute the flows in parallel by passing them to the {@link TaskExecutor} * and wait for all of them to finish before proceeding. * - * @see State#handle(Object) + * @see State#handle(JobFlowExecutor) */ @Override - public String handle(final T context) throws Exception { + public String handle(final JobFlowExecutor executor) throws Exception { Collection> tasks = new ArrayList>(); - for (final Flow flow : flows) { + for (final Flow flow : flows) { final FutureTask task = new FutureTask(new Callable() { public FlowExecution call() throws Exception { - return flow.start(context); + return flow.start(executor); } }); diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/State.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/State.java index 0ebce34ef..d8192e22d 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/State.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/State.java @@ -20,7 +20,7 @@ package org.springframework.batch.core.job.flow; * @author Dave Syer * */ -public interface State { +public interface State { /** * The name of the state. Should be unique within a flow. @@ -38,10 +38,10 @@ public interface State { * {@link State} instances, so implementations should be careful that the * context is thread safe, or used in a thread safe manner. * - * @param context the context passed in by the caller + * @param executor the context passed in by the caller * @return a status for the execution * @throws Exception if anything goes wrong */ - String handle(T context) throws Exception; + String handle(JobFlowExecutor executor) throws Exception; } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/StateTransition.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/StateTransition.java index 844ed511b..21f67f2d6 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/StateTransition.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/StateTransition.java @@ -27,9 +27,9 @@ import org.springframework.util.StringUtils; * @author Dave Syer * */ -public class StateTransition implements Comparable> { +public class StateTransition implements Comparable { - private final State state; + private final State state; private final String pattern; @@ -43,7 +43,7 @@ public class StateTransition implements Comparable> { * @param state the {@link State} used to generate the outcome for this * transition */ - public static StateTransition createEndStateTransition(State state) { + public static StateTransition createEndStateTransition(State state) { return createStateTransition(state, null, null); } @@ -57,7 +57,7 @@ public class StateTransition implements Comparable> { * @param pattern the pattern to match in the exit status of the * {@link State} */ - public static StateTransition createEndStateTransition(State state, String pattern) { + public static StateTransition createEndStateTransition(State state, String pattern) { return createStateTransition(state, pattern, null); } @@ -69,7 +69,7 @@ public class StateTransition implements Comparable> { * transition * @param next the name of the next {@link State} to execute */ - public static StateTransition createStateTransition(State state, String next) { + public static StateTransition createStateTransition(State state, String next) { return createStateTransition(state, null, next); } @@ -83,11 +83,11 @@ public class StateTransition implements Comparable> { * {@link State} * @param next the name of the next {@link State} to execute */ - public static StateTransition createStateTransition(State state, String pattern, String next) { - return new StateTransition(state, pattern, next); + public static StateTransition createStateTransition(State state, String pattern, String next) { + return new StateTransition(state, pattern, next); } - private StateTransition(State state, String pattern, String next) { + private StateTransition(State state, String pattern, String next) { super(); if (!StringUtils.hasText(pattern)) { this.pattern = "*"; @@ -103,7 +103,7 @@ public class StateTransition implements Comparable> { * Public getter for the State. * @return the State */ - public State getState() { + public State getState() { return state; } @@ -142,7 +142,7 @@ public class StateTransition implements Comparable> { * fo? > foo. * @see Comparable#compareTo(Object) */ - public int compareTo(StateTransition other) { + public int compareTo(StateTransition other) { String value = other.pattern; if (pattern.equals(value)) { return 0; diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/StepState.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/StepState.java index c17251ac7..f20f37df1 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/StepState.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/StepState.java @@ -9,7 +9,7 @@ import org.springframework.batch.core.Step; * @author Dave Syer * */ -public class StepState extends AbstractState { +public class StepState extends AbstractState { private final Step step; @@ -22,8 +22,8 @@ public class StepState extends AbstractState { } @Override - public String handle(JobFlowExecutor context) throws Exception { - return context.executeStep(step); + public String handle(JobFlowExecutor executor) throws Exception { + return executor.executeStep(step); } } \ No newline at end of file diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/BasicFlowTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/BasicFlowTests.java index 90307860b..c950db67e 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/BasicFlowTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/BasicFlowTests.java @@ -25,11 +25,6 @@ import java.util.Collections; import java.util.List; import org.junit.Test; -import org.springframework.batch.core.job.flow.FlowExecution; -import org.springframework.batch.core.job.flow.FlowExecutionException; -import org.springframework.batch.core.job.flow.FlowExecutionListenerSupport; -import org.springframework.batch.core.job.flow.SimpleFlow; -import org.springframework.batch.core.job.flow.StateTransition; /** * @author Dave Syer @@ -37,34 +32,34 @@ import org.springframework.batch.core.job.flow.StateTransition; */ public class BasicFlowTests { - private SimpleFlow flow = new SimpleFlow("job"); + private SimpleFlow flow = new SimpleFlow("job"); - private Object executor = "data"; + private JobFlowExecutor executor = new JobFlowExecutorSupport(); @Test(expected = IllegalArgumentException.class) public void testEmptySteps() throws Exception { - flow.setStateTransitions(Collections.> emptySet()); + flow.setStateTransitions(Collections. emptySet()); flow.afterPropertiesSet(); } @Test(expected = IllegalArgumentException.class) public void testNoNextStepSpecified() throws Exception { - flow.setStateTransitions(Collections.singleton(StateTransition.createStateTransition(new StateSupport( + flow.setStateTransitions(Collections.singleton(StateTransition.createStateTransition(new StateSupport( "step"), "foo"))); flow.afterPropertiesSet(); } @Test(expected = IllegalArgumentException.class) public void testNoStartStep() throws Exception { - flow.setStateTransitions(collect(StateTransition.createStateTransition(new StateSupport("step"), + flow.setStateTransitions(collect(StateTransition.createStateTransition(new StateSupport("step"), FlowExecution.FAILED, "step"), StateTransition - .createEndStateTransition(new StateSupport("step")))); + .createEndStateTransition(new StateSupport("step")))); flow.afterPropertiesSet(); } @Test(expected = IllegalArgumentException.class) public void testNoEndStep() throws Exception { - flow.setStateTransitions(Collections.singleton(StateTransition.createStateTransition(new StateSupport( + flow.setStateTransitions(Collections.singleton(StateTransition.createStateTransition(new StateSupport( "step"), FlowExecution.FAILED, "step"))); flow.setStartStateName("step"); flow.afterPropertiesSet(); @@ -109,7 +104,7 @@ public class BasicFlowTests { .singleton(StateTransition.createEndStateTransition(new StubState("step1")))); flow.afterPropertiesSet(); final List list = new ArrayList(); - executor = new FlowExecutionListenerSupport() { + executor = new JobFlowExecutorSupport() { @Override public void close(FlowExecution result) { list.add(result); @@ -156,7 +151,7 @@ public class BasicFlowTests { public void testFailedStep() throws Exception { flow.setStateTransitions(collect(StateTransition.createStateTransition(new StubState("step1") { @Override - public String handle(Object executor) { + public String handle(JobFlowExecutor executor) { return FlowExecution.FAILED; } }, "step2"), StateTransition.createEndStateTransition(new StubState("step2")))); @@ -185,7 +180,7 @@ public class BasicFlowTests { private boolean paused = false; @Override - public String handle(Object executor) throws Exception { + public String handle(JobFlowExecutor executor) throws Exception { if (!paused) { paused = true; return FlowExecution.PAUSED; @@ -204,23 +199,23 @@ public class BasicFlowTests { assertEquals("step3", execution.getName()); } - private Collection> collect(StateTransition s1, StateTransition s2) { - Collection> list = new ArrayList>(); + private Collection collect(StateTransition s1, StateTransition s2) { + Collection list = new ArrayList(); list.add(s1); list.add(s2); return list; } - private Collection> collect(StateTransition s1, StateTransition s2, - StateTransition s3) { - Collection> list = collect(s1, s2); + private Collection collect(StateTransition s1, StateTransition s2, + StateTransition s3) { + Collection list = collect(s1, s2); list.add(s3); return list; } - private Collection> collect(StateTransition s1, StateTransition s2, - StateTransition s3, StateTransition s4) { - Collection> list = collect(s1, s2, s3); + private Collection collect(StateTransition s1, StateTransition s2, + StateTransition s3, StateTransition s4) { + Collection list = collect(s1, s2, s3); list.add(s4); return list; } @@ -229,7 +224,7 @@ public class BasicFlowTests { * @author Dave Syer * */ - private static class StubState extends StateSupport { + private static class StubState extends StateSupport { /** * @param string diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/FlowJobTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/FlowJobTests.java index 4668ada8b..5a945254e 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/FlowJobTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/FlowJobTests.java @@ -63,8 +63,8 @@ public class FlowJobTests { @Test public void testTwoSteps() throws Exception { - SimpleFlow flow = new SimpleFlow("job"); - Collection> transitions = new ArrayList>(); + SimpleFlow flow = new SimpleFlow("job"); + Collection transitions = new ArrayList(); transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "step2")); transitions.add(StateTransition.createEndStateTransition(new StepState(new StubStep("step2")))); flow.setStateTransitions(transitions); @@ -77,8 +77,8 @@ public class FlowJobTests { @Test public void testFailedStep() throws Exception { - SimpleFlow flow = new SimpleFlow("job"); - Collection> transitions = new ArrayList>(); + SimpleFlow flow = new SimpleFlow("job"); + Collection transitions = new ArrayList(); transitions.add(StateTransition.createStateTransition(new StepState(new StepSupport("step1") { @Override public void execute(StepExecution stepExecution) throws JobInterruptedException, @@ -99,8 +99,8 @@ public class FlowJobTests { @Test public void testStoppingStep() throws Exception { - SimpleFlow flow = new SimpleFlow("job"); - Collection> transitions = new ArrayList>(); + SimpleFlow flow = new SimpleFlow("job"); + Collection transitions = new ArrayList(); transitions.add(StateTransition.createStateTransition(new StepState(new StepSupport("step1") { @Override public void execute(StepExecution stepExecution) throws JobInterruptedException, @@ -124,8 +124,8 @@ public class FlowJobTests { @Test public void testEndStateStopped() throws Exception { - SimpleFlow flow = new SimpleFlow("job"); - Collection> transitions = new ArrayList>(); + SimpleFlow flow = new SimpleFlow("job"); + Collection transitions = new ArrayList(); transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "end")); transitions.add(StateTransition.createStateTransition(new EndState(BatchStatus.STOPPED, "end"), "step2")); transitions.add(StateTransition.createEndStateTransition(new StepState(new StubStep("step2")))); @@ -143,8 +143,8 @@ public class FlowJobTests { } public void testEndStateFailed() throws Exception { - SimpleFlow flow = new SimpleFlow("job"); - Collection> transitions = new ArrayList>(); + SimpleFlow flow = new SimpleFlow("job"); + Collection transitions = new ArrayList(); transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "end")); transitions.add(StateTransition.createStateTransition(new EndState(BatchStatus.FAILED, "end"), "step2")); transitions.add(StateTransition.createEndStateTransition(new StepState(new StubStep("step2")))); @@ -158,8 +158,8 @@ public class FlowJobTests { @Test public void testEndStateStoppedWithRestart() throws Exception { - SimpleFlow flow = new SimpleFlow("job"); - Collection> transitions = new ArrayList>(); + SimpleFlow flow = new SimpleFlow("job"); + Collection transitions = new ArrayList(); transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "end")); transitions.add(StateTransition.createStateTransition(new EndState(BatchStatus.STOPPED, "end"), "step2")); transitions.add(StateTransition.createEndStateTransition(new StepState(new StubStep("step2")))); @@ -181,8 +181,8 @@ public class FlowJobTests { @Test public void testBranching() throws Exception { - SimpleFlow flow = new SimpleFlow("job"); - Collection> transitions = new ArrayList>(); + SimpleFlow flow = new SimpleFlow("job"); + Collection transitions = new ArrayList(); transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "step2")); transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "COMPLETED", "step3")); @@ -199,7 +199,7 @@ public class FlowJobTests { @Test public void testBasicFlow() throws Throwable { - SimpleFlow flow = new SimpleFlow("job"); + SimpleFlow flow = new SimpleFlow("job"); Step step = new StubStep("step"); flow.setStateTransitions(Collections.singleton(StateTransition.createEndStateTransition(new StepState(step), "*"))); @@ -214,7 +214,7 @@ public class FlowJobTests { @Test public void testDecisionFlow() throws Throwable { - SimpleFlow flow = new SimpleFlow("job"); + SimpleFlow flow = new SimpleFlow("job"); JobExecutionDecider decider = new JobExecutionDecider() { public String decide(JobExecution jobExecution, StepExecution stepExecution) { assertNotNull(stepExecution); @@ -222,7 +222,7 @@ public class FlowJobTests { } }; - Collection> transitions = new ArrayList>(); + Collection transitions = new ArrayList(); transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "*", "decision")); transitions.add(StateTransition.createStateTransition(new DecisionState(decider, "decision"), "*", "step2")); transitions.add(StateTransition @@ -246,8 +246,8 @@ public class FlowJobTests { @Test public void testPauseFlow() throws Throwable { - SimpleFlow flow = new SimpleFlow("job"); - Collection> transitions = new ArrayList>(); + SimpleFlow flow = new SimpleFlow("job"); + Collection transitions = new ArrayList(); transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "*", "pause")); transitions.add(StateTransition.createStateTransition(new PauseState("pause"), "*", "step2")); transitions.add(StateTransition.createEndStateTransition(new StepState(new StubStep("step2")), "*")); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/JobFlowExecutorSupport.java b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/JobFlowExecutorSupport.java index 5c0b7290c..fda6695e5 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/JobFlowExecutorSupport.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/JobFlowExecutorSupport.java @@ -41,4 +41,7 @@ public class JobFlowExecutorSupport implements JobFlowExecutor { return null; } + public void close(FlowExecution result) { + } + } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/SplitStateTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/SplitStateTests.java index bde1d4576..b7b7e2375 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/SplitStateTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/SplitStateTests.java @@ -22,9 +22,6 @@ import java.util.Collection; import org.easymock.EasyMock; import org.junit.Test; -import org.springframework.batch.core.job.flow.Flow; -import org.springframework.batch.core.job.flow.FlowExecution; -import org.springframework.batch.core.job.flow.SplitState; import org.springframework.core.task.SimpleAsyncTaskExecutor; @@ -37,15 +34,13 @@ public class SplitStateTests { @Test public void testBasicHandling() throws Exception { - Collection> flows = new ArrayList>(); - @SuppressWarnings("unchecked") - Flow flow1 = EasyMock.createMock(Flow.class); - @SuppressWarnings("unchecked") - Flow flow2 = EasyMock.createMock(Flow.class); + Collection flows = new ArrayList(); + Flow flow1 = EasyMock.createMock(Flow.class); + Flow flow2 = EasyMock.createMock(Flow.class); flows.add(flow1); flows.add(flow2); - SplitState state = new SplitState(flows, "foo"); + SplitState state = new SplitState(flows, "foo"); EasyMock.expect(flow1.start(null)).andReturn(new FlowExecution("step1", FlowExecution.COMPLETED)); EasyMock.expect(flow2.start(null)).andReturn(new FlowExecution("step1", FlowExecution.COMPLETED)); @@ -61,15 +56,13 @@ public class SplitStateTests { @Test public void testConcurrentHandling() throws Exception { - Collection> flows = new ArrayList>(); - @SuppressWarnings("unchecked") - Flow flow1 = EasyMock.createMock(Flow.class); - @SuppressWarnings("unchecked") - Flow flow2 = EasyMock.createMock(Flow.class); + Collection flows = new ArrayList(); + Flow flow1 = EasyMock.createMock(Flow.class); + Flow flow2 = EasyMock.createMock(Flow.class); flows.add(flow1); flows.add(flow2); - SplitState state = new SplitState(flows, "foo"); + SplitState state = new SplitState(flows, "foo"); state.setTaskExecutor(new SimpleAsyncTaskExecutor()); EasyMock.expect(flow1.start(null)).andReturn(new FlowExecution("step1", FlowExecution.COMPLETED)); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/StateSupport.java b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/StateSupport.java index f72c82014..360807f61 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/StateSupport.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/StateSupport.java @@ -25,7 +25,7 @@ import org.springframework.batch.core.job.flow.State; * @author Dave Syer * */ -public class StateSupport extends AbstractState { +public class StateSupport extends AbstractState { /** * @param name @@ -35,7 +35,7 @@ public class StateSupport extends AbstractState { } @Override - public String handle(T context) throws Exception { + public String handle(JobFlowExecutor executor) throws Exception { return FlowExecution.COMPLETED; } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/StateTransitionTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/StateTransitionTests.java index 0ac7301d7..60ea1f255 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/StateTransitionTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/StateTransitionTests.java @@ -20,7 +20,6 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import org.junit.Test; -import org.springframework.batch.core.job.flow.StateTransition; /** * @author Dave Syer @@ -30,96 +29,96 @@ public class StateTransitionTests { @Test public void testIsEnd() { - StateTransition transition = StateTransition.createEndStateTransition(null, ""); + StateTransition transition = StateTransition.createEndStateTransition(null, ""); assertTrue(transition.isEnd()); assertNull(transition.getNext()); } @Test public void testMatchesStar() { - StateTransition transition = StateTransition.createStateTransition(null, "*", "start"); + StateTransition transition = StateTransition.createStateTransition(null, "*", "start"); assertTrue(transition.matches("CONTINUABLE")); } @Test public void testMatchesNull() { - StateTransition transition = StateTransition.createStateTransition(null, null, "start"); + StateTransition transition = StateTransition.createStateTransition(null, null, "start"); assertTrue(transition.matches("CONTINUABLE")); } @Test public void testMatchesEmpty() { - StateTransition transition = StateTransition.createStateTransition(null, "", "start"); + StateTransition transition = StateTransition.createStateTransition(null, "", "start"); assertTrue(transition.matches("CONTINUABLE")); } @Test public void testMatchesExact() { - StateTransition transition = StateTransition.createStateTransition(null, "CONTINUABLE", "start"); + StateTransition transition = StateTransition.createStateTransition(null, "CONTINUABLE", "start"); assertTrue(transition.matches("CONTINUABLE")); } @Test public void testMatchesWildcard() { - StateTransition transition = StateTransition.createStateTransition(null, "CONTIN*", "start"); + StateTransition transition = StateTransition.createStateTransition(null, "CONTIN*", "start"); assertTrue(transition.matches("CONTINUABLE")); } @Test public void testMatchesPlaceholder() { - StateTransition transition = StateTransition.createStateTransition(null, "CONTIN???LE", "start"); + StateTransition transition = StateTransition.createStateTransition(null, "CONTIN???LE", "start"); assertTrue(transition.matches("CONTINUABLE")); } @Test public void testSimpleOrderingEqual() { - StateTransition transition = StateTransition.createStateTransition(null, "CONTIN???LE", "start"); + StateTransition transition = StateTransition.createStateTransition(null, "CONTIN???LE", "start"); assertEquals(0, transition.compareTo(transition)); } @Test public void testSimpleOrderingMoreGeneral() { - StateTransition transition = StateTransition.createStateTransition(null, "CONTIN???LE", "start"); - StateTransition other = StateTransition.createStateTransition(null, "CONTINUABLE", "start"); + StateTransition transition = StateTransition.createStateTransition(null, "CONTIN???LE", "start"); + StateTransition other = StateTransition.createStateTransition(null, "CONTINUABLE", "start"); assertEquals(1, transition.compareTo(other)); assertEquals(-1, other.compareTo(transition)); } @Test public void testSimpleOrderingMostGeneral() { - StateTransition transition = StateTransition.createStateTransition(null, "*", "start"); - StateTransition other = StateTransition.createStateTransition(null, "CONTINUABLE", "start"); + StateTransition transition = StateTransition.createStateTransition(null, "*", "start"); + StateTransition other = StateTransition.createStateTransition(null, "CONTINUABLE", "start"); assertEquals(1, transition.compareTo(other)); assertEquals(-1, other.compareTo(transition)); } @Test public void testSubstringAndWildcard() { - StateTransition transition = StateTransition.createStateTransition(null, "CONTIN*", "start"); - StateTransition other = StateTransition.createStateTransition(null, "CONTINUABLE", "start"); + StateTransition transition = StateTransition.createStateTransition(null, "CONTIN*", "start"); + StateTransition other = StateTransition.createStateTransition(null, "CONTINUABLE", "start"); assertEquals(1, transition.compareTo(other)); assertEquals(-1, other.compareTo(transition)); } @Test public void testSimpleOrderingMostToNextGeneral() { - StateTransition transition = StateTransition.createStateTransition(null, "*", "start"); - StateTransition other = StateTransition.createStateTransition(null, "C?", "start"); + StateTransition transition = StateTransition.createStateTransition(null, "*", "start"); + StateTransition other = StateTransition.createStateTransition(null, "C?", "start"); assertEquals(1, transition.compareTo(other)); assertEquals(-1, other.compareTo(transition)); } @Test public void testSimpleOrderingAdjacent() { - StateTransition transition = StateTransition.createStateTransition(null, "CON*", "start"); - StateTransition other = StateTransition.createStateTransition(null, "CON?", "start"); + StateTransition transition = StateTransition.createStateTransition(null, "CON*", "start"); + StateTransition other = StateTransition.createStateTransition(null, "CON?", "start"); assertEquals(1, transition.compareTo(other)); assertEquals(-1, other.compareTo(transition)); } @Test public void testToString() { - StateTransition transition = StateTransition.createStateTransition(null, "CONTIN???LE", "start"); + StateTransition transition = StateTransition.createStateTransition(null, "CONTIN???LE", "start"); String string = transition.toString(); assertTrue("Wrong string: " + string, string.contains("Transition")); assertTrue("Wrong string: " + string, string.contains("start"));