package com.blazemeter.jmeter.control;
import kg.apc.jmeter.JMeterPluginsUtils;
import kg.apc.jmeter.gui.Grid;
import org.apache.jmeter.control.Controller;
import org.apache.jmeter.control.gui.AbstractControllerGui;
import org.apache.jmeter.gui.GuiPackage;
import org.apache.jmeter.gui.tree.JMeterTreeModel;
import org.apache.jmeter.gui.tree.JMeterTreeNode;
import org.apache.jmeter.samplers.Sampler;
import org.apache.jmeter.testelement.TestElement;
import org.apache.jmeter.testelement.property.CollectionProperty;
import org.apache.jmeter.testelement.property.JMeterProperty;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.log.Logger;
import java.awt.*;
import java.util.LinkedList;
public class WeightedSwitchControllerGui extends AbstractControllerGui {
private static final Logger log = LoggingManager.getLoggerForClass();
public static final String WEIGHTS = "Weight";
private Grid grid;
public WeightedSwitchControllerGui() {
super();
init();
clearGui();
}
private void init() {
setLayout(new BorderLayout(0, 5));
setBorder(makeBorder());
add(JMeterPluginsUtils.addHelpLinkToPanel(makeTitlePanel(), getClass().getSimpleName()), BorderLayout.NORTH);
grid = new Grid("Child Item Weights",
new String[]{"Name", WEIGHTS},
new Class[]{String.class, String.class},
new String[]{"", "100"});
grid.getComponent(2).setVisible(false); // hide grid mgmt buttons
add(grid, BorderLayout.CENTER);
}
@Override
public String getLabelResource() {
return getClass().getCanonicalName();
}
@Override
public String getStaticLabel() {
return "bzm - Weighted Switch Controller";
}
@Override
public TestElement createTestElement() {
WeightedSwitchController te = new WeightedSwitchController();
modifyTestElement(te);
return te;
}
@Override
public void modifyTestElement(TestElement element) {
super.configureTestElement(element);
if (element instanceof WeightedSwitchController) {
WeightedSwitchController wsc = (WeightedSwitchController) element;
wsc.setData(grid.getModel());
}
}
@Override
public void configure(TestElement element) {
// from model to GUI
super.configure(element);
log.debug("Props: " + this.isShowing() + " " + isVisible() + " " + isEnabled() + " " + isFocusOwner());
GuiPackage gp = GuiPackage.getInstance();
if (gp != null && element instanceof WeightedSwitchController) {
WeightedSwitchController wsc = (WeightedSwitchController) element;
CollectionProperty oldData = wsc.getData();
grid.getModel().clearData();
if (isShowing()) {
fillGridFromTree(wsc, oldData);
} else {
JMeterPluginsUtils.collectionPropertyToTableModelRows(oldData, grid.getModel());
}
}
}
private void fillGridFromTree(WeightedSwitchController wsc, CollectionProperty oldData) {
JMeterTreeModel treeModel = GuiPackage.getInstance().getTreeModel();
JMeterTreeNode root = (JMeterTreeNode) treeModel.getRoot();
LinkedList<JMeterTreeNode> childItems = getChildItems(root, wsc);
for (int n = 0; n < childItems.size(); n++) {
JMeterTreeNode node = childItems.get(n);
String w = "100";
if (oldData.size() > n && oldData.get(n) != null) {
JMeterProperty row = oldData.get(n);
if (row instanceof CollectionProperty) {
w = ((CollectionProperty) row).get(1).getStringValue();
}
}
grid.getModel().addRow(new String[]{node.getTestElement().getName(), w});
// FIXME: what about disabled items? will they screw up it all?
}
}
private LinkedList<JMeterTreeNode> getChildItems(JMeterTreeNode root, WeightedSwitchController element) {
LinkedList<JMeterTreeNode> result = new LinkedList<>();
for (int i = 0; i < root.getChildCount(); i++) {
JMeterTreeNode child = (JMeterTreeNode) root.getChildAt(i);
TestElement te = child.getTestElement();
if (element != root.getTestElement()) {
result.addAll(getChildItems(child, element));
} else {
if (te instanceof Sampler || te instanceof Controller) {
result.add(child);
}
}
}
return result;
}
@Override
public void clearGui() {
super.clearGui();
grid.getModel().clearData();
}
}