ここまでの作業で、
- チェックイン予定表(日時と場所(スポット))
- サーバからのチェックイン
を作ったので、これらをまとめて自動チェックインを実現する。具体的には、上記の機能をサーブレットで次のようにまとめて、
- チェックイン予定表を検索し、条件にあった予定を抽出する。
条件:予定日時が現在時刻より前(=予定時刻が過ぎている)で、未チェックインの予定 - 抽出した予定の地点にチェックインする
チェックイン完了後、ステータスをチェックイン済に変更する
このサーブレットを一定時間ごと(例えば1分ごと)に実行することで、自動チェックインを実現する。なお、これらの処理はすべてサーバ側で行われるので、一連の処理に際しモバイル機器は不要で、「予定」を変更したい場合にのみ使えばOK。サーブレットの処理部分のコードは以下のイメージ。
// Java
// PersistenceManager をインスタンス化
PersistenceManager pm=PMF.get().getPersistenceManager();
// 日時の比較用
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tokyo"));// 今日&現在時刻
SimpleDateFormat sdfCurDate = new SimpleDateFormat("yyyy/MM/dd");
String curDate =sdfCurDate.format(cal.getTime()); // 今日の日付の文字列表現
SimpleDateFormat sdfCurTime = new SimpleDateFormat("HH:mm");
String curTime =sdfCurTime.format(cal.getTime()); // 現在の時刻の文字列表現
// クエリ文字列を組み立て
String query = "select from " + SpotPlan.class.getName() + " where chk_status =='plan' & chk_mode=='auto' & spot_date =='" + curDate + "' & spot_time<'" + curTime + "'";
// クエリ実行
List<SpotPlan>plans = (List<SpotPlan>)pm.newQuery(query).execute();
// チェックインパラメータ用の変数
String venueID = "";
String shout = "";
String broadcast = "";
String checkinID = "";
for(SpotPlan plan:plans){ // 対象が複数ある場合は繰り返し処理
venueID = plan.getSpot_id(); // データストアに保存した内容を取得
shout = plan.getChk_msg();
broadcast = plan.getChk_bcast(); // 実際はもう少し配慮が必要
if (shout.equals("na")) shout = "";
// foursquareのスポットに対する処理
if ( (plan.getSpot_type()).equals("frsq") ){
// チェックイン実行 - 成功するとfoursquareからcheckinIDが返される。
// このIDを使ってチェックインの詳細にアクセスできる。
checkinID = checkinFoursquare(venueID, shout, broadcast);
if (checkinID != null){ // チェックイン成功
plan.setChk_status("checkin"); // ステータスその他を更新する
plan.setChk_id(checkinID);
plan.setChk_memo("autocheckin");
plan.setChk_date(curDate);
plan.setChk_time(curTime);
}
}
}
pm.close(); // データストア更新
このサーブレットをcronとして登録し、定期的に実行する。