View | Details | Raw Unified | Return to bug 42428
Collapse All | Expand All

(-)src/core/org/apache/jmeter/resources/messages.properties (+1 lines)
Lines 878-883 Link Here
878
save_time=Save Elapsed Time
878
save_time=Save Elapsed Time
879
save_timestamp=Save Time Stamp
879
save_timestamp=Save Time Stamp
880
save_url=Save URL
880
save_url=Save URL
881
save_workbench=Save WorkBench
881
sbind=Single bind/unbind
882
sbind=Single bind/unbind
882
scheduler=Scheduler
883
scheduler=Scheduler
883
scheduler_configuration=Scheduler Configuration
884
scheduler_configuration=Scheduler Configuration
(-)src/core/org/apache/jmeter/gui/action/Save.java (-19 / +25 lines)
Lines 18-34 Link Here
18
18
19
package org.apache.jmeter.gui.action;
19
package org.apache.jmeter.gui.action;
20
20
21
import java.awt.event.ActionEvent;
22
import java.io.File;
23
import java.io.FileOutputStream;
24
import java.util.HashSet;
25
import java.util.Iterator;
26
import java.util.LinkedList;
27
import java.util.Set;
28
29
import javax.swing.JFileChooser;
30
import javax.swing.JOptionPane;
31
32
import org.apache.commons.io.FilenameUtils;
21
import org.apache.commons.io.FilenameUtils;
33
import org.apache.jmeter.exceptions.IllegalUserActionException;
22
import org.apache.jmeter.exceptions.IllegalUserActionException;
34
import org.apache.jmeter.gui.GuiPackage;
23
import org.apache.jmeter.gui.GuiPackage;
Lines 36-47 Link Here
36
import org.apache.jmeter.gui.util.FileDialoger;
25
import org.apache.jmeter.gui.util.FileDialoger;
37
import org.apache.jmeter.save.SaveService;
26
import org.apache.jmeter.save.SaveService;
38
import org.apache.jmeter.testelement.TestElement;
27
import org.apache.jmeter.testelement.TestElement;
28
import org.apache.jmeter.testelement.WorkBench;
39
import org.apache.jmeter.util.JMeterUtils;
29
import org.apache.jmeter.util.JMeterUtils;
40
import org.apache.jorphan.collections.HashTree;
30
import org.apache.jorphan.collections.HashTree;
41
import org.apache.jorphan.logging.LoggingManager;
31
import org.apache.jorphan.logging.LoggingManager;
42
import org.apache.jorphan.util.JOrphanUtils;
32
import org.apache.jorphan.util.JOrphanUtils;
43
import org.apache.log.Logger;
33
import org.apache.log.Logger;
44
34
35
import javax.swing.*;
36
import java.awt.event.ActionEvent;
37
import java.io.File;
38
import java.io.FileOutputStream;
39
import java.util.HashSet;
40
import java.util.Iterator;
41
import java.util.LinkedList;
42
import java.util.Set;
43
45
/**
44
/**
46
 * Save the current test plan; implements:
45
 * Save the current test plan; implements:
47
 * Save
46
 * Save
Lines 86-92 Link Here
86
        }
85
        }
87
        if (e.getActionCommand().equals(ActionNames.SAVE_AS)) {
86
        if (e.getActionCommand().equals(ActionNames.SAVE_AS)) {
88
            JMeterTreeNode[] nodes = GuiPackage.getInstance().getTreeListener().getSelectedNodes();
87
            JMeterTreeNode[] nodes = GuiPackage.getInstance().getTreeListener().getSelectedNodes();
89
            if (nodes.length > 1){
88
            if (nodes.length > 1) {
90
                JMeterUtils.reportErrorToUser(
89
                JMeterUtils.reportErrorToUser(
91
                        JMeterUtils.getResString("save_as_error"), // $NON-NLS-1$
90
                        JMeterUtils.getResString("save_as_error"), // $NON-NLS-1$
92
                        JMeterUtils.getResString("save_as")); // $NON-NLS-1$
91
                        JMeterUtils.getResString("save_as")); // $NON-NLS-1$
Lines 95-101 Link Here
95
            subTree = GuiPackage.getInstance().getCurrentSubTree();
94
            subTree = GuiPackage.getInstance().getCurrentSubTree();
96
        } else {
95
        } else {
97
            fullSave = true;
96
            fullSave = true;
98
            subTree = GuiPackage.getInstance().getTreeModel().getTestPlan();
97
            HashTree testPlan = GuiPackage.getInstance().getTreeModel().getTestPlan();
98
            // If saveWorkBench check-box was selected on WorkBenchGui
99
            if (WorkBench.saveWorkBench()) {
100
                HashTree workbench = GuiPackage.getInstance().getTreeModel().getWorkBench();
101
                testPlan.add(workbench);
102
            }
103
//            subTree = GuiPackage.getInstance().getTreeModel().getTestPlan();
104
            subTree = testPlan;
99
        }
105
        }
100
106
101
        String updateFile = GuiPackage.getInstance().getTestPlanFile();
107
        String updateFile = GuiPackage.getInstance().getTestPlanFile();
Lines 108-126 Link Here
108
            }
114
            }
109
            updateFile = chooser.getSelectedFile().getAbsolutePath();
115
            updateFile = chooser.getSelectedFile().getAbsolutePath();
110
            // Make sure the file ends with proper extension
116
            // Make sure the file ends with proper extension
111
            if(FilenameUtils.getExtension(updateFile).equals("")) {
117
            if (FilenameUtils.getExtension(updateFile).equals("")) {
112
                updateFile = updateFile + JMX_FILE_EXTENSION;
118
                updateFile = updateFile + JMX_FILE_EXTENSION;
113
            }
119
            }
114
            // Check if the user is trying to save to an existing file
120
            // Check if the user is trying to save to an existing file
115
            File f = new File(updateFile);
121
            File f = new File(updateFile);
116
            if(f.exists()) {
122
            if (f.exists()) {
117
                int response = JOptionPane.showConfirmDialog(GuiPackage.getInstance().getMainFrame(),
123
                int response = JOptionPane.showConfirmDialog(GuiPackage.getInstance().getMainFrame(),
118
                        JMeterUtils.getResString("save_overwrite_existing_file"), // $NON-NLS-1$
124
                        JMeterUtils.getResString("save_overwrite_existing_file"), // $NON-NLS-1$
119
                        JMeterUtils.getResString("save?"),  // $NON-NLS-1$
125
                        JMeterUtils.getResString("save?"),  // $NON-NLS-1$
120
                        JOptionPane.YES_NO_OPTION,
126
                        JOptionPane.YES_NO_OPTION,
121
                        JOptionPane.QUESTION_MESSAGE);
127
                        JOptionPane.QUESTION_MESSAGE);
122
                if (response == JOptionPane.CLOSED_OPTION || response == JOptionPane.NO_OPTION) {
128
                if (response == JOptionPane.CLOSED_OPTION || response == JOptionPane.NO_OPTION) {
123
                    return ; // Do not save, user does not want to overwrite
129
                    return; // Do not save, user does not want to overwrite
124
                }
130
                }
125
            }
131
            }
126
132
Lines 132-138 Link Here
132
        try {
138
        try {
133
            convertSubTree(subTree);
139
            convertSubTree(subTree);
134
        } catch (Exception err) {
140
        } catch (Exception err) {
135
            log.warn("Error converting subtree "+err);
141
            log.warn("Error converting subtree " + err);
136
        }
142
        }
137
143
138
        FileOutputStream ostream = null;
144
        FileOutputStream ostream = null;
Lines 145-154 Link Here
145
            }
151
            }
146
        } catch (Throwable ex) {
152
        } catch (Throwable ex) {
147
            log.error("Error saving tree:", ex);
153
            log.error("Error saving tree:", ex);
148
            if (ex instanceof Error){
154
            if (ex instanceof Error) {
149
                throw (Error) ex;
155
                throw (Error) ex;
150
            }
156
            }
151
            if (ex instanceof RuntimeException){
157
            if (ex instanceof RuntimeException) {
152
                throw (RuntimeException) ex;
158
                throw (RuntimeException) ex;
153
            }
159
            }
154
            throw new IllegalUserActionException("Couldn't save test plan to file: " + updateFile, ex);
160
            throw new IllegalUserActionException("Couldn't save test plan to file: " + updateFile, ex);
(-)src/core/org/apache/jmeter/testelement/WorkBench.java (+11 lines)
Lines 21-27 Link Here
21
public class WorkBench extends AbstractTestElement {
21
public class WorkBench extends AbstractTestElement {
22
22
23
    private static final long serialVersionUID = 240L;
23
    private static final long serialVersionUID = 240L;
24
    // Used in Save.java to define whether to save WorkBench content or not.
25
    private static boolean saveWorkBench = false;
24
26
27
25
    /**
28
    /**
26
     * Constructor for the WorkBench object.
29
     * Constructor for the WorkBench object.
27
     */
30
     */
Lines 30-34 Link Here
30
    }
33
    }
31
34
32
    public WorkBench() {
35
    public WorkBench() {
36
    }
37
38
    public static boolean saveWorkBench() {
39
        return saveWorkBench;
40
    }
41
42
    public static void setSaveWorkBench(boolean saveWorkBench) {
43
        WorkBench.saveWorkBench = saveWorkBench;
33
    }
44
    }
34
}
45
}
(-)src/core/org/apache/jmeter/gui/tree/JMeterTreeModel.java (-17 / +20 lines)
Lines 18-30 Link Here
18
18
19
package org.apache.jmeter.gui.tree;
19
package org.apache.jmeter.gui.tree;
20
20
21
import java.util.Enumeration;
22
import java.util.Iterator;
23
import java.util.LinkedList;
24
import java.util.List;
25
26
import javax.swing.tree.DefaultTreeModel;
27
28
import org.apache.jmeter.config.gui.AbstractConfigGui;
21
import org.apache.jmeter.config.gui.AbstractConfigGui;
29
import org.apache.jmeter.control.gui.TestPlanGui;
22
import org.apache.jmeter.control.gui.TestPlanGui;
30
import org.apache.jmeter.control.gui.WorkBenchGui;
23
import org.apache.jmeter.control.gui.WorkBenchGui;
Lines 38-54 Link Here
38
import org.apache.jorphan.collections.HashTree;
31
import org.apache.jorphan.collections.HashTree;
39
import org.apache.jorphan.collections.ListedHashTree;
32
import org.apache.jorphan.collections.ListedHashTree;
40
33
34
import javax.swing.tree.DefaultTreeModel;
35
import java.util.Enumeration;
36
import java.util.Iterator;
37
import java.util.LinkedList;
38
import java.util.List;
39
41
public class JMeterTreeModel extends DefaultTreeModel {
40
public class JMeterTreeModel extends DefaultTreeModel {
42
41
43
    private static final long serialVersionUID = 240L;
42
    private static final long serialVersionUID = 240L;
44
43
45
    public JMeterTreeModel(TestElement tp, TestElement wb) {
44
    public JMeterTreeModel(TestElement tp, TestElement wb) {
46
        super(new JMeterTreeNode(wb, null));
45
        super(new JMeterTreeNode(wb, null));
47
        initTree(tp,wb);
46
        initTree(tp, wb);
48
    }
47
    }
49
48
50
    public JMeterTreeModel() {
49
    public JMeterTreeModel() {
51
        this(new TestPlanGui().createTestElement(),new WorkBenchGui().createTestElement());
50
        this(new TestPlanGui().createTestElement(), new WorkBenchGui().createTestElement());
52
//        super(new JMeterTreeNode(new WorkBenchGui().createTestElement(), null));
51
//        super(new JMeterTreeNode(new WorkBenchGui().createTestElement(), null));
53
//        TestElement tp = new TestPlanGui().createTestElement();
52
//        TestElement tp = new TestPlanGui().createTestElement();
54
//        initTree(tp);
53
//        initTree(tp);
Lines 57-68 Link Here
57
    /**
56
    /**
58
     * Hack to allow TreeModel to be used in non-GUI and headless mode.
57
     * Hack to allow TreeModel to be used in non-GUI and headless mode.
59
     *
58
     *
60
     * @deprecated - only for use by JMeter class!
61
     * @param o - dummy
59
     * @param o - dummy
60
     * @deprecated - only for use by JMeter class!
62
     */
61
     */
63
    @Deprecated
62
    @Deprecated
64
    public JMeterTreeModel(Object o) {
63
    public JMeterTreeModel(Object o) {
65
        this(new TestPlan(),new WorkBench());
64
        this(new TestPlan(), new WorkBench());
66
//      super(new JMeterTreeNode(new WorkBench(), null));
65
//      super(new JMeterTreeNode(new WorkBench(), null));
67
//      TestElement tp = new TestPlan();
66
//      TestElement tp = new TestPlan();
68
//      initTree(tp, new WorkBench());
67
//      initTree(tp, new WorkBench());
Lines 128-134 Link Here
128
            guicomp.configure(component);
127
            guicomp.configure(component);
129
            guicomp.modifyTestElement(component);
128
            guicomp.modifyTestElement(component);
130
            guiPackage.getCurrentGui(); // put the gui object back
129
            guiPackage.getCurrentGui(); // put the gui object back
131
                                        // to the way it was.
130
            // to the way it was.
132
        }
131
        }
133
        JMeterTreeNode newNode = new JMeterTreeNode(component, this);
132
        JMeterTreeNode newNode = new JMeterTreeNode(component, this);
134
133
Lines 195-203 Link Here
195
        return getCurrentSubTree((JMeterTreeNode) ((JMeterTreeNode) this.getRoot()).getChildAt(0));
194
        return getCurrentSubTree((JMeterTreeNode) ((JMeterTreeNode) this.getRoot()).getChildAt(0));
196
    }
195
    }
197
196
197
    public HashTree getWorkBench() {
198
        return getCurrentSubTree((JMeterTreeNode) ((JMeterTreeNode) this.getRoot()).getChildAt(1));
199
    }
200
198
    /**
201
    /**
199
     * Clear the test plan, and use default node for test plan and workbench.
202
     * Clear the test plan, and use default node for test plan and workbench.
200
     *
203
     * <p/>
201
     * N.B. Should only be called by {@link GuiPackage#clearTestPlan()}
204
     * N.B. Should only be called by {@link GuiPackage#clearTestPlan()}
202
     */
205
     */
203
    public void clearTestPlan() {
206
    public void clearTestPlan() {
Lines 207-213 Link Here
207
210
208
    /**
211
    /**
209
     * Clear the test plan, and use specified node for test plan and default node for workbench
212
     * Clear the test plan, and use specified node for test plan and default node for workbench
210
     *
213
     * <p/>
211
     * N.B. Should only be called by {@link GuiPackage#clearTestPlan(TestElement)}
214
     * N.B. Should only be called by {@link GuiPackage#clearTestPlan(TestElement)}
212
     *
215
     *
213
     * @param testPlan the node to use as the testplan top node
216
     * @param testPlan the node to use as the testplan top node
Lines 216-227 Link Here
216
        // Remove the workbench and testplan nodes
219
        // Remove the workbench and testplan nodes
217
        int children = getChildCount(getRoot());
220
        int children = getChildCount(getRoot());
218
        while (children > 0) {
221
        while (children > 0) {
219
            JMeterTreeNode child = (JMeterTreeNode)getChild(getRoot(), 0);
222
            JMeterTreeNode child = (JMeterTreeNode) getChild(getRoot(), 0);
220
            super.removeNodeFromParent(child);
223
            super.removeNodeFromParent(child);
221
            children = getChildCount(getRoot());
224
            children = getChildCount(getRoot());
222
        }
225
        }
223
        // Init the tree
226
        // Init the tree
224
        initTree(testPlan,new WorkBenchGui().createTestElement()); // Assumes this is only called from GUI mode
227
        initTree(testPlan, new WorkBenchGui().createTestElement()); // Assumes this is only called from GUI mode
225
    }
228
    }
226
229
227
    /**
230
    /**
Lines 238-243 Link Here
238
        // Let others know that the tree content has changed.
241
        // Let others know that the tree content has changed.
239
        // This should not be necessary, but without it, nodes are not shown when the user
242
        // This should not be necessary, but without it, nodes are not shown when the user
240
        // uses the Close menu item
243
        // uses the Close menu item
241
        nodeStructureChanged((JMeterTreeNode)getRoot());
244
        nodeStructureChanged((JMeterTreeNode) getRoot());
242
    }
245
    }
243
}
246
}
(-)src/core/org/apache/jmeter/control/gui/WorkBenchGui.java (-12 / +35 lines)
Lines 18-52 Link Here
18
18
19
package org.apache.jmeter.control.gui;
19
package org.apache.jmeter.control.gui;
20
20
21
import java.awt.BorderLayout;
22
import java.util.Collection;
23
24
import javax.swing.JMenu;
25
import javax.swing.JPopupMenu;
26
27
import org.apache.jmeter.gui.AbstractJMeterGuiComponent;
21
import org.apache.jmeter.gui.AbstractJMeterGuiComponent;
28
import org.apache.jmeter.gui.action.ActionNames;
22
import org.apache.jmeter.gui.action.ActionNames;
29
import org.apache.jmeter.gui.util.MenuFactory;
23
import org.apache.jmeter.gui.util.MenuFactory;
24
import org.apache.jmeter.gui.util.VerticalPanel;
30
import org.apache.jmeter.testelement.TestElement;
25
import org.apache.jmeter.testelement.TestElement;
31
import org.apache.jmeter.testelement.WorkBench;
26
import org.apache.jmeter.testelement.WorkBench;
32
import org.apache.jmeter.util.JMeterUtils;
27
import org.apache.jmeter.util.JMeterUtils;
33
28
29
import javax.swing.*;
30
import java.awt.*;
31
import java.awt.event.ItemEvent;
32
import java.awt.event.ItemListener;
33
import java.util.Collection;
34
34
/**
35
/**
35
 * JMeter GUI component representing a work bench where users can make
36
 * JMeter GUI component representing a work bench where users can make
36
 * preparations for the test plan.
37
 * preparations for the test plan.
37
 *
38
 */
38
 */
39
public class WorkBenchGui extends AbstractJMeterGuiComponent {
39
public class WorkBenchGui extends AbstractJMeterGuiComponent implements ItemListener {
40
    private static final long serialVersionUID = 240L;
40
    private static final long serialVersionUID = 240L;
41
    // This check-box defines whether to save  WorkBench content or not
42
    private final JCheckBox saveWorkBench;
41
43
42
    /**
44
    /**
43
     * Create a new WorkbenchGui.
45
     * Create a new WorkbenchGui.
44
     */
46
     */
45
    public WorkBenchGui() {
47
    public WorkBenchGui() {
46
        super();
48
        super();
49
        saveWorkBench = new JCheckBox(JMeterUtils.getResString("save_workbench"));
47
        init();
50
        init();
48
    }
51
    }
49
52
53
50
    /**
54
    /**
51
     * This is the list of menu categories this gui component will be available
55
     * This is the list of menu categories this gui component will be available
52
     * under. This implementation returns null, since the WorkBench appears at
56
     * under. This implementation returns null, since the WorkBench appears at
Lines 79-85 Link Here
79
     * the edit menu when the component is selected, the component will be asked
83
     * the edit menu when the component is selected, the component will be asked
80
     * to return a JPopupMenu that provides all the options available to the
84
     * to return a JPopupMenu that provides all the options available to the
81
     * user from this component.
85
     * user from this component.
82
     * <p>
86
     * <p/>
83
     * The WorkBench returns a popup menu allowing you to add anything.
87
     * The WorkBench returns a popup menu allowing you to add anything.
84
     *
88
     *
85
     * @return a JPopupMenu appropriate for the component.
89
     * @return a JPopupMenu appropriate for the component.
Lines 87-93 Link Here
87
    @Override
91
    @Override
88
    public JPopupMenu createPopupMenu() {
92
    public JPopupMenu createPopupMenu() {
89
        JPopupMenu menu = new JPopupMenu();
93
        JPopupMenu menu = new JPopupMenu();
90
        JMenu addMenu = MenuFactory.makeMenus(new String[] {
94
        JMenu addMenu = MenuFactory.makeMenus(new String[]{
91
                MenuFactory.NON_TEST_ELEMENTS,
95
                MenuFactory.NON_TEST_ELEMENTS,
92
                MenuFactory.CONTROLLERS,
96
                MenuFactory.CONTROLLERS,
93
                MenuFactory.CONFIG_ELEMENTS,
97
                MenuFactory.CONFIG_ELEMENTS,
Lines 97-103 Link Here
97
                MenuFactory.POST_PROCESSORS,
101
                MenuFactory.POST_PROCESSORS,
98
                MenuFactory.ASSERTIONS,
102
                MenuFactory.ASSERTIONS,
99
                MenuFactory.LISTENERS,
103
                MenuFactory.LISTENERS,
100
                },
104
        },
101
                JMeterUtils.getResString("add"), // $NON-NLS-1$
105
                JMeterUtils.getResString("add"), // $NON-NLS-1$
102
                ActionNames.ADD);
106
                ActionNames.ADD);
103
        menu.add(addMenu);
107
        menu.add(addMenu);
Lines 115-123 Link Here
115
     * Initialize the components and layout of this component.
119
     * Initialize the components and layout of this component.
116
     */
120
     */
117
    private void init() {
121
    private void init() {
118
        setLayout(new BorderLayout());
122
        setLayout(new BorderLayout(0, 5));
123
119
        setBorder(makeBorder());
124
        setBorder(makeBorder());
120
125
121
        add(makeTitlePanel(), BorderLayout.NORTH);
126
        add(makeTitlePanel(), BorderLayout.NORTH);
127
        VerticalPanel workBenchPropsPanel = new VerticalPanel(5, 0);
128
129
        workBenchPropsPanel.add(saveWorkBench);
130
        saveWorkBench.addItemListener(this);
131
        add(workBenchPropsPanel, BorderLayout.CENTER);
132
133
    }
134
135
    @Override
136
    public void itemStateChanged(ItemEvent ie) {
137
        //To change body of implemented methods use File | Settings | File Templates.
138
        if (ie.getItem().equals(saveWorkBench)) {
139
            if (saveWorkBench.isSelected()) {
140
                WorkBench.setSaveWorkBench(true);
141
            } else {
142
                WorkBench.setSaveWorkBench(false);
143
            }
144
        }
122
    }
145
    }
123
}
146
}

Return to bug 42428