Java tutorial
/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.usergrid.chop.webapp.view.chart.layout; import java.util.Set; import com.vaadin.ui.Notification; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.apache.usergrid.chop.webapp.service.DataService; import org.apache.usergrid.chop.webapp.service.InjectorFactory; import org.apache.usergrid.chop.webapp.service.chart.Chart; import org.apache.usergrid.chop.webapp.service.chart.Params; import org.apache.usergrid.chop.webapp.service.chart.Params.FailureType; import org.apache.usergrid.chop.webapp.service.chart.Params.Metric; import org.apache.usergrid.chop.webapp.service.chart.builder.ChartBuilder; import org.apache.usergrid.chop.webapp.service.util.FileUtil; import org.apache.usergrid.chop.webapp.view.chart.format.Format; import org.apache.usergrid.chop.webapp.view.chart.layout.item.DetailsTable; import org.apache.usergrid.chop.webapp.view.chart.layout.item.NoteLayout; import org.apache.usergrid.chop.webapp.view.util.JavaScriptUtil; import org.apache.usergrid.chop.webapp.view.util.UIUtil; import com.vaadin.ui.AbsoluteLayout; import com.vaadin.ui.Button; import com.vaadin.ui.ComboBox; import com.vaadin.ui.FormLayout; import com.vaadin.ui.JavaScriptFunction; public class ChartLayout extends AbsoluteLayout implements JavaScriptFunction { private DataService dataService = InjectorFactory.getInstance(DataService.class); private final ChartBuilder chartBuilder; private final String chartFile; private final String chartId; protected final Params params; protected Button nextChartButton; protected ComboBox testNameCombo; protected ComboBox metricCombo; protected ComboBox percentileCombo; protected ComboBox failureCombo; protected DetailsTable detailsTable; protected NoteLayout noteLayout; public ChartLayout(ChartBuilder chartBuilder, String chartId, String chartFile, Params params) { this.chartBuilder = chartBuilder; this.chartId = chartId; this.chartFile = chartFile; this.params = params; init(); loadChart(); } private void init() { setSizeFull(); addItems(); populateTestNames(); } protected void addItems() { addParamsItems(); addChartItems(); addDetailsItems(); } protected void populateTestNames() { Set<String> testNames = dataService.getTestNames(params.getModuleId()); UIUtil.populateCombo(testNameCombo, testNames.toArray(new String[] {})); } private void addDetailsItems() { detailsTable = new DetailsTable(); addComponent(detailsTable, "left: 1010px; top: 25px;"); noteLayout = new NoteLayout(); addComponent(noteLayout, "left: 1010px; top: 400px;"); } private void addChartItems() { UIUtil.addLayout(this, chartId, "left: 270px; top: 20px;", "720px", "550px"); nextChartButton = new Button("..."); nextChartButton.setWidth("150px"); nextChartButton.setVisible(false); nextChartButton.addClickListener(new Button.ClickListener() { public void buttonClick(Button.ClickEvent event) { nextChartButtonClicked(); } }); addComponent(nextChartButton, "left: 565px; top: 580px;"); } protected void nextChartButtonClicked() { } protected void addParamsItems() { testNameCombo = UIUtil.createCombo("Test Name:", null); testNameCombo.setWidth("155px"); metricCombo = UIUtil.createCombo("Metric:", Metric.values()); metricCombo.setWidth("155px"); percentileCombo = UIUtil.createCombo("Percentile:", new String[] { "100", "90", "80", "70", "60", "50", "40", "30", "20", "10" }); percentileCombo.setWidth("155px"); failureCombo = UIUtil.createCombo("Points to Plot:", FailureType.values()); failureCombo.setWidth("155px"); Button submitButton = new Button("Submit"); submitButton.addClickListener(new Button.ClickListener() { public void buttonClick(Button.ClickEvent event) { loadChart(); } }); FormLayout formLayout = addFormLayout(); formLayout.addComponent(testNameCombo); formLayout.addComponent(metricCombo); formLayout.addComponent(percentileCombo); formLayout.addComponent(failureCombo); formLayout.addComponent(submitButton); } private FormLayout addFormLayout() { FormLayout formLayout = new FormLayout(); formLayout.setWidth("250px"); formLayout.setHeight("250px"); formLayout.addStyleName("outlined"); formLayout.setSpacing(true); addComponent(formLayout, "left: 10px; top: 10px;"); return formLayout; } protected Params getParams() { return new Params(params.getModuleId(), (String) testNameCombo.getValue(), params.getCommitId(), params.getRunNumber(), (Metric) metricCombo.getValue(), Integer.parseInt((String) percentileCombo.getValue()), (FailureType) failureCombo.getValue()); } public void loadChart() { Params params = getParams(); if (params.getTestName() == null) { Notification.show("Warning", "You don't have run results yet !!!", Notification.Type.WARNING_MESSAGE); return; } // BUG: If common.js is loaded separately its content is not visible later String chartContent = FileUtil.getContent("js/common.js") + FileUtil.getContent(chartFile); Chart chart = chartBuilder.getChart(getParams()); chartContent = chartContent.replace("$categories", Format.formatCategories(chart.getCategories())); chartContent = chartContent.replace("$points", Format.formatPoints(chart.getSeries())); chartContent = chartContent.replace("$data", Format.formatData(chart.getSeries())); JavaScriptUtil.loadChart(chartContent, "chartCallback", this); } @Override public void call(JSONArray args) throws JSONException { JSONObject json = args.getJSONObject(0); pointClicked(json); } protected void pointClicked(JSONObject json) throws JSONException { params.setCommitId(json.optString("commitId")); params.setRunNumber(json.optInt("runNumber", 0)); detailsTable.setContent(json); noteLayout.load(params.getCommitId(), params.getRunNumber()); } }