/
ServiceFinder.py
51 lines (41 loc) · 2.03 KB
/
ServiceFinder.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import simplejson
class ServiceFinder(object):
"""Mixin that provides service finding functionality on top of a pub-sub protocol."""
def findServices(self, announceServices, serviceHandler):
self._serviceHandler = serviceHandler
self._announceServices = {}
self._allServices = {}
for serviceEntry in announceServices:
if isinstance(serviceEntry, str):
self._announceServices[serviceEntry] = serviceEntry
else:
serviceName, serviceEvent = serviceEntry
self._announceServices[serviceName] = serviceEvent
self._startHandling()
def getAllServices(self):
return self._allServices
def _packMessageString(self):
msgStruct = [self._dispatcher._moduleName, self._announceServices]
return simplejson.dumps(msgStruct)
def _startHandling(self):
self.subscribeWithHandler('marco', self._marcoHandler)
self.subscribeWithHandler('polo', self._poloHandler)
self.publish('marco', self._packMessageString())
def _marcoHandler(self, event, data):
moduleName, newServices = simplejson.loads(data)
self._handleNewServices(newServices)
if moduleName != self._dispatcher._moduleName:
self.publish('polo', self._packMessageString())
def _poloHandler(self, event, data):
moduleName, newServices = simplejson.loads(data)
self._handleNewServices(newServices)
def _handleNewServices(self, newServices):
for serviceName, serviceEvent in newServices.iteritems():
if not (serviceName in self._allServices
and self._allServices[serviceName] == serviceEvent):
self._allServices[serviceName] = serviceEvent
self.handleService(serviceName, serviceEvent)
def handleService(self, serviceName, serviceEvent):
"""What to do when we hear about a new service."""
if self._serviceHandler != None:
self._serviceHandler(self, serviceName, serviceEvent)