Lookupの他にFileSystemもNetBeansのModuleを書く上では重要っぽい。
こいつはLookupみたいにjarを1つ追加するだけで使えるよ〜っていうような記述は見当たらなかったので、大人しくNetBeansのモジュールとして作って見た。
構成はこんな感じ
okazuki.modulesがModule Suite Projectです。
SSのダイアログを見てもらえばわかると思いますがスタンドアロンアプリケーションにしてあります。
それにヒモづく形でmenusプロジェクトがあります。
menusプロジェクトのLibrariesには、File System APIを追加してあります。
んで、適当にメニュー項目を1つ追加しました。
これはウィザードに従うだけなので問題ないはず。
そして、このメニューを押下すると標準出力にFileSystemの中身をごっそり出力するコードを書きます!
サンプルとかだと、いきなりTreeに表示してみようぜ!みたいなノリだったりするけど、それだと覚えること多すぎるYO!になって消化不良気味なので、ここではおしゃれなことしません。
さて、とりあえずFileSystemAPIをさらっと紹介。
org.openide.filesystems.Repository.getDefaultFileSystem()メソッドでデフォルトのファイルシステムがゲットできる。
デフォルトのファイルシステムは、layer.xmlあたりの集合体なのかな?
中身見てるとそれっぽく見える。
ちなみにlayer.xmlはmanifest.mfの中でこんな風にして指定する。
OpenIDE-Module-Layer: okazuki/modules/menus/layer.xml
FileSystemが取得できたらgetRootメソッドでルートのFileObjectが取得できる。
後は、FileObjectのgetName, getMIMEType, getNameExt, getPathでFileObjectの情報を取得できる。
getChildrenで説明するまでもなく子要素が取得できる。
これらを組み合わせて下みたいなコードをメニューを押したときの処理に書いて見た。
package okazuki.modules.menus; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileSystem; import org.openide.filesystems.Repository; import org.openide.util.HelpCtx; import org.openide.util.NbBundle; import org.openide.util.actions.CallableSystemAction; public final class FileSystemDumpAction extends CallableSystemAction { // <実際に書いたコード> public void performAction() { FileSystem fileSystem = Repository.getDefault().getDefaultFileSystem(); printFileObject(0, fileSystem.getRoot()); } public void printFileObject(int dept, FileObject fileObject) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < dept; i++) { sb.append(" "); } String indent = sb.toString(); System.out.println(indent + "--------------------"); System.out.println(indent + "Name: " + fileObject.getName()); System.out.println(indent + "NameExt: " + fileObject.getNameExt()); System.out.println(indent + "MIMEType: " + fileObject.getMIMEType()); System.out.println(indent + "Path: " + fileObject.getPath()); for (FileObject child : fileObject.getChildren()) { printFileObject(dept + 1, child); } } // </実際に書いたコード> public String getName() { return NbBundle.getMessage(FileSystemDumpAction.class, "CTL_FileSystemDumpAction"); } protected void initialize() { super.initialize(); // see org.openide.util.actions.SystemAction.iconResource() javadoc for more details putValue("noIconInMenu", Boolean.TRUE); } public HelpCtx getHelpCtx() { return HelpCtx.DEFAULT_HELP; } protected boolean asynchronous() { return false; } }
読んでもらえばわかるけど、実際に書いたコードはちょろい。
この状態で実行してメニューを押すと、NetBeansの出力に下みたいな結果が出力される。
-------------------- Name: NameExt: MIMEType: content/unknown Path: ものすごい省略 -------------------- Name: org-openide-windows NameExt: org-openide-windows.xml MIMEType: text/xml Path: Modules/org-openide-windows.xml -------------------- Name: okazuki-modules-menus NameExt: okazuki-modules-menus.xml MIMEType: text/xml Path: Modules/okazuki-modules-menus.xml ものすごい省略 -------------------- Name: okazuki-modules-menus-FileSystemDumpAction NameExt: okazuki-modules-menus-FileSystemDumpAction.shadow MIMEType: content/unknown Path: Menu/File/okazuki-modules-menus-FileSystemDumpAction.shadow ものすごい省略 -------------------- Name: okazuki-modules-menus-FileSystemDumpAction NameExt: okazuki-modules-menus-FileSystemDumpAction.instance MIMEType: content/unknown Path: Actions/Edit/okazuki-modules-menus-FileSystemDumpAction.instance ものすごい省略 -------------------- Name: Tools NameExt: Tools MIMEType: content/unknown Path: Actions/Tools
1000行以上出力されたんで、ものすっごい省略してます。
上の出力結果は、なんか自分の追加したモジュールらしき情報が出力されていたので、そこらへんだけ抜き出して見た感じです。
よく見ると.instanceとか.shadowとか見慣れない拡張子みたいなものがあるけど、これは本のこれから読むところにばっちり書いてありそうだ。
とりあえず今回はここまで。