diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/JobExecution.java b/spring-batch-core/src/main/java/org/springframework/batch/core/JobExecution.java index 483578f31..2072d40ea 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/JobExecution.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/JobExecution.java @@ -31,7 +31,7 @@ import org.springframework.batch.repeat.ExitStatus; */ public class JobExecution extends Entity { - private final JobInstance jobInstance; + private JobInstance jobInstance; private volatile transient Collection stepExecutions = new HashSet(); @@ -68,11 +68,19 @@ public class JobExecution extends Entity { public JobExecution(JobInstance job) { this(job, null); } + + public JobExecution(Long id){ + super(id); + } public Date getEndTime() { return endTime; } + public void setJobInstance(JobInstance jobInstance) { + this.jobInstance = jobInstance; + } + public void setEndTime(Date endTime) { this.endTime = endTime; } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/JobParametersIncrementer.java b/spring-batch-core/src/main/java/org/springframework/batch/core/JobParametersIncrementer.java index 96b48897b..be86243bc 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/JobParametersIncrementer.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/JobParametersIncrementer.java @@ -19,7 +19,8 @@ package org.springframework.batch.core; * Interface for obtaining the next {@link JobParameters} in a sequence. * * @author Dave Syer - * + * @author Lucas Ward + * @since 2.0 */ public interface JobParametersIncrementer { diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/explore/support/AbstractJobExplorerFactoryBean.java b/spring-batch-core/src/main/java/org/springframework/batch/core/explore/support/AbstractJobExplorerFactoryBean.java index f3f2aba05..7278e58bf 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/explore/support/AbstractJobExplorerFactoryBean.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/explore/support/AbstractJobExplorerFactoryBean.java @@ -3,6 +3,7 @@ package org.springframework.batch.core.explore.support; import org.springframework.batch.core.explore.JobExplorer; import org.springframework.batch.core.repository.dao.JobExecutionDao; import org.springframework.batch.core.repository.dao.JobInstanceDao; +import org.springframework.batch.core.repository.dao.StepExecutionDao; import org.springframework.beans.factory.FactoryBean; /** @@ -26,6 +27,8 @@ public abstract class AbstractJobExplorerFactoryBean implements FactoryBean { * @return fully configured {@link JobExecutionDao} implementation. */ protected abstract JobExecutionDao createJobExecutionDao() throws Exception; + + protected abstract StepExecutionDao createStepExecutionDao() throws Exception; /** * The type of object to be returned from {@link #getObject()}. diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/explore/support/JobExplorerFactoryBean.java b/spring-batch-core/src/main/java/org/springframework/batch/core/explore/support/JobExplorerFactoryBean.java index 043ca50d9..d578a488f 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/explore/support/JobExplorerFactoryBean.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/explore/support/JobExplorerFactoryBean.java @@ -99,7 +99,7 @@ public class JobExplorerFactoryBean extends AbstractJobExplorerFactoryBean imple } private Object getTarget() throws Exception { - return new SimpleJobExplorer(createJobInstanceDao(), createJobExecutionDao()); + return new SimpleJobExplorer(createJobInstanceDao(), createJobExecutionDao(), createStepExecutionDao()); } @Override @@ -118,8 +118,6 @@ public class JobExplorerFactoryBean extends AbstractJobExplorerFactoryBean imple dao.setJdbcTemplate(jdbcTemplate); dao.setJobExecutionIncrementer(incrementerFactory.getIncrementer(databaseType, tablePrefix + "JOB_EXECUTION_SEQ")); - dao.setJobInstanceDao(createJobInstanceDao()); - dao.setStepExecutionDao(createStepExecutionDao()); dao.setTablePrefix(tablePrefix); dao.afterPropertiesSet(); return dao; diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/explore/support/MapJobExplorerFactoryBean.java b/spring-batch-core/src/main/java/org/springframework/batch/core/explore/support/MapJobExplorerFactoryBean.java index a518f507a..0e7372276 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/explore/support/MapJobExplorerFactoryBean.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/explore/support/MapJobExplorerFactoryBean.java @@ -4,6 +4,8 @@ import org.springframework.batch.core.repository.dao.JobExecutionDao; import org.springframework.batch.core.repository.dao.JobInstanceDao; import org.springframework.batch.core.repository.dao.MapJobExecutionDao; import org.springframework.batch.core.repository.dao.MapJobInstanceDao; +import org.springframework.batch.core.repository.dao.MapStepExecutionDao; +import org.springframework.batch.core.repository.dao.StepExecutionDao; import org.springframework.beans.factory.FactoryBean; /** @@ -23,9 +25,15 @@ public class MapJobExplorerFactoryBean extends AbstractJobExplorerFactoryBean { protected JobInstanceDao createJobInstanceDao() throws Exception { return new MapJobInstanceDao(); } + + @Override + protected StepExecutionDao createStepExecutionDao() throws Exception { + // TODO Auto-generated method stub + return new MapStepExecutionDao(); + } public Object getObject() throws Exception { - return new SimpleJobExplorer(createJobInstanceDao(), createJobExecutionDao()); + return new SimpleJobExplorer(createJobInstanceDao(), createJobExecutionDao(), createStepExecutionDao()); } } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/explore/support/SimpleJobExplorer.java b/spring-batch-core/src/main/java/org/springframework/batch/core/explore/support/SimpleJobExplorer.java index cbb9a930b..d686f2278 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/explore/support/SimpleJobExplorer.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/explore/support/SimpleJobExplorer.java @@ -34,18 +34,21 @@ import org.springframework.batch.core.repository.dao.StepExecutionDao; *

* * @author Dave Syer + * @author Lucas Ward * * @see JobExplorer * @see JobInstanceDao * @see JobExecutionDao * @see StepExecutionDao - * + * @since 2.0 */ public class SimpleJobExplorer implements JobExplorer { private JobInstanceDao jobInstanceDao; private JobExecutionDao jobExecutionDao; + + private StepExecutionDao stepExecutionDao; /** * Provide default constructor with low visibility in case user wants to use @@ -54,31 +57,42 @@ public class SimpleJobExplorer implements JobExplorer { SimpleJobExplorer() { } - public SimpleJobExplorer(JobInstanceDao jobInstanceDao, JobExecutionDao jobExecutionDao) { + public SimpleJobExplorer(JobInstanceDao jobInstanceDao, JobExecutionDao jobExecutionDao, StepExecutionDao stepExecutionDao) { super(); this.jobInstanceDao = jobInstanceDao; this.jobExecutionDao = jobExecutionDao; + this.stepExecutionDao = stepExecutionDao; } /* (non-Javadoc) * @see org.springframework.batch.core.explore.JobExplorer#findJobExecutions(org.springframework.batch.core.JobInstance) */ public List findJobExecutions(JobInstance jobInstance) { - return jobExecutionDao.findJobExecutions(jobInstance); + List executions = jobExecutionDao.findJobExecutions(jobInstance); + for(JobExecution jobExecution:executions){ + getJobExecutionDependencies(jobExecution); + } + return executions; } /* (non-Javadoc) * @see org.springframework.batch.core.explore.JobExplorer#findRunningJobExecutions(java.lang.String) */ public Set findRunningJobExecutions(String jobName) { - return jobExecutionDao.findRunningJobExecutions(jobName); + Set executions = jobExecutionDao.findRunningJobExecutions(jobName); + for(JobExecution jobExecution:executions){ + getJobExecutionDependencies(jobExecution); + } + return executions; } /* (non-Javadoc) * @see org.springframework.batch.core.explore.JobExplorer#getJobExecution(java.lang.Long) */ public JobExecution getJobExecution(Long executionId) { - return jobExecutionDao.getJobExecution(executionId); + JobExecution jobExecution = jobExecutionDao.getJobExecution(executionId); + getJobExecutionDependencies(jobExecution); + return jobExecution; } /* (non-Javadoc) @@ -101,5 +115,16 @@ public class SimpleJobExplorer implements JobExplorer { public boolean isJobInstanceExists(String jobName, JobParameters jobParameters) { return jobInstanceDao.getJobInstance(jobName, jobParameters)!=null; } + + /* + * Find all dependencies for a JobExecution, including JobInstance (which requires JobParameters) + * plus StepExecutions + */ + private void getJobExecutionDependencies(JobExecution jobExecution){ + + JobInstance jobInstance = jobInstanceDao.getJobInstance(jobExecution); + stepExecutionDao.getStepExecutions(jobExecution); + jobExecution.setJobInstance(jobInstance); + } } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcJobExecutionDao.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcJobExecutionDao.java index 17538ca98..0bb889d00 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcJobExecutionDao.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcJobExecutionDao.java @@ -55,8 +55,6 @@ public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements private static final String GET_LAST_EXECUTION = "SELECT JOB_EXECUTION_ID, START_TIME, END_TIME, STATUS, CONTINUABLE, EXIT_CODE, EXIT_MESSAGE, CREATE_TIME, LAST_UPDATED " + "from %PREFIX%JOB_EXECUTION where JOB_INSTANCE_ID = ? and CREATE_TIME = (SELECT max(CREATE_TIME) from %PREFIX%JOB_EXECUTION where JOB_INSTANCE_ID = ?)"; - private static final String GET_INSTANCE_BY_EXECUTION_ID = "SELECT JOB_INSTANCE_ID from %PREFIX%JOB_EXECUTION where JOB_EXECUTION_ID = ?"; - private static final String GET_EXECUTION_BY_ID = "SELECT JOB_EXECUTION_ID, START_TIME, END_TIME, STATUS, CONTINUABLE, EXIT_CODE, EXIT_MESSAGE, CREATE_TIME, LAST_UPDATED" + " from %PREFIX%JOB_EXECUTION where JOB_EXECUTION_ID = ?"; @@ -67,10 +65,6 @@ public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements private DataFieldMaxValueIncrementer jobExecutionIncrementer; - private JobInstanceDao jobInstanceDao; - - private StepExecutionDao stepExecutionDao; - /** * Public setter for the exit message length in database. Do not set this if * you haven't modified the schema. @@ -90,27 +84,9 @@ public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements this.jobExecutionIncrementer = jobExecutionIncrementer; } - /** - * Public setter for the {@link JobInstanceDao}. - * @param jobInstanceDao the {@link JobInstanceDao} to set - */ - public void setJobInstanceDao(JobInstanceDao jobInstanceDao) { - this.jobInstanceDao = jobInstanceDao; - } - - /** - * Public setter for the {@link StepExecutionDao}. - * @param stepExecutionDao the {@link StepExecutionDao} to set - */ - public void setStepExecutionDao(StepExecutionDao stepExecutionDao) { - this.stepExecutionDao = stepExecutionDao; - } - public void afterPropertiesSet() throws Exception { super.afterPropertiesSet(); Assert.notNull(jobExecutionIncrementer); - Assert.notNull(jobInstanceDao); - Assert.notNull(stepExecutionDao); } public List findJobExecutions(final JobInstance job) { @@ -233,11 +209,8 @@ public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements */ public JobExecution getJobExecution(Long executionId) { try { - Long instanceId = getJdbcTemplate().queryForLong(getQuery(GET_INSTANCE_BY_EXECUTION_ID), executionId); - JobInstance jobInstance = jobInstanceDao.getJobInstance(instanceId); JobExecution jobExecution = getJdbcTemplate().queryForObject(getQuery(GET_EXECUTION_BY_ID), - new JobExecutionRowMapper(jobInstance), executionId); - stepExecutionDao.getStepExecutions(jobExecution); + new JobExecutionRowMapper(), executionId); return jobExecution; } catch (EmptyResultDataAccessException e) { @@ -256,18 +229,12 @@ public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements final Set result = new HashSet(); RowCallbackHandler handler = new RowCallbackHandler() { public void processRow(ResultSet rs) throws SQLException { - Long instanceId = rs.getLong("JOB_INSTANCE_ID"); - JobInstance jobInstance = jobInstanceDao.getJobInstance(instanceId); - JobExecutionRowMapper mapper = new JobExecutionRowMapper(jobInstance); + JobExecutionRowMapper mapper = new JobExecutionRowMapper(); result.add(mapper.mapRow(rs, 0)); } }; getJdbcTemplate().getJdbcOperations().query(getQuery(GET_RUNNING_EXECUTIONS), handler); - for (JobExecution jobExecution : result) { - stepExecutionDao.getStepExecutions(jobExecution); - } - return result; } @@ -285,16 +252,26 @@ public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements */ private class JobExecutionRowMapper implements ParameterizedRowMapper { - private JobInstance job; - - public JobExecutionRowMapper(JobInstance job) { - super(); - this.job = job; + private JobInstance jobInstance; + + public JobExecutionRowMapper() { } - + + public JobExecutionRowMapper(JobInstance jobInstance) { + this.jobInstance = jobInstance; + } + public JobExecution mapRow(ResultSet rs, int rowNum) throws SQLException { - JobExecution jobExecution = new JobExecution(job); - jobExecution.setId(new Long(rs.getLong(1))); + Long id = new Long(rs.getLong(1)); + JobExecution jobExecution; + + if(jobInstance == null){ + jobExecution = new JobExecution(id); + } + else{ + jobExecution = new JobExecution(jobInstance, id); + } + jobExecution.setStartTime(rs.getTimestamp(2)); jobExecution.setEndTime(rs.getTimestamp(3)); jobExecution.setStatus(BatchStatus.valueOf(rs.getString(4))); diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcJobInstanceDao.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcJobInstanceDao.java index cb584d42d..5c5ad7c6a 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcJobInstanceDao.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JdbcJobInstanceDao.java @@ -10,6 +10,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.JobInstance; import org.springframework.batch.core.JobParameter; import org.springframework.batch.core.JobParameters; @@ -52,6 +53,9 @@ public class JdbcJobInstanceDao extends AbstractJdbcBatchMetadataDao implements private static final String FIND_JOBS_WITH_EMPTY_KEY = "SELECT JOB_INSTANCE_ID, JOB_NAME from %PREFIX%JOB_INSTANCE where JOB_NAME = ? and (JOB_KEY = ? OR JOB_KEY is NULL)"; private static final String GET_JOB_FROM_ID = "SELECT JOB_INSTANCE_ID, JOB_NAME, JOB_KEY, VERSION from %PREFIX%JOB_INSTANCE where JOB_INSTANCE_ID = ?"; + + private static final String GET_JOB_FROM_EXECUTION_ID = "SELECT JOB_INSTANCE_ID, JOB_NAME, JOB_KEY, VERSION from %PREFIX%JOB_INSTANCE ji, " + + "%PREFIX%JOB_EXECUTION je where JOB_EXECUTION_ID = ? and ji.JOB_INSTANCE_ID = je.JOB_INSTANCE_ID"; private static final String FIND_PARAMS_FROM_ID = "SELECT JOB_INSTANCE_ID, KEY_NAME, TYPE_CD, " + "STRING_VAL, DATE_VAL, LONG_VAL, DOUBLE_VAL from %PREFIX%JOB_PARAMS where JOB_INSTANCE_ID = ?"; @@ -182,10 +186,8 @@ public class JdbcJobInstanceDao extends AbstractJdbcBatchMetadataDao implements */ public JobInstance getJobInstance(Long instanceId) { - final JobParameters jobParameters = getJobParameters(instanceId); - ParameterizedRowMapper rowMapper = new JobInstanceRowMapper(jobParameters); try { - return getJdbcTemplate().queryForObject(getQuery(GET_JOB_FROM_ID), rowMapper, instanceId); + return getJdbcTemplate().queryForObject(getQuery(GET_JOB_FROM_ID), new JobInstanceRowMapper(), instanceId); } catch (EmptyResultDataAccessException e) { return null; @@ -250,8 +252,7 @@ public class JdbcJobInstanceDao extends AbstractJdbcBatchMetadataDao implements public Object extractData(ResultSet rs) throws SQLException, DataAccessException { int rowNum = 0; while (rowNum < count && rs.next()) { - final JobParameters jobParameters = getJobParameters(rs.getLong(1)); - ParameterizedRowMapper rowMapper = new JobInstanceRowMapper(jobParameters); + ParameterizedRowMapper rowMapper = new JobInstanceRowMapper(); list.add(rowMapper.mapRow(rs, rowNum)); rowNum++; } @@ -266,6 +267,19 @@ public class JdbcJobInstanceDao extends AbstractJdbcBatchMetadataDao implements return result; } + + /* (non-Javadoc) + * @see org.springframework.batch.core.repository.dao.JobInstanceDao#getJobInstance(org.springframework.batch.core.JobExecution) + */ + public JobInstance getJobInstance(JobExecution jobExecution) { + + try { + return getJdbcTemplate().queryForObject(getQuery(GET_JOB_FROM_EXECUTION_ID), new JobInstanceRowMapper(), jobExecution.getId()); + } + catch (EmptyResultDataAccessException e) { + return null; + } + } /** * Setter for {@link DataFieldMaxValueIncrementer} to be used when @@ -288,18 +302,25 @@ public class JdbcJobInstanceDao extends AbstractJdbcBatchMetadataDao implements */ private final class JobInstanceRowMapper implements ParameterizedRowMapper { - private final JobParameters jobParameters; - - private JobInstanceRowMapper(JobParameters jobParameters) { + private JobParameters jobParameters; + + public JobInstanceRowMapper() { + } + + public JobInstanceRowMapper(JobParameters jobParameters) { this.jobParameters = jobParameters; } - + + public JobInstance mapRow(ResultSet rs, int rowNum) throws SQLException { + Long id = rs.getLong(1); + if(jobParameters == null){ + jobParameters = getJobParameters(id); + } JobInstance jobInstance = new JobInstance(new Long(rs.getLong(1)), jobParameters, rs.getString(2)); // should always be at version=0 because they never get updated jobInstance.incrementVersion(); return jobInstance; } } - } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JobInstanceDao.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JobInstanceDao.java index 93c2f7c7e..742b5d147 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JobInstanceDao.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/JobInstanceDao.java @@ -2,6 +2,7 @@ package org.springframework.batch.core.repository.dao; import java.util.List; +import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.JobInstance; import org.springframework.batch.core.JobParameters; @@ -48,6 +49,14 @@ public interface JobInstanceDao { */ JobInstance getJobInstance(Long instanceId); + /** + * Fetch the JobInstance for the provided JobExecution. + * + * @param jobExecution the JobExecution + * @return the JobInstance for the provided execution or null if it doesn't exist. + */ + JobInstance getJobInstance(JobExecution jobExecution); + /** * Fetch the last job instances with the provided name, sorted backwards by * primary key. diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/MapJobInstanceDao.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/MapJobInstanceDao.java index f127a9180..caefdb528 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/MapJobInstanceDao.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/MapJobInstanceDao.java @@ -6,6 +6,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; +import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.JobInstance; import org.springframework.batch.core.JobParameters; import org.springframework.batch.support.transaction.TransactionAwareProxyFactory; @@ -85,4 +86,8 @@ public class MapJobInstanceDao implements JobInstanceDao { return list.subList(0, length); } + public JobInstance getJobInstance(JobExecution jobExecution) { + return jobExecution.getJobInstance(); + } + } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/support/JobRepositoryFactoryBean.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/support/JobRepositoryFactoryBean.java index d1cb46e63..a761348da 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/support/JobRepositoryFactoryBean.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/support/JobRepositoryFactoryBean.java @@ -180,8 +180,6 @@ public class JobRepositoryFactoryBean extends AbstractJobRepositoryFactoryBean i dao.setJdbcTemplate(jdbcTemplate); dao.setJobExecutionIncrementer(incrementerFactory.getIncrementer(databaseType, tablePrefix + "JOB_EXECUTION_SEQ")); - dao.setJobInstanceDao(createJobInstanceDao()); - dao.setStepExecutionDao(createStepExecutionDao()); dao.setTablePrefix(tablePrefix); dao.afterPropertiesSet(); return dao; diff --git a/spring-batch-core/src/main/sql/tables-context.sql.vpp b/spring-batch-core/src/main/sql/tables-context.sql.vpp index ace34ea4b..f588b355f 100644 --- a/spring-batch-core/src/main/sql/tables-context.sql.vpp +++ b/spring-batch-core/src/main/sql/tables-context.sql.vpp @@ -1,4 +1,11 @@ -CREATE TABLE BATCH_MAP_STORE ( - MAP_STORE_ID ${BIGINT} $!{IDENTITY} NOT NULL PRIMARY KEY $!{GENERATED}, - OBJECT_VAL ${BLOB} NOT NULL +CREATE TABLE BATCH_EXECUTION_CONTEXT ( + EXECUTION_ID ${BIGINT} NOT NULL, + DISCRIMINATOR ${VARCHAR}(1) NOT NULL, + TYPE_CD ${VARCHAR}(6) NOT NULL, + KEY_NAME ${VARCHAR}(1000) NOT NULL, + STRING_VAL ${VARCHAR}(1000) $!{NULL}, + DATE_VAL ${TIMESTAMP} DEFAULT NULL, + LONG_VAL ${BIGINT} $!{NULL}, + DOUBLE_VAL ${DOUBLE} $!{NULL}, + OBJECT_VAL ${BLOB} $!{NULL} ) $!{VOODOO}; diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/JobExecutionTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/JobExecutionTests.java index 90ef9815a..7016ce4ac 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/JobExecutionTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/JobExecutionTests.java @@ -100,7 +100,7 @@ public class JobExecutionTests extends TestCase { * {@link org.springframework.batch.core.JobExecution#getJobId()}. */ public void testGetJobIdForNullJob() { - execution = new JobExecution(null); + execution = new JobExecution(null, null); assertEquals(null, execution.getJobId()); } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/support/ClassPathXmlJobRegistryTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/support/ClassPathXmlJobRegistryTests.java index 69e2c214c..286842f1e 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/support/ClassPathXmlJobRegistryTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/support/ClassPathXmlJobRegistryTests.java @@ -14,7 +14,12 @@ import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; - +/** + * + * + * @author Lucas Ward + * + */ public class ClassPathXmlJobRegistryTests { ClassPathXmlJobRegistry registry; diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/exlore/support/JobExplorerFactoryBeanTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/exlore/support/JobExplorerFactoryBeanTests.java index 3a97a5d70..c67cac6e1 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/exlore/support/JobExplorerFactoryBeanTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/exlore/support/JobExplorerFactoryBeanTests.java @@ -117,7 +117,7 @@ public class JobExplorerFactoryBeanTests { expect(incrementerFactory.isSupportedIncrementerType("foo")).andReturn(true); expect(incrementerFactory.getSupportedIncrementerTypes()).andReturn(new String[0]); - expect(incrementerFactory.getIncrementer(databaseType, tablePrefix + "JOB_SEQ")).andReturn(new StubIncrementer()).times(2); + expect(incrementerFactory.getIncrementer(databaseType, tablePrefix + "JOB_SEQ")).andReturn(new StubIncrementer()); expect(incrementerFactory.getIncrementer(databaseType, tablePrefix + "JOB_EXECUTION_SEQ")).andReturn(new StubIncrementer()); expect(incrementerFactory.getIncrementer(databaseType, tablePrefix + "STEP_EXECUTION_SEQ")).andReturn(new StubIncrementer()); replay(incrementerFactory); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/exlore/support/SimpleJobExplorerTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/exlore/support/SimpleJobExplorerTests.java index 922b16a93..f899cdf65 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/exlore/support/SimpleJobExplorerTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/exlore/support/SimpleJobExplorerTests.java @@ -16,7 +16,7 @@ package org.springframework.batch.core.exlore.support; -import static org.easymock.EasyMock.createMock; +import static org.easymock.EasyMock.*; import java.util.Collections; @@ -30,6 +30,7 @@ import org.springframework.batch.core.JobParameters; import org.springframework.batch.core.explore.support.SimpleJobExplorer; import org.springframework.batch.core.repository.dao.JobExecutionDao; import org.springframework.batch.core.repository.dao.JobInstanceDao; +import org.springframework.batch.core.repository.dao.StepExecutionDao; /** * Test {@link SimpleJobExplorer}. @@ -44,6 +45,8 @@ public class SimpleJobExplorerTests extends TestCase { JobExecutionDao jobExecutionDao; JobInstanceDao jobInstanceDao; + + StepExecutionDao stepExecutionDao; JobInstance jobInstance = new JobInstance(111L, new JobParameters(), "job"); @@ -53,72 +56,76 @@ public class SimpleJobExplorerTests extends TestCase { jobExecutionDao = createMock(JobExecutionDao.class); jobInstanceDao = createMock(JobInstanceDao.class); + stepExecutionDao = createMock(StepExecutionDao.class); - jobExplorer = new SimpleJobExplorer(jobInstanceDao, jobExecutionDao); + jobExplorer = new SimpleJobExplorer(jobInstanceDao, jobExecutionDao, stepExecutionDao); } @Test public void testGetJobExecution() throws Exception { - jobExecutionDao.getJobExecution(123L); - EasyMock.expectLastCall().andReturn(jobExecution); - EasyMock.replay(jobExecutionDao, jobInstanceDao); + expect(jobExecutionDao.getJobExecution(123L)).andReturn(jobExecution); + expect(jobInstanceDao.getJobInstance(jobExecution)).andReturn(jobInstance); + expect(stepExecutionDao.getStepExecutions(jobExecution)).andReturn(null); + replay(jobExecutionDao, jobInstanceDao, stepExecutionDao); jobExplorer.getJobExecution(123L); - EasyMock.verify(jobExecutionDao, jobInstanceDao); + verify(jobExecutionDao, jobInstanceDao, stepExecutionDao); } @Test public void testFindRunningJobExecutions() throws Exception { - jobExecutionDao.findRunningJobExecutions("job"); - EasyMock.expectLastCall().andReturn(Collections.singleton(jobExecution)); - EasyMock.replay(jobExecutionDao, jobInstanceDao); + expect(jobExecutionDao.findRunningJobExecutions("job")).andReturn(Collections.singleton(jobExecution)); + expect(jobInstanceDao.getJobInstance(jobExecution)).andReturn(jobInstance); + expect(stepExecutionDao.getStepExecutions(jobExecution)).andReturn(null); + replay(jobExecutionDao, jobInstanceDao, stepExecutionDao); jobExplorer.findRunningJobExecutions("job"); - EasyMock.verify(jobExecutionDao, jobInstanceDao); + verify(jobExecutionDao, jobInstanceDao, stepExecutionDao); } @Test public void testFindJobExecutions() throws Exception { - jobExecutionDao.findJobExecutions(jobInstance); - EasyMock.expectLastCall().andReturn(Collections.singletonList(jobExecution)); - EasyMock.replay(jobExecutionDao, jobInstanceDao); + expect(jobExecutionDao.findJobExecutions(jobInstance)).andReturn(Collections.singletonList(jobExecution)); + expect(jobInstanceDao.getJobInstance(jobExecution)).andReturn(jobInstance); + expect(stepExecutionDao.getStepExecutions(jobExecution)).andReturn(null); + replay(jobExecutionDao, jobInstanceDao, stepExecutionDao); jobExplorer.findJobExecutions(jobInstance); - EasyMock.verify(jobExecutionDao, jobInstanceDao); + verify(jobExecutionDao, jobInstanceDao, stepExecutionDao); } @Test public void testGetJobInstance() throws Exception { jobInstanceDao.getJobInstance(111L); EasyMock.expectLastCall().andReturn(jobInstance); - EasyMock.replay(jobExecutionDao, jobInstanceDao); + replay(jobExecutionDao, jobInstanceDao, stepExecutionDao); jobExplorer.getJobInstance(111L); - EasyMock.verify(jobExecutionDao, jobInstanceDao); + verify(jobExecutionDao, jobInstanceDao, stepExecutionDao); } @Test public void testGetLastJobInstances() throws Exception { jobInstanceDao.getLastJobInstances("foo", 1); EasyMock.expectLastCall().andReturn(Collections.singletonList(jobInstance)); - EasyMock.replay(jobExecutionDao, jobInstanceDao); + replay(jobExecutionDao, jobInstanceDao, stepExecutionDao); jobExplorer.getLastJobInstances("foo", 1); - EasyMock.verify(jobExecutionDao, jobInstanceDao); + verify(jobExecutionDao, jobInstanceDao, stepExecutionDao); } @Test public void testIsJobInstanceFalse() throws Exception { jobInstanceDao.getJobInstance("foo", new JobParameters()); EasyMock.expectLastCall().andReturn(null); - EasyMock.replay(jobExecutionDao, jobInstanceDao); + replay(jobExecutionDao, jobInstanceDao, stepExecutionDao); assertFalse(jobExplorer.isJobInstanceExists("foo", new JobParameters())); - EasyMock.verify(jobExecutionDao, jobInstanceDao); + verify(jobExecutionDao, jobInstanceDao, stepExecutionDao); } @Test public void testIsJobInstanceTrue() throws Exception { jobInstanceDao.getJobInstance("foo", new JobParameters()); EasyMock.expectLastCall().andReturn(jobInstance); - EasyMock.replay(jobExecutionDao, jobInstanceDao); + replay(jobExecutionDao, jobInstanceDao, stepExecutionDao); assertTrue(jobExplorer.isJobInstanceExists("foo", new JobParameters())); - EasyMock.verify(jobExecutionDao, jobInstanceDao); + verify(jobExecutionDao, jobInstanceDao, stepExecutionDao); } } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/launch/SimpleJobLauncherTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/launch/SimpleJobLauncherTests.java index 270a261b4..30eb32588 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/launch/SimpleJobLauncherTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/launch/SimpleJobLauncherTests.java @@ -64,7 +64,7 @@ public class SimpleJobLauncherTests { @Test public void testRun() throws Exception { - JobExecution jobExecution = new JobExecution(null); + JobExecution jobExecution = new JobExecution(null, null); expect(jobRepository.createJobExecution(job, jobParameters)).andReturn(jobExecution); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/AbstractJobExecutionDaoTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/AbstractJobExecutionDaoTests.java index b0924c23f..86a591041 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/AbstractJobExecutionDaoTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/AbstractJobExecutionDaoTests.java @@ -160,7 +160,6 @@ public abstract class AbstractJobExecutionDaoTests extends AbstractTransactional JobExecution value = values.iterator().next(); assertEquals(exec, value); assertEquals(5L, value.getLastUpdated().getTime()); - assertEquals(1, value.getStepExecutions().size()); } /** @@ -193,7 +192,6 @@ public abstract class AbstractJobExecutionDaoTests extends AbstractTransactional JobExecution value = dao.getJobExecution(exec.getId()); assertEquals(exec, value); - assertEquals(1, value.getStepExecutions().size()); } /** diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/AbstractJobInstanceDaoTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/AbstractJobInstanceDaoTests.java index a8611eb3f..80886710e 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/AbstractJobInstanceDaoTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/AbstractJobInstanceDaoTests.java @@ -22,7 +22,7 @@ public abstract class AbstractJobInstanceDaoTests extends AbstractTransactionalJ private static final long DATE = 777; - private JobInstanceDao dao = new MapJobInstanceDao(); + protected JobInstanceDao dao = new MapJobInstanceDao(); private String fooJob = "foo"; @@ -149,5 +149,10 @@ public abstract class AbstractJobInstanceDaoTests extends AbstractTransactionalJ assertNotNull(jobInstance.getVersion()); } + + + public void testGetJobInstanceByExecutionId(){ + + } } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/JdbcJobInstanceDaoTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/JdbcJobInstanceDaoTests.java index 58d20b1c0..a89d86200 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/JdbcJobInstanceDaoTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/JdbcJobInstanceDaoTests.java @@ -1,7 +1,11 @@ package org.springframework.batch.core.repository.dao; +import org.springframework.batch.core.JobExecution; +import org.springframework.batch.core.JobInstance; +import org.springframework.batch.core.JobParameters; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.junit.Assert; import org.junit.runner.RunWith; @@ -14,5 +18,16 @@ public class JdbcJobInstanceDaoTests extends AbstractJobInstanceDaoTests { "BATCH_JOB_PARAMS", "BATCH_JOB_INSTANCE"); return (JobInstanceDao) applicationContext.getBean("jobInstanceDao"); } - + + public void testFindJobInstanceByExecution(){ + + JobExecutionDao jobExecutionDao = (JobExecutionDao) applicationContext.getBean("jobExecutionDao"); + + JobInstance jobInstance = dao.createJobInstance("testInstance", new JobParameters()); + JobExecution jobExecution = new JobExecution(jobInstance, 2L); + jobExecutionDao.saveJobExecution(jobExecution); + + JobInstance returnedInstance = dao.getJobInstance(jobExecution); + Assert.assertEquals(jobInstance, returnedInstance); + } } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/JobRepositoryFactoryBeanTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/JobRepositoryFactoryBeanTests.java index 994a37903..77c9ff0f7 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/JobRepositoryFactoryBeanTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/JobRepositoryFactoryBeanTests.java @@ -140,9 +140,9 @@ public class JobRepositoryFactoryBeanTests { expect(incrementerFactory.isSupportedIncrementerType("foo")).andReturn(true); expect(incrementerFactory.getSupportedIncrementerTypes()).andReturn(new String[0]); - expect(incrementerFactory.getIncrementer(databaseType, tablePrefix + "JOB_SEQ")).andReturn(new StubIncrementer()).times(2); + expect(incrementerFactory.getIncrementer(databaseType, tablePrefix + "JOB_SEQ")).andReturn(new StubIncrementer()); expect(incrementerFactory.getIncrementer(databaseType, tablePrefix + "JOB_EXECUTION_SEQ")).andReturn(new StubIncrementer()); - expect(incrementerFactory.getIncrementer(databaseType, tablePrefix + "STEP_EXECUTION_SEQ")).andReturn(new StubIncrementer()).times(2); + expect(incrementerFactory.getIncrementer(databaseType, tablePrefix + "STEP_EXECUTION_SEQ")).andReturn(new StubIncrementer()); replay(incrementerFactory); factory.afterPropertiesSet(); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/SimpleJobRepositoryTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/SimpleJobRepositoryTests.java index 3f9a5440a..1c5e52b15 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/SimpleJobRepositoryTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/SimpleJobRepositoryTests.java @@ -118,7 +118,7 @@ public class SimpleJobRepositoryTests { public void testSaveOrUpdateInvalidJobExecution() { // failure scenario - must have job ID - JobExecution jobExecution = new JobExecution(null); + JobExecution jobExecution = new JobExecution(null, null); try { jobRepository.update(jobExecution); fail(); diff --git a/spring-batch-core/src/test/resources/org/springframework/batch/core/repository/dao/sql-dao-test.xml b/spring-batch-core/src/test/resources/org/springframework/batch/core/repository/dao/sql-dao-test.xml index ece4ec636..72a82eb59 100644 --- a/spring-batch-core/src/test/resources/org/springframework/batch/core/repository/dao/sql-dao-test.xml +++ b/spring-batch-core/src/test/resources/org/springframework/batch/core/repository/dao/sql-dao-test.xml @@ -23,8 +23,6 @@ - -