[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