blob: 4dd33c2f58d7b0d741bc2de8067ce54c269d410b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jmeter.threads.gui;
import static org.apache.jmeter.util.JMeterUtils.labelFor;
import java.awt.BorderLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Arrays;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import org.apache.jmeter.control.LoopController;
import org.apache.jmeter.control.gui.LoopControlPanel;
import org.apache.jmeter.gui.JBooleanPropertyEditor;
import org.apache.jmeter.gui.JTextComponentBinding;
import org.apache.jmeter.gui.TestElementMetadata;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.threads.AbstractThreadGroup;
import org.apache.jmeter.threads.AbstractThreadGroupSchema;
import org.apache.jmeter.threads.ThreadGroup;
import org.apache.jmeter.threads.ThreadGroupSchema;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.gui.JEditableCheckBox;
import net.miginfocom.swing.MigLayout;
@TestElementMetadata(labelResource = "threadgroup")
public class ThreadGroupGui extends AbstractThreadGroupGui implements ItemListener {
private static final long serialVersionUID = 240L;
private LoopControlPanel loopPanel;
private static final String THREAD_NAME = "Thread Field";
private static final String RAMP_NAME = "Ramp Up Field";
private final JTextField threadInput = new JTextField();
private final JTextField rampInput = new JTextField();
private final boolean showDelayedStart;
private JBooleanPropertyEditor delayedStart;
private final JBooleanPropertyEditor scheduler =
new JBooleanPropertyEditor(
ThreadGroupSchema.INSTANCE.getUseScheduler(),
JMeterUtils.getResString("scheduler"));
private final JTextField duration = new JTextField();
private final JLabel durationLabel = labelFor(duration, "duration");
private final JTextField delay = new JTextField(); // Relative start-up time
private final JLabel delayLabel = labelFor(delay, "delay");
private final JBooleanPropertyEditor sameUserBox =
new JBooleanPropertyEditor(
AbstractThreadGroupSchema.INSTANCE.getSameUserOnNextIteration(),
JMeterUtils.getResString("threadgroup_same_user"));
public ThreadGroupGui() {
this(true);
}
public ThreadGroupGui(boolean showDelayedStart) {
super();
this.showDelayedStart = showDelayedStart;
init();
initGui();
if (showDelayedStart) {
bindingGroup.add(delayedStart);
}
bindingGroup.addAll(
Arrays.asList(
new JTextComponentBinding(threadInput, AbstractThreadGroupSchema.INSTANCE.getNumThreads()),
new JTextComponentBinding(rampInput, ThreadGroupSchema.INSTANCE.getRampTime()),
new JTextComponentBinding(duration, ThreadGroupSchema.INSTANCE.getDuration()),
new JTextComponentBinding(delay, ThreadGroupSchema.INSTANCE.getDelay()),
sameUserBox,
scheduler
)
);
}
@Override
public TestElement makeTestElement() {
return new ThreadGroup();
}
@Override
public TestElement createTestElement() {
TestElement tg = makeTestElement();
// modifyTestElement is here for backward compatibility
modifyTestElement(tg);
assignDefaultValues(tg);
return tg;
}
@Override
public void assignDefaultValues(TestElement element) {
super.assignDefaultValues(element);
element.set(ThreadGroupSchema.INSTANCE.getNumThreads(), 1);
element.set(ThreadGroupSchema.INSTANCE.getRampTime(), 1);
}
/**
* Modifies a given TestElement to mirror the data in the gui components.
*
* @see org.apache.jmeter.gui.JMeterGUIComponent#modifyTestElement(TestElement)
*/
@Override
public void modifyTestElement(TestElement tg) {
super.configureTestElement(tg);
if (tg instanceof AbstractThreadGroup) {
((AbstractThreadGroup) tg).setSamplerController((LoopController) loopPanel.createTestElement());
}
toggleSchedulerFields();
}
@Override
public void configure(TestElement tg) {
super.configure(tg);
loopPanel.configure((TestElement) tg.getProperty(AbstractThreadGroup.MAIN_CONTROLLER).getObjectValue());
}
@Override
public void itemStateChanged(ItemEvent ie) {
// Method kept for backward compatibility
}
private void toggleSchedulerFields() {
boolean enable = !scheduler.getValue().equals(JEditableCheckBox.Value.of(false));
duration.setEnabled(enable);
durationLabel.setEnabled(enable);
delay.setEnabled(enable);
delayLabel.setEnabled(enable);
}
private JPanel createControllerPanel() {
loopPanel = new LoopControlPanel(false);
LoopController looper = (LoopController) loopPanel.createTestElement();
looper.setLoops(1);
loopPanel.configure(looper);
return loopPanel;
}
@Override
public String getLabelResource() {
return "threadgroup"; // $NON-NLS-1$
}
@Override
public void clearGui(){
super.clearGui();
initGui();
}
// Initialise the gui field values
private void initGui(){
loopPanel.clearGui();
}
private void init() { // WARNING: called from ctor so must not be overridden (i.e. must be private or final)
// THREAD PROPERTIES
JPanel threadPropsPanel = new JPanel(new MigLayout("fillx, wrap 2", "[][fill,grow]"));
threadPropsPanel.setBorder(BorderFactory.createTitledBorder(
JMeterUtils.getResString("thread_properties"))); // $NON-NLS-1$
// NUMBER OF THREADS
threadPropsPanel.add(labelFor(threadInput, "number_of_threads")); // $NON-NLS-1$
threadInput.setName(THREAD_NAME);
threadPropsPanel.add(threadInput);
// RAMP-UP
threadPropsPanel.add(labelFor(rampInput, "ramp_up"));
rampInput.setName(RAMP_NAME);
threadPropsPanel.add(rampInput);
// LOOP COUNT
LoopControlPanel loopController = (LoopControlPanel) createControllerPanel();
threadPropsPanel.add(loopController.getLoopsLabel(), "split 2");
threadPropsPanel.add(loopController.getInfinite(), "gapleft push");
threadPropsPanel.add(loopController.getLoops());
threadPropsPanel.add(sameUserBox, "span 2");
if (showDelayedStart) {
delayedStart = new JBooleanPropertyEditor(
ThreadGroupSchema.INSTANCE.getDelayedStart(),
JMeterUtils.getResString("delayed_start")); // $NON-NLS-1$
threadPropsPanel.add(delayedStart, "span 2");
}
scheduler.addPropertyChangeListener(
JBooleanPropertyEditor.VALUE_PROPERTY, (ev) -> toggleSchedulerFields());
threadPropsPanel.add(scheduler, "span 2");
threadPropsPanel.add(durationLabel);
threadPropsPanel.add(duration);
threadPropsPanel.add(delayLabel);
threadPropsPanel.add(delay);
add(threadPropsPanel, BorderLayout.CENTER);
}
}