diff --git a/spring-batch-core-tests/pom.xml b/spring-batch-core-tests/pom.xml
index 2e728a034..abf422b57 100644
--- a/spring-batch-core-tests/pom.xml
+++ b/spring-batch-core-tests/pom.xml
@@ -83,7 +83,7 @@
org.springframework.batch
spring-batch-core
- 2.1.0.CI-SNAPSHOT
+ ${project.version}
commons-dbcp
@@ -99,6 +99,13 @@
5.1.6
runtime
+
+ postgresql
+ postgresql
+ 8.3-603.jdbc3
+ true
+ runtime
+
commons-io
commons-io
diff --git a/spring-batch-core-tests/src/main/resources/META-INF/batch/footballSkipJob.xml b/spring-batch-core-tests/src/main/resources/META-INF/batch/footballSkipJob.xml
new file mode 100644
index 000000000..f66fda9e5
--- /dev/null
+++ b/spring-batch-core-tests/src/main/resources/META-INF/batch/footballSkipJob.xml
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SELECT GAMES.player_id, GAMES.year_no, SUM(COMPLETES),
+ SUM(ATTEMPTS), SUM(PASSING_YARDS), SUM(PASSING_TD),
+ SUM(INTERCEPTIONS), SUM(RUSHES), SUM(RUSH_YARDS),
+ SUM(RECEPTIONS), SUM(RECEPTIONS_YARDS), SUM(TOTAL_TD)
+ from GAMES,
+ PLAYERS where PLAYERS.player_id =
+ GAMES.player_id group by GAMES.player_id, GAMES.year_no
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-batch-core-tests/src/main/resources/business-schema-postgresql.sql b/spring-batch-core-tests/src/main/resources/business-schema-postgresql.sql
new file mode 100644
index 000000000..c7a27de5d
--- /dev/null
+++ b/spring-batch-core-tests/src/main/resources/business-schema-postgresql.sql
@@ -0,0 +1,94 @@
+-- Autogenerated: do not edit this file
+DROP SEQUENCE BATCH_STAGING_SEQ ;
+DROP SEQUENCE TRADE_SEQ ;
+DROP SEQUENCE CUSTOMER_SEQ ;
+DROP TABLE BATCH_STAGING ;
+DROP TABLE TRADE ;
+DROP TABLE CUSTOMER ;
+DROP TABLE PLAYERS ;
+DROP TABLE GAMES ;
+DROP TABLE PLAYER_SUMMARY ;
+DROP TABLE ERROR_LOG ;
+
+-- Autogenerated: do not edit this file
+
+CREATE SEQUENCE CUSTOMER_SEQ;
+CREATE SEQUENCE BATCH_STAGING_SEQ;
+CREATE SEQUENCE TRADE_SEQ;
+
+CREATE TABLE BATCH_STAGING (
+ ID BIGINT NOT NULL PRIMARY KEY ,
+ JOB_ID BIGINT NOT NULL,
+ VALUE BYTEA NOT NULL,
+ PROCESSED CHAR(1) NOT NULL
+) ;
+
+CREATE TABLE TRADE (
+ ID BIGINT NOT NULL PRIMARY KEY ,
+ VERSION BIGINT ,
+ ISIN VARCHAR(45) NOT NULL,
+ QUANTITY BIGINT ,
+ PRICE DECIMAL(8,2) ,
+ CUSTOMER VARCHAR(45)
+) ;
+
+CREATE TABLE CUSTOMER (
+ ID BIGINT NOT NULL PRIMARY KEY ,
+ VERSION BIGINT ,
+ NAME VARCHAR(45) ,
+ CREDIT DECIMAL(10,2)
+) ;
+
+INSERT INTO CUSTOMER (ID, VERSION, NAME, CREDIT) VALUES (1, 0, 'customer1', 100000);
+INSERT INTO CUSTOMER (ID, VERSION, NAME, CREDIT) VALUES (2, 0, 'customer2', 100000);
+INSERT INTO CUSTOMER (ID, VERSION, NAME, CREDIT) VALUES (3, 0, 'customer3', 100000);
+INSERT INTO CUSTOMER (ID, VERSION, NAME, CREDIT) VALUES (4, 0, 'customer4', 100000);
+
+CREATE TABLE PLAYERS (
+ PLAYER_ID CHAR(8) NOT NULL PRIMARY KEY,
+ LAST_NAME VARCHAR(35) NOT NULL,
+ FIRST_NAME VARCHAR(25) NOT NULL,
+ POS VARCHAR(10) ,
+ YEAR_OF_BIRTH BIGINT NOT NULL,
+ YEAR_DRAFTED BIGINT NOT NULL
+) ;
+
+CREATE TABLE GAMES (
+ PLAYER_ID CHAR(8) NOT NULL,
+ YEAR_NO BIGINT NOT NULL,
+ TEAM CHAR(3) NOT NULL,
+ WEEK BIGINT NOT NULL,
+ OPPONENT CHAR(3) ,
+ COMPLETES BIGINT ,
+ ATTEMPTS BIGINT ,
+ PASSING_YARDS BIGINT ,
+ PASSING_TD BIGINT ,
+ INTERCEPTIONS BIGINT ,
+ RUSHES BIGINT ,
+ RUSH_YARDS BIGINT ,
+ RECEPTIONS BIGINT ,
+ RECEPTIONS_YARDS BIGINT ,
+ TOTAL_TD BIGINT
+) ;
+
+CREATE TABLE PLAYER_SUMMARY (
+ ID CHAR(8) NOT NULL,
+ YEAR_NO BIGINT NOT NULL,
+ COMPLETES BIGINT NOT NULL ,
+ ATTEMPTS BIGINT NOT NULL ,
+ PASSING_YARDS BIGINT NOT NULL ,
+ PASSING_TD BIGINT NOT NULL ,
+ INTERCEPTIONS BIGINT NOT NULL ,
+ RUSHES BIGINT NOT NULL ,
+ RUSH_YARDS BIGINT NOT NULL ,
+ RECEPTIONS BIGINT NOT NULL ,
+ RECEPTIONS_YARDS BIGINT NOT NULL ,
+ TOTAL_TD BIGINT NOT NULL
+) ;
+
+CREATE TABLE ERROR_LOG (
+ JOB_NAME CHAR(20) ,
+ STEP_NAME CHAR(20) ,
+ MESSAGE VARCHAR(300) NOT NULL
+);
+
diff --git a/spring-batch-core-tests/src/test/java/org/springframework/batch/core/test/football/FootballJobSkipIntegrationTests.java b/spring-batch-core-tests/src/test/java/org/springframework/batch/core/test/football/FootballJobSkipIntegrationTests.java
new file mode 100644
index 000000000..f4c98a009
--- /dev/null
+++ b/spring-batch-core-tests/src/test/java/org/springframework/batch/core/test/football/FootballJobSkipIntegrationTests.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2006-2009 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.test.football;
+
+import static org.junit.Assert.assertEquals;
+
+import javax.sql.DataSource;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.batch.core.BatchStatus;
+import org.springframework.batch.core.Job;
+import org.springframework.batch.core.JobExecution;
+import org.springframework.batch.core.JobParametersBuilder;
+import org.springframework.batch.core.StepExecution;
+import org.springframework.batch.core.launch.JobLauncher;
+import org.springframework.batch.support.DatabaseType;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.jdbc.SimpleJdbcTestUtils;
+
+/**
+ * @author Dave Syer
+ *
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = { "/simple-job-launcher-context.xml", "/META-INF/batch/footballSkipJob.xml" })
+public class FootballJobSkipIntegrationTests {
+
+ /** Logger */
+ private final Log logger = LogFactory.getLog(getClass());
+
+ private SimpleJdbcTemplate simpleJdbcTemplate;
+
+ @Autowired
+ private JobLauncher jobLauncher;
+
+ @Autowired
+ private Job job;
+
+ private DatabaseType databaseType;
+
+ @Autowired
+ public void setDataSource(DataSource dataSource) throws Exception {
+ this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
+ databaseType = DatabaseType.fromMetaData(dataSource);
+ }
+
+ @Before
+ public void clear() {
+ SimpleJdbcTestUtils.deleteFromTables(simpleJdbcTemplate, "PLAYER_SUMMARY", "GAMES", "PLAYERS");
+ }
+
+ @Test
+ public void testLaunchJob() throws Exception {
+ try {
+ if (databaseType == DatabaseType.POSTGRES || databaseType == DatabaseType.ORACLE) {
+ // Extra special test for these platforms (would have failed
+ // the job with UNKNOWN status in Batch 2.0):
+ simpleJdbcTemplate.update("SET CONSTRAINTS ALL DEFERRED");
+ }
+ }
+ catch (Exception e) {
+ // Ignore (wrong platform)
+ }
+ JobExecution execution = jobLauncher.run(job, new JobParametersBuilder().addLong("run.id", 1L)
+ .toJobParameters());
+ assertEquals(BatchStatus.COMPLETED, execution.getStatus());
+ for (StepExecution stepExecution : execution.getStepExecutions()) {
+ logger.info("Processed: " + stepExecution);
+ }
+ execution = jobLauncher.run(job, new JobParametersBuilder().addLong("run.id", 2L).toJobParameters());
+ assertEquals(BatchStatus.COMPLETED, execution.getStatus());
+ for (StepExecution stepExecution : execution.getStepExecutions()) {
+ logger.info("Processed: " + stepExecution);
+ }
+
+ }
+
+}
diff --git a/spring-batch-core-tests/src/test/resources/batch-postgres.properties b/spring-batch-core-tests/src/test/resources/batch-postgres.properties
new file mode 100644
index 000000000..9e47c540f
--- /dev/null
+++ b/spring-batch-core-tests/src/test/resources/batch-postgres.properties
@@ -0,0 +1,16 @@
+# Placeholders batch.*
+# for Postgres:
+batch.jdbc.driver=org.postgresql.Driver
+batch.jdbc.url=jdbc:postgresql://localhost/test
+batch.jdbc.user=test
+batch.jdbc.password=test
+batch.jdbc.testWhileIdle=false
+batch.jdbc.validationQuery=
+batch.schema.script=classpath:/org/springframework/batch/core/schema-postgresql.sql
+batch.drop.script=classpath:/org/springframework/batch/core/schema-drop-postgresql.sql
+batch.business.schema.script=classpath:/business-schema-postgresql.sql
+batch.data.source.init=true
+batch.database.incrementer.class=org.springframework.jdbc.support.incrementer.PostgreSQLSequenceMaxValueIncrementer
+batch.database.incrementer.parent=sequenceIncrementerParent
+batch.grid.size=2
+batch.verify.cursor.position=true
diff --git a/spring-batch-samples/src/main/sql/destroy.sql.vpp b/spring-batch-samples/src/main/sql/destroy.sql.vpp
index bfb6b2b7a..dc2e1fbdc 100644
--- a/spring-batch-samples/src/main/sql/destroy.sql.vpp
+++ b/spring-batch-samples/src/main/sql/destroy.sql.vpp
@@ -1,4 +1,5 @@
-- Autogenerated: do not edit this file
+-- You might need to remove this section the first time you run against a clean database
DROP ${SEQUENCE} $!{IFEXISTSBEFORE} BATCH_STAGING_SEQ $!{IFEXISTS};
DROP ${SEQUENCE} $!{IFEXISTSBEFORE} TRADE_SEQ $!{IFEXISTS};
DROP ${SEQUENCE} $!{IFEXISTSBEFORE} CUSTOMER_SEQ $!{IFEXISTS};