- add sources.
[platform/framework/web/crosswalk.git] / src / tools / deep_memory_profiler / visualizer / app.py
1 # Copyright 2013 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
4
5 # This file is expected to be used under another directory to use,
6 # so we disable checking import path of GAE tools from this directory.
7 # pylint: disable=F0401,E0611,W0232
8
9 import jinja2
10 import json
11 import os
12 import re
13 import urllib
14 import webapp2
15
16 from google.appengine.ext import blobstore
17 from google.appengine.ext.webapp import blobstore_handlers
18
19 import services
20
21
22 JINJA_ENVIRONMENT = jinja2.Environment(
23   loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
24   extensions=['jinja2.ext.autoescape'])
25
26
27 class MainPage(webapp2.RequestHandler):
28   """Show breakdown with received profiler-id and template-id. If nothing was
29   received, show blank page waiting user to upload file."""
30   def get(self):
31     page_template = JINJA_ENVIRONMENT.get_template('index.html')
32     upload_url = blobstore.create_upload_url('/upload')
33
34     # Get profiler id and template id from url query.
35     run_id = self.request.get('run_id')
36     tmpl_id = self.request.get('tmpl_id')
37     upload_msg = self.request.get('upload_msg')
38
39     template_values = {
40       'upload_url': upload_url,
41       'upload_msg': upload_msg
42     }
43
44     if run_id and tmpl_id:
45       template_values['json'] = services.GetProfiler(run_id)
46       template_values['template'] = services.GetTemplate(tmpl_id)
47
48     self.response.write(page_template.render(template_values))
49
50
51 class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
52   """Handle file uploading with BlobstoreUploadHandler. BlobstoreUploadHandler
53   can deal with files overweighing size limitation within one HTTP connection so
54   that user can upload large json file."""
55   def post(self):
56     blob_info = self.get_uploads('file')[0]
57
58     run_id = services.CreateProfiler(blob_info)
59     default_key = services.CreateTemplates(blob_info)
60
61     # TODO(junjianx): Validation of uploaded file should be done separately.
62     if not default_key:
63       # Jump to home page with error message.
64       req_params = {
65         'upload_msg': 'No default_template key was found.'
66       }
67     else:
68       # Jump to new graph page using default template.
69       req_params = {
70         'run_id': run_id,
71         'tmpl_id': default_key.urlsafe()
72       }
73
74     self.redirect('/?' + urllib.urlencode(req_params))
75
76
77 class ShareHandler(webapp2.RequestHandler):
78   """Handle breakdown template sharing. Generate public url for transferred
79   template and return it back."""
80   def post(self):
81     run_id = self.request.POST['run_id']
82     content = json.loads(self.request.POST['content'])
83     tmpl_key = services.CreateTemplate(content)
84
85     req_params = {
86       'run_id': run_id,
87       'tmpl_id': tmpl_key.urlsafe()
88     }
89
90     # Take out host url from request by removing share suffix.
91     url = re.sub('share', '', self.request.url)
92     self.response.write(url + '?' + urllib.urlencode(req_params))
93
94
95 application = webapp2.WSGIApplication([
96   ('/', MainPage),
97   ('/upload', UploadHandler),
98   ('/share', ShareHandler)
99 ], debug=True)