package com.blazemeter.jmeter.xmpp;
import com.blazemeter.jmeter.xmpp.actions.AbstractXMPPAction;
import com.blazemeter.ui.ComponentTitledBorder;
import kg.apc.jmeter.JMeterPluginsUtils;
import org.apache.jmeter.samplers.gui.AbstractSamplerGui;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.log.Logger;
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Enumeration;
import java.util.Map;
public class JMeterXMPPSamplerGui extends AbstractSamplerGui implements ActionListener {
private static final Logger log = LoggingManager.getLoggerForClass();
private static final String CONTAINER = "container";
private ButtonGroup actionsGroup;
private Map<String, AbstractXMPPAction> actions = getActions();
protected Map<String, AbstractXMPPAction> getActions() {
return JMeterXMPPConnection.getAvailableActions();
}
public JMeterXMPPSamplerGui() {
super();
init();
initFields();
}
@Override
public TestElement createTestElement() {
TestElement el = new JMeterXMPPSampler();
modifyTestElement(el);
el.setComment("This plugin is developed by www.blazemeter.com");
return el;
}
@Override
public void configure(TestElement element) {
super.configure(element);
if (element instanceof JMeterXMPPSampler) {
JMeterXMPPSampler sampler = (JMeterXMPPSampler) element;
// fill controls
selectActionByName(sampler.getAction());
for (AbstractXMPPAction action : actions.values()) {
action.setGuiFieldsFromSampler(sampler);
}
}
}
@Override
public void modifyTestElement(TestElement element) {
configureTestElement(element);
if (element instanceof JMeterXMPPSampler) {
JMeterXMPPSampler sampler = (JMeterXMPPSampler) element;
sampler.setAction(getSelectedAction());
for (AbstractXMPPAction action : actions.values()) {
action.setSamplerProperties(sampler);
}
}
}
@Override
public void clearGui() {
super.clearGui();
initFields();
}
@Override
public String getLabelResource() {
return getClass().getCanonicalName();
}
@Override
public String getStaticLabel() {
return "bzm - XMPP Sampler";
}
private void initFields() {
for (AbstractXMPPAction action : actions.values()) {
action.clearGui();
}
if (actionsGroup.getButtonCount() > 0) {
actionsGroup.getElements().nextElement().doClick();
}
}
private void init() {
setLayout(new BorderLayout(0, 5));
setBorder(makeBorder());
add(JMeterPluginsUtils.addHelpLinkToPanel(makeTitlePanel(), getWikiPage()), BorderLayout.NORTH);
JPanel mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
mainPanel.setBorder(BorderFactory.createEmptyBorder());
addActionBlocks(mainPanel);
add(mainPanel, BorderLayout.CENTER);
}
private void addActionBlocks(JPanel mainPanel) {
GridBagConstraints labelConstraints = new GridBagConstraints();
labelConstraints.anchor = GridBagConstraints.FIRST_LINE_END;
GridBagConstraints editConstraints = new GridBagConstraints();
editConstraints.anchor = GridBagConstraints.FIRST_LINE_START;
editConstraints.weightx = 1.0;
editConstraints.fill = GridBagConstraints.HORIZONTAL;
editConstraints.insets = new Insets(2, 0, 0, 0);
labelConstraints.insets = new Insets(2, 0, 0, 0);
actionsGroup = new ButtonGroup();
for (AbstractXMPPAction action : actions.values()) {
JRadioButton radio = new JRadioButton(action.getLabel());
radio.addActionListener(this);
actionsGroup.add(radio);
JPanel contentPanel = new JPanel(new GridBagLayout());
radio.putClientProperty(CONTAINER, contentPanel);
action.addUI(contentPanel, labelConstraints, editConstraints);
Border border = new ComponentTitledBorder(radio, contentPanel, BorderFactory.createEtchedBorder());
contentPanel.setBorder(border);
contentPanel.setEnabled(false);
mainPanel.add(contentPanel);
mainPanel.add(Box.createRigidArea(new Dimension(0, 10))); // a bit space between panels
}
}
private void selectActionByName(String action) {
AbstractXMPPAction actionObj = actions.get(action);
Enumeration<AbstractButton> buttons = actionsGroup.getElements();
if (actionObj != null) {
while (buttons.hasMoreElements()) {
AbstractButton button = buttons.nextElement();
if (button.getText().equals(actionObj.getLabel())) {
button.doClick();
return;
}
}
}
log.warn("Did not find control to select for action: " + action);
}
private String getSelectedAction() {
Enumeration<AbstractButton> buttons = actionsGroup.getElements();
while (buttons.hasMoreElements()) {
AbstractButton button = buttons.nextElement();
if (button.isSelected()) {
for (AbstractXMPPAction action : actions.values()) {
if (action.getLabel().equals(button.getText()))
return action.getClass().getCanonicalName();
}
}
}
log.warn("No action selected");
return "";
}
@Override
public void actionPerformed(ActionEvent actionEvent) {
JRadioButton button = (JRadioButton) actionEvent.getSource();
disableAllBlocks();
setBlockEnabled(button, true);
if (button.getParent() != null && button.getParent().getParent() != null) {
button.getParent().getParent().getParent().repaint();
}
}
private void disableAllBlocks() {
Enumeration<AbstractButton> btns = actionsGroup.getElements();
while (btns.hasMoreElements()) {
AbstractButton btn = btns.nextElement();
setBlockEnabled(btn, false);
}
}
private void setBlockEnabled(AbstractButton obj, boolean b) {
Container container = (Container) obj.getClientProperty(CONTAINER);
for (Component component : container.getComponents()) {
component.setEnabled(b);
}
}
private String getWikiPage() {
return "XMPPSampler";
}
}