diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/SimpleFlowFactoryBean.java b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/SimpleFlowFactoryBean.java index 99ad573e2..048686c41 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/SimpleFlowFactoryBean.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/SimpleFlowFactoryBean.java @@ -173,7 +173,7 @@ public class SimpleFlowFactoryBean implements FactoryBean, InitializingBean { * @author Dave Syer * */ - private static class DelegateState extends AbstractState implements FlowHolder { + public static class DelegateState extends AbstractState implements FlowHolder { private final State state; private DelegateState(String name, State state) { @@ -181,6 +181,10 @@ public class SimpleFlowFactoryBean implements FactoryBean, InitializingBean { this.state = state; } + public State getState() { + return this.state; + } + @Override public boolean isEndState() { return state.isEndState(); diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/support/SimpleFlow.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/support/SimpleFlow.java index 9e09595a5..b2b9e2a82 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/support/SimpleFlow.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/support/SimpleFlow.java @@ -79,6 +79,10 @@ public class SimpleFlow implements Flow, InitializingBean { this.name = name; } + public State getStartState() { + return this.startState; + } + /** * Get the name for this flow. * @@ -229,7 +233,7 @@ public class SimpleFlow implements Flow, InitializingBean { } - private boolean isFlowContinued(State state, FlowExecutionStatus status, StepExecution stepExecution) { + protected boolean isFlowContinued(State state, FlowExecutionStatus status, StepExecution stepExecution) { boolean continued = true; continued = state != null && status!=FlowExecutionStatus.STOPPED; diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/jsr/job/flow/JsrFlowJob.java b/spring-batch-core/src/main/java/org/springframework/batch/core/jsr/job/flow/JsrFlowJob.java index 0505e56a5..8374b3ebf 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/jsr/job/flow/JsrFlowJob.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/jsr/job/flow/JsrFlowJob.java @@ -19,12 +19,20 @@ import org.springframework.batch.core.ExitStatus; import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.JobExecutionException; import org.springframework.batch.core.JobInterruptedException; +import org.springframework.batch.core.Step; +import org.springframework.batch.core.configuration.xml.SimpleFlowFactoryBean.DelegateState; import org.springframework.batch.core.explore.JobExplorer; import org.springframework.batch.core.job.AbstractJob; +import org.springframework.batch.core.job.flow.Flow; import org.springframework.batch.core.job.flow.FlowExecutionException; import org.springframework.batch.core.job.flow.FlowJob; import org.springframework.batch.core.job.flow.JobFlowExecutor; +import org.springframework.batch.core.job.flow.State; +import org.springframework.batch.core.job.flow.support.state.FlowState; +import org.springframework.batch.core.job.flow.support.state.StepState; import org.springframework.batch.core.jsr.job.DefaultStepHandler; +import org.springframework.batch.core.jsr.job.flow.support.DefaultFlow; +import org.springframework.batch.core.jsr.step.DecisionStep; import org.springframework.batch.core.launch.NoSuchJobException; import org.springframework.batch.core.launch.support.ExitCodeMapper; @@ -66,6 +74,11 @@ public class JsrFlowJob extends FlowJob { try { JobFlowExecutor executor = new JsrFlowExecutor(getJobRepository(), new DefaultStepHandler(getJobRepository(), jobExplorer), execution); + + State startState = ((DefaultFlow)flow).getStartState(); + + validateFirstStep(startState); + executor.updateJobExecutionStatus(flow.start(executor).getStatus()); } catch (FlowExecutionException e) { @@ -76,6 +89,28 @@ public class JsrFlowJob extends FlowJob { } } + private void validateFirstStep(State startState) + throws JobExecutionException { + while(true) { + if(startState instanceof DelegateState) { + startState = ((DelegateState) startState).getState(); + } else if(startState instanceof StepState) { + String stepName = startState.getName().substring(startState.getName().indexOf(".") + 1, startState.getName().length()); + Step step = ((StepState) startState).getStep(stepName); + if(step instanceof DecisionStep) { + throw new JobExecutionException("Invalid first step"); + } else { + break; + } + } else if(startState instanceof FlowState){ + Flow firstFlow = ((FlowState) startState).getFlows().iterator().next(); + startState = firstFlow.getStates().iterator().next(); + } else { + break; + } + } + } + /** * Default mapping from throwable to {@link ExitStatus}. * diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/jsr/job/flow/support/DefaultFlow.java b/spring-batch-core/src/main/java/org/springframework/batch/core/jsr/job/flow/support/DefaultFlow.java index 450b5066e..d09ef3a37 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/jsr/job/flow/support/DefaultFlow.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/jsr/job/flow/support/DefaultFlow.java @@ -20,12 +20,14 @@ import java.util.Set; import org.springframework.batch.core.JobExecutionException; import org.springframework.batch.core.Step; import org.springframework.batch.core.StepExecution; +import org.springframework.batch.core.configuration.xml.SimpleFlowFactoryBean.DelegateState; import org.springframework.batch.core.job.flow.Flow; import org.springframework.batch.core.job.flow.FlowExecutionException; import org.springframework.batch.core.job.flow.FlowExecutionStatus; import org.springframework.batch.core.job.flow.State; 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.StepState; import org.springframework.batch.item.ExecutionContext; import org.springframework.util.StringUtils; @@ -41,6 +43,8 @@ import org.springframework.util.StringUtils; */ public class DefaultFlow extends SimpleFlow { + private StepState currentStep; + /** * @param name name of the flow */ @@ -48,6 +52,27 @@ public class DefaultFlow extends SimpleFlow { super(name); } + public String getMostRecentStepName() { + if(currentStep != null) { + return currentStep.getStep().getName(); + } else { + return null; + } + } + + @Override + protected boolean isFlowContinued(State state, FlowExecutionStatus status, StepExecution stepExecution) { + if(state instanceof DelegateState) { + state = ((DelegateState) state).getState(); + } + + if(state instanceof StepState) { + currentStep = (StepState) state; + } + + return super.isFlowContinued(state, status, stepExecution); + } + @Override protected State nextState(String stateName, FlowExecutionStatus status, StepExecution stepExecution) throws FlowExecutionException { State nextState = findState(stateName, status, stepExecution); diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/jsr/job/flow/support/state/SplitState.java b/spring-batch-core/src/main/java/org/springframework/batch/core/jsr/job/flow/support/state/SplitState.java index 94d6aafa1..2dbb65548 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/jsr/job/flow/support/state/SplitState.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/jsr/job/flow/support/state/SplitState.java @@ -15,13 +15,16 @@ */ package org.springframework.batch.core.jsr.job.flow.support.state; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.job.flow.Flow; import org.springframework.batch.core.job.flow.FlowExecution; import org.springframework.batch.core.job.flow.FlowExecutionStatus; import org.springframework.batch.core.job.flow.FlowExecutor; +import org.springframework.batch.core.jsr.job.flow.support.DefaultFlow; /** * JSR-352 states that artifacts cannot set the ExitStatus from within a split for a job. Because @@ -50,6 +53,19 @@ public class SplitState extends org.springframework.batch.core.job.flow.support. */ @Override protected FlowExecutionStatus doAggregation(Collection results, FlowExecutor executor) { + List stepNames = new ArrayList(); + + for (Flow curFlow : getFlows()) { + DefaultFlow flow = (DefaultFlow) curFlow; + if(flow.getMostRecentStepName() != null) { + stepNames.add(flow.getMostRecentStepName()); + } + } + + if(!stepNames.isEmpty()) { + executor.getJobExecution().getExecutionContext().put("batch.splitLastSteps", stepNames); + } + executor.getJobExecution().setExitStatus(null); return super.doAggregation(results, executor); diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/jsr/step/DecisionStep.java b/spring-batch-core/src/main/java/org/springframework/batch/core/jsr/step/DecisionStep.java index dbc84b3be..4be356f6c 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/jsr/step/DecisionStep.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/jsr/step/DecisionStep.java @@ -15,15 +15,17 @@ */ package org.springframework.batch.core.jsr.step; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; import javax.batch.api.Decider; -import javax.batch.operations.BatchRuntimeException; import org.springframework.batch.core.ExitStatus; import org.springframework.batch.core.Step; import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.step.AbstractStep; +import org.springframework.batch.item.ExecutionContext; /** * Implements a {@link Step} to follow the rules for a decision state @@ -47,34 +49,41 @@ public class DecisionStep extends AbstractStep { @Override protected void doExecute(StepExecution stepExecution) throws Exception { - Collection stepExecutions = stepExecution.getJobExecution().getStepExecutions(); + ExecutionContext executionContext = stepExecution.getJobExecution().getExecutionContext(); + List stepExecutions = new ArrayList(); - // Used to determine if this step is the first step in the job (not allowed) - if(stepExecutions.size() == 1) { - stepExecution.setTerminateOnly(); - throw new BatchRuntimeException("Decision not a valid first step"); - } + if(executionContext.containsKey("batch.splitLastSteps")) { + List stepNames = (List) executionContext.get("batch.splitLastSteps"); - // Currently does not support splits - StepExecution lastExecution = null; + for (String stepName : stepNames) { + StepExecution curStepExecution = getJobRepository().getLastStepExecution(stepExecution.getJobExecution().getJobInstance(), stepName); + stepExecutions.add(new org.springframework.batch.core.jsr.StepExecution(curStepExecution)); + } + } else { + Collection currentRunStepExecutions = stepExecution.getJobExecution().getStepExecutions(); - if(stepExecutions != null) { - for (StepExecution curStepExecution : stepExecutions) { - if(lastExecution == null || (curStepExecution.getEndTime() != null && curStepExecution.getEndTime().after(lastExecution.getEndTime()))) { - lastExecution = curStepExecution; + StepExecution lastExecution = null; + + if(stepExecutions != null) { + for (StepExecution curStepExecution : currentRunStepExecutions) { + if(lastExecution == null || (curStepExecution.getEndTime() != null && curStepExecution.getEndTime().after(lastExecution.getEndTime()))) { + lastExecution = curStepExecution; + } } + + stepExecutions.add(new org.springframework.batch.core.jsr.StepExecution(lastExecution)); } } - javax.batch.runtime.StepExecution [] executions = new org.springframework.batch.core.jsr.StepExecution[1]; - - executions[0] = new org.springframework.batch.core.jsr.StepExecution(lastExecution); - try { - ExitStatus exitStatus = new ExitStatus(decider.decide(executions)); + ExitStatus exitStatus = new ExitStatus(decider.decide(stepExecutions.toArray(new javax.batch.runtime.StepExecution[0]))); stepExecution.getJobExecution().setExitStatus(exitStatus); stepExecution.setExitStatus(exitStatus); + + if(executionContext.containsKey("batch.splitLastSteps")) { + executionContext.remove("batch.splitLastSteps"); + } } catch (Exception e) { stepExecution.setTerminateOnly(); stepExecution.addFailureException(e); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/jsr/step/DecisionStepTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/jsr/step/DecisionStepTests.java index c2609248e..2e92ef395 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/jsr/step/DecisionStepTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/jsr/step/DecisionStepTests.java @@ -1,120 +1,118 @@ package org.springframework.batch.core.jsr.step; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; +import static org.springframework.batch.core.jsr.JsrTestUtils.runJob; import java.util.List; +import java.util.Properties; import javax.batch.api.Decider; +import javax.batch.runtime.BatchRuntime; +import javax.batch.runtime.BatchStatus; +import javax.batch.runtime.JobExecution; import javax.batch.runtime.StepExecution; -import org.junit.Ignore; +import org.junit.Before; import org.junit.Test; -import org.springframework.batch.core.BatchStatus; -import org.springframework.batch.core.Job; -import org.springframework.batch.core.JobExecution; -import org.springframework.batch.core.JobParameters; -import org.springframework.batch.core.launch.JobLauncher; +import org.springframework.batch.core.explore.JobExplorer; +import org.springframework.beans.factory.access.BeanFactoryLocator; +import org.springframework.beans.factory.access.BeanFactoryReference; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; import org.springframework.context.ApplicationContext; -import org.springframework.context.support.GenericXmlApplicationContext; +import org.springframework.context.access.ContextSingletonBeanFactoryLocator; -@SuppressWarnings("resource") public class DecisionStepTests { + private static ApplicationContext baseContext; + + public JobExplorer jobExplorer; + + @Before + public void setUp() { + StepExecutionCountingDecider.previousStepCount = 0; + + if(jobExplorer == null) { + BeanFactoryLocator beanFactoryLocactor = ContextSingletonBeanFactoryLocator.getInstance(); + BeanFactoryReference ref = beanFactoryLocactor.useBeanFactory("baseContext"); + baseContext = (ApplicationContext) ref.getFactory(); + + baseContext.getAutowireCapableBeanFactory().autowireBeanProperties(this, + AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, false); + } + } + + public void setJobExplorer(JobExplorer jobExplorer) { + this.jobExplorer = jobExplorer; + } + @Test public void testDecisionAsFirstStepOfJob() throws Exception { - ApplicationContext context = new GenericXmlApplicationContext("classpath:/org/springframework/batch/core/jsr/step/DecisionStepTests-decisionAsFirstStep-context.xml"); - - JobLauncher launcher = context.getBean(JobLauncher.class); - Job job = context.getBean(Job.class); - - JobExecution execution = launcher.run(job, new JobParameters()); - assertEquals(BatchStatus.FAILED, execution.getStatus()); - assertEquals(1, execution.getStepExecutions().size()); + JobExecution execution = runJob("DecisionStepTests-decisionAsFirstStep-context", new Properties(), 10000l); + assertEquals(BatchStatus.FAILED, execution.getBatchStatus()); + assertEquals(0, BatchRuntime.getJobOperator().getStepExecutions(execution.getExecutionId()).size()); } @Test public void testDecisionThrowsException() throws Exception { - ApplicationContext context = new GenericXmlApplicationContext("classpath:/org/springframework/batch/core/jsr/step/DecisionStepTests-decisionThrowsException-context.xml"); - - JobLauncher launcher = context.getBean(JobLauncher.class); - Job job = context.getBean(Job.class); - - JobExecution execution = launcher.run(job, new JobParameters()); - assertEquals(BatchStatus.FAILED, execution.getStatus()); - assertEquals(2, execution.getStepExecutions().size()); - List allFailureExceptions = execution.getAllFailureExceptions(); - - boolean found = false; - for (Throwable throwable : allFailureExceptions) { - if(throwable.getMessage().equals("Expected")) { - found = true; - break; - } - } - - if(!found) { - fail(); - } + JobExecution execution = runJob("DecisionStepTests-decisionThrowsException-context", new Properties(), 10000l); + assertEquals(BatchStatus.FAILED, execution.getBatchStatus()); + assertEquals(2, BatchRuntime.getJobOperator().getStepExecutions(execution.getExecutionId()).size()); } @Test public void testDecisionValidExitStatus() throws Exception { - ApplicationContext context = new GenericXmlApplicationContext("classpath:/org/springframework/batch/core/jsr/step/DecisionStepTests-decisionValidExitStatus-context.xml"); - - JobLauncher launcher = context.getBean(JobLauncher.class); - Job job = context.getBean(Job.class); - - JobExecution execution = launcher.run(job, new JobParameters()); - assertEquals(BatchStatus.COMPLETED, execution.getStatus()); - assertEquals(3, execution.getStepExecutions().size()); + JobExecution execution = runJob("DecisionStepTests-decisionValidExitStatus-context", new Properties(), 10000l); + assertEquals(BatchStatus.COMPLETED, execution.getBatchStatus()); + assertEquals(3, BatchRuntime.getJobOperator().getStepExecutions(execution.getExecutionId()).size()); } @Test public void testDecisionUnmappedExitStatus() throws Exception { - ApplicationContext context = new GenericXmlApplicationContext("classpath:/org/springframework/batch/core/jsr/step/DecisionStepTests-decisionInvalidExitStatus-context.xml"); + JobExecution execution = runJob("DecisionStepTests-decisionInvalidExitStatus-context", new Properties(), 10000l); + assertEquals(BatchStatus.COMPLETED, execution.getBatchStatus()); + List stepExecutions = BatchRuntime.getJobOperator().getStepExecutions(execution.getExecutionId()); + assertEquals(2, stepExecutions.size()); - JobLauncher launcher = context.getBean(JobLauncher.class); - Job job = context.getBean(Job.class); - - JobExecution execution = launcher.run(job, new JobParameters()); - assertEquals(BatchStatus.COMPLETED, execution.getStatus()); - assertEquals(2, execution.getStepExecutions().size()); - - for (org.springframework.batch.core.StepExecution curExecution : execution.getStepExecutions()) { - assertEquals(BatchStatus.COMPLETED, curExecution.getStatus()); + for (StepExecution curExecution : stepExecutions) { + assertEquals(BatchStatus.COMPLETED, curExecution.getBatchStatus()); } } @Test public void testDecisionCustomExitStatus() throws Exception { - ApplicationContext context = new GenericXmlApplicationContext("classpath:/org/springframework/batch/core/jsr/step/DecisionStepTests-decisionCustomExitStatus-context.xml"); - - JobLauncher launcher = context.getBean(JobLauncher.class); - Job job = context.getBean(Job.class); - - JobExecution execution = launcher.run(job, new JobParameters()); - assertEquals(BatchStatus.FAILED, execution.getStatus()); - assertEquals(2, execution.getStepExecutions().size()); - assertEquals("CustomFail", execution.getExitStatus().getExitCode()); + JobExecution execution = runJob("DecisionStepTests-decisionCustomExitStatus-context", new Properties(), 10000l); + assertEquals(BatchStatus.FAILED, execution.getBatchStatus()); + assertEquals(2, BatchRuntime.getJobOperator().getStepExecutions(execution.getExecutionId()).size()); + assertEquals("CustomFail", execution.getExitStatus()); } @Test - @Ignore("Flows as first steps are not supported yet") public void testDecisionAfterFlow() throws Exception { - ApplicationContext context = new GenericXmlApplicationContext("classpath:/org/springframework/batch/core/jsr/step/DecisionStepTests-decisionAfterFlow-context.xml"); - - JobLauncher launcher = context.getBean(JobLauncher.class); - Job job = context.getBean(Job.class); - - JobExecution execution = launcher.run(job, new JobParameters()); - assertEquals(BatchStatus.COMPLETED, execution.getStatus()); - assertEquals(3, execution.getStepExecutions().size()); + JobExecution execution = runJob("DecisionStepTests-decisionAfterFlow-context", new Properties(), 10000l); + assertEquals(BatchStatus.COMPLETED, execution.getBatchStatus()); + assertEquals(3, BatchRuntime.getJobOperator().getStepExecutions(execution.getExecutionId()).size()); } @Test - @Ignore("Splits are not implemented yet as part of our JSR implementation") - public void testDecisionAfterSplit() { + public void testDecisionAfterSplit() throws Exception { + JobExecution execution = runJob("DecisionStepTests-decisionAfterSplit-context", new Properties(), 10000l); + assertEquals(BatchStatus.COMPLETED, execution.getBatchStatus()); + assertEquals(4, BatchRuntime.getJobOperator().getStepExecutions(execution.getExecutionId()).size()); + assertEquals(2, StepExecutionCountingDecider.previousStepCount); + } + + public static class StepExecutionCountingDecider implements Decider { + + static int previousStepCount = 0; + + @Override + public String decide(StepExecution[] executions) throws Exception { + for (StepExecution stepExecution : executions) { + System.err.println(stepExecution.getStepName()); + } + previousStepCount = executions.length; + return "next"; + } } public static class NextDecider implements Decider { diff --git a/spring-batch-core/src/test/resources/org/springframework/batch/core/jsr/step/DecisionStepTests-decisionAfterFlow-context.xml b/spring-batch-core/src/test/resources/META-INF/batch-jobs/DecisionStepTests-decisionAfterFlow-context.xml similarity index 63% rename from spring-batch-core/src/test/resources/org/springframework/batch/core/jsr/step/DecisionStepTests-decisionAfterFlow-context.xml rename to spring-batch-core/src/test/resources/META-INF/batch-jobs/DecisionStepTests-decisionAfterFlow-context.xml index 26363c6bb..14bc3d253 100644 --- a/spring-batch-core/src/test/resources/org/springframework/batch/core/jsr/step/DecisionStepTests-decisionAfterFlow-context.xml +++ b/spring-batch-core/src/test/resources/META-INF/batch-jobs/DecisionStepTests-decisionAfterFlow-context.xml @@ -18,18 +18,6 @@ - - - - - - - - - - - - diff --git a/spring-batch-core/src/test/resources/org/springframework/batch/core/jsr/step/DecisionStepTests-decisionAsFirstStep-context.xml b/spring-batch-core/src/test/resources/META-INF/batch-jobs/DecisionStepTests-decisionAfterSplit-context.xml similarity index 52% rename from spring-batch-core/src/test/resources/org/springframework/batch/core/jsr/step/DecisionStepTests-decisionAsFirstStep-context.xml rename to spring-batch-core/src/test/resources/META-INF/batch-jobs/DecisionStepTests-decisionAfterSplit-context.xml index 97c2cca2c..a9dd280a3 100644 --- a/spring-batch-core/src/test/resources/org/springframework/batch/core/jsr/step/DecisionStepTests-decisionAsFirstStep-context.xml +++ b/spring-batch-core/src/test/resources/META-INF/batch-jobs/DecisionStepTests-decisionAfterSplit-context.xml @@ -4,27 +4,28 @@ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/jobXML_1_0.xsd"> + + + + + + + + + + + + - + + - + - - - - - - - - - - - - - + diff --git a/spring-batch-core/src/test/resources/META-INF/batch-jobs/DecisionStepTests-decisionAsFirstStep-context.xml b/spring-batch-core/src/test/resources/META-INF/batch-jobs/DecisionStepTests-decisionAsFirstStep-context.xml new file mode 100644 index 000000000..edba43953 --- /dev/null +++ b/spring-batch-core/src/test/resources/META-INF/batch-jobs/DecisionStepTests-decisionAsFirstStep-context.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + diff --git a/spring-batch-core/src/test/resources/org/springframework/batch/core/jsr/step/DecisionStepTests-decisionCustomExitStatus-context.xml b/spring-batch-core/src/test/resources/META-INF/batch-jobs/DecisionStepTests-decisionCustomExitStatus-context.xml similarity index 59% rename from spring-batch-core/src/test/resources/org/springframework/batch/core/jsr/step/DecisionStepTests-decisionCustomExitStatus-context.xml rename to spring-batch-core/src/test/resources/META-INF/batch-jobs/DecisionStepTests-decisionCustomExitStatus-context.xml index c3adb635e..7448c2dab 100644 --- a/spring-batch-core/src/test/resources/org/springframework/batch/core/jsr/step/DecisionStepTests-decisionCustomExitStatus-context.xml +++ b/spring-batch-core/src/test/resources/META-INF/batch-jobs/DecisionStepTests-decisionCustomExitStatus-context.xml @@ -12,18 +12,6 @@ - - - - - - - - - - - - diff --git a/spring-batch-core/src/test/resources/org/springframework/batch/core/jsr/step/DecisionStepTests-decisionInvalidExitStatus-context.xml b/spring-batch-core/src/test/resources/META-INF/batch-jobs/DecisionStepTests-decisionInvalidExitStatus-context.xml similarity index 61% rename from spring-batch-core/src/test/resources/org/springframework/batch/core/jsr/step/DecisionStepTests-decisionInvalidExitStatus-context.xml rename to spring-batch-core/src/test/resources/META-INF/batch-jobs/DecisionStepTests-decisionInvalidExitStatus-context.xml index be6637bde..b77bbd0f8 100644 --- a/spring-batch-core/src/test/resources/org/springframework/batch/core/jsr/step/DecisionStepTests-decisionInvalidExitStatus-context.xml +++ b/spring-batch-core/src/test/resources/META-INF/batch-jobs/DecisionStepTests-decisionInvalidExitStatus-context.xml @@ -15,18 +15,6 @@ - - - - - - - - - - - - diff --git a/spring-batch-core/src/test/resources/org/springframework/batch/core/jsr/step/DecisionStepTests-decisionThrowsException-context.xml b/spring-batch-core/src/test/resources/META-INF/batch-jobs/DecisionStepTests-decisionThrowsException-context.xml similarity index 61% rename from spring-batch-core/src/test/resources/org/springframework/batch/core/jsr/step/DecisionStepTests-decisionThrowsException-context.xml rename to spring-batch-core/src/test/resources/META-INF/batch-jobs/DecisionStepTests-decisionThrowsException-context.xml index 608aae35f..6594e4b49 100644 --- a/spring-batch-core/src/test/resources/org/springframework/batch/core/jsr/step/DecisionStepTests-decisionThrowsException-context.xml +++ b/spring-batch-core/src/test/resources/META-INF/batch-jobs/DecisionStepTests-decisionThrowsException-context.xml @@ -15,18 +15,6 @@ - - - - - - - - - - - - diff --git a/spring-batch-core/src/test/resources/org/springframework/batch/core/jsr/step/DecisionStepTests-decisionValidExitStatus-context.xml b/spring-batch-core/src/test/resources/META-INF/batch-jobs/DecisionStepTests-decisionValidExitStatus-context.xml similarity index 62% rename from spring-batch-core/src/test/resources/org/springframework/batch/core/jsr/step/DecisionStepTests-decisionValidExitStatus-context.xml rename to spring-batch-core/src/test/resources/META-INF/batch-jobs/DecisionStepTests-decisionValidExitStatus-context.xml index ea23dfba4..622eab3c6 100644 --- a/spring-batch-core/src/test/resources/org/springframework/batch/core/jsr/step/DecisionStepTests-decisionValidExitStatus-context.xml +++ b/spring-batch-core/src/test/resources/META-INF/batch-jobs/DecisionStepTests-decisionValidExitStatus-context.xml @@ -16,18 +16,6 @@ - - - - - - - - - - - -