You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by pm...@apache.org on 2017/11/15 21:00:52 UTC

svn commit: r1815374 - in /jmeter/trunk: src/core/org/apache/jmeter/control/gui/ src/core/org/apache/jmeter/gui/action/ src/core/org/apache/jmeter/gui/tree/ src/core/org/apache/jmeter/gui/util/ src/core/org/apache/jmeter/testelement/ src/protocol/http/...

Author: pmouawad
Date: Wed Nov 15 21:00:51 2017
New Revision: 1815374

URL: http://svn.apache.org/viewvc?rev=1815374&view=rev
Log:
Bug 61591 - UX : Remove Workbench
Contributed by Artem Fedorov with modifications to fix the Popup Menu on the Non Test Elements that allows actions that are meaningless now
This closes #330
Bugzilla Id: 61591

Modified:
    jmeter/trunk/src/core/org/apache/jmeter/control/gui/TestPlanGui.java
    jmeter/trunk/src/core/org/apache/jmeter/control/gui/WorkBenchGui.java
    jmeter/trunk/src/core/org/apache/jmeter/gui/action/CheckDirty.java
    jmeter/trunk/src/core/org/apache/jmeter/gui/action/Load.java
    jmeter/trunk/src/core/org/apache/jmeter/gui/action/Move.java
    jmeter/trunk/src/core/org/apache/jmeter/gui/action/Save.java
    jmeter/trunk/src/core/org/apache/jmeter/gui/tree/JMeterTreeModel.java
    jmeter/trunk/src/core/org/apache/jmeter/gui/util/MenuFactory.java
    jmeter/trunk/src/core/org/apache/jmeter/testelement/WorkBench.java
    jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/gui/HttpMirrorControlGui.java
    jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/proxy/ProxyControl.java
    jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/proxy/gui/ProxyControlGui.java
    jmeter/trunk/xdocs/changes.xml
    jmeter/trunk/xdocs/usermanual/build-test-plan.xml
    jmeter/trunk/xdocs/usermanual/component_reference.xml

Modified: jmeter/trunk/src/core/org/apache/jmeter/control/gui/TestPlanGui.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/control/gui/TestPlanGui.java?rev=1815374&r1=1815373&r2=1815374&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/control/gui/TestPlanGui.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/control/gui/TestPlanGui.java Wed Nov 15 21:00:51 2017
@@ -92,6 +92,7 @@ public class TestPlanGui extends Abstrac
         JMenu addMenu = new JMenu(JMeterUtils.getResString("add")); // $NON-NLS-1$
         addMenu.add(MenuFactory.makeMenu(MenuFactory.THREADS, ActionNames.ADD));
         addMenu.add(MenuFactory.makeMenu(MenuFactory.FRAGMENTS, ActionNames.ADD));
+        addMenu.add(MenuFactory.makeMenu(MenuFactory.NON_TEST_ELEMENTS, ActionNames.ADD));
         addMenu.add(MenuFactory.makeMenu(MenuFactory.CONFIG_ELEMENTS, ActionNames.ADD));
         addMenu.add(MenuFactory.makeMenu(MenuFactory.TIMERS, ActionNames.ADD));
         addMenu.add(MenuFactory.makeMenu(MenuFactory.PRE_PROCESSORS, ActionNames.ADD));

Modified: jmeter/trunk/src/core/org/apache/jmeter/control/gui/WorkBenchGui.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/control/gui/WorkBenchGui.java?rev=1815374&r1=1815373&r2=1815374&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/control/gui/WorkBenchGui.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/control/gui/WorkBenchGui.java Wed Nov 15 21:00:51 2017
@@ -36,8 +36,9 @@ import org.apache.jmeter.util.JMeterUtil
 /**
  * JMeter GUI component representing a work bench where users can make
  * preparations for the test plan.
- *
+ * @deprecated since 4.0 Non Test Elements are now children of Test Plan
  */
+@Deprecated
 public class WorkBenchGui extends AbstractJMeterGuiComponent {
     private static final long serialVersionUID = 240L;
     // This check-box defines whether to save  WorkBench content or not

Modified: jmeter/trunk/src/core/org/apache/jmeter/gui/action/CheckDirty.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/action/CheckDirty.java?rev=1815374&r1=1815373&r2=1815374&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/action/CheckDirty.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/action/CheckDirty.java Wed Nov 15 21:00:51 2017
@@ -28,7 +28,6 @@ import java.util.Set;
 import org.apache.jmeter.gui.GuiPackage;
 import org.apache.jmeter.gui.tree.JMeterTreeNode;
 import org.apache.jmeter.testelement.TestElement;
-import org.apache.jmeter.testelement.WorkBench;
 import org.apache.jorphan.collections.HashTree;
 import org.apache.jorphan.collections.HashTreeTraverser;
 import org.apache.jorphan.collections.ListedHashTree;
@@ -91,9 +90,6 @@ public class CheckDirty extends Abstract
         } else if (action.equals(ActionNames.ADD_ALL)) {
             previousGuiItems.clear();
             GuiPackage.getInstance().getTreeModel().getTestPlan().traverse(this);
-            if (isWorkbenchSaveable()) {
-                GuiPackage.getInstance().getTreeModel().getWorkBench().traverse(this);
-            }
         } else if (action.equals(ActionNames.CHECK_REMOVE) ||
                 action.equals(ActionNames.CHECK_CUT)) {
             GuiPackage guiPackage = GuiPackage.getInstance();
@@ -118,9 +114,6 @@ public class CheckDirty extends Abstract
             //remember
             previousGuiItems.clear();
             GuiPackage.getInstance().getTreeModel().getTestPlan().traverse(this);
-            if (isWorkbenchSaveable()) {
-                GuiPackage.getInstance().getTreeModel().getWorkBench().traverse(this);
-            }
         }
         else {
             dirty = false;
@@ -129,13 +122,6 @@ public class CheckDirty extends Abstract
                 HashTree wholeTree = GuiPackage.getInstance().getTreeModel().getTestPlan();
                 wholeTree.traverse(this);
                 
-                // check the workbench for modification
-                if(!dirty) { // NOSONAR
-                    if (isWorkbenchSaveable()) {
-                        HashTree workbench = GuiPackage.getInstance().getTreeModel().getWorkBench();
-                        workbench.traverse(this);
-                    }
-                }
             } finally {
                 checkMode = false;
             }
@@ -143,13 +129,6 @@ public class CheckDirty extends Abstract
         GuiPackage.getInstance().setDirty(dirty);
     }
 
-    /**
-     * check if the workbench should be saved
-     */
-    private boolean isWorkbenchSaveable() {
-        JMeterTreeNode workbenchNode = (JMeterTreeNode) ((JMeterTreeNode) GuiPackage.getInstance().getTreeModel().getRoot()).getChildAt(1);
-        return ((WorkBench) workbenchNode.getUserObject()).getSaveWorkBench();
-    }
 
     /**
      * The tree traverses itself depth-first, calling addNode for each

Modified: jmeter/trunk/src/core/org/apache/jmeter/gui/action/Load.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/action/Load.java?rev=1815374&r1=1815373&r2=1815374&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/action/Load.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/action/Load.java Wed Nov 15 21:00:51 2017
@@ -38,7 +38,6 @@ import org.apache.jmeter.save.SaveServic
 import org.apache.jmeter.services.FileServer;
 import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.testelement.TestPlan;
-import org.apache.jmeter.testelement.WorkBench;
 import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jorphan.collections.HashTree;
 import org.slf4j.Logger;
@@ -181,7 +180,7 @@ public class Load extends AbstractAction
 
         if (merging){ // Check if target of merge is reasonable
             final TestElement te = (TestElement)tree.getArray()[0];
-            if (!(te instanceof WorkBench || te instanceof TestPlan)){// These are handled specially by addToTree
+            if (!(te instanceof TestPlan)) {// These are handled specially by addToTree
                 final boolean ok = MenuFactory.canAddTo(guiInstance.getCurrentNode(), te);
                 if (!ok){
                     String name = te.getName();

Modified: jmeter/trunk/src/core/org/apache/jmeter/gui/action/Move.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/action/Move.java?rev=1815374&r1=1815373&r2=1815374&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/action/Move.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/action/Move.java Wed Nov 15 21:00:51 2017
@@ -33,7 +33,6 @@ import org.apache.jmeter.gui.tree.JMeter
 import org.apache.jmeter.gui.util.MenuFactory;
 import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.testelement.TestPlan;
-import org.apache.jmeter.testelement.WorkBench;
 
 /**
  * Move a node up/down/left/right 
@@ -120,7 +119,7 @@ public class Move extends AbstractAction
     private JMeterTreeNode getParentNode(JMeterTreeNode currentNode) {
         JMeterTreeNode parentNode = (JMeterTreeNode) currentNode.getParent();
         TestElement te = currentNode.getTestElement();
-        if (te instanceof TestPlan || te instanceof WorkBench) {
+        if (te instanceof TestPlan) {
             parentNode = null; // So elements can only be added as children
         }
         return parentNode;

Modified: jmeter/trunk/src/core/org/apache/jmeter/gui/action/Save.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/action/Save.java?rev=1815374&r1=1815373&r2=1815374&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/action/Save.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/action/Save.java Wed Nov 15 21:00:51 2017
@@ -50,7 +50,6 @@ import org.apache.jmeter.save.SaveServic
 import org.apache.jmeter.services.FileServer;
 import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.testelement.TestPlan;
-import org.apache.jmeter.testelement.WorkBench;
 import org.apache.jmeter.threads.ThreadGroup;
 import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jorphan.collections.HashTree;
@@ -163,13 +162,7 @@ public class Save extends AbstractAction
             }
         } else {
             fullSave = true;
-            HashTree testPlan = GuiPackage.getInstance().getTreeModel().getTestPlan();
-            // If saveWorkBench 
-            if (isWorkbenchSaveable()) {
-                HashTree workbench = GuiPackage.getInstance().getTreeModel().getWorkBench();
-                testPlan.add(workbench);
-            }
-            subTree = testPlan;
+            subTree = GuiPackage.getInstance().getTreeModel().getTestPlan();
         }
 
         String updateFile = GuiPackage.getInstance().getTestPlanFile();
@@ -225,10 +218,6 @@ public class Save extends AbstractAction
             if (fullSave) { // Only update the stored copy of the tree for a full save
                 FileServer.getFileServer().setScriptName(new File(updateFile).getName());
                 subTree = GuiPackage.getInstance().getTreeModel().getTestPlan(); // refetch, because convertSubTree affects it
-                if (isWorkbenchSaveable()) {
-                    HashTree workbench = GuiPackage.getInstance().getTreeModel().getWorkBench();
-                    subTree.add(workbench);
-                }
                 ActionRouter.getInstance().doActionNow(new ActionEvent(subTree, e.getID(), ActionNames.SUB_TREE_SAVED));
             }
             
@@ -396,13 +385,6 @@ public class Save extends AbstractAction
                 .orElse(0);
     }
     
-    /**
-     * check if the workbench should be saved
-     */
-    private boolean isWorkbenchSaveable() {
-        JMeterTreeNode workbenchNode = (JMeterTreeNode) ((JMeterTreeNode) GuiPackage.getInstance().getTreeModel().getRoot()).getChildAt(1);
-        return ((WorkBench) workbenchNode.getUserObject()).getSaveWorkBench();
-    }
 
     /**
      * Check nodes does not contain a node of type TestPlan or ThreadGroup

Modified: jmeter/trunk/src/core/org/apache/jmeter/gui/tree/JMeterTreeModel.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/tree/JMeterTreeModel.java?rev=1815374&r1=1815373&r2=1815374&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/tree/JMeterTreeModel.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/tree/JMeterTreeModel.java Wed Nov 15 21:00:51 2017
@@ -18,6 +18,7 @@
 
 package org.apache.jmeter.gui.tree;
 
+import java.util.Collection;
 import java.util.Enumeration;
 import java.util.LinkedList;
 import java.util.List;
@@ -25,11 +26,13 @@ import java.util.List;
 import javax.swing.tree.DefaultTreeModel;
 
 import org.apache.jmeter.config.gui.AbstractConfigGui;
+import org.apache.jmeter.control.TestFragmentController;
+import org.apache.jmeter.control.gui.TestFragmentControllerGui;
 import org.apache.jmeter.control.gui.TestPlanGui;
-import org.apache.jmeter.control.gui.WorkBenchGui;
 import org.apache.jmeter.exceptions.IllegalUserActionException;
 import org.apache.jmeter.gui.GuiPackage;
 import org.apache.jmeter.gui.JMeterGUIComponent;
+import org.apache.jmeter.gui.util.MenuFactory;
 import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.testelement.TestPlan;
 import org.apache.jmeter.testelement.WorkBench;
@@ -40,13 +43,24 @@ public class JMeterTreeModel extends Def
 
     private static final long serialVersionUID = 240L;
 
+    /**
+     * Deprecated after remove WorkBench
+     * @param tp - Test Plan
+     * @param wb - WorkBench
+     * @deprecated since 4.0
+     */
+    @Deprecated
     public JMeterTreeModel(TestElement tp, TestElement wb) {
-        super(new JMeterTreeNode(wb, null));
-        initTree(tp,wb);
+        this(tp);
+    }
+
+    public JMeterTreeModel(TestElement tp) {
+        super(new JMeterTreeNode(tp, null));
+        initTree(tp);
     }
 
     public JMeterTreeModel() {
-        this(new TestPlanGui().createTestElement(),new WorkBenchGui().createTestElement());
+        this(new TestPlanGui().createTestElement());
     }
 
     /**
@@ -57,7 +71,7 @@ public class JMeterTreeModel extends Def
      */
     @Deprecated
     public JMeterTreeModel(Object o) {
-        this(new TestPlan(),new WorkBench());
+        this(new TestPlan());
     }
 
     /**
@@ -90,13 +104,11 @@ public class JMeterTreeModel extends Def
      *            <code>current</code>
      * @param current
      *            The node in which the <code>subTree</code> is to be inserted.
-     *            Will be overridden, when an instance of {@link TestPlan} or
-     *            {@link WorkBench} is found in the subtree.
+     *            Will be overridden, when an instance of {@link TestPlan}
      * @return newly created sub tree now found at <code>current</code>
      * @throws IllegalUserActionException
      *             when <code>current</code> is not an instance of
      *             {@link AbstractConfigGui} and no instance of {@link TestPlan}
-     *             or {@link WorkBench} could be found in the
      *             <code>subTree</code>
      */
     public HashTree addSubTree(HashTree subTree, JMeterTreeNode current) throws IllegalUserActionException {
@@ -112,11 +124,11 @@ public class JMeterTreeModel extends Def
                 userObject.setSerialized(tp.isSerialized());
                 addSubTree(subTree.getTree(item), current);
             } else if (item instanceof WorkBench) {
-                current = (JMeterTreeNode) ((JMeterTreeNode) getRoot()).getChildAt(1);
-                final TestElement testElement = (TestElement) current.getUserObject();
-                testElement.addTestElement(item);
-                testElement.setName(item.getName());
-                addSubTree(subTree.getTree(item), current);
+                //Move item from WorkBench to TestPlan
+                HashTree workbenchTree = subTree.getTree(item);
+                if (!workbenchTree.isEmpty()) {
+                    moveWorkBenchToTestPlan(current, workbenchTree);
+                }
             } else {
                 addSubTree(subTree.getTree(item), addComponent(item, current));
             }
@@ -164,7 +176,7 @@ public class JMeterTreeModel extends Def
     }
 
     public void removeNodeFromParent(JMeterTreeNode node) {
-        if (!(node.getUserObject() instanceof TestPlan) && !(node.getUserObject() instanceof WorkBench)) {
+        if (!(node.getUserObject() instanceof TestPlan)) {
             super.removeNodeFromParent(node);
         }
     }
@@ -218,13 +230,6 @@ public class JMeterTreeModel extends Def
         return getCurrentSubTree((JMeterTreeNode) ((JMeterTreeNode) this.getRoot()).getChildAt(0));
     }
 
-    /**
-     * Get the {@link WorkBench} from the root of this tree
-     * @return The {@link WorkBench} found at the root of this tree
-     */
-    public HashTree getWorkBench() {
-        return getCurrentSubTree((JMeterTreeNode) ((JMeterTreeNode) this.getRoot()).getChildAt(1));
-    }
 
     /**
      * Clear the test plan, and use default node for test plan and workbench.
@@ -252,23 +257,77 @@ public class JMeterTreeModel extends Def
             children = getChildCount(getRoot());
         }
         // Init the tree
-        initTree(testPlan,new WorkBenchGui().createTestElement()); // Assumes this is only called from GUI mode
+        initTree(testPlan); // Assumes this is only called from GUI mode
     }
 
     /**
      * Initialize the model with nodes for testplan and workbench.
      *
      * @param tp the element to use as testplan
-     * @param wb the element to use as workbench
      */
-    private void initTree(TestElement tp, TestElement wb) {
+    private void initTree(TestElement tp) {
         // Insert the test plan node
         insertNodeInto(new JMeterTreeNode(tp, this), (JMeterTreeNode) getRoot(), 0);
-        // Insert the workbench node
-        insertNodeInto(new JMeterTreeNode(wb, this), (JMeterTreeNode) getRoot(), 1);
         // Let others know that the tree content has changed.
         // This should not be necessary, but without it, nodes are not shown when the user
         // uses the Close menu item
         nodeStructureChanged((JMeterTreeNode)getRoot());
     }
+
+
+    /**
+     * Move all Non-Test Elements from WorkBench to TestPlan root.
+     * Other Test Elements will be move to WorkBench Test Fragment in TestPlan
+     * @param current - TestPlan root
+     * @param workbenchTree - WorkBench hash tree
+     */
+    private void moveWorkBenchToTestPlan(JMeterTreeNode current, HashTree workbenchTree) throws IllegalUserActionException {
+        Object[] workbenchTreeArray = workbenchTree.getArray();
+        if (GuiPackage.getInstance() != null) {
+            for (Object node : workbenchTreeArray) {
+                if (isNonTestElement(node)) {
+                    HashTree subtree = workbenchTree.getTree(node);
+                    workbenchTree.remove(node);
+                    HashTree tree = new HashTree();
+                    tree.add(node);
+                    tree.add(node, subtree);
+                    ((TestElement) node).setProperty(TestElement.ENABLED, false);
+                    addSubTree(tree, current);
+                }
+            }
+        }
+
+        if (!workbenchTree.isEmpty()) {
+            HashTree testFragmentTree = new HashTree();
+            TestFragmentController testFragmentController = new TestFragmentController();
+            testFragmentController.setProperty(TestElement.NAME, "WorkBench Test Fragment");
+            testFragmentController.setProperty(TestElement.GUI_CLASS, TestFragmentControllerGui.class.getName());
+            testFragmentController.setProperty(TestElement.ENABLED, false);
+            testFragmentTree.add(testFragmentController);
+            testFragmentTree.add(testFragmentController, workbenchTree);
+            addSubTree(testFragmentTree, current);
+        }
+    }
+
+    /**
+     * Is element :
+     * <ul>
+     *  <li>HTTP(S) Test Script Recorder</li>
+     *  <li>Mirror Server</li>
+     *  <li>Property Display</li>
+     * </ul>
+     * @param node 
+     */
+    private boolean isNonTestElement(Object node) {
+        JMeterTreeNode treeNode = new JMeterTreeNode((TestElement) node, null);
+        Collection<String> categories = treeNode.getMenuCategories();
+        if (categories != null) {
+            for (String category : categories) {
+                if (MenuFactory.NON_TEST_ELEMENTS.equals(category)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
 }

Modified: jmeter/trunk/src/core/org/apache/jmeter/gui/util/MenuFactory.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/util/MenuFactory.java?rev=1815374&r1=1815373&r2=1815374&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/util/MenuFactory.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/util/MenuFactory.java Wed Nov 15 21:00:51 2017
@@ -53,7 +53,6 @@ import org.apache.jmeter.testbeans.TestB
 import org.apache.jmeter.testbeans.gui.TestBeanGUI;
 import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.testelement.TestPlan;
-import org.apache.jmeter.testelement.WorkBench;
 import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jmeter.visualizers.Printable;
 import org.apache.jorphan.gui.GuiUtils;
@@ -616,9 +615,6 @@ public final class MenuFactory {
         if (null == parentNode) {
             return false;
         }
-        if (foundClass(nodes, new Class[]{WorkBench.class})){// Can't add a Workbench anywhere
-            return false;
-        }
         if (foundClass(nodes, new Class[]{TestPlan.class})){// Can't add a TestPlan anywhere
             return false;
         }
@@ -632,9 +628,11 @@ public final class MenuFactory {
             return false;
         }
 
-        if (parent instanceof WorkBench) {// allow everything else
-            return true;
+        // Cannot move Non-Test Elements from root of Test Plan
+        if (!(parent instanceof TestPlan) && foundMenuCategories(nodes, NON_TEST_ELEMENTS)) {
+            return false;
         }
+
         if (parent instanceof TestPlan) {
             if (foundClass(nodes,
                      new Class[]{Sampler.class, Controller.class}, // Samplers and Controllers need not apply ...
@@ -657,6 +655,7 @@ public final class MenuFactory {
             }
             return true;
         }
+
         // All other
         return false;
     }
@@ -669,6 +668,18 @@ public final class MenuFactory {
                     return true;
                 }
             }
+        }
+        return false;
+    }
+
+    // Is any node an instance of one of the menu category?
+    private static boolean foundMenuCategories(JMeterTreeNode[] nodes, String category) {
+        for (JMeterTreeNode node : nodes) {
+            for (String c : node.getMenuCategories()) {
+                if (category.equals(c)) {
+                    return true;
+                }
+            }
         }
         return false;
     }

Modified: jmeter/trunk/src/core/org/apache/jmeter/testelement/WorkBench.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/testelement/WorkBench.java?rev=1815374&r1=1815373&r2=1815374&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/testelement/WorkBench.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/testelement/WorkBench.java Wed Nov 15 21:00:51 2017
@@ -17,7 +17,10 @@
  */
 
 package org.apache.jmeter.testelement;
-
+/**
+ * @deprecated since 4.0
+ */
+@Deprecated
 public class WorkBench extends AbstractTestElement {
 
     private static final long serialVersionUID = 240L;

Modified: jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/gui/HttpMirrorControlGui.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/gui/HttpMirrorControlGui.java?rev=1815374&r1=1815373&r2=1815374&view=diff
==============================================================================
--- jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/gui/HttpMirrorControlGui.java (original)
+++ jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/control/gui/HttpMirrorControlGui.java Wed Nov 15 21:00:51 2017
@@ -29,6 +29,7 @@ import javax.swing.Box;
 import javax.swing.JButton;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
 import javax.swing.JTextField;
 
 import org.apache.jmeter.control.gui.LogicControllerGui;
@@ -42,6 +43,10 @@ import org.apache.jmeter.util.JMeterUtil
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+/**
+ * GUI of Mirror Server Test element
+ *
+ */
 public class HttpMirrorControlGui extends LogicControllerGui
     implements JMeterGUIComponent, ActionListener, UnsharedComponent {
 
@@ -74,7 +79,7 @@ public class HttpMirrorControlGui extend
     @Override
     public TestElement createTestElement() {
         mirrorController = new HttpMirrorControl();
-        log.debug("creating/configuring model = " + mirrorController);
+        log.debug("creating/configuring model = {}", mirrorController);
         modifyTestElement(mirrorController);
         return mirrorController;
     }
@@ -107,7 +112,7 @@ public class HttpMirrorControlGui extend
 
     @Override
     public void configure(TestElement element) {
-        log.debug("Configuring gui with " + element);
+        log.debug("Configuring gui with {}", element);
         super.configure(element);
         mirrorController = (HttpMirrorControl) element;
         portField.setText(mirrorController.getPortString());
@@ -210,4 +215,16 @@ public class HttpMirrorControlGui extend
         portField.setText(HttpMirrorControl.DEFAULT_PORT_S);
         maxPoolSizeField.setText(Integer.toString(HttpMirrorControl.DEFAULT_MAX_POOL_SIZE));
     }
+    
+    /**
+     * Redefined to remove change parent and inserrt parent menu
+     * @see org.apache.jmeter.control.gui.AbstractControllerGui#createPopupMenu()
+     */
+    @Override
+    public JPopupMenu createPopupMenu() {
+        JPopupMenu pop = new JPopupMenu();        
+        MenuFactory.addEditMenu(pop, true);
+        MenuFactory.addFileMenu(pop);
+        return pop;
+    }
 }

Modified: jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/proxy/ProxyControl.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/proxy/ProxyControl.java?rev=1815374&r1=1815373&r2=1815374&view=diff
==============================================================================
--- jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/proxy/ProxyControl.java (original)
+++ jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/proxy/ProxyControl.java Wed Nov 15 21:00:51 2017
@@ -83,7 +83,6 @@ import org.apache.jmeter.samplers.Sample
 import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.testelement.TestPlan;
 import org.apache.jmeter.testelement.TestStateListener;
-import org.apache.jmeter.testelement.WorkBench;
 import org.apache.jmeter.testelement.property.BooleanProperty;
 import org.apache.jmeter.testelement.property.CollectionProperty;
 import org.apache.jmeter.testelement.property.IntegerProperty;
@@ -1055,7 +1054,6 @@ public class ProxyControl extends Generi
      * <li>The controller specified by the <code>target</code> property.
      * <li>If none was specified, the first RecordingController in the tree.
      * <li>If none is found, the first AbstractThreadGroup in the tree.
-     * <li>If none is found, the Workspace.
      * </ul>
      *
      * @return the tree node for the controller where the proxy must store the
@@ -1074,10 +1072,6 @@ public class ProxyControl extends Generi
         if (myTarget != null) {
             return myTarget;
         }
-        myTarget = findFirstNodeOfType(WorkBench.class);
-        if (myTarget != null) {
-            return myTarget;
-        }
         log.error("Program error: test script recording target not found.");
         return null;
     }

Modified: jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/proxy/gui/ProxyControlGui.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/proxy/gui/ProxyControlGui.java?rev=1815374&r1=1815373&r2=1815374&view=diff
==============================================================================
--- jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/proxy/gui/ProxyControlGui.java (original)
+++ jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/proxy/gui/ProxyControlGui.java Wed Nov 15 21:00:51 2017
@@ -48,6 +48,7 @@ import javax.swing.JButton;
 import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
 import javax.swing.JLabel;
+import javax.swing.JMenu;
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.JPopupMenu;
@@ -65,6 +66,7 @@ import org.apache.jmeter.functions.Inval
 import org.apache.jmeter.gui.GuiPackage;
 import org.apache.jmeter.gui.JMeterGUIComponent;
 import org.apache.jmeter.gui.UnsharedComponent;
+import org.apache.jmeter.gui.action.ActionNames;
 import org.apache.jmeter.gui.tree.JMeterTreeNode;
 import org.apache.jmeter.gui.util.HeaderAsPropertyRenderer;
 import org.apache.jmeter.gui.util.HorizontalPanel;
@@ -77,7 +79,6 @@ import org.apache.jmeter.protocol.http.p
 import org.apache.jmeter.protocol.http.sampler.HTTPSamplerFactory;
 import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.testelement.TestPlan;
-import org.apache.jmeter.testelement.WorkBench;
 import org.apache.jmeter.testelement.property.PropertyIterator;
 import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jorphan.exec.KeyToolUtils;
@@ -86,6 +87,10 @@ import org.apache.jorphan.gui.JLabeledTe
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+/**
+ * GUI of HTTP(s) Test Script Recorder
+ *
+ */
 public class ProxyControlGui extends LogicControllerGui implements JMeterGUIComponent, ActionListener, ItemListener,
         KeyListener, UnsharedComponent {
     private static final Logger log = LoggerFactory.getLogger(ProxyControlGui.class);
@@ -636,7 +641,8 @@ public class ProxyControlGui extends Log
 
         if (fieldName.equals(PORT_FIELD_NAME)) {
             try {
-                Integer.parseInt(portField.getText());
+                int port = Integer.parseInt(portField.getText());
+                log.debug("Using port {} for recording", port);
             } catch (NumberFormatException nfe) {
                 int length = portField.getText().length();
                 if (length > 0) {
@@ -1131,7 +1137,7 @@ public class ProxyControlGui extends Log
                     targetNodesModel.addElement(tnw);
                     name.append(separator);
                     buildNodesModel(cur, name.toString(), level + 1);
-                } else if (te instanceof TestPlan || te instanceof WorkBench) {
+                } else if (te instanceof TestPlan) {
                     name.append(cur.getName());
                     name.append(separator);
                     buildNodesModel(cur, name.toString(), 0);
@@ -1140,4 +1146,23 @@ public class ProxyControlGui extends Log
             }
         }
     }
+    
+    /**
+     * Redefined to remove change parent and inserrt parent menu
+     * @see org.apache.jmeter.control.gui.AbstractControllerGui#createPopupMenu()
+     */
+    @Override
+    public JPopupMenu createPopupMenu() {
+        JPopupMenu pop = new JPopupMenu();
+        JMenu addMenu = new JMenu(JMeterUtils.getResString("add")); // $NON-NLS-1$
+        addMenu.add(MenuFactory.makeMenu(MenuFactory.TIMERS, ActionNames.ADD));
+        addMenu.add(MenuFactory.makeMenu(MenuFactory.PRE_PROCESSORS, ActionNames.ADD));
+        addMenu.add(MenuFactory.makeMenu(MenuFactory.LISTENERS, ActionNames.ADD));
+
+        pop.add(addMenu);
+        
+        MenuFactory.addEditMenu(pop, true);
+        MenuFactory.addFileMenu(pop);
+        return pop;
+    }
 }

Modified: jmeter/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1815374&r1=1815373&r2=1815374&view=diff
==============================================================================
--- jmeter/trunk/xdocs/changes.xml [utf-8] (original)
+++ jmeter/trunk/xdocs/changes.xml [utf-8] Wed Nov 15 21:00:51 2017
@@ -81,6 +81,9 @@ Summary
     uncheck <code>Run tearDown Thread Groups after shutdown of main threads</code> on <code>Test Plan</code> element, see <bugzilla>61656</bugzilla></li>
     <li>Properties <code>sampleresult.getbytes.headers_size</code> and <code>sampleresult.getbytes.body_real_size</code> have been dropped, see <bugzilla>61587</bugzilla></li>
     <li>JMeter will now save your test plan whenever you run it. This behaviour can be controlled by property <code>save_automatically_before_run</code></li>
+    <li>Workbench element has been dropped, you now directly add <code>Non Test Element</code> as children of Test Plan. When loading a Test Plan that contains the element
+    JMeter will move the <code>Mirror Server</code>, <code>Property Display</code> and HTTP(s) <code>Test Script Recorder</code> elements as direct children of Test Plan. For 
+    any other element, it will create a <code>Test Fragment</code> element called <code>Workbench Test Fragment and move the elements in it</code>.</li>
 </ul>
 <!-- =================== Improvements =================== -->
 
@@ -143,6 +146,7 @@ Summary
 
 <h3>General</h3>
 <ul>
+    <li><bug>61591</bug>Drop Workbench from test tree. Implemented by Artem Fedorov (artem at blazemeter.com) and contributed by BlazeMeter Ltd.</li>
     <li><bug>61549</bug>Thread Group : Remove start and end date</li>
     <li><bug>61529</bug>Migration to Java 9. Partly contributed by Ubik Load Pack (support at ubikloadpack.com)</li>
     <li><bug>61709</bug>SampleResult : Add a method <code>setIgnore()</code> to make JMeter ignore the SampleResult and not send it to listeners</li>
@@ -234,12 +238,14 @@ Summary
 <ul>
     <li>Igor Panainte (panainte.i at gmail.com)</li>
     <li>Emilian Bold (emi at apache.org)</li>
-    <li><a href="http://ubikloadpack.com">Ubik Load Pack</a></li>
+    <li><a href="https://ubikloadpack.com">Ubik Load Pack</a></li>
     <li>Justin McCartney (be_strew at yahoo.co.uk)</li>
     <li>Vincent Herilier (https://github.com/vherilier)</li>
     <li>Aleksei Balan (abalanonline at gmail.com)</li>
     <li>Graham Russell (graham at ham1.co.uk)</li>
     <li>orimarko at gmail.com</li>
+    <li>Artem Fedorov (artem at blazemeter.com)</li>
+    <li><a href="https://www.blazemeter.com">BlazeMeter Ltd</a></li>
 </ul>
 <p>We also thank bug reporters who helped us improve JMeter. <br/>
 For this release we want to give special thanks to the following reporters for the clear reports and tests made after our fixes:</p>

Modified: jmeter/trunk/xdocs/usermanual/build-test-plan.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/usermanual/build-test-plan.xml?rev=1815374&r1=1815373&r2=1815374&view=diff
==============================================================================
--- jmeter/trunk/xdocs/usermanual/build-test-plan.xml (original)
+++ jmeter/trunk/xdocs/usermanual/build-test-plan.xml Wed Nov 15 21:00:51 2017
@@ -53,7 +53,6 @@ your elements are saved.  JMeter will me
 JMeter will save the element selected, plus all child elements beneath it.  In this way,
 you can save test tree fragments and individual elements for later use.</p>
 
-<note>By default, the workbench is not automatically saved with the test plan, but it can be saved by checking "<code>Save Workbench</code>" option on Workbench element.</note>
 </subsection>
 
 <subsection name="&sect-num;.3 Configuring Tree Elements" anchor="config_element">

Modified: jmeter/trunk/xdocs/usermanual/component_reference.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/usermanual/component_reference.xml?rev=1815374&r1=1815373&r2=1815374&view=diff
==============================================================================
--- jmeter/trunk/xdocs/usermanual/component_reference.xml (original)
+++ jmeter/trunk/xdocs/usermanual/component_reference.xml Wed Nov 15 21:00:51 2017
@@ -2482,7 +2482,6 @@ For this reason it is best to ensure tha
 otherwise a duplicate may be accidentally created when new elements are added to the test plan. 
 </p>
 </description>
-<note>The Module Controller should not be used with remote testing or non-gui testing in conjunction with Workbench components since the Workbench test elements are not part of test plan <code>.jmx</code> files.  Any such test will fail.</note>
 <properties>
         <property name="Name" required="No">Descriptive name for this controller that is shown in the tree.</property>
         <property name="Module to Run" required="Yes">The module controller provides a list of all controllers loaded into the gui.  Select
@@ -6374,24 +6373,7 @@ Behaviour can be modified with some prop
 </properties>
 </component>
 
-<component name="WorkBench" index="&sect-num;.9.3"  width="384" height="103" screenshot="workbench.png">
-<description>
-<p>The WorkBench simply provides a place to temporarily store test elements while not in use, for copy/paste purposes, or any other purpose you desire. 
-When you save your test plan, WorkBench items are not saved with it by default unless you check "<code>Save Workbench</code>" option.
-Your WorkBench can be saved independently, if you like (right-click on <code>WorkBench</code> and choose <code>Save</code>).</p>
-<p>Certain test elements are only available on the WorkBench:</p>
-<ul>
-<li><complink name="HTTP(S) Test Script Recorder"/></li>
-<li><complink name="HTTP Mirror Server"/></li>
-<li><complink name="Property Display"/></li>
-</ul>
-<properties>
-         <property name="Save WorkBench" required="No">
-                Allow to save the WorkBench's elements into the JMX file.
-        </property>
-</properties>
-</description>
-</component>
+<component name="WorkBench" />
 
 <component name="SSL Manager" index="&sect-num;.9.4" screenshot="">
 <p>