BATCH-2089: Added ability to remap ExitStatus

This commit is contained in:
Michael Minella
2013-08-30 15:40:04 -05:00
committed by Chris Schaefer
parent 10e58baf80
commit fba258c8e5
16 changed files with 1719 additions and 134 deletions

View File

@@ -35,6 +35,7 @@ import org.springframework.batch.core.JobInterruptedException;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.job.flow.support.DefaultStateTransitionComparator;
import org.springframework.batch.core.job.flow.support.SimpleFlow;
import org.springframework.batch.core.job.flow.support.StateTransition;
import org.springframework.batch.core.job.flow.support.state.DecisionState;
@@ -49,6 +50,7 @@ import org.springframework.batch.core.step.StepSupport;
/**
* @author Dave Syer
* @author Michael Minella
*
*/
public class FlowJobTests {
@@ -422,6 +424,7 @@ public class FlowJobTests {
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.FAILED, "end2")));
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end3")));
flow.setStateTransitions(transitions);
flow.setStateTransitionComparator(new DefaultStateTransitionComparator());
job.setFlow(flow);
job.afterPropertiesSet();
job.doExecute(jobExecution);
@@ -473,6 +476,7 @@ public class FlowJobTests {
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.FAILED, "end2")));
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end3")));
flow.setStateTransitions(transitions);
flow.setStateTransitionComparator(new DefaultStateTransitionComparator());
job.setFlow(flow);
job.doExecute(jobExecution);

View File

@@ -0,0 +1,82 @@
/*
* Copyright 2013 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.support;
import static org.junit.Assert.assertEquals;
import java.util.Comparator;
import org.junit.Before;
import org.junit.Test;
import org.springframework.batch.core.job.flow.State;
import org.springframework.batch.core.job.flow.StateSupport;
public class DefaultStateTransitionComparatorTests {
private State state = new StateSupport("state1");
private Comparator<StateTransition> comparator;
@Before
public void setUp() throws Exception {
comparator = new DefaultStateTransitionComparator();
}
@Test
public void testSimpleOrderingEqual() {
StateTransition transition = StateTransition.createStateTransition(state, "CONTIN???LE", "start");
assertEquals(0, comparator.compare(transition, transition));
}
@Test
public void testSimpleOrderingMoreGeneral() {
StateTransition transition = StateTransition.createStateTransition(state, "CONTIN???LE", "start");
StateTransition other = StateTransition.createStateTransition(state, "CONTINUABLE", "start");
assertEquals(1, comparator.compare(transition, other));
assertEquals(-1, comparator.compare(other, transition));
}
@Test
public void testSimpleOrderingMostGeneral() {
StateTransition transition = StateTransition.createStateTransition(state, "*", "start");
StateTransition other = StateTransition.createStateTransition(state, "CONTINUABLE", "start");
assertEquals(1, comparator.compare(transition, other));
assertEquals(-1, comparator.compare(other, transition));
}
@Test
public void testSubstringAndWildcard() {
StateTransition transition = StateTransition.createStateTransition(state, "CONTIN*", "start");
StateTransition other = StateTransition.createStateTransition(state, "CONTINUABLE", "start");
assertEquals(1, comparator.compare(transition, other));
assertEquals(-1, comparator.compare(other, transition));
}
@Test
public void testSimpleOrderingMostToNextGeneral() {
StateTransition transition = StateTransition.createStateTransition(state, "*", "start");
StateTransition other = StateTransition.createStateTransition(state, "C?", "start");
assertEquals(1, comparator.compare(transition, other));
assertEquals(-1, comparator.compare(other, transition));
}
@Test
public void testSimpleOrderingAdjacent() {
StateTransition transition = StateTransition.createStateTransition(state, "CON*", "start");
StateTransition other = StateTransition.createStateTransition(state, "CON?", "start");
assertEquals(1, comparator.compare(transition, other));
assertEquals(-1, comparator.compare(other, transition));
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2006-2007 the original author or authors.
* Copyright 2006-2013 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.
@@ -36,7 +36,8 @@ import org.springframework.batch.core.job.flow.StateSupport;
/**
* @author Dave Syer
*
* @author Michael Minella
*
*/
public class SimpleFlowTests {
@@ -177,7 +178,8 @@ public class SimpleFlowTests {
flow.setStateTransitions(collect(StateTransition.createStateTransition(new StubState("step1"), "step2"),
StateTransition.createStateTransition(new StubState("step1"), ExitStatus.COMPLETED.getExitCode(), "step3"),
StateTransition.createEndStateTransition(new StubState("step2")), StateTransition
.createEndStateTransition(new StubState("step3"))));
.createEndStateTransition(new StubState("step3"))));
flow.setStateTransitionComparator(new DefaultStateTransitionComparator());
flow.afterPropertiesSet();
FlowExecution execution = flow.start(executor);
assertEquals(FlowExecutionStatus.COMPLETED, execution.getStatus());
@@ -224,7 +226,7 @@ public class SimpleFlowTests {
/**
* @author Dave Syer
*
*
*/
private static class StubState extends StateSupport {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2006-2007 the original author or authors.
* Copyright 2006-2013 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.
@@ -15,7 +15,6 @@
*/
package org.springframework.batch.core.job.flow.support;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
@@ -25,12 +24,13 @@ import org.springframework.batch.core.job.flow.StateSupport;
/**
* @author Dave Syer
*
* @author Michael Minella
*
*/
public class StateTransitionTests {
State state = new StateSupport("state1");
@Test
public void testIsEnd() {
StateTransition transition = StateTransition.createEndStateTransition(state, "");
@@ -74,52 +74,6 @@ public class StateTransitionTests {
assertTrue(transition.matches("CONTINUABLE"));
}
@Test
public void testSimpleOrderingEqual() {
StateTransition transition = StateTransition.createStateTransition(state, "CONTIN???LE", "start");
assertEquals(0, transition.compareTo(transition));
}
@Test
public void testSimpleOrderingMoreGeneral() {
StateTransition transition = StateTransition.createStateTransition(state, "CONTIN???LE", "start");
StateTransition other = StateTransition.createStateTransition(state, "CONTINUABLE", "start");
assertEquals(1, transition.compareTo(other));
assertEquals(-1, other.compareTo(transition));
}
@Test
public void testSimpleOrderingMostGeneral() {
StateTransition transition = StateTransition.createStateTransition(state, "*", "start");
StateTransition other = StateTransition.createStateTransition(state, "CONTINUABLE", "start");
assertEquals(1, transition.compareTo(other));
assertEquals(-1, other.compareTo(transition));
}
@Test
public void testSubstringAndWildcard() {
StateTransition transition = StateTransition.createStateTransition(state, "CONTIN*", "start");
StateTransition other = StateTransition.createStateTransition(state, "CONTINUABLE", "start");
assertEquals(1, transition.compareTo(other));
assertEquals(-1, other.compareTo(transition));
}
@Test
public void testSimpleOrderingMostToNextGeneral() {
StateTransition transition = StateTransition.createStateTransition(state, "*", "start");
StateTransition other = StateTransition.createStateTransition(state, "C?", "start");
assertEquals(1, transition.compareTo(other));
assertEquals(-1, other.compareTo(transition));
}
@Test
public void testSimpleOrderingAdjacent() {
StateTransition transition = StateTransition.createStateTransition(state, "CON*", "start");
StateTransition other = StateTransition.createStateTransition(state, "CON?", "start");
assertEquals(1, transition.compareTo(other));
assertEquals(-1, other.compareTo(transition));
}
@Test
public void testToString() {
StateTransition transition = StateTransition.createStateTransition(state, "CONTIN???LE", "start");

View File

@@ -25,6 +25,8 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import javax.batch.api.Decider;
import org.junit.Before;
import org.junit.Test;
import org.springframework.batch.core.BatchStatus;
@@ -59,7 +61,7 @@ import org.springframework.batch.core.step.StepSupport;
*/
public class JsrFlowJobTests {
private JsrFlowJob job = new JsrFlowJob();
private JsrFlowJob job;
private JobExecution jobExecution;
@@ -71,6 +73,7 @@ public class JsrFlowJobTests {
@Before
public void setUp() throws Exception {
job = new JsrFlowJob();
MapJobRepositoryFactoryBean factory = new MapJobRepositoryFactoryBean();
factory.afterPropertiesSet();
jobExecutionDao = factory.getJobExecutionDao();
@@ -431,7 +434,7 @@ public class JsrFlowJobTests {
job.setFlow(flow);
job.afterPropertiesSet();
job.doExecute(jobExecution);
StepExecution stepExecution = getStepExecution(jobExecution, "step3");
StepExecution stepExecution = getStepExecution(jobExecution, "step2");
assertEquals(ExitStatus.COMPLETED, stepExecution.getExitStatus());
assertEquals(2, jobExecution.getStepExecutions().size());
}
@@ -455,19 +458,21 @@ public class JsrFlowJobTests {
public void testDecisionFlow() throws Throwable {
SimpleFlow flow = new SimpleFlow("job");
JobExecutionDecider decider = new JobExecutionDecider() {
Decider decider = new Decider() {
@Override
public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) {
assertNotNull(stepExecution);
return new FlowExecutionStatus("SWITCH");
public String decide(javax.batch.runtime.StepExecution[] executions)
throws Exception {
assertNotNull(executions);
return "SWITCH";
}
};
List<StateTransition> transitions = new ArrayList<StateTransition>();
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "decision"));
DecisionState decision = new DecisionState(decider, "decision");
transitions.add(StateTransition.createStateTransition(decision, "step2"));
StepState decision = new StepState(new StubDecisionStep("decision", decider));
transitions.add(StateTransition.createStateTransition(decision, "SWITCH", "step3"));
transitions.add(StateTransition.createStateTransition(decision, "step2"));
StepState step2 = new StepState(new StubStep("step2"));
transitions.add(StateTransition.createStateTransition(step2, ExitStatus.COMPLETED.getExitCode(), "end0"));
transitions.add(StateTransition.createStateTransition(step2, ExitStatus.FAILED.getExitCode(), "end1"));
@@ -482,13 +487,14 @@ public class JsrFlowJobTests {
job.setFlow(flow);
job.doExecute(jobExecution);
StepExecution stepExecution = getStepExecution(jobExecution, "step3");
if (!jobExecution.getAllFailureExceptions().isEmpty()) {
throw jobExecution.getAllFailureExceptions().get(0);
}
assertEquals(BatchStatus.COMPLETED, stepExecution.getStatus());
assertEquals(2, jobExecution.getStepExecutions().size());
assertEquals(3, jobExecution.getStepExecutions().size());
}
@@ -672,7 +678,6 @@ public class JsrFlowJobTests {
assertEquals("[step1, step2]", names.toString());
}
/**
/**
* @author Dave Syer
*
@@ -692,6 +697,32 @@ public class JsrFlowJobTests {
}
/**
* @author Michael Minella
*
*/
private class StubDecisionStep extends StepSupport {
private Decider decider;
private StubDecisionStep(String name, Decider decider) {
super(name);
this.decider = decider;
}
@Override
public void execute(StepExecution stepExecution) throws JobInterruptedException {
stepExecution.setStatus(BatchStatus.COMPLETED);
try {
stepExecution.setExitStatus(new ExitStatus(decider.decide(new javax.batch.runtime.StepExecution [] {new org.springframework.batch.core.jsr.StepExecution(stepExecution)})));
} catch (Exception e) {
throw new RuntimeException(e);
}
jobRepository.update(stepExecution);
}
}
/**
* @param jobExecution
* @param stepName