Irenka File System

めも。

Hackのパッケージングにあたって、ファイルシステムを一度整理した方がよさげと判断。

これまでIrenkaのFSはIWorkspaceRootを単一のルートとする構成だったけど、外部参照してるクラスパスコンテナとかそもそもjarファイルの中身表せないじゃねーかということが判明。ということで、もうちょいまじめに設計しようかなと。

  1. 複数のルートフォルダを持てる
    1. IWorkspaceRootを根とするResourcesプラグインをラップするファイルシステム
      • workspace:///irenka-spec/src/main/java/.../CtElement.java
    2. OSのファイルシステムをラップするファイルシステム
      • file:///C:/BOOT.INI
  2. 任意のサブファイルシステムを作成できる
    1. 圧縮ファイルを根とし、含まれるエントリを閲覧できるファイルシステムなど
      • zip:workspace:///irenka-query/lib/antlr.jar!/org/antlr/.../Parser.class
    2. クラスパスエントリを表現するファイルシステム (たぶん要らない:ルートフォルダから辿ればよし)

インテリジェントなルートフォルダ=サブファイルシステムとして、すべてをサブファイルシステムとして扱った方が楽かも。ある圧縮ファイルをサブファイルシステムのルートとみなす場合はそちらの方が矛盾が起こらないはず。特定のルートを提供する是非も環境が決めればよいこと。Unix的なマウントの考え方を使ってしまうと名前空間がめちゃくちゃになる+ファイルのインターフェースがリッチになりすぎるので見送り。パスの概念をきれいにするならマウントした方がいいとは思いますが。

/irenka-query/lib/antlr.jar に含まれるエントリ /org/antlr/runtime/Lexer.class を取得する流れ。

// 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をコンパイルするときとかにフックしやすくなる予定。


セキュリティ周りは後で考える。