トップ «前の日記(2010年06月10日) 最新 次の日記(2010年07月10日)» 編集

Masa's blog

検索キーワード:

2010年06月11日 Google カレンダーをJAVAで操作する [長年日記]

_ Google カレンダーをJAVAで操作する

Googleカレンダーをjavaで操作する仕事を依頼されそうになった。慌てて調べてみた。すごく苦労した。なのでまとめておく。

CalendarTest.java

//
// GoogleCalendar操作実験プログラム by m-ito
//
//  「わし、くらうどになるねん」
//
// Download : gdata-samples.java-1.41.3.zip from http://code.google.com/p/gdata-java-client/
//
// CLASSPATH=.;
//           C:\Program Files\Java\jre1.6.0_02\lib\ext\QTJava.zip;
//           C:\Some_Where\gdata-samples.java-1.41.3\gdata\java\lib\gdata-client-1.0.jar;
//           C:\Some_Where\gdata-samples.java-1.41.3\gdata\java\lib\gdata-client-meta-1.0.jar;
//           C:\Some_Where\gdata-samples.java-1.41.3\gdata\java\lib\gdata-calendar-2.0.jar;
//           C:\Some_Where\gdata-samples.java-1.41.3\gdata\java\lib\gdata-calendar-meta-2.0.jar;
//           C:\Some_Where\gdata-samples.java-1.41.3\gdata\java\lib\gdata-maps-2.0.jar;
//           C:\Some_Where\gdata-samples.java-1.41.3\gdata\java\lib\gdata-maps-meta-2.0.jar;
//           C:\Some_Where\gdata-samples.java-1.41.3\gdata\java\deps\google-collect-1.0-rc1.jar;
//           C:\Some_Where\gdata-samples.java-1.41.3\gdata\java\deps\jsr305.jar
//
// Compile : javac -encoding utf-8 CalendarTest.java
//
// Usage   : java CalendarTest Googleのアカウント パスワード
//
import com.google.gdata.client.*;
import com.google.gdata.client.calendar.*;
import com.google.gdata.data.*;
import com.google.gdata.data.acl.*;
import com.google.gdata.data.calendar.*;
import com.google.gdata.data.extensions.*;
import com.google.gdata.util.*;
import java.net.*;
import java.io.*;
import java.util.List;

public class CalendarTest {
  public static void main(String[] args) throws Exception {
    //============================================================
    // プロキシーの設定
    //============================================================
    System.setProperty("http.proxyHost", "192.168.0.100");
    System.setProperty("http.proxyPort", "8080");
    System.setProperty("https.proxyHost", "192.168.0.100");
    System.setProperty("https.proxyPort", "8080");
    //============================================================
    // カレンダーサービスオブジェクト作成
    //   o この親玉オブジェクトを介してGoogleCalendarを操作していく
    //   o 引数はオブジェクトを識別するための(?)任意文字列
    //============================================================
    CalendarService myService = new CalendarService("Sample-Service-Name");
    //============================================================
    // ログイン処理
    //============================================================
    String account = args[0];  // 1個目の引数
    String password = args[1]; // 2個目の引数
    myService.setUserCredentials(account, password);
    //============================================================
    // アクセスするURLオブジェクトの作成
    //   o 操作対象や、希望する機能ごとにいろんなURLが定められているみたい
    //   o とりあえず個人のカレンダーに登録されたイベントを操作する場合はこのURL
    //============================================================
    // URL postUrl = new URL("http://www.google.com/calendar/feeds/カレンダーID/private/full");
    //   o カレンダーIDがdefaultの場合はアカウントを指定したのと同じ
    //
    URL feedUrl = new URL("http://www.google.com/calendar/feeds/default/private/full");
    //============================================================
    // 全件のイベントを取得
    //============================================================
    System.out.println("===== 全件のイベントを取得 =====");
    //
    // イベントオブジェクトを作成
    //   o カレンダー上の全イベント情報を持つオブジェクト
    //
    CalendarEventFeed myFeed1 = myService.getFeed(feedUrl, CalendarEventFeed.class);
    //
    // 全イベントをイベントエントリオブジェクトのリスト形式で取得
    //
    List<CalendarEventEntry> feeds1 = myFeed1.getEntries();
    //
    // 個々のイベントエントリオブジェクトから項目を取り出して表示
    //
    for (CalendarEventEntry entry1 : feeds1) {
      System.out.println(entry1.getTitle().getPlainText() + "|"
                         + entry1.getTextContent().getContent().getPlainText() + "|"
                         + entry1.getTimes().get(0).getStartTime().toString() + "|"
                         + entry1.getTimes().get(0).getEndTime().toString());
    }
    //============================================================
    // 開始日時、終了日時を指定してイベントを取得
    //============================================================
    System.out.println("===== 開始日時、終了日時を指定してイベントを取得 =====");
    //
    // カレンダー問い合わせオブジェクト作成
    //   o 問合せ条件を設定するためのオブジェクト
    //
    CalendarQuery myQuery2 = new CalendarQuery(feedUrl);
    //
    // 問合せ条件(開始日時下限〜上限)設定
    //   o yyyy-mm-ddThh:mm:ss.mmm+09:00
    //     - yyyy   : 西暦年
    //     - mm     : 月
    //     - dd     : 日
    //     - T      : 固定値(?)
    //     - hh     : 時
    //     - mm     : 分
    //     - ss     : 秒
    //     - mmm    : マイクロ秒
    //     - +09:00 : 固定値(グリニッジ標準時 + 09:00 = 日本標準時間)
    //
    myQuery2.setMinimumStartTime(DateTime.parseDateTime("2010-05-01T00:00:00.000+09:00"));
    myQuery2.setMaximumStartTime(DateTime.parseDateTime("2010-05-15T23:59:59.999+09:00"));
    //
    // 問合せを実行し、イベントオブジェクトを得る
    //   o 問合せ結果の全イベント情報を持つオブジェクト
    //
    CalendarEventFeed ResultsFeed2 = myService.query(myQuery2, CalendarEventFeed.class);
    //
    // 問合せ結果の全イベントをイベントエントリオブジェクトのリスト形式で取得
    //
    List<CalendarEventEntry> feeds2 = ResultsFeed2.getEntries();
    //
    // 個々のイベントエントリオブジェクトから項目を取り出して表示
    //
    for (CalendarEventEntry entry2 : feeds2) {
      System.out.println(entry2.getTitle().getPlainText() + "|"
                         + entry2.getTextContent().getContent().getPlainText() + "|"
                         + entry2.getTimes().get(0).getStartTime().toString() + "|"
                         + entry2.getTimes().get(0).getEndTime().toString());
    }
    //============================================================
    // 全文検索でイベントを取得
    //   o 時に曖昧な結果を返す(日本語を含む場合?は使えないと思っ
    //     ておいたほうが...)
    //============================================================
    System.out.println("===== 全文検索でイベントを取得 =====");
    //
    // カレンダー問い合わせオブジェクト作成
    //   o 問合せ条件を設定するためのオブジェクト
    //
    CalendarQuery myQuery3 = new CalendarQuery(feedUrl);
    //
    // 問合せ条件(全文検索文字列)設定
    //
    myQuery3.setFullTextQuery("NW");
    //
    // 問合せ条件(何件目から結果を受け取るか)設定
    //
    myQuery3.setStartIndex(1);
    //
    // 問合せ条件(最大何件結果を受け取るか)設定
    //
    myQuery3.setMaxResults(3);
    //
    // 問合せを実行し、イベントオブジェクトを得る
    //   o 問合せ結果の全イベント情報を持つオブジェクト
    //
    CalendarEventFeed ResultsFeed3 = myService.query(myQuery3, CalendarEventFeed.class);
    //
    // 問合せ結果の全イベントをイベントエントリオブジェクトのリスト形式で取得
    //
    List<CalendarEventEntry> feeds3 = ResultsFeed3.getEntries();
    //
    // 個々のイベントエントリオブジェクトから項目を取り出して表示
    //
    for (CalendarEventEntry entry3 : feeds3) {
      System.out.println(entry3.getTitle().getPlainText() + "|"
                         + entry3.getTextContent().getContent().getPlainText() + "|"
                         + entry3.getTimes().get(0).getStartTime().toString() + "|"
                         + entry3.getTimes().get(0).getEndTime().toString());
    }
    //============================================================
    // イベントを追加
    //============================================================
    System.out.println("===== イベントを追加 =====");
    //
    // 追加用のイベントエントリオブジェクトを作成
    //
    CalendarEventEntry myEntry = new CalendarEventEntry();
    //
    // 追加用のイベントエントリオブジェクトにタイトル設定
    //
    myEntry.setTitle(new PlainTextConstruct("秘密3"));
    //
    // 追加用のイベントエントリオブジェクトに本文設定
    //
    myEntry.setContent(new PlainTextConstruct("ないしょだよーん3"));
    //
    // 日時オブジェクトに開始日時設定
    //
    DateTime startTime = DateTime.parseDateTime("2010-06-30T08:45:00.000+09:00");
    //
    // 日時オブジェクトに終了日時設定
    //
    DateTime endTime = DateTime.parseDateTime("2010-06-30T17:15:00.000+09:00");
    //
    // 何時オブジェクト作成
    //
    When eventTimes = new When();
    //
    // 何時オブジェクトに開始日時、終了日時設定
    //
    eventTimes.setStartTime(startTime);
    eventTimes.setEndTime(endTime);
    //
    // 追加用のイベントエントリオブジェクトに何時オブジェクト(開始日時、終了日時)追加
    //
    myEntry.addTime(eventTimes);
    //
    // 追加実行
    //
    CalendarEventEntry insertedEntry = myService.insert(feedUrl, myEntry);
    //============================================================
    // イベントを更新
    //============================================================
    System.out.println("===== イベントを更新 =====");
    //
    // カレンダー問い合わせオブジェクト作成
    //   o 問合せ条件を設定するためのオブジェクト
    //
    CalendarQuery myQuery4 = new CalendarQuery(feedUrl);
    //
    // 問合せ条件(開始日時下限〜上限)設定
    //
    myQuery4.setMinimumStartTime(DateTime.parseDateTime("2010-06-30T08:45:00.000+09:00"));
    myQuery4.setMinimumStartTime(DateTime.parseDateTime("2010-06-30T08:45:00.999+09:00"));
    //
    // 問合せを実行し、イベントオブジェクトを得る
    //   o 問合せ結果の全イベント情報を持つオブジェクト
    //
    CalendarEventFeed ResultsFeed4 = myService.query(myQuery4, CalendarEventFeed.class);
    //
    // 問合せ結果の全イベントをイベントエントリオブジェクトのリスト形式で取得
    //
    List<CalendarEventEntry> feeds4 = ResultsFeed4.getEntries();
    //
    // 個々のイベントエントリオブジェクトから項目を取り出して更新
    //
    for (CalendarEventEntry entry4 : feeds4) {
      System.out.println("今から修正するイベント : "
                         + entry4.getTitle().getPlainText() + "|"
                         + entry4.getTextContent().getContent().getPlainText() + "|"
                         + entry4.getTimes().get(0).getStartTime().toString() + "|"
                         + entry4.getTimes().get(0).getEndTime().toString());
      //
      // イベントエントリオブジェクト中のタイトルと本文を修正
      //   o 開始日時、終了日時の修正はできないみたい
      //
      entry4.setTitle(new PlainTextConstruct("すっごい秘密3"));
      entry4.setContent(new PlainTextConstruct("絶対ないしょだよーん3"));
      //
      // 検索&修正したイベントエントリオブジェクトから更新用のURLオブジェクトを生成
      //
      URL editUrl = new URL(entry4.getEditLink().getHref());
      //
      // 更新実行
      //
      CalendarEventEntry updatedEntry = (CalendarEventEntry)myService.update(editUrl, entry4);
    }
    //============================================================
    // イベントを削除
    //============================================================
    System.out.println("===== イベントを削除 =====");
    //
    // カレンダー問い合わせオブジェクト作成
    //   o 問合せ条件を設定するためのオブジェクト
    //
    CalendarQuery myQuery5 = new CalendarQuery(feedUrl);
    //
    // 問合せ条件(開始日時下限〜上限)設定
    //
    myQuery5.setMinimumStartTime(DateTime.parseDateTime("2010-06-30T08:45:00.000+09:00"));
    myQuery5.setMaximumStartTime(DateTime.parseDateTime("2010-06-30T17:15:00.999+09:00"));
    //
    // 問合せを実行し、イベントオブジェクトを得る
    //   o 問合せ結果の全イベント情報を持つオブジェクト
    //
    CalendarEventFeed ResultsFeed5 = myService.query(myQuery5, CalendarEventFeed.class);
    //
    // 問合せ結果の全イベントをイベントエントリオブジェクトのリスト形式で取得
    //
    List<CalendarEventEntry> feeds5 = ResultsFeed5.getEntries();
    //
    // 個々のイベントエントリオブジェクトを削除
    //
    for (CalendarEventEntry entry5 : feeds5) {
      System.out.println("今から削除するイベント : "
                         + entry5.getTitle().getPlainText() + "|"
                         + entry5.getTextContent().getContent().getPlainText() + "|"
                         + entry5.getTimes().get(0).getStartTime().toString() + "|"
                         + entry5.getTimes().get(0).getEndTime().toString());
      //
      // 検索したイベントエントリオブジェクトから削除用のURLオブジェクトを生成
      //
      URL deleteUrl = new URL(entry5.getEditLink().getHref());
      //
      // 削除用のURLオブジェクトから削除用イベントエントリオブジェクトを作成
      //
      CalendarEventEntry delentry = myService.getEntry(deleteUrl, CalendarEventEntry.class);
      //
      // 削除実行
      //
      delentry.delete();
    }
  }
}

結局その案件は無くなった:(