前回のエントリで脆くも砕け散ってしまったお勉強テーマである、
俺が所有する、現在アクティブな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()
で、新しいフィードの方が前に来るようにしている。
- 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>
と言うことで
これでフィードが出来たので、後は文字コードだな。