You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by vl...@apache.org on 2020/03/28 16:18:32 UTC

[jmeter] branch master updated: Restore GuiPackage#nodesToGui as it is required for UnsharedComponent handling

This is an automated email from the ASF dual-hosted git repository.

vladimirsitnikov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jmeter.git


The following commit(s) were added to refs/heads/master by this push:
     new 6b69329  Restore GuiPackage#nodesToGui as it is required for UnsharedComponent handling
6b69329 is described below

commit 6b693295d4bf734512cad1d99ddf5cd88f3f2941
Author: Vladimir Sitnikov <si...@gmail.com>
AuthorDate: Sat Mar 28 19:17:38 2020 +0300

    Restore GuiPackage#nodesToGui as it is required for UnsharedComponent handling
    
    UI for UnsharedComponent are created once, so per-testelement cache is required.
    
    regression since 0bdbe5bd17f6e2385a5fe58216e259dd85a04054
---
 .../java/org/apache/jmeter/gui/GuiPackage.java     | 51 ++++++++++++++++------
 1 file changed, 38 insertions(+), 13 deletions(-)

diff --git a/src/core/src/main/java/org/apache/jmeter/gui/GuiPackage.java b/src/core/src/main/java/org/apache/jmeter/gui/GuiPackage.java
index a89065b..1e06cf8 100644
--- a/src/core/src/main/java/org/apache/jmeter/gui/GuiPackage.java
+++ b/src/core/src/main/java/org/apache/jmeter/gui/GuiPackage.java
@@ -98,6 +98,13 @@ public final class GuiPackage implements LocaleChangeListener, HistoryListener {
     private boolean dirty = false;
 
     /**
+     * Map from TestElement to JMeterGUIComponent, mapping the nodes in the tree
+     * to their corresponding GUI components.
+     * <p>This enables to associate {@link UnsharedComponent} UIs with their {@link TestElement}.</p>
+     */
+    private Map<TestElement, JMeterGUIComponent> nodesToGui = new HashMap<>();
+
+    /**
      * Map from Class to JMeterGUIComponent, mapping the Class of a GUI
      * component to an instance of that component.
      */
@@ -254,7 +261,13 @@ public final class GuiPackage implements LocaleChangeListener, HistoryListener {
      */
     public JMeterGUIComponent getGui(TestElement node, Class<?> guiClass, Class<?> testClass) {
         try {
-            JMeterGUIComponent comp = getGuiFromCache(guiClass, testClass);
+            JMeterGUIComponent comp = nodesToGui.get(node);
+            if (comp == null) {
+                comp = getGuiFromCache(guiClass, testClass);
+                nodesToGui.put(node, comp);
+            } else {
+                updateUi(comp);
+            }
             log.debug("Gui retrieved = {}", comp);
             return comp;
         } catch (Exception e) {
@@ -270,8 +283,9 @@ public final class GuiPackage implements LocaleChangeListener, HistoryListener {
      * @param node
      *            the test element being removed
      */
-    @API(since = "5.3", status = API.Status.DEPRECATED)
+    @API(since = "5.3", status = API.Status.MAINTAINED)
     public void removeNode(TestElement node) {
+        nodesToGui.remove(node);
     }
 
     /**
@@ -325,7 +339,9 @@ public final class GuiPackage implements LocaleChangeListener, HistoryListener {
         try {
             JMeterGUIComponent comp = getGuiFromCache(guiClass, testClass);
             comp.clearGui();
-            return comp.createTestElement();
+            TestElement node = comp.createTestElement();
+            nodesToGui.put(node, comp);
+            return node;
         } catch (Exception e) {
             log.error("Problem retrieving gui", e);
             return null;
@@ -354,7 +370,9 @@ public final class GuiPackage implements LocaleChangeListener, HistoryListener {
                 comp = getGuiFromCache(c, null);
             }
             comp.clearGui();
-            return comp.createTestElement();
+            TestElement node = comp.createTestElement();
+            nodesToGui.put(node, comp);
+            return node;
         } catch (NoClassDefFoundError e) {
             log.error("Problem retrieving gui for " + objClass, e);
             String msg="Cannot find class: "+e.getMessage();
@@ -408,18 +426,23 @@ public final class GuiPackage implements LocaleChangeListener, HistoryListener {
                 }
             }
         }
-        if (comp instanceof JComponent) {
-            JComponent jc = (JComponent) comp;
-            Object epoch = jc.getClientProperty(LAF_EPOCH);
-            int currentLafEpoch = lafEpoch.get();
-            if (epoch instanceof Integer && ((Integer) epoch) < currentLafEpoch) {
-                JFactory.updateUi(jc);
-            }
-            jc.putClientProperty(LAF_EPOCH, currentLafEpoch);
-        }
+        updateUi(comp);
         return comp;
     }
 
+    private void updateUi(JMeterGUIComponent comp) {
+        if (!(comp instanceof JComponent)) {
+            return;
+        }
+        JComponent jc = (JComponent) comp;
+        Object epoch = jc.getClientProperty(LAF_EPOCH);
+        int currentLafEpoch = lafEpoch.get();
+        if (epoch instanceof Integer && ((Integer) epoch) < currentLafEpoch) {
+            JFactory.updateUi(jc);
+        }
+        jc.putClientProperty(LAF_EPOCH, currentLafEpoch);
+    }
+
     /**
      * Update the GUI for the currently selected node. The GUI component is
      * configured to reflect the settings in the current tree node.
@@ -669,6 +692,7 @@ public final class GuiPackage implements LocaleChangeListener, HistoryListener {
 
         // Invalidate UIs
         guis.clear();
+        nodesToGui.clear();
         testBeanGUIs.clear();
 
         // Call "start edit for the current tree node" action to show the UI
@@ -726,6 +750,7 @@ public final class GuiPackage implements LocaleChangeListener, HistoryListener {
     public void clearTestPlan() {
         testPlanListeners.stream().forEach(TestPlanListener::beforeTestPlanCleared);
         getTreeModel().clearTestPlan();
+        nodesToGui.clear();
         setTestPlanFile(null);
         testPlanListeners.stream().forEach(TestPlanListener::afterTestPlanCleared);
         undoHistory.clear();