Stax+Wicketで自サイトのRSSを一纏めにしようとしたが、全然そうならなかった。

  • このエントリーをはてなブックマークに追加
  • 0

とりあえず、Staxで何をしようかと逡巡していたのだが、
探してたらWicketでRSSを出すと言う試みがあったので、
俺もそれを真似てみようかと思った。
目標は、俺の持ってる各サイトのフィードの統合。

と言うことで、今回はこのサイトと、

WicketでRSSフィードを発行するといえばROMEです。

今回は単純に、

http://example.org/feed

にアクセスされたときにフィードを返すようなPageを実装します。
WicketでRSSフィードを発行する ? murakumo

後このサイトを頼りに、RSSフィードを作ってみる。

Merry Christmas and a Happy New Year to all you folks out there. Here’s a belated Christmas gift for all you Wicket developers out there.

I’ve been adding RSS feeds to my Wicket application based on the example Wicket RssPage found on the wiki, and thought it was very restrictive in what it could do. There are a ton of Java libraries out there to build rss feeds, and this RssPage was yet another solution.
code_poet : Wicket FeedPage

で、結論から言うと結構大変だった上に予想と違うものが出来た。
でも勢いで公開だー!

このページの「最初のRSS」の方ね。
http://feedsample.tarotarorg.staxapps.net/

Staxの準備

今回はfeedsampleって名前にする。
StaxのWeb画面から、Wicketのアプリを作成。
左上のCreate Appをクリックして、Wicketを選択してアプリを作ればよし。
で、Staxのコマンドラインから、適当な場所にアプリをDLする。

  1. #stax getapp -a tarotarorg/feedsample -u tarotarorg -p [password]

これをEclipseで読み込める。
読み込んでみると、なぜかビルドパスのライブラリが
wicketの1.3.4のjarファイルをさしている。
しかし付属のjarファイルは1.4rc1なので、ビルド・パスを編集して直す。
これで問題なく開発できるようになった。

ライブラリ集め

必要なライブラリを集める。
今回は2つ。

ROMEってのがRSSフィードを作るためのライブラリで、JDOMはROMEが
依存してるライブラリ。
まず、両方をダウンロードする。ROMEはjarをダウンロードできるが、
JDOMの方はzipをダウンロード、展開してbuild.batを実行、buildフォルダに
jdom.jarが出来ると言う仕組みになっている。

手に入れた2つのライブラリを、webapps/WEB-INF/lib以下にコピーする。

コードを書く

コードはこんな風になった。
ROMEとか言うアプリはいろいろと不親切で、
例えばSyndFeed#setFeedTypeに設定すべき文字列が定数として定義されてなかったり、
そもそも何を設定すべきかまったくわからない有様だったりで大変。
あと、見たサイトは2つとも抽象クラス作ってgetFeed
子クラスでの定義にしてたけど、クラスを2つ作った時どうするかが
わからないので1つにまとめてみた。

  1. package example;
  2.  
  3. import java.io.IOException;
  4. import java.io.PrintWriter;
  5. import java.util.ArrayList;
  6. import java.util.Date;
  7. import java.util.List;
  8.  
  9. import org.apache.wicket.PageParameters;
  10. import org.apache.wicket.Response;
  11. import org.apache.wicket.markup.MarkupStream;
  12. import org.apache.wicket.markup.html.WebPage;
  13.  
  14. import com.sun.syndication.feed.synd.SyndContent;
  15. import com.sun.syndication.feed.synd.SyndContentImpl;
  16. import com.sun.syndication.feed.synd.SyndEntry;
  17. import com.sun.syndication.feed.synd.SyndEntryImpl;
  18. import com.sun.syndication.feed.synd.SyndFeed;
  19. import com.sun.syndication.feed.synd.SyndFeedImpl;
  20. import com.sun.syndication.io.FeedException;
  21. import com.sun.syndication.io.SyndFeedOutput;
  22.  
  23. /**
  24.  * Homepage
  25.  */
  26. public class HomePage extends WebPage {
  27.  
  28.     private static final long serialVersionUID = 1L;
  29.  
  30.     private enum Feeds {
  31.         TAROTARORG_BLOG("http://blog.tarotaro.org/feed","tarotarorg blog","feed of http://blog.tarotaro.org"),
  32.         FLASH_TAROTARORG_BLOG("http://flash.tarotaro.org/blog/feed/","flash.tarotaro.org.blog","feeds of http://flash.tarotaro.org/blog/"),
  33.         TARO_NIKKI_79J("http://tarotaro.jugem.jp/?mode=rss","太郎日記’79J","feeds of http://tarotaro.jugem.jp/"),
  34.         HATENA_DIARY("http://d.hatena.ne.jp/tarotarorg/rss2","tarotarorgの「上流さんに、俺は、なる!」日記 ","feeds of http://d.hatena.ne.jp/tarotarorg/");
  35.        
  36.         private String uri;
  37.         private String title;
  38.         private String description;
  39.        
  40.         public String getUri() {
  41.             return uri;
  42.         }
  43.  
  44.         public String getTitle() {
  45.             return title;
  46.         }
  47.  
  48.         public String getDescription() {
  49.             return description;
  50.         }
  51.  
  52.         private Feeds(String uri, String title, String description) {
  53.             this.uri = uri;
  54.             this.title = title;
  55.             this.description = description;
  56.         }
  57.     }
  58.  
  59.     /**
  60.      * Constructor that is invoked when page is invoked without a session.
  61.      *
  62.      * @param parameters
  63.      *            Page parameters
  64.      */
  65.     public HomePage(final PageParameters parameters) {
  66.     }
  67.  
  68.     @Override
  69.     protected void onRender(MarkupStream markupStream) {
  70.         Response resp = this.getResponse();
  71.         resp.setContentType("application/xml; charset=UTF-8");
  72.         PrintWriter pw = new PrintWriter(resp.getOutputStream());
  73.         SyndFeedOutput sfo = new SyndFeedOutput();
  74.         try {
  75.             sfo.output(this.getFeed(), pw);
  76.         } catch (IOException e) {
  77.             throw new RuntimeException("Error Streaming Feed",e);
  78.         } catch (FeedException e) {
  79.             throw new RuntimeException("Error Streaming Feed",e);
  80.         }
  81.     }
  82.  
  83.     private SyndFeed getFeed() {
  84.         SyndFeed sf = new SyndFeedImpl();
  85.         sf.setFeedType("rss_2.0");
  86.         sf.setTitle("tarotarorg feeds");
  87.         sf.setLink("http://feedsample.tarotarorg.staxapps.net");
  88.         sf.setDescription("all feeds of tarotarog");
  89.  
  90.         List<SyndEntry> entries = new ArrayList<SyndEntry>();
  91.         Date now = new Date();
  92.         for(Feeds f:Feeds.values()) {
  93.             SyndEntry se = new SyndEntryImpl();
  94.             SyndContent sc = new SyndContentImpl();
  95.             se.setTitle(f.getTitle());
  96.             se.setPublishedDate(now);
  97.             se.setLink(f.getUri());
  98.             sc.setType("text/plain");
  99.             sc.setValue(f.getDescription());
  100.             se.setDescription(sc);
  101.             entries.add(se);
  102.            
  103.         }
  104.         sf.setEntries(entries);
  105.         return sf;
  106.     }
  107.  
  108.     @Override
  109.     public String getMarkupType() {
  110.         // TODO Auto-generated method stub
  111.         return "xml";
  112.     }
  113. }

結果的に・・・

俺としては、フィードを4つ登録すれば、それぞれのフィードから
記事をかき集めて、まとめてくれるんじゃないかなーとか期待してたんだが、
全然そんな事は無かった。
登録した4フィードがそのまま、1つの記事みたいになって、
合計4つの記事が出来ただけに終わった。

非常に悲しい。
しかも日本語部分が滅茶苦茶。泣けるぜ。

ところで、Staxって・・・

毎回アプリ1個1個作るのが面倒。
なんか、水色背景のページに、アプリがドンドン溜まっていく感じでいいんだけどね。

スポンサーリンク
スポンサーリンク
  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
スポンサーリンク