Change svn:eol-style to LF

This commit is contained in:
dsyer
2008-03-06 21:59:13 +00:00
parent ee5746a860
commit f5e85d5f63
372 changed files with 33472 additions and 33470 deletions

View File

@@ -1,112 +1,112 @@
/*
* Copyright 2006-2007 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.sample.dao;
import java.util.ArrayList;
import java.util.List;
import org.springframework.batch.repeat.ExitStatus;
import org.springframework.batch.repeat.RepeatContext;
import org.springframework.batch.repeat.RepeatListener;
import org.springframework.batch.sample.domain.CustomerCredit;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
* @author Lucas Ward
* @author Dave Syer
*
*/
public class HibernateCreditDao extends HibernateDaoSupport implements
CustomerCreditDao, RepeatListener {
private int failOnFlush = -1;
private List errors = new ArrayList();
/**
* Public accessor for the errors property.
*
* @return the errors - a list of Throwable instances
*/
public List getErrors() {
return errors;
}
/*
* (non-Javadoc)
*
* @see org.springframework.batch.sample.dao.CustomerCreditWriter#write(org.springframework.batch.sample.domain.CustomerCredit)
*/
public void writeCredit(CustomerCredit customerCredit) {
if (customerCredit.getId() == failOnFlush) {
// try to insert one with a duplicate ID
CustomerCredit newCredit = new CustomerCredit();
newCredit.setId(customerCredit.getId());
newCredit.setName(customerCredit.getName());
newCredit.setCredit(customerCredit.getCredit());
getHibernateTemplate().save(newCredit);
} else {
getHibernateTemplate().update(customerCredit);
}
}
/*
* (non-Javadoc)
*
* @see org.springframework.batch.io.OutputSource#write(java.lang.Object)
*/
public void write(Object output) {
writeCredit((CustomerCredit) output);
}
/**
* Public setter for the failOnFlush property.
*
* @param failOnFlush
* the ID of the record you want to fail on flush (for testing)
*/
public void setFailOnFlush(int failOnFlush) {
this.failOnFlush = failOnFlush;
}
public void onError(RepeatContext context, Throwable e) {
errors.add(e);
}
/* (non-Javadoc)
* @see org.springframework.batch.repeat.RepeatInterceptor#after(org.springframework.batch.repeat.RepeatContext, org.springframework.batch.repeat.ExitStatus)
*/
public void after(RepeatContext context, ExitStatus result) {
}
/* (non-Javadoc)
* @see org.springframework.batch.repeat.RepeatInterceptor#before(org.springframework.batch.repeat.RepeatContext)
*/
public void before(RepeatContext context) {
}
/* (non-Javadoc)
* @see org.springframework.batch.repeat.RepeatInterceptor#close(org.springframework.batch.repeat.RepeatContext)
*/
public void close(RepeatContext context) {
}
/* (non-Javadoc)
* @see org.springframework.batch.repeat.RepeatInterceptor#open(org.springframework.batch.repeat.RepeatContext)
*/
public void open(RepeatContext context) {
}
}
/*
* Copyright 2006-2007 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.sample.dao;
import java.util.ArrayList;
import java.util.List;
import org.springframework.batch.repeat.ExitStatus;
import org.springframework.batch.repeat.RepeatContext;
import org.springframework.batch.repeat.RepeatListener;
import org.springframework.batch.sample.domain.CustomerCredit;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
* @author Lucas Ward
* @author Dave Syer
*
*/
public class HibernateCreditDao extends HibernateDaoSupport implements
CustomerCreditDao, RepeatListener {
private int failOnFlush = -1;
private List errors = new ArrayList();
/**
* Public accessor for the errors property.
*
* @return the errors - a list of Throwable instances
*/
public List getErrors() {
return errors;
}
/*
* (non-Javadoc)
*
* @see org.springframework.batch.sample.dao.CustomerCreditWriter#write(org.springframework.batch.sample.domain.CustomerCredit)
*/
public void writeCredit(CustomerCredit customerCredit) {
if (customerCredit.getId() == failOnFlush) {
// try to insert one with a duplicate ID
CustomerCredit newCredit = new CustomerCredit();
newCredit.setId(customerCredit.getId());
newCredit.setName(customerCredit.getName());
newCredit.setCredit(customerCredit.getCredit());
getHibernateTemplate().save(newCredit);
} else {
getHibernateTemplate().update(customerCredit);
}
}
/*
* (non-Javadoc)
*
* @see org.springframework.batch.io.OutputSource#write(java.lang.Object)
*/
public void write(Object output) {
writeCredit((CustomerCredit) output);
}
/**
* Public setter for the failOnFlush property.
*
* @param failOnFlush
* the ID of the record you want to fail on flush (for testing)
*/
public void setFailOnFlush(int failOnFlush) {
this.failOnFlush = failOnFlush;
}
public void onError(RepeatContext context, Throwable e) {
errors.add(e);
}
/* (non-Javadoc)
* @see org.springframework.batch.repeat.RepeatInterceptor#after(org.springframework.batch.repeat.RepeatContext, org.springframework.batch.repeat.ExitStatus)
*/
public void after(RepeatContext context, ExitStatus result) {
}
/* (non-Javadoc)
* @see org.springframework.batch.repeat.RepeatInterceptor#before(org.springframework.batch.repeat.RepeatContext)
*/
public void before(RepeatContext context) {
}
/* (non-Javadoc)
* @see org.springframework.batch.repeat.RepeatInterceptor#close(org.springframework.batch.repeat.RepeatContext)
*/
public void close(RepeatContext context) {
}
/* (non-Javadoc)
* @see org.springframework.batch.repeat.RepeatInterceptor#open(org.springframework.batch.repeat.RepeatContext)
*/
public void open(RepeatContext context) {
}
}

View File

@@ -1,55 +1,55 @@
/*
* Copyright 2006-2007 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.sample.dao;
import org.springframework.batch.sample.domain.CustomerCredit;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
/**
* @author Lucas Ward
*
*/
public class IbatisCustomerCreditDao extends SqlMapClientDaoSupport
implements CustomerCreditDao {
String statementId;
/* (non-Javadoc)
* @see org.springframework.batch.sample.dao.CustomerCreditWriter#write(org.springframework.batch.sample.domain.CustomerCredit)
*/
public void writeCredit(CustomerCredit customerCredit) {
getSqlMapClientTemplate().update(statementId, customerCredit);
}
/* (non-Javadoc)
* @see org.springframework.batch.item.ResourceLifecycle#close()
*/
public void close() {
}
/* (non-Javadoc)
* @see org.springframework.batch.item.ResourceLifecycle#open()
*/
public void open() {
}
public void setStatementId(String statementId) {
this.statementId = statementId;
}
}
/*
* Copyright 2006-2007 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.sample.dao;
import org.springframework.batch.sample.domain.CustomerCredit;
import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
/**
* @author Lucas Ward
*
*/
public class IbatisCustomerCreditDao extends SqlMapClientDaoSupport
implements CustomerCreditDao {
String statementId;
/* (non-Javadoc)
* @see org.springframework.batch.sample.dao.CustomerCreditWriter#write(org.springframework.batch.sample.domain.CustomerCredit)
*/
public void writeCredit(CustomerCredit customerCredit) {
getSqlMapClientTemplate().update(statementId, customerCredit);
}
/* (non-Javadoc)
* @see org.springframework.batch.item.ResourceLifecycle#close()
*/
public void close() {
}
/* (non-Javadoc)
* @see org.springframework.batch.item.ResourceLifecycle#open()
*/
public void open() {
}
public void setStatementId(String statementId) {
this.statementId = statementId;
}
}

View File

@@ -1,45 +1,45 @@
package org.springframework.batch.sample.dao;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.exception.ClearFailedException;
import org.springframework.batch.item.exception.FlushFailedException;
import org.springframework.batch.sample.domain.Game;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.util.Assert;
public class JdbcGameDao extends JdbcDaoSupport implements ItemWriter {
private static final String INSERT_GAME = "INSERT into GAMES(player_id,year_no,team,week,opponent,"
+ "completes,attempts,passing_yards,passing_td,interceptions,rushes,rush_yards,"
+ "receptions,receptions_yards,total_td) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
public void write(Object output) {
Assert.isTrue(output instanceof Game,
"Only Game objects can be written out" + "using this Dao");
Game game = (Game) output;
Object[] args = new Object[] { game.getId(),
new Integer(game.getYear()), game.getTeam(),
new Integer(game.getWeek()), game.getOpponent(),
new Integer(game.getCompletes()),
new Integer(game.getAttempts()),
new Integer(game.getPassingYards()),
new Integer(game.getPassingTd()),
new Integer(game.getInterceptions()),
new Integer(game.getRushes()),
new Integer(game.getRushYards()),
new Integer(game.getReceptions()),
new Integer(game.getReceptionYards()),
new Integer(game.getTotalTd()) };
this.getJdbcTemplate().update(INSERT_GAME, args);
}
public void clear() throws ClearFailedException {
}
public void flush() throws FlushFailedException {
}
}
package org.springframework.batch.sample.dao;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.exception.ClearFailedException;
import org.springframework.batch.item.exception.FlushFailedException;
import org.springframework.batch.sample.domain.Game;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.util.Assert;
public class JdbcGameDao extends JdbcDaoSupport implements ItemWriter {
private static final String INSERT_GAME = "INSERT into GAMES(player_id,year_no,team,week,opponent,"
+ "completes,attempts,passing_yards,passing_td,interceptions,rushes,rush_yards,"
+ "receptions,receptions_yards,total_td) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
public void write(Object output) {
Assert.isTrue(output instanceof Game,
"Only Game objects can be written out" + "using this Dao");
Game game = (Game) output;
Object[] args = new Object[] { game.getId(),
new Integer(game.getYear()), game.getTeam(),
new Integer(game.getWeek()), game.getOpponent(),
new Integer(game.getCompletes()),
new Integer(game.getAttempts()),
new Integer(game.getPassingYards()),
new Integer(game.getPassingTd()),
new Integer(game.getInterceptions()),
new Integer(game.getRushes()),
new Integer(game.getRushYards()),
new Integer(game.getReceptions()),
new Integer(game.getReceptionYards()),
new Integer(game.getTotalTd()) };
this.getJdbcTemplate().update(INSERT_GAME, args);
}
public void clear() throws ClearFailedException {
}
public void flush() throws FlushFailedException {
}
}

View File

@@ -1,27 +1,27 @@
/**
*
*/
package org.springframework.batch.sample.dao;
import org.springframework.batch.sample.domain.Player;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
/**
* @author Lucas Ward
*
*/
public class JdbcPlayerDao extends JdbcDaoSupport implements PlayerDao {
public static final String INSERT_PLAYER = "INSERT into players(player_id, " +
"last_name, first_name, pos, year_of_birth, year_drafted)" +
" values (?,?,?,?,?,?)";
public void savePlayer(Player player) {
getJdbcTemplate().update(INSERT_PLAYER,
new Object[]{player.getID(),player.getLastName(),
player.getFirstName(), player.getPosition(),
new Integer(player.getBirthYear()),
new Integer(player.getDebutYear())});
}
}
/**
*
*/
package org.springframework.batch.sample.dao;
import org.springframework.batch.sample.domain.Player;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
/**
* @author Lucas Ward
*
*/
public class JdbcPlayerDao extends JdbcDaoSupport implements PlayerDao {
public static final String INSERT_PLAYER = "INSERT into players(player_id, " +
"last_name, first_name, pos, year_of_birth, year_drafted)" +
" values (?,?,?,?,?,?)";
public void savePlayer(Player player) {
getJdbcTemplate().update(INSERT_PLAYER,
new Object[]{player.getID(),player.getLastName(),
player.getFirstName(), player.getPosition(),
new Integer(player.getBirthYear()),
new Integer(player.getDebutYear())});
}
}

View File

@@ -1,42 +1,42 @@
package org.springframework.batch.sample.dao;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.exception.ClearFailedException;
import org.springframework.batch.item.exception.FlushFailedException;
import org.springframework.batch.sample.domain.PlayerSummary;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.util.Assert;
public class JdbcPlayerSummaryDao extends JdbcDaoSupport implements ItemWriter {
private static final String INSERT_SUMMARY = "INSERT into PLAYER_SUMMARY(ID,YEAR_NO,COMPLETES,ATTEMPTS," +
"PASSING_YARDS,PASSING_TD,INTERCEPTIONS,RUSHES,RUSH_YARDS,RECEPTIONS,RECEPTIONS_YARDS," +
"TOTAL_TD) values(?,?,?,?,?,?,?,?,?,?,?,?)";
public void write(Object output) {
Assert.isInstanceOf(PlayerSummary.class, output, JdbcPlayerSummaryDao.class.getName() + " only " +
"supports outputing " + PlayerSummary.class.getName() + " instances.");
PlayerSummary summary = (PlayerSummary)output;
Object[] args = new Object[]{summary.getId(), new Integer(summary.getYear()),
new Integer(summary.getCompletes()), new Integer(summary.getAttempts()),
new Integer(summary.getPassingYards()), new Integer(summary.getPassingTd()),
new Integer(summary.getInterceptions()), new Integer(summary.getRushes()),
new Integer(summary.getRushYards()), new Integer(summary.getReceptions()),
new Integer(summary.getReceptionYards()), new Integer(summary.getTotalTd()) };
getJdbcTemplate().update(INSERT_SUMMARY, args);
}
public void close() throws Exception {
}
public void clear() throws ClearFailedException {
}
public void flush() throws FlushFailedException {
}
}
package org.springframework.batch.sample.dao;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.exception.ClearFailedException;
import org.springframework.batch.item.exception.FlushFailedException;
import org.springframework.batch.sample.domain.PlayerSummary;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.util.Assert;
public class JdbcPlayerSummaryDao extends JdbcDaoSupport implements ItemWriter {
private static final String INSERT_SUMMARY = "INSERT into PLAYER_SUMMARY(ID,YEAR_NO,COMPLETES,ATTEMPTS," +
"PASSING_YARDS,PASSING_TD,INTERCEPTIONS,RUSHES,RUSH_YARDS,RECEPTIONS,RECEPTIONS_YARDS," +
"TOTAL_TD) values(?,?,?,?,?,?,?,?,?,?,?,?)";
public void write(Object output) {
Assert.isInstanceOf(PlayerSummary.class, output, JdbcPlayerSummaryDao.class.getName() + " only " +
"supports outputing " + PlayerSummary.class.getName() + " instances.");
PlayerSummary summary = (PlayerSummary)output;
Object[] args = new Object[]{summary.getId(), new Integer(summary.getYear()),
new Integer(summary.getCompletes()), new Integer(summary.getAttempts()),
new Integer(summary.getPassingYards()), new Integer(summary.getPassingTd()),
new Integer(summary.getInterceptions()), new Integer(summary.getRushes()),
new Integer(summary.getRushYards()), new Integer(summary.getReceptions()),
new Integer(summary.getReceptionYards()), new Integer(summary.getTotalTd()) };
getJdbcTemplate().update(INSERT_SUMMARY, args);
}
public void close() throws Exception {
}
public void clear() throws ClearFailedException {
}
public void flush() throws FlushFailedException {
}
}

View File

@@ -1,8 +1,8 @@
package org.springframework.batch.sample.dao;
import org.springframework.batch.sample.domain.Player;
public interface PlayerDao {
void savePlayer(Player player);
}
package org.springframework.batch.sample.dao;
import org.springframework.batch.sample.domain.Player;
public interface PlayerDao {
void savePlayer(Player player);
}

View File

@@ -1,70 +1,70 @@
/*
* Copyright 2006-2007 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.sample.domain;
import java.math.BigDecimal;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
public class CustomerCredit {
private int id;
private String name;
private BigDecimal credit;
public String toString() {
return "CustomerCredit [id=" + id +",name=" + name + ", credit=" + credit + "]";
}
public BigDecimal getCredit() {
return credit;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public void setCredit(BigDecimal credit) {
this.credit = credit;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void increaseCreditBy(BigDecimal sum) {
this.credit = this.credit.add(sum);
}
public boolean equals(Object o) {
return EqualsBuilder.reflectionEquals(this, o);
}
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
}
/*
* Copyright 2006-2007 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.sample.domain;
import java.math.BigDecimal;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
public class CustomerCredit {
private int id;
private String name;
private BigDecimal credit;
public String toString() {
return "CustomerCredit [id=" + id +",name=" + name + ", credit=" + credit + "]";
}
public BigDecimal getCredit() {
return credit;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public void setCredit(BigDecimal credit) {
this.credit = credit;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void increaseCreditBy(BigDecimal sum) {
this.credit = this.credit.add(sum);
}
public boolean equals(Object o) {
return EqualsBuilder.reflectionEquals(this, o);
}
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
}

View File

@@ -1,215 +1,215 @@
package org.springframework.batch.sample.domain;
import java.io.Serializable;
import org.apache.commons.lang.builder.EqualsBuilder;
public class Game implements Serializable {
private String id;
private int year;
private String team;
private int week;
private String opponent;
private int completes;
private int attempts;
private int passingYards;
private int passingTd;
private int interceptions;
private int rushes;
private int rushYards;
private int receptions;
private int receptionYards;
private int totalTd;
/**
* @return the id
*/
public String getId() {
return id;
}
/**
* @return the year
*/
public int getYear() {
return year;
}
/**
* @return the team
*/
public String getTeam() {
return team;
}
/**
* @return the week
*/
public int getWeek() {
return week;
}
/**
* @return the opponent
*/
public String getOpponent() {
return opponent;
}
/**
* @return the completes
*/
public int getCompletes() {
return completes;
}
/**
* @return the attempts
*/
public int getAttempts() {
return attempts;
}
/**
* @return the passingYards
*/
public int getPassingYards() {
return passingYards;
}
/**
* @return the passingTd
*/
public int getPassingTd() {
return passingTd;
}
/**
* @return the interceptions
*/
public int getInterceptions() {
return interceptions;
}
/**
* @return the rushes
*/
public int getRushes() {
return rushes;
}
/**
* @return the rushYards
*/
public int getRushYards() {
return rushYards;
}
/**
* @return the receptions
*/
public int getReceptions() {
return receptions;
}
/**
* @return the receptionYards
*/
public int getReceptionYards() {
return receptionYards;
}
/**
* @return the totalTd
*/
public int getTotalTd() {
return totalTd;
}
/**
* @param id the id to set
*/
public void setId(String id) {
this.id = id;
}
/**
* @param year the year to set
*/
public void setYear(int year) {
this.year = year;
}
/**
* @param team the team to set
*/
public void setTeam(String team) {
this.team = team;
}
/**
* @param week the week to set
*/
public void setWeek(int week) {
this.week = week;
}
/**
* @param opponent the opponent to set
*/
public void setOpponent(String opponent) {
this.opponent = opponent;
}
/**
* @param completes the completes to set
*/
public void setCompletes(int completes) {
this.completes = completes;
}
/**
* @param attempts the attempts to set
*/
public void setAttempts(int attempts) {
this.attempts = attempts;
}
/**
* @param passingYards the passingYards to set
*/
public void setPassingYards(int passingYards) {
this.passingYards = passingYards;
}
/**
* @param passingTd the passingTd to set
*/
public void setPassingTd(int passingTd) {
this.passingTd = passingTd;
}
/**
* @param interceptions the interceptions to set
*/
public void setInterceptions(int interceptions) {
this.interceptions = interceptions;
}
/**
* @param rushes the rushes to set
*/
public void setRushes(int rushes) {
this.rushes = rushes;
}
/**
* @param rushYards the rushYards to set
*/
public void setRushYards(int rushYards) {
this.rushYards = rushYards;
}
/**
* @param receptions the receptions to set
*/
public void setReceptions(int receptions) {
this.receptions = receptions;
}
/**
* @param receptionYards the receptionYards to set
*/
public void setReceptionYards(int receptionYards) {
this.receptionYards = receptionYards;
}
/**
* @param totalTd the totalTd to set
*/
public void setTotalTd(int totalTd) {
this.totalTd = totalTd;
}
public String toString() {
return "Game: ID=" + id + " " + team + " vs. " + opponent +
" - " + year;
}
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
}
}
package org.springframework.batch.sample.domain;
import java.io.Serializable;
import org.apache.commons.lang.builder.EqualsBuilder;
public class Game implements Serializable {
private String id;
private int year;
private String team;
private int week;
private String opponent;
private int completes;
private int attempts;
private int passingYards;
private int passingTd;
private int interceptions;
private int rushes;
private int rushYards;
private int receptions;
private int receptionYards;
private int totalTd;
/**
* @return the id
*/
public String getId() {
return id;
}
/**
* @return the year
*/
public int getYear() {
return year;
}
/**
* @return the team
*/
public String getTeam() {
return team;
}
/**
* @return the week
*/
public int getWeek() {
return week;
}
/**
* @return the opponent
*/
public String getOpponent() {
return opponent;
}
/**
* @return the completes
*/
public int getCompletes() {
return completes;
}
/**
* @return the attempts
*/
public int getAttempts() {
return attempts;
}
/**
* @return the passingYards
*/
public int getPassingYards() {
return passingYards;
}
/**
* @return the passingTd
*/
public int getPassingTd() {
return passingTd;
}
/**
* @return the interceptions
*/
public int getInterceptions() {
return interceptions;
}
/**
* @return the rushes
*/
public int getRushes() {
return rushes;
}
/**
* @return the rushYards
*/
public int getRushYards() {
return rushYards;
}
/**
* @return the receptions
*/
public int getReceptions() {
return receptions;
}
/**
* @return the receptionYards
*/
public int getReceptionYards() {
return receptionYards;
}
/**
* @return the totalTd
*/
public int getTotalTd() {
return totalTd;
}
/**
* @param id the id to set
*/
public void setId(String id) {
this.id = id;
}
/**
* @param year the year to set
*/
public void setYear(int year) {
this.year = year;
}
/**
* @param team the team to set
*/
public void setTeam(String team) {
this.team = team;
}
/**
* @param week the week to set
*/
public void setWeek(int week) {
this.week = week;
}
/**
* @param opponent the opponent to set
*/
public void setOpponent(String opponent) {
this.opponent = opponent;
}
/**
* @param completes the completes to set
*/
public void setCompletes(int completes) {
this.completes = completes;
}
/**
* @param attempts the attempts to set
*/
public void setAttempts(int attempts) {
this.attempts = attempts;
}
/**
* @param passingYards the passingYards to set
*/
public void setPassingYards(int passingYards) {
this.passingYards = passingYards;
}
/**
* @param passingTd the passingTd to set
*/
public void setPassingTd(int passingTd) {
this.passingTd = passingTd;
}
/**
* @param interceptions the interceptions to set
*/
public void setInterceptions(int interceptions) {
this.interceptions = interceptions;
}
/**
* @param rushes the rushes to set
*/
public void setRushes(int rushes) {
this.rushes = rushes;
}
/**
* @param rushYards the rushYards to set
*/
public void setRushYards(int rushYards) {
this.rushYards = rushYards;
}
/**
* @param receptions the receptions to set
*/
public void setReceptions(int receptions) {
this.receptions = receptions;
}
/**
* @param receptionYards the receptionYards to set
*/
public void setReceptionYards(int receptionYards) {
this.receptionYards = receptionYards;
}
/**
* @param totalTd the totalTd to set
*/
public void setTotalTd(int totalTd) {
this.totalTd = totalTd;
}
public String toString() {
return "Game: ID=" + id + " " + team + " vs. " + opponent +
" - " + year;
}
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
}
}

View File

@@ -1,79 +1,79 @@
/*
* Copyright 2006-2007 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.sample.domain;
import java.util.ArrayList;
import java.util.List;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;
/**
* Custom class that contains logic that would normally be be contained in
* {@link ItemReader} and {@link ItemWriter}.
*
* @author tomas.slanina
* @author Robert Kasanicky
*/
public class PersonService {
private static final int GENERATION_LIMIT = 10;
private int generatedCounter = 0;
private int processedCounter = 0;
public Person getData() {
if (generatedCounter >= GENERATION_LIMIT)
return null;
Person person = new Person();
Address address = new Address();
Child child = new Child();
List children = new ArrayList(1);
children.add(child);
person.setFirstName("John" + generatedCounter);
person.setAge(20 + generatedCounter);
address.setCity("Johnsville" + generatedCounter);
child.setName("Little Johny" + generatedCounter);
person.setAddress(address);
person.setChildren(children);
generatedCounter++;
return person;
}
/**
* Badly designed method signature which accepts multiple implicitly related
* arguments instead of a single Person argument.
*/
public void processPerson(String name, String city) {
processedCounter++;
}
public int getReturnedCount() {
return generatedCounter;
}
public int getReceivedCount() {
return processedCounter;
}
}
/*
* Copyright 2006-2007 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.sample.domain;
import java.util.ArrayList;
import java.util.List;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;
/**
* Custom class that contains logic that would normally be be contained in
* {@link ItemReader} and {@link ItemWriter}.
*
* @author tomas.slanina
* @author Robert Kasanicky
*/
public class PersonService {
private static final int GENERATION_LIMIT = 10;
private int generatedCounter = 0;
private int processedCounter = 0;
public Person getData() {
if (generatedCounter >= GENERATION_LIMIT)
return null;
Person person = new Person();
Address address = new Address();
Child child = new Child();
List children = new ArrayList(1);
children.add(child);
person.setFirstName("John" + generatedCounter);
person.setAge(20 + generatedCounter);
address.setCity("Johnsville" + generatedCounter);
child.setName("Little Johny" + generatedCounter);
person.setAddress(address);
person.setChildren(children);
generatedCounter++;
return person;
}
/**
* Badly designed method signature which accepts multiple implicitly related
* arguments instead of a single Person argument.
*/
public void processPerson(String name, String city) {
processedCounter++;
}
public int getReturnedCount() {
return generatedCounter;
}
public int getReceivedCount() {
return processedCounter;
}
}

View File

@@ -1,64 +1,64 @@
package org.springframework.batch.sample.domain;
import java.io.Serializable;
public class Player implements Serializable {
private String ID;
private String lastName;
private String firstName;
private String position;
private int birthYear;
private int debutYear;
public String toString() {
return "PLAYER:ID=" + ID + ",Last Name=" + lastName +
",First Name=" + firstName + ",Position=" + position +
",Birth Year=" + birthYear + ",DebutYear=" +
debutYear;
}
public String getID() {
return ID;
}
public String getLastName() {
return lastName;
}
public String getFirstName() {
return firstName;
}
public String getPosition() {
return position;
}
public int getBirthYear() {
return birthYear;
}
public int getDebutYear() {
return debutYear;
}
public void setID(String id) {
ID = id;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public void setPosition(String position) {
this.position = position;
}
public void setBirthYear(int birthYear) {
this.birthYear = birthYear;
}
public void setDebutYear(int debutYear) {
this.debutYear = debutYear;
}
}
package org.springframework.batch.sample.domain;
import java.io.Serializable;
public class Player implements Serializable {
private String ID;
private String lastName;
private String firstName;
private String position;
private int birthYear;
private int debutYear;
public String toString() {
return "PLAYER:ID=" + ID + ",Last Name=" + lastName +
",First Name=" + firstName + ",Position=" + position +
",Birth Year=" + birthYear + ",DebutYear=" +
debutYear;
}
public String getID() {
return ID;
}
public String getLastName() {
return lastName;
}
public String getFirstName() {
return firstName;
}
public String getPosition() {
return position;
}
public int getBirthYear() {
return birthYear;
}
public int getDebutYear() {
return debutYear;
}
public void setID(String id) {
ID = id;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public void setPosition(String position) {
this.position = position;
}
public void setBirthYear(int birthYear) {
this.birthYear = birthYear;
}
public void setDebutYear(int debutYear) {
this.debutYear = debutYear;
}
}

View File

@@ -1,108 +1,108 @@
package org.springframework.batch.sample.domain;
import org.apache.commons.lang.builder.EqualsBuilder;
/**
* Domain object representing the summary of a given Player's
* year.
*
* @author Lucas Ward
*
*/
public class PlayerSummary {
private String id;
private int year;
private int completes;
private int attempts;
private int passingYards;
private int passingTd;
private int interceptions;
private int rushes;
private int rushYards;
private int receptions;
private int receptionYards;
private int totalTd;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getCompletes() {
return completes;
}
public void setCompletes(int completes) {
this.completes = completes;
}
public int getAttempts() {
return attempts;
}
public void setAttempts(int attempts) {
this.attempts = attempts;
}
public int getPassingYards() {
return passingYards;
}
public void setPassingYards(int passingYards) {
this.passingYards = passingYards;
}
public int getPassingTd() {
return passingTd;
}
public void setPassingTd(int passingTd) {
this.passingTd = passingTd;
}
public int getInterceptions() {
return interceptions;
}
public void setInterceptions(int interceptions) {
this.interceptions = interceptions;
}
public int getRushes() {
return rushes;
}
public void setRushes(int rushes) {
this.rushes = rushes;
}
public int getRushYards() {
return rushYards;
}
public void setRushYards(int rushYards) {
this.rushYards = rushYards;
}
public int getReceptions() {
return receptions;
}
public void setReceptions(int receptions) {
this.receptions = receptions;
}
public int getReceptionYards() {
return receptionYards;
}
public void setReceptionYards(int receptionYards) {
this.receptionYards = receptionYards;
}
public int getTotalTd() {
return totalTd;
}
public void setTotalTd(int totalTd) {
this.totalTd = totalTd;
}
public String toString() {
return "Player Summary: ID=" + id + " Year=" + year;
}
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
}
}
package org.springframework.batch.sample.domain;
import org.apache.commons.lang.builder.EqualsBuilder;
/**
* Domain object representing the summary of a given Player's
* year.
*
* @author Lucas Ward
*
*/
public class PlayerSummary {
private String id;
private int year;
private int completes;
private int attempts;
private int passingYards;
private int passingTd;
private int interceptions;
private int rushes;
private int rushYards;
private int receptions;
private int receptionYards;
private int totalTd;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getCompletes() {
return completes;
}
public void setCompletes(int completes) {
this.completes = completes;
}
public int getAttempts() {
return attempts;
}
public void setAttempts(int attempts) {
this.attempts = attempts;
}
public int getPassingYards() {
return passingYards;
}
public void setPassingYards(int passingYards) {
this.passingYards = passingYards;
}
public int getPassingTd() {
return passingTd;
}
public void setPassingTd(int passingTd) {
this.passingTd = passingTd;
}
public int getInterceptions() {
return interceptions;
}
public void setInterceptions(int interceptions) {
this.interceptions = interceptions;
}
public int getRushes() {
return rushes;
}
public void setRushes(int rushes) {
this.rushes = rushes;
}
public int getRushYards() {
return rushYards;
}
public void setRushYards(int rushYards) {
this.rushYards = rushYards;
}
public int getReceptions() {
return receptions;
}
public void setReceptions(int receptions) {
this.receptions = receptions;
}
public int getReceptionYards() {
return receptionYards;
}
public void setReceptionYards(int receptionYards) {
this.receptionYards = receptionYards;
}
public int getTotalTd() {
return totalTd;
}
public void setTotalTd(int totalTd) {
this.totalTd = totalTd;
}
public String toString() {
return "Player Summary: ID=" + id + " Year=" + year;
}
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
}
}

View File

@@ -1,24 +1,24 @@
package org.springframework.batch.sample.exception.handler;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.batch.repeat.RepeatContext;
import org.springframework.batch.repeat.exception.handler.ExceptionHandler;
public class FootballExceptionHandler implements ExceptionHandler {
private static final Log logger = LogFactory
.getLog(FootballExceptionHandler.class);
public void handleException(RepeatContext context, Throwable throwable)
throws RuntimeException {
if (!(throwable instanceof NumberFormatException)) {
throw new RuntimeException(throwable);
} else {
logger.error("Number Format Exception!", throwable);
}
}
}
package org.springframework.batch.sample.exception.handler;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.batch.repeat.RepeatContext;
import org.springframework.batch.repeat.exception.handler.ExceptionHandler;
public class FootballExceptionHandler implements ExceptionHandler {
private static final Log logger = LogFactory
.getLog(FootballExceptionHandler.class);
public void handleException(RepeatContext context, Throwable throwable)
throws RuntimeException {
if (!(throwable instanceof NumberFormatException)) {
throw new RuntimeException(throwable);
} else {
logger.error("Number Format Exception!", throwable);
}
}
}

View File

@@ -1,73 +1,73 @@
package org.springframework.batch.sample.item.reader;
import java.math.BigDecimal;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemRecoverer;
import org.springframework.batch.item.exception.MarkFailedException;
import org.springframework.batch.item.exception.ResetFailedException;
import org.springframework.batch.sample.domain.Trade;
/**
* Generates configurable number of {@link Trade} items.
*
* @author Robert Kasanicky
*/
public class GeneratingItemReader implements ItemReader, ItemRecoverer {
private int limit = 1;
private int counter = 0;
private int marked;
public Object read() throws Exception {
if (counter < limit) {
counter++;
return new Trade(
"isin" + counter,
counter,
new BigDecimal(counter),
"customer" + counter);
}
return null;
}
/**
* @param limit number of items that will be generated
* (null returned on consecutive calls).
*/
public void setLimit(int limit) {
this.limit = limit;
}
public int getCounter() {
return counter;
}
public int getLimit() {
return limit;
}
/* (non-Javadoc)
* @see org.springframework.batch.item.ItemRecoverer#recover(java.lang.Object, java.lang.Throwable)
*/
public boolean recover(Object data, Throwable cause) {
return false;
}
/* (non-Javadoc)
* @see org.springframework.batch.item.ItemStream#mark()
*/
public void mark() throws MarkFailedException {
this.marked = this.counter;
}
/* (non-Javadoc)
* @see org.springframework.batch.item.ItemStream#reset()
*/
public void reset() throws ResetFailedException {
this.counter = this.marked;
}
}
package org.springframework.batch.sample.item.reader;
import java.math.BigDecimal;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemRecoverer;
import org.springframework.batch.item.exception.MarkFailedException;
import org.springframework.batch.item.exception.ResetFailedException;
import org.springframework.batch.sample.domain.Trade;
/**
* Generates configurable number of {@link Trade} items.
*
* @author Robert Kasanicky
*/
public class GeneratingItemReader implements ItemReader, ItemRecoverer {
private int limit = 1;
private int counter = 0;
private int marked;
public Object read() throws Exception {
if (counter < limit) {
counter++;
return new Trade(
"isin" + counter,
counter,
new BigDecimal(counter),
"customer" + counter);
}
return null;
}
/**
* @param limit number of items that will be generated
* (null returned on consecutive calls).
*/
public void setLimit(int limit) {
this.limit = limit;
}
public int getCounter() {
return counter;
}
public int getLimit() {
return limit;
}
/* (non-Javadoc)
* @see org.springframework.batch.item.ItemRecoverer#recover(java.lang.Object, java.lang.Throwable)
*/
public boolean recover(Object data, Throwable cause) {
return false;
}
/* (non-Javadoc)
* @see org.springframework.batch.item.ItemStream#mark()
*/
public void mark() throws MarkFailedException {
this.marked = this.counter;
}
/* (non-Javadoc)
* @see org.springframework.batch.item.ItemStream#reset()
*/
public void reset() throws ResetFailedException {
this.counter = this.marked;
}
}

View File

@@ -1,246 +1,246 @@
package org.springframework.batch.sample.item.reader;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.lang.SerializationUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.batch.core.domain.StepExecution;
import org.springframework.batch.core.domain.StepListener;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemStream;
import org.springframework.batch.item.exception.StreamException;
import org.springframework.batch.repeat.ExitStatus;
import org.springframework.batch.sample.item.writer.StagingItemWriter;
import org.springframework.dao.OptimisticLockingFailureException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.jdbc.support.lob.DefaultLobHandler;
import org.springframework.jdbc.support.lob.LobHandler;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.util.Assert;
public class StagingItemReader extends JdbcDaoSupport implements ItemStream, ItemReader, StepListener {
// Key for buffer in transaction synchronization manager
private static final String BUFFER_KEY = StagingItemReader.class.getName() + ".BUFFER";
private static Log logger = LogFactory.getLog(StagingItemReader.class);
private StepExecution stepExecution;
private LobHandler lobHandler = new DefaultLobHandler();
private Object lock = new Object();
private volatile boolean initialized = false;
private volatile Iterator keys;
/**
* Public setter for the {@link LobHandler}.
* @param lobHandler the {@link LobHandler} to set (defaults to {@link DefaultLobHandler}).
*/
public void setLobHandler(LobHandler lobHandler) {
this.lobHandler = lobHandler;
}
/**
*
* @see org.springframework.batch.io.driving.DrivingQueryItemReader#close(ExecutionContext)
*/
public void close(ExecutionContext executionContext) {
initialized = false;
keys = null;
if (TransactionSynchronizationManager.hasResource(BUFFER_KEY)) {
TransactionSynchronizationManager.unbindResource(BUFFER_KEY);
}
}
/**
*
* @see org.springframework.batch.io.driving.DrivingQueryItemReader#open()
*/
public void open(ExecutionContext executionContext) {
// Can be called from multiple threads because of lazy initialisation...
synchronized (lock) {
if (keys == null) {
keys = retrieveKeys().iterator();
logger.info("Keys obtained for staging.");
initialized = true;
}
}
}
private List retrieveKeys() {
synchronized (lock) {
return getJdbcTemplate().query(
"SELECT ID FROM BATCH_STAGING WHERE JOB_ID=? AND PROCESSED=? ORDER BY ID",
new Object[] { stepExecution.getJobExecution().getJobId(), StagingItemWriter.NEW },
new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
return new Long(rs.getLong(1));
}
}
);
}
}
public Object read() throws Exception {
Long id = doRead();
if (id == null) {
return null;
}
Object result = getJdbcTemplate().queryForObject("SELECT VALUE FROM BATCH_STAGING WHERE ID=?",
new Object[] { id }, new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
byte[] blob = lobHandler.getBlobAsBytes(rs, 1);
return SerializationUtils.deserialize(blob);
}
});
// Update now - changes will rollback if there is a problem later.
int count = getJdbcTemplate().update("UPDATE BATCH_STAGING SET PROCESSED=? WHERE ID=? AND PROCESSED=?",
new Object[] { StagingItemWriter.DONE, id, StagingItemWriter.NEW });
if (count != 1) {
throw new OptimisticLockingFailureException("The staging record with ID=" + id
+ " was updated concurrently when trying to mark as complete (updated " + count + " records.");
}
return result;
}
private Long doRead() {
if (!initialized) {
throw new StreamException("ItemStream must be open before it can be read.");
}
Long key = getBuffer().next();
if (key == null) {
synchronized (lock) {
if (keys.hasNext()) {
Assert.state(TransactionSynchronizationManager.isActualTransactionActive(),
"Transaction not active for this thread.");
Long next = (Long) keys.next();
getBuffer().add(next);
key = next;
logger.debug("Retrieved key from list: " + key);
}
}
}
else {
logger.debug("Retrieved key from buffer: " + key);
}
return key;
}
private StagingBuffer getBuffer() {
if (!TransactionSynchronizationManager.hasResource(BUFFER_KEY)) {
TransactionSynchronizationManager.bindResource(BUFFER_KEY, new StagingBuffer());
}
return (StagingBuffer) TransactionSynchronizationManager.getResource(BUFFER_KEY);
}
public boolean recover(Object data, Throwable cause) {
return false;
}
private class StagingBuffer {
private List list = new ArrayList();
private Iterator iter = new ArrayList().iterator();
public Long next() {
if (iter.hasNext()) {
return (Long) iter.next();
}
return null;
}
public void add(Long next) {
list.add(next);
}
public void rollback() {
logger.debug("Resetting buffer on rollback: " + list);
iter = new ArrayList(list).iterator();
}
public void commit() {
logger.debug("Clearing buffer on commit: " + list);
list.clear();
iter = new ArrayList().iterator();
}
public String toString() {
return "list=" + list + "; iter.hasNext()=" + iter.hasNext();
}
}
/**
* Mark is supported in a multi- as well as a single-threaded environment.
* The state backing the mark is a buffer, and access is synchronized, so
* multiple threads can be accommodated. Buffers are stored as transaction
* resources (using
* {@link TransactionSynchronizationManager#bindResource(Object, Object)}),
* so they are thread bound.
*
* @see org.springframework.batch.item.ItemReader#mark()
*/
public void mark() {
getBuffer().commit();
}
/*
* (non-Javadoc)
*
* @see org.springframework.batch.item.ItemStream#reset(org.springframework.batch.item.ExecutionContext)
*/
public void reset() {
getBuffer().rollback();
}
/*
* (non-Javadoc)
*
* @see org.springframework.batch.item.ExecutionContextProvider#getExecutionContext()
*/
public void update(ExecutionContext executionContext) {
}
/* (non-Javadoc)
* @see org.springframework.batch.core.domain.StepListener#afterStep(StepExecution)
*/
public ExitStatus afterStep(StepExecution stepExecution) {
return null;
}
/* (non-Javadoc)
* @see org.springframework.batch.core.domain.StepListener#beforeStep(org.springframework.batch.core.domain.StepExecution)
*/
public void beforeStep(StepExecution stepExecution) {
this.stepExecution = stepExecution;
}
/* (non-Javadoc)
* @see org.springframework.batch.core.domain.StepListener#onErrorInStep(java.lang.Throwable)
*/
public ExitStatus onErrorInStep(StepExecution stepExecution, Throwable e) {
return null;
}
}
package org.springframework.batch.sample.item.reader;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.lang.SerializationUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.batch.core.domain.StepExecution;
import org.springframework.batch.core.domain.StepListener;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemStream;
import org.springframework.batch.item.exception.StreamException;
import org.springframework.batch.repeat.ExitStatus;
import org.springframework.batch.sample.item.writer.StagingItemWriter;
import org.springframework.dao.OptimisticLockingFailureException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.jdbc.support.lob.DefaultLobHandler;
import org.springframework.jdbc.support.lob.LobHandler;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.util.Assert;
public class StagingItemReader extends JdbcDaoSupport implements ItemStream, ItemReader, StepListener {
// Key for buffer in transaction synchronization manager
private static final String BUFFER_KEY = StagingItemReader.class.getName() + ".BUFFER";
private static Log logger = LogFactory.getLog(StagingItemReader.class);
private StepExecution stepExecution;
private LobHandler lobHandler = new DefaultLobHandler();
private Object lock = new Object();
private volatile boolean initialized = false;
private volatile Iterator keys;
/**
* Public setter for the {@link LobHandler}.
* @param lobHandler the {@link LobHandler} to set (defaults to {@link DefaultLobHandler}).
*/
public void setLobHandler(LobHandler lobHandler) {
this.lobHandler = lobHandler;
}
/**
*
* @see org.springframework.batch.io.driving.DrivingQueryItemReader#close(ExecutionContext)
*/
public void close(ExecutionContext executionContext) {
initialized = false;
keys = null;
if (TransactionSynchronizationManager.hasResource(BUFFER_KEY)) {
TransactionSynchronizationManager.unbindResource(BUFFER_KEY);
}
}
/**
*
* @see org.springframework.batch.io.driving.DrivingQueryItemReader#open()
*/
public void open(ExecutionContext executionContext) {
// Can be called from multiple threads because of lazy initialisation...
synchronized (lock) {
if (keys == null) {
keys = retrieveKeys().iterator();
logger.info("Keys obtained for staging.");
initialized = true;
}
}
}
private List retrieveKeys() {
synchronized (lock) {
return getJdbcTemplate().query(
"SELECT ID FROM BATCH_STAGING WHERE JOB_ID=? AND PROCESSED=? ORDER BY ID",
new Object[] { stepExecution.getJobExecution().getJobId(), StagingItemWriter.NEW },
new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
return new Long(rs.getLong(1));
}
}
);
}
}
public Object read() throws Exception {
Long id = doRead();
if (id == null) {
return null;
}
Object result = getJdbcTemplate().queryForObject("SELECT VALUE FROM BATCH_STAGING WHERE ID=?",
new Object[] { id }, new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
byte[] blob = lobHandler.getBlobAsBytes(rs, 1);
return SerializationUtils.deserialize(blob);
}
});
// Update now - changes will rollback if there is a problem later.
int count = getJdbcTemplate().update("UPDATE BATCH_STAGING SET PROCESSED=? WHERE ID=? AND PROCESSED=?",
new Object[] { StagingItemWriter.DONE, id, StagingItemWriter.NEW });
if (count != 1) {
throw new OptimisticLockingFailureException("The staging record with ID=" + id
+ " was updated concurrently when trying to mark as complete (updated " + count + " records.");
}
return result;
}
private Long doRead() {
if (!initialized) {
throw new StreamException("ItemStream must be open before it can be read.");
}
Long key = getBuffer().next();
if (key == null) {
synchronized (lock) {
if (keys.hasNext()) {
Assert.state(TransactionSynchronizationManager.isActualTransactionActive(),
"Transaction not active for this thread.");
Long next = (Long) keys.next();
getBuffer().add(next);
key = next;
logger.debug("Retrieved key from list: " + key);
}
}
}
else {
logger.debug("Retrieved key from buffer: " + key);
}
return key;
}
private StagingBuffer getBuffer() {
if (!TransactionSynchronizationManager.hasResource(BUFFER_KEY)) {
TransactionSynchronizationManager.bindResource(BUFFER_KEY, new StagingBuffer());
}
return (StagingBuffer) TransactionSynchronizationManager.getResource(BUFFER_KEY);
}
public boolean recover(Object data, Throwable cause) {
return false;
}
private class StagingBuffer {
private List list = new ArrayList();
private Iterator iter = new ArrayList().iterator();
public Long next() {
if (iter.hasNext()) {
return (Long) iter.next();
}
return null;
}
public void add(Long next) {
list.add(next);
}
public void rollback() {
logger.debug("Resetting buffer on rollback: " + list);
iter = new ArrayList(list).iterator();
}
public void commit() {
logger.debug("Clearing buffer on commit: " + list);
list.clear();
iter = new ArrayList().iterator();
}
public String toString() {
return "list=" + list + "; iter.hasNext()=" + iter.hasNext();
}
}
/**
* Mark is supported in a multi- as well as a single-threaded environment.
* The state backing the mark is a buffer, and access is synchronized, so
* multiple threads can be accommodated. Buffers are stored as transaction
* resources (using
* {@link TransactionSynchronizationManager#bindResource(Object, Object)}),
* so they are thread bound.
*
* @see org.springframework.batch.item.ItemReader#mark()
*/
public void mark() {
getBuffer().commit();
}
/*
* (non-Javadoc)
*
* @see org.springframework.batch.item.ItemStream#reset(org.springframework.batch.item.ExecutionContext)
*/
public void reset() {
getBuffer().rollback();
}
/*
* (non-Javadoc)
*
* @see org.springframework.batch.item.ExecutionContextProvider#getExecutionContext()
*/
public void update(ExecutionContext executionContext) {
}
/* (non-Javadoc)
* @see org.springframework.batch.core.domain.StepListener#afterStep(StepExecution)
*/
public ExitStatus afterStep(StepExecution stepExecution) {
return null;
}
/* (non-Javadoc)
* @see org.springframework.batch.core.domain.StepListener#beforeStep(org.springframework.batch.core.domain.StepExecution)
*/
public void beforeStep(StepExecution stepExecution) {
this.stepExecution = stepExecution;
}
/* (non-Javadoc)
* @see org.springframework.batch.core.domain.StepListener#onErrorInStep(java.lang.Throwable)
*/
public ExitStatus onErrorInStep(StepExecution stepExecution, Throwable e) {
return null;
}
}

View File

@@ -1,69 +1,69 @@
package org.springframework.batch.sample.item.writer;
import java.math.BigDecimal;
import org.springframework.batch.io.support.BatchSqlUpdateItemWriter;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.exception.ClearFailedException;
import org.springframework.batch.item.exception.FlushFailedException;
import org.springframework.batch.sample.domain.CustomerCredit;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;
/**
* Increases customer's credit by fixed amount, delegating to a
* {@link BatchSqlUpdateItemWriter} to push the result out to persistent
* storage.
*
* @author Dave Syer
*/
public class BatchSqlCustomerCreditIncreaseWriter implements ItemWriter, InitializingBean {
private ItemWriter delegate;
public static final BigDecimal FIXED_AMOUNT = new BigDecimal(1000);
/**
* Public setter for the {@link ItemWriter}, which must be an instance of
* {@link BatchSqlUpdateItemWriter}.
* @param delegate the delegate to set
*/
public void setDelegate(ItemWriter delegate) {
this.delegate = delegate;
}
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
*/
public void afterPropertiesSet() throws Exception {
Assert.state(delegate instanceof BatchSqlUpdateItemWriter, "Delegate must be set and must be an instance of BatchSqlUpdateItemWriter");
}
/*
* (non-Javadoc)
* @see org.springframework.batch.item.processor.DelegatingItemWriter#doProcess(java.lang.Object)
*/
public void write(Object data) throws Exception {
CustomerCredit customerCredit = (CustomerCredit) data;
customerCredit.increaseCreditBy(FIXED_AMOUNT);
delegate.write(customerCredit);
}
/**
* @throws ClearFailedException
* @see org.springframework.batch.io.support.BatchSqlUpdateItemWriter#clear()
*/
public void clear() throws ClearFailedException {
delegate.clear();
}
/**
* @throws FlushFailedException
* @see org.springframework.batch.io.support.BatchSqlUpdateItemWriter#flush()
*/
public void flush() throws FlushFailedException {
delegate.flush();
}
}
package org.springframework.batch.sample.item.writer;
import java.math.BigDecimal;
import org.springframework.batch.io.support.BatchSqlUpdateItemWriter;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.exception.ClearFailedException;
import org.springframework.batch.item.exception.FlushFailedException;
import org.springframework.batch.sample.domain.CustomerCredit;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;
/**
* Increases customer's credit by fixed amount, delegating to a
* {@link BatchSqlUpdateItemWriter} to push the result out to persistent
* storage.
*
* @author Dave Syer
*/
public class BatchSqlCustomerCreditIncreaseWriter implements ItemWriter, InitializingBean {
private ItemWriter delegate;
public static final BigDecimal FIXED_AMOUNT = new BigDecimal(1000);
/**
* Public setter for the {@link ItemWriter}, which must be an instance of
* {@link BatchSqlUpdateItemWriter}.
* @param delegate the delegate to set
*/
public void setDelegate(ItemWriter delegate) {
this.delegate = delegate;
}
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
*/
public void afterPropertiesSet() throws Exception {
Assert.state(delegate instanceof BatchSqlUpdateItemWriter, "Delegate must be set and must be an instance of BatchSqlUpdateItemWriter");
}
/*
* (non-Javadoc)
* @see org.springframework.batch.item.processor.DelegatingItemWriter#doProcess(java.lang.Object)
*/
public void write(Object data) throws Exception {
CustomerCredit customerCredit = (CustomerCredit) data;
customerCredit.increaseCreditBy(FIXED_AMOUNT);
delegate.write(customerCredit);
}
/**
* @throws ClearFailedException
* @see org.springframework.batch.io.support.BatchSqlUpdateItemWriter#clear()
*/
public void clear() throws ClearFailedException {
delegate.clear();
}
/**
* @throws FlushFailedException
* @see org.springframework.batch.io.support.BatchSqlUpdateItemWriter#flush()
*/
public void flush() throws FlushFailedException {
delegate.flush();
}
}

View File

@@ -1,37 +1,37 @@
package org.springframework.batch.sample.item.writer;
import java.math.BigDecimal;
import org.springframework.batch.item.writer.AbstractItemWriter;
import org.springframework.batch.sample.dao.CustomerCreditDao;
import org.springframework.batch.sample.domain.CustomerCredit;
/**
* Increases customer's credit by fixed amount.
*
* @author Robert Kasanicky
*/
public class CustomerCreditIncreaseWriter extends AbstractItemWriter {
public static final BigDecimal FIXED_AMOUNT = new BigDecimal(1000);
private CustomerCreditDao customerCreditDao;
/**
* Public setter for the {@link CustomerCreditDao}.
* @param customerCreditDao the {@link CustomerCreditDao} to set
*/
public void setCustomerCreditDao(CustomerCreditDao customerCreditDao) {
this.customerCreditDao = customerCreditDao;
}
/* (non-Javadoc)
* @see org.springframework.batch.item.processor.DelegatingItemWriter#doProcess(java.lang.Object)
*/
public void write(Object data) throws Exception {
CustomerCredit customerCredit = (CustomerCredit) data;
customerCredit.increaseCreditBy(FIXED_AMOUNT);
customerCreditDao.writeCredit(customerCredit);
}
}
package org.springframework.batch.sample.item.writer;
import java.math.BigDecimal;
import org.springframework.batch.item.writer.AbstractItemWriter;
import org.springframework.batch.sample.dao.CustomerCreditDao;
import org.springframework.batch.sample.domain.CustomerCredit;
/**
* Increases customer's credit by fixed amount.
*
* @author Robert Kasanicky
*/
public class CustomerCreditIncreaseWriter extends AbstractItemWriter {
public static final BigDecimal FIXED_AMOUNT = new BigDecimal(1000);
private CustomerCreditDao customerCreditDao;
/**
* Public setter for the {@link CustomerCreditDao}.
* @param customerCreditDao the {@link CustomerCreditDao} to set
*/
public void setCustomerCreditDao(CustomerCreditDao customerCreditDao) {
this.customerCreditDao = customerCreditDao;
}
/* (non-Javadoc)
* @see org.springframework.batch.item.processor.DelegatingItemWriter#doProcess(java.lang.Object)
*/
public void write(Object data) throws Exception {
CustomerCredit customerCredit = (CustomerCredit) data;
customerCredit.increaseCreditBy(FIXED_AMOUNT);
customerCreditDao.writeCredit(customerCredit);
}
}

View File

@@ -1,21 +1,21 @@
package org.springframework.batch.sample.item.writer;
import org.springframework.batch.item.writer.AbstractItemWriter;
import org.springframework.batch.sample.dao.PlayerDao;
import org.springframework.batch.sample.domain.Player;
public class PlayerItemWriter extends AbstractItemWriter {
PlayerDao playerDao;
public void write(Object data) throws Exception {
playerDao.savePlayer((Player)data);
}
public void setPlayerDao(PlayerDao playerDao) {
this.playerDao = playerDao;
}
public void close() throws Exception {
}
}
package org.springframework.batch.sample.item.writer;
import org.springframework.batch.item.writer.AbstractItemWriter;
import org.springframework.batch.sample.dao.PlayerDao;
import org.springframework.batch.sample.domain.Player;
public class PlayerItemWriter extends AbstractItemWriter {
PlayerDao playerDao;
public void write(Object data) throws Exception {
playerDao.savePlayer((Player)data);
}
public void setPlayerDao(PlayerDao playerDao) {
this.playerDao = playerDao;
}
public void close() throws Exception {
}
}

View File

@@ -1,29 +1,29 @@
package org.springframework.batch.sample.item.writer;
import org.springframework.batch.item.writer.AbstractItemWriter;
/**
* Simulates temporary output trouble - requires to
* retry 3 times to pass successfully.
*
* @author Robert Kasanicky
*/
public class RetrySampleItemWriter extends AbstractItemWriter {
private int counter = 0;
public void write(Object data) throws Exception {
counter++;
if (counter == 2 || counter == 3) {
throw new RuntimeException("Temporary error");
}
}
/**
* @return number of times {@link #handle(Object)} method was called.
*/
public int getCounter() {
return counter;
}
}
package org.springframework.batch.sample.item.writer;
import org.springframework.batch.item.writer.AbstractItemWriter;
/**
* Simulates temporary output trouble - requires to
* retry 3 times to pass successfully.
*
* @author Robert Kasanicky
*/
public class RetrySampleItemWriter extends AbstractItemWriter {
private int counter = 0;
public void write(Object data) throws Exception {
counter++;
if (counter == 2 || counter == 3) {
throw new RuntimeException("Temporary error");
}
}
/**
* @return number of times {@link #handle(Object)} method was called.
*/
public int getCounter() {
return counter;
}
}

View File

@@ -1,117 +1,117 @@
package org.springframework.batch.sample.item.writer;
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import org.apache.commons.lang.SerializationUtils;
import org.springframework.batch.core.domain.StepExecution;
import org.springframework.batch.core.domain.StepListener;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.exception.ClearFailedException;
import org.springframework.batch.item.exception.FlushFailedException;
import org.springframework.batch.repeat.ExitStatus;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer;
import org.springframework.jdbc.support.lob.DefaultLobHandler;
import org.springframework.jdbc.support.lob.LobHandler;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
public class StagingItemWriter extends JdbcDaoSupport implements StepListener, ItemWriter {
public static final String NEW = "N";
public static final String DONE = "Y";
public static final Object WORKING = "W";
private DataFieldMaxValueIncrementer incrementer;
private StepExecution stepExecution;
private LobHandler lobHandler = new DefaultLobHandler();
/**
* Public setter for the {@link LobHandler}.
* @param lobHandler the {@link LobHandler} to set (defaults to
* {@link DefaultLobHandler}).
*/
public void setLobHandler(LobHandler lobHandler) {
this.lobHandler = lobHandler;
}
/**
* Check mandatory properties.
*
* @see org.springframework.dao.support.DaoSupport#initDao()
*/
protected void initDao() throws Exception {
super.initDao();
Assert.notNull(incrementer, "DataFieldMaxValueIncrementer is required - set the incrementer property in the "
+ ClassUtils.getShortName(StagingItemWriter.class));
}
/**
* Setter for the key generator for the staging table.
*
* @param incrementer the {@link DataFieldMaxValueIncrementer} to set
*/
public void setIncrementer(DataFieldMaxValueIncrementer incrementer) {
this.incrementer = incrementer;
}
/**
* Serialize the item to the staging table, and add a NEW processed flag.
*
* @see ItemWriter#write(java.lang.Object)
*/
public void write(Object data) {
final long id = incrementer.nextLongValue();
final long jobId = stepExecution.getJobExecution().getJobId().longValue();
final byte[] blob = SerializationUtils.serialize((Serializable) data);
getJdbcTemplate()
.update("INSERT into BATCH_STAGING (ID, JOB_ID, VALUE, PROCESSED) values (?,?,?,?)",
new PreparedStatementSetter() {
public void setValues(PreparedStatement ps) throws SQLException {
ps.setLong(1, id);
ps.setLong(2, jobId);
lobHandler.getLobCreator().setBlobAsBytes(ps, 3, blob);
ps.setString(4, NEW);
}
});
}
public void close() throws Exception {
}
public void clear() throws ClearFailedException {
}
public void flush() throws FlushFailedException {
}
/* (non-Javadoc)
* @see org.springframework.batch.core.domain.StepListener#afterStep(StepExecution)
*/
public ExitStatus afterStep(StepExecution stepExecution) {
return null;
}
/* (non-Javadoc)
* @see org.springframework.batch.core.domain.StepListener#beforeStep(org.springframework.batch.core.domain.StepExecution)
*/
public void beforeStep(StepExecution stepExecution) {
this.stepExecution = stepExecution;
}
/* (non-Javadoc)
* @see org.springframework.batch.core.domain.StepListener#onErrorInStep(java.lang.Throwable)
*/
public ExitStatus onErrorInStep(StepExecution stepExecution, Throwable e) {
return null;
}
}
package org.springframework.batch.sample.item.writer;
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import org.apache.commons.lang.SerializationUtils;
import org.springframework.batch.core.domain.StepExecution;
import org.springframework.batch.core.domain.StepListener;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.exception.ClearFailedException;
import org.springframework.batch.item.exception.FlushFailedException;
import org.springframework.batch.repeat.ExitStatus;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer;
import org.springframework.jdbc.support.lob.DefaultLobHandler;
import org.springframework.jdbc.support.lob.LobHandler;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
public class StagingItemWriter extends JdbcDaoSupport implements StepListener, ItemWriter {
public static final String NEW = "N";
public static final String DONE = "Y";
public static final Object WORKING = "W";
private DataFieldMaxValueIncrementer incrementer;
private StepExecution stepExecution;
private LobHandler lobHandler = new DefaultLobHandler();
/**
* Public setter for the {@link LobHandler}.
* @param lobHandler the {@link LobHandler} to set (defaults to
* {@link DefaultLobHandler}).
*/
public void setLobHandler(LobHandler lobHandler) {
this.lobHandler = lobHandler;
}
/**
* Check mandatory properties.
*
* @see org.springframework.dao.support.DaoSupport#initDao()
*/
protected void initDao() throws Exception {
super.initDao();
Assert.notNull(incrementer, "DataFieldMaxValueIncrementer is required - set the incrementer property in the "
+ ClassUtils.getShortName(StagingItemWriter.class));
}
/**
* Setter for the key generator for the staging table.
*
* @param incrementer the {@link DataFieldMaxValueIncrementer} to set
*/
public void setIncrementer(DataFieldMaxValueIncrementer incrementer) {
this.incrementer = incrementer;
}
/**
* Serialize the item to the staging table, and add a NEW processed flag.
*
* @see ItemWriter#write(java.lang.Object)
*/
public void write(Object data) {
final long id = incrementer.nextLongValue();
final long jobId = stepExecution.getJobExecution().getJobId().longValue();
final byte[] blob = SerializationUtils.serialize((Serializable) data);
getJdbcTemplate()
.update("INSERT into BATCH_STAGING (ID, JOB_ID, VALUE, PROCESSED) values (?,?,?,?)",
new PreparedStatementSetter() {
public void setValues(PreparedStatement ps) throws SQLException {
ps.setLong(1, id);
ps.setLong(2, jobId);
lobHandler.getLobCreator().setBlobAsBytes(ps, 3, blob);
ps.setString(4, NEW);
}
});
}
public void close() throws Exception {
}
public void clear() throws ClearFailedException {
}
public void flush() throws FlushFailedException {
}
/* (non-Javadoc)
* @see org.springframework.batch.core.domain.StepListener#afterStep(StepExecution)
*/
public ExitStatus afterStep(StepExecution stepExecution) {
return null;
}
/* (non-Javadoc)
* @see org.springframework.batch.core.domain.StepListener#beforeStep(org.springframework.batch.core.domain.StepExecution)
*/
public void beforeStep(StepExecution stepExecution) {
this.stepExecution = stepExecution;
}
/* (non-Javadoc)
* @see org.springframework.batch.core.domain.StepListener#onErrorInStep(java.lang.Throwable)
*/
public ExitStatus onErrorInStep(StepExecution stepExecution, Throwable e) {
return null;
}
}

View File

@@ -1,111 +1,111 @@
/*
* Copyright 2006-2007 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.sample.launch;
import org.springframework.batch.core.configuration.JobRegistry;
import org.springframework.batch.core.domain.Job;
import org.springframework.batch.core.repository.DuplicateJobException;
import org.springframework.batch.sample.ClassPathXmlApplicationContextJobFactory;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ResourceLoader;
/**
* @author Dave Syer
*
*/
public class TaskExecutorLauncher implements ResourceLoaderAware {
private JobRegistry registry;
private ResourceLoader resourceLoader;
private ApplicationContext parentContext = null;
/**
* Public setter for the {@link JobRegistry}.
* @param registry the registry to set
*/
public void setRegistry(JobRegistry registry) {
this.registry = registry;
}
/*
* (non-Javadoc)
* @see org.springframework.context.ResourceLoaderAware#setResourceLoader(org.springframework.core.io.ResourceLoader)
*/
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
private void register(String[] paths) throws DuplicateJobException {
for (int i = 0; i < paths.length; i++) {
String path = paths[i];
ConfigurableListableBeanFactory beanFactory = new XmlBeanFactory(resourceLoader.getResource(path),
parentContext.getAutowireCapableBeanFactory());
String[] names = beanFactory.getBeanNamesForType(Job.class);
for (int j = 0; j < names.length; j++) {
registry.register(new ClassPathXmlApplicationContextJobFactory(names[j], path, parentContext));
}
}
}
public static void main(String[] args) throws Exception {
final TaskExecutorLauncher launcher = new TaskExecutorLauncher();
new Thread(new Runnable() {
public void run() {
launcher.run();
};
}).start();
while (launcher.parentContext == null) {
Thread.sleep(100L);
}
// Paths to individual job configurations.
final String[] paths = new String[] { "jobs/adhocLoopJob.xml", "jobs/footballJob.xml" };
launcher.register(paths);
System.out
.println("Started application. "
+ "Please connect using JMX (remember to use -Dcom.sun.management.jmxremote if you can't see anything in Jconsole).");
System.in.read();
}
private void run() {
/*
* A simple execution environment with an MBean for the JobLauncher,
* which has an asynchronous TaskExecutor. This will be used as the
* parent context for loading job configurations.
*/
final ApplicationContext parent = new ClassPathXmlApplicationContext("adhoc-job-launcher-context.xml");
parent.getAutowireCapableBeanFactory().autowireBeanProperties(this,
AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, false);
parent.getAutowireCapableBeanFactory().initializeBean(this, "taskExecutorLauncher");
this.parentContext = parent;
}
}
/*
* Copyright 2006-2007 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.sample.launch;
import org.springframework.batch.core.configuration.JobRegistry;
import org.springframework.batch.core.domain.Job;
import org.springframework.batch.core.repository.DuplicateJobException;
import org.springframework.batch.sample.ClassPathXmlApplicationContextJobFactory;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ResourceLoader;
/**
* @author Dave Syer
*
*/
public class TaskExecutorLauncher implements ResourceLoaderAware {
private JobRegistry registry;
private ResourceLoader resourceLoader;
private ApplicationContext parentContext = null;
/**
* Public setter for the {@link JobRegistry}.
* @param registry the registry to set
*/
public void setRegistry(JobRegistry registry) {
this.registry = registry;
}
/*
* (non-Javadoc)
* @see org.springframework.context.ResourceLoaderAware#setResourceLoader(org.springframework.core.io.ResourceLoader)
*/
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
private void register(String[] paths) throws DuplicateJobException {
for (int i = 0; i < paths.length; i++) {
String path = paths[i];
ConfigurableListableBeanFactory beanFactory = new XmlBeanFactory(resourceLoader.getResource(path),
parentContext.getAutowireCapableBeanFactory());
String[] names = beanFactory.getBeanNamesForType(Job.class);
for (int j = 0; j < names.length; j++) {
registry.register(new ClassPathXmlApplicationContextJobFactory(names[j], path, parentContext));
}
}
}
public static void main(String[] args) throws Exception {
final TaskExecutorLauncher launcher = new TaskExecutorLauncher();
new Thread(new Runnable() {
public void run() {
launcher.run();
};
}).start();
while (launcher.parentContext == null) {
Thread.sleep(100L);
}
// Paths to individual job configurations.
final String[] paths = new String[] { "jobs/adhocLoopJob.xml", "jobs/footballJob.xml" };
launcher.register(paths);
System.out
.println("Started application. "
+ "Please connect using JMX (remember to use -Dcom.sun.management.jmxremote if you can't see anything in Jconsole).");
System.in.read();
}
private void run() {
/*
* A simple execution environment with an MBean for the JobLauncher,
* which has an asynchronous TaskExecutor. This will be used as the
* parent context for loading job configurations.
*/
final ApplicationContext parent = new ClassPathXmlApplicationContext("adhoc-job-launcher-context.xml");
parent.getAutowireCapableBeanFactory().autowireBeanProperties(this,
AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, false);
parent.getAutowireCapableBeanFactory().initializeBean(this, "taskExecutorLauncher");
this.parentContext = parent;
}
}

View File

@@ -1,25 +1,25 @@
package org.springframework.batch.sample.mapping;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.batch.sample.domain.CustomerCredit;
import org.springframework.jdbc.core.RowMapper;
public class CustomerCreditRowMapper implements RowMapper {
public static final String ID_COLUMN = "id";
public static final String NAME_COLUMN = "name";
public static final String CREDIT_COLUMN = "credit";
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
CustomerCredit customerCredit = new CustomerCredit();
customerCredit.setId(rs.getInt(ID_COLUMN));
customerCredit.setName(rs.getString(NAME_COLUMN));
customerCredit.setCredit(rs.getBigDecimal(CREDIT_COLUMN));
return customerCredit;
}
}
package org.springframework.batch.sample.mapping;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.batch.sample.domain.CustomerCredit;
import org.springframework.jdbc.core.RowMapper;
public class CustomerCreditRowMapper implements RowMapper {
public static final String ID_COLUMN = "id";
public static final String NAME_COLUMN = "name";
public static final String CREDIT_COLUMN = "credit";
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
CustomerCredit customerCredit = new CustomerCredit();
customerCredit.setId(rs.getInt(ID_COLUMN));
customerCredit.setName(rs.getString(NAME_COLUMN));
customerCredit.setCredit(rs.getBigDecimal(CREDIT_COLUMN));
return customerCredit;
}
}

View File

@@ -1,35 +1,35 @@
package org.springframework.batch.sample.mapping;
import org.springframework.batch.io.file.mapping.FieldSetMapper;
import org.springframework.batch.io.file.mapping.FieldSet;
import org.springframework.batch.sample.domain.Game;
public class GameMapper implements FieldSetMapper {
public Object mapLine(FieldSet fs) {
if(fs == null){
return null;
}
Game game = new Game();
game.setId(fs.readString("id"));
game.setYear(fs.readInt("year"));
game.setTeam(fs.readString("team"));
game.setWeek(fs.readInt("week"));
game.setOpponent(fs.readString("opponent"));
game.setCompletes(fs.readInt("completes"));
game.setAttempts(fs.readInt("attempts"));
game.setPassingYards(fs.readInt("passingYards"));
game.setPassingTd(fs.readInt("passingTd"));
game.setInterceptions(fs.readInt("interceptions"));
game.setRushes(fs.readInt("rushes"));
game.setRushYards(fs.readInt("rushYards"));
game.setReceptions(fs.readInt("receptions", 0));
game.setReceptionYards(fs.readInt("receptionYards"));
game.setTotalTd(fs.readInt("totalTd"));
return game;
}
}
package org.springframework.batch.sample.mapping;
import org.springframework.batch.io.file.mapping.FieldSetMapper;
import org.springframework.batch.io.file.mapping.FieldSet;
import org.springframework.batch.sample.domain.Game;
public class GameMapper implements FieldSetMapper {
public Object mapLine(FieldSet fs) {
if(fs == null){
return null;
}
Game game = new Game();
game.setId(fs.readString("id"));
game.setYear(fs.readInt("year"));
game.setTeam(fs.readString("team"));
game.setWeek(fs.readInt("week"));
game.setOpponent(fs.readString("opponent"));
game.setCompletes(fs.readInt("completes"));
game.setAttempts(fs.readInt("attempts"));
game.setPassingYards(fs.readInt("passingYards"));
game.setPassingTd(fs.readInt("passingTd"));
game.setInterceptions(fs.readInt("interceptions"));
game.setRushes(fs.readInt("rushes"));
game.setRushYards(fs.readInt("rushYards"));
game.setReceptions(fs.readInt("receptions", 0));
game.setReceptionYards(fs.readInt("receptionYards"));
game.setTotalTd(fs.readInt("totalTd"));
return game;
}
}

View File

@@ -1,27 +1,27 @@
package org.springframework.batch.sample.mapping;
import org.springframework.batch.io.file.mapping.FieldSetMapper;
import org.springframework.batch.io.file.mapping.FieldSet;
import org.springframework.batch.sample.domain.Player;
public class PlayerMapper implements FieldSetMapper {
public Object mapLine(FieldSet fs) {
if(fs == null){
return null;
}
Player player = new Player();
player.setID(fs.readString("ID"));
player.setLastName(fs.readString("lastName"));
player.setFirstName(fs.readString("firstName"));
player.setPosition(fs.readString("position"));
player.setDebutYear(fs.readInt("debutYear"));
player.setBirthYear(fs.readInt("birthYear"));
return player;
}
}
package org.springframework.batch.sample.mapping;
import org.springframework.batch.io.file.mapping.FieldSetMapper;
import org.springframework.batch.io.file.mapping.FieldSet;
import org.springframework.batch.sample.domain.Player;
public class PlayerMapper implements FieldSetMapper {
public Object mapLine(FieldSet fs) {
if(fs == null){
return null;
}
Player player = new Player();
player.setID(fs.readString("ID"));
player.setLastName(fs.readString("lastName"));
player.setFirstName(fs.readString("firstName"));
player.setPosition(fs.readString("position"));
player.setDebutYear(fs.readInt("debutYear"));
player.setBirthYear(fs.readInt("birthYear"));
return player;
}
}

View File

@@ -1,55 +1,55 @@
/*
* Copyright 2006-2007 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.sample.mapping;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.batch.sample.domain.PlayerSummary;
import org.springframework.jdbc.core.RowMapper;
/**
* RowMapper used to map a ResultSet to a (@link PlayerSummary)
*
* @author Lucas Ward
*
*/
public class PlayerSummaryMapper implements RowMapper {
/* (non-Javadoc)
* @see org.springframework.jdbc.core.RowMapper#mapRow(java.sql.ResultSet, int)
*/
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
PlayerSummary summary = new PlayerSummary();
summary.setId(rs.getString(1));
summary.setYear(rs.getInt(2));
summary.setCompletes(rs.getInt(3));
summary.setAttempts(rs.getInt(4));
summary.setPassingYards(rs.getInt(5));
summary.setPassingTd(rs.getInt(6));
summary.setInterceptions(rs.getInt(7));
summary.setRushes(rs.getInt(8));
summary.setRushYards(rs.getInt(9));
summary.setReceptions(rs.getInt(10));
summary.setReceptionYards(rs.getInt(11));
summary.setTotalTd(rs.getInt(12));
return summary;
}
}
/*
* Copyright 2006-2007 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.sample.mapping;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.batch.sample.domain.PlayerSummary;
import org.springframework.jdbc.core.RowMapper;
/**
* RowMapper used to map a ResultSet to a (@link PlayerSummary)
*
* @author Lucas Ward
*
*/
public class PlayerSummaryMapper implements RowMapper {
/* (non-Javadoc)
* @see org.springframework.jdbc.core.RowMapper#mapRow(java.sql.ResultSet, int)
*/
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
PlayerSummary summary = new PlayerSummary();
summary.setId(rs.getString(1));
summary.setYear(rs.getInt(2));
summary.setCompletes(rs.getInt(3));
summary.setAttempts(rs.getInt(4));
summary.setPassingYards(rs.getInt(5));
summary.setPassingTd(rs.getInt(6));
summary.setInterceptions(rs.getInt(7));
summary.setRushes(rs.getInt(8));
summary.setRushYards(rs.getInt(9));
summary.setReceptions(rs.getInt(10));
summary.setReceptionYards(rs.getInt(11));
summary.setTotalTd(rs.getInt(12));
return summary;
}
}