package com.blazemeter.jmeter.xmpp.actions;
import com.blazemeter.jmeter.xmpp.JMeterXMPPSampler;
import org.apache.jmeter.samplers.SampleResult;
import org.jivesoftware.smack.PacketListener;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smack.packet.Presence;
import javax.swing.*;
import java.awt.*;
public class SendPresence extends AbstractXMPPAction implements PacketListener {
public static final String RECIPIENT = "recipient";
public static final String STATUS_TEXT = "text";
public static final String TYPE = "type";
public static final String MODE = "mode";
private JTextField recipient;
private JTextField text;
private JComboBox<Presence.Type> type;
private JComboBox<Presence.Mode> mode;
@Override
public String getLabel() {
return "Send Presence";
}
@Override
public SampleResult perform(JMeterXMPPSampler sampler, SampleResult res) throws Exception {
Presence.Type typeVal = Presence.Type.valueOf(sampler.getPropertyAsString(TYPE, Presence.Type.available.toString()));
Presence.Mode modeVal = Presence.Mode.valueOf(sampler.getPropertyAsString(MODE, Presence.Mode.available.toString()));
Presence presence = new Presence(typeVal);
presence.setMode(modeVal);
String to = sampler.getPropertyAsString(RECIPIENT);
if (!to.isEmpty()) {
presence.setTo(to);
}
String text = sampler.getPropertyAsString(STATUS_TEXT);
if (!text.isEmpty()) {
presence.setStatus(text);
}
sampler.getXMPPConnection().sendPacket(presence);
res.setSamplerData(presence.toXML().toString());
return res;
}
@Override
public void addUI(JComponent mainPanel, GridBagConstraints labelConstraints, GridBagConstraints editConstraints) {
addToPanel(mainPanel, labelConstraints, 0, 0, new JLabel("Type: ", JLabel.RIGHT));
addToPanel(mainPanel, editConstraints, 1, 0, type = new JComboBox<>());
type.addItem(Presence.Type.available);
type.addItem(Presence.Type.unavailable);
type.addItem(Presence.Type.subscribe);
type.addItem(Presence.Type.unsubscribe);
addToPanel(mainPanel, labelConstraints, 0, 1, new JLabel("Status: ", JLabel.RIGHT));
addToPanel(mainPanel, editConstraints, 1, 1, mode = new JComboBox<>());
mode.addItem(Presence.Mode.available);
mode.addItem(Presence.Mode.away);
mode.addItem(Presence.Mode.chat);
mode.addItem(Presence.Mode.dnd);
mode.addItem(Presence.Mode.xa);
addToPanel(mainPanel, labelConstraints, 0, 2, new JLabel("Text: ", JLabel.RIGHT));
addToPanel(mainPanel, editConstraints, 1, 2, text = new JTextField(20));
addToPanel(mainPanel, labelConstraints, 0, 3, new JLabel("Recipient: ", JLabel.RIGHT));
addToPanel(mainPanel, editConstraints, 1, 3, recipient = new JTextField(20));
}
@Override
public void clearGui() {
recipient.setText("");
text.setText("");
type.setSelectedIndex(0);
mode.setSelectedIndex(0);
}
@Override
public void setSamplerProperties(JMeterXMPPSampler sampler) {
sampler.setProperty(RECIPIENT, recipient.getText());
sampler.setProperty(STATUS_TEXT, text.getText());
sampler.setProperty(TYPE, type.getSelectedItem().toString());
sampler.setProperty(MODE, mode.getSelectedItem().toString());
}
@Override
public void setGuiFieldsFromSampler(JMeterXMPPSampler sampler) {
recipient.setText(sampler.getPropertyAsString(RECIPIENT));
text.setText(sampler.getPropertyAsString(STATUS_TEXT));
type.setSelectedItem(Presence.Type.valueOf(sampler.getPropertyAsString(TYPE, Presence.Type.available.toString())));
mode.setSelectedItem(Presence.Mode.valueOf(sampler.getPropertyAsString(MODE, Presence.Mode.available.toString())));
}
@Override
public void processPacket(Packet packet) throws SmackException.NotConnectedException {
/** TODO: do we need to respond?
if (packet instanceof Presence) {
Presence presence = (Presence) packet;
if (presence.getType() == Presence.Type.subscribe) {
try {
conn.getRoster().createEntry(presence.getFrom(), presence.getFrom(), new String[0]);
} catch (SmackException.NotLoggedInException | SmackException.NoResponseException | XMPPException.XMPPErrorException e) {
log.error("Failed to add to roster", e);
}
}
}
*/
}
}