|
What this is
Other links
The source code// $Header: /home/cvs/jakarta-jmeter/src/components/org/apache/jmeter/visualizers/StatVisualizer.java,v 1.17 2004/03/05 01:33:33 sebb Exp $ /* * Copyright 2002-2004 The Apache Software Foundation. * * 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 org.apache.jmeter.visualizers; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Arrays; import javax.swing.BoxLayout; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.border.Border; import javax.swing.border.EmptyBorder; import javax.swing.event.TableModelEvent; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableModel; import org.apache.jmeter.samplers.Clearable; import org.apache.jmeter.samplers.SampleResult; import org.apache.jmeter.testelement.TestElement; import org.apache.jmeter.util.JMeterUtils; import org.apache.jmeter.visualizers.gui.AbstractVisualizer; /** * Aggregrate Table-Based Reporting Visualizer for JMeter. Props to the people * who've done the other visualizers ahead of me (Stefano Mazzocchi), who I * borrowed code from to start me off (and much code may still exist). Thank * you! * * @version $Revision: 1.17 $ on $Date: 2004/03/05 01:33:33 $ */ public class StatVisualizer extends AbstractVisualizer implements AccumListener, Clearable { protected JTable myJTable; protected JScrollPane myScrollPane; transient private StatVisualizerModel model; transient private StatTableModel myStatTableModel; public StatVisualizer() { super(); model = new StatVisualizerModel(); model.addAccumListener(this); init(); } public String getLabelResource() { return "aggregate_report"; } public void add(SampleResult res) { model.addNewSample(res); } /** * Clears this visualizer and its model, and forces a repaint of the table. */ public void clear() { myStatTableModel.clear(); model.clear(); } public synchronized void updateGui(RunningSample s) { myStatTableModel.rowChanged(s.getIndex()); } // overrides AbstractVisualizer // forces GUI update after sample file has been read public TestElement createTestElement() { TestElement t = super.createTestElement(); //sleepTill = 0; return t; } /** * Main visualizer setup. */ private void init() { this.setLayout(new BorderLayout()); // MAIN PANEL JPanel mainPanel = new JPanel(); Border margin = new EmptyBorder(10, 10, 5, 10); mainPanel.setBorder(margin); mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); mainPanel.add(makeTitlePanel()); myStatTableModel = new StatTableModel(model); // SortFilterModel mySortedModel = // new SortFilterModel(myStatTableModel); myJTable = new JTable(myStatTableModel); myJTable.setPreferredScrollableViewportSize(new Dimension(500, 70)); myScrollPane = new JScrollPane(myJTable); this.add(mainPanel, BorderLayout.NORTH); this.add(myScrollPane, BorderLayout.CENTER); } /** * Class which implements the model for our main table in this * visualizer. * * @version $Revision: 1.17 $ */ class StatTableModel extends AbstractTableModel { private final String[] columnNames = { "URL", "Count", "Average", "Min", "Max", "Error%", "Rate" }; private final Class[] columnClasses = { String.class, Long.class, Long.class, Long.class, Long.class, String.class, String.class }; private final String TOTAL_LABEL = JMeterUtils.getResString("aggregate_report_total_label"); private transient StatVisualizerModel model; private int currentRowCount = 0; public StatTableModel(StatVisualizerModel model) { super(); this.model = model; } public void rowChanged(int index) { TableModelEvent event; // Create the table changed event, carefully handling the case // where the table grows beyond its current known size. synchronized (this) { if (index >= currentRowCount - 1) { event = new TableModelEvent( this, currentRowCount - 1, index, TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT); currentRowCount = index + 2; } else { event = new TableModelEvent(this, index); } } // Fire the event: fireTableChanged(event); // No matter which row changes, the totals row will have changed // too: fireTableChanged(new TableModelEvent(this, currentRowCount)); } public int getColumnCount() { return columnNames.length; } public int getRowCount() { currentRowCount = model.getRunningSampleCount() + 1; return currentRowCount; } public String getColumnName(int col) { return columnNames[col]; } public Object getValueAt(int row, int col) { RunningSample s; if (row == model.getRunningSampleCount()) { if (col == 0) { return TOTAL_LABEL; } s = model.getRunningSampleTotal(); } else { s = model.getRunningSample(row); } switch (col) { case 0: return s.getLabel(); case 1: return new Long(s.getNumSamples()); case 2: return new Long(s.getAverage()); case 3: return new Long(s.getMin()); case 4: return new Long(s.getMax()); case 5: return s.getErrorPercentageString(); case 6: return s.getRateString(); default: return "__ERROR__"; } } public Class getColumnClass(int c) { return columnClasses[c]; } public void clear() { fireTableDataChanged(); } } } /** * Pulled this mainly out of a Core Java book to implement a sorted table - * haven't implemented this yet, it needs some non-trivial work done to it to * support our dynamically-sizing TableModel for this visualizer. * * @version $Revision: 1.17 $ */ class SortFilterModel extends AbstractTableModel { private TableModel model; private int sortColumn; private Row[] rows; public SortFilterModel(TableModel m) { model = m; rows = new Row[model.getRowCount()]; for (int i = 0; i < rows.length; i++) { rows[i] = new Row(); rows[i].index = i; } } public SortFilterModel() { } public void setValueAt(Object aValue, int r, int c) { model.setValueAt(aValue, rows[r].index, c); } public Object getValueAt(int r, int c) { return model.getValueAt(rows[r].index, c); } public boolean isCellEditable(int r, int c) { return model.isCellEditable(rows[r].index, c); } public int getRowCount() { return model.getRowCount(); } public int getColumnCount() { return model.getColumnCount(); } public String getColumnName(int c) { return model.getColumnName(c); } public Class getColumnClass(int c) { return model.getColumnClass(c); } public void sort(int c) { sortColumn = c; Arrays.sort(rows); fireTableDataChanged(); } public void addMouseListener(final JTable table) { table.getTableHeader().addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent event) { if (event.getClickCount() < 2) { return; } int tableColumn = table.columnAtPoint(event.getPoint()); int modelColumn = table.convertColumnIndexToModel(tableColumn); sort(modelColumn); } }); } private class Row implements Comparable { public int index; public int compareTo(Object other) { Row otherRow = (Row) other; Object a = model.getValueAt(index, sortColumn); Object b = model.getValueAt(otherRow.index, sortColumn); if (a instanceof Comparable) { return ((Comparable) a).compareTo(b); } else { return index - otherRow.index; } } } } // class SortFilterModel |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.