さて、以前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のリファレンスページを参考に設定を弄って、静的ファイルとして定義してやる。
以降の説明で、これらを実現していく。
著者/訳者:川田十夢
出版社:日経BP社( 2010-08-26 )
定価:
単行本 ( 220 ページ )
ISBN-10 : 4822248240
ISBN-13 : 9784822248246
すっきりわかるGoogle App Engine for Javaクラウドプログラミング
著者/訳者:中田 秀基
出版社:ソフトバンククリエイティブ( 2010-07-02 )
定価:
Amazon価格:¥ 3,456
単行本 ( 480 ページ )
ISBN-10 : 4797357606
ISBN-13 : 9784797357608
認証Filter
まずは、認証用のFilterを書こう。何というか、ここが肝だ。
コードは長いので最後に載せるが、php版のjunaio.class.phpをそのままJavaに移植しただけだ。
APIキーとか、日時のズレの設定など、従来config.phpにあった設定は
web.xmlのFilter定義部分にinit-paramとして設定するようにしてあり、
以下のようにinit
で値をとってくる処理を入れてある。
- @Override
- public void init(FilterConfig arg0) throws ServletException {
- JUNAIO_KEY = arg0.getInitParameter("JUNAIO_KEY");
- try {
- AUTH_DATE_TOLERANCE = Long.parseLong(arg0.getInitParameter("AUTH_DATE_TOLERANCE"));
- }catch(Exception e) {
- log.warning(e.getMessage());
- AUTH_DATE_TOLERANCE = DEFAULT_AUTH_DATE_TOLERANCE;
- }
- }
で、メイン処理であるdoFilter()
で、認証処理を行っている。
今回は戻り値用のenum型を定義したが、これは失敗ログを出しやすいようにしただけで、
別にbooleanでも良かったとは思っている。
苦戦したのはSHA-1ハッシュを作る部分で、どうやっても一致しなかった。
PHP版ではこうなっている部分だ。
- $sServerRequestSignature = sha1(
- JUNAIO_KEY . sha1(
- JUNAIO_KEY .
- $_SERVER['REQUEST_METHOD'] . "\n" .
- $_SERVER['REQUEST_URI'] . "\n" .
- 'Date: ' . $sDate . "\n"
- )
- );
この、$_SERVER['REQUEST_URI']
なんだが、PHPではクエリ文字列も入るんだね。
一方Javaだとクエリ文字列とURIは別の文字列でとる必要がある。それに気付かず、かなり悩んだ。
一応こんな風にURIを取ったら動いた。
- String queryString = req.getQueryString();
- String uri = req.getRequestURI();
- if (queryString != null && !queryString.equals("")) {
- uri += "?" + queryString;
- }
後は、PHPではSHA-1ハッシュの結果が文字列で出てくるのに対してJavaだとbyte[]だから、
コード書くのは面倒だった。一々文字列化してね。参ったぜ。
でも一応出来た。
コンテキストルートの設定
前述の通り、junaioではPOI用のXMLは認証有り、モデルなどのリソースは認証無しだ。
と言う事で、認証を通るパスと通らないパスを分ける必要がある。
と言う事で、コンテキストルートとして「jsample」と言うのを設定し、
そこを通ったら認証を行うようにする。で、認証後にServletを通り、POI用のXMLを返す。
と言う事で、web.xmlに以下のような設定を行う。
- <filter>
- <filter-name>junaio-auth</filter-name>
- <filter-class>org.tarotaro.java.junaio.filter.JunaioAuthFilter</filter-class>
- ・・・
- </filter>
- <filter-mapping>
- <filter-name>junaio-auth</filter-name>
- <url-pattern>/jsample/*</url-pattern>
- </filter-mapping>
- <servlet>
- <servlet-name>junaio</servlet-name>
- <servlet-class>org.tarotaro.java.junaio.JunaioServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>junaio</servlet-name>
- <url-pattern>/jsample/*</url-pattern>
- </servlet-mapping>
で、junaioにChannelを登録する時は、このjsample以下を
登録する。例えばアプリ名を「gaejunaio」にしたとすると、
「http://gaejunaio.appspot.com/jsample」
にしておけば、junaioが上手くアクセスしてくれる。
リソースの設定
次は、モデルデータとtracking XMLを配置する。
GAE/Jでは静的ファイルを別のサーバに置くかなんかしてくれて、
効率的にアクセスできるらしい。と言う事で設定を入れてみる。
まず、静的ファイルを「resources」というフォルダに入れる。
設定方法だが、基本的にはGAE/Jの解説ページを見て。
今回はこのような設定を入れてみる。
- <static-files>
- <include path="/resources/*" />
- <include path="/resources/model/*" />
- </static-files>
まとめ
と言う事で、GAE/JでもjunaioにChannelを開設出来る事がわかった。
これで、色々とマッシュアップして面白いサービスが出来そうな気がしてきたら、
是非試してほしい。
とりあえず、これらのソースを何処かに公開しようと思うが、
何処に置いておこうか迷う。
いつも使ってるSpark Projectにしようか?でもFlashとは関係ないからなー。
GitHubとかいう所にしようか?でもgitの使い方覚えるのが面倒だな。
まぁ、適当に考えよう。
最新コメント