编写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");
    }
}

最终我们实现的界面如下:

时间: 2024-08-09 02:20:51

编写JMeter扩展(2)编写采样器代码对应的GUI的相关文章

编写JMeter扩展(1)编写采样器代码

Apache JMeter自带了许多的采样器供我们使用,而且能够满足大部分的测试需求.但是在实际使用过程中,难免需要针对项目自身的特点和需求对Apache JMeter进行扩展.虽然直接继承AbstractJavaSamplerClient即可编写Java采样器,但是其相对应的GUI界面不是很友好,或者我们想编写一个类似HTTP Request那样的sampler,该如何做呢?比如我们需要编写一个TLS的采样器,该采样器允许用户在发送TLS请求的时候制定TLS的版本,以及客户端证书等信息.请参考

手动使用C/C++编写Lua扩展插件

最近在研究如何在Windows 下嵌入Lua来完成业务模块编写的时候 发现Lua的一些问题,首先Lua作为一门脚本语言,其灵活性和可扩展性是很高的,要不然Cocos2d-x中也不会嵌入他来编写业务逻辑,但是由于国内资料相当的少,很少有人去正八经研究完了之后 写一篇文章 来分享自己的成果,想要去深入理解应用一些东西得时候,显得很无力,很多Lua扩展都是直接写扩展库来完成,如果不理解原理甚至你都不会灵活运用,这就是本文写作的目的. 第一 我需要Lua嵌入我的应用程序,这一点很容易的做到. 第二 我需

怎样编写scrapy扩展

原创文章,链接:http://blog.csdn.net/u012150179/article/details/38226477 在scrapy使用过程中,很多情况下需要根据实际需求定制自己的扩展,小到实现自己的pipelines,大到用新的scheduler替换默认的scheduler. 扩展可以按照是否需要读取crawler大致分为两种,对于不需要读取的,比如pipelines的编写,只需要实现默认的方法porcess_item.需要读取的,如scheduler的编写又存在另外的方式. 1.

用Java为Hyperledger Fabric(超级账本)编写区块链智能合约链代码

编写第一个 Java 链代码程序 在上一节中,您已经熟悉了如何构建.运行.部署和调用链代码,但尚未编写任何 Java 代码. 在本节中,将会使用 Eclipse IDE.一个用于 Eclipse 的 Gradle 插件,以及一个名为 ChaincodeTutorial 的 Java 链代码框架项目,编写第一个 Java 链代码程序.您将从我为此教程创建的 GitHub 存储库中获取框架代码,将该代码导入 Eclipse 中,添加代码来让链代码智慧合同按要求生效,然后在 Eclipse IDE 内

一步步入门编写PHP扩展

1.写在最前 随着互联网飞速发展,lamp架构的流行,php支持的扩展也越来越多,这样直接促进了php的发展. 但是php也有脚本语言不可避免的问题,性能比例如C等编译型语言相差甚多,所以在考虑性能问题的时候最好还是通过php扩展来解决. 那么,怎么去做一个php扩展呢.下面从一个例子开始(本文章需要C基础). 2.解决一个问题 在一个系统中,如果经常要求一个数组的平方和,我们可以这么写. <?php function array_square_sum($data){ $sum = 0; for

编程精粹--编写高质量的C语言代码(2):自己设计并使用断言(一)

上一篇文章<<编程精粹--编写高质量C语言代码(1):假想编译程序>>中讲述了如何利用编译程序的所有警告设施以及lint程序等来更加容易地自动发现程序中的错误.但是即使使用编译程序提供的所有警告设施,编译程序所发现的错误,也只是程序错误中的一小部分.例如以下一行代码: strCopy=memecpy(malloc(length),str,length)); 当malloc 调用失败时,返回一个空指针,而memcpy如果没有处理空指针,程序就会出现错误.编译程序是无法查出这种或其他类

如何编写可维护的面向对象JavaScript代码

能够写出可维护的面向对象JavaScript代 码不仅可以节约金钱,还能让你很受欢迎.不信?有可能你自己或者其他什么人有一天会回来重用你的代码.如果能尽量让这个经历不那么痛苦,就可以节省不少时 间.地球人都知道,时间就是金钱.同样的,你也会因为帮某人省去了头疼的过程而获得他的偏爱.但是,在开始探索如何编写可维护的面向对象JavaScript代码之前,我们先来快速看看什么是面向对象.如果已经了解面向对象的概念了,就可以直接跳过下一节. 什么是面向对象?  面向对象编程主要通过代码代表现实世界中的实

js学习笔记-编写高效、规范的js代码-Tom

编写高效.规范的js代码: 1.变量命名空间问题,尽量使用局部变量,防止命名冲突(污染作用域中的全局变量):全局空间命名的变量可以在对应的文档域任意位置中使用window调用. 2.尽量使用单var定义变量(作用域开始先申明并赋值变量,便于后边使用),使用var定义的变量只作用于对应的作用域中,如定义的全局变量作用于全局作用域,函数中定义的变量作用于该局部作用域中.未用var定义的变量相当于一个全局变量,在函数中出现的该类变量作用域全局域.(但是var定义的全局变量不能用delete删除,而未定

使用OpenCV编写的LDA程序----C++ LDA代码

改写自OpenCV中的lda.cpp程序,通过改写的程序可以返回自己所需的信息(LDA算法过程中产生的我们感兴趣的中间值),实现算法的独立编译,也可以通过阅读程序,加深对LDA算法的理解. // main.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <cxcore.hpp> #include <vector> #include <iostream> #include "lda.h