added dot language for observer
[p2prfd.git] / observer.py
blob16d3588f53a09cac6d69e46dc38514f607acbbbf
1 import cgi
2 import hashlib
3 import http_helper
4 import httplib
5 import random
6 import socket
7 import sys
8 import threading
9 import urllib
10 import urlparse
12 import twisted.internet.reactor
13 import twisted.web.resource
14 import twisted.web.server
16 import entangled_network
18 class ObserverResource(twisted.web.resource.Resource):
19 isLeaf = True
20 trees = {}
21 last_name = 0
22 names = {}
23 def node_pic(self, node, tree):
24 if node:
25 name = self.names[node]
26 retu = name
27 left_node = None
28 right_node = None
29 if node in tree['child_left']: left_node = tree['child_left'][node]
30 if node in tree['child_right']: right_node = tree['child_right'][node]
31 left_pic = self.node_pic(left_node, tree)
32 right_pic = self.node_pic(right_node, tree)
33 lefts = left_pic.split('\n')
34 retu += '-' + lefts[0] + '\n'
35 for line in lefts[1:]:
36 retu += ' |' + line + '\n'
37 pass
38 rights = right_pic.split('\n')
39 retu += ' -' + rights[0] + '\n'
40 for line in rights[1:]:
41 retu += ' ' + line + '\n'
42 pass
43 return retu
44 else:
45 return '00'
46 pass
47 def node_dot(self, node, tree):
48 retu = ''
49 if node in tree['child_left']:
50 left_node = tree['child_left'][node]
51 retu += self.names[node] + ' -> ' + self.names[left_node] + ';\n'
52 retu += self.node_dot(left_node, tree)
53 if node in tree['child_right']:
54 right_node = tree['child_right'][node]
55 retu += self.names[node] + ' -> ' + self.names[right_node] + ';\n'
56 retu += self.node_dot(right_node, tree)
57 return retu
58 def tree_pic_dot(self, tree):
59 root = tree['root']
60 retu = 'digraph p2prfd {\n'
61 retu += self.names[root] + ';\n'
62 retu += self.node_dot(root, tree)
63 retu += '}\n'
64 return retu
65 pass
66 def tree_pic(self, tree):
67 root = tree['root']
68 return self.node_pic(root, tree)
69 pass
70 def add_name(self, node):
71 if node and not (node in self.names):
72 self.last_name += 1
73 self.names[node] = '%02d' % self.last_name
74 pass
75 def render_GET(self, request):
76 queries = request.args
77 request.responseHeaders.setRawHeaders('content-type', ['text/plain'])
78 print 'queries = %s' % repr(queries)
79 action = None
80 if 'action' in queries: action = queries['action'][0]
81 if action == 'new_root':
82 feed_url = queries['rss'][0]
83 root = eval(queries['root'][0])
84 self.add_name(root)
85 if feed_url in self.trees:
86 pass
87 else:
88 self.trees[feed_url] = {'root': None, 'child_left': {}, 'child_right': {}}
89 self.trees[feed_url]['root'] = root
90 pass
91 elif action == 'adopt_child':
92 parent = eval(queries['parent'][0]);
93 child = eval(queries['child'][0]);
94 feed_url = queries['rss'][0]
95 loc = queries['loc'][0]
96 self.add_name(parent)
97 self.add_name(child)
98 if loc == 'left':
99 self.trees[feed_url]['child_left'][parent] = child
100 pass
101 elif loc == 'right':
102 self.trees[feed_url]['child_right'][parent] = child
103 pass
104 pass
105 else:
106 rss = None
107 if 'rss' in queries: rss = queries['rss'][0]
108 if rss:
109 if rss in self.trees:
110 if 'type' in queries:
111 return self.tree_pic_dot(self.trees[rss])
112 else:
113 return self.tree_pic(self.trees[rss])
114 else: return 'tree for %s not found' % rss
115 pass
116 result = {}
117 return repr(result)
118 pass
119 rsrc = ObserverResource()
120 site = twisted.web.server.Site(rsrc)
121 twisted.internet.reactor.listenTCP(9501, site)
122 twisted.internet.reactor.run()