かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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