Staxで今度こそRSSフィードを纏め上げる(後は文字コード問題)

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2009年5月6日 水曜日1:14:32

前回のエントリで脆くも砕け散ってしまったお勉強テーマである、
俺が所有する、現在アクティブな4つのブログのRSSフィードを、
Stax+Wicketで纏めようと言う試みがようやく形になってきた。

こちらにその結果がある。

まぁ、5月5日時点では見ての通り日本語が無茶苦茶ですよ。
ただ、これはStax+Wicket+ROMEの連携には、まったく関係の無い
別の所にある問題なので、RSSフィードを出す方法はわかった。

と言うことで、解説を書きまーす。

なお、今回は
Javaウェブフレームワーク「Wicket」の使い方 RSS Readerを作る その2 - フィードの取得と表示
を参考にした。

必要なライブラリを集める

前回のエントリで書いたROMEJDOMに加え、4つのライブラリを手に入れる。

RomeFetcherはフィードを読み込んでROMEで使える形にしてくれる、
俺が最も求めていたと言っても過言ではないROMEの拡張。
HttpClientはRomeFetcherが使用するライブラリで、残り2つはHttpClientが使うライブラリ。
解説ページには最後のCommons Loggingが書いてないので、参考にする場合注意して。

解説を真似ながらフィードを集める

解説にあるFeedManagerが便利そうなので、基本的には真似ていく。
が、俺の求める機能とマッチしてるわけではないので、その部分は改変。

解説のFeedManagerは各サイトのフィードが入ったSet
沢山入ったSetが作られるが、俺が欲しいのは各サイトのフィードを纏めた
1個のフィードなので、コンストラクタとgetFeed辺りにオリジナル入ってる。

例えば、フィードを突っ込むためにSortedSetを作り、SyndEntry
getPublishedDate()で、新しいフィードの方が前に来るようにしている。

this.entrySet = Collections.synchronizedSortedSet(
        new TreeSet<SyndEntry>(new Comparator<SyndEntry>(){
            @Override
            public int compare(SyndEntry o1, SyndEntry o2) {
                return o2.getPublishedDate().compareTo(o1.getPublishedDate());
            }
        }
    )
);

で、後はとってきたフィードを全部ここに放り込んで、放り込み終わったら
SyndFeedに突っ込んでいる。

ただ、突っ込む際のコードが冗長な気がする。ここまでする必要あるのかな?

SyndFeed feeds = new SyndFeedImpl();
feeds.setEntries(new LinkedList<SyndFeed>(
    (Collection<? extends SyndFeed>) this.entrySet)
);

このFeedManagerでフィードが取れるので、
あとは前回と同じ要領でRSSとして書き出す感じ。

web.xmlを設定する

前のエントリで書いたとおり、WebApplicationクラスから直接呼ばれたWebPageでないと、
SyndFeedOutputを使うことが出来ない。
と言うことで、web.xmlを変更して、フィードのためのURLを用意してやることにした。

<filter>
    <filter-name>wicket.TarotarorgFeed</filter-name>
     <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
    <init-param>
        <param-name>applicationClassName</param-name>
        <param-value>org.tarotaro.java.wicket.feed.TarotarorgFeedApplication</param-value>
     </init-param>
 </filter>

<filter-mapping>
    <filter-name>wicket.TarotarorgFeed</filter-name>
    <url-pattern>/tfeed/*</url-pattern>
</filter-mapping>

と言うことで

これでフィードが出来たので、後は文字コードだな。

  • ページ:
  • 1
  • 2
  • 3
  • 4

トラックバック URL :

コメントをどうぞ

HTML convert time: 1.169 sec.