ブロガーの実験室スポンサー広告
> BlackBerry のアプリケーション配布のための MIME 設定 on GAE/J> ブロガーの実験室DreamNews
> BlackBerry のアプリケーション配布のための MIME 設定 on GAE/J
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


--.--.--|スポンサー広告||TOP↑
http://blog.nvw-on.com/2010/03/blackberry-mime-on-gaej.html

BlackBerry のアプリケーション配布のための MIME 設定 on GAE/J

 私には、Google App Engine (GAE)のことを知った際、単に Java のアプリケーションサーバーがただで利用できるのか!という部分だけに驚き登録したので、明確な使用用途が無かった。
 Bloggerにしても、Apps のサイトにしても、普通のファイルをアップロードして配布することに関してはあまり困らないと思いますが、BlackBerryのアプリを置いてみよう か?と考えた際、ブラウザからアクセスしてインストールできないのでは?と考えました。そこで、GAEを BlackBerry のアプリの置き場として利用してみます。

 社内でDominoを使って配布した際にすこしはまったのですが、理由は簡単。BBのアプリを Over The Air (OTA)でインストールする際に使用される(ブラウザからアクセスされる)ファイルは以下の通りです。


.jad -> 定義ファイル。バージョンとかベンダーなどのメタ情報。
.cod -> アプリケーションファイル。Java ですが、BlackBerry の独自フォーマット。

 BlackBerry Browser から、jad を開くことで jad に記載の cod ファイルをダウンロードしてアプリケーションをインストールすることになりますが、Webサーバーがレスポンスヘッダーに適切な MIME Type を返してくれないと、BlackBerry Browser はサポートされていないファイルだと認識してしまい、インストールできないことになります。

* 必要なMIMEタイプ
.jad -> text/vnd.sun.j2me.app-descriptor
.cod -> application/vnd.rim.cod

 GAE のプロジェクトの中では、 war に適当なフォルダを作成し、そこに HTML や CSS などの静的なファイルを格納すれば利用できますが、MIME Type を操作するには、リソースとして対象のファイルを格納し、制御する必要があるとヘルプにあります。

http://code.google.com/intl/ja/appengine/docs/java/config/appconfig.html

静的ファイルは、ファイルの拡張子に基づいて選択された MIME タイプで提供されます。ファイルをカスタム MIME タイプで提供するには、ファイルを静的ファイルではなくリソース ファイルにし、カスタム MIME タイプでデータを提供するサーブレットを作成します。
  何のことやら?と思いましたが、こんな形で対処しました。

1. appengine-web.xml
 以下のようにリソースファイルとして *.jad および *.cod を登録。
   <resource-files>
      <include path="/**.cod">
      <include path="/**.jad">
   </resource-files>

2. web.xml
 以下のように *.jad および *.cod へのリクエストを特定のサーブレットにマッピング。
    <servlet>
        <servlet-name>(サーブレット名)</servlet-name>
        <servlet-class>(パッケージ+クラス)</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>(サーブレット名)</servlet-name>
        <url-pattern>*.jad</url-pattern>
        <url-pattern>*.cod</url-pattern>
    </servlet-mapping>

3. サーブレット作成
 2で登録したサーブレットを作成し、doGet に以下のようなコードを書く。

        // target file
        String targetpath = req.getRequestURI();
       
        // resource file
        InputStream is = null;
       
        try{
            is = this.getServletContext().getResourceAsStream(targetpath);

            // check: is file avalable?
            if (is == null) {
                // not exist
                resp.setContentType("text/plain");
                resp.getWriter().println("File not found...");
            } else {
                // file exist
                int filesize = is.available();

                // set response header
                setResponseHeader(resp, targetpath, filesize);

                // output
                OutputStream out = resp.getOutputStream();
                byte[] byteBuf = new byte[8192];
                for (;;) {
                    int iRead = is.read(byteBuf, 0, byteBuf.length);
                    if (iRead < 0) {
                        break;
                    }
                    out.write(byteBuf, 0, iRead);
                }
            }
        } finally{
            if(is != null){
                is.close();
            }
        }

 呼び出している setResponseHeaderも追加。PDFやExcelはおまけ。コピーしてきたコードがこんな状態だったので、そのまま残してあるだけ。
   private void setResponseHeader(final HttpServletResponse response,
            String filename, final int fileLength) {
        if (filename.endsWith(".pdf")) {
            // PDF
            response.setContentType("application/pdf");
        } else if (filename.endsWith(".xls")) {
            // Excel
            response.setContentType("application/vnd.ms-excel");
        } else if (filename.endsWith(".xml")) {
            // XML
            response.setContentType("text/xml");
        } else if (filename.endsWith(".jad")) {
            // JAD
            response.setContentType("text/vnd.sun.j2me.app-descriptor");
        } else if (filename.endsWith(".cod")) {
            // COD
            response.setContentType("application/vnd.rim.cod");
        } else {
            // other is binary
            response.setContentType("application/octet-stream");
        }

        if (fileLength > 0) {
            // Length
            response.setContentLength(fileLength);
        }

        // Disable cache
        response.addHeader("Cache-Control", "no-cache");
        response.addHeader("Pragma", "no-cache");
        response.addHeader("Expires", "0");
    }

  あとは、 適当なフォルダに .jad や .cod を置き、リンクなどを張ってブラウザからアクセスさせれば、BlackBerry Browserもちゃんと認識でき、アプリのインストールが可能。

 また、社内で利用しているDominoにも同様のMIMEタイプの追加をしてあるが、こちらはプログラムなしに、Domino Directory上に拡張子とMIMEタイプなどの情報を登録するだけなので楽チンです。


2010.06.29|DreamNewsコメント(0)TOP↑
名前:
コメントタイトル:
メールアドレス:
URL:
コメント:

パスワード:
管理人だけに表示:
管理者にだけ表示を許可
カテゴリー
最近の記事
最近のコメント
最近のトラックバック
ブログ検索
管理人のブログ一覧
管理人へメール

名前:
メール:
件名:
本文:

月別アーカイブ
プロフィール

やまもも実験室

Author:やまもも実験室
FC2ブログへようこそ!

RSSフィード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。