Irenka File System
めも。
Hackのパッケージングにあたって、ファイルシステムを一度整理した方がよさげと判断。
これまでIrenkaのFSはIWorkspaceRootを単一のルートとする構成だったけど、外部参照してるクラスパスコンテナとかそもそもjarファイルの中身表せないじゃねーかということが判明。ということで、もうちょいまじめに設計しようかなと。
- 複数のルートフォルダを持てる
- 任意のサブファイルシステムを作成できる
インテリジェントなルートフォルダ=サブファイルシステムとして、すべてをサブファイルシステムとして扱った方が楽かも。ある圧縮ファイルをサブファイルシステムのルートとみなす場合はそちらの方が矛盾が起こらないはず。特定のルートを提供する是非も環境が決めればよいこと。Unix的なマウントの考え方を使ってしまうと名前空間がめちゃくちゃになる+ファイルのインターフェースがリッチになりすぎるので見送り。パスの概念をきれいにするならマウントした方がいいとは思いますが。
// IWorkspaceRoot Filer wsroot = context.getRootFolder(); // workspace:///irenka-query/lib/antlr.jar CtFile antlrJar = wsroot.getFile("irenka-query/lib/antlr.jar"); // workspace:///irenka-query/lib/antlr.jar をルートフォルダとするファイルシステム Filer antlr = context.getSubFiler(antlrJar); // zip:workspace:///irenka-query/lib/antlr.jar!/org/antlr/runtime/Lexer.class CtFile lexerClass = antlr.getFile("org/antlr/runtime/Lexer.class");
そうすると、Filerはこんな感じの機能かな。
/** * 指定のパス上に存在するファイルを返す。 * @param path 対象が存在するパス * @return 対象のファイル */ CtFile getFile(String path); /** * 指定のパス上に存在するフォルダを返す。 * @param path 対象が存在するパス * @return 対象のフォルダ */ CtFolder getFolder(String path); /** * このファイルシステムのルートフォルダを返す。 * @return このファイルシステムのルートフォルダ */ CtFolder getRootFolder(); /** * このファイルシステムのルートフォルダの元になった、親ファイルシステム上のリソースを返す。 * 親ファイルシステムが存在しない場合、この呼び出しは{@code null}を返す。 * @return ルートフォルダの元になった親ファイルシステム上のリソース (nullable) */ CtResource getEntity();
一晩考えてから実装する予定。
スケジュールおしてるので明日から5日くらいで何とかしたい。
- サブファイルシステムの概念を追加
- ローダがIrenka FSを使うように
- ICompilationUnitとの行き来も考えないと
- なんかいま思いついた気がしたけどすごい勢いでvolatile
たぶんこの辺までやれば、IrenkaがHTMLをコンパイルするときとかにフックしやすくなる予定。
セキュリティ周りは後で考える。