Skip to content

Commit

Permalink
Merge pull request #2 from nablarch/feature-1
Browse files Browse the repository at this point in the history
DatabaseRecordReaderでSELECT前に任意の処理を挟めるようにする
  • Loading branch information
siosio authored Nov 28, 2016
2 parents df57cbf + 7296226 commit 50996a2
Show file tree
Hide file tree
Showing 4 changed files with 102 additions and 3 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
group = 'com.nablarch.framework'
version = '1.1.2'
version = '1.2.0'
description = 'バッチ処理方式を実現する'

buildscript {
Expand Down
18 changes: 18 additions & 0 deletions src/main/java/nablarch/fw/reader/DatabaseRecordListener.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package nablarch.fw.reader;

import nablarch.core.util.annotation.Published;

/**
* {@link DatabaseRecordReader}で処理対象レコードをキャッシュするためのデータベースアクセス前に
* コールバックされるメソッドを定義するインタフェース。
*
* @author Naoki Yamamoto
*/
@Published
public interface DatabaseRecordListener {

/**
* 処理対象レコードをキャッシュするためのデータベースアクセス前に呼び出される。
*/
void beforeReadRecords();
}
25 changes: 24 additions & 1 deletion src/main/java/nablarch/fw/reader/DatabaseRecordReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
import nablarch.fw.DataReader;
import nablarch.fw.ExecutionContext;


/**
* データベースの参照結果を1レコードづつ読み込むデータリーダ。
*
Expand All @@ -30,6 +29,9 @@ public class DatabaseRecordReader implements DataReader<SqlRow> {
/** 条件 */
private Object condition;

/** データベースレコードリスナ */
private DatabaseRecordListener listener;

/**
* {@code DatabaseRecordReader}オブジェクトを生成する。
*/
Expand Down Expand Up @@ -103,6 +105,10 @@ public synchronized void reopen(ExecutionContext ctx) {
*/
@SuppressWarnings("unchecked")
private void readRecords() {
if (listener != null) {
listener.beforeReadRecords();
}

if (statement != null) {
records = statement.executeQuery().iterator();
} else if (parameterizedSqlPStatement != null) {
Expand Down Expand Up @@ -144,4 +150,21 @@ public DatabaseRecordReader setStatement(
return this;
}

/**
* データベースレコードリスナを設定する。
* <p/>
* リスナに定義されたコールバック処理は、
* 処理対象レコードをキャッシュするためのデータベースアクセス前に実行される。
* <p/>
* 本リーダにリスナを設定することで、
* 処理対象レコードをデータベースから取得する前に任意の処理を実行することができる。
*
* @param listener データベースレコードリスナ
* @return このオブジェクト自体
*/
@Published
public DatabaseRecordReader setListener(DatabaseRecordListener listener) {
this.listener = listener;
return this;
}
}
60 changes: 59 additions & 1 deletion src/test/java/nablarch/fw/reader/DatabaseRecordReaderTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,25 @@
import static org.junit.Assert.fail;

import java.util.HashMap;
import java.util.List;

import nablarch.core.db.connection.AppDbConnection;
import nablarch.core.db.connection.ConnectionFactory;
import nablarch.core.db.connection.DbConnectionContext;
import nablarch.core.db.connection.TransactionManagerConnection;
import nablarch.core.db.statement.ParameterizedSqlPStatement;
import nablarch.core.db.statement.SqlPStatement;
import nablarch.core.db.statement.SqlRow;
import nablarch.core.db.transaction.SimpleDbTransactionExecutor;
import nablarch.core.db.transaction.SimpleDbTransactionManager;
import nablarch.core.repository.SystemRepository;
import nablarch.core.transaction.TransactionContext;
import nablarch.core.transaction.TransactionFactory;
import nablarch.fw.DataReader;
import nablarch.fw.ExecutionContext;
import nablarch.test.support.SystemRepositoryResource;
import nablarch.test.support.db.helper.DatabaseTestRunner;
import nablarch.test.support.db.helper.VariousDbTestHelper;
import nablarch.test.support.tool.Hereis;

import org.junit.After;
import org.junit.Before;
Expand Down Expand Up @@ -272,4 +276,58 @@ public void testClose() {
reader.close(new ExecutionContext());
assertTrue(true);
}

/**
* データベースのレコードキャッシュ前に、設定されたリスナが動作すること
*/
@Test
public void testBeforeListener() {
VariousDbTestHelper.setUpTable(
new ReaderBook("title1", "publisher1", "authors1"),
new ReaderBook("title2", "publisher2", "authors2"),
new ReaderBook("title3", "publisher3", "authors3"));


// テスト用のトランザクションマネージャをリポジトリに登録
ConnectionFactory connectionFactory = repositoryResource.getComponent("connectionFactory");
TransactionFactory transactionFactory = repositoryResource.getComponent("jdbcTransactionFactory");
SimpleDbTransactionManager manager = new SimpleDbTransactionManager();
manager.setDbTransactionName("testTransaction");
manager.setConnectionFactory(connectionFactory);
manager.setTransactionFactory(transactionFactory);
repositoryResource.addComponent("testTransaction", manager);

DatabaseRecordReader reader = new DatabaseRecordReader();
reader.setStatement(DbConnectionContext.getConnection().prepareStatement("SELECT * FROM READER_BOOK ORDER BY TITLE"));

// レコードをキャッシュする前に、PUBLISHERカラムの値を全て"change"に変更するSQLを発行するリスナを追加
reader.setListener(new DatabaseRecordListener() {
@Override
public void beforeReadRecords() {
SimpleDbTransactionManager manager = SystemRepository.get("testTransaction");
new SimpleDbTransactionExecutor<Void>(manager) {
@Override
public Void execute(AppDbConnection appDbConnection) {
appDbConnection.prepareStatement("UPDATE READER_BOOK SET PUBLISHER = 'change'").executeUpdate();
return null;
}
}.doTransaction();
}
});

// カラムが全て更新されていること
assertThat(reader.read(null).getString("publisher"), is("change"));
assertThat(reader.read(null).getString("publisher"), is("change"));
assertThat(reader.read(null).getString("publisher"), is("change"));
assertThat(reader.read(null), is(nullValue()));

// レコードを追加して、キャッシュを最新化した場合に、追加したレコードも更新されていること。
VariousDbTestHelper.insert(new ReaderBook("title4", "publisher4", "authors4"));
reader.reopen(null);
assertThat(reader.read(null).getString("publisher"), is("change"));
assertThat(reader.read(null).getString("publisher"), is("change"));
assertThat(reader.read(null).getString("publisher"), is("change"));
assertThat(reader.read(null).getString("publisher"), is("change"));
assertThat(reader.read(null), is(nullValue()));
}
}

0 comments on commit 50996a2

Please sign in to comment.