実装のヒント

このセクションでは、ライブラリのより複雑な実装を記述する場合に役立つヒントについて説明します。

独自のサーブレットの使用

最もシンプルなデータソース実装は、ライブラリの DataSourceServlet クラスを継承します。DataSourceServlet 以外のクラスから継承するには、データソースを次のように実装します。

  1. DataTableGenerator インターフェースを実装し、getCapabilities() と generateDataTable() をオーバーライドします。
  2. サーブレットのコード内から DataSourceHelper.executeDataSourceServletFlow() を呼び出して、データソース フローを実行します。このメソッドは、次のパラメータを受け取ります。
    • HttpServletRequest オブジェクト。
    • HttpServletResponse オブジェクト。
    • 上記のステップ 1 の DataTableGenerator インターフェースの実装。
    • 制限付きアクセスモードまたは無制限アクセスモードを指定するブール値。

たとえば、組み込み認証を提供する AuthServlet という別のサーブレット クラスからサーブレットを継承する場合は、次のように SimpleServletExample を書き換えて、DataSourceServlet ではなく AuthServlet を継承します。

  1. DataTableGenerator インターフェースを実装します。
  2. generateDataTable() を DataSourceServlet 実装から DataTableGenerator 実装に移動します。
  3. DataTableGenerator 実装の getCapabilities() をオーバーライドして、Capabilities.None を返します。
  4. サーブレット コード(doGet() または doPost())内から DataSourceHelper.executeDataSourceServletFlow() を呼び出し、DataTableGenerator の実装を渡します。このメソッドは、データソースの結果をサーブレットのレスポンスにレンダリングするなど、データソースのフロー全体を実行します。

サーブレット フレームワークを使用している場合でも、同じ手法を使用できます。サーブレット フレームワークでは、フレームワークから提供される抽象クラスを通常は継承します。たとえば、WebWork を使用している場合は、ActionSupport クラスを継承できます。

機能の定義

データストアに大量のデータが含まれており、データソースの効率を高めたい場合は、データストアのクエリ機能を使用できます。たとえば、データストアがデータベースで、データベースに多数の列があるとします。可視化でそれらの列が少数であれば、すべての列を取得し、ライブラリのクエリ機能を使用して SELECT を実行するよりも、データベース内で SELECT オペレーションを実行するほうが効率的です。SELECT 機能を実装するには、データベース内で SELECT オペレーションを実行し、データテーブルを返すコードを記述します。

Capabilities 列挙型を使用して、コードが提供するクエリ機能を定義します。使用できるオプションは次のとおりです。

  • NONE: デフォルト。コードはクエリ オペレーションを提供しません。
  • SQL: SQL クエリ オペレーションを提供するコード。
  • SORT_AND_PAGINATION: コードは、並べ替えとページ分割の両方のクエリ オペレーションを提供します。
  • SELECT: コードで選択オペレーションが提供されます。
  • ALL: コードで SQL、SORT_AND_PAGINATION、SELECT オペレーションが提供されます。

注: いずれの場合も、ライブラリはコードで提供されていないクエリ オペレーションを処理します。

NONE 以外の機能を実装するには、Capabilities.getCapabilities() をオーバーライドして DataTable.generateDataTable() を実装し、データストアにクエリを実行してデータテーブルを返します。

3 つの例(AdvancedExampleServlet、AdvancedExampleServlet2、SqlDataSourceServlet)は、ケーパビリティの実装方法を示しています。すべて example パッケージに含まれています。AdvancedExampleServlet2 については、機能とイベントのフローの定義をご覧ください。

イベントのフローをカスタマイズする

イベントのデフォルトのフローは DataSourceHelper.executeDataSourceServletFlow で定義されています。デフォルトのフローは次のとおりです。

  1. クエリ パラメータを抽出して解析する。
  2. 制限付きアクセスモードの場合のみ、リクエストがサーブレットと同じドメインから発信されていることを確認します。
  3. リクエストを解析して、2 つのクエリ オブジェクト(データソース クエリと補完クエリ)を作成します。データソースのクエリを generateDataTable() の実装に渡します。
  4. generateDataTable() を実装すると、データテーブルが生成されます。
  5. ステップ 5 で生成されたデータテーブルに対して完了クエリを実行します。
  6. 可視化で指定された形式でデータテーブルをレンダリングし、サーブレットのレスポンスを設定します。

独自のイベントフローを指定するには、datasource.DataSourceHelper のヘルパー関数を呼び出します。実装例については、機能とイベントのフローの定義をご覧ください。

DataTableGenerator.generateDataTable にパラメータを渡す

HttpServletRequest.setAttribute を使用すると、クエリまたは HttpServletRequest オブジェクトの一部ではないデータを DataTableGenerator.generateDataTable に渡すことができます。コードの例を以下に示します。

サーブレットのコードで、次のように、HttpServletRequest に渡すオブジェクトを配置します。

request.setAttribute("my_object_name", myObject);
DataSourceHelper.executeDataSourceServletFlow(request, response, dataTableGenerator);

dataTableGenerator インターフェースの実装で、次のように HttpServletRequest からオブジェクトを取得します。

public DataTable generateDataTable(Query query, HttpServletRequest request){
  Object myObject = request.getAttribute("my_object_name"); 
  // Add your code to manipulate myObject here 
} 

サーブレット以外のデータソースの実装

サーブレットを使用せずにライブラリを実装する場合は、サーブレット環境を必要としないクラスとヘルパー関数のみを使用できます。これには、Query クラスと DataTable クラスと、一部の DataSourceHelper 関数(parseQuery、applyQuery、validateQuery、splitQuery など)が含まれます。これらのクラスと関数を使用して、次のことができます。

  • 可視化クエリを解析します。
  • クエリをデータソース クエリと完了クエリに分割します。
  • 補完クエリを実行してデータテーブルを生成します。
  • データテーブルを HTML、CSV、または JSON の形式で可視化に返します。