Cloud9 IDEを拡張して、サーバと通信をしてみます。
サーバと通信するには、クライアント側、サーバ側の双方にextensionを追加します。
大まかな処理の流れです。
- クライアント側で拡張で ide.send(data) でサーバにデータを送信。
- クライアント側の ide.js 内の ide.socket.json.send(data) でサーバにデータ送信される。
- サーバ側の ide.js の onUserMessage イベントハンドラが起動。
- サーバ側の workspace.js の execHook が起動。引数hookに文字列「command」。
- execHook内で、サーバ側のプラグインを検索。プラグイン内の command プロパティを起動。
- サーバ側のプラグイン内で sendResult(data)でクライアントにデータ送信。
- クライアント側の socketMessage イベントハンドラが起動。
クライアント側の拡張では、ide.send(data)でデータ送信。socketMessageイベントハンドラを実装。サーバ側のプラグインでは、commandプロパティを実装。sendResult(data)でクライアントに送信。ということになります。
インストールボタンを押したら、サーバにデータを送信して、その返信をデータグリッドに表示してみます。
まず、クライアント側。Viewは変わらないので省略。
cloud9/client/ext/datagrid_test/datagrid_test.js
define(function(require, exports, module) { var ide = require('core/ide'); var ext = require('core/ext'); var panels = require("ext/panels/panels"); var markup = require('text!ext/datagrid_test/datagrid_test.xml'); var util = require("core/util"); module.exports = ext.register('ext/datagrid_test/datagrid_test', { name : "Datagrid Test", dev : "Tomoyuki Inoue", alone : true, type : ext.GENERAL, markup : markup, command : "datagrid_test", desp : [panels], nodes : [], hook : function(){ var _self = this; this.nodes.push( mnuWindows.insertBefore(new apf.item({ caption : "Datagrid Test", onclick : function(){ ext.initExtension(_self); // モデルを作成 var model = new apf.model(); // datagridのmodel属性にmodelを設定 dgList.setModel("model", model); // data要素を作成 var data = winDatagrid.ownerDocument.createElement("data"); // dataをロード model.load(data); // modelを設定 dgList.setModel(model); // ボタンクリック時のイベントハンドラ btnInstall.addEventListener("click", function(e){ if(tbPackage.value.length > 0){ var data = { command:"datagrid_test", message:tbPackage.value }; // サーバにデータを送信。 ide.send(data); } }); // datagridを表示 winDatagrid.show(); } }) ), mnuWindows.firstChild); // サーバから受信した時の処理を記述。 ide.addEventListener("socketMessage", this.onMessage.bind(this)); }, // 受信時の処理。 onMessage: function(e) { // datagrid_test以外なら何もしない。 if(e.message.type !== "result" && e.message.subtype !== "datagrid_test") return; var message = e.message; // モデルを取得 var m = dgList.getModel(); // member要素を作成 var member = winDatagrid.ownerDocument.createElement('member'); // name属性を設定 member.setAttribute('name', message.body.message); // cv属性を設定 member.setAttribute('cv', 'CV1'); // data要素の子要素としてmember要素を追加 m.data.appendChild(member); }, init : function(apfNode){}, nable : function(){ if (!this.disabled) return; this.nodes.each(function(item){ item.enable(); }); this.disabled = false; }, disable : function(){ if (this.disabled) return; this.nodes.each(function(item){ item.disable(); }); this.disabled = true; }, destroy : function(){ this.nodes.each(function(item){ item.destroy(true, true); }); this.nodes = []; } }); });
次にサーバ側。
cloud9/server/ext/datagrid_test/datagrid_test.js
var Plugin = require("cloud9/plugin"); var sys = require("sys"); // 初期設定 var DataGridTestPlugin = module.exports = function(ide) { this.ide = ide; // hooksに「command」を追加する this.hooks = ["command"]; // 自分の名前 this.name = "datagrid_test"; }; // Pluginクラスを継承する。 sys.inherits(DataGridTestPlugin, Plugin); (function() { // command を実装。workspaceから実行される。 this.command = function(user, message, client) { // 自分以外のコマンドは受け付けない。 if(message.command != "datagrid_test") return false; // クライアントに送信。受信した文字列に「Hello World!」を追加。 this.sendResult(0, message.command, { message: message.message + ' Hello World!' }); console.log('sendResult.'); // trueを返す。 return true; }; // サーバ終了時に起動。 this.dispose = function(callback) { // TODO kill all running processes! callback(); }; }).call(DataGridTestPlugin.prototype);
実行結果。
0 件のコメント:
コメントを投稿