このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

Xion/Java:リアライザー

長いサッカー・ワールドカップ休暇(?)を終えたショー君へ:

テキスト(文字ストリーム)から構文的イベントを発生させるのが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データ構造をひととおり舐めることになるが:

  1. トップダウン:EmployeeListのコンバータが最初に呼ばれる。
  2. ボトムアップ:末端の、例えばAgeのコンバータなどが最初に呼ばれる。
  3. 両方向:トップダウンに降りてからボトムアップで戻る。

ボトムアップだけで十分だと思う。

型コンバータのインターフェース

とりあえず一番安直そうなのは:


public interface Converter {
public String tag(); //型識別の接頭辞
public Object convert(Object data) throws XionConvertException;
}

これだと、リアライザー側がconvertへの入力を感知しないので、convert側で引数のチェックやキャストをしなくちゃならない。入力型をリアライザーに教えるとか、convertObject(Map xionObj)のような型安全なメソッド群を一式揃えるとかもあるけど、めんどうだから安直でいいや。

型コンバータの登録と利用

登録は適当にやってください。仮に登録簿を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に何が入ったかな?