長いサッカー・ワールドカップ休暇(?)を終えたショー君へ:
テキスト(文字ストリーム)から構文的イベントを発生させるのがXionReader。(内部的にXionReaderを使って)メモリ内にデータ構造を作るのがXionLoader。でも、XionLoaderが作るデータ構造は構文を写し取っただけで、応用固有のデータ構造にはなってない。そこで、Xionデータ構造を応用固有のデータ構造に変換するモノが欲しい。これ、一種の型変換なのだけど、リアライザー(Realizer)と呼んでおきましょ。何を“実現する”かワカンナイけど。
- 方針確認:手を抜く。
ネーミング
最近、getXxxって名前がきらいになった。理由はないけど。… まっ、それだけ。
データの例
従業員リスト、ただし、従業員一人。
EmployeeList [
Person {
name : PersonNameJa "板東 トン吉",
tel : TelNo "03-0000-9999",
age : Age 23
}
]
ここで出てくるタグ(型識別の接頭辞)は、EmployeeList, Person, PersonNameJa, TelNo, Age。それぞれのタグに対応する型コンバータがあって(事前に登録されていて)、それらを順次呼び出すことにより型変換を行う。
型コンバータの呼び出し順序/タイミング
いずれにしてもXionデータ構造をひととおり舐めることになるが:
ボトムアップだけで十分だと思う。
型コンバータのインターフェース
とりあえず一番安直そうなのは:
public interface Converter {
public String tag(); //型識別の接頭辞
public Object convert(Object data) throws XionConvertException;
}
これだと、リアライザー側がconvertへの入力を感知しないので、convert側で引数のチェックやキャストをしなくちゃならない。入力型をリアライザーに教えるとか、convertObject(Map
型コンバータの登録と利用
登録は適当にやってください。仮に登録簿をContextとでもすると:
InputStream input;
Context context;
// inputとcontextをセット
XionRealizer realizer = new XionRealizer();
Object obj;
try {
obj = realizer.realize(input, context);
} catch (IOException ioe) {
// あれま
} catch (XionParseException xpe) {
// おやま
}
// ここでリアライズ成功
// objに何が入ったかな?