付録H.5 CSCOwnCodeReaderContextインターフェース
(1) インターフェース
読み込み情報インターフェースを次に示します。
文字コード変換UOCを開発する場合,次のインターフェースの実装クラスを作成します。
- インターフェース名
-
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の各メソッドの呼び出し順序を次の図に示します。
-
インスタンス生成
データ変換によってCSCOwnCodeReaderのインスタンスを生成します。
-
CSCOwnCodeReader#startメソッド
自スレッド専用のCSCOwnCodeReaderContextのインスタンスを生成します。以降,CSCOwnCodeReaderとの値の受け渡しは,自スレッドが保持するCSCOwnCodeReaderContextのインスタンスで実行します。
-
CSCOwnCodeReader#readCharメソッド
readCharの実行時,データ変換の処理は引数にCSCOwnCodeReaderContextのインスタンスを渡します。readCharの処理では,解析結果をCSCOwnCodeReaderContextのインスタンスにセットします。セットされた解析結果は,データ変換の処理でセパレータの解析に使用します。
-
getPositionメソッド,getLengthメソッド,canSeparateメソッド
それぞれのメソッドは,データ変換から呼ばれます。メソッドの実行順序は電文フォーマットに依存します。
-
getPositionメソッド
このメソッドで現在の文字位置を返します。
-
getLengthメソッド
このメソッドで現在の文字長を返します。
-
canSeparateメソッド
このメソッドで現在の文字をセパレータの解析対象とするかどうかを返します。
-
-
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 ; } }