summaryrefslogtreecommitdiff
path: root/examples/console/JSONComponent/jsoncomponent.py
blob: 62e81a009f62625c678e2c728a94c7810cda1aea (plain)
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
from Component import Component, ServletComponent
from json import jsonToObj, objToJson
from paste import httpexceptions
from cStringIO import StringIO
import traceback
from paste import wsgilib

class JSONServletComponent(ServletComponent):

    _servletMethods = ['jsonaction', 'jsonjs']

    def __init__(self, jsolaitURL='jsolait',
                 libURL='',
                 baseConfig=None,
                 jsonMethods=()):
        self.baseConfig = baseConfig
        self.jsolaitURL = jsolaitURL
        self.libURL = libURL
        self._declaredJsonMethods = list(jsonMethods)

    def actions(self):
        return ['jsonaction']

    def jsonMethods(self):
        all_methods = self._declaredJsonMethods[:]
        all_methods.extend(self.optionalMethod('jsonMethods', []))
        return all_methods

    def jsonaction(self):
        request_body = self.servlet().request().rawInput().read()
        req_data = jsonToObj(request_body)
        req_id = req_data['id']
        try:
            method_name = req_data['method']
            if method_name not in self.jsonMethods():
                raise HTTPForbidden(
                    "The method %s is not public" % method_name)
            method = getattr(self.servlet(), method_name)
            result = method(*req_data['params'])
            json_res = {'id': req_id, 'result': result, 'error': None}
            json_res = objToJson(json_res)
        except Exception, e:
            if isinstance(e, httpexceptions.HTTPException):
                raise
            out = StringIO()
            # @@: I should also report this error
            traceback.print_exc(file=out)
            json_res = {'id': req_id, 'result': None,
                        'error': out.getvalue()}
            json_res = objToJson(json_res)
        self.servlet().response().write(json_res)
        self.servlet().setView(None)

    def jsonjs(self):
        env = self.servlet().request().environ()
        jsolaitURL = self.jsolaitURL
        lib = self.libURL
        here = wsgilib.construct_url(env, False)
        here += '?_action_=jsonaction';
        if self.baseConfig:
            app_base = env['%s.base_url' % self.baseConfig]
            if not jsolaitURL.startswith('/'):
                jsolaitURL = app_base + '/' + jsolaitURL
            if not lib.startswith('/'):
                lib = app_base + '/' + lib
        text = (r'''
        <script type="text/javascript" src="%(jsolaitURL)s/init.js"></script>
        <script type="text/javascript">
        jsolait.baseURL = "%(lib)s";
        jsolait.libURL = "%(jsolaitURL)s";
        </script>
        <script type="text/javascript" src="%(jsolaitURL)s/lib/urllib.js"></script>
        <script type="text/javascript" src="%(jsolaitURL)s/lib/jsonrpc.js"></script>
        <script type="text/javascript" src="%(jsolaitURL)s/lib/lang.js"></script>
        <script type="text/javascript">
        jsonrpc = importModule("jsonrpc");
        var servlet = new jsonrpc.ServiceProxy(%(here)r, %(methods)r);
        </script>
        '''
            % {'jsolaitURL': jsolaitURL,
               'lib': lib,
               'here': here,
               'methods': self.jsonMethods()})
        return text

class JSONComponent(Component):
    _componentClass = JSONServletComponent

"""
        <script type="text/javascript" src="%(jsolaitURL)s/lib/jsolait.js"></script>
        <script type="text/javascript">
        //jsolait = importModule("jsolait");
        //jsolait.baseURL = %jsolaitURLr;
        //jsolait.libURL = %(lib)r;
        </script>
"""