nexacro platformで提供されるデータ処理は、データ自体を変換して処理しません。基本的なプロトコルであるHTTPを使用して、要求と応答を処理します。但し、ユーザー環境によってデータを暗号化して通信したり、必要な形式に変換して処理する過程を必要とすることがあります。
プロトコル·アダプタは、他のデータ構造を必要とする関係を相互に接続して希望する形で動作するように作成するツールです。簡単な設定だけで、必要な機能を簡単に作成することができます。
プロトコルアダプタ
プロトコル、モジュール、サービス項目は、プロジェクトフォルダ内のdefault_typedef.xmlファイルを直接登録するか、プロジェクトナビゲーションウィンドウでTypeDefinition項目をダブルクリックして開かれる[Edit TypeDefinition]ウィンドウで、該当する項目を追加することができます。
モジュール(Module)登録
プロジェクトフォルダ内のdefault_typedef.xmlファイルを直接変更したり、[Edit TypeDefinition > Modules]ウィンドウで、該当する項目を追加します。
登録するモジュールとスクリプトは、nexacro studioでBase Lib Pathに指定されたパスの下の[component]フォルダのサブパスにファイルがある必要があります。
デフォルト設定は、nexacro platformのインストールパスの下のnexacro14libフォルダです。
Base Lib Pathは、[Tools >Options > Environment > Build > Base Lib Path]で別のパスに変更することができます。
モジュールは、下記のような形でJSONファイルを作成します。「scripts」項目に指定されたJavaScriptのパスは、[Base Lib Path > component]フォルダの下の該当フォルダとスクリプトファイルがある必要があります。
{ "name": "Xecure", "version": "14.0.0.0", "description": "nexacro platform XecureAdp Protocol Library", "license": "", "scripts": [ "Xecure/Xecure.js", ] } //@ sourceURL=Xecure.json
<Module url="Xecure.json"/>
プロトコル(Protocol)登録
プロジェクトフォルダ内のdefault_typedef.xmlファイルを直接変更したり、[Edit TypeDefinition>Objects]ウィンドウで該当する項目を追加します。
<Component type="Protocol" id="Xecure" classname="nexacro.XecureAdp"/>
プロトコルに登録されたクラスに定義されたインターフェイスを該当時点に合わせて呼び出す方式で動作します。フレームワーク内部で動作する方式は下記のとおりです。
nexacro.ProtocolAdpを継承したクラスとして作成します。
登録されたプロトコルが最初に呼び出された時点でProtocolAdptorオブジェクトを生成します。該当オブジェクトは、アプリケーションが終了する前まで、通信が呼び出される時点で使用されます。
var _pXecureAdp = nexacro._createPrototype(nexacro.ProtocolAdp); nexacro.XecureAdp.prototype = _pXecureAdp;
オブジェクトが生成される時点で、initialize関数が呼び出されます。
_pXecureAdp.initialize = function () { trace("_pXecureAdp.initialize"); };
オブジェクトが削除される時点で、finalize関数が呼び出されます。
アプリケーションが閉じられる時点で呼び出されます。
_pXecureAdp.finalize = function () { trace("_pXecureAdp.finalize"); };
プロトコルアダプタのバージョン情報を提供します。この関数がない場合、「1.0」として認識します。getHTTPHeader()関数を使用するためには、必ずこの関数が必要であり、「1.1」以上の値を持つ必要があります。version()関数が存在しないか、値が「1.1」よりも小さい場合、getHTTPHeader()関数を処理しません。
_pXecureHttp.version = function () { return "1.1"; };
HTTP通信のヘッダ情報を提供します。_httpheadersは、HTTPヘッダ情報を含む配列オブジェクトです。
_pXecureHttp.getHTTPHeader = function () { return this._httpheaders; };
内部で実際の通信が呼び出される前にencrypt関数が呼び出されます。
通信が発生する前に、送信するデータを暗号化したり、好きな形に変換します。
_pXecureAdp.encrypt= function(url, data) { trace("encrypt url=" + url + ";data=" + data); return data; };
encrypt関数は、要求方式(Request Method)がPOST方式である場合にのみ呼び出されます。
transactionやloadメソッドを使用するとき、GlobalVariablesに関連付けられている別の設定がない場合には、POST方式で動作します。
内部で実際の通信が終わった後にdecrypt関数が呼び出されます。
受信したデータを復号化したり、好きな形に変換します。
_pXecureAdp.decrypt = function (url, data) { trace("decrypt url=" + url + ";data=" + data); return data; };
プロトコルで登録されるクラスの完全なコードは下記の通りです。使用環境によって実際のコードは修正して使用する必要があります。
if (!nexacro.XecureAdp) { nexacro.XecureAdp = function () { }; var _pXecureAdp = nexacro._createPrototype(nexacro.ProtocolAdp); nexacro.XecureAdp.prototype = _pXecureAdp; _pXecureAdp._type = "nexacroXecureAdp"; _pXecureAdp._type_name = "XecureAdp"; _pXecureHttp._httpheaders = []; _pXecureHttp._httpheaders.push({ id: "X-Requested-With", value: "XMLHttpRequest"}); _pXecureHttp._httpheaders.push({ id: "Accept", value: "application/json, text/json, */*"}); _pXecureHttp._httpheaders.push({ id: "Content-Type", value: "application/json"}); _pXecureHttp.version = function () { return "1.1"; }; _pXecureHttp.getHTTPHeader = function () { return this._httpheaders; }; _pXecureAdp.encrypt= function(url, data) { trace("encrypt url=" + url + ";data=" + data); return data; }; _pXecureAdp.decrypt = function (url, data) { trace("decrypt url=" + url + ";data=" + data); return data; }; _pXecureAdp.initialize = function () { trace("_pXecureAdp.initialize"); }; _pXecureAdp.finalize = function () { trace("_pXecureAdp.finalize"); }; delete _pXecureAdp; }
サービス登録
プロジェクトフォルダ内のdefault_typedef.xmlファイルを直接変更したり、[Edit TypeDefinition > Services]ウィンドウで該当する項目を追加します。
<Service prefixid="xecuredata" type="js" url="Xecure://localhost/" version="0" communicationversion="0"/>
プロトコルアダプタを使用してサービスグループに登録されたフォームを呼び出すには、サービスグループの登録時にurlを下記のように登録して使用することができます。
<Service prefixid="Base" type="form" url="Xecure://localhost/Base" version="0" communicationversion="0"/>
this.Div00.set_url('Base:test.xfdl');
データ呼び出し
登録されたサービスを呼び出すと、該当プロトコルで通信が行われます。
application.transaction("MyService01", "xecuredata::test.js", "dsIn=dsIn:A","dsOut=dsIn","a=b","fnCallback");
データ処理の全体の流れを整理すると下記の通りです。
該当プロトコルでデータを呼び出す
Application.transaction(), Dataset.load(), Div.set_url();
プロトコル初期化
initialize
送信データ変換
encrypt
サーバー呼び出し
変換されたデータを指定されたサーバーに送信します。
サーバー応答
受信データ変換
decrypt
コールバック関数またはデータ処理
呼び出しの種類によってデータを処理します。
PluginElement
データ処理時に、暗号化などの追加のセキュリティが必要な場合は、スクリプトで処理せずに外部プラグインを設定する必要があります。このような場合には、PluginElementを使用して外部プラグインを適用することができます。
外部プラグインの適用は、該当ソリューションで提供されるルールによって追加のコードを必要とすることがあります。下記の説明は、一般的にPluginElementを使用するガイドを提供します。
以下の説明は、Web区間の暗号化処理のためにXecureWebを適用する場合についての説明です。
参考として作成された例であり、一部の内容は省略されています。
ランタイムのバージョンを使用する場合、外部のプラグインは、アプリケーションの最初の実行時にインストールウェブページを読み込んでインストールする形をお勧めします。
インストール時に問題が発生した場合、プラグインの問題なのかnexacro platformの問題かを確認するにはウェブブラウザを使用してインストールする必要があります。
プロトコル(Protocol)クラスコード
PluginElementを使用するときにプロトコルアダプタを使用する方法は同じで、プロトコルに登録されるクラスのコードのみ一部変更されます。
オブジェクトが生成される時点で、initialize関数が呼び出されます。
内部で使用するプラグインは、nexacro.PluginElementを使用することができます。
Parent_elementなしで作成してフレームワークの内部hidden領域に追加するので画面に表示されません。
_pXecureAdp.initialize = function () { trace("_pXecureAdp.initialize"); var parent_elem = null; this.xecure = new nexacro.PluginElement(); this.xecure.setElementClassId("{7E9FDB80-5316-11D4-B02C-00C04F0CD404}"); this.xecure.create(); };
オブジェクトが削除される時点でfinalize関数が呼び出されます。
アプリケーションが閉じられる時点で呼び出されます。
_pXecureAdp.finalize = function () { this.xecure.destroy(); delete this.xecure; };
内部では、実際の通信が呼び出される前にencrypt関数が呼び出されます。
通信が発生する前に、送信するデータを暗号化します。
_pXecureAdp.encrypt= function(url, data) { return data; };
内部で実際の通信が終わった後にdecrypt関数が呼び出されます。
受信したデータを復号化します。
_pXecureAdp.decrypt = function (url, data) { return data; };
通信時に使用するプロトコルは、getUsingProtocol関数から返されます。
デフォルトで設定されたプロトコルは、httpです。
_pXecureAdp.getUsingProtocol = function (url) { return "http"; };
通信時に追加でクッキーに入る情報は、getCommunicationHeaders関数から返されます。
_pXecureAdp.getCommunicationHeaders = function (url) { var headers = []; headers.push({id:"test", value:"test1"}); return headers; };