付録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 ;
}
}