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

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

  1. this.entrySet = Collections.synchronizedSortedSet(
  2.         new TreeSet<SyndEntry>(new Comparator<SyndEntry>(){
  3.             @Override
  4.             public int compare(SyndEntry o1, SyndEntry o2) {
  5.                 return o2.getPublishedDate().compareTo(o1.getPublishedDate());
  6.             }
  7.         }
  8.     )
  9. );

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

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

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

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

web.xmlを設定する

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

  1. <filter>
  2.     <filter-name>wicket.TarotarorgFeed</filter-name>
  3.      <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
  4.     <init-param>
  5.         <param-name>applicationClassName</param-name>
  6.         <param-value>org.tarotaro.java.wicket.feed.TarotarorgFeedApplication</param-value>
  7.      </init-param>
  8.  </filter>
  9.  
  10. <filter-mapping>
  11.     <filter-name>wicket.TarotarorgFeed</filter-name>
  12.     <url-pattern>/tfeed/*</url-pattern>
  13. </filter-mapping>

と言うことで

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

タイトルとURLをコピーしました