Staxで今度こそRSSフィードを纏め上げる(後は文字コード問題)
前回のエントリで脆くも砕け散ってしまったお勉強テーマである、
俺が所有する、現在アクティブな4つのブログのRSSフィードを、
Stax+Wicketで纏めようと言う試みがようやく形になってきた。
こちらにその結果がある。
まぁ、5月5日時点では見ての通り日本語が無茶苦茶ですよ。
ただ、これはStax+Wicket+ROMEの連携には、まったく関係の無い
別の所にある問題なので、RSSフィードを出す方法はわかった。
と言うことで、解説を書きまーす。
なお、今回は
「Javaウェブフレームワーク「Wicket」の使い方 RSS Readerを作る その2 - フィードの取得と表示」
を参考にした。
必要なライブラリを集める
前回のエントリで書いたROME、JDOMに加え、4つのライブラリを手に入れる。
RomeFetcherはフィードを読み込んでROMEで使える形にしてくれる、
俺が最も求めていたと言っても過言ではないROMEの拡張。
HttpClientはRomeFetcherが使用するライブラリで、残り2つはHttpClientが使うライブラリ。
解説ページには最後のCommons Loggingが書いてないので、参考にする場合注意して。
解説を真似ながらフィードを集める
解説にあるFeedManagerが便利そうなので、基本的には真似ていく。
が、俺の求める機能とマッチしてるわけではないので、その部分は改変。
解説のFeedManagerは各サイトのフィードが入ったSetが
沢山入ったSetが作られるが、俺が欲しいのは各サイトのフィードを纏めた
1個のフィードなので、コンストラクタとgetFeed辺りにオリジナル入ってる。
例えば、フィードを突っ込むためにSortedSetを作り、SyndEntryの
getPublishedDate()で、新しいフィードの方が前に来るようにしている。
new TreeSet<SyndEntry>(new Comparator<SyndEntry>(){
@Override
public int compare(SyndEntry o1, SyndEntry o2) {
return o2.getPublishedDate().compareTo(o1.getPublishedDate());
}
}
)
);
で、後はとってきたフィードを全部ここに放り込んで、放り込み終わったら
SyndFeedに突っ込んでいる。
ただ、突っ込む際のコードが冗長な気がする。ここまでする必要あるのかな?
feeds.setEntries(new LinkedList<SyndFeed>(
(Collection<? extends SyndFeed>) this.entrySet)
);
このFeedManagerでフィードが取れるので、
あとは前回と同じ要領でRSSとして書き出す感じ。
web.xmlを設定する
前のエントリで書いたとおり、WebApplicationクラスから直接呼ばれたWebPageでないと、
SyndFeedOutputを使うことが出来ない。
と言うことで、web.xmlを変更して、フィードのためのURLを用意してやることにした。
<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>
と言うことで
これでフィードが出来たので、後は文字コードだな。



