2010年1月10日日曜日

RomeのFeedBurner用モジュールを作ってみた

スズキです。

トップページのニュース一覧に"はてブ数"を表示しようとしたら、
http://blog.suz-lab.com/2010/01/blog-post.html
意外と大掛かりで、RomeのFeedBurner用モジュールまで作ってしまいました。

トップページのニュース一覧はFeedBurnerのフィードを
Romeで読み込んで作っているのですが、FeedBurnerのフィードは
各記事のリンク先URLが、ブログ本体のものではなく、
http://feedproxy.google.com/~r/suz-lab-blog/~3/Ioq7XAQ4OMQ/blog-post.html
といったFeedBurnerのものになってしまっています。

当然、"はてブ数"を表示するには、ブログ本体のリンク先URLが必要になるのですが
それは、フィード中に以下のような形で記載されていました。
<feedburner:origLink>http://blog.suz-lab.com/2010/01/blog-post.html</feedburner:origLink>

当然、素のRomeでは上記の値を取得することはできないのですが、
FeedBurner用のモジュールを作成することで、取得できるようになります。

まず、モジュールクラスの作成です。ネームスペースのURIを定義して、
また、"origLink"をset/getできるようにしておきます。

--------【FeedBurnerModule.java】--------
...
@SuppressWarnings("serial")
public class FeedBurnerModule extends ModuleImpl {

  public static final String URI = "http://rssnamespace.org/feedburner/ext/1.0";
  private String origLink;

  public FeedBurnerModule() {
    super(FeedBurnerModule.class, URI);
  }

  @Override
  public void copyFrom(Object object) {
    FeedBurnerModule module = (FeedBurnerModule)object;
    this.origLink = module.getOrigLink();
  }

  @Override
  public Class<?> getInterface() {
    return FeedBurnerModule.class;
  }

  ...
}
--------
http://code.google.com/p/suz-lab-gae/source/browse/trunk/suz-lab-gae/src/suz/lab/gae/rome/FeedBurnerModule.java?r=112

次に、パーサークラスの作成です。parseメソッドで、実際にフェード中の"origLink"の内容を、
上記のモジュールクラスにセットしています。

--------【FeedBurnerParser.java】--------
...
public class FeedBurnerParser implements ModuleParser {

  private static final Namespace NS
    = Namespace.getNamespace("feedburner", FeedBurnerModule.URI);

  @Override
  public String getNamespaceUri() {
    return FeedBurnerModule.URI;
  }

  @Override
  public Module parse(Element element) {
    FeedBurnerModule module = new FeedBurnerModule();
    Element origLink = element.getChild("origLink", NS);
    module.setOrigLink(origLink.getText());
    return module;
  }

}
--------
http://code.google.com/p/suz-lab-gae/source/browse/trunk/suz-lab-gae/src/suz/lab/gae/rome/FeedBurnerParser.java?r=112

最後に、プロパティファイルです。Atom(1.0)を読み込むときに、
FeedBurnerモジュールのパースもするように指定しておきます。

--------【rome.properties】--------
atom_1.0.feed.ModuleParser.classes=suz.lab.gae.rome.FeedBurnerParser
atom_1.0.item.ModuleParser.classes=suz.lab.gae.rome.FeedBurnerParser
--------
http://code.google.com/p/suz-lab-gae/source/browse/trunk/suz-lab-gae/src/rome.properties?r=112

すると、下記のような感じで、モジュールを取得することができ、
モジュール内の情報を利用することができます。

--------【index.html】--------
...
#foreach($entry in $results.entries)
<dt>$date.format("yyyy/MM/dd", $entry.publishedDate)</dt>
<dd>
  <a href="$entry.link">$entry.title</a>
  #set($module = $entry.getModule("http://rssnamespace.org/feedburner/ext/1.0"))
  <a href="http://b.hatena.ne.jp/entry/$module.origLink" target="_blank">
    <img src="http://b.hatena.ne.jp/entry/image/$module.origLink" border="0"/>
  </a>
</dd>
#end
...
--------
http://code.google.com/p/suz-lab-gae/source/browse/trunk/suz-lab-apps/war/WEB-INF/vm/page/other/index.html?r=111

Romeモジュール、使えるね。

0 コメント: