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

[目次][用語][索引][前へ][次へ]

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

<この項の構成>
(1) インターフェース
(2) 例外クラス
(3) 実装例(MS932)
(4) 実装例(IBM漢字コード)

(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 ;
    }
}