Skip to content

Commit

Permalink
Support for interface selection (#32)
Browse files Browse the repository at this point in the history
* Improvement: Get the provider list from zk, the ui directly selects the interface to reduce the input error probability

* modify comments

* add jar file to dist directory
  • Loading branch information
ningyu1 committed Nov 13, 2018
1 parent 9181d8a commit b6c7b24
Show file tree
Hide file tree
Showing 10 changed files with 721 additions and 30 deletions.
Binary file not shown.
Binary file added dist/jmeter-plugins-dubbo-1.3.7.jar
Binary file not shown.
4 changes: 2 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,13 @@
<modelVersion>4.0.0</modelVersion>
<groupId>io.github.ningyu</groupId>
<artifactId>jmeter-plugins-dubbo</artifactId>
<version>1.3.6</version>
<version>1.3.7</version>

<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion>
<dubbo_version>2.6.2</dubbo_version>
<dubbo_version>2.6.4</dubbo_version>
<gson_version>2.8.2</gson_version>
<zookeeper_version>3.4.9</zookeeper_version>
<zkclient_version>0.2</zkclient_version>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package io.github.ningyu.jmeter.plugin.dubbo.gui;

import javax.swing.*;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.List;
import java.util.Vector;

/**
* AutoCompleter
*/
public class AutoCompleter implements KeyListener {

private JComboBox owner = null;
private JTextField editor = null;

private ComboBoxModel model = null;

public AutoCompleter(JComboBox comboBox) {
owner = comboBox;
editor = (JTextField) comboBox.getEditor().getEditorComponent();
editor.addKeyListener(this);
model = comboBox.getModel();
// owner.addItemListener(this);
}

public AutoCompleter(JComboBox comboBox, ItemListener itemListener) {
owner = comboBox;
editor = (JTextField) comboBox.getEditor().getEditorComponent();
editor.addKeyListener(this);
model = comboBox.getModel();
owner.addItemListener(itemListener);
}

public void keyTyped(KeyEvent e) {
}

public void keyPressed(KeyEvent e) {
// char ch = e.getKeyChar();
// if (ch == KeyEvent.VK_ENTER) {
// return;
// }
// editor.setText("");
}

public void keyReleased(KeyEvent e) {
char ch = e.getKeyChar();
if (ch == KeyEvent.VK_ENTER) {
int caretPosition = editor.getCaretPosition();
String str = editor.getText();
if (str.length() == 0)
return;
autoComplete(str, caretPosition);
}
// if (ch == KeyEvent.CHAR_UNDEFINED || Character.isISOControl(ch)
// || ch == KeyEvent.VK_DELETE)
// return;
}

/**
* 自动完成。根据输入的内容,在列表中找到相似的项目.
*/
protected void autoComplete(String strf, int caretPosition) {
Object[] opts;
opts = getMatchingOptions(strf.substring(0, caretPosition));
if (owner != null) {
model = new DefaultComboBoxModel(opts);
owner.setModel(model);
}
if (opts.length > 0) {
String str = opts[0].toString();
// editor.setCaretPosition(caretPosition);
if (owner != null) {
try {
owner.showPopup();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}

/**
* 找到相似的项目, 并且将之排列到数组的最前面。
*
* @param str
* @return 返回所有项目的列表。
*/
protected Object[] getMatchingOptions(String str) {
List v = new Vector();
List v1 = new Vector();
model = owner.getModel();
for (int k = 0; k < model.getSize(); k++) {
Object itemObj = model.getElementAt(k);
if (itemObj != null) {
String item = itemObj.toString();
if (item.toUpperCase().indexOf(str.toUpperCase()) != -1)
v.add(model.getElementAt(k));
else
v1.add(model.getElementAt(k));
} else
v1.add(model.getElementAt(k));
}
for (int i = 0; i < v1.size(); i++) {
v.add(v1.get(i));
}
if (v.isEmpty())
v.add(str);
return v.toArray();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,37 +16,34 @@
*/
package io.github.ningyu.jmeter.plugin.dubbo.gui;

import com.alibaba.dubbo.common.URL;

import io.github.ningyu.jmeter.plugin.dubbo.sample.DubboSample;
import io.github.ningyu.jmeter.plugin.dubbo.sample.MethodArgument;
import io.github.ningyu.jmeter.plugin.dubbo.sample.ProviderService;
import org.apache.commons.lang3.StringUtils;
import org.apache.jmeter.gui.util.HorizontalPanel;
import org.apache.jmeter.gui.util.VerticalPanel;
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 java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableModel;

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

/**
* DubboSampleGui </br>
* invoke sequence**clearGui()->createTestElement()->modifyTestElement()->configure()**
Expand All @@ -58,7 +55,7 @@ public class DubboSampleGui extends AbstractSamplerGui {
/**
*/
private static final long serialVersionUID = -3248204995359935007L;

private JComboBox<String> registryProtocolText;
private JComboBox<String> rpcProtocolText;
private JTextField addressText;
Expand All @@ -76,7 +73,8 @@ public class DubboSampleGui extends AbstractSamplerGui {
private String[] columnNames = {"paramType", "paramValue"};
private String[] tmpRow = {"", ""};
private int textColumns = 2;

private JAutoCompleteComboBox<String> interfaceList;
private JAutoCompleteComboBox<String> methodList;

public DubboSampleGui() {
super();
Expand Down Expand Up @@ -117,7 +115,51 @@ private void init() {
ah.add(addressText);
ah.add(addressHelpLable);
registrySettings.add(ah);

//Selection Interface
JPanel sh = new HorizontalPanel();
JButton jButton = new JButton("Get Provider List");
interfaceList = new JAutoCompleteComboBox<String>(new DefaultComboBoxModel<String>(new String[]{}), new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
doChange(e.getItem().toString());
}
}
});
interfaceList.addPropertyChangeListener("model", new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
doChange(interfaceList.getSelectedItem().toString());
}
});
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
doConfirm(e, interfaceList);
}
});
sh.add(jButton);
sh.add(new JLabel("Interfaces:", SwingConstants.RIGHT));
sh.add(interfaceList);
sh.add(new JLabel("Methods:", SwingConstants.RIGHT));
methodList = new JAutoCompleteComboBox<String>(new DefaultComboBoxModel<String>(new String[]{}), new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
methodText.setText(e.getItem().toString());
}
}
});
methodList.addPropertyChangeListener("model", new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
methodText.setText(methodList.getSelectedItem().toString());
}
});
sh.add(methodList);
registrySettings.add(sh);


//RPC Protocol Settings
JPanel protocolSettings = new VerticalPanel();
protocolSettings.setBorder(BorderFactory.createTitledBorder("RPC Protocol Settings"));
Expand Down Expand Up @@ -391,6 +433,50 @@ public void clearGui() {
model.setDataVector(null, columnNames);
}

private void doChange(String key) {
ProviderService providerService = ProviderService.get(addressText.getText());
Map<String, URL> provider = providerService.findByService(key);
if (provider != null && !provider.isEmpty()) {
URL url = new ArrayList<URL>(provider.values()).get(0);
String group = url.getParameter(com.alibaba.dubbo.common.Constants.GROUP_KEY);
String version = url.getParameter(com.alibaba.dubbo.common.Constants.VERSION_KEY);
String timeout = url.getParameter(com.alibaba.dubbo.common.Constants.TIMEOUT_KEY);
String protocol = url.getProtocol() + "://";
String interfaceName = url.getServiceInterface();
String method = url.getParameter(com.alibaba.dubbo.common.Constants.METHODS_KEY);
groupText.setText(group);
versionText.setText(version);
timeoutText.setText(timeout);
rpcProtocolText.setSelectedItem(protocol);
interfaceText.setText(interfaceName);
//set method
String[] items = method.split(",");
methodList.setModel(new DefaultComboBoxModel<String>(items));
}
}

private void doConfirm(ActionEvent event, JAutoCompleteComboBox<String> interfaceList) {
String protocol = registryProtocolText.getSelectedItem().toString();
String address = addressText.getText();
if (StringUtils.isBlank(address)) {
JOptionPane.showMessageDialog(this.getParent(), "Address can't be empty!", "error", JOptionPane.ERROR_MESSAGE);
return;
}
int result = JOptionPane.showConfirmDialog(this.getParent(), "Obtaining all the providers lists may cause jmeter to stop responding for a few seconds. Do you want to continue?", "warn", JOptionPane.YES_NO_CANCEL_OPTION);
if (result == JOptionPane.YES_OPTION) {
List<String> list = new ArrayList<String>();
try {
list = ProviderService.get(address).getProviders(protocol, address);
JOptionPane.showMessageDialog(this.getParent(), "Get provider list to finish! Check if the log has errors.", "info", JOptionPane.INFORMATION_MESSAGE);
} catch (Exception e) {
JOptionPane.showMessageDialog(this.getParent(), e.getMessage(), "error", JOptionPane.ERROR_MESSAGE);
return;
}
String[] items = list.toArray(new String[]{});
interfaceList.setModel(new DefaultComboBoxModel<String>(items));
}
}

}


0 comments on commit b6c7b24

Please sign in to comment.