Google App Engine/JavaでjunaioのChannelを作ってみる

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

さて、以前junaioのChannelを自分のサーバで開設する方法について書いたが、
やはりこのクラウド全盛期に「自分のサーバで」と言うのは流行らない。
と言う事で、Google App Engine/Java上にjunaioと通信するアプリを作り、
Channelを開設してみる事にしよう。

GAE/Jと連携できれば、Googleの多彩な機能を使って色々と遊べるだろう。
Google Mapsと連携したりも出来るかもしれない。これはかなり凄いぞ。
というか、junaioの公式ももしかしてGoogle App Engine使ってるんじゃない?って気もする。
このページとか特に。

なお、Javaを使っているのは俺が「Pythonなにそれおいしいの」状態だからであって、
別に同様の原理でPythonでも動くと思う。誰か移植してくれ。
多分、知識のある人なら1時間で出来る。

下準備

とりあえず、まずはやるべき事を色々と整理しておこう。

junaioでは、認証のためにAuthorizationヘッダを使うので、
ServletではなくFilterを定義して認証を行う。
で、Filterを通った後にServletを動かして、POIを示すXMLを返すと言う方式になる。
今回の例では、Servletの方は単にXML文字列を返すだけの簡単なものにしてみる。
簡単なのでソースも載せない。自分で作れ!作れないなら勉強しろ!!

さらにjunaioでは、POI用のXMLの外にも、モデル関連のファイルやGlue用のtracking xmlを
取得するわけだが、こいつらにはAuthorizationヘッダが付かない。
つまり、POI用のXMLは認証有り、その他のリソースは認証無しで取得できる必要がある。

また、基本的にモデルやtracking xmlは静的ファイルとして定義すればよいので、
GAE/Jのリファレンスページを参考に設定を弄って、静的ファイルとして定義してやる。

以降の説明で、これらを実現していく。

AR三兄弟の企画書

著者/訳者:川田十夢

出版社:日経BP社( 2010-08-26 )

定価:

Amazon価格:¥ 1,512

単行本 ( 220 ページ )

ISBN-10 : 4822248240

ISBN-13 : 9784822248246



すっきりわかるGoogle App Engine for Javaクラウドプログラミング

著者/訳者:中田 秀基

出版社:ソフトバンククリエイティブ( 2010-07-02 )

定価:

Amazon価格:¥ 7,746

単行本 ( 480 ページ )

ISBN-10 : 4797357606

ISBN-13 : 9784797357608



認証Filter

まずは、認証用のFilterを書こう。何というか、ここが肝だ。

コードは長いので最後に載せるが、php版のjunaio.class.phpをそのままJavaに移植しただけだ。
APIキーとか、日時のズレの設定など、従来config.phpにあった設定は
web.xmlのFilter定義部分にinit-paramとして設定するようにしてあり、
以下のようにinitで値をとってくる処理を入れてある。

  1. @Override
  2.     public void init(FilterConfig arg0) throws ServletException {
  3.         JUNAIO_KEY = arg0.getInitParameter("JUNAIO_KEY");
  4.         try {
  5.             AUTH_DATE_TOLERANCE = Long.parseLong(arg0.getInitParameter("AUTH_DATE_TOLERANCE"));
  6.         }catch(Exception e) {
  7.             log.warning(e.getMessage());
  8.             AUTH_DATE_TOLERANCE = DEFAULT_AUTH_DATE_TOLERANCE;
  9.         }
  10.     }

で、メイン処理であるdoFilter()で、認証処理を行っている。
今回は戻り値用のenum型を定義したが、これは失敗ログを出しやすいようにしただけで、
別にbooleanでも良かったとは思っている。

苦戦したのはSHA-1ハッシュを作る部分で、どうやっても一致しなかった。
PHP版ではこうなっている部分だ。

  1. $sServerRequestSignature = sha1(
  2.             JUNAIO_KEY . sha1(
  3.                 JUNAIO_KEY .
  4.                 $_SERVER['REQUEST_METHOD'] . "\n" .
  5.                 $_SERVER['REQUEST_URI'] . "\n" .
  6.                 'Date: ' . $sDate . "\n"
  7.             )
  8.         );

この、$_SERVER['REQUEST_URI']なんだが、PHPではクエリ文字列も入るんだね。
一方Javaだとクエリ文字列とURIは別の文字列でとる必要がある。それに気付かず、かなり悩んだ。

一応こんな風にURIを取ったら動いた。

  1. String queryString = req.getQueryString();
  2.             String uri = req.getRequestURI();
  3.             if (queryString != null && !queryString.equals("")) {
  4.                 uri +=  "?" + queryString;
  5.             }

後は、PHPではSHA-1ハッシュの結果が文字列で出てくるのに対してJavaだとbyte[]だから、
コード書くのは面倒だった。一々文字列化してね。参ったぜ。
でも一応出来た。

コンテキストルートの設定

前述の通り、junaioではPOI用のXMLは認証有り、モデルなどのリソースは認証無しだ。
と言う事で、認証を通るパスと通らないパスを分ける必要がある。
と言う事で、コンテキストルートとして「jsample」と言うのを設定し、
そこを通ったら認証を行うようにする。で、認証後にServletを通り、POI用のXMLを返す。

と言う事で、web.xmlに以下のような設定を行う。

  1. <filter>
  2.         <filter-name>junaio-auth</filter-name>
  3.         <filter-class>org.tarotaro.java.junaio.filter.JunaioAuthFilter</filter-class>
  4.         ・・・
  5.     </filter>
  6.     <filter-mapping>
  7.         <filter-name>junaio-auth</filter-name>
  8.         <url-pattern>/jsample/*</url-pattern>
  9.     </filter-mapping>
  10.     <servlet>
  11.         <servlet-name>junaio</servlet-name>
  12.         <servlet-class>org.tarotaro.java.junaio.JunaioServlet</servlet-class>
  13.     </servlet>
  14.     <servlet-mapping>
  15.         <servlet-name>junaio</servlet-name>
  16.         <url-pattern>/jsample/*</url-pattern>
  17.     </servlet-mapping>

で、junaioにChannelを登録する時は、このjsample以下を
登録する。例えばアプリ名を「gaejunaio」にしたとすると、
http://gaejunaio.appspot.com/jsample
にしておけば、junaioが上手くアクセスしてくれる。

リソースの設定

次は、モデルデータとtracking XMLを配置する。
GAE/Jでは静的ファイルを別のサーバに置くかなんかしてくれて、
効率的にアクセスできるらしい。と言う事で設定を入れてみる。

まず、静的ファイルを「resources」というフォルダに入れる。

設定方法だが、基本的にはGAE/Jの解説ページを見て。
今回はこのような設定を入れてみる。

  1. <static-files>
  2.         <include path="/resources/*" />
  3.         <include path="/resources/model/*" />
  4.     </static-files>

まとめ

と言う事で、GAE/JでもjunaioにChannelを開設出来る事がわかった。
これで、色々とマッシュアップして面白いサービスが出来そうな気がしてきたら、
是非試してほしい。

とりあえず、これらのソースを何処かに公開しようと思うが、
何処に置いておこうか迷う。
いつも使ってるSpark Projectにしようか?でもFlashとは関係ないからなー。
GitHubとかいう所にしようか?でもgitの使い方覚えるのが面倒だな。

まぁ、適当に考えよう。

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

フォローする

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