機能とイベントフローを定義する

このセクションでは、AdvancedExampleServlet2 を紹介します。AdvancedExampleServlet2 は、機能とイベントフローを定義するデータソース実装の例です。このセクションでは、AdvancedExampleServlet2 を実行してテストする方法についても説明します。

: このセクションを開始する前に、スタートガイドを完了する必要があります。

AdvancedExampleServlet2 のご紹介

AdvancedExampleServlet2 クラスは examples パッケージにあります。このクラスは、機能とイベントのフローを定義する実装例を提供します。

以下では、AdvancedExampleServlet2 の最も重要な部分について説明します。

イベントのフローを定義する

AdvancedExampleServlet2 は、HttpServlet.doGet() メソッドをオーバーライドし、DataSourceHelper が提供するさまざまなヘルパー関数を呼び出して、イベントのフローを定義します。

次のスニペットは、doGet() をオーバーライドします。HttpServletRequest パラメータは、ビジュアリゼーションによって行われたリクエストをサーブレットにカプセル化します。HttpServletResponse パラメータは、サーブレットからクエリの可視化へのレスポンスをカプセル化します。また、dsRequest を null に設定することもできます。dsRequest は、コードの残りの部分全体で使用されます。

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    DataSourceRequest dsRequest = null;

次のスニペットは、HttpServletRequest からリクエスト パラメータを抽出し、リクエストが実行されるコンテキストを作成します。

    try {
      // Extract the request parameters.
      dsRequest = new DataSourceRequest(req);

次のスニペットは、dsRequest オブジェクトからクエリを取得し、それを 2 つのクエリに分割しています。1 つのクエリはデータソース クエリと呼ばれ、もう 1 つは完了クエリと呼ばれます。データソースで宣言されている機能は SELECT であるため、dsRequest オブジェクトに SELECT オペレーションが含まれている場合、データソース クエリは SELECT オペレーションで構成されます。完了クエリは、リクエストに必要な他のすべてのオペレーションで構成されます。これには、SELECT オペレーションが含まれる場合もあります。たとえば、リクエストされたクエリが SELECT a ORDER BY b の場合、データソース クエリは SELECT a, b になり、完了クエリは元のクエリ SELECT a ORDER BY b と同じになります。

      // Split the query.
      QueryPair query = DataSourceHelper.splitQuery(dsRequest.getQuery(), Capabilities.SELECT);

次のスニペットは、前のスニペットで作成されたデータソース クエリと HttpServletRequest, を受け取り、データテーブルを作成します。詳細については、機能の使用をご覧ください。

      // Generate the data table.
      DataTable data = generateMyDataTable(query.getDataSourceQuery(), req);

次のコードは、クエリが分割されたときに生成された完了クエリ、前のスニペットによって生成されたデータテーブル、およびクエリ ビジュアリゼーションからユーザーの言語 / 地域を取得します。次に、新しいデータテーブルを作成します。

      // Apply the completion query to the data table.
      DataTable newData = DataSourceHelper.applyQuery(query.getCompletionQuery(), data,
          dsRequest.getUserLocale());

次のコードは、前のスニペットによって生成されたデータテーブルと、HttpServletRequest からのリクエスト パラメータを取得します。次に、コードはサーブレットのレスポンスを設定します。サーブレット コンテナはこのレスポンスをクエリ ビジュアリゼーションに返します。

      DataSourceHelper.setServletResponse(newData, dsRequest, resp);

エラーの処理

次のスニペットは、例外をキャッチして適切なメッセージを取得し、レスポンスをフォーマットして、サーブレット レスポンスを設定します。dsRequest が null の場合、DataSourceRequest は使用できません。これは、コンストラクタの障害が原因である可能性があります。この場合、DataSourceRequest ではなく HttpRequest が使用されます。

    catch (RuntimeException rte) {
      log.error("A runtime exception has occured", rte);
      ResponseStatus status = new ResponseStatus(StatusType.ERROR, ReasonType.INTERNAL_ERROR,
          rte.getMessage());
      if (dsRequest == null) {
        dsRequest = DataSourceRequest.getDefaultDataSourceRequest(req);
      }
      DataSourceHelper.setServletErrorResponse(status, dsRequest, resp);
    } catch (DataSourceException e) {
      if (dsRequest != null) {
        DataSourceHelper.setServletErrorResponse(e, dsRequest, resp);
      } else {
        DataSourceHelper.setServletErrorResponse(e, req, resp);
      }
    }

URL パラメータの使用

次のスニペットは、クエリが分割されたときに作成されたデータソース クエリと HttpServletRequest を受け取ります。HttpServletRequest には、必要に応じて URL として指定された tableId パラメータを含めることができます。この tableId パラメータは、返されるデータテーブルを次のように決定します。

  • tableId パラメータを省略するか、planets 以外の場合、データソースは動物のデータテーブルを返します。
  • tableId パラメータが planets として指定されている場合、データソースは惑星のデータテーブルを返します。

データテーブルを返す独自のコードを記述する場合は、使用するパラメータを決定します。

  private DataTable generateMyDataTable(Query query, HttpServletRequest req)
      throws TypeMismatchException {
    String tableID = req.getParameter("tableId");
    if ((tableID != null) && (tableID.equalsIgnoreCase("planets"))) {
      return generatePlanetsTable(query);
    }
    return generateAnimalsTable(query);
  }

機能の使用

次のスニペットは、クエリを受け取り、animals データテーブルを生成します。

private DataTable generateAnimalsTable(Query query) throws TypeMismatchException {
  DataTable data = new DataTable();
  List requiredColumns = getRequiredColumns(query,
      ANIMAL_TABLE_COLUMNS);
  data.addColumns(requiredColumns);

  // Populate the data table
  for (String key : animalLinksByName.keySet()) {
    TableRow row = new TableRow();
    for (ColumnDescription selectionColumn : requiredColumns) {
      String columnName = selectionColumn.getId();
      if (columnName.equals(ANIMAL_COLUMN)) {
        row.addCell(key);
      } else if (columnName.equals(ARTICLE_COLUMN)) {
        row.addCell(animalLinksByName.get(key));
      }
    }
    data.addRow(row);
  }
  return data;
}

次のスニペットは、クエリを受け取り、planets データテーブルを生成します。

private DataTable generatePlanetsTable(Query query) throws TypeMismatchException {
  DataTable data = new DataTable();
  List requiredColumns = getRequiredColumns(
      query, planetTableColumns);
  data.addColumns(requiredColumns);

  // Populate data table
  for (Planet planet : Planet.values()) {
    TableRow row = new TableRow();
    for (ColumnDescription selectionColumn : requiredColumns) {
      String columnName = selectionColumn.getId();
      if (columnName.equals(PLANET_COLUMN)) {
        row.addCell(planet.name());
      } else if (columnName.equals(MASS_COLUMN)) {
        row.addCell(planet.getMass());
      } else if (columnName.equals(GRAVITY_COLUMN)) {
        row.addCell(planet.getSurfaceGravity());
      } else if (columnName.equals(MOONS_COLUMN)) {
        row.addCell(planet.getNumberOfMoons());
      }
    }
    data.addRow(row);
  }
  return data;
}

AdvancedExampleServlet2 の実行とテスト

このセクションでは、AdvancedExampleServlet2 の実行とテストの方法を説明します。

AdvancedExampleServlet2 を実行してテストするには、次のセクションで説明するように、ウェブ アプリケーションを更新し、データソースをクエリする可視化を設定します。

Apache Tomcat でのウェブ アプリケーションの更新

以下の手順に沿って、Apache Tomcat 上のウェブ アプリケーションを更新します。次の手順は、Windows システム上の Apache Tomcat に固有のものです。

  1. 以前に WEB-INF ディレクトリにコピーした web.xml ファイルには、この例に必要な定義とマッピングがすでに含まれています。これを定義する行は次のとおりです。

    <servlet>
      <servlet-name>AdvancedExampleServlet2</servlet-name>
      <description>
      AdvancedExampleServlet2
      </description>
      <servlet-class>AdvancedExampleServlet2</servlet-class>
    </servlet>
      
    <servlet-mapping>
      <servlet-name>AdvancedExampleServlet2</servlet-name>
      <url-pattern>/advanced</url-pattern>
    </servlet-mapping> 
  2. Tomcat を起動するか、Tomcat がすでに起動している場合は再起動します。
  3. 次のリンクをクリックします。http://localhost:8080/myWebApp/advanced
    画面の幅に応じて 6 ~ 7 行のテキストが表示されます。 テキストは google.visualization.Query.setResponse で始まり、{v:'http://en.wikipedia.org/wiki/Tiger'}]}]}}); で終わります。
    これは、サンプルの CSV データソースが可視化に送信するレスポンスです。

ビジュアル表示を使用してデータを表示する

<data_source_library_install>/examples/src/html ディレクトリにある all_examples.html ファイルを使用すると、データの可視化を表示できます。

次の all_examples のスニペットは、advanced サーブレット、planets テーブル、select クエリ、棒グラフのビジュアリゼーションを指定します。

query = new google.visualization.Query('advanced?tableId=planets&tq=select planet,mass');
...
var chart = new google.visualization.BarChart(document.getElementById('advanced_div'));

all_examples.html に含まれるその他のビジュアリゼーションの説明については、外部データストアの使用セクションをご覧ください。

ビジュアリゼーションを指定してクエリ言語を使用する方法については、グラフの使用クエリ言語リファレンスをご覧ください。

高度なデータソースで提供されるデータのビジュアリゼーションを表示する手順は次のとおりです。

  1. all_examples.html ファイルを <data_source_library_install>/examples/src/html ディレクトリ
    から <tomcat_home>/webapps/myWebApp/ ディレクトリにコピーします(まだ行っていない場合)。
     
  2. ブラウザで http://localhost:8080/myWebApp/all_examples.html のリンクをクリックします。次のように表示されます。

次のステップ

ライブラリに用意されている例の詳細については、例のクイック リファレンスをご覧ください。複雑なデータソースの実装の詳細については、実装のヒントをご覧ください。