ウィジェットAPIの概要
こちらで説明されている関数は、コードウィジェットを扱う際に使用され、Yellowfinの機能と柔軟性をさらに拡張します。これらはプラグインマネージャを通してインポートすることで、ダッシュボードに追加でき、ダッシュボード構築プロセスの中で選択するコードウィジェットの一覧に表示されます。より詳細な情報やリソースについては、コードウィジェット作成ガイドを参照してください。
WidgetAPI.serverRequest および doRequest を使用してデータを渡す
コードウィジェットの開発中には、Yellowfin サーバにデータを渡す必要がある場合があります。これは、WidgetAPI.serverRequest関数を使用することで実現できます。これは、コードウィジェットに関連するJava classの呼び出しを行います。
myWidget.js
let widgetAPI = options.api.widget; widgetAPI.serverRequest('hello').then(result => { alert(result.hello); });
MyWidgetImplementation.java
public void doRequest(CodeWidgetActionRequest request, CodeWidgetActionResponse response) { if("hello".equals(request.getAction())) { response.addData("hello", "Hello JavaScript!"); } }
CodeWidgetActionRequest
コードウィジェットのフロントエンドコンポーネントからリクエストが実行されると、CodeWidgetActionRequestオブジェクトが作成されます。このオブジェクトには、そのリクエストに追加されたデータが含まれています。
関数
String getAction()
このメソッドは、WidgetAPI.serverRequest関数に渡された文字列と一致します。これは、コードウィジェットが実行すべきアクションを特定するために使用されます。
例えば、フロントエンドからのリクエストが次のように行われた場合:
widgetAPI.serverRequest(“hello”);
getAction()は、文字列「hello」を返します。
String getParameter(String parameterName)
このメソッドは、JavaScript actionDataオブジェクトに含まれるパラメーターの文字列バージョンを返します。渡されたparameterNameがリクエスト内のパラメーターと一致しない場合は、nullが返されます。
widgetAPI.serverRequest(“hello”, { name: “Code Widget” });
request.getParameter(“name”) が呼び出されると、「Code Widget」を返します。
<T> getParameterAsObject(String parameterName, Class<T> clazz)
この関数は、渡されたparameterNameの値を、渡されたClass型として返します。
例:
Integer counter = getParameterAsObject(“counter”, Integer.class);
上記のコードを呼び出すことで、整数が返されます。値を解析できない場合は、nullが返されます。
または、
WidgetAPI.serverRequest(‘example’, { counter: 1, myClass: { ‘one’: ‘one’, ‘two’: ‘two’ } });
フロントエンドから上記のリクエストが実行されると、これらはJavaで次のように実行することで、オブジェクトとして直接取得することができます。
class MyClass { private String one = null; private String two = null; public MyClass(String one, String two) { this.one = one; this.two = two; } public String getOne() { return one; } public String getTwo() { return two; } } Integer counter = request.getParameterAsObject(‘counter’, Integer.class); MyClass myClass = request.getParameterAsObject(‘myClass’, MyClass.class); System.out.println(myClass.getTwo()); //Prints “two”
こちらの例では、変数カウンターは整数として解析され、MyClassはJSONから対応するプライベートメンバー変数に値がマッピングされます。
このメソッドを使用すると型の安全性が保証されないため、ジェネリックを使用する場合には制限があります。ジェネリックを使用してオブジェクトの解析を試行する場合は、代わりにgetParameterAsObject(String, Type)を使用することを推奨します。
<T> getParameterAsObject(String parameter, Type type)
この関数は、渡された型のパラメーターを使用して、渡されたパラメーターキーの解析を試行します。
この関数は、<T> getParameterAsObject(String parameterName, Class<T> clazz)と似たように機能しますが、型オブジェクトを定義できるため、ジェネリックをサポートしているclassを使用することができるので、ジェネリックを使用する場合により適してします。
List<String> myList = getParameterAsObject(“myList”, new TypeToken<List<String>>() {}.getType());
この関数を使用すると、Yellowfinに同梱されているgsonへの依存が導入されますが、それはこのwikiでは説明していません。
gsonに馴染みがなく使用を避けたい場合は、文字列バージョンを取得してから解析をする代替案があります。
CodeWidgetResponse
このオブジェクトは、コードウィジェットのJavaScript コンポーネントに送信される応答を表します。
JavaScriptへ返したい任意のデータをこちらに追加することができ、JavaScritpはこの応答をシンプルJSONオブジェクトとして受信します。
関数
addData(String parameter, Object data)
この関数は、渡されたパラメーターと値をオブジェクトに追加し、JavaScriptに返します。
例:
response.addData(‘greeting’, ‘Hello World’);
上記のJava テキストを使用した場合、JavaScriptを使用することで、パラメーターと値にアクセスすることができます。
widget.serverRequest(‘greeting’).then(result => { alert(result.greeting); })
渡されるオブジェクトは、単純な文字列よりもさらに複雑になることがあります。任意のJava classをこちらに追加することができます。getPropertyやis Propertyのように、公開されているゲッターにJava classの実装を追加すると、それらはJSONデータに追加されます。これが起きると、「get」の後の最初の文字は、生成されたJSON内で小文字に変更されます。
例:
getPropertyはpropertyになります。
isAPropertyはaPropertyになります。
次のclassの場合:
public Class MyExampleClass { public String getSayHello() { Return "Hello" } public String helloWorld() { return "Hello World"; } public boolean isCodeWidget() { return true; } }
応答に追加された場合:
response.addData("exampleClass", new MyExampleClass());
次のオブジェクトを生成します。
{ sayHello: "Hello", codeWidget: true }
WidgetAPI
ウィジェットAPIは、コードウィジェットのJavaScript コンポーネントが、バックエンドコンポーネントにメッセージを送信できるようにする機能を提供します。
WidgetAPI.serverRequest(action, actionData)
リターン
Promise - コードウィジェットリクエストが完了すると解決されるPromiseです。
Promiseは、バックエンドコンポーネントにより生成されるCodeWidgetResponseのJSON表現を含むオブジェクトに渡されます。
パラメーター
action - 文字列 - サーバに実行してほしいアクション
actionData - オブジェクト - リクエストとともに渡してほしい任意のデータを含むオブジェクト
例
myWidget.js
define(function() { function MyWidget(options) { let widgetAPI = options.apis.widgetAPI; //Trigger a "hello" request to the backend of the widget widgetAPI.serverRequest('hello').then(result => { alert(result.hello); }); } return MyWidget; }
MyWidgetImplementation.java
public void doRequest(CodeWidgetActionRequest request, CodeWidgetActionResponse response) { if("hello".equals(request.getAction())) { response.addData("hello", "Hello JavaScript!"); } }