1#!/usr/bin/env python
2#
3# Copyright 2013 The Chromium Authors. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
7import json
8import sys
9from string import Template
10
11
12_HTML_TEMPLATE = """<!DOCTYPE html>
13<script src="https://www.google.com/jsapi"></script>
14<script>
15var all_data = $ALL_DATA;
16google.load('visualization', '1', {packages:['corechart', 'table']});
17google.setOnLoadCallback(drawVisualization);
18function drawVisualization() {
19  // Apply policy 'l2' by default.
20  var default_policy = '$DEF_POLICY';
21  document.getElementById(default_policy).style.fontWeight = 'bold';
22  turnOn(default_policy);
23}
24
25function turnOn(policy) {
26  var data = google.visualization.arrayToDataTable(all_data[policy]);
27  var charOptions = {
28    title: 'DMP Graph (Policy: ' + policy + ')',
29    hAxis: {title: 'Timestamp',  titleTextStyle: {color: 'red'}},
30    isStacked : true
31  };
32  var chart = new google.visualization.AreaChart(
33      document.getElementById('chart_div'));
34  chart.draw(data, charOptions);
35  var table = new google.visualization.Table(
36      document.getElementById('table_div'));
37  table.draw(data);
38}
39
40window.onload = function() {
41  var ul = document.getElementById('policies');
42  for (var i = 0; i < ul.children.length; ++i) {
43    var li = ul.children[i];
44    li.onclick = function() {
45      for (var j = 0; j < ul.children.length; ++j) {
46        var my_li = ul.children[j];
47        my_li.style.fontWeight = 'normal';
48      }
49      this.style.fontWeight = 'bold';
50      turnOn(this.id);
51    }
52  }
53};
54</script>
55<style>
56#policies li {
57  display: inline-block;
58  padding: 5px 10px;
59}
60</style>
61Click to change an applied policy.
62<ul id="policies">$POLICIES</ul>
63<div id="chart_div" style="width: 1024px; height: 640px;"></div>
64<div id="table_div" style="width: 1024px; height: 640px;"></div>
65"""
66
67def _GenerateGraph(json_data):
68  policies = list(json_data['policies'])
69
70  default_policy = "l2"
71  if default_policy not in policies:
72    default_policy = policies[0]
73
74  policies = "".join(map(lambda x: '<li id="'+x+'">'+x+'</li>', policies))
75
76  all_data = {}
77  for policy in json_data['policies']:
78    legends = list(json_data['policies'][policy]['legends'])
79    legends = ['second'] + legends[legends.index('FROM_HERE_FOR_TOTAL') + 1:
80                                     legends.index('UNTIL_HERE_FOR_TOTAL')]
81    data = []
82    for snapshot in json_data['policies'][policy]['snapshots']:
83      data.append([0] * len(legends))
84      for k, v in snapshot.iteritems():
85        if k in legends:
86          data[-1][legends.index(k)] = v
87    all_data[policy] = [legends] + data
88
89  print Template(_HTML_TEMPLATE).safe_substitute(
90      {'POLICIES': policies,
91       'DEF_POLICY': default_policy,
92       'ALL_DATA': json.dumps(all_data)})
93
94
95def main(argv):
96  _GenerateGraph(json.load(file(argv[1], 'r')))
97
98
99if __name__ == '__main__':
100  sys.exit(main(sys.argv))
101