かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

File System APIその1

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とか見慣れない拡張子みたいなものがあるけど、これは本のこれから読むところにばっちり書いてありそうだ。


とりあえず今回はここまで。