From e497499f409731c8ba5f4fc949cdca11a2a3768e Mon Sep 17 00:00:00 2001 From: robokaso Date: Fri, 9 Jan 2009 12:10:44 +0000 Subject: [PATCH] OPEN - BATCH-990: Implement and test synchronizeStatus() in MapJobExecutionDao use upgradeStatus(..) instead of setStatus(..) in synchronizeStatus() --- .../repository/dao/JdbcJobExecutionDao.java | 2 +- .../repository/dao/MapJobExecutionDao.java | 2 +- .../dao/AbstractJobExecutionDaoTests.java | 41 ++++++++++++++++--- .../dao/JdbcJobExecutionDaoTests.java | 16 +------- 4 files changed, 39 insertions(+), 22 deletions(-) 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 e6a76c6a8..355011331 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 @@ -260,7 +260,7 @@ public class JdbcJobExecutionDao extends AbstractJdbcBatchMetadataDao implements if (currentVersion != jobExecution.getVersion().intValue()) { String status = getJdbcTemplate().queryForObject(getQuery(GET_STATUS), String.class, jobExecution.getId()); - jobExecution.setStatus(BatchStatus.valueOf(status)); + jobExecution.upgradeStatus(BatchStatus.valueOf(status)); jobExecution.setVersion(currentVersion); } } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/MapJobExecutionDao.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/MapJobExecutionDao.java index b0874810c..95f4acd1a 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/MapJobExecutionDao.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/dao/MapJobExecutionDao.java @@ -130,7 +130,7 @@ public class MapJobExecutionDao implements JobExecutionDao { public void synchronizeStatus(JobExecution jobExecution) { JobExecution saved = getJobExecution(jobExecution.getId()); if (saved.getVersion().intValue() != jobExecution.getVersion().intValue()) { - jobExecution.setStatus(saved.getStatus()); + jobExecution.upgradeStatus(saved.getStatus()); jobExecution.setVersion(saved.getVersion()); } } 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 1ec7625f1..99b2661a7 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 @@ -269,28 +269,59 @@ public abstract class AbstractJobExecutionDaoTests extends AbstractTransactional } + /** + * Successful synchronization from STARTED to STOPPING status. + */ @Transactional @Test - public void testSynchronizeStatus() { + public void testSynchronizeStatusUpgrade() { JobExecution exec1 = new JobExecution(jobInstance); - exec1.setStatus(BatchStatus.STARTED); + exec1.setStatus(BatchStatus.STOPPING); dao.saveJobExecution(exec1); - + JobExecution exec2 = new JobExecution(jobInstance); Assert.state(exec1.getId() != null); exec2.setId(exec1.getId()); - + + exec2.setStatus(BatchStatus.STARTED); exec2.setVersion(7); Assert.state(exec1.getVersion() != exec2.getVersion()); Assert.state(exec1.getStatus() != exec2.getStatus()); - + dao.synchronizeStatus(exec2); assertEquals(exec1.getVersion(), exec2.getVersion()); assertEquals(exec1.getStatus(), exec2.getStatus()); } + /** + * UNKNOWN status won't be changed by synchronizeStatus, because it is the + * 'largest' BatchStatus (will not downgrade). + */ + @Transactional + @Test + public void testSynchronizeStatusDowngrade() { + + JobExecution exec1 = new JobExecution(jobInstance); + exec1.setStatus(BatchStatus.STARTED); + dao.saveJobExecution(exec1); + + JobExecution exec2 = new JobExecution(jobInstance); + Assert.state(exec1.getId() != null); + exec2.setId(exec1.getId()); + + exec2.setStatus(BatchStatus.UNKNOWN); + exec2.setVersion(7); + Assert.state(exec1.getVersion() != exec2.getVersion()); + Assert.state(exec1.getStatus().isLessThan(exec2.getStatus())); + + dao.synchronizeStatus(exec2); + + assertEquals(exec1.getVersion(), exec2.getVersion()); + assertEquals(BatchStatus.UNKNOWN, exec2.getStatus()); + } + /* * Check to make sure the executions are equal. Normally, comparing the id's * is sufficient. However, for testing purposes, especially of a DAO, we diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/JdbcJobExecutionDaoTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/JdbcJobExecutionDaoTests.java index 995a3e102..c0a1ca978 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/JdbcJobExecutionDaoTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/JdbcJobExecutionDaoTests.java @@ -1,14 +1,10 @@ package org.springframework.batch.core.repository.dao; -import static org.junit.Assert.*; -import org.springframework.batch.core.BatchStatus; +import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.transaction.annotation.Transactional; -import org.junit.Test; -import org.junit.runner.RunWith; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "sql-dao-test.xml" }) @@ -38,14 +34,4 @@ public class JdbcJobExecutionDaoTests extends AbstractJobExecutionDaoTests { return stepExecutionDao; } - @Transactional - @Test - public void testUpdateExecutionStatus(){ - - dao.saveJobExecution(execution); - execution.setStatus(BatchStatus.COMPLETED); - execution.incrementVersion(); - dao.synchronizeStatus(execution); - assertEquals(BatchStatus.STARTING, execution.getStatus()); - } }