/**
* Copyright Plugtree LLC
*
* Licensed 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 com.plugtree.solrmeter.view;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileNotFoundException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.apache.log4j.Logger;
import com.google.inject.Inject;
import com.plugtree.stressTestScope.StressTestScope;
import com.plugtree.solrmeter.controller.QueryExecutorController;
import com.plugtree.solrmeter.model.FileUtils;
import com.plugtree.solrmeter.model.QueryExecutor;
import com.plugtree.solrmeter.model.SolrMeterConfiguration;
import com.plugtree.solrmeter.model.SolrServerRegistry;
import com.plugtree.solrmeter.model.operation.PingOperation;
import com.plugtree.solrmeter.model.statistic.OperationRateStatistic;
import com.plugtree.solrmeter.model.statistic.SimpleQueryStatistic;
import com.plugtree.solrmeter.view.component.InfoPanel;
import com.plugtree.solrmeter.view.component.RoundedBorderJPanel;
import com.plugtree.solrmeter.view.component.SolrConnectedButton;
import com.plugtree.solrmeter.view.component.SpinnerPanel;
/**
* Main Queries Panel
* @author tflobbe
*
*/
@StressTestScope
public class QueryConsolePanel extends RoundedBorderJPanel implements ConsolePanel {
private static final long serialVersionUID = 1376883703280500293L;
private static final int MAX_CONCURRENT_QUERIES = Integer.MAX_VALUE;
private SimpleQueryStatistic simpleQueryStatistic;
private OperationRateStatistic operationRateStatistic;
private QueryExecutorController controller;
private QueryExecutor queryExecutor;
private InfoPanel totalQueries;
private InfoPanel totalQueryTime;
private InfoPanel averageQueryTime;
private InfoPanel totalClientTime;
private InfoPanel averageClientTime;
private InfoPanel totalErrors;
private InfoPanel startedAt;
private InfoPanel actualQueryRate;
private SpinnerPanel concurrentQueries;
private SolrConnectedButton startButton;
private JButton stopButton;
@Inject
public QueryConsolePanel(QueryExecutorController controller,
SimpleQueryStatistic simpleQueryStatistic,
OperationRateStatistic operationRateStatistic,
QueryExecutor queryExecutor) {
super(I18n.get("queryConsolePanel.title"));
this.simpleQueryStatistic = simpleQueryStatistic;
this.operationRateStatistic = operationRateStatistic;
this.controller = controller;
this.queryExecutor = queryExecutor;
this.initGUI();
}
private void initGUI() {
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
totalQueries = new InfoPanel(I18n.get("queryConsolePanel.totalQueries"), "0");
this.add(totalQueries);
totalQueryTime = new InfoPanel(I18n.get("queryConsolePanel.totalQueryTime"), "0");
this.add(totalQueryTime);
averageQueryTime = new InfoPanel(I18n.get("queryConsolePanel.averageQueryTime"), "0");
this.add(averageQueryTime);
totalClientTime = new InfoPanel(I18n.get("queryConsolePanel.totalClientTime"), "0");
this.add(totalClientTime);
averageClientTime = new InfoPanel(I18n.get("queryConsolePanel.averageClientTime"), "0");
this.add(averageClientTime);
startedAt = new InfoPanel(I18n.get("queryConsolePanel.startedAt"), "-");
this.add(startedAt);
totalErrors = new InfoPanel(I18n.get("queryConsolePanel.totalErrors"), "0");
this.add(totalErrors);
this.add(this.getCurrentQueriesSpinner());
actualQueryRate = new InfoPanel(I18n.get("queryConsolePanel.actualQueriesPerMinute"), "-");
this.add(actualQueryRate);
this.add(Box.createVerticalGlue());
try {
startButton = new SolrConnectedButton(new ImageIcon(FileUtils.findFileAsResource("./images/play.png")), new ImageIcon(FileUtils.findFileAsResource("./images/play-nc.png")), I18n.get("queryConsolePanel.pingFailing"), this.createPingOperation());
} catch (FileNotFoundException e1) {
Logger.getLogger(this.getClass()).error("play.png not found, using text button");
startButton = new SolrConnectedButton(I18n.get("queryConsolePanel.start"), I18n.get("queryConsolePanel.pingFailing"), this.createPingOperation());
}
startButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
controller.onStart();
}
});
try {
stopButton = new JButton(new ImageIcon(FileUtils.findFileAsResource("./images/stop.png")));
} catch (FileNotFoundException e1) {
Logger.getLogger(this.getClass()).error("stop.png not found, using text button");
stopButton = new JButton(I18n.get("queryConsolePanel.stop"));
}
stopButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
controller.onStop();
}
});
JPanel auxiliarPanel = new JPanel();
auxiliarPanel.setLayout(new BoxLayout(auxiliarPanel, BoxLayout.X_AXIS));
auxiliarPanel.add(startButton);
auxiliarPanel.add(stopButton);
this.add(auxiliarPanel);
stopped();
}
private PingOperation createPingOperation() {
PingOperation operation = new PingOperation(SolrServerRegistry.getSolrServer(SolrMeterConfiguration.getProperty(SolrMeterConfiguration.SOLR_SEARCH_URL)));
return operation;
}
private Component getCurrentQueriesSpinner() {
concurrentQueries = new SpinnerPanel(1, 1, MAX_CONCURRENT_QUERIES, 1, I18n.get("queryConsolePanel.queriesPerSecond"));
concurrentQueries.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
controller.onConcurrentQueriesValueChange(concurrentQueries.getValue());
}
});
concurrentQueries.setValue(queryExecutor.getQueriesPerSecond());
return concurrentQueries;
}
public void refreshView() {
concurrentQueries.setValue(queryExecutor.getQueriesPerSecond());
totalQueries.setValue(String.valueOf(simpleQueryStatistic.getTotalQueries()));
totalQueryTime.setValue(String.valueOf(simpleQueryStatistic.getTotalQTime()));
totalClientTime.setValue(String.valueOf(simpleQueryStatistic.getTotalClientTime()));
totalErrors.setValue(String.valueOf(simpleQueryStatistic.getTotalErrors()));
if(simpleQueryStatistic.getTotalQueries() != 0) {
averageQueryTime.setValue(String.valueOf(simpleQueryStatistic.getAverageQueryTime()));
averageClientTime.setValue(String.valueOf(simpleQueryStatistic.getAverageClientTime()));
}
actualQueryRate.setValue(String.valueOf(operationRateStatistic.getQueryRate()));
}
public void started() {
stopButton.setEnabled(true);
startButton.setEnabled(false);
startedAt.setValue(SimpleDateFormat.getInstance().format(new Date()));
}
public void stopped() {
stopButton.setEnabled(false);
startButton.setEnabled(true);
}
@Inject
public void setController(QueryExecutorController controller) {
this.controller = controller;
}
}