KEIS BLOGは株式会社ケイズ・ソフトウェアが運営しています。

KEIS BLOG

Google App Engine 第八回

LINEで送る
Pocket

Slim3とは

Slim3とはGoogle App Engine/Javaに最適化されたフルスタックMVCフレームワークです。

Slim3を使ったページの作成方法2

モデルの作成

1. build.xmlのAnt Taskからgen-modelを右クリック > Run As > 1. Ant Build を選択

misawa_01

2. Ant Input Request [Input a model] popup window が開かれます。

misawa_02

3. モデルのパスを入力します。
今回は[Memo]と入力し、下記の2ファイルを自動生成してください。

Memo.java
MemoTest.java

Slim3のモデルは以下の条件を満たす必要がありますが、Ant Taskを使用することで、簡単に作成することが出来ます。
・モデルアノテーション [@model]をクラスにつける。
・主キーとなるプロパティにアノテーション[@attribute(primaryKey=true)]をつける。

4. 必要なプロパティをモデルに追加します。
今回は以下の3プロパティを追加します。

    String title;
    String memo;
    Date updateDate;

5. プロパティに合わせてgetter/setterも作成してください。

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getMemo() {
        return memo;
    }

    public void setMemo(String memo) {
        this.memo = memo;
    }

    public Date getUpdateDate() {
        return updateDate;
    }

    public void setUpdateDate(Date updateDate) {
        this.updateDate = updateDate;
    }

サービスの作成

1. build.xmlのAnt Taskからgen-serviceを右クリック > Run As > 1. Ant Build を選択

misawa_03

2. Ant Input Request [Input a service name] popup window が開かれます。

misawa_04

3. サービスのパスを入力します。
今回は[MemoService]と入力し、下記の2ファイルを自動生成してください。

MemoService.java
MemoServiceTest.java

4. はじめに必要なメソッドのテストケースを[MemoServiceTest.java]に追加します。

public class MemoServiceTest extends AppEngineTestCase {

    // MemoServiceを新規作成
    private MemoService service = new MemoService();

    // [@Test]アノテーションをつけることでテストケースとして認識される。
    // クラス名は何でもよい。
    @Test
    public void curd_test() throws Exception {
        // 作成されたサービスがNullではない。
        assertThat(service, is(notNullValue()));
        
        // list()メソッドにより全オブジェクトの一覧を取得
        List<Memo> list = service.list();

        // 取得リストがNullではなく空である。(初回実行のため)
        assertNotNull(list);
        assertTrue(list.isEmpty());
        
        // === Insert TEST ===
        // Memo Classにデータをセット
        Memo memo = new Memo();
        memo.setTitle("TITLE");
        memo.setMemo("MEMOMEMO");
        memo.setUpdateDate(new Date());

        // service.insert()メソッドによりDatastoreにオブジェクトを格納する。
        service.insert(memo);
        
        // service.list()メソッドにより全オブジェクトを再取得
        list = service.list();
        
        // 取得リストがNullではなくSize==1である。
        assertNotNull(list);
        assertTrue(list.size() == 1);
        
        // Insertしたモデルと取得したモデルを比較
        Memo memo2 = list.get(0);
        assertEqualMemo(memo, memo2);
        
        // 取得したデータのバージョン番号は1である。
        assertThat(memo2.getVersion(), is(1L));
        
        // === Update TEST ===
        // モデルのTitleプロパティの内容を変更する。
        memo2.setTitle("TITLE UPDATED");
        // service.updateメソッドで変更してオブジェクトを更新
        service.update(memo2);
        
        // service.get(key)メソッドで更新したモデルを取得
        Memo memo3 = service.get(memo2.getKey());
        // Updateしたモデルと取得したモデルを比較
        assertEqualMemo(memo2, memo3);
        // 取得したデータのバージョン番号は2である。
        assertThat(memo3.getVersion(), is(2L));
        
        // === Delete TEST ===

        // service.delete(key)メソッドを使用してKeyで指定したオブジェクトを削除
        service.delete(memo3.getKey());
        // service.list()メソッドにより全オブジェクトを再取得
        list = service.list();


        // 取得リストがNullではなくSize==0である。
        assertNotNull(list);
        assertTrue(list.size() == 0);
    }
    
    private void assertEqualMemo(Memo memo1, Memo memo2){
        assertNotNull(memo1);
        assertNotNull(memo2);
        assertThat(memo2.getTitle(), is(memo1.getTitle()));
        assertThat(memo2.getMemo(), is(memo1.getMemo()));
        assertThat(memo2.getUpdateDate(), is(memo1.getUpdateDate()));
    }
}

5. テストケースの実行
[MemoServiceTest]を右クリック > Run As > 2. JUnit Testを選択
はじめは[MemoService]クラスに必要なメソッドがないのでエラーが発生します。

6. [MemoService]クラスに必要なメソッドを作成します。
[MemoServiceTest]を実行しつつエラーが無くなるまで、メソッドを追加してください。

public class MemoService {
    /**
     * Get Memo object by key from DS.
     * @param key
     * @return Memo
     */
    public Memo get(Key key) {
        return Datastore.getOrNull(MemoMeta.get(), key);
    }
    
    /**
     * Get all Memo object from DS.
     * @return List<Memo>
     */
    public List<Memo> list() {
        MemoMeta m = MemoMeta.get();
        return Datastore.query(m).sort(m.updateDate.desc).asList();
    }
    
    /**
     * Insert Memo object into DS.
     * @param memo
     */
    public void insert(Memo memo) {
        memo.setKey(Datastore.allocateId(MemoMeta.get()));
        Datastore.put(memo);
    }

    /**
     * Update Memo object in DS. 
     * @param memo
     */
    public void update(Memo memo) {
        Datastore.put(memo);
    }
    
    /**
     * Delete Memo object from DS.
     * @param key
     */
    public void delete(Key key) {
        Datastore.delete(key);
    }
}

6. 最終的にエラーが発生しなくなれば、コーディング完了です。

misawa_05

次回は「Slim3を使ったページの作成方法3」をご紹介します。

【関連記事】
Google App Engine 第一回
Google App Engine 第二回
Javaのライブラリを手軽にテストしたい!! Groovy入門 第1回
Google App Engine 第三回
Google App Engine 第四回
Google App Engine 第五回
Google App Engine 第六回
Google App Engine 第七回

LINEで送る
Pocket