aboutsummaryrefslogtreecommitdiffstats
path: root/notifier.js
diff options
context:
space:
mode:
authorsuVene2008-12-08 18:04:17 +0000
committersuVene2008-12-08 18:04:17 +0000
commit4012d388f4e4698ac13e30f0d8d3c310cdfe55d5 (patch)
treea5759baaed32f98fefc96af30d3b930d4675e9e8 /notifier.js
parenta9eaeea1f3d7fdff871a94801d7b278b5def26ba (diff)
downloadvimperator-plugins-4012d388f4e4698ac13e30f0d8d3c310cdfe55d5.tar.bz2
*SubjectHttp定義.
*registerするときに下位クラスから基底クラスを指定するように変更. *notifier/observer/subject の PLUGIN_INFO対応 @see http://coderepos.org/share/browser/lang/javascript/vimperator-plugins/trunk/pluginManager.js *ほか. git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@26152 d0d07461-0603-4401-acd4-de1884942a52
Diffstat (limited to 'notifier.js')
-rw-r--r--notifier.js185
1 files changed, 160 insertions, 25 deletions
diff --git a/notifier.js b/notifier.js
index 126c523..5dcdfe5 100644
--- a/notifier.js
+++ b/notifier.js
@@ -1,22 +1,112 @@
-/**
- * ==VimperatorPlugin==
- * @name notifier.js
- * @description notice of change framework.
- * @description-ja 変更通知フレームワーク。
- * @author suVene suvene@zeromemory.info
- * @version 0.1.0
- * @minVersion 2.0pre
- * @maxVersion 2.0pre
- * Last Change: 07-Dec-2008.
- * ==/VimperatorPlugin==
- *
- * HEAD COMMENT {{{
- * }}}
- */
+// PLUGIN_INFO//{{{
+var PLUGIN_INFO =
+<VimperatorPlugin>
+ <name>{name}</name>
+ <description>notice of change framework.</description>
+ <description lang="ja">変更通知フレームワーク。</description>
+ <author mail="suvene@zeromemory.info" homepage="http://zeromemory.sblo.jp/">suVene</author>
+ <version>0.1.0</version>
+ <minVersion>2.0pre</minVersion>
+ <maxVersion>2.0pre</maxVersion>
+ <detail><![CDATA[
+== Command ==
+:notifierstart:
+ 変更通知をスタートします。
+:notifierrestart:
+ 変更通知をリスタートします。
+:notifierstop:
+ 変更通知をストップします。
+
+== Observer ==
+* 通知された変更を扱うオブジェクトを定義します。
+Subject からの Message オブジェクトを解析し、何らかの動作を行います。
+Observer ⇒ Subject への依存は高くて OK です。
+
+* 命名規約
+prefix に 'observer_' を付け、'rumtimepath/notifier' の下にインストールして下さい。
+ex.)'${rumtimepath}/notifier/observer_XXX.js'
+
+* 登録方法
+liberator.plugins.notifier.observer.register(baseClass, extendsMethods)
+baseClass:
+ 基底クラスとなります。現在以下の基底クラスが存在します。
+ - liberator.plugins.notifier.Observer
+extendsMethosd:
+ 基底クラスの拡張となるメソッドをハッシュ形式で渡します。
+ 実装するメソッドは基底クラスのルールに従って下さい。
+
+* 基底クラスの説明
+** librator.plugins.notifier.Observer
+Observerの基本クラスです。
+initialize():
+ 必要の無い場合、実装しなくても OK です。
+ インスタンス生成時に1度だけフレームワークによって呼び出されます。
+ 初期化処理など必要な処理を実装して下さい。
+update(liberator.plugins.notifier.Message):
+ 必ず実装して下さい。
+ Subject からの変更通知がなされた場合、引数 Message と共にフレームワークより呼び出されます。
+
+== Subject ==
+* 変更を検知し Observer に通知します。
+原則、observer との依存を少なくして下さい。
+(Message の解析の役割は Observer にある)
+
+* 命名規約
+prefix に 'subject_' を付け、'rumtimepath/notifier' の下にインストールして下さい。
+ex.)'${rumtimepath}/notifier/subject_XXX.js'
+
+* 登録方法
+liberator.plugins.notifier.subject.register(baseClass, extendsMethods)
+baseClass:
+ 基底クラスとなります。現在以下の基底クラスが存在します。
+ - liberator.plugins.notifier.Subject
+ - liberator.plugins.notifier.SubjectHttp
+extendsMethosd:
+ 基底クラスへの拡張をハッシュ形式で渡します。
+
+* 基底クラスの説明
+** librator.plugins.notifier.Subject
+Subject の基本クラスです。
+interval:
+ 秒で変更チェックするインターバルを指定します。デフォルトは 60 です。
+initialize():
+ 必要の無い場合、実装しなくても OK です。
+ インスタンス生成時に1度だけフレームワークによって呼び出されます。
+ 初期化処理など必要な処理を実装して下さい。
+check():
+ 必ず実装して下さい。
+ 指定したインターバルごとにフレームワークによって呼び出されます。
+ 変更を検知した場合、liberator.plugins.notifier.Message のインスタンスを引数に
+ this.notify(message) を呼び出してください。
+
+** librator.plugins.notifier.SubjectHttp
+Httpを利用した変更検知の基底クラスです。
+リクエスト内容をキャッシュします。
+options{}:
+ url:
+ URL を指定します。
+ headers{}:
+ リクエストに header が必要な場合ハッシュで指定します。
+ extra{}:
+ リクエストのオプションです。ハッシュで指定します。
+ 以下の key が有効です。
+ asynchronose (false), encoding(default utf-8)
+parse(liberator.pluginsnotifier.Request):
+ 必ず実装して下さい。
+ リクエストを解析した結果を返却して下さい。
+diff(cache, parsed):
+ 必ず実装して下さい。
+ this.parse() による解析結果と、そのキャッシュとの差分を抽出して返却して下さい。
+buildMessages(diff):
+ 必ず実装して下さい。
+ this.diff() により抽出されたオブジェクトを元に、liberator.plugins.notifier.Message のインスタンス、
+ または、その配列を返却して下さい。
+ ]]></detail>
+</VimperatorPlugin>;
+//}}}
(function() {
-io.sourceFromRuntimePath(['libly.js']);
if (!liberator.plugins.libly) {
- liberator.log('notifier: needs libly.js');
+ liberator.log('notifier: needs _libly.js');
return;
}
@@ -37,11 +127,10 @@ function bootstrap() {
this.initialize.apply(this, arguments);
};
Loader.prototype = {
- initialize: function(name, registerHook) {
+ initialize: function(name) {
liberator.plugins.notifier[name] = this;
this.name = name;
this.plugins = [];
- this.registerHook = registerHook;
this.load(name);
},
load: function(name) {
@@ -56,8 +145,8 @@ function bootstrap() {
});
});
},
- register: function(plugin) {
- this.plugins.push(this.registerHook(plugin));
+ register: function(baseClass, pluginExtends) {
+ this.plugins.push(new baseClass(pluginExtends));
},
unregister: function(plugin) {
var ret = [];
@@ -105,8 +194,7 @@ function bootstrap() {
__initialize__: function(args) {
this.isActive = false;
this.observers = [];
- this.interval = 0;
- //if (this.interval < 60) this.interval = 60;
+ this.interval = 60;
this.__nextTime = new Date();
$U.extend(this, args);
if (typeof this.initialize == 'function') this.initialize();
@@ -128,6 +216,50 @@ function bootstrap() {
check: function() { throw 'needs override.' }
};//}}}
+ var SubjectHttp = Subject;//{{{
+ $U.extend(SubjectHttp.prototype, {
+ initialize: function() {
+ this.initialized = false;
+ this.count = 0;
+ this.cache;
+
+ var req = new libly.Request(
+ this.options.url,
+ this.options.headers,
+ this.options.extra
+ );
+ req.addEventListener('onSuccess', $U.bind(this, function(res) {
+ if (typeof this.parse == 'function') this.cache = this.parse(res);
+ if (this.cache)
+ this.initialized = true;
+ }));
+ req.get();
+ },
+ check: function() {
+ if (!this.initialized) return;
+
+ this.count++;
+ var req = new libly.Request(
+ this.options.url,
+ this.options.headers,
+ this.options.extra
+ );
+ req.addEventListener('onSuccess', $U.bind(this, function(res) {
+ var parsed, diff;
+ if (typeof this.parse == 'function') parsed = this.parse(res);
+ if (parsed && typeof this.diff == 'function') diff = this.diff(this.cache, parsed);
+ if (diff && (typeof diff.length != 'undefined' && diff.length > 0)) {
+ if (typeof this.buildMessages == 'function') {
+ let messages = this.buildMessages([].concat(diff));
+ [].concat(messages).forEach($U.bind(this, function(m) this.notify(m)));
+ }
+ this.cache = parsed;
+ }
+ }));
+ req.get();
+ }
+ });//}}}
+
var Notifier = function() {//{{{
this.initialize.apply(this, arguments);
};
@@ -143,7 +275,7 @@ function bootstrap() {
setup: function() {//{{{
if (this.isBusy) {
- logger.log('bussy.' + this.id);
+ logger.log('busy.' + this.id);
return;
}
@@ -161,6 +293,9 @@ function bootstrap() {
);
liberator.plugins.notifier.libly = libly;
+ liberator.plugins.notifier.Observer = Observer;
+ liberator.plugins.notifier.Subject = Subject;
+ liberator.plugins.notifier.SubjectHttp = SubjectHttp;
liberator.plugins.notifier.Message = Message;
this.observers = new Loader('observer', function(args) new Observer(args));
@@ -204,7 +339,7 @@ function bootstrap() {
s.isActive = false;
s.__nextTime = new Date(s.__nextTime.getTime() + s.interval * 1000);
if (s.__nextTime < now) s.__nextTime = now;
- }, 10);
+ }, 1000);
}
});
liberator.sleep(3 * 1000);