[Checkins] SVN: zope3org/trunk/src/zorg/live/ Added logging for live server and manager

Uwe Oestermeier uwe_oestermeier at iwm-kmrc.de
Tue May 30 05:30:06 EDT 2006


Log message for revision 68392:
  Added logging for live server and manager

Changed:
  U   zope3org/trunk/src/zorg/live/README.txt
  U   zope3org/trunk/src/zorg/live/globals.py
  U   zope3org/trunk/src/zorg/live/page/client.js
  U   zope3org/trunk/src/zorg/live/page/client.py
  U   zope3org/trunk/src/zorg/live/page/event.py
  U   zope3org/trunk/src/zorg/live/page/manager.py
  U   zope3org/trunk/src/zorg/live/server.py
  U   zope3org/trunk/src/zorg/live/testing.py

-=-
Modified: zope3org/trunk/src/zorg/live/README.txt
===================================================================
--- zope3org/trunk/src/zorg/live/README.txt	2006-05-30 08:55:49 UTC (rev 68391)
+++ zope3org/trunk/src/zorg/live/README.txt	2006-05-30 09:30:06 UTC (rev 68392)
@@ -104,8 +104,17 @@
     >>> from zorg.live.page.manager import livePageSubscriber
     >>> zope.event.subscribers.append(livePageSubscriber)
 
-Now we simulate the startup of two clients.
+Now we simulate the startup of two clients. Note that we need a location,
+i.e. an object which can be identified by an id on the server as well as on the
+client side.
 
+    >>> from zope.app.folder import Folder
+    >>> shared_location = Folder()
+    
+    >>> from zope.app.intid.interfaces import IIntIds
+    >>> intIds = zope.component.getUtility(IIntIds)
+    >>> locationId = intIds.register(shared_location)
+    
     >>> from zorg.live.testing import TestLivePage
     
     >>> class Principal(object) :
@@ -119,8 +128,10 @@
     >>> request = TestRequest()
     >>> request.setPrincipal(user1)
     
-    >>> page = TestLivePage(None, request)
+    
+    >>> page = TestLivePage(shared_location, request)
     >>> where = page.getLocationId()
+    
     >>> print page.render()
     <html>
         <head>
@@ -137,7 +148,7 @@
 
     
     >>> request.setPrincipal(user2)
-    >>> page = TestLivePage(None, request)
+    >>> page = TestLivePage(shared_location, request)
     >>> print page.render()
     <html>
         <head>
@@ -153,7 +164,9 @@
     </html>
    
 The global utility can be asked for all online users:
-        
+    
+    >>> where == locationId
+    True
     >>> manager.whoIsOnline(where)
     ['zorg.member.dominik', 'zorg.member.uwe']
     

Modified: zope3org/trunk/src/zorg/live/globals.py
===================================================================
--- zope3org/trunk/src/zorg/live/globals.py	2006-05-30 08:55:49 UTC (rev 68391)
+++ zope3org/trunk/src/zorg/live/globals.py	2006-05-30 09:30:06 UTC (rev 68392)
@@ -20,19 +20,23 @@
 
 from zope.component import ComponentLookupError
 from zope.app.security.interfaces import PrincipalLookupError
+from zope.publisher.browser import TestRequest
 
 from zope.security.management import queryInteraction
 from zope.publisher.interfaces import IRequest
 
 defaultRequest = None
 
-def getRequest() :
+def getRequest(test=True) :
     global defaultRequest
     interaction = queryInteraction()
     if interaction is not None:
         for participation in interaction.participations:
             if IRequest.providedBy(participation) :
                 return participation
+    
+    if test :
+        return TestRequest()
     return defaultRequest
     
 def setRequest(request) :

Modified: zope3org/trunk/src/zorg/live/page/client.js
===================================================================
--- zope3org/trunk/src/zorg/live/page/client.js	2006-05-30 08:55:49 UTC (rev 68391)
+++ zope3org/trunk/src/zorg/live/page/client.js	2006-05-30 09:30:06 UTC (rev 68392)
@@ -11,7 +11,6 @@
 
     ajaxHandlers : {
         onError: function(request, transport) {
-//            alert("in onError");
             LivePage.numErrors += 1;
 			LivePage.lastRequest = null;
             if (LivePage.numErrors > 3) {
@@ -33,12 +32,17 @@
 		},
 
         onComplete: function(request, transport, json) {
+          
             var response = transport.responseText;
             LivePage.lastRequest = null;
             if (response.substr(0,1) == '{') {
                 var event = JSON.parse(response);
+                if (event.name != 'idle') {
+                    LivePage.logging("Event received: " + event.name);
+                    }
                 LivePage.processEvent(event);
                 }
+          
 			setTimeout("LivePage.nextEvent()", 500);
 			return true;
 			}
@@ -55,12 +59,12 @@
         
         
         if(LivePage.lastRequest){ 
-            alert("in nextEvent");
+            LivePage.logging("nextEvent blocked");
             return;
         }
         var base_url = LivePage.baseURL + "/@@output/" + LivePage.uuid;
         
-        alert("nextEvent" + base_url);
+        // LivePage.logging("nextEvent " + base_url);
         LivePage.lastRequest = new Ajax.Request(base_url, 
                                 { method: 'get', asynchronous:true});
         },
@@ -81,8 +85,28 @@
             alert("startClient called again...");
             }
         },
+        
+    
+    callInProgress : function(xmlhttp) {
+        switch (xmlhttp.readyState) {
+            case 1: case 2: case 3:
+                return true;
+            break;
+            // Case 4 and 0
+            default:
+                return false;
+            break;
+            }
+        },
 
+
     stopClient : function() {
+        if (self.lastRequest) {
+            if (LivePage.callInProgress(self.lastRequest.transport)) {
+                self.lastRequest.transport.abort();
+                }
+            }
+        
         LivePage.sendEvent({name: "close", uuid: LivePage.uuid });
         },
 
@@ -141,6 +165,12 @@
 
     playSound : function (id) {
         playFlash(id);
+        },
+        
+    logging : function(str) {
+        if ($('logging')) {
+            $('logging').innerHTML += "<p>" + str + "</p>"
+            }
         }
 
 }
@@ -220,7 +250,7 @@
     onUpdate : function(event) {
             var id = event['id'];
             var html = event['html'];
-            alert("update: " + id);
+            LivePage.logging("update: " + id);
             $(id).innerHTML = html;
 //            html.evalScripts();
 //            id.evalScripts();

Modified: zope3org/trunk/src/zorg/live/page/client.py
===================================================================
--- zope3org/trunk/src/zorg/live/page/client.py	2006-05-30 08:55:49 UTC (rev 68391)
+++ zope3org/trunk/src/zorg/live/page/client.py	2006-05-30 09:30:06 UTC (rev 68392)
@@ -126,7 +126,6 @@
                 return 'Invalid client id'
             
         manager = zapi.getUtility(ILivePageManager)
-        
         if ICloseEvent.providedBy(event) and event.uuid == self.uuid :
             manager.unregister(self)
             return ''

Modified: zope3org/trunk/src/zorg/live/page/event.py
===================================================================
--- zope3org/trunk/src/zorg/live/page/event.py	2006-05-30 08:55:49 UTC (rev 68391)
+++ zope3org/trunk/src/zorg/live/page/event.py	2006-05-30 09:30:06 UTC (rev 68392)
@@ -119,6 +119,9 @@
         
     def toDict(self) :
         d = dict(self.__dict__)
+        for key in d.keys() :
+            if key.startswith("_") :
+                del d[key]
         d.update(dict(name=self.name,
                         recipients=self.recipients,
                         where=self.where))
@@ -244,8 +247,7 @@
 class LoginEvent(LivePageEvent) :
     """ A login event that can be used to notify about new users. 
     
-        >>> LoginEvent(who='member.uoe', where='location', client=42).pprint()
-        client : 42
+        >>> LoginEvent(who='member.uoe', where='location', _client=42).pprint()
         name : 'login'
         recipients : 'all'
         where : 'location'
@@ -263,8 +265,7 @@
 class LogoutEvent(LivePageEvent) :
     """ A logout event that can be used to notify about leaving users. 
     
-        >>> LogoutEvent(who='member.uoe', where='location', client=42).pprint()
-        client : 42
+        >>> LogoutEvent(who='member.uoe', where='location', _client=42).pprint()
         name : 'logout'
         recipients : 'all'
         where : 'location'
@@ -447,6 +448,9 @@
     request = getRequest()
     args = {}
     for k, v in request.form.items() :
-        args[str(k)] = v.encode("utf-8")
+        try :
+            args[str(k)] = v.encode("utf-8")
+        except AttributeError :
+            args[str(k)] = str(v)
     return dict2event(args)
   

Modified: zope3org/trunk/src/zorg/live/page/manager.py
===================================================================
--- zope3org/trunk/src/zorg/live/page/manager.py	2006-05-30 08:55:49 UTC (rev 68391)
+++ zope3org/trunk/src/zorg/live/page/manager.py	2006-05-30 09:30:06 UTC (rev 68392)
@@ -15,7 +15,7 @@
 
 $Id: manager.py 39651 2005-10-26 18:36:17Z oestermeier $
 """
-import zope, time
+import zope, time, logging
 
 import zope.event
 from zope.interface import implements
@@ -31,6 +31,7 @@
 from zorg.live.page.event import LoginEvent
 from zorg.live.page.event import LogoutEvent
 
+logger = logging.getLogger('zorg.live.manager')
 
 class LivePageManager(object) :
     """ Groups collections of LivePages relative to locations specified
@@ -60,7 +61,17 @@
         self.locations = Cache(max_size=self.cacheSize)
         self.lastCheck = 0
         self.results = Cache(max_size=self.cacheSize)
-                      
+        
+    def connect(self, db) :
+        """ Connect to the database. XXX Is this really necessary?"""
+        
+        self.connection = db.open()
+        assert self.connection is not None
+        
+        self.db_root = self.connection.root()
+        self.app = self.db_root['Application']
+        
+                       
     def cacheResult(self, result) :
         """ Caches a result for efficient access. 
         
@@ -130,13 +141,13 @@
         
         client.uuid = uuid
         if uuid in self._location(where) :
-            print "***WARNING: already registered"
+            logger.warning("Client already registered %s" % uuid)
         else :
             self._location(where)[uuid] = client
             
         if not existing :
             login = LoginEvent(who=client.principal.id, 
-                        where=where, client=client)
+                        where=where, _client=client)
             # we use the zope event here since it's up the concrete
             # pages how they represent the online status of members
             
@@ -149,16 +160,20 @@
         where = client.where
         try :
             del self._location(where)[client.uuid]
-            print "***Info: unregistered client for %s." % client.principal.title
+            info = "Unregistered client for %s." % client.principal.title
         except KeyError :
-            print "***Info: client already unregistered."
+            info = "Client already unregistered."
             
-        if not self.isOnline(client.principal.id) :
-            logout = LogoutEvent(who=client.principal.id, 
-                                            where=where, client=client)
+        logger.log(logging.INFO, info)
+        
+        who = client.principal.id
+        if not self.isOnline(who, where) :
+            logout = LogoutEvent(who=who, where=where, _client=client)
             # we use the zope event here since it's up the concrete
             # pages how they represent the online status of members
-            zope.event.notify(logout)    
+            zope.event.notify(logout)
+        else :
+            logger.log(logging.INFO, "%s is still online." % who)
     
     def getClientsFor(self, user_id, where=None) :
         """ Get clients for a specific user.
@@ -229,10 +244,10 @@
             online.add(client.principal.id)
         return sorted(online)
         
-    def isOnline(self, principal_id) :
+    def isOnline(self, principal_id, where=None) :
         """ Returns True iff the user is already online. """
         
-        for client in self._iterClients() :
+        for client in self._iterClients(where) :
             if client.principal.id == principal_id :
                 return True
         return False

Modified: zope3org/trunk/src/zorg/live/server.py
===================================================================
--- zope3org/trunk/src/zorg/live/server.py	2006-05-30 08:55:49 UTC (rev 68391)
+++ zope3org/trunk/src/zorg/live/server.py	2006-05-30 09:30:06 UTC (rev 68392)
@@ -15,7 +15,7 @@
 $Id: server.py 39651 2005-10-26 18:36:17Z oestermeier $
 """
 import doctest, unittest
-import time, cgi, os
+import time, cgi, os, logging
 
 from twisted.web2.channel.http import HTTPFactory
 from twisted.web2.wsgi import WSGIResource
@@ -41,6 +41,8 @@
 from zope.app import zapi
         
 from zorg.live.page.interfaces import ILivePageManager
+from zorg.live.page.interfaces import IIdleEvent
+
 from zorg.live.page.event import IdleEvent
 from zorg.live.page.event import ErrorEvent
 from zorg.live.page.event import ProgressEvent
@@ -48,6 +50,10 @@
 
 import interfaces
 
+
+logger = logging.getLogger('zorg.live.server')
+
+
 badRequest = object()
 securityInputLimit = 64000
 requestTimeOut = 5
@@ -120,12 +126,15 @@
             return None                 # indicates a bad request
         
         args = cgi.parse_qs(input)
-        print "Input", input, args
+        
         for k, v in args.items() :
             args[k] = v[0]
-        try :    
-            return dict2event(args)
+        try :
+            event = dict2event(args)
+            logger.log(logging.INFO,"Input %s" % (event))
+            return event
         except ComponentLookupError :
+            logger.warning("Cannot parse event %s" % (args))
             return None                     
             
         
@@ -224,8 +233,6 @@
                         ("Connection", "close"),
                         ('content-type', 'text/html;charset=utf-8'), 
                         ('content-length', len(output))]
-                    
-        print "***LivePage result", self.num, len(output), "bytes", self.uuid, headers
         
         self.startWSGIResponse('200 Ok', headers)
         self._returnOutput(output)
@@ -255,8 +262,12 @@
             
         event = client.nextEvent()
         if event is not None :
-            return self.returnResult(event.toJSON())
+            json = event.toJSON()
+            if not IIdleEvent.providedBy(event) :
+                logger.log(logging.INFO, "Sending... %s" % (json))
         
+            return self.returnResult(json)
+        
         if time.time() > self.expires :
             return self.returnResult(IdleEvent().toJSON())
         
@@ -348,9 +359,7 @@
                     
                     event = ProgressEvent(percent=percent)
                     manager = zapi.getUtility(ILivePageManager)
-                    print "addEvent", percent
                     manager.addEvent(event)
-                    print "added"
                     
             elif self.type == "input" :
                 if self.received_bytes > securityInputLimit :
@@ -433,6 +442,9 @@
 
     reactor.threadpool.adjustPoolsize(10, 20)
     
+#     manager = zapi.getUtility(ILivePageManager)
+#     manager.connect(db)
+    
     resource = WSGIPublisherApplication(db, factory=HTTPLivePageRequestFactory)
     resource = LivePageWSGIResource(resource)
     resource = LiveLogWrapperResource(resource)

Modified: zope3org/trunk/src/zorg/live/testing.py
===================================================================
--- zope3org/trunk/src/zorg/live/testing.py	2006-05-30 08:55:49 UTC (rev 68391)
+++ zope3org/trunk/src/zorg/live/testing.py	2006-05-30 09:30:06 UTC (rev 68392)
@@ -41,17 +41,25 @@
 
     implements(IKeyReference)
     
+    _objects = {}
+    
     def __init__(self, object) :
         self.object = object
-
+        if object not in self._objects :
+            self._objects[object] = len(self._objects)
+        self.id = self._objects[object]
+   
     def __call__(self) :
         return self.object
         
     def __hash__(self) :
-        return id(self.object)
+        return self.id
+        
+    def __cmp__(self, other):
+        return cmp(self.id, other.id)
+
     
-    
-
+   
 class TestUUIDGenerator(object) :
     """ A generator that produces always the same sequence of uuids for test
         purposes.
@@ -112,8 +120,7 @@
             
         """
         
-        url = zapi.absoluteURL(self.context, self.request) 
-        url += "/++resource++zorgajax"
+        url = "http://127.0.0.1/++resource++zorgajax"
 
         template = Template("""<html>
     <head>



More information about the Checkins mailing list