/*
* 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() );
}
}