かずきのBlog@hatena

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

FileSystemAPIその2

ということで先日なんじゃこりゃ!?って言った.instanceという拡張子のものから。
結論からいうとインスタンス作れるらしいよ。

とりあえず今日は時間がないから早速プログラムをば。
昨日作ったメニューの下に1つメニューを追加!!
んで、okazuki.modules.menus.layer.xmlに対して下のような記述を追加した。

    <folder name="okazuki">
        <file name="okazuki-modules-menus-Person.instance" />
    </folder>

fileタグのname属性がポイント!
パッケージ名の区切りをハイフン(-)にして最後に.instance
ちなみにokazuki.modules.menus.Personクラスはこんなん

package okazuki.modules.menus;

public class Person {
    
    private String name;
    
    public Person() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

なんのこた〜ないクラスです。


ってことで、このPersonのインスタンスをFileObjectから取得してみよう!!
ここで使うクラスは、まだ未知のDatasystems APIとNodes APIがいる。
Librariesに追加しておこう。


先ほど追加したmenuのクリックしたときの処理を下のようにする。

        try {
            FileObject root = org.openide.filesystems.Repository.getDefault().getDefaultFileSystem().getRoot();
            FileObject personFile = root.getFileObject("okazuki/okazuki-modules-menus-Person.instance");
            System.out.println(personFile);
            DataObject dataObj = DataObject.find(personFile);
            InstanceCookie instanceCookie = dataObj.getLookup().lookup(InstanceCookie.class);
            if (instanceCookie != null) {
                Person p = (Person) instanceCookie.instanceCreate();
                System.out.println(p);
            }
        } catch (Exception ex) {
            ErrorManager.getDefault().notify(ex);
        }

FileSystemを取得してルートからokazuki/okazuki-modules-menus-Person.instanceを取得している。
その後、DataObjectに変換してInstanceCookieをlookup!!!
InstanceCookieは、instanceCreateメソッドでインスタンスを作ってくれる。

これを実行すると下のようになった。

MultiFileObject@8ef455[okazuki/okazuki-modules-menus-Person.instance]
okazuki.modules.menus.Person@127ff0d

期待通り!
今日は、寝るかぁ…zzz