1 package autotest.tko;
2 
3 import autotest.common.JsonRpcCallback;
4 import autotest.common.SimpleCallback;
5 import autotest.common.StaticDataRepository;
6 import autotest.common.Utils;
7 import autotest.common.ui.TabView;
8 
9 import com.google.gwt.event.dom.client.BlurEvent;
10 import com.google.gwt.event.dom.client.BlurHandler;
11 import com.google.gwt.event.dom.client.ClickEvent;
12 import com.google.gwt.event.dom.client.ClickHandler;
13 import com.google.gwt.event.logical.shared.SelectionEvent;
14 import com.google.gwt.event.logical.shared.SelectionHandler;
15 import com.google.gwt.json.client.JSONArray;
16 import com.google.gwt.json.client.JSONObject;
17 import com.google.gwt.json.client.JSONString;
18 import com.google.gwt.json.client.JSONValue;
19 import com.google.gwt.user.client.ui.Button;
20 import com.google.gwt.user.client.ui.CheckBox;
21 import com.google.gwt.user.client.ui.HorizontalPanel;
22 import com.google.gwt.user.client.ui.ListBox;
23 import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
24 import com.google.gwt.user.client.ui.Panel;
25 import com.google.gwt.user.client.ui.SuggestBox;
26 import com.google.gwt.user.client.ui.SuggestOracle;
27 import com.google.gwt.user.client.ui.TextBox;
28 
29 import java.util.Arrays;
30 import java.util.HashMap;
31 import java.util.HashSet;
32 import java.util.Map;
33 import java.util.Set;
34 
35 public class ExistingGraphsFrontend extends GraphingFrontend {
36 
37     private CheckBox normalize = new CheckBox("Normalize Performance (allows multiple benchmarks" +
38                                               " on one graph)");
39     private MultiWordSuggestOracle oracle = new MultiWordSuggestOracle();
40     private TextBox hostname = new TextBox();
41     private SuggestBox hostnameSuggest = new SuggestBox(oracle, hostname);
42     private Panel benchmarkWrapper = new HorizontalPanel();
43     private TextBox kernel = new TextBox();
44     private JSONObject hostsAndTests = null;
45     private Button graphButton = new Button("Graph");
46 
47     private ListBox singleBenchmark = new ListBox(false);
48     private ListBox multiBenchmark = new ListBox(true);
49 
ExistingGraphsFrontend(final TabView parent)50     public ExistingGraphsFrontend(final TabView parent) {
51         normalize.addClickHandler(new ClickHandler() {
52             public void onClick(ClickEvent event) {
53                 normalizeClicked();
54             }
55         });
56 
57         hostnameSuggest.getTextBox().addBlurHandler(new BlurHandler() {
58             public void onBlur(BlurEvent event) {
59                 refreshTests();
60             }
61         });
62         hostnameSuggest.addSelectionHandler(new SelectionHandler<SuggestOracle.Suggestion>() {
63             public void onSelection(SelectionEvent<SuggestOracle.Suggestion> event) {
64                 refreshTests();
65             }
66         });
67 
68         addBenchmarkItem("(Please select a hostname first)");
69 
70         graphButton.addClickHandler(new ClickHandler() {
71             public void onClick(ClickEvent event) {
72                 parent.updateHistory();
73                 showGraph();
74             }
75         });
76 
77         kernel.setText("all");
78 
79         table.setWidget(0, 0, normalize);
80         table.getFlexCellFormatter().setColSpan(0, 0, 2);
81         benchmarkWrapper.add(singleBenchmark);
82         benchmarkWrapper.add(multiBenchmark);
83         multiBenchmark.setVisible(false);
84 
85         addControl("Hostname:", hostnameSuggest);
86         addControl("Benchmark:", benchmarkWrapper);
87         addControl("Kernel:", kernel);
88         table.setWidget(table.getRowCount(), 1, graphButton);
89 
90         table.getColumnFormatter().setWidth(0, "1px");
91 
92         initWidget(table);
93     }
94 
addBenchmarkItem(String item)95     private void addBenchmarkItem(String item) {
96         singleBenchmark.addItem(item);
97         multiBenchmark.addItem(item);
98     }
99 
getHostsAndTests(final SimpleCallback onFinished)100     private void getHostsAndTests(final SimpleCallback onFinished) {
101         setEnabled(false);
102         rpcProxy.rpcCall("get_hosts_and_tests", new JSONObject(), new JsonRpcCallback() {
103             @Override
104             public void onSuccess(JSONValue result) {
105                 hostsAndTests = result.isObject();
106                 onFinished.doCallback(null);
107                 setEnabled(true);
108             }
109         });
110     }
111 
112     @Override
refresh()113     public void refresh() {
114         getHostsAndTests(new SimpleCallback() {
115             public void doCallback(Object source) {
116                 oracle.clear();
117                 for (String host : hostsAndTests.keySet()) {
118                     oracle.add(host);
119                 }
120             }
121         });
122     }
123 
124     @Override
addToHistory(Map<String, String> args)125     public void addToHistory(Map<String, String> args) {
126         args.put("normalize", String.valueOf(normalize.getValue()));
127         args.put("hostname", hostname.getText());
128 
129         // Add the selected benchmarks
130         StringBuilder benchmarks = new StringBuilder();
131         ListBox benchmark = getVisibleBenchmark();
132         for (int i = 0; i < benchmark.getItemCount(); i++) {
133             if (benchmark.isItemSelected(i)) {
134                 benchmarks.append(benchmark.getValue(i));
135                 benchmarks.append(",");
136             }
137         }
138 
139         args.put("benchmark", benchmarks.toString());
140         args.put("kernel", kernel.getText());
141     }
142 
143     @Override
handleHistoryArguments(final Map<String, String> args)144     public void handleHistoryArguments(final Map<String, String> args) {
145         hostname.setText(args.get("hostname"));
146         normalize.setValue(Boolean.parseBoolean(args.get("normalize")));
147         normalizeClicked();
148         kernel.setText(args.get("kernel"));
149 
150         getHostsAndTests(new SimpleCallback() {
151             public void doCallback(Object source) {
152                 refreshTests();
153 
154                 ListBox benchmark = getVisibleBenchmark();
155                 Set<String> benchmarks =
156                     new HashSet<String>(Arrays.asList(args.get("benchmark").split(",")));
157                 for (int i = 0; i < benchmark.getItemCount(); i++) {
158                     benchmark.setItemSelected(i, benchmarks.contains(benchmark.getValue(i)));
159                 }
160             }
161         });
162     }
163 
getVisibleBenchmark()164     private ListBox getVisibleBenchmark() {
165         boolean multiVisible = normalize.getValue();
166         if (multiVisible) {
167             assert multiBenchmark.isVisible();
168             return multiBenchmark;
169         } else {
170             assert singleBenchmark.isVisible();
171             return singleBenchmark;
172         }
173     }
174 
175     @Override
addAdditionalEmbeddingParams(JSONObject params)176     protected void addAdditionalEmbeddingParams(JSONObject params) {
177         // No embedding
178     }
179 
180     // Change the state of the page based on the status of the "normalize" checkbox
normalizeClicked()181     private void normalizeClicked() {
182         boolean multiVisible = normalize.getValue();
183         ListBox dest;
184         ListBox src;
185 
186         if (multiVisible) {
187             dest = multiBenchmark;
188             src = singleBenchmark;
189         } else {
190             dest = singleBenchmark;
191             src = multiBenchmark;
192         }
193 
194         dest.setVisible(true);
195         src.setVisible(false);
196 
197         dest.setSelectedIndex(src.getSelectedIndex());
198         src.setSelectedIndex(-1);
199     }
200 
setEnabled(boolean enabled)201     private void setEnabled(boolean enabled) {
202         normalize.setEnabled(enabled);
203         hostname.setEnabled(enabled);
204         singleBenchmark.setEnabled(enabled);
205         multiBenchmark.setEnabled(enabled);
206         kernel.setEnabled(enabled);
207         graphButton.setEnabled(enabled);
208     }
209 
refreshTests()210     private void refreshTests() {
211         JSONValue value = hostsAndTests.get(hostnameSuggest.getText());
212         if (value == null) {
213             return;
214         }
215 
216         HashSet<String> selectedTests = new HashSet<String>();
217         ListBox benchmark = getVisibleBenchmark();
218         for (int i = 0; i < benchmark.getItemCount(); i++) {
219             if (benchmark.isItemSelected(i)) {
220                 selectedTests.add(benchmark.getValue(i));
221             }
222         }
223 
224         JSONArray tests = value.isObject().get("tests").isArray();
225         singleBenchmark.clear();
226         multiBenchmark.clear();
227         for (int i = 0; i < tests.size(); i++) {
228             String test = Utils.jsonToString(tests.get(i));
229             addBenchmarkItem(test);
230             if (selectedTests.contains(test)) {
231                 benchmark.setItemSelected(i, true);
232             }
233         }
234     }
235 
showGraph()236     private void showGraph() {
237         String hostnameStr = hostnameSuggest.getText();
238 
239         JSONValue value = hostsAndTests.get(hostnameStr);
240         if (value == null) {
241             return;
242         }
243 
244         String url;
245         HashMap<String, String> args = new HashMap<String, String>();
246         args.put("kernel", kernel.getText());
247 
248         if (normalize.getValue()) {
249             url = "/tko/machine_aggr.cgi?";
250             final JSONArray tests = new JSONArray();
251             for (int i = 0; i < multiBenchmark.getItemCount(); i++) {
252                 if (multiBenchmark.isItemSelected(i)) {
253                     tests.set(tests.size(), new JSONString(multiBenchmark.getValue(i)));
254                 }
255             }
256 
257             args.put("machine", hostnameStr);
258 
259             StringBuilder arg = new StringBuilder();
260             for (int i = 0; i < tests.size(); i++) {
261                 String test = Utils.jsonToString(tests.get(i));
262                 String key = getKey(test);
263                 if (i != 0) {
264                     arg.append(",");
265                 }
266                 arg.append(test);
267                 arg.append(":");
268                 arg.append(key);
269             }
270             args.put("benchmark_key", arg.toString());
271         } else {
272             int benchmarkIndex = singleBenchmark.getSelectedIndex();
273             if (benchmarkIndex == -1) {
274                 return;
275             }
276 
277             url = "/tko/machine_test_attribute_graph.cgi?";
278 
279             JSONObject hostObject = value.isObject();
280             String machine = Utils.jsonToString(hostObject.get("id"));
281             String benchmarkStr = singleBenchmark.getValue(benchmarkIndex);
282 
283             args.put("machine", machine);
284             args.put("benchmark", benchmarkStr);
285             args.put("key", getKey(benchmarkStr));
286         }
287         Utils.openUrlInNewWindow(url + Utils.encodeUrlArguments(args));
288     }
289 
getKey(String benchmark)290     private String getKey(String benchmark) {
291         JSONObject benchmarkKey =
292             StaticDataRepository.getRepository().getData("benchmark_key").isObject();
293         return Utils.jsonToString(benchmarkKey.get(benchmark.replaceAll("\\..*", "")));
294     }
295 
296     @Override
getFrontendId()297     public String getFrontendId() {
298         return "existing_graphs";
299     }
300 }
301