nablarch.test.core.messaging.MessagePool Maven / Gradle / Ivy
The newest version!
package nablarch.test.core.messaging;
import static nablarch.core.util.StringUtil.isNullOrEmpty;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Set;
import nablarch.core.dataformat.DataRecord;
import nablarch.core.dataformat.DataRecordFormatter;
import nablarch.core.dataformat.FixedLengthDataRecordFormatter;
import nablarch.core.dataformat.LayoutDefinition;
import nablarch.core.repository.SystemRepository;
import nablarch.core.util.annotation.Published;
import nablarch.fw.messaging.ReceivedMessage;
import nablarch.fw.messaging.SendingMessage;
import nablarch.test.Assertion;
import nablarch.test.NablarchTestUtils;
import nablarch.test.core.file.FixedLengthFile;
/**
* テストショット毎のメッセージを保持するクラス。
*
* @author T.Kawasaki
*/
@Published(tag = "architect")
public class MessagePool {
/**
* フォーマッタ。
* テストデータから作成したレイアウトを使用する。
*/
private final DataRecordFormatter formatter = new FixedLengthDataRecordFormatter();
/** フレームワーク制御ヘッダ */
private final Map fwHeader;
/** メッセージのイテレータ */
private final Iterator iterator;
/** メッセージのリスト */
private final List records;
/** 元のデータ */
private final FixedLengthFile source;
/** デフォルトのレイアウト定義 */
private final LayoutDefinition defaultLayout;
/** SystemRepositoryに設定するデータレコードとしてアサートを行うファイルタイプを管理するためのキー */
private static final String ASSERT_AS_MAP_KEY = "messaging.assertAsMapFileType";
/**
* コンストラクタ。
*
* @param source 元のデータ
* @param fwHeader フレームワーク制御ヘッダ
*/
public MessagePool(FixedLengthFile source, Map fwHeader) {
this.source = source;
this.fwHeader = fwHeader;
this.defaultLayout = source.createLayout();
this.formatter.setDefinition(this.defaultLayout);
this.records = toDataRecords();
this.iterator = toDataRecords().iterator();
}
/**
* テストデータ(メッセージ)投入の準備をする。
*
* @return テストデータ(メッセージ)投入用クラスのインスタンス
*/
Putter prepareForPut() {
return new Putter();
}
/**
* 結果検証の準備をする。
*
* @return 検証用クラスのインスタンス
*/
Comparator prepareForCompare() {
return new Comparator();
}
/**
* データレコードに変換する。
*
* @return データレコード
*/
List toDataRecords() {
return source.toDataRecords();
}
/**
* フレームワーク制御ヘッダを取得する。
*
* @return フレームワーク制御ヘッダ
*/
Map getFwHeader() {
return fwHeader;
}
/** テストデータ投入用クラス。
*/
final class Putter {
/**
* 送信メッセージにメッセージ本文を設定する。
*
* @param headerFormatter FWヘッダのフォーマッタ
* @return 送信メッセージ
* @throws NoSuchElementException メッセージがない場合
*/
SendingMessage createSendingMessage(DataRecordFormatter headerFormatter) throws NoSuchElementException {
SendingMessage msg = new SendingMessage();
// テストデータ取得
DataRecord currentData = iterator.next();
// テストデータ変換
currentData = convertByFileType(currentData);
// 対応するレイアウト定義を生成
LayoutDefinition ld = createLayoutFromDataRecord(currentData);
if (headerFormatter != null) {
//FWヘッダのフォーマッタがある場合は、FWヘッダを1レコード目に追加する必要があるとみなし、処理する。
msg.setFormatter(headerFormatter).addRecord(fwHeader);
}
return msg.setFormatter(formatter.setDefinition(ld)).addRecord(currentData);
}
}
/**
* 結果検証用クラス。
* 応答電文送信キューに期待するメッセージが格納されていることを検証する。
*/
final class Comparator {
/**
* キューからメッセージを取得し、期待値との比較を行う。
*
* @param msgOnFail 比較失敗時のメッセージ
* @param responseMessage 応答メッセージ
*/
void compareBody(String msgOnFail, ReceivedMessage responseMessage) {
// テストデータ取得
DataRecord currentData = iterator.next();
// テストデータ変換
currentData = convertByFileType(currentData);
// 対応するレイアウト定義を生成
LayoutDefinition ld = createLayoutFromDataRecord(currentData);
// データレコードとしてアサートを行うファイルタイプ
Set assertAsDataRecordFileTypes
= isNullOrEmpty(SystemRepository.getString(ASSERT_AS_MAP_KEY))
? NablarchTestUtils.asSet("Fixed")
: NablarchTestUtils.asSet(NablarchTestUtils.makeArray(SystemRepository.getString(ASSERT_AS_MAP_KEY)));
String expectedFileType = getFileTypeFromDirective(ld);
if (assertAsDataRecordFileTypes.contains(expectedFileType)) {
// データレコードとして項目ごとにアサート
List actual = responseMessage.setFormatter(formatter.setDefinition(ld)).readRecords();
List expected = new ArrayList();
expected.add(currentData);
Assertion.assertEquals(msgOnFail, expected, actual);
} else {
// 文字列として電文全体をアサート
Charset expectedCharset = getCharsetFromDirective(ld);
byte[] expectedBodyBytes = new SendingMessage()
.setFormatter(formatter.setDefinition(ld))
.addRecord(currentData)
.getBodyBytes();
String expectedBody = new String(expectedBodyBytes, expectedCharset);
String actualBody = new String(responseMessage.getBodyBytes(), expectedCharset);
Assertion.assertEquals(msgOnFail, expectedBody, actualBody);
}
}
}
/**
* レイアウト定義のディレクティブからファイルタイプを取得。
* @param ld レイアウト定義
* @return レイアウト定義に指定されたファイルタイプ
*/
private String getFileTypeFromDirective(LayoutDefinition ld) {
return (String) ld.getDirective().get("file-type");
}
/**
* レイアウト定義のディレクティブからエンコーディングを取得。
* @param ld レイアウト定義
* @return レイアウト定義に指定されたエンコーディング
*/
private Charset getCharsetFromDirective(LayoutDefinition ld) {
String expectedTextEncoding = (String) ld.getDirective().get("text-encoding");
return Charset.forName(expectedTextEncoding);
}
/**
* メッセージのイテレータを取得。
* @return メッセージのイテレータ
*/
protected Iterator getIterator() {
return iterator;
}
/**
* FixedLengthFileを取得。
* @return FixedLengthFile
*/
protected FixedLengthFile getSource() {
return source;
}
/**
* DataRecordFormatterを取得。
* @return DataRecordFormatter
*/
public DataRecordFormatter getFormatter() {
return formatter;
}
/**
* メッセージのリストを取得。
* @return メッセージのリスト
*/
protected List getRecords() {
return records;
}
/**
* データレコードのファイル種別に応じて変換します
* @param dataRecord 対象データレコード
* @return 変換後のデータレコード
*/
protected DataRecord convertByFileType(DataRecord dataRecord) {
return source.convertData(defaultLayout, dataRecord);
}
/**
* デフォルトのレイアウトと、データレコードの内容を元にレイアウト定義を作成します
* @param dataRecord データレコード
* @return 新しいレイアウト定義
*/
protected LayoutDefinition createLayoutFromDataRecord(DataRecord dataRecord) {
return source.createDefinition(defaultLayout, dataRecord);
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy