Play framework(4) - yamlによる開発用データの取り込み

Play frameworkには、モデルに対応したデータをファイルより取得する仕組みがあります。
これによりデータベースに接続しない状態でも、開発を可能としています。

今回はその仕組みとソースを紹介します。

YAMLファイル
データはYAMLファイルに記述します。
今回のYAMLファイルは「initial-data.yml」で、アプリのルート\confフォルダ内に配置します。

initial-data.yml


# Test data

User(bill):
name: bill
password: billpass
email: bill@ggg.com

User(tom):
name: tom
password: tompass
email: tom@ggg.com

User(clerk):
name: clerk
password: clerkpass
email: clerk@ggg.com

Memo(billmemo):
title: billmemo1
content: aaaa
bbbb
cccc
createDate: 2001-12-14t21:59:43.10-05:00
user: bill

Memo(tommemo):
title: tommemo1
content: aaaa
bbbb
cccc
createDate: 2001-12-14t21:59:43.10-05:00
user: tom

Memo(clerk):
title: clerkmemo1
content: aaaaa
bbbbb
ccccc
createDate: 2001-12-14t21:59:43.10-05:00
user: clerk

Memo(billmemo2):
title: billmemo2
content: aaaa
bbbb
cccc
createDate: 2001-12-14t21:59:43.10-05:00
user: bill

Memo(tommemo2):
title: tommemo2
content: aaaa
bbbb
cccc
createDate: 2001-12-14t21:59:43.10-05:00
user: tom


UserとMemoの2つのモデルに値を設定し、インスタンスを作成しています。

書式は、
モデルのクラス名(インスタンス名)
    publicのメンバ変数名:値
    publicのメンバ変数名:値
...
という感じです。

注目点は、Memoモデルのuserプロパティに、Userモデルから作成したインスタンスを渡していることです。
例えばMemoモデルのインスタンスであるbillmemoでは、userプロパティにUserモデルのインスタンスであるbill
を渡しています。


User(bill):
name: bill
password: billpass
email: bill@ggg.com

(中略)

Memo(billmemo):
title: billmemo1
content: aaaa
bbbb
cccc
createDate: 2001-12-14t21:59:43.10-05:00
user: bill

◆Bootstrapジョブ
YAMLファイルを配置するだけでは、アプリの起動時にデータはロードされません。
ロードするために、Boostrapジョブを作成します。
Boostrapジョブは、アプリのルート\app\Bootstrap.javaに記述します。

..\app\Bootstrap.java


import play.*;
import play.jobs.*;
import play.test.*;

import models.*;

@OnApplicationStart
public class Bootstrap extends Job {
public void doJob(){
if(User.count() == 0){
Fixtures.loadModels("initial-data.yml");
}
}
}


Jobクラスを継承し、アプリ起動時に実行するため@OnApplicationStartアノテーションを定義します。
この例ではロードする前に、Userモデルの件数が0件かどうかの判定をしています。
そしてFixtures.loadModels()メソッドを呼び出し、先の「initial-data.yml」ファイルをロードします。