package com.blazemeter.jmeter.xmpp; import com.blazemeter.jmeter.xmpp.actions.AbstractXMPPAction; import com.blazemeter.jmeter.xmpp.actions.Connect; import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.jmeter.samplers.AbstractSampler; import org.apache.jmeter.samplers.Entry; import org.apache.jmeter.samplers.SampleResult; import org.apache.jmeter.testelement.TestElement; import org.apache.jorphan.logging.LoggingManager; import org.apache.log.Logger; import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.XMPPConnection; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; public class JMeterXMPPSampler extends AbstractSampler { private static final Logger log = LoggingManager.getLoggerForClass(); private static final String ACTION = "action"; protected JMeterXMPPConnection connConfig; @Override public SampleResult sample(Entry entry) { SampleResult res = new SampleResult(); res.setSampleLabel(getName()); res.setDataType(SampleResult.TEXT); res.setSuccessful(true); res.setResponseCode("200"); res.setResponseMessage("OK"); res.sampleStart(); try { if (connConfig == null) { throw new RuntimeException("Cannot sample XMPP without XMPP Connection component"); } XMPPConnection conn = getXMPPConnection(); if (conn == null) { throw new RuntimeException("No XMPP Connection available"); } String headers = "Connection ID: " + conn.getConnectionID() + "\r\n"; String action = getAction(); if (!conn.isConnected() && !action.equals(Connect.class.getCanonicalName())) { log.error("Please call Connect before calling other actions"); throw new SmackException.NotConnectedException(); } headers += "User: " + conn.getUser() + "\r\n"; res.setRequestHeaders(headers); AbstractXMPPAction actObject = connConfig.getActions().get(action); if (actObject.perform(this, res) == null) { return null; } } catch (Exception e) { log.error("Error in XMPP Sampler: ", e); res.setSuccessful(false); res.setResponseCode("500"); res.setResponseMessage((e.getMessage() == null || e.getMessage().isEmpty()) ? e.toString() : e.getMessage()); res.setResponseData(ExceptionUtils.getStackTrace(e).getBytes()); } res.sampleEnd(); return res; } public String getAction() { return getPropertyAsString(ACTION); } public void setAction(String value) { setProperty(ACTION, value); } public XMPPConnection getXMPPConnection() throws KeyManagementException, NoSuchAlgorithmException, SmackException, InterruptedException { return connConfig.getConnection(); } @Override public void addTestElement(TestElement el) { super.addTestElement(el); if (el instanceof JMeterXMPPConnection) { this.connConfig = (JMeterXMPPConnection) el; } } public JMeterXMPPConnection getXMPPConnectionConfig() { return connConfig; } }