You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jmeter-dev@jakarta.apache.org by wo...@apache.org on 2005/08/27 05:40:45 UTC
cvs commit: jakarta-jmeter/src/reports/org/apache/jmeter/gui/util ReportMenuBar.java
woolfel 2005/08/26 20:40:45
Modified: src/reports/org/apache/jmeter/report/gui/action
ReportSaveGraphics.java ReportCopy.java
ReportCheckDirty.java ReportActionRouter.java
ReportClose.java ReportDragNDrop.java
ReportCut.java ReportPaste.java ReportStart.java
src/reports/org/apache/jmeter/gui ReportGuiPackage.java
ReportMainFrame.java
src/reports/org/apache/jmeter/report/gui/tree
ReportTreeNode.java ReportTreeModel.java
ReportTreeListener.java
src/reports/org/apache/jmeter JMeterReport.java
Added: src/reports/org/apache/jmeter/report/gui/action
AbstractAction.java
src/reports/org/apache/jmeter/report/engine
ValueReplacer.java
src/reports/org/apache/jmeter/gui/util ReportMenuBar.java
Log:
made a bunch of updates and changes. the GUI has basic functionality now
making steady progress
peter lin
Revision Changes Path
1.2 +4 -4 jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportSaveGraphics.java
Index: ReportSaveGraphics.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportSaveGraphics.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ReportSaveGraphics.java 25 Aug 2005 22:35:06 -0000 1.1
+++ ReportSaveGraphics.java 27 Aug 2005 03:40:45 -0000 1.2
@@ -28,7 +28,7 @@
import org.apache.jmeter.exceptions.IllegalUserActionException;
import org.apache.jmeter.gui.action.Command;
import org.apache.jmeter.gui.JMeterGUIComponent;
-import org.apache.jmeter.gui.GuiPackage;
+import org.apache.jmeter.gui.ReportGuiPackage;
import org.apache.jmeter.gui.util.FileDialoger;
import org.apache.jmeter.save.SaveGraphicsService;
import org.apache.jmeter.visualizers.Printable;
@@ -77,13 +77,13 @@
throw new IllegalUserActionException("Invalid user command:" + e.getActionCommand());
}
if (e.getActionCommand().equals(SAVE_GRAPHICS)) {
- component = GuiPackage.getInstance().getCurrentGui();
+ component = ReportGuiPackage.getInstance().getCurrentGui();
// get the JComponent from the visualizer
if (component instanceof Printable) {
comp = ((Printable) component).getPrintableComponent();
String filename;
- JFileChooser chooser = FileDialoger.promptToSaveFile(GuiPackage.getInstance().getTreeListener()
+ JFileChooser chooser = FileDialoger.promptToSaveFile(ReportGuiPackage.getInstance().getTreeListener()
.getCurrentNode().getName(), extensions);
if (chooser == null) {
return;
1.2 +2 -2 jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportCopy.java
Index: ReportCopy.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportCopy.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ReportCopy.java 17 Aug 2005 04:22:29 -0000 1.1
+++ ReportCopy.java 27 Aug 2005 03:40:45 -0000 1.2
@@ -23,7 +23,7 @@
import java.util.Set;
import org.apache.jmeter.gui.ReportGuiPackage;
-import org.apache.jmeter.gui.action.AbstractAction;
+import org.apache.jmeter.report.gui.action.AbstractAction;
import org.apache.jmeter.report.gui.tree.ReportTreeListener;
import org.apache.jmeter.report.gui.tree.ReportTreeNode;
import org.apache.jmeter.testelement.TestElement;
1.2 +2 -2 jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportCheckDirty.java
Index: ReportCheckDirty.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportCheckDirty.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ReportCheckDirty.java 17 Aug 2005 04:22:32 -0000 1.1
+++ ReportCheckDirty.java 27 Aug 2005 03:40:45 -0000 1.2
@@ -25,7 +25,7 @@
import java.util.Set;
import org.apache.jmeter.gui.ReportGuiPackage;
-import org.apache.jmeter.gui.action.AbstractAction;
+import org.apache.jmeter.report.gui.action.AbstractAction;
import org.apache.jmeter.report.gui.action.ReportActionRouter;
import org.apache.jmeter.gui.action.Command;
import org.apache.jmeter.report.gui.action.ReportExitCommand;
1.2 +2 -2 jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportActionRouter.java
Index: ReportActionRouter.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportActionRouter.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ReportActionRouter.java 17 Aug 2005 04:22:30 -0000 1.1
+++ ReportActionRouter.java 27 Aug 2005 03:40:45 -0000 1.2
@@ -268,7 +268,7 @@
while (iterClasses.hasNext()) {
String strClassName = (String) iterClasses.next();
if (strClassName.startsWith("org.apache.jmeter.report.gui.action")) {
- log.info("classname:: " + strClassName);
+ // log.info("classname:: " + strClassName);
commandClass = Class.forName(strClassName);
if (!Modifier.isAbstract(commandClass.getModifiers())) {
command = (Command) commandClass.newInstance();
1.2 +3 -3 jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportClose.java
Index: ReportClose.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportClose.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ReportClose.java 17 Aug 2005 04:22:30 -0000 1.1
+++ ReportClose.java 27 Aug 2005 03:40:45 -0000 1.2
@@ -24,7 +24,7 @@
import javax.swing.JOptionPane;
import org.apache.jmeter.gui.ReportGuiPackage;
-import org.apache.jmeter.gui.action.ActionRouter;
+import org.apache.jmeter.report.gui.action.ReportActionRouter;
import org.apache.jmeter.gui.action.CheckDirty;
import org.apache.jmeter.gui.action.Command;
import org.apache.jmeter.gui.action.Save;
@@ -66,7 +66,7 @@
* the generic UI action event
*/
public void doAction(ActionEvent e) {
- ActionRouter.getInstance().doActionNow(
+ ReportActionRouter.getInstance().doActionNow(
new ActionEvent(e.getSource(), e.getID(),
ReportCheckDirty.CHECK_DIRTY));
ReportGuiPackage guiPackage = ReportGuiPackage.getInstance();
1.2 +2 -2 jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportDragNDrop.java
Index: ReportDragNDrop.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportDragNDrop.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ReportDragNDrop.java 17 Aug 2005 04:22:33 -0000 1.1
+++ ReportDragNDrop.java 27 Aug 2005 03:40:45 -0000 1.2
@@ -23,7 +23,7 @@
import org.apache.jmeter.control.Controller;
import org.apache.jmeter.gui.ReportGuiPackage;
-import org.apache.jmeter.gui.action.AbstractAction;
+import org.apache.jmeter.report.gui.action.AbstractAction;
import org.apache.jmeter.gui.action.Command;
import org.apache.jmeter.report.gui.tree.ReportTreeListener;
import org.apache.jmeter.report.gui.tree.ReportTreeNode;
1.2 +2 -2 jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportCut.java
Index: ReportCut.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportCut.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ReportCut.java 17 Aug 2005 04:22:34 -0000 1.1
+++ ReportCut.java 27 Aug 2005 03:40:45 -0000 1.2
@@ -22,7 +22,7 @@
import java.util.Set;
import org.apache.jmeter.gui.ReportGuiPackage;
-import org.apache.jmeter.gui.action.AbstractAction;
+import org.apache.jmeter.report.gui.action.AbstractAction;
import org.apache.jmeter.gui.action.Command;
import org.apache.jmeter.report.gui.tree.ReportTreeNode;
1.2 +3 -3 jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportPaste.java
Index: ReportPaste.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportPaste.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ReportPaste.java 25 Aug 2005 22:35:06 -0000 1.1
+++ ReportPaste.java 27 Aug 2005 03:40:45 -0000 1.2
@@ -23,7 +23,7 @@
import java.util.Set;
import org.apache.jmeter.gui.ReportGuiPackage;
-import org.apache.jmeter.gui.action.AbstractAction;
+import org.apache.jmeter.report.gui.action.AbstractAction;
import org.apache.jmeter.report.gui.tree.ReportTreeListener;
import org.apache.jmeter.report.gui.tree.ReportTreeNode;
1.2 +3 -3 jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportStart.java
Index: ReportStart.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/ReportStart.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ReportStart.java 25 Aug 2005 22:35:06 -0000 1.1
+++ ReportStart.java 27 Aug 2005 03:40:45 -0000 1.2
@@ -25,7 +25,7 @@
import javax.swing.JOptionPane;
import org.apache.jmeter.engine.StandardJMeterEngine;
-import org.apache.jmeter.gui.action.AbstractAction;
+import org.apache.jmeter.report.gui.action.AbstractAction;
import org.apache.jmeter.gui.ReportGuiPackage;
import org.apache.jmeter.gui.util.JMeterMenuBar;
import org.apache.jorphan.logging.LoggingManager;
1.1 jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/AbstractAction.java
Index: AbstractAction.java
===================================================================
// $Header: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/action/AbstractAction.java,v 1.1 2005/08/27 03:40:45 woolfel Exp $
/*
* Copyright 2001-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.report.gui.action;
import java.awt.event.ActionEvent;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Set;
import javax.swing.JOptionPane;
import org.apache.jmeter.control.ReplaceableController;
import org.apache.jmeter.gui.action.Command;
import org.apache.jmeter.gui.ReportGuiPackage;
import org.apache.jmeter.report.gui.tree.ReportTreeNode;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.collections.HashTree;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.log.Logger;
/**
* @author mstover
* @version $Revision: 1.1 $
*/
public abstract class AbstractAction implements Command {
private static final Logger log = LoggingManager.getLoggerForClass();
/**
* @see Command#doAction(ActionEvent)
*/
public void doAction(ActionEvent e) {
}
/**
* @see Command#getActionNames()
*/
abstract public Set getActionNames();
protected void convertSubTree(HashTree tree) {
Iterator iter = new LinkedList(tree.list()).iterator();
while (iter.hasNext()) {
Object o = iter.next();
if(o instanceof TestElement)
continue; //hey, no need to convert
ReportTreeNode item = (ReportTreeNode) o;
if (item.isEnabled()) {
if (item.getUserObject() instanceof ReplaceableController) {
ReplaceableController rc = (ReplaceableController) item.getTestElement();
HashTree subTree = tree.getTree(item);
if (subTree != null) {
HashTree replacementTree = rc.getReplacementSubTree();
convertSubTree(replacementTree);
tree.replace(item,rc);
tree.set(rc,replacementTree);
}
} else {
convertSubTree(tree.getTree(item));
TestElement testElement = item.getTestElement();
tree.replace(item, testElement);
}
} else {
tree.remove(item);
}
}
}
/**
* @param e
*/
protected void popupShouldSave(ActionEvent e) {
log.debug("popupShouldSave");
if (ReportGuiPackage.getInstance().getTestPlanFile() == null) {
if (JOptionPane.showConfirmDialog(ReportGuiPackage.getInstance().getMainFrame(), JMeterUtils
.getResString("should_save"), JMeterUtils.getResString("warning"), JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
ReportActionRouter.getInstance().doActionNow(new ActionEvent(e.getSource(), e.getID(), ReportSave.SAVE));
}
}
}
}
1.3 +9 -9 jakarta-jmeter/src/reports/org/apache/jmeter/gui/ReportGuiPackage.java
Index: ReportGuiPackage.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/gui/ReportGuiPackage.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- ReportGuiPackage.java 17 Aug 2005 04:22:45 -0000 1.2
+++ ReportGuiPackage.java 27 Aug 2005 03:40:45 -0000 1.3
@@ -27,16 +27,16 @@
import javax.swing.JPopupMenu;
-import org.apache.jmeter.engine.util.ValueReplacer;
import org.apache.jmeter.exceptions.IllegalUserActionException;
+import org.apache.jmeter.report.engine.ValueReplacer;
import org.apache.jmeter.report.gui.tree.ReportTreeListener;
import org.apache.jmeter.report.gui.tree.ReportTreeModel;
import org.apache.jmeter.report.gui.tree.ReportTreeNode;
import org.apache.jmeter.services.FileServer;
import org.apache.jmeter.testbeans.TestBean;
import org.apache.jmeter.testbeans.gui.TestBeanGUI;
+import org.apache.jmeter.testelement.ReportPlan;
import org.apache.jmeter.testelement.TestElement;
-import org.apache.jmeter.testelement.TestPlan;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jmeter.util.LocaleChangeEvent;
import org.apache.jmeter.util.LocaleChangeListener;
@@ -488,7 +488,7 @@
* @return a ValueReplacer configured for the test tree
*/
public ValueReplacer getReplacer() {
- return new ValueReplacer((TestPlan) ((ReportTreeNode) getTreeModel().getTestPlan().getArray()[0])
+ return new ValueReplacer((ReportPlan) ((ReportTreeNode) getTreeModel().getTestPlan().getArray()[0])
.getTestElement());
}
@@ -499,7 +499,7 @@
* the new JMeter main frame
*/
public void setMainFrame(ReportMainFrame newMainFrame) {
- mainFrame = newMainFrame;
+ this.mainFrame = newMainFrame;
}
/**
@@ -507,8 +507,8 @@
*
* @return the main JMeter frame
*/
- public MainFrame getMainFrame() {
- return mainFrame;
+ public ReportMainFrame getMainFrame() {
+ return this.mainFrame;
}
/**
@@ -589,7 +589,7 @@
// EditCommand action -- we can't just trigger the action because that
// would populate the current node with the contents of the new GUI --
// which is empty.]
- MainFrame mf = getMainFrame(); // Fetch once
+ ReportMainFrame mf = getMainFrame(); // Fetch once
if (mf == null) // Probably caused by unit testing on headless system
{
log.warn("Mainframe is null");
1.3 +150 -36 jakarta-jmeter/src/reports/org/apache/jmeter/gui/ReportMainFrame.java
Index: ReportMainFrame.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/gui/ReportMainFrame.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- ReportMainFrame.java 17 Aug 2005 04:22:45 -0000 1.2
+++ ReportMainFrame.java 27 Aug 2005 03:40:45 -0000 1.3
@@ -37,6 +37,7 @@
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
+import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JPanel;
@@ -52,11 +53,12 @@
import org.apache.jmeter.engine.event.LoopIterationEvent;
import org.apache.jmeter.gui.action.GlobalMouseListener;
-import org.apache.jmeter.gui.util.JMeterMenuBar;
+import org.apache.jmeter.gui.util.ReportMenuBar;
import org.apache.jmeter.report.gui.action.ReportActionRouter;
import org.apache.jmeter.report.gui.tree.ReportCellRenderer;
import org.apache.jmeter.report.gui.tree.ReportTreeListener;
-import org.apache.jmeter.threads.JMeterContextService;
+import org.apache.jmeter.samplers.Remoteable;
+import org.apache.jmeter.testelement.TestListener;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.gui.ComponentUtil;
@@ -67,15 +69,33 @@
* @author Michael Stover
* @version $Revision$
*/
-public class ReportMainFrame extends MainFrame {
+public class ReportMainFrame extends JFrame implements TestListener, Remoteable {
- /** An image which is displayed when a test is running. */
+ /** The menu bar. */
+ protected ReportMenuBar menuBar;
+
+ /** The main panel where components display their GUIs. */
+ protected JScrollPane mainPanel;
+
+ /** The panel where the test tree is shown. */
+ protected JScrollPane treePanel;
+
+ /** The test tree. */
+ protected JTree tree;
+
+ /** An image which is displayed when a test is running. */
private ImageIcon runningIcon = JMeterUtils.getImage("thread.enabled.gif");
/** An image which is displayed when a test is not currently running. */
private ImageIcon stoppedIcon = JMeterUtils.getImage("thread.disabled.gif");
- /** The button used to display the running/stopped image. */
+ /** The x coordinate of the last location where a component was dragged. */
+ private int previousDragXLocation = 0;
+
+ /** The y coordinate of the last location where a component was dragged. */
+ private int previousDragYLocation = 0;
+
+ /** The button used to display the running/stopped image. */
private JButton runningIndicator;
/** The set of currently running hosts. */
@@ -84,7 +104,7 @@
/** A message dialog shown while JMeter threads are stopping. */
private JDialog stoppingMessage;
- /**
+ /**
* Create a new JMeter frame.
*
* @param actionHandler
@@ -96,16 +116,16 @@
*/
public ReportMainFrame(ActionListener actionHandler, TreeModel treeModel,
ReportTreeListener treeListener) {
- super.tree = this.makeTree(treeModel,treeListener);
- }
+ runningIndicator = new JButton(stoppedIcon);
+ runningIndicator.setMargin(new Insets(0, 0, 0, 0));
+ runningIndicator.setBorder(BorderFactory.createEmptyBorder());
- /**
- * Default constructor for the JMeter frame. This constructor will not
- * properly initialize the tree, so don't use it.
- */
- public ReportMainFrame() {
- // TODO: Can we remove this constructor? JMeter won't behave properly
- // if it used.
+ this.tree = this.makeTree(treeModel,treeListener);
+
+ ReportGuiPackage.getInstance().setMainFrame(this);
+ init();
+
+ setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
}
// MenuBar related methods
@@ -119,7 +139,7 @@
* true if the menu item should be enabled, false otherwise
*/
public void setFileLoadEnabled(boolean enabled) {
- super.setFileLoadEnabled(enabled);
+ menuBar.setFileLoadEnabled(enabled);
}
/**
@@ -129,7 +149,7 @@
* true if the menu item should be enabled, false otherwise
*/
public void setFileSaveEnabled(boolean enabled) {
- super.setFileSaveEnabled(enabled);
+ menuBar.setFileSaveEnabled(enabled);
}
/**
@@ -139,7 +159,7 @@
* the new Edit menu
*/
public void setEditMenu(JPopupMenu menu) {
- super.setEditMenu(menu);
+ menuBar.setEditMenu(menu);
}
/**
@@ -149,7 +169,7 @@
* true if the menu item should be enabled, false otherwise
*/
public void setEditEnabled(boolean enabled) {
- super.setEditEnabled(enabled);
+ menuBar.setEditEnabled(enabled);
}
/**
@@ -159,7 +179,7 @@
* the new Edit|Add menu
*/
public void setEditAddMenu(JMenu menu) {
- super.setEditAddMenu(menu);
+ menuBar.setEditAddMenu(menu);
}
/**
@@ -169,7 +189,7 @@
* true if the menu item should be enabled, false otherwise
*/
public void setEditAddEnabled(boolean enabled) {
- super.setEditAddEnabled(enabled);
+ menuBar.setEditAddEnabled(enabled);
}
/**
@@ -179,16 +199,61 @@
* true if the menu item should be enabled, false otherwise
*/
public void setEditRemoveEnabled(boolean enabled) {
- super.setEditRemoveEnabled(enabled);
+ menuBar.setEditRemoveEnabled(enabled);
}
+ /**
+ * Close the currently selected menu.
+ */
+ public void closeMenu() {
+ if (menuBar.isSelected()) {
+ MenuElement[] menuElement = menuBar.getSubElements();
+ if (menuElement != null) {
+ for (int i = 0; i < menuElement.length; i++) {
+ JMenu menu = (JMenu) menuElement[i];
+ if (menu.isSelected()) {
+ menu.setPopupMenuVisible(false);
+ menu.setSelected(false);
+ break;
+ }
+ }
+ }
+ }
+ }
+ /**
+ * Show a dialog indicating that JMeter threads are stopping on a particular
+ * host.
+ *
+ * @param host
+ * the host where JMeter threads are stopping
+ */
+ public void showStoppingMessage(String host) {
+ stoppingMessage = new JDialog(this, JMeterUtils.getResString("stopping_test_title"), true);
+ JLabel stopLabel = new JLabel(JMeterUtils.getResString("stopping_test") + ": " + host);
+ stopLabel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
+ stoppingMessage.getContentPane().add(stopLabel);
+ stoppingMessage.pack();
+ ComponentUtil.centerComponentInComponent(this, stoppingMessage);
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ if (stoppingMessage != null) {
+ stoppingMessage.show();
+ }
+ }
+ });
+ }
+
+ public void setMainPanel(JComponent comp) {
+ mainPanel.setViewportView(comp);
+ }
+
/***************************************************************************
* !ToDoo (Method description)
*
* @return !ToDo (Return description)
**************************************************************************/
public JTree getTree() {
- return super.getTree();
+ return this.tree;
}
// TestListener implementation
@@ -242,8 +307,7 @@
* Create the GUI components and layout.
*/
protected void init() {
- super.init();
- menuBar = new JMeterMenuBar();
+ menuBar = new ReportMenuBar();
setJMenuBar(menuBar);
JPanel all = new JPanel(new BorderLayout());
@@ -268,16 +332,41 @@
addMouseListener(new GlobalMouseListener());
}
- /**
- * Create the JMeter tool bar pane containing the running indicator.
- *
- * @return a panel containing the running indicator
- */
- protected Component createToolBar() {
- return super.createToolBar();
- }
+ /**
+ * Create the JMeter tool bar pane containing the running indicator.
+ *
+ * @return a panel containing the running indicator
+ */
+ protected Component createToolBar() {
+ Box toolPanel = new Box(BoxLayout.X_AXIS);
+ toolPanel.add(Box.createRigidArea(new Dimension(10, 15)));
+ toolPanel.add(Box.createGlue());
+ toolPanel.add(runningIndicator);
+ return toolPanel;
+ }
- /**
+ /**
+ * Create the panel where the GUI representation of the test tree is
+ * displayed. The tree should already be created before calling this method.
+ *
+ * @return a scroll pane containing the test tree GUI
+ */
+ protected JScrollPane createTreePanel() {
+ JScrollPane treeP = new JScrollPane(tree);
+ treeP.setMinimumSize(new Dimension(100, 0));
+ return treeP;
+ }
+
+ /**
+ * Create the main panel where components can display their GUIs.
+ *
+ * @return the main scroll pane
+ */
+ protected JScrollPane createMainPanel() {
+ return new JScrollPane();
+ }
+
+ /**
* Create and initialize the GUI representation of the test tree.
*
* @param treeModel
@@ -313,4 +402,29 @@
return rend;
}
+ public void drawDraggedComponent(Component dragIcon, int x, int y) {
+ Dimension size = dragIcon.getPreferredSize();
+ treePanel.paintImmediately(previousDragXLocation, previousDragYLocation, size.width, size.height);
+ this.getLayeredPane().setLayer(dragIcon, 400);
+ SwingUtilities.paintComponent(treePanel.getGraphics(), dragIcon, treePanel, x, y, size.width, size.height);
+ previousDragXLocation = x;
+ previousDragYLocation = y;
+ }
+
+ /**
+ * A window adapter used to detect when the main JMeter frame is being
+ * closed.
+ */
+ protected class WindowHappenings extends WindowAdapter {
+ /**
+ * Called when the main JMeter frame is being closed. Sends a
+ * notification so that JMeter can react appropriately.
+ *
+ * @param event
+ * the WindowEvent to handle
+ */
+ public void windowClosing(WindowEvent event) {
+ ReportActionRouter.getInstance().actionPerformed(new ActionEvent(this, event.getID(), "exit"));
+ }
+ }
}
1.2 +6 -6 jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/tree/ReportTreeNode.java
Index: ReportTreeNode.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/tree/ReportTreeNode.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ReportTreeNode.java 17 Aug 2005 04:22:39 -0000 1.1
+++ ReportTreeNode.java 27 Aug 2005 03:40:45 -0000 1.2
@@ -28,7 +28,7 @@
import javax.swing.tree.DefaultMutableTreeNode;
import org.apache.jmeter.gui.GUIFactory;
-import org.apache.jmeter.gui.GuiPackage;
+import org.apache.jmeter.gui.ReportGuiPackage;
import org.apache.jmeter.gui.tree.NamedTreeNode;
import org.apache.jmeter.testbeans.TestBean;
import org.apache.jmeter.testelement.AbstractTestElement;
@@ -114,7 +114,7 @@
public Collection getMenuCategories() {
try {
- return GuiPackage.getInstance().getGui(getTestElement())
+ return ReportGuiPackage.getInstance().getGui(getTestElement())
.getMenuCategories();
} catch (Exception e) {
log.error("Can't get popup menu for gui", e);
@@ -124,7 +124,7 @@
public JPopupMenu createPopupMenu() {
try {
- return GuiPackage.getInstance().getGui(getTestElement())
+ return ReportGuiPackage.getInstance().getGui(getTestElement())
.createPopupMenu();
} catch (Exception e) {
log.error("Can't get popup menu for gui", e);
@@ -137,12 +137,12 @@
}
public String getStaticLabel() {
- return GuiPackage.getInstance().getGui((TestElement) getUserObject())
+ return ReportGuiPackage.getInstance().getGui((TestElement) getUserObject())
.getStaticLabel();
}
public String getDocAnchor() {
- return GuiPackage.getInstance().getGui((TestElement) getUserObject())
+ return ReportGuiPackage.getInstance().getGui((TestElement) getUserObject())
.getDocAnchor();
}
1.2 +3 -13 jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/tree/ReportTreeModel.java
Index: ReportTreeModel.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/tree/ReportTreeModel.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ReportTreeModel.java 17 Aug 2005 04:22:38 -0000 1.1
+++ ReportTreeModel.java 27 Aug 2005 03:40:45 -0000 1.2
@@ -25,7 +25,6 @@
import javax.swing.tree.DefaultTreeModel;
import org.apache.jmeter.config.gui.AbstractConfigGui;
-import org.apache.jmeter.control.gui.TestPlanGui;
import org.apache.jmeter.control.gui.ReportGui;
import org.apache.jmeter.exceptions.IllegalUserActionException;
import org.apache.jmeter.gui.GuiPackage;
@@ -33,7 +32,6 @@
import org.apache.jmeter.report.gui.tree.ReportTreeNode;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.testelement.ReportPlan;
-import org.apache.jmeter.testelement.WorkBench;
import org.apache.jmeter.testelement.property.NullProperty;
import org.apache.jmeter.util.NameUpdater;
import org.apache.jorphan.collections.HashTree;
@@ -130,8 +128,7 @@
}
public void removeNodeFromParent(ReportTreeNode node) {
- if (!(node.getUserObject() instanceof ReportPlan)
- && !(node.getUserObject() instanceof WorkBench)) {
+ if (!(node.getUserObject() instanceof ReportPlan)) {
super.removeNodeFromParent(node);
}
}
@@ -183,15 +180,8 @@
}
private void initTree() {
- TestElement tp = new TestPlanGui().createTestElement();
TestElement wb = new ReportGui().createTestElement();
- this.insertNodeInto(new ReportTreeNode(tp, this),
- (ReportTreeNode) getRoot(), 0);
- try {
- super.removeNodeFromParent((ReportTreeNode) getChild(getRoot(), 1));
- } catch (RuntimeException e) {
- }
this.insertNodeInto(new ReportTreeNode(wb, this),
- (ReportTreeNode) getRoot(), 1);
+ (ReportTreeNode) getRoot(), 0);
}
}
1.2 +9 -11 jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/tree/ReportTreeListener.java
Index: ReportTreeListener.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/gui/tree/ReportTreeListener.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ReportTreeListener.java 17 Aug 2005 04:22:39 -0000 1.1
+++ ReportTreeListener.java 27 Aug 2005 03:40:45 -0000 1.2
@@ -35,10 +35,9 @@
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
-import org.apache.jmeter.control.gui.TestPlanGui;
-import org.apache.jmeter.control.gui.WorkBenchGui;
-import org.apache.jmeter.gui.GuiPackage;
-import org.apache.jmeter.gui.MainFrame;
+import org.apache.jmeter.control.gui.ReportGui;
+import org.apache.jmeter.gui.ReportGuiPackage;
+import org.apache.jmeter.gui.ReportMainFrame;
import org.apache.jmeter.report.gui.action.ReportDragNDrop;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.logging.LoggingManager;
@@ -189,7 +188,7 @@
dragNdrop.add(item);
displayPopUp(e, dragNdrop);
} else {
- GuiPackage.getInstance().getMainFrame().repaint();
+ ReportGuiPackage.getInstance().getMainFrame().repaint();
}
dragging = false;
}
@@ -218,7 +217,7 @@
private void changeSelectionIfDragging(MouseEvent e) {
if (dragging) {
- GuiPackage.getInstance().getMainFrame().drawDraggedComponent(dragIcon, e.getX(), e.getY());
+ ReportGuiPackage.getInstance().getMainFrame().drawDraggedComponent(dragIcon, e.getX(), e.getY());
if (tree.getPathForLocation(e.getX(), e.getY()) != null) {
currentPath = tree.getPathForLocation(e.getX(), e.getY());
if (!contains(draggedNodes, getCurrentNode())) {
@@ -239,7 +238,7 @@
public void mousePressed(MouseEvent e) {
// Get the Main Frame.
- MainFrame mainFrame = GuiPackage.getInstance().getMainFrame();
+ ReportMainFrame mainFrame = ReportGuiPackage.getInstance().getMainFrame();
// Close any Main Menu that is open
mainFrame.closeMenu();
int selRow = tree.getRowForLocation(e.getX(), e.getY());
@@ -266,8 +265,7 @@
if (!dragging) {
dragging = true;
draggedNodes = getSelectedNodes();
- if (draggedNodes[0].getUserObject() instanceof TestPlanGui
- || draggedNodes[0].getUserObject() instanceof WorkBenchGui) {
+ if (draggedNodes[0].getUserObject() instanceof ReportGui) {
dragging = false;
}
@@ -304,7 +302,7 @@
private void displayPopUp(MouseEvent e) {
JPopupMenu pop = getCurrentNode().createPopupMenu();
- GuiPackage.getInstance().displayPopUp(e, pop);
+ ReportGuiPackage.getInstance().displayPopUp(e, pop);
}
private void displayPopUp(MouseEvent e, JPopupMenu popup) {
1.1 jakarta-jmeter/src/reports/org/apache/jmeter/report/engine/ValueReplacer.java
Index: ValueReplacer.java
===================================================================
// $Header: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/report/engine/ValueReplacer.java,v 1.1 2005/08/27 03:40:45 woolfel Exp $
/*
* Copyright 2003-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.report.engine;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import junit.framework.TestCase;
import org.apache.jmeter.functions.InvalidVariableException;
import org.apache.jmeter.testelement.ReportPlan;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.testelement.property.CollectionProperty;
import org.apache.jmeter.testelement.property.JMeterProperty;
import org.apache.jmeter.testelement.property.MultiProperty;
import org.apache.jmeter.testelement.property.PropertyIterator;
import org.apache.jmeter.testelement.property.StringProperty;
import org.apache.jmeter.threads.JMeterContextService;
import org.apache.jmeter.threads.JMeterVariables;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.log.Logger;
/**
* @author Michael Stover
* @author <a href="mailto:jsalvata@apache.org">Jordi Salvat i Alabart</a>
* @version $Revision: 1.1 $ updated on $Date: 2005/08/27 03:40:45 $
*/
public class ValueReplacer {
transient private static Logger log = LoggingManager.getLoggerForClass();
Map variables = new HashMap();
public ValueReplacer() {
}
public ValueReplacer(ReportPlan tp) {
setUserDefinedVariables(tp.getUserDefinedVariables());
}
public void setUserDefinedVariables(Map variables) {
this.variables = variables;
}
public void replaceValues(TestElement el) throws InvalidVariableException {
/**
Collection newProps = replaceValues(el.propertyIterator(), new ReplaceStringWithFunctions(masterFunction,
variables));
setProperties(el, newProps);
**/
}
private void setProperties(TestElement el, Collection newProps) {
Iterator iter = newProps.iterator();
el.clear();
while (iter.hasNext()) {
el.setProperty((JMeterProperty) iter.next());
}
}
public void reverseReplace(TestElement el) throws InvalidVariableException {
/**
Collection newProps = replaceValues(el.propertyIterator(), new ReplaceFunctionsWithStrings(masterFunction,
variables));
setProperties(el, newProps);
**/
}
public void reverseReplace(TestElement el, boolean regexMatch) throws InvalidVariableException {
/**
Collection newProps = replaceValues(el.propertyIterator(), new ReplaceFunctionsWithStrings(masterFunction,
variables, regexMatch));
setProperties(el, newProps);
**/
}
public void undoReverseReplace(TestElement el) throws InvalidVariableException {
/**
Collection newProps = replaceValues(el.propertyIterator(), new UndoVariableReplacement(masterFunction,
variables));
setProperties(el, newProps);
**/
}
public void addVariable(String name, String value) {
variables.put(name, value);
}
/**
* Add all the given variables to this replacer's variables map.
*
* @param vars
* A map of variable name-value pairs (String-to-String).
*/
public void addVariables(Map vars) {
variables.putAll(vars);
}
/**
private Collection replaceValues(PropertyIterator iter, ValueTransformer transform) throws InvalidVariableException {
List props = new LinkedList();
while (iter.hasNext()) {
JMeterProperty val = iter.next();
if (log.isDebugEnabled()) {
log.debug("About to replace in property of type: " + val.getClass() + ": " + val);
}
if (val instanceof StringProperty) {
// Must not convert TestElement.gui_class etc
if (!val.getName().equals(TestElement.GUI_CLASS) &&
!val.getName().equals(TestElement.TEST_CLASS)) {
val = transform.transformValue(val);
if (log.isDebugEnabled()) {
log.debug("Replacement result: " + val);
}
}
} else if (val instanceof MultiProperty) {
MultiProperty multiVal = (MultiProperty) val;
Collection newValues = replaceValues(multiVal.iterator(), transform);
multiVal.clear();
Iterator propIter = newValues.iterator();
while (propIter.hasNext()) {
multiVal.addProperty((JMeterProperty) propIter.next());
}
if (log.isDebugEnabled()) {
log.debug("Replacement result: " + multiVal);
}
} else {
if (log.isDebugEnabled()) {
log.debug("Won't replace " + val);
}
}
props.add(val);
}
return props;
}
**/
}
1.5 +188 -15 jakarta-jmeter/src/reports/org/apache/jmeter/JMeterReport.java
Index: JMeterReport.java
===================================================================
RCS file: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/JMeterReport.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- JMeterReport.java 25 Aug 2005 22:35:07 -0000 1.4
+++ JMeterReport.java 27 Aug 2005 03:40:45 -0000 1.5
@@ -22,6 +22,8 @@
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
@@ -32,15 +34,16 @@
import org.apache.jmeter.config.gui.AbstractConfigGui;
import org.apache.jmeter.control.gui.AbstractControllerGui;
import org.apache.jmeter.control.gui.ReportGui;
-import org.apache.jmeter.control.gui.TestPlanGui;
-import org.apache.jmeter.control.gui.WorkBenchGui;
+import org.apache.jmeter.engine.event.LoopIterationEvent;
import org.apache.jmeter.gui.ReportGuiPackage;
import org.apache.jmeter.plugin.JMeterPlugin;
import org.apache.jmeter.plugin.PluginManager;
-import org.apache.jmeter.samplers.gui.AbstractSamplerGui;
+import org.apache.jmeter.samplers.Remoteable;
import org.apache.jmeter.save.SaveService;
-import org.apache.jmeter.threads.gui.ThreadGroupGui;
-import org.apache.jmeter.timers.gui.AbstractTimerGui;
+import org.apache.jmeter.services.FileServer;
+import org.apache.jmeter.testelement.TestElement;
+import org.apache.jmeter.testelement.TestListener;
+import org.apache.jmeter.testelement.ReportPlan;
import org.apache.jmeter.report.gui.AbstractReportPageGui;
import org.apache.jmeter.report.gui.action.ReportLoad;
import org.apache.jmeter.report.gui.action.ReportActionRouter;
@@ -48,6 +51,8 @@
import org.apache.jmeter.report.gui.tree.ReportTreeListener;
import org.apache.jmeter.report.gui.tree.ReportTreeModel;
import org.apache.jmeter.report.writers.gui.AbstractReportWriterGui;
+import org.apache.jmeter.reporters.ResultCollector;
+import org.apache.jmeter.reporters.Summariser;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jmeter.visualizers.gui.AbstractVisualizer;
import org.apache.jorphan.collections.HashTree;
@@ -141,6 +146,8 @@
new CLOptionDescriptor("homedir", CLOptionDescriptor.ARGUMENT_REQUIRED, JMETER_HOME_OPT,
"the jmeter home directory to use"), };
+ transient boolean testEnded = false;
+
/**
*
*/
@@ -152,14 +159,9 @@
* The default icons for the report GUI.
*/
private static final String[][] DEFAULT_ICONS = {
- { TestPlanGui.class.getName(), "org/apache/jmeter/images/beaker.gif" },
- { AbstractTimerGui.class.getName(), "org/apache/jmeter/images/timer.gif" },
- { ThreadGroupGui.class.getName(), "org/apache/jmeter/images/thread.gif" },
{ AbstractVisualizer.class.getName(), "org/apache/jmeter/images/meter.png" },
{ AbstractConfigGui.class.getName(), "org/apache/jmeter/images/testtubes.png" },
{ AbstractControllerGui.class.getName(), "org/apache/jmeter/images/knob.gif" },
- { WorkBenchGui.class.getName(), "org/apache/jmeter/images/clipboard.gif" },
- { AbstractSamplerGui.class.getName(), "org/apache/jmeter/images/pipet.png" },
{ AbstractReportWriterGui.class.getName(), "org/apache/jmeter/images/new/pencil.png" },
{ AbstractReportPageGui.class.getName(), "org/apache/jmeter/images/new/book.png" },
{ ReportGui.class.getName(), "org/apache/jmeter/images/new/book.png" }
@@ -219,9 +221,7 @@
main.setIconImage(JMeterUtils.getImage("jmeter.jpg").getImage());
ComponentUtil.centerComponentInWindow(main, 80);
main.show();
- /**
- *
- * for now I'm commenting it out to test
+
ReportActionRouter.getInstance().actionPerformed(new ActionEvent(main, 1, ReportCheckDirty.ADD_ALL));
if (testFile != null) {
try {
@@ -232,15 +232,82 @@
ReportGuiPackage.getInstance().setTestPlanFile(f.getAbsolutePath());
- new LoadReport().insertLoadedTree(1, tree);
+ new ReportLoad().insertLoadedTree(1, tree);
} catch (Exception e) {
log.error("Failure loading test file", e);
JMeterUtils.reportErrorToUser(e.toString());
}
}
- */
}
+ private void run(String testFile, String logFile, boolean remoteStart) {
+ FileInputStream reader = null;
+ try {
+ File f = new File(testFile);
+ if (!f.exists() || !f.isFile()) {
+ System.out.println("Could not open " + testFile);
+ return;
+ }
+ FileServer.getFileServer().setBasedir(f.getAbsolutePath());
+
+ reader = new FileInputStream(f);
+ log.info("Loading file: " + f);
+
+ HashTree tree = SaveService.loadTree(reader);
+
+ // Remove the disabled items
+ // For GUI runs this is done in Start.java
+ convertSubTree(tree);
+
+ if (logFile != null) {
+ ResultCollector logger = new ResultCollector();
+ logger.setFilename(logFile);
+ tree.add(tree.getArray()[0], logger);
+ }
+ String summariserName = JMeterUtils.getPropDefault(
+ "summariser.name", "");//$NON-NLS-1$
+ if (summariserName.length() > 0) {
+ log.info("Creating summariser <" + summariserName + ">");
+ System.out.println("Creating summariser <" + summariserName + ">");
+ Summariser summer = new Summariser(summariserName);
+ tree.add(tree.getArray()[0], summer);
+ }
+ tree.add(tree.getArray()[0], new ListenToTest(parent));
+ System.out.println("Created the tree successfully");
+ /**
+ JMeterEngine engine = null;
+ if (!remoteStart) {
+ engine = new StandardJMeterEngine();
+ engine.configure(tree);
+ System.out.println("Starting the test");
+ engine.runTest();
+ } else {
+ String remote_hosts_string = JMeterUtils.getPropDefault(
+ "remote_hosts", "127.0.0.1");
+ java.util.StringTokenizer st = new java.util.StringTokenizer(
+ remote_hosts_string, ",");
+ List engines = new LinkedList();
+ while (st.hasMoreElements()) {
+ String el = (String) st.nextElement();
+ System.out.println("Configuring remote engine for " + el);
+ // engines.add(doRemoteInit(el.trim(), tree));
+ }
+ System.out.println("Starting remote engines");
+ Iterator iter = engines.iterator();
+ while (iter.hasNext()) {
+ engine = (JMeterEngine) iter.next();
+ engine.runTest();
+ }
+ System.out.println("Remote engines have been started");
+ }
+ **/
+ } catch (Exception e) {
+ System.out.println("Error in NonGUIDriver " + e.toString());
+ log.error("", e);
+ }
+ }
+
+
/**
*
* @param args
@@ -344,4 +411,110 @@
}
+ /**
+ * Code copied from AbstractAction.java and modified to suit TestElements
+ *
+ * @param tree
+ */
+ private void convertSubTree(HashTree tree) {// TODO check build dependencies
+ Iterator iter = new LinkedList(tree.list()).iterator();
+ while (iter.hasNext()) {
+ TestElement item = (TestElement) iter.next();
+ if (item.isEnabled()) {
+ // This is done for GUI runs in JMeterTreeModel.addSubTree()
+ if (item instanceof ReportPlan) {
+ ReportPlan tp = (ReportPlan) item;
+ tp.setSerialized(tp.isSerialized());
+ }
+ // TODO handle ReplaceableControllers
+ // if (item instanceof ReplaceableController)
+ // {
+ // System.out.println("Replaceable "+item.getClass().getName());
+ // HashTree subTree = tree.getTree(item);
+ //
+ // if (subTree != null)
+ // {
+ // ReplaceableController rc =
+ // (ReplaceableController) item;//.createTestElement();
+ // rc.replace(subTree);
+ // convertSubTree(subTree);
+ // tree.replace(item, rc.getReplacement());
+ // }
+ // }
+ // else
+ {
+ // System.out.println("NonReplaceable
+ // "+item.getClass().getName());
+ convertSubTree(tree.getTree(item));
+ // TestElement testElement = item.createTestElement();
+ // tree.replace(item, testElement);
+ }
+ } else {
+ // System.out.println("Disabled "+item.getClass().getName());
+ tree.remove(item);
+ }
+ }
+ }
+
+ /**
+ * Listen to test and exit program after test completes, after a 5 second
+ * delay to give listeners a chance to close out their files.
+ */
+ private class ListenToTest implements TestListener, Runnable, Remoteable {
+ int started = 0;
+
+ private JMeterReport _parent;
+
+ private ListenToTest(JMeterReport parent) {
+ _parent = parent;
+ }
+
+ public synchronized void testEnded(String host) {
+ started--;
+ log.info("Remote host " + host + " finished");
+ if (started == 0) {
+ testEnded();
+ }
+ }
+
+ public void testEnded() {
+ Thread stopSoon = new Thread(this);
+ stopSoon.start();
+ }
+
+ public synchronized void testStarted(String host) {
+ started++;
+ log.info("Started remote host: " + host);
+ }
+
+ public void testStarted() {
+ log.info(JMeterUtils.getResString("running_test"));
+ }
+
+ /**
+ * This is a hack to allow listeners a chance to close their files. Must
+ * implement a queue for sample responses tied to the engine, and the
+ * engine won't deliver testEnded signal till all sample responses have
+ * been delivered. Should also improve performance of remote JMeter
+ * testing.
+ */
+ public void run() {
+ System.out.println("Tidying up ...");
+ try {
+ Thread.sleep(5000);
+ } catch (InterruptedException e) {
+ // ignored
+ }
+ System.out.println("... end of run");
+ _parent.testEnded = true;
+ }
+
+ /**
+ * @see TestListener#testIterationStart(LoopIterationEvent)
+ */
+ public void testIterationStart(LoopIterationEvent event) {
+ // ignored
+ }
+ }
+
}
\ No newline at end of file
1.1 jakarta-jmeter/src/reports/org/apache/jmeter/gui/util/ReportMenuBar.java
Index: ReportMenuBar.java
===================================================================
// $Header: /home/cvs/jakarta-jmeter/src/reports/org/apache/jmeter/gui/util/ReportMenuBar.java,v 1.1 2005/08/27 03:40:45 woolfel Exp $
/*
* Copyright 2001-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.gui.util;
import java.awt.Component;
import java.awt.event.KeyEvent;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Locale;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.KeyStroke;
import javax.swing.MenuElement;
import javax.swing.UIManager;
import org.apache.jmeter.report.gui.action.ReportActionRouter;
import org.apache.jmeter.gui.action.ChangeLanguage;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jmeter.util.LocaleChangeEvent;
import org.apache.jmeter.util.LocaleChangeListener;
import org.apache.jmeter.util.SSLManager;
import org.apache.jorphan.util.JOrphanUtils;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.log.Logger;
/**
* @author Michael Stover
* @author <a href="mailto:klancast@swbell.net">Keith Lancaster</a>
* @version $Revision: 1.1 $ updated on $Date: 2005/08/27 03:40:45 $
*/
public class ReportMenuBar extends JMenuBar implements LocaleChangeListener {
transient private static Logger log = LoggingManager.getLoggerForClass();
JMenu fileMenu;
JMenuItem file_save_as;
JMenuItem file_load;
JMenuItem file_merge;
JMenuItem file_exit;
JMenuItem file_close;
JMenu editMenu;
JMenu edit_add;
// JMenu edit_add_submenu;
JMenuItem edit_remove; // TODO - should this be created?
JMenu runMenu;
JMenuItem run_start;
JMenu remote_start;
JMenuItem remote_start_all;
Collection remote_engine_start;
JMenuItem run_stop;
private JMenuItem run_shut; // all the others could be private too?
JMenu remote_stop;
JMenuItem remote_stop_all;
Collection remote_engine_stop;
JMenuItem run_clear;
JMenuItem run_clearAll;
// JMenu reportMenu;
// JMenuItem analyze;
JMenu optionsMenu;
JMenu lafMenu;
JMenuItem sslManager;
JMenu helpMenu;
JMenuItem help_about;
String[] remoteHosts;
private JMenu remote_exit;
private JMenuItem remote_exit_all;
private Collection remote_engine_exit;
public ReportMenuBar() {
remote_engine_start = new LinkedList();
remote_engine_stop = new LinkedList();
remote_engine_exit = new LinkedList();
remoteHosts = JOrphanUtils.split(JMeterUtils.getPropDefault("remote_hosts", ""), ",");
if (remoteHosts.length == 1 && remoteHosts[0].equals("")) {
remoteHosts = new String[0];
}
this.getRemoteItems();
createMenuBar();
}
public void setFileSaveEnabled(boolean enabled) {
file_save_as.setEnabled(enabled);
}
public void setFileLoadEnabled(boolean enabled) {
if (file_load != null) {
file_load.setEnabled(enabled);
}
if (file_merge != null) {
file_merge.setEnabled(enabled);
}
}
public void setEditEnabled(boolean enabled) {
if (editMenu != null) {
editMenu.setEnabled(enabled);
}
}
public void setEditAddMenu(JMenu menu) {
// If the Add menu already exists, remove it.
if (edit_add != null) {
editMenu.remove(edit_add);
}
// Insert the Add menu as the first menu item in the Edit menu.
edit_add = menu;
editMenu.insert(edit_add, 0);
}
public void setEditMenu(JPopupMenu menu) {
if (menu != null) {
editMenu.removeAll();
Component[] comps = menu.getComponents();
for (int i = 0; i < comps.length; i++) {
editMenu.add(comps[i]);
}
editMenu.setEnabled(true);
} else {
editMenu.setEnabled(false);
}
}
public void setEditAddEnabled(boolean enabled) {
// There was a NPE being thrown without the null check here.. JKB
if (edit_add != null) {
edit_add.setEnabled(enabled);
}
// If we are enabling the Edit-->Add menu item, then we also need to
// enable the Edit menu. The Edit menu may already be enabled, but
// there's no harm it trying to enable it again.
if (enabled) {
setEditEnabled(true);
} else {
// If we are disabling the Edit-->Add menu item and the
// Edit-->Remove menu item is disabled, then we also need to
// disable the Edit menu.
// The Java Look and Feel Guidelines say to disable a menu if all
// menu items are disabled.
if (!edit_remove.isEnabled()) {
editMenu.setEnabled(false);
}
}
}
public void setEditRemoveEnabled(boolean enabled) {
edit_remove.setEnabled(enabled);
// If we are enabling the Edit-->Remove menu item, then we also need to
// enable the Edit menu. The Edit menu may already be enabled, but
// there's no harm it trying to enable it again.
if (enabled) {
setEditEnabled(true);
} else {
// If we are disabling the Edit-->Remove menu item and the
// Edit-->Add menu item is disabled, then we also need to disable
// the Edit menu.
// The Java Look and Feel Guidelines say to disable a menu if all
// menu items are disabled.
if (!edit_add.isEnabled()) {
editMenu.setEnabled(false);
}
}
}
/**
* Creates the MenuBar for this application. I believe in my heart that this
* should be defined in a file somewhere, but that is for later.
*/
public void createMenuBar() {
makeFileMenu();
makeEditMenu();
makeRunMenu();
makeOptionsMenu();
makeHelpMenu();
this.add(fileMenu);
this.add(editMenu);
this.add(runMenu);
this.add(optionsMenu);
this.add(helpMenu);
}
private void makeHelpMenu() {
// HELP MENU
helpMenu = new JMenu(JMeterUtils.getResString("help"));
helpMenu.setMnemonic('H');
JMenuItem contextHelp = new JMenuItem(JMeterUtils.getResString("help"), 'H');
contextHelp.setActionCommand("help");
contextHelp.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, KeyEvent.CTRL_MASK));
contextHelp.addActionListener(ReportActionRouter.getInstance());
help_about = new JMenuItem(JMeterUtils.getResString("about"), 'A');
help_about.setActionCommand("about");
help_about.addActionListener(ReportActionRouter.getInstance());
helpMenu.add(contextHelp);
helpMenu.add(help_about);
}
private void makeOptionsMenu() {
// OPTIONS MENU
optionsMenu = new JMenu(JMeterUtils.getResString("option"));
JMenuItem functionHelper = new JMenuItem(JMeterUtils.getResString("function_dialog_menu_item"), 'F');
functionHelper.addActionListener(ReportActionRouter.getInstance());
functionHelper.setActionCommand("functions");
functionHelper.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, KeyEvent.CTRL_MASK));
lafMenu = new JMenu(JMeterUtils.getResString("appearance"));
UIManager.LookAndFeelInfo lafs[] = UIManager.getInstalledLookAndFeels();
for (int i = 0; i < lafs.length; ++i) {
JMenuItem laf = new JMenuItem(lafs[i].getName());
laf.addActionListener(ReportActionRouter.getInstance());
laf.setActionCommand("laf:" + lafs[i].getClassName());
lafMenu.setMnemonic('L');
lafMenu.add(laf);
}
optionsMenu.setMnemonic('O');
optionsMenu.add(functionHelper);
optionsMenu.add(lafMenu);
if (SSLManager.isSSLSupported()) {
sslManager = new JMenuItem(JMeterUtils.getResString("sslManager"));
sslManager.addActionListener(ReportActionRouter.getInstance());
sslManager.setActionCommand("sslManager");
sslManager.setMnemonic('S');
sslManager.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, KeyEvent.CTRL_MASK));
optionsMenu.add(sslManager);
}
optionsMenu.add(makeLanguageMenu());
}
// TODO fetch list of languages from a file?
// N.B. Changes to language list need to be reflected in
// resources/PackageTest.java
private JMenu makeLanguageMenu() {
/*
* Note: the item name is used by ChangeLanguage to create a Locale for
* that language, so need to ensure that the language strings are valid
* If they exist, use the Locale language constants
*/
// TODO: do accelerator keys make sense? The key may not be present in
// translations
JMenu languageMenu = new JMenu(JMeterUtils.getResString("choose_language"));
languageMenu.setMnemonic('C');
// add english
JMenuItem english = new JMenuItem(JMeterUtils.getResString("en"), 'E');
english.addActionListener(ReportActionRouter.getInstance());
english.setActionCommand(ChangeLanguage.CHANGE_LANGUAGE);
english.setName(Locale.ENGLISH.getLanguage());
languageMenu.add(english);
// add Japanese
JMenuItem japanese = new JMenuItem(JMeterUtils.getResString("jp"), 'J');
japanese.addActionListener(ReportActionRouter.getInstance());
japanese.setActionCommand(ChangeLanguage.CHANGE_LANGUAGE);
japanese.setName(Locale.JAPANESE.getLanguage());
languageMenu.add(japanese);
// add Norwegian
JMenuItem norway = new JMenuItem(JMeterUtils.getResString("no"), 'N');
norway.addActionListener(ReportActionRouter.getInstance());
norway.setActionCommand(ChangeLanguage.CHANGE_LANGUAGE);
norway.setName("no"); // No default for Norwegian
languageMenu.add(norway);
// add German
JMenuItem german = new JMenuItem(JMeterUtils.getResString("de"), 'G');
german.addActionListener(ReportActionRouter.getInstance());
german.setActionCommand(ChangeLanguage.CHANGE_LANGUAGE);
german.setName(Locale.GERMAN.getLanguage());
languageMenu.add(german);
// add French
JMenuItem french = new JMenuItem(JMeterUtils.getResString("fr"), 'F');
french.addActionListener(ReportActionRouter.getInstance());
french.setActionCommand(ChangeLanguage.CHANGE_LANGUAGE);
french.setName(Locale.FRENCH.getLanguage());
languageMenu.add(french);
// add chinese (simple)
JMenuItem chineseSimple = new JMenuItem(JMeterUtils.getResString("zh_cn"));
chineseSimple.addActionListener(ReportActionRouter.getInstance());
chineseSimple.setActionCommand(ChangeLanguage.CHANGE_LANGUAGE);
chineseSimple.setName(Locale.SIMPLIFIED_CHINESE.toString());
languageMenu.add(chineseSimple);
// add chinese (traditional)
JMenuItem chineseTrad = new JMenuItem(JMeterUtils.getResString("zh_TW"));
chineseTrad.addActionListener(ReportActionRouter.getInstance());
chineseTrad.setActionCommand(ChangeLanguage.CHANGE_LANGUAGE);
chineseTrad.setName(Locale.TRADITIONAL_CHINESE.toString());
languageMenu.add(chineseTrad);
// add spanish
JMenuItem spanish = new JMenuItem(JMeterUtils.getResString("es"));
spanish.addActionListener(ReportActionRouter.getInstance());
spanish.setActionCommand(ChangeLanguage.CHANGE_LANGUAGE);
spanish.setName("es");
languageMenu.add(spanish);
return languageMenu;
}
/*
* Strings used to set up and process actions in this menu The strings need
* to agree with the those in the Action routines
*/
public static final String ACTION_SHUTDOWN = "shutdown";
public static final String ACTION_STOP = "stop";
public static final String ACTION_START = "start";
private void makeRunMenu() {
// RUN MENU
runMenu = new JMenu(JMeterUtils.getResString("run"));
runMenu.setMnemonic('R');
run_start = new JMenuItem(JMeterUtils.getResString("start"), 'S');
run_start.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, KeyEvent.CTRL_MASK));
run_start.addActionListener(ReportActionRouter.getInstance());
run_start.setActionCommand(ACTION_START);
run_stop = new JMenuItem(JMeterUtils.getResString("stop"), 'T');
run_stop.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_PERIOD, KeyEvent.CTRL_MASK));
run_stop.setEnabled(false);
run_stop.addActionListener(ReportActionRouter.getInstance());
run_stop.setActionCommand(ACTION_STOP);
run_shut = new JMenuItem(JMeterUtils.getResString("shutdown"), 'Y');
run_shut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_COMMA, KeyEvent.CTRL_MASK));
run_shut.setEnabled(false);
run_shut.addActionListener(ReportActionRouter.getInstance());
run_shut.setActionCommand(ACTION_SHUTDOWN);
run_clear = new JMenuItem(JMeterUtils.getResString("clear"), 'C');
run_clear.addActionListener(ReportActionRouter.getInstance());
run_clear.setActionCommand(org.apache.jmeter.gui.action.Clear.CLEAR);
run_clearAll = new JMenuItem(JMeterUtils.getResString("clear_all"), 'a');
run_clearAll.addActionListener(ReportActionRouter.getInstance());
run_clearAll.setActionCommand(org.apache.jmeter.gui.action.Clear.CLEAR_ALL);
run_clearAll.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, KeyEvent.CTRL_MASK));
runMenu.add(run_start);
if (remote_start != null) {
runMenu.add(remote_start);
}
remote_start_all = new JMenuItem(JMeterUtils.getResString("remote_start_all"), 'Z');
remote_start_all.setName("remote_start_all");
remote_start_all.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, KeyEvent.CTRL_MASK));
remote_start_all.addActionListener(ReportActionRouter.getInstance());
remote_start_all.setActionCommand("remote_start_all");
runMenu.add(remote_start_all);
runMenu.add(run_stop);
runMenu.add(run_shut);
if (remote_stop != null) {
runMenu.add(remote_stop);
}
remote_stop_all = new JMenuItem(JMeterUtils.getResString("remote_stop_all"), 'X');
remote_stop_all.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, KeyEvent.ALT_MASK));
remote_stop_all.addActionListener(ReportActionRouter.getInstance());
remote_stop_all.setActionCommand("remote_stop_all");
runMenu.add(remote_stop_all);
if (remote_exit != null) {
runMenu.add(remote_exit);
}
remote_exit_all = new JMenuItem(JMeterUtils.getResString("remote_exit_all"));
remote_exit_all.addActionListener(ReportActionRouter.getInstance());
remote_exit_all.setActionCommand("remote_exit_all");
runMenu.add(remote_exit_all);
runMenu.addSeparator();
runMenu.add(run_clear);
runMenu.add(run_clearAll);
}
private void makeEditMenu() {
// EDIT MENU
editMenu = new JMenu(JMeterUtils.getResString("edit"));
// From the Java Look and Feel Guidelines: If all items in a menu
// are disabled, then disable the menu. Makes sense.
editMenu.setEnabled(false);
}
private void makeFileMenu() {
// FILE MENU
fileMenu = new JMenu(JMeterUtils.getResString("file"));
fileMenu.setMnemonic('F');
JMenuItem file_save = new JMenuItem(JMeterUtils.getResString("save"), 'S');
file_save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, KeyEvent.CTRL_MASK));
file_save.setActionCommand("save");
file_save.addActionListener(ReportActionRouter.getInstance());
file_save.setEnabled(true);
file_save_as = new JMenuItem(JMeterUtils.getResString("save_all_as"), 'A');
file_save_as.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, KeyEvent.CTRL_MASK));
file_save_as.setActionCommand("save_all_as");
file_save_as.addActionListener(ReportActionRouter.getInstance());
file_save_as.setEnabled(true);
file_load = new JMenuItem(JMeterUtils.getResString("menu_open"), 'O');
file_load.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, KeyEvent.CTRL_MASK));
file_load.addActionListener(ReportActionRouter.getInstance());
// Set default SAVE menu item to disabled since the default node that
// is selected is ROOT, which does not allow items to be inserted.
file_load.setEnabled(false);
file_load.setActionCommand("open");
file_close = new JMenuItem(JMeterUtils.getResString("menu_close"), 'C');
file_close.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_L, KeyEvent.CTRL_MASK));
file_close.setActionCommand("close");
file_close.addActionListener(ReportActionRouter.getInstance());
file_exit = new JMenuItem(JMeterUtils.getResString("exit"), 'X');
file_exit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, KeyEvent.CTRL_MASK));
file_exit.setActionCommand("exit");
file_exit.addActionListener(ReportActionRouter.getInstance());
file_merge = new JMenuItem(JMeterUtils.getResString("menu_merge"), 'M');
// file_merge.setAccelerator(
// KeyStroke.getKeyStroke(KeyEvent.VK_O, KeyEvent.CTRL_MASK));
file_merge.addActionListener(ReportActionRouter.getInstance());
// Set default SAVE menu item to disabled since the default node that
// is selected is ROOT, which does not allow items to be inserted.
file_merge.setEnabled(false);
file_merge.setActionCommand("merge");
fileMenu.add(file_close);
fileMenu.add(file_load);
fileMenu.add(file_merge);
fileMenu.add(file_save);
fileMenu.add(file_save_as);
fileMenu.addSeparator();
fileMenu.add(file_exit);
}
public void setRunning(boolean running, String host) {
log.info("setRunning(" + running + "," + host + ")");
Iterator iter = remote_engine_start.iterator();
Iterator iter2 = remote_engine_stop.iterator();
Iterator iter3 = remote_engine_exit.iterator();
while (iter.hasNext() && iter2.hasNext() && iter3.hasNext()) {
JMenuItem start = (JMenuItem) iter.next();
JMenuItem stop = (JMenuItem) iter2.next();
JMenuItem exit = (JMenuItem) iter3.next();
if (start.getText().equals(host)) {
log.info("Found start host: " + start.getText());
start.setEnabled(!running);
}
if (stop.getText().equals(host)) {
log.info("Found stop host: " + stop.getText());
stop.setEnabled(running);
}
if (exit.getText().equals(host)) {
log.info("Found exit host: " + exit.getText());
exit.setEnabled(true);
}
}
}
public void setEnabled(boolean enable) {
run_start.setEnabled(!enable);
run_stop.setEnabled(enable);
run_shut.setEnabled(enable);
}
private void getRemoteItems() {
if (remoteHosts.length > 0) {
remote_start = new JMenu(JMeterUtils.getResString("remote_start"));
remote_stop = new JMenu(JMeterUtils.getResString("remote_stop"));
remote_exit = new JMenu(JMeterUtils.getResString("remote_exit"));
for (int i = 0; i < remoteHosts.length; i++) {
remoteHosts[i] = remoteHosts[i].trim();
JMenuItem item = new JMenuItem(remoteHosts[i]);
item.setActionCommand("remote_start");
item.setName(remoteHosts[i]);
item.addActionListener(ReportActionRouter.getInstance());
remote_engine_start.add(item);
remote_start.add(item);
item = new JMenuItem(remoteHosts[i]);
item.setActionCommand("remote_stop");
item.setName(remoteHosts[i]);
item.addActionListener(ReportActionRouter.getInstance());
item.setEnabled(false);
remote_engine_stop.add(item);
remote_stop.add(item);
item = new JMenuItem(remoteHosts[i]);
item.setActionCommand("remote_exit");
item.setName(remoteHosts[i]);
item.addActionListener(ReportActionRouter.getInstance());
item.setEnabled(false);
remote_engine_exit.add(item);
remote_exit.add(item);
}
}
}
/**
* Processes a locale change notification. Changes the texts in all menus to
* the new language.
*/
public void localeChanged(LocaleChangeEvent event) {
updateMenuElement(fileMenu);
updateMenuElement(editMenu);
updateMenuElement(runMenu);
updateMenuElement(optionsMenu);
updateMenuElement(helpMenu);
}
/**
* Refreshes all texts in the menu and all submenus to a new locale.
*/
private void updateMenuElement(MenuElement menu) {
Component component = menu.getComponent();
if (component.getName() != null) {
if (component instanceof JMenu) {
((JMenu) component).setText(JMeterUtils.getResString(component.getName()));
} else {
((JMenuItem) component).setText(JMeterUtils.getResString(component.getName()));
}
}
MenuElement[] subelements = menu.getSubElements();
for (int i = 0; i < subelements.length; i++) {
updateMenuElement(subelements[i]);
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org