【Java】Google/Outlook Calendar において、 iCal形式のURLからデータを取得する

■ はじめに

https://blogs.yahoo.co.jp/dk521123/37534228.html
だと、Google Calendar専用の処理になり、
例えば、Outlookのような他のカレンダーシステムも対応する場合は
別の処理を実装しなおさなければならない。
また、APIの仕様がいつ変更されるのか?どのように変更されるのか?などの懸念もある。

そこで、以下の関連記事で扱った標準のiCal形式をURLから取得できるので
そのサンプルを作成してみた
https://blogs.yahoo.co.jp/dk521123/37532480.html

■ カレンダーのiCal形式のURLについて

Google Calendar

[1] 以下のURLにブラウザでアクセスする
https://calendar.google.com/calendar/r
[2] カレンダーの右側の[アイコン(オーバーフローメニュー)]を選択
[3] 「カレンダーの統合」の「iCal形式の公開URL」の
    URL「https://calendar.google.com/calendar/ical/【ユーザ名】%40gmail.com/public/basic.ics」
    をコピーしておく
 => サンプルに設定する

Outlook Calendar

[1] 以下のURLにブラウザでアクセスする
https://outlook.live.com/owa/
[2] 上右側の[歯車アイコン(設定)]-[オプション]を選択
[3] 上右側の[予定表]-[共有予定表]-[予定表の公開]を選択
[4] 「予定表の選択」で対象のカレンダーを選択し、「作成」ボタン押下
[5] 「ICS」のURL「https://outlook.live.com/owa//calendar/【ランダム文字列】/calendar.ics
    をコピーしておく
 => サンプルに設定する

■ サンプル

 * iCalendar ライブラリとして、 biweekly を使用。
   設定については、以下の関連記事を参照。
https://blogs.yahoo.co.jp/dk521123/37532480.html

GoogleCalendarDemo.java

import java.io.InputStream;
import java.net.URL;

import biweekly.Biweekly;
import biweekly.ICalendar;
import biweekly.component.VEvent;
import biweekly.io.chain.ChainingTextParser;

public class GoogleCalendarDemo {
  /** Google Calendarhttps://calendar.google.com/calendar/ical/【ユーザ名】%40gmail.com/public/basic.ics */
  private static final String TARGET_URL_FOR_GOOGLE_CALENDAR = "https://calendar.google.com/calendar/ical/yourusername%40gmail.com/public/basic.ics";
  /** Outlook Calendar */
  private static final String TARGET_URL_FOR_OUTLOOK_CALENDAR = "https://outlook.live.com/owa//calendar/XXXXXXXXXXXXX-XXXX-XXXXXXXXXXXXXXX/cid-XXXXXXXXXXXX/calendar.ics";
  
    
  public static void main(String[] args) {
    System.out.println("Start!");
    
    System.out.println("From Google");
    printICal(TARGET_URL_FOR_GOOGLE_CALENDAR);
    
    System.out.println("From Outlook");
    printICal(TARGET_URL_FOR_OUTLOOK_CALENDAR);
    
    System.out.println("Done!!");
  }

  private static void printICal(String targetUrl) {
    try {
      URL url = new URL(targetUrl);
      try (InputStream inputStream = url.openStream();) {
        ChainingTextParser<ChainingTextParser<?>> parser = Biweekly
            .parse(inputStream);
        for (ICalendar ical : parser.all()) {
          System.out.println("event List size = " + ical.getEvents().size());
          for (VEvent event : ical.getEvents()) {
            String summary = event.getSummary().getValue();
            System.out.println("summary = " + summary);
          }
        }
      }
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

出力結果例

Start!
From Google
event List size = 2
summary = テストのために
summary = サンプル
From Outlook
event List size = 2
summary = Sample
summary = This is a sample. Hello World!!
Done!!