ここまでの作業で、
- チェックイン予定表(日時と場所(スポット))
- サーバからのチェックイン
を作ったので、これらをまとめて自動チェックインを実現する。具体的には、上記の機能をサーブレットで次のようにまとめて、
- チェックイン予定表を検索し、条件にあった予定を抽出する。
条件:予定日時が現在時刻より前(=予定時刻が過ぎている)で、未チェックインの予定 - 抽出した予定の地点にチェックインする
チェックイン完了後、ステータスをチェックイン済に変更する
このサーブレットを一定時間ごと(例えば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として登録し、定期的に実行する。