ROMEを使ってフィードを読み込む
では、実際にROMEを使用してフィードを読み込んでみよう。ただし、ファイルを読み込むだけでは面白くないので、HTTPを使用してインターネットからフィードを取得するようにする。そのためには、ROMEだけではなく、サブプロジェクトであるROME Fetcherも必要だ。
ダウンロード、インストール
ROMEのダウンロードはこちらのサイトから行うことができる。また、ROME Fetcherの最新バージョンである0.9はこちらからダウンロード可能だ。
インストール作業は特に必要ない。ダウンロードしたアーカイブを展開すると、JARファイル(ROMEはrome-0.9.jar、ROME Fetcherはrome-fetcher-0.9.jar)が入手できるので、これらにクラスパスを通してコンパイル/実行を行えばよい。
サンプルソース
HTTPを用いてフィードを取得するサンプルは以下のようになる。
import java.net.URL;
import java.util.List;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.fetcher.FeedFetcher;
import com.sun.syndication.fetcher.impl.HttpURLFeedFetcher;
public class PrintFeed {
// フィードのURL
private static final String[] FEED_URLS = {
"http://journal.mycom.co.jp/haishin/rss/enterprise.rdf",
"http://d.hatena.ne.jp/Syunpei/rss",
};
public static void main(String[] args) throws Exception {
// HTTPを元にフィードを取得するクラス「FeedFetcher」 ………(1)
FeedFetcher fetcher = new HttpURLFeedFetcher();
// フィードの内容、フィードに含まれる記事エントリの内容を出力する
for (String url : FEED_URLS) {
// フィードの取得 ………(2)
SyndFeed feed = fetcher.retrieveFeed(new URL(url));
System.out.format("フィードタイトル:[%s] 著者:[%s]\n",
feed.getTitle(),
feed.getUri());
for (SyndEntry entry : (List<SyndEntry>) feed.getEntries()) {
System.out.format("\t更新時刻:[%s] URL:[%s] 記事タイトル:[%s]\n",
entry.getPublishedDate(),
entry.getLink(),
entry.getTitle());
}
}
}
}
このサンプルをコンパイル、実行する際にはROMEとROME FetcherのJARファイルをクラスパスに含めるのを忘れないこと。
ポイントは以下の2点だけだ。
FeedFetcherが、ROME Fetcherで開発されたHTTPを用いてフィードを取得するクラスになる。JDKコアパッケージに含まれるHttpURLConnectionを使用してフィードを取得する。この他にも、Jakarta Commons HttpClientを用いるバージョンも存在する
フィード(SyndFeedクラス)を取得する。FeedFetcher#retrieveFeed(java.net.URL)がそのメソッドだ
このサンプルは、あらゆるバージョンのAtomとRSSのフィードを取り扱うことができる。また、フィードを表すSyndFeedクラス、個々のエントリを表すSyndEntryクラスはすべて単純なPOJOなので、Hibernateなどを用いて永続化することも簡単だ。
以上、簡単ではあるが、ROMEの紹介をこれで終わりにする。今回ご紹介できなかったが、フィードを書き出す際にもSyndFeedなどの同じクラスを使用でき、非常に容易だ。
最近では、RSSやAtomのフィード配信は当然と思われており、Javaアプリケーションの開発プロジェクトでも必要になるケースは少なくない。Javaでフィードを統一的に扱うことのできるライブラリとして、ROMEへの期待はこれからどんどん高まっていくはずだ。使い方を覚えておいて損のないライブラリであることは間違いないだろう。