All Downloads are FREE. Search and download functionalities are using the official Maven repository.

nablarch.fw.messaging.ResponseMessage Maven / Gradle / Ivy

The newest version!
package nablarch.fw.messaging;

import nablarch.core.util.annotation.Published;
import nablarch.fw.Result;

import java.util.Map;

/** 
 * 本システムに対する要求電文への応答電文を表すクラス。
 * 
 * 本クラスでは、RequestMessageと同様、応答電文の内容をフレームワークヘッダ部と
 * 業務データ部に分離して管理しており、業務ロジックからは業務データ部しか操作できない
 * ようになっている。
 * 
 * メッセージボディを直列化する際には、フレームワークヘッダ部と業務データ部をそれぞれ
 * 直列化して連結したものを返す。
 * 
 * @author Iwauo Tajima
 */
public class ResponseMessage extends SendingMessage implements Result {
    // ---------------------------------------------------- Structure
    /** フレームワーク制御ヘッダ */
    private final FwHeader fwHeader;
    
    /** フレームワーク制御ヘッダ定義     */
    private FwHeaderDefinition fwHeaderDefinition;
    
    /** 業務処理の結果 */
    private Result result = new Result.Success();
    
    // ----------------------------------------------------- Constructor
    /**
     * 受信電文に対する応答電文を作成する。
     * @param fwHeader 応答電文に付加するフレームワーク制御ヘッダ
     * @param message  受信電文
     */
    public ResponseMessage(FwHeader fwHeader, ReceivedMessage message) {
        // プロトコルヘッダを設定
        setDestination(message.getReplyTo());
        setCorrelationId(message.getMessageId());
        // 受信電文のフォーマッターを流用する。
        setFormatter(message.getFormatter());
        this.fwHeader = fwHeader;
        setResult(new Result.Success());
    }
    
    /**
     * 要求電文に対する応答電文を作成する。
     * RequestMessage#reply() から呼ばれることを想定している。
     * @param message 要求電文オブジェクト
     */
    @Published(tag = "architect")
    public ResponseMessage(RequestMessage message) {
        // プロトコルヘッダを設定
        setDestination(message.getReplyTo());
        setCorrelationId(message.getMessageId());
        // 受信電文のフォーマッターを流用する。
        setFormatter(message.getFormatter());
        this.fwHeader = message.getFwHeader();
        setResult(new Result.Success());
    }
   
    /**{@inheritDoc}
     * この実装では、フレームワーク制御ヘッダ部と業務データ部をそれぞれ直列化し、
     * 連結したものを返す。
     * ただし、フレームワーク制御ヘッダを直列化する際、フレームワーク制御ヘッダ定義
     * を使用する。これは、通常{@link nablarch.fw.messaging.handler.MessageReplyHandler}によって設定される。
     */
    @Override
    public byte[] getBodyBytes() {
        if (fwHeaderDefinition == null) {
            throw new IllegalStateException(
                "Could not serialize fwHeader "
              + "because fwHeaderDefinition was not assigned to this response."
            );
        }
        if (!wroteHeader) {
            wroteHeader = true;
            fwHeaderDefinition.writeFwHeaderTo(this, fwHeader);
        }
        return super.getBodyBytes();
    }
    /** フレームワーク制御ヘッダが電文に反映されたか否か */
    private boolean wroteHeader = false;
    
    
    /**
     * 実行時例外を送出し、現在の業務トランザクションをロールバックさせ、
     * この電文の内容をエラー応答として送信する。
     * @param e 起因となる例外
     */
    public void throwAsError(Throwable e) {
        throw new ErrorResponseMessage(this, e);
    }
    
    /**
     * 実行時例外を送出し、現在の業務トランザクションをロールバックさせ、
     * この電文の内容をエラー応答として送信する。
     */
    public void throwAsError() {
        throw new ErrorResponseMessage(this);
    }

    // ------------------------------------------------------- Result I/F
    /** {@inheritDoc} */
    public int getStatusCode() {
        return result.getStatusCode();
    }

    /** {@inheritDoc} */
    public String getMessage() {
        return result.getMessage();
    }

    /** {@inheritDoc} */
    public boolean isSuccess() {
        return result.isSuccess();
    }
    
    
    // --------------------------------------------------------- Accessors
    /**
     * 業務処理の結果を設定する。
     * @param result 業務処理結果
     * @return このオブジェクト自体
     */
    public ResponseMessage setResult(Result result) {
        this.result = result;
        return this;
    }
    
    /**
     * フレームワーク制御ヘッダを取得する。
     * @return フレームワーク制御ヘッダ
     */
    public FwHeader getFwHeader() {
        return fwHeader;
    }
    
    /**
     * フレームワークヘッダ定義を設定する。
     * @param def フレームワーク制御ヘッダ
     * @return このオブジェクト自体
     */
    @Published(tag = "architect")
    public ResponseMessage setFwHeaderDefinition(FwHeaderDefinition def) {
        fwHeaderDefinition = def;
        return this;
    }
    
    /**
     * フレームワーク制御ヘッダの処理結果コードの値を設定する。
     * @param statusCode 処理結果コード
     * @return このオブジェクト自体
     */
    @Published(tag = "architect")
    public ResponseMessage setStatusCodeHeader(String statusCode) {
        fwHeader.setStatusCode(statusCode);
        return this;
    }
    
    /**{@inheritDoc} */
    @Override
    @Published(tag = "architect")
    public ResponseMessage addRecord(Map record) {
        super.addRecord(record);
        return this;
    }
    
    /**{@inheritDoc} */
    @Override
    @Published(tag = "architect")
    public ResponseMessage addRecord(String recordType, Map record) {
        super.addRecord(recordType, record);
        return this;
    }
    
    /**{@inheritDoc} */
    @Override
    @Published(tag = "architect")
    public ResponseMessage addRecord(Object recordObj) {
        super.addRecord(recordObj);
        return this;
    }
    
    /**{@inheritDoc} */
    @Override
    @Published(tag = "architect")
    public ResponseMessage addRecord(String recordType, Object recordObj) {
        super.addRecord(recordType, recordObj);
        return this;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy