モジュール 3 タスク 1: Web サービスによるメディアの取得


JavaFX メディアブラウザアプリケーションを起動する NetBeans プロジェクトをダウンロードする

はじめに

このタスクでは、Web サービス API で Yahoo! 検索サービスを使用してメディアを検索します。

プロジェクトの実行

  1. モジュール 3 タスク 1 NetBeans プロジェクトをダウンロードします。

  2. プロジェクトを実行します。

機能は、これまでのタスクと同様です。唯一の違いは、インターネット検索によってデータが取得されるということです。図 1 に、結果を示します。

アプリケーション検索クエリーは、「Sun Microsystems」と事前に設定済みで、最大で 50 のオブジェクトが見つかります。ここからのプロジェクトでは、検索テキストボックスを作成して、ユーザーが検索クエリーを入力できるようにします。

デフォルトの検索コントロールとスクロールコントロールが用意された壁 図 1

アーキテクチャー

このチュートリアルではまず、検索結果からメタデータをまとめます。これには、図 2 に示すように、YahooAPI.fx および WebSearch.fx の 2 つの新しいクラスが必要です。

  • 新しい YahooAPI.fx クラスは、Yahoo! API とのインターフェイスとなるように作成された「カスタム」のクラスです。通常、このようなカスタムクラスは、使用する Web サービス API に対して作成されます。

  • WebSearch.fx は、javafx.io.http.HttpRequest を使用して HTTP GET 要求を Web サービス API に送信し、javafx.data.pull を使用してその応答を解析します。WebSearch は、javafx.data.pulljavafx.io.http.HttpRequest 間のやり取りを処理します。

モジュール 3 タスク 1 のアーキテクチャー 図 2

Yahoo! Web サービスの使用

このアプリケーションでは、Yahoo! サービスを使用して、Web を検索します。これを実行するには、Representational State Transfer (REST) クエリーを構築します。Yahoo API のクエリー形式については、http://developer.yahoo.com/search/image/V1/imageSearch.html を参照してください。

この作業に必要な処理の概要については、図 2 を参照してください。

javafx.data.pull および javafx.io.http の API について詳しく知ると、このタスクの理解に役立ちます。API の使用方法の優れた例については、API documentation を参照してください。

WebSearch では、GET 要求を処理するための入力ストリームが作成されます。HttpRequestonInput 変数は、PullParserparse() 関数を呼び出すために実装されています。PullParseronEvent 関数は、YahooAPI の具象クラスに実装されている WebSearch API の抽象化関数 onPullEvent() を呼び出すために実装されています。YahooAPI での onPullEvent の実装では、PullParser からのイベントが処理されるため、新しい MetaData オブジェクトが作成され、WebSearch 結果変数に挿入されます。Wall では、metaData 変数が WebSearch.results にバインドされます。次のセクションでは、この手順をより詳細に説明します。

MetaData.fx の更新

このタスクでは、MetaData シーケンスを Yahoo の検索結果にバインドします。このデータモデルには、このアプリケーションで役に立つ応答フィールドが含まれています。公開クラス Thumb および MetaData によって、URL への応答が形成されます。Thumb には、サムネイル画像に対応する Web 検索結果のデータがカプセル化されます。たとえば、サムネイルの URL などが含まれます。MetaData には、アプリケーションの処理対象となる Web 検索結果の要素がカプセル化されます。たとえば、メディアの URL や Thumb のデータなどが含まれます。今回のアプリケーションでは、この情報をすべては使用しませんが、有用な情報です。

HttpRequest による入力ストリームの取得

WebSearch では、検索の結果を取得する GET 要求が処理されます。要求の送信には、HttpRequest のローカルインスタンスが使用されます。要求への応答が返ってくると、HttpRequest は、onInput 関数が定義されている場合、その関数を呼び出します。WebSearch.fx 内の HttpRequest のインスタンスには、onInput() 関数が定義されていて、入力ストリームを解析する PullParser の解析メソッドが呼び出されます。

HttpRequest は、入力ストリームへの応答の準備ができたら onInput を呼び出します。onInput 用の関数を用意することで、入力ストリームを解析するようにパーサーに指示することができます。

PullParser による入力ストリームの解析の際、要素の開始または終了が検出されると、パーサーは PullParser インスタンスの onEvent 関数を呼び出します。WebSearch では、onEvent 変数が抽象化 WebSearch 関数 onPullEvent() にバインドされます。メソッドが抽象化されているため、WebSearch から拡張されるクラスで実装する必要があります。この場合、クラスは YahooAPI です。

ソースコード
def pullParser = PullParser {

        documentType: PullParser.XML;

        // Forward events to the YahooAPI onPullEvent function
        onEvent: onPullEvent
    }

HttpRequest には、location 変数があり、検索 API の URL が含まれます。これは、WebSearch では、searchLocation 変数にバインドされます。YahooAPI の searchLocation をオーバーライドすると、HttpRequest の場所を効果的に設定できます。

ソースコード
    /** Refer to the javadoc for javafx.io.HttpRequest */
    def httpRequest : HttpRequest = HttpRequest {

        method: HttpRequest.GET

        location: bind searchLocation

        onResponseMessage: function(msg:String) {
            if ( httpRequest.responseCode != 200 ) {
                println("HTTP response {httpRequest.responseCode}: {msg}");
            }
        }

場所以外に、検索クエリーも必要です。WebSearch では、この目的のために searchQuery 変数が宣言されています。YahooAPI では、searchQuery がオーバーライドされることに注意してください。YahooAPI では、searchQuery が変更されると、searchLocation が更新されます。したがって、search() 関数が実行されると、HttpRequestlocation 変数には、クエリーの正確な URL が指定されます。

ソースコード
onInput: function(is: InputStream) {
            try {
                pullParser.input = is;
                pullParser.parse();
            } finally {
                is.close();
            }
        }

上記のコードでは、pullParser.input を、この関数から返される入力ストリームに設定して、pullParser.parse を呼び出しています。pullParser の解析メソッドによりパーサーが実行され、イベントが検出されると、onEvent が呼び出されます。

Yahoo Image Search 用 REST クエリーの構築

YahooAPI.fx では WebSearch.fx が拡張され、REpresentational State Transfer (REST) クエリーが作成されます。

searchLocation 変数と searchQuery 変数の両方が、WebSearch 基底クラスの定義をオーバーライドします。基底クラスの変数を再定義することはできません。変数をオーバーライドする必要があります。変数は、すべての API で使用される、よく知られた属性であることが必要です。そのため、ここでは searchQuery を使用します。searchQuery の「on replace」トリガーでは、すべての空白文字が「+」文字に置き換えられます (この文字以降を含めるという意味があります)。

ソースコード
    override var searchQuery on replace {
        yahooSearchQuery = searchQuery.trim().replaceAll(" ","+");
    }

onPullEvent は、オーバーライド対象である WebSearch.fx の抽象化関数です。基底クラス変数は再定義できないため、再度これらの変数をオーバーライドする必要があります。onPullEvent() は、PullParser.START_ELEMENTPullParser.END_ELEMENT を参照して、開始時は processStart() を、終了時は processEnd() を呼び出します。

ソースコード
override function onPullEvent(event : Event) : Void {
        if (event.type == PullParser.START_ELEMENT) {
            processStart(event)
        } else if (event.type == PullParser.END_ELEMENT) {
            processEnd(event)
        }
    }

XML 要素は入れ子にできるため、javafx.data.pull.Event レベルは重要です。たとえば、XML ルート要素はレベル 0 になります。Result は、レベルが 1 の最上位レベルイベントです。Thumbnail は、Result 要素の入れ子になっているため、イベントレベルは 2 です。

processEnd() は、PullParser.END_ELEMENT が検出されると呼び出されます。タグが Result の場合、完全な形のメタデータが得られます。結果は results シーケンスに格納することができ、その結果が壁に転送されます。

ソースコード
if ("Result".equals(event.qname.name) and event.level == 1) {
            insert result into results;

検索の呼び出しと MetaData の取得

ここでは、検索データを表示できるようにする方法について説明します。

Wall.fx では、metaData は単に WebSearch の結果にバインドされます (metaData がアクセス可能なパッケージである必要はなくなったため、package キーワードは不要です)。

ソースコード
var metaData : MetaData[] = bind webSearch.results;

Main では、webSearch が YahooAPI のインスタンスにバインドされています。また、Main では次のように WebSearch オブジェクトも作成されています。

ソースコード
def yahoo : WebSearch = YahooAPI {
    searchQuery: "Sun Microsystems"
}

事実上、webSearch は Yahoo のインスタンスとなります。

その後 Main では、デフォルトの検索に Yahoo のインスタンスが使用されます。

ソースコード
yahoo.search();

WebSearch.fx には検索機能が含まれますが、これは単に httpRequest をキューに入れるだけです。

ソースコード
    package function search() {
            httpRequest.enqueue();
    }

YahooApi では、processEnd() によって WebSearch の results シーケンスにメタデータが挿入され、これが Wall の metaData にバインドされます。Wall では、thumbnails シーケンスも metaData にバインドされますが、このとき MetaData が挿入されると新しい Thumbnail のインスタンスが作成されます。このように WebSearch からの MetaData は、最終的に Wall の Thumbnail となります。

ソースコード
insert result into results

メタデータは Web 検索の結果から作成され、壁へ読み込むことができます。

試してみましょう

  • 標準の Sun Microsystems の検索では、すべての JPEG を表示します。ほかの形式を表示するには、YahooAPI で yahooSearchQuery を PNG やその他のサポート対象の形式に設定します。

  • プルパーサーの機能について理解するには、YahooAPI の onPullEvent コードでイベントを出力し、さらに YahooAPI の results シーケンスに MetaData が挿入される前の MetaData も出力してください。

    • onPullEvent の if/else-if ステートメントの後に、次のコードを挿入します。
      javafx.lang.FX.println("pullParser event: {event}");

    • 「insert result into results」の前に、次の行を入力します。
      println("insert {result}");

 

English
日本語
한국어
简体中文
Português do Brasil
русский