プロトコールアダプター(サンプル)

nexacroモジュールデベロッパーで作成するプロトコールアダプターの例題を紹介します。あくまでサンプルとして作成されたソースコードであり、ソースコードの適合性を検証したものではありません。

JSONデータの処理

受信したJSONデータをSSV形式に変換してくれる機能の例題です。

1

Protocol Adapterで新たなオブジェクトを生成します。オブジェクトidは「JSONRecvAdp」に設定します。

2

ソースコードを以下のように作成します。

initialize関数で定数値を定義し、decryptでJSONデータをSSV形式に変換します。

nexacro.JSONAdp.prototype.initialize = function()		
{
	this._rs_ = String.fromCharCode(30); //Record Separator
	this._us_ = String.fromCharCode(31); //Unit Separator
};

nexacro.JSONAdp.prototype.decrypt = function(strUrl, strData)		
{	
	var oJsonData = JSON.parse(strData);
	// Stream Header
	var ssvData = "SSV:" + oJsonData.codepage + this._rs_;

	// Variables
	var arrObj = oJsonData.parameters;
	var arrKey = Object.keys(arrObj);
	if(arrKey)
	{
		for(var i = 0; i < arrKey.length; i++)
		{
			if(i>0)
				ssvData +=this._rs_;
			ssvData += arrKey[i] + "=" + arrObj[arrKey[i]];
		}
		ssvData +=this._rs_;
	}

	// Datasets
	for(var i = 0; i < oJsonData.datasets.length; i++)
	{
		var dataset = oJsonData.datasets[i];
		// Dataset Header
		ssvData += "Dataset:" + dataset.ds_id + this._rs_;

		// Const Column Infos
		arrObj = dataset.ds_colinfo.constcolumn;
		arrKey = Object.keys(arrObj);
		if(arrKey)
		{
			ssvData += "_Const_"+this._us_;
			for(var j = 0; j < arrKey.length; j++)
			{
				if(j>0)
					ssvData +=this._us_;
				ssvData += arrKey[j] + "=" + arrObj[arrKey[j]];
			}
			ssvData += this._rs_;
		}

		// Column Infos
		var column = dataset.ds_colinfo.column;
		for(var j = 0; j < column.length; j++)
		{
			var cols = column[j];
			if(j == 0)
			{
				if(cols.id == "_RowType_")
				{
					ssvData += cols.id;
				}
				else
				{
					ssvData += "_RowType_";
					ssvData += this._us_ + cols.id+ ":" + cols.type + "(" + cols.size +")";
				}
			}
			else
			{
				ssvData += this._us_ + cols.id+ ":" + cols.type + "(" + cols.size +")";
			}
		}
		ssvData += this._rs_;

		// Records
		var row = dataset.ds_rows.row;
		for(var j = 0; j < row.length; j++)
		{
			var recode = row[j];
			arrKey = Object.keys(recode);

			if(arrKey[0] == "_RowType_")
			{
				ssvData += "N";
				var nCol = 1;
			}
			else
			{
				ssvData += "N";
				var nCol = 0;
			}
			for(; nCol < arrKey.length; nCol++)
			{
				if(recode[arrKey[nCol]] == null)
				{
					ssvData += this._us_ + "";
				}
				else
				{
					ssvData += this._us_ + recode[arrKey[nCol]];
				}
			}
			ssvData += this._rs_;
		}
		// Null Record
		ssvData += this._rs_;
	}
	trace(ssvData);
	return ssvData;
};

3

メニュー[Deploy > Deploy Package]を選択すると、Deploy Wizardが表示されます。

4

[Deploy]ボタンをクリックしモジュールのインストーラファイルを配布します。

5

nexacro studioにて、モジュールをインストールしプロトコールアダプターを追加します。

6

Datasetオブジェクトを追加し以下の通りに設定します。

7

画面内Grid、Buttonコンポーネントを追加しDatasetオブジェクトとGridコンポーネントをバインドします。

8

Buttonコンポーネントのonclickイベントハンドラ関数を以下の通りに作成します。

JSONデータをSSV形式に変更して処理するため、nDataTypeパラメータ値として「2」(SSV)を指定します。

this.Button00_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
    this.transaction("srv00", "JSONRecvAdp://127.0.0.1:4098/test.json", "","Dataset00=dsJson","","fnCallback", true, 2);
};

this.fnCallback = function(id, code, message)
{
    trace("Error["+code+"]:"+message);
}

9

Outputフォルダ配下にJSONファイル(test.json)を以下の通りに作成します。(テスト用)

{
	"datatype": "JSON",
	"codepage": "utf-8",
	"parameters": {
		"ErrorCode": "0",
		"ErrorMsg": "OK"
	},
	"datasets": [
		{
			"ds_id": "dsJson",
			"ds_colinfo": {
				"constcolumn": {
					"ConstColumn0": "nexacro"
				},
				"column": [
					{
						"id": "Column0",
						"type": "STRING",
						"size": "256"
					},
					{
						"id": "Column1",
						"type": "DATE",
						"size": "256"
					}
				]
			},
			"ds_rows": {
				"row": [
					{
						"Column0": "3",
						"Column1": "20201124"
					},
					{
						"Column0": "4",
						"Column1": "20200122"
					}
				]
			}
		}
	]
}

10

QuickView(Ctrl + F6)をWebブラウザで実行した後、ボタンのクリック時にJSONファイルで設定しているデータが反映されることを確認します。

Webブラウザのコンソールにて、SSVデータに変換された文字列と成功時のメッセージを確認することができます。

crypto-jsを用いた共通鍵暗号・復号

オープンソースのcrypto-jsを利用した例題です。プロトコールアダプターの適用時に暗号化・復号化を適用します。

crypto-jsの詳細については以下のリンクをご参照ください。

https://code.google.com/archive/p/crypto-js/

このサンプルではCryptoJS v3.1.2バージョンを使用しています。

crypto-jsを含むモジュールの配布時にはライセンス告知を含む必要があります。

https://code.google.com/archive/p/crypto-js/wikis/License.wiki

1

Protocol Adapterで新たなオブジェクトを生成します。オブジェクトidは「cryptojsAdp」に設定します。

2

ソースコードを以下のように作成します。

initialize関数で共通鍵("nexacro platform")とinitialization vector(初期化ベクトル)を設定します。encrypt、decryptでは暗号化、復号化処理を行い、元のデータと返還後のデータをtraceメソッドにより表示します。

nexacro.cryptojsAdp.prototype.initialize = function()		
{	
	this._key = CryptoJS.enc.Utf8.parse("nexacro platform");
	this._iv = CryptoJS.enc.Utf8.parse(1234567812345678);
};	

nexacro.cryptojsAdp.prototype.encrypt = function(strUrl, strData)		
{	
	var encrypted = CryptoJS.AES.encrypt(strData, this._key, { 
		iv: this._iv,
		mode:CryptoJS.mode.CBC,
		padding:CryptoJS.pad.ZeroPadding
	});
	trace("strData: "+strData);
	trace("encrypted.toString(): "+encrypted.toString());
	return encrypted.toString();
};	
		
nexacro.cryptojsAdp.prototype.decrypt = function(strUrl, strData)		
{	
	var decrypted = CryptoJS.AES.decrypt(strData, this._key, {
		iv:this._iv,
		padding:CryptoJS.pad.ZeroPadding
	}); 
	trace("strData: "+strData);
	trace("decrypted: "+decrypted.toString(CryptoJS.enc.Utf8));		
	return decrypted.toString(CryptoJS.enc.Utf8);
};

3

User Folderを追加します。

4

User Folderの名前を「CryptoJS v3.1.2」に変更します。

5

User Folderのコンテキストメニューより[Import Files]項目を選択します。

6

エクスプローラーより以下の2つのファイルを選択しUser Folder配下に追加します。

CryptoJS v3.1.2
+ rollups > aes.js
+ components > pad-zeropadding-min.js

7

メニュー[Deploy > Deploy Package]を選択すると、Deploy Wizardが表示されます。

8

[Next]ボタンをクリックすると、JSON編集画面が表示されます。

9

scripts項目にて、userfolderに追加したjsファイルを追加します。

{
	"name": "cryptojsAdp",
	"moduletype": "protocoladaptor",
	"objInfo": [
	    "cryptojsAdp/_metainfo_/cryptojsAdp.info"
	],
	"scripts": [
    	"cryptojsAdp/CryptoJS v3.1.2/aes.js",
		"cryptojsAdp/CryptoJS v3.1.2/pad-zeropadding-min.js",
	    "cryptojsAdp/cryptojsAdp.js"
	],
	"userfolder": [
	    "cryptojsAdp/CryptoJS v3.1.2"
	]
}

編集したJSONスクリプトは保存されません。配布時に直接修正する必要があります。

10

[Deploy]ボタンをクリックしモジュールのインストーラファイルを配布します。

11

nexacro studioにて、モジュールをインストールしプロトコールアダプターを追加します。

12

画面内のtransactionのスクリプトは以下の通りに作成します。

this.Button00_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
    this.transaction("srv00", "cryptojsAdp://127.0.0.1:4098/test.xml", "","dsOut=Dataset00","value=a","fnCallback");
};

this.fnCallback = function(id, code, message)
{
    trace("Error["+code+"]:"+message);
}

13

QuickView(Ctrl + F6)をWebブラウザで実行した後、ボタンのクリック時にデータが暗号化され復号化されることを確認します。

機能確認のため、test.xmlファイルではリクエストされた値を暗号化した文字列を返すようにしています。例題ではリクエストされた値を再度復号化して返します。

strData: <?xml version="1.0" encoding="UTF-8"?>
<Root xmlns="http://www.nexacroplatform.com/platform/dataset">
    <Parameters>
        <Parameter id="value">a</Parameter>
    </Parameters>
</Root>

encrypted.toString(): 3TlyqNLXxHG8CN1MMIb3vAO/KGkU1OSAFl1wuMvAtEfq6jS6Vp95xvFLhCH/KKrSr5svsoRf1zi8lYmuQ0QMecYIPS+gz9KjeVCdwZ1F9/n/BQIrhN2ahuVDlQevU0+1fwirvXakwR6whvDPPY4ecgDgv7c3kCRVpxjYQk3AKJnZcKTwscCmfolfx9JzHmhq8R6SQKS9C8YJ/ju8j+VI2ZstQCoLU9JaJ0ATZbwGCmE=

strData: 3TlyqNLXxHG8CN1MMIb3vAO/KGkU1OSAFl1wuMvAtEfq6jS6Vp95xvFLhCH/KKrSr5svsoRf1zi8lYmuQ0QMecYIPS+gz9KjeVCdwZ1F9/n/BQIrhN2ahuVDlQevU0+1fwirvXakwR6whvDPPY4ecgDgv7c3kCRVpxjYQk3AKJnZcKTwscCmfolfx9JzHmhq8R6SQKS9C8YJ/ju8j+VI2ZstQCoLU9JaJ0ATZbwGCmE=


decrypted.toString(CryptoJS.enc.Utf8): <?xml version="1.0" encoding="UTF-8"?>
<Root xmlns="http://www.nexacroplatform.com/platform/dataset">
    <Parameters>
        <Parameter id="value">a</Parameter>
    </Parameters>
</Root>