Hitachi

Cosminexus V11 BPM/ESB基盤 サービスプラットフォーム 開発ガイド 基本開発編


付録H.5 CSCOwnCodeReaderContextインターフェース

〈この項の構成〉

(1) インターフェース

読み込み情報インターフェースを次に示します。

文字コード変換UOCを開発する場合,次のインターフェースの実装クラスを作成します。

図H‒5 CSCOwnCodeReaderContext実装クラス

[図データ]

インターフェース名

CSCOwnCodeReaderContextインターフェース

説明

読み込み情報インターフェースです。

CSCOwnCodeReaderContextのパッケージ名は,jp.co.Hitachi.soft.csc.dt.uoc.CSCOwnCodeReaderContextです。

CSCOwnCodeReaderの解析結果を,データ変換の処理に渡すために使用します。

1つのスレッドに1つのインスタンスを生成します。CSCOwnCodeReader#readCharでは,文字列の解析結果をCSCOwnCodeReaderContextの実装クラスにセットする必要があります。セットされた情報は,データ変換の処理で参照されます。

形式
package jp.co.Hitachi.soft.csc.dt.uoc ;
 
public interface CSCOwnCodeReaderContext {
 
      int getPosition() ;
 
      int getLength() ;
 
      boolean canSeparate() ;
}
メソッド

CSCOwnCodeReaderContextインターフェースのメソッドを次の表に示します。

メソッド名

説明

getPositionメソッド

現在の文字位置または読み込めるデータのサイズを返すメソッドです。

getLengthメソッド

現在の文字長を返すメソッドです。

canSeparateメソッド

現在の文字をセパレータの解析対象とするかどうかを返すメソッドです。

データ変換の対象が可変長文字列で,かつバイナリフォーマット定義にセパレータが設定されている場合,データ変換はセパレータの解析処理を実行します。CSCOwnCodeReaderおよびCSCOwnCodeReaderContextの各メソッドの呼び出し順序を次の図に示します。

図H‒6 CSCOwnCodeReaderおよびCSCOwnCodeReaderContextの各メソッドの呼び出し順序

[図データ]

  1. インスタンス生成

    データ変換によってCSCOwnCodeReaderのインスタンスを生成します。

  2. CSCOwnCodeReader#startメソッド

    自スレッド専用のCSCOwnCodeReaderContextのインスタンスを生成します。以降,CSCOwnCodeReaderとの値の受け渡しは,自スレッドが保持するCSCOwnCodeReaderContextのインスタンスで実行します。

  3. CSCOwnCodeReader#readCharメソッド

    readCharの実行時,データ変換の処理は引数にCSCOwnCodeReaderContextのインスタンスを渡します。readCharの処理では,解析結果をCSCOwnCodeReaderContextのインスタンスにセットします。セットされた解析結果は,データ変換の処理でセパレータの解析に使用します。

  4. getPositionメソッド,getLengthメソッド,canSeparateメソッド

    それぞれのメソッドは,データ変換から呼ばれます。メソッドの実行順序は電文フォーマットに依存します。

    • getPositionメソッド

      このメソッドで現在の文字位置を返します。

    • getLengthメソッド

      このメソッドで現在の文字長を返します。

    • canSeparateメソッド

      このメソッドで現在の文字をセパレータの解析対象とするかどうかを返します。

  5. CSCOwnCodeReader#endメソッド

    CSCOwnCodeReaderContextの実装クラスの解放処理が必要な場合は,endメソッドを実行します。

(a) getPositionメソッド

説明

readCharの結果がtrueの場合,現在の文字位置を返します。

readCharの結果がfalseの場合,読み込めるデータのサイズを返します。

形式
public int getPosition()
パラメタ

なし。

例外

なし。

戻り値

現在の文字位置,または読み込めるデータのサイズ(単位はバイト)です。CSCOwnCodeReader#startで渡したoffsetの位置を0とします。

(b) getLengthメソッド

説明

現在の文字長を返します。

形式
public int getLength()
パラメタ

なし。

例外

なし。

戻り値

現在の文字長を返します。

(c) canSeparateメソッド

説明

現在の文字をセパレータの解析対象とするかどうかを返します。falseを返した場合,セパレータのバイト列と現在の文字が一致しても,セパレータと見なしません。

形式
public boolean canSeparate()
パラメタ

なし。

例外

なし。

戻り値

セパレータを解析する場合,trueを返します。

セパレータを解析しない場合,falseを返します。

(2) 例外クラス

文字コード変換UOCの開発時に発生する例外クラスを次に示します。

クラス名

CSCOwnCodeConverterExceptionクラス

説明

文字コード変換処理中に異常が発生した場合に送出する例外です。

この例外が発生した場合は,データ変換処理全体を中断します。

(3) 実装例(MS932)

CSCOwnCodeReaderContextインターフェースの実装例(MS932)を次に示します。

public class CSCOwnCodeReaderContextImpl implements CSCOwnCodeReaderContext {
 
    private final byte[] data ;
 
    private int position = 0 ;
 
    private int next = 0 ;
 
    private int length = 0 ;
 
 
    public CSCOwnCodeReaderContextImpl(
        final byte[] data ) {
 
        this.data = data ;
    }
 
 
    @Override
    public int getPosition() {
 
        return position ;
    }
 
 
    @Override
    public int getLength() {
 
        return length ;
    }
 
 
    @Override
    public boolean canSeparate() {
 
        // MS932はシフト(エスケープシーケンス)状態を持たず,
        // セパレータの出現に制限がないため,常にtrueを返す
        return true ;
    }
 
 
    public byte[] getData() {
 
        return data ;
    }
 
 
    public void setPosition( int position ) {
 
        this.position = position ;
    }
 
 
    public void setLength( int length ) {
 
        this.length = length ;
    }
 
 
    public int getNextPosition() {
 
        return this.next ;
    }
 
 
    public void setNextPosition( int position ) {
 
        this.next = position ;
    }
}

(4) 実装例(IBM漢字コード)

CSCOwnCodeReaderContextインターフェースの実装例(IBM漢字コード)を次に示します。

public class CSCOwnCodeReaderContextImpl implements CSCOwnCodeReaderContext {
 
    private final byte[] data ;
 
    private int position = 0 ;
 
    private int length = 1 ;
 
    private int next = 0 ;
 
    private boolean canSeparate = true ;
 
 
    public CSCOwnCodeReaderContextImpl( final byte[] data ) {
 
        this.data = data ;
    }
 
 
    @Override
    public int getPosition() {
 
        return position ;
    }
 
 
    @Override
    public int getLength() {
 
        return length ;
    }
 
 
    @Override
    public boolean canSeparate() {
 
        return canSeparate ;
    }
 
 
    public byte[] getData() {
 
        return data ;
    }
 
 
    public void setPosition( int position ) {
 
        this.position = position ;
    }
 
 
    public void setLength( int length ) {
 
        this.length = length ;
    }
 
 
    public void setCanSeparate( boolean canSeparate ) {
 
        this.canSeparate = canSeparate ;
    }
 
 
    public int getNextPosition() {
 
        return this.next ;
    }
 
 
    public void setNextPosition( int position ) {
 
        this.next = position ;
    }
}