-Kijimuna core-0.5.xの内部

agtさんが昨日のコメントで反応してくれましたが、Kijimuna core-0.5.xをエディタからどう使うかです。エディタの補完機能から使うためにどう機能を起こすかは一時考えずに作りましたが、0.5.7以降でリファクタリングおよびI18Nに加え、エディタ等のcore外部からどう使うかを考えていかないといけません。ソースがどういう構成かは以下のとおりです。その他大勢は、以下のソースからたどれる感じ。

  • [org.seasar.kijimuna.core]
    • [builder] -NatureおよびBuilderのS2非依存実装
      • S2Nature -S2プロジェクトの情報を保持するのとBuilderの管理
    • [model] -S2の設定XMLを処理する実装。このパッケージだけS2依存
      • ComponentElement -登録コンポーネント情報。この情報を取るために周りのクラスは存在する。重要クラス
      • ContainerElement -diconファイル情報。名前空間やincludeの解決はここでやってる。重要クラス
      • ContainerRepository -プロジェクト内のdiconが集まるコンテナ。S2Natureに保持される
      • InjectedRtti -自動DI状態を取るためにIRttiをデリゲートしている
      • S2ConfigBuilder -S2設定XMLをビルドするBuilder
      • S2ElementFactory -S2設定XMLのエレメントオブジェクトのファクトリ
    • [ognl] -OGNL式に対応したRTTI拡張。S2非依存
      • OgnlRtti -OGNLのエントリーポイントとなる重要クラス
    • [parser] -SAXによるXMLパース機構。S2非依存
      • DocumentHandler -SAXパーサーハンドラ。重要クラス
      • Element -位置情報つきのXMLエレメントオブジェクト
      • LocationStopper -指定の行・列でパースを止めるルール実装。coreでは使ってない
    • [rtti] -Eclipseワークスペースの型情報をたどる機能。S2非依存
      • IRtti -型情報にアクセスするためのインターフェイス。RttiLoader#loadRtti()から取得
      • RttiLoader -RTTIのユーティリティでありファクトリである重要クラス
    • Kijimuna -プラグイン内外から機能を利用するためのエントリポイント

プラグイン内の作りは、SAXパーサーとRTTIおよびS2依存部分からできています。S2依存部分はorg.seasar.kijimuna.core.modelパッケージのクラス群のみです。手元バージョンではorg.seasar.kijimuna.core.Kijimunaに以下のメソッドを用意しました。

public static ContainerElement getContainerElement(IFile file)

引数のIFileに対応したパース済みのコンテナ情報を返すstaticメソッドです。GEFで自動DIの様子を見るのは、このメソッドを外部のプラグインより叩くだけでOKなのですが、補完エディタだと適宜パースしないといけないかも。その際にはS2ConfigBuilderのように特殊用途のパーサーを実装するようにデザインしています。LocationStopperはその名残です。ただ、このへんは汎用にはもっと作りこみしないといけないと思います。今の実装でRTTIおよびOGNLのところは相当使えるものになったと自負しています。
今週、福岡でまさにこの話をしたいなあと思ったのですが、出張なくなっちゃったので悲しい。ビジョンだけ書き捨てると、.diconのエディタはタブ付きエディタで、GEFのDI Diagram表示ページと、専用XMLエディタがタブで切り替えられるとステキ。DI DiagramとXML Editorが2wayなるのが私は最終目標かなと思います。
ということで、ソース見ていただいているなら、リファクタとI18Nに手をつけた、core-0.5.7を後ほどリリースしておきます。
S2Tools時代は、Eclipse非依存も目指していたのですが、Eclipseプラグイン中で使うのにEclipse非依存でやるのはコードにオーバーヘッドが多くてごちゃごちゃしてきちゃうので整理してきた結果、Eclipse外では使えなくなってしまいました。