はじめてのSlim3

AppEngine Ja Night 5 お疲れ様でした.

こんなイベントをボランティアで開催くださる皆様には本当に頭が下がります.また,会場をご提供いただいたGree様,ありがとうございました.

というわけで,今回のひがさんのトークSlim3のGlobal Transaction. いかにも力業だけど.この力業をちゃんと実装しちゃうのは,さすが,としかいいようがない.コードもきれいだ.

にもかかわらず,実は私は,これまでSlim3を使ってみたことが無い.ホームページを見ると,'Full Stack' とか書かれていて正直ちょっとびびっていた.でも今日お聞きしたら,データストア層だけでも使えるということだったので,試してみた.

意外に簡単だった.

インストール

基本的にここに書いてある通りなのだけど,私が混乱したところを整理しておく.

このページには,ブランクプロジェクトをダウンロードする方法と,既存プロジェクトに追加する方法の両方が書かれている.さらに,JUnitテストのための設定も混在していてちょいわかりにくい.さらに,Factory Pathの設定の手順で一枚スクリーンショットが足りないような..まあ,わかっている人には何でもないのだろうけど.

既存のプロジェクトにSlim3を追加する手順をまとめる.

  • ここから最新のslim3-blank-XXXX.zipをダウンロードする.この zipのなかで必要なのは,lib/slim3-gen-EA1-SNAPSHOT.jarと,war/WEB-INF/lib/slim3-EA1-SNAPSHOT.jar の二つのjar.前者がアノテーションを解釈してメタクラスを作成してくれる処理系,後者がランタイム.
  • プロジェクトディレクトリの直下に,lib を作成し,slim3-gen-XX.jarをコピー.こちらはビルドパスに通す必要は無い.
  • プロジェクトディレクトリ/war/WEB-INF/lib に,slim3-XXX.jar をコピー.ビルドパスを通す.
  • Preference-> General->Workspace で,Refresh automatically をチェックする.
  • プロジェクトのプロパティで,Java Compiler -> Annotation Processing で,Enable project specific settings, Enable annotation processing, Enable processing in editor にチェック.Generated source directoryに 「.apt_generated」 を指定.上記ページにはここの部分が抜けている.
  • 引き続き Java Compiler -> Annotation Processing -> Factory Path で,Enable project specific settings にチェック,Add JARsで プロジェクトディレクトリ/lib/slim3-gen-XXX.jar を指定.
<filter>
    <filter-name>datastoreFilter</filter-name>
    <filter-class>org.slim3.datastore.DatastoreFilter</filter-class>
</filter>

<filter-mapping>
        <filter-name>datastoreFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
</filter-mapping>

多分これでOK.

Slim3 の検索

まだ,ちょっと触っただけなので全然わからないのだけど,なかなか快適だ.JDOのPersistenceManagerやら訳のわからない状態遷移に触らなくて済むだけでもありがたい.実際,Slim3 を触っていると,なんでJDOがあんな事になっちゃってるのかわからなくなってくる.

Slim3の検索には,データ構造を格納したメタクラスを用いて行う.メタクラスは,モデルクラスを定義すると自動的に生成される.

  MemoMeta meta = MemoMeta.get();
  List<Memo> memos = Datastore.query(meta)
       .filter(meta.author.equal(user))
       .sort(meta.date.desc)
       .asList(); 

結構罠っぽいのは,equal と equals.equalは上記のように条件式を表現するために使うのだけど,Javaのすべてのオブジェクトはequalsを持ってるのでコンプリーションすると両方出てくる.型が合わないので大丈夫なんだけど.

所感

まだほんの少ししか見ていないけど,これは,みんな使うべき.JDOにはうんざりだけど,low-level APIはさすがにどうよ,という人は是非.