Author: reebalazs
Date: Tue Dec 25 12:58:25 2007
New Revision: 50074

Modified:
   kukit/kukit.js/branch/ree-service-layer-and-refactoring/   (props changed)
   kukit/kukit.js/branch/ree-service-layer-and-refactoring/kukit/eventreg.js
   kukit/kukit.js/branch/ree-service-layer-and-refactoring/kukit/interfaces.js
   
kukit/kukit.js/branch/ree-service-layer-and-refactoring/tests/test_interfaces.js
   
kukit/kukit.js/branch/ree-service-layer-and-refactoring/tests/test_kssparser.js
Log:
Refactor the event plugin registry.

Modified: 
kukit/kukit.js/branch/ree-service-layer-and-refactoring/kukit/eventreg.js
==============================================================================
--- kukit/kukit.js/branch/ree-service-layer-and-refactoring/kukit/eventreg.js   
(original)
+++ kukit/kukit.js/branch/ree-service-layer-and-refactoring/kukit/eventreg.js   
Tue Dec 25 12:58:25 2007
@@ -23,12 +23,6 @@
 
 var _eventClassCounter = 0;
 
-// these together store the plugin resource information, about registered 
events
-// there is two distinct registries, one for the actual events and one
-// for specifying the binding sequence
-var events = kukit.interfaces.get('events', 
kukit.interfaces.PluginMethodDescriptor);
-var bindings = kukit.interfaces.get('bindings', 
kukit.interfaces.PluginMethodDescriptor);
-
 /*
 *
 * class _EventRegistry
@@ -46,9 +40,9 @@
 *           implements the binder.
 */
 var _EventRegistry = function () {
-    this.content = {};
+    //this.content = {};
     this.classes = {};
-    this.eventSets = [];
+    //this.eventSets = [];
 };
 
 /* binder registration */
@@ -86,155 +80,69 @@
     return func;
 };
 
-/* events (methods) registration  helpers (not to be called directly) */
-
-_EventRegistry.prototype._register = 
-    function(namespace, eventName, klass,
-        bindMethodName, defaultActionMethodName, iterName) {
-    if (typeof(defaultActionMethodName) == 'undefined') {
-;;;     kukit.E = 'Missing arguments when calling [_EventRegistry.register].';
-        throw new Error(kukit.E);
-    }
-    // Find out the class name. (Not specified now.)
-    var className = klass.prototype.__className__;
-    if (typeof(className) == 'undefined') {
-        // Create a className, and register it too.
-        className = '' + _eventClassCounter;
-        _eventClassCounter += 1;
-        this.registerBinder(className, klass);
-        klass.prototype.__className__ = className;
-    }
-    if (!eventName) {
-;;;     kukit.E = '[eventName] argument cannot be empty when registering';
-;;;     kukit.E += ' an event with [_EventRegistry.register].';
-        throw new Error(kukit.E);
-    }
-    var key = this._getKey(namespace, eventName);
-    var entry = this.content[key];
-    if (typeof(entry) != 'undefined') {
-        if (key[0] == '-') {
-            key = key.substring(1);
-        }
-;;;     kukit.E = 'Attempt to register key [' + key;
-;;;     kukit.E += '] twice when registering';
-;;;     kukit.E += ' an event with [_EventRegistry.register].';
-        throw new Error(kukit.E);
-    }
-    // check bindMethodName and defaultActionMethodName
-    if (bindMethodName && ! klass.prototype[bindMethodName]) {
-;;;     kukit.E = 'In _EventRegistry.register bind method [' + bindMethodName;
-;;;     kukit.E += '] is undefined for event [' + eventName;
-;;;     kukit.E += '] namespace [' + namespace + '].';
-        throw new Error(kukit.E);
-    }
-    if (defaultActionMethodName && ! klass.prototype[defaultActionMethodName]) 
{
-;;;     kukit.E = 'In _EventRegistry.register default action method [';
-;;;     kukit.E += defaultActionMethodName + '] is undefined for event [';
-;;;     kukit.E += eventName + '] namespace [' + namespace + '].';
-        throw new Error(kukit.E);
-    }
-    // check the iterator.
-    if  (! er.getBindIterator(iterName)) {
-;;;     kukit.E = 'In _EventRegistry.register unknown bind iterator [';
-;;;     kukit.E += iterName + '].';
-        throw new Error(kukit.E);
-    }
-    // register it
-    this.content[key] = {
-        'className': className,
-        'bindMethodName': bindMethodName,
-        'defaultActionMethodName': defaultActionMethodName,
-        'iterName': iterName
-        };
-};
-
-/* events (methods) binding [ForAll] registration */
-
-_EventRegistry.prototype._registerEventSet =
-    function(namespace, names, iterName, bindMethodName) {
-    // At this name the values should be checked already. so this should
-    // be called _after_ _register.
-    this.eventSets.push({
-        'namespace': namespace, 
-        'names': names,
-        'iterName': iterName,
-        'bindMethodName': bindMethodName
-        });
-};
 
 /* there are the actual registration methods, to be called from plugins */
 
 _EventRegistry.prototype.register =
-    function(namespace, eventName, klass, bindMethodName,
-        defaultActionMethodName) {
-    this._register(namespace, eventName, klass, bindMethodName,
-        defaultActionMethodName, 'EachLegacy');
-    this._registerEventSet(namespace, [eventName], 'EachLegacy',
-        bindMethodName);
-};
-
-_EventRegistry.prototype.unregister =
-    function(namespace, eventName) {
-    var key = this._getKey(namespace, eventName);
-    delete this.content[key];
-    var found = null;
-    for (var i=0; i < this.eventSets.length; i++) {
-        var eventSet = this.eventSets[i];
-        if (eventSet['namespace'] == namespace) {
-            found = i;
-            break;
-        }
-    }
-    if (found != null) {
-        this.eventSets.splice(found, 1);
-    }
+    function(namespace, eventName, binderClass, bindMethodName,
+            bindMethodName, defaultActionMethodName) {
+        this.registerForAllEvents(namespace, eventName, binderClass, 
bindMethodName,
+                defaultActionMethodName, 'EachLegacy');
 };
 
 _EventRegistry.prototype.registerForAllEvents =
-    function(namespace, eventNames, klass,
+    function(namespace, eventNames, binderClass,
         bindMethodName, defaultActionMethodName, iterName) {
+    // Allow a single event name or a list of eventNames to be entered
     if (typeof(eventNames) == 'string') {
         eventNames = [eventNames];
         }
+    // For each eventname, register the event itself.
+    // During this:
+    // In the new registry all event names are dash-namespaced, so please
+    // create them for us since they were not so in the earlier version.
+    var namespacedEventNames = [];
     for (var i=0; i<eventNames.length; i++) {
         var eventName = eventNames[i];
-        this._register(namespace, eventName, klass, bindMethodName, 
-            defaultActionMethodName, iterName);
-    }
-    this._registerEventSet(namespace, eventNames, iterName, bindMethodName);
-};
-
-_EventRegistry.prototype._getKey = function(namespace, eventName) {
-    if (namespace == null) {
-        namespace = '';
-    } else if (namespace.split('-') > 1) {
-;;;     kukit.E = 'In [_EventRegistry.register], [namespace] cannot have';
-;;;     kukit.E += 'dashes.';
-        throw new Error(kukit.E);
-    }
-    return namespace + '-' + eventName;
-};
+        if (namespace) {
+            eventName = namespace + '-' + eventName;
+        }
+        namespacedEventNames.push(eventName);
+        // register the event informataion
+        var events = kukit.interfaces.get('events', 
kukit.interfaces.PluginMethodDescriptor);
+        events.getMethodDescriptor(eventName).register({
+            eventName: eventName,
+            defaultMethodName: null,
+            parmtypes: null    // missing from this api.
+            });
+    }
+    // Register the bind iteration
+    //this._registerEventSet(namespace, eventNames, iterName, bindMethodName);
+    var binditerations = kukit.interfaces.getBindIteration();
+    binditerations.getMethodDescriptor('').register({
+            namespace: namespace,
+            eventNames: namespacedEventNames,
+            iterName: iterName,
+            binderClass: binderClass,
+            bindMethodName: bindMethodName});
 
-_EventRegistry.prototype.exists = function(namespace, eventName) {
-    var key = this._getKey(namespace, eventName);
-    var entry = this.content[key];
-    return (typeof(entry) != 'undefined');
 };
 
+// XXX This method should be deprc'd and from where it's called,
+// the finalized class's properties should be accessed
 _EventRegistry.prototype.get = function(namespace, eventName) {
-    var key = this._getKey(namespace, eventName);
-    var entry = this.content[key];
-    if (typeof(entry) == 'undefined') {
-;;;     if (key.substr(0, 1) == '-') {
-;;;         key = key.substring(1);
-;;;         kukit.E = 'Error : undefined global event [';
-;;;         kukit.E += key + '] (or maybe namespace is missing ?).';
-;;;     } else {
-;;;         kukit.E = 'Error : undefined namespace or event in [' + key + '].';
-;;;     }
+    //var key = this._getKey(namespace, eventName);
+    if (namespace) {
+        eventName = namespace + '-' + eventName;
+    }
+    // var entry = this.content[key];
+    var events = kukit.interfaces.get('events', 
kukit.interfaces.PluginMethodDescriptor);
+    var entry = events.getMethodDescriptor(eventName)
+    if (! entry.config) {
+;;;     kukit.E = 'Error : undefined event [' + eventName + '].';
         throw new Error(kukit.E);
     } 
-    return entry;
+    return entry.config;
 };
 
 kukit.eventsGlobalRegistry = new _EventRegistry();

Modified: 
kukit/kukit.js/branch/ree-service-layer-and-refactoring/kukit/interfaces.js
==============================================================================
--- kukit/kukit.js/branch/ree-service-layer-and-refactoring/kukit/interfaces.js 
(original)
+++ kukit/kukit.js/branch/ree-service-layer-and-refactoring/kukit/interfaces.js 
Tue Dec 25 12:58:25 2007
@@ -257,8 +257,8 @@
         // This is called on any method descriptors.
         // Register config to all event names individually.
         // Take names from the config.
-        for (var i = 0; i < config.names.length; i++) {
-            name = config.names[i];
+        for (var i = 0; i < config.eventNames.length; i++) {
+            name = config.eventNames[i];
             this.iface.getMethodDescriptor(name)._register(config);
         }
     };
@@ -269,7 +269,28 @@
 ;;;         kukit.E += '] in plugin interface [' + this.iface.name + ']';
             throw new Error(kukit.E);
         }
+        // Do some diagnostics    // check the iterator.
+;;;     if  (! kukit.er.getBindIterator(config.iterName)) {
+;;;         kukit.E = 'In BindIterationDescriptor.register: unknown bind 
iterator [';
+;;;         kukit.E += config.iterName + '].';
+;;;         throw new Error(kukit.E);
+;;;     }
+
+        // store the config
         this.config = config;
+
+        // Register binder class by its classname as well.
+        // XXX TODO
+        // Find out or generate the class name,
+        //var className = config.binderClass.prototype.__className__;
+        //if (typeof(className) == 'undefined') {
+        //    // Create a className, and register it too.
+        //    className = '' + _eventClassCounter;
+        //    _eventClassCounter += 1;
+        //    this.registerBinder(className, klass);
+        //    klass.prototype.__className__ = className;
+        //}
+
     };
 
     this.finalize = function(loader) {
@@ -285,24 +306,47 @@
  * Instantiation
  */
 
-// create singleton for interfaces
-var _interfaces = new this.Interfaces();
+this._createInterfaces = function() {
+    // create singleton for interfaces
+    this._interfaces = new this.Interfaces();
+};
+this._createInterfaces();
 
 // The following methods can acquire a given interface
 
 // wrap the function, since there are no bound methods in JS
 this.get = function(name, MethodDescriptor) {
-    return _interfaces.get(name, MethodDescriptor);
+    return this._interfaces.get(name, MethodDescriptor);
 };
 this.getService = function(name) {
-    return _interfaces.get(name, this.ServiceMethodDescriptor);
+    return this._interfaces.get(name, this.ServiceMethodDescriptor);
 };
 this.getPlugin = function(name) {
-    return _interfaces.get(name, this.PluginMethodDescriptor);
+    return this._interfaces.get(name, this.PluginMethodDescriptor);
 };
 this.getBindIteration = function(name) {
-    return _interfaces.get(name, this.BindIterationDescriptor);
+    // convenience, we use only 1 of this anyway
+    if (typeof(name) == 'undefined') {
+        name = 'binditerations';
+    }
+    return this._interfaces.get(name, this.BindIterationDescriptor);
 };
 
+/* XXX If we want to use interfaces in a more placeful way, we can provide
+ * cloning ang merging to them. Since we don't really use them this way,
+ * the only support needed is for tests to establish a clean room.
+ * For this, we provide simple save and restore methods. These can
+ * be celled from setUp and tearDown of tests that want to provide their
+ * own interfaces setup.
+ */
+
+this.cleanRoomSetUp = function(suite) {
+    this._saved_interfaces = this._interfaces;
+    // now create interfaces
+    this._createInterfaces();
+};
+this.cleanRoomTearDown = function(suite) {
+    this._interfaces = this._saved_interfaces;
+};
 
 }(); /* END CLOSURE kukit.interfaces */

Modified: 
kukit/kukit.js/branch/ree-service-layer-and-refactoring/tests/test_interfaces.js
==============================================================================
--- 
kukit/kukit.js/branch/ree-service-layer-and-refactoring/tests/test_interfaces.js
    (original)
+++ 
kukit/kukit.js/branch/ree-service-layer-and-refactoring/tests/test_interfaces.js
    Tue Dec 25 12:58:25 2007
@@ -384,22 +384,19 @@
         var binditerations = this.interfaces.get('dummybinditerations', 
kukit.interfaces.BindIterationDescriptor);
         // somewhere else, core registers the methods:
         events.getMethodDescriptor('click').register({
-            namespace: null,
             name: 'click',
             defaultMethodName: null,
             parmtypes: [
                 ['preventDefault', 'bool', true],
                 ['allowBubbling', 'bool', false]]});
         events.getMethodDescriptor('keydown').register({
-            namespace: null,
             name: 'keydown',
             defaultMethodName: null,
             parmtypes: [
                 ['preventDefault', 'bool', true],
                 ['allowBubbling', 'bool', false]]});
         binditerations.getMethodDescriptor('').register({
-            namespace: null,
-            names: ['click', 'keydown'],
+            eventNames: ['click', 'keydown'],
             iterName: 'Each',
             binderClass: M,
             bindMethodName: 'bind'});
@@ -415,8 +412,7 @@
         // It needs a bind iterator even though it is a single
         // group.
         binditerations.getMethodDescriptor('').register({
-            namespace: null,
-            names: ['timeout'],
+            eventNames: ['timeout'],
             iterName: 'Each',
             bindMethodName: 'bind'});
         //
@@ -435,21 +431,19 @@
         // No double registration for test plugins.
         var C = function() {};
         // Let's create a TestDummy interface.
-        var iface = this.interfaces.get('dummyevent', 
kukit.interfaces.PluginMethodDescriptor);
-        // somewhere else, core registers the methods:
-        iface.getMethodDescriptor('click').register({
+        var events = this.interfaces.get('dummyevents', 
kukit.interfaces.PluginMethodDescriptor);
+        // somewhere a plugin registers something:
+        events.getMethodDescriptor('click').register({
             name: 'click',
-            binderMethod: function() {return "Binding click event.";},
-            defaultMethod: function() {},
+            defaultMethodName: null,
             parmtypes: [
                 ['preventDefault', 'bool', true],
-                ['allowBubbling', 'bool', false]]});
+                    ['allowBubbling', 'bool', false]]});
         // But another providing attempt is punished by an Error.
         this.assertThrows(function() {
-            iface.getMethodDescriptor('click').register({
+            events.getMethodDescriptor('click').register({
                 name: 'click',
-                binderMethod: function() {return "Binding click event.";},
-                defaultMethod: function() {},
+                defaultMethodName: null,
                 parmtypes: [
                     ['preventDefault', 'bool', true],
                     ['allowBubbling', 'bool', false]]});
@@ -464,17 +458,16 @@
         var iface = this.interfaces.get('dummybinditeration', 
kukit.interfaces.BindIterationDescriptor);
         // somewhere else, core registers the methods:
         iface.getMethodDescriptor('').register({
-            namespace: null,
-            names: ['click', 'timeout'],
+            eventNames: ['click', 'timeout'],
             iterName: 'Each',
             binderClass: M,
             bindMethodName: 'bind'});
         // But another providing attempt is punished by an Error.
         this.assertThrows(function() {
             iface.getMethodDescriptor('').register({
-                namespace: null,
-                names: ['keyDown', 'timeout'],
+                eventNames: ['keyDown', 'timeout'],
                 iterName: 'Each',
+                binderClass: M,
                 bindMethodName: 'bind'});
             },
             Error);

Modified: 
kukit/kukit.js/branch/ree-service-layer-and-refactoring/tests/test_kssparser.js
==============================================================================
--- 
kukit/kukit.js/branch/ree-service-layer-and-refactoring/tests/test_kssparser.js 
    (original)
+++ 
kukit/kukit.js/branch/ree-service-layer-and-refactoring/tests/test_kssparser.js 
    Tue Dec 25 12:58:25 2007
@@ -24,12 +24,28 @@
 kukit.KssParserTestCaseBase = function() {
 
     this.setUp = function() {
+        // create a clean room interface registry
+        kukit.interfaces.cleanRoomSetUp(this);
+        // add my events
         kukit.eventsGlobalRegistry.register('dnd', 'drag',
-            kukit.pl.NativeEventBinder, '__bind__nodeordocument', null);
+            kukit.pl.NativeEventBinder, null, null);
+        kukit.eventsGlobalRegistry.register(null, 'click',
+            kukit.pl.NativeEventBinder, null, null);
+        kukit.eventsGlobalRegistry.register(null, 'load',
+            kukit.pl.NativeEventBinder, null, null);
+        kukit.eventsGlobalRegistry.register(null, 'timeout',
+            kukit.pl.NativeEventBinder, null, null);
+        kukit.eventsGlobalRegistry.register(null, 'blur',
+            kukit.pl.NativeEventBinder, null, null);
+        kukit.eventsGlobalRegistry.register(null, 'keydown',
+            kukit.pl.NativeEventBinder, null, null);
+        // XXX the tests test at numerous occasion a non-existent
+        // event, so be careful when you add a new one.
     };
 
     this.tearDown = function() {
-        kukit.eventsGlobalRegistry.unregister('dnd', 'drag');
+        // Restore the original registry
+        kukit.interfaces.cleanRoomTearDown(this);
     };
 
     this.assertKssParmValueEquals = function(a, b, reason) {
@@ -1076,44 +1092,44 @@
         txt= " document:clack ";
         cursor = new kukit.tk.Cursor(txt);
         this.assertParsingError(kukit.kssp.KssSelector, cursor, null, true,
-            'Error : undefined global event [clack] (or maybe namespace is 
missing ?).');
+            'Error : undefined event [clack].');
         txt= " document:clack(hello) ";
         cursor = new kukit.tk.Cursor(txt);
         this.assertParsingError(kukit.kssp.KssSelector, cursor, null, true,
-            'Error : undefined global event [clack] (or maybe namespace is 
missing ?).');
+            'Error : undefined event [clack].');
     }
     
     this.testKssSelectorWithRightEventAndMissingNamespace = function() {
         txt= " document:drag ";
         cursor = new kukit.tk.Cursor(txt);
         this.assertParsingError(kukit.kssp.KssSelector, cursor, null, true,
-            'Error : undefined global event [drag] (or maybe namespace is 
missing ?).');
+            'Error : undefined event [drag].');
         txt= " document:drag(hello) ";
         cursor = new kukit.tk.Cursor(txt);
         this.assertParsingError(kukit.kssp.KssSelector, cursor, null, true,
-            'Error : undefined global event [drag] (or maybe namespace is 
missing ?).');
+            'Error : undefined event [drag].');
     }
     
     this.testKssSelectorWithUndefinedNamespaceWhenNamespace = function() {
         txt= " document:dad-drag ";
         cursor = new kukit.tk.Cursor(txt);
         this.assertParsingError(kukit.kssp.KssSelector, cursor, null, true,
-            'Error : undefined namespace or event in [dad-drag].');
+            'Error : undefined event [dad-drag].');
         txt= " document:dad-drag(hello) ";
         cursor = new kukit.tk.Cursor(txt);
         this.assertParsingError(kukit.kssp.KssSelector, cursor, null, true,
-            'Error : undefined namespace or event in [dad-drag].');
+            'Error : undefined event [dad-drag].');
     }
     
     this.testKssSelectorWithUndefinedEventNameWhenNameSpace = function() {
         txt= " document:dnd-drog ";
         cursor = new kukit.tk.Cursor(txt);
         this.assertParsingError(kukit.kssp.KssSelector, cursor, null, true,
-            'Error : undefined namespace or event in [dnd-drog].');
+            'Error : undefined event [dnd-drog].');
         txt= " document:dnd-drog(hello) ";
         cursor = new kukit.tk.Cursor(txt);
         this.assertParsingError(kukit.kssp.KssSelector, cursor, null, true,
-            'Error : undefined namespace or event in [dnd-drog].');
+            'Error : undefined event [dnd-drog].');
     }
 }; 
 
_______________________________________________
Kukit-checkins mailing list
[email protected]
http://codespeak.net/mailman/listinfo/kukit-checkins

Reply via email to