|
JMeter example source code file (GraphAccum.java)
The JMeter GraphAccum.java source code/* * 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.jmeter.visualizers; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Point; import java.awt.Rectangle; import java.util.Iterator; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.Scrollable; import javax.swing.SwingUtilities; import org.apache.jmeter.samplers.SampleResult; import org.apache.jmeter.util.ColorHelper; import org.apache.jorphan.logging.LoggingManager; import org.apache.log.Logger; /** * Draws the graph. * * Created 2001/08/11 */ public class GraphAccum extends JComponent implements Scrollable, GraphAccumListener { private static final long serialVersionUID = 240L; private static final Logger log = LoggingManager.getLoggerForClass(); private GraphAccumModel model; private GraphAccumVisualizer visualizer; /** Ensure that the legends are only drawn once. */ private boolean noLegendYet = true; /** * Keep track of previous point. Needed to draw a line joining the previous * point with the current one. */ private Point[] previousPts; /** * Ensure that previousPts is allocated once only. It'll be reused at each * drawSample. It can't be allocated outside drawSample 'cos the sample is * only passed in here. */ private boolean previousPtsAlloc = false; protected final static int width = 2000; private final static int PLOT_X_WIDTH = 10; /** * Constructor. */ public GraphAccum() { log.debug("Start : GraphAnnum1"); log.debug("End : GraphAnnum1"); } /** * Constructor with model set. * * @param model * model which this object represents */ public GraphAccum(GraphAccumModel model) { this(); log.debug("Start : GraphAnnum2"); setModel(model); log.debug("End : GraphAnnum2"); } /** * Set model which this object represents. * * @param model * model which this object represents */ private void setModel(Object model) { log.debug("Start : setModel1"); this.model = (GraphAccumModel) model; this.model.addGraphAccumListener(this); repaint(); log.debug("End : setModel1"); } /** * Set the visualizer. * * @param visualizer * visualizer of this object */ public void setVisualizer(Object visualizer) { if (log.isDebugEnabled()) { log.debug("setVisualizer1 : Setting visualizer - " + visualizer); } this.visualizer = (GraphAccumVisualizer) visualizer; } /** * The legend is only printed once during sampling. This sets the variable * that indicates whether the legend has been printed yet or not. * * @param value * variable that indicates whether the legend has been printed * yet */ public void setNoLegendYet(boolean value) { noLegendYet = value; } /** * Gets the PreferredScrollableViewportSize attribute of the Graph object. * * @return the PreferredScrollableViewportSize value */ public Dimension getPreferredScrollableViewportSize() { return this.getPreferredSize(); } /** * Gets the ScrollableUnitIncrement attribute of the Graph object. * * @return the ScrollableUnitIncrement value */ public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) { return 5; } /** * Gets the ScrollableBlockIncrement attribute of the Graph object. * * @return the ScrollableBlockIncrement value */ public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) { return (int) (visibleRect.width * .9); } /** * Gets the ScrollableTracksViewportWidth attribute of the Graph object. * * @return the ScrollableTracksViewportWidth value */ public boolean getScrollableTracksViewportWidth() { return false; } /** * Gets the ScrollableTracksViewportHeight attribute of the Graph object. * * @return the ScrollableTracksViewportHeight value */ public boolean getScrollableTracksViewportHeight() { return true; } /** * The legend is only printed once during sampling. This returns the * variable that indicates whether the legend has been printed yet or not. * * @return value variable that indicates whether the legend has been printed * yet */ public boolean getNoLegendYet() { return noLegendYet; } /** * Redraws the gui. */ public void updateGui() { log.debug("Start : updateGui1"); repaint(); log.debug("End : updateGui1"); } /** * Redraws the gui if no rescaling of the graph is needed. * * @param oneSample * sample to be added */ public void updateGui(final SampleResult oneSample) { log.debug("Start : updateGui2"); final int xPos = model.getSampleCount(); SwingUtilities.invokeLater(new Runnable() { public void run() { Graphics g = getGraphics(); if (g != null) { drawSample(xPos * PLOT_X_WIDTH, oneSample, g); } } }); log.debug("End : updateGui2"); } /** {@inheritDoc}} */ @Override public void paintComponent(Graphics g) { super.paintComponent(g); log.debug("Start : paintComponent1"); synchronized (model.getList()) { // For repainting set this to false because all the points needs to // be redrawn so no need(shouldn't) use the previousPts. previousPtsAlloc = false; Iterator<SampleResult> e = model.getList().iterator(); for (int i = 0; e.hasNext(); i++) { SampleResult s = e.next(); drawSample(i * PLOT_X_WIDTH, s, g); } } log.debug("End : paintComponent1"); } /** * Clears this graph. */ public void clearData() { setNoLegendYet(true); ((JPanel) visualizer.getWhiteCanvas()).removeAll(); previousPts = null; } private void drawSample(int x, SampleResult oneSample, Graphics g) { log.debug("Start : drawSample1"); // Used to keep track of accumulated load times of components. int lastLevel = 0; // Number of components int compCount = 0; SampleResult[] resultList = oneSample.getSubResults(); int resultListCount = 0; // Allocate previousPts only the first time if (!previousPtsAlloc) { resultListCount += resultList.length; previousPts = new Point[resultListCount + 2]; } Color currColor = Color.black; JPanel lPanel = (JPanel) visualizer.getWhiteCanvas(); JPanel legendPanel = new JPanel(); GridBagLayout gridBag = new GridBagLayout(); GridBagConstraints gbc = new GridBagConstraints(); legendPanel.setLayout(gridBag); lPanel.add(legendPanel); Dimension d = this.getSize(); // Set the total time to load the sample long totalTime = oneSample.getTime(); // If the page has other components then set the total time to be that // including all its components' load time. if (log.isDebugEnabled()) { log.debug("drawSample1 : total time - " + totalTime); } int data = (int) (totalTime * d.height / model.getMax()); g.setColor(currColor); if (!previousPtsAlloc) { // If first dot, just draw the point. g.drawLine(x % width, d.height - data, x % width, d.height - data - 1); } else { // Otherwise, draw from previous point. g.drawLine((previousPts[0].x) % width, previousPts[0].y, x % width, d.height - data); } // Store current total time point previousPts[0] = new Point(x % width, d.height - data); if (noLegendYet) { gbc.gridx = 0; gbc.gridy = compCount++; gbc.anchor = GridBagConstraints.WEST; gbc.weightx = 1.0; gbc.insets = new Insets(0, 10, 0, 0); JLabel totalTimeLabel = new JLabel("Total time - " + oneSample.toString()); totalTimeLabel.setForeground(currColor); gridBag.setConstraints(totalTimeLabel, gbc); legendPanel.add(totalTimeLabel); } // Plot the time of the page itself without all its components if (log.isDebugEnabled()) { log.debug("drawSample1 : main page load time - " + oneSample.getTime()); } data = (int) (oneSample.getTime() * d.height / model.getMax()); currColor = ColorHelper.changeColorCyclicIncrement(currColor, 40); g.setColor(currColor); if (!previousPtsAlloc) { // If first dot, just draw the point g.drawLine(x % width, d.height - data, x % width, d.height - data - 1); } else { // Otherwise, draw from previous point g.drawLine((previousPts[1].x) % width, previousPts[1].y, x % width, d.height - data); } // Store load time without components previousPts[1] = new Point(x % width, d.height - data); if (noLegendYet) { gbc.gridx = 0; gbc.gridy = compCount++; gbc.anchor = GridBagConstraints.WEST; gbc.weightx = 1.0; gbc.insets = new Insets(0, 10, 0, 0); JLabel mainTimeLabel = new JLabel(oneSample.toString()); mainTimeLabel.setForeground(currColor); gridBag.setConstraints(mainTimeLabel, gbc); legendPanel.add(mainTimeLabel); } lastLevel += data; // Plot the times of the total times components int currPreviousPts = 2; if (resultList != null) { for (int i = 0; i < resultList.length; i++) { SampleResult componentRes = resultList[i]; if (log.isDebugEnabled()) { log.debug("drawSample1 : componentRes - " + componentRes.getSampleLabel() + " loading time - " + componentRes.getTime()); } data = (int) (componentRes.getTime() * d.height / model.getMax()); data += lastLevel; currColor = ColorHelper.changeColorCyclicIncrement(currColor, 100); g.setColor(currColor); if (!previousPtsAlloc) { // If first dot, just draw the point g.drawLine(x % width, d.height - data, x % width, d.height - data - 1); } else { // Otherwise, draw from previous point g.drawLine((previousPts[currPreviousPts].x) % width, previousPts[currPreviousPts].y, x % width, d.height - data); } // Store the current plot previousPts[currPreviousPts++] = new Point(x % width, d.height - data); if (noLegendYet) { gbc.gridx = 0; gbc.gridy = compCount++; gbc.anchor = GridBagConstraints.WEST; gbc.weightx = 1.0; gbc.insets = new Insets(0, 10, 0, 0); JLabel compTimeLabel = new JLabel(componentRes.getSampleLabel()); compTimeLabel.setForeground(currColor); gridBag.setConstraints(compTimeLabel, gbc); legendPanel.add(compTimeLabel); } lastLevel = data; } } if (noLegendYet) { noLegendYet = false; lPanel.repaint(); lPanel.revalidate(); } // Set the previousPtsAlloc to true here and not after allocation // because the rest of the codes also depend on previousPtsAlloc to be // false if first time plotting the graph i.e. there are no previous // points. if (!previousPtsAlloc) { previousPtsAlloc = true; } log.debug("End : drawSample1"); } } Other JMeter examples (source code examples)Here is a short list of links related to this JMeter GraphAccum.java source code file: |
... 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.