編寫JMeter擴展(2)編寫採樣器代碼對應的GUI

請參考如下的代碼及註釋:

package kg.apc.jmeter.samplers;

import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import kg.apc.jmeter.JMeterPluginsUtils;
import kg.apc.jmeter.gui.BrowseAction;
import kg.apc.jmeter.gui.GuiBuilderHelper;

import org.apache.jmeter.samplers.gui.AbstractSamplerGui;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.log.Logger;

/**
 *
 * @author apc
 */
public class TLSRawSamplerGui
        extends AbstractSamplerGui {

    private static final Logger log = LoggingManager.getLoggerForClass();
    private JTextField hostName;
    private JTextField port;
    private JTextField tlsVersion;
    private JTextField cipherList;
    private JTextField clientCert;
    private JTextField clientCertPassword;
    private JTextArea requestData;
    

    /**
     *
     */
    public TLSRawSamplerGui() {
        init();
        initFields();
    }

    @Override
    public String getStaticLabel() {
        return "TLS Raw Request";
    }
    
    /**
     * Mirror data from TestElement to GUI
     */

    @Override
    public void configure(TestElement element) {
        super.configure(element);
        log.info(element.toString());

        if (element instanceof TLSRawSampler) {
            TLSRawSampler rawSampler = (TLSRawSampler) element;
            hostName.setText(rawSampler.getHostName());
            port.setText(rawSampler.getPort());
            tlsVersion.setText(rawSampler.getTLSVersion());
            cipherList.setText(rawSampler.getCipherList());
            clientCert.setText(rawSampler.getClientCert());
            clientCertPassword.setText(rawSampler.getClientCertPassword());
            requestData.setText(rawSampler.getData());
        }
    }

    @Override
    public TestElement createTestElement() {
        TLSRawSampler sampler = new TLSRawSampler();
        modifyTestElement(sampler);
        sampler.setComment("TLS Sampler Comment.");
        return sampler;
    }

    /**
     * Mirror data from GUI to TestElement
     */
    @Override
    public void modifyTestElement(TestElement sampler) {
        super.configureTestElement(sampler);

        if (sampler instanceof TLSRawSampler) {
            TLSRawSampler rawSampler = (TLSRawSampler) sampler;
            rawSampler.setHostName(hostName.getText());
            rawSampler.setPort(port.getText());
            rawSampler.setTLSVersion(tlsVersion.getText());
            rawSampler.setCipherList(cipherList.getText());
            rawSampler.setClientCert(clientCert.getText().trim());
            rawSampler.setClientCertPassword(clientCertPassword.getText().trim());
            rawSampler.setData(transformCRLF(requestData.getText()));
        }
    }

    /**
     * first replace removes old \r\n
     * second eliminates orphan \r
     * third make all newlines - old and new  like \r\n
     */
    private String transformCRLF(String str) {
        return str.replace("\r\n", "\n").replace("\r", "").replace("\n", "\r\n");
    }

    @Override
    public void clearGui() {
        super.clearGui();
        initFields();
    }

    @Override
    public String getLabelResource() {
        return this.getClass().getSimpleName();
    }

    private void init() {
        setLayout(new BorderLayout(0, 5));
        setBorder(makeBorder());

        add(JMeterPluginsUtils.addHelpLinkToPanel(makeTitlePanel(), "TLS Request"), BorderLayout.NORTH);

        JPanel mainPanel = new JPanel(new GridBagLayout());

        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;

        addToPanel(mainPanel, labelConstraints, 0, 1, new JLabel("Hostname: ", JLabel.RIGHT));
        addToPanel(mainPanel, editConstraints, 1, 1, hostName = new JTextField(20));
        
        addToPanel(mainPanel, labelConstraints, 0, 2, new JLabel("Port: ", JLabel.RIGHT));
        addToPanel(mainPanel, editConstraints, 1, 2, port = new JTextField(20));

        editConstraints.insets = new java.awt.Insets(2, 0, 0, 0);
        labelConstraints.insets = new java.awt.Insets(2, 0, 0, 0);

        addToPanel(mainPanel, labelConstraints, 0, 3, new JLabel("TLS Version: ", JLabel.RIGHT));
        addToPanel(mainPanel, editConstraints, 1, 3, tlsVersion = new JTextField(20));

        addToPanel(mainPanel, labelConstraints, 0, 4, new JLabel("Cipher List: ", JLabel.RIGHT));
        addToPanel(mainPanel, editConstraints, 1, 4, cipherList = new JTextField(20));
        
        addToPanel(mainPanel, labelConstraints, 0, 5, new JLabel("Client Certificate PKCS File: ", JLabel.RIGHT));
        addToPanel(mainPanel, editConstraints, 1, 5, clientCert = new JTextField(20));
        
        addToPanel(mainPanel, labelConstraints, 0, 6, new JLabel("Client Certificate PKCS Password", JLabel.RIGHT));
        addToPanel(mainPanel, editConstraints, 1, 6, clientCertPassword = new JTextField(20));

        addToPanel(mainPanel, labelConstraints, 0, 7, new JLabel("Request Data: ", JLabel.RIGHT));

        editConstraints.fill = GridBagConstraints.BOTH;
        requestData = new JTextArea();
        addToPanel(mainPanel, editConstraints, 1, 7, GuiBuilderHelper.getTextAreaScrollPaneContainer(requestData, 20));


        editConstraints.insets = new java.awt.Insets(4, 0, 0, 0);
        labelConstraints.insets = new java.awt.Insets(4, 0, 0, 0);


        JPanel container = new JPanel(new BorderLayout());
        container.add(mainPanel, BorderLayout.NORTH);
        add(container, BorderLayout.CENTER);
    }

    private void addToPanel(JPanel panel, GridBagConstraints constraints, int col, int row, JComponent component) {
        constraints.gridx = col;
        constraints.gridy = row;
        panel.add(component, constraints);
    }

    private void initFields() {
        hostName.setText("${HostName}");
        tlsVersion.setText("TLSv1.2");
        cipherList.setText("");
        clientCert.setText("c:\\pkcs");
        clientCertPassword.setText("passw0rd");
        requestData.setText("GET / HTTP/1.0\r\n"
                + "Host: localhost\r\n"
                + "Connection: close\r\n"
                + "\r\n");
    }
}


最終我們實現的界面如下:

wKioL1UjgCSBq_D9AANvzeWzb28342.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章