You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by pm...@apache.org on 2017/01/16 20:18:55 UTC

svn commit: r1779101 - in /jmeter/trunk: src/core/org/apache/jmeter/gui/ src/core/org/apache/jmeter/gui/action/ src/core/org/apache/jmeter/gui/action/impl/ src/core/org/apache/jmeter/gui/util/ src/core/org/apache/jmeter/resources/ xdocs/

Author: pmouawad
Date: Mon Jan 16 20:18:54 2017
New Revision: 1779101

URL: http://svn.apache.org/viewvc?rev=1779101&view=rev
Log:
Bug 60514 - Ability to apply a naming convention on Children of a Transaction Controller
Contributed by UbikLoadPack
Bugzilla Id: 60514

Added:
    jmeter/trunk/src/core/org/apache/jmeter/gui/action/ApplyNamingConvention.java   (with props)
    jmeter/trunk/src/core/org/apache/jmeter/gui/action/TreeNodeNamingPolicy.java   (with props)
    jmeter/trunk/src/core/org/apache/jmeter/gui/action/impl/
    jmeter/trunk/src/core/org/apache/jmeter/gui/action/impl/DefaultTreeNodeNamingPolicy.java   (with props)
Modified:
    jmeter/trunk/src/core/org/apache/jmeter/gui/GuiPackage.java
    jmeter/trunk/src/core/org/apache/jmeter/gui/action/ActionNames.java
    jmeter/trunk/src/core/org/apache/jmeter/gui/action/AddToTree.java
    jmeter/trunk/src/core/org/apache/jmeter/gui/util/MenuFactory.java
    jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties
    jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties
    jmeter/trunk/xdocs/changes.xml

Modified: jmeter/trunk/src/core/org/apache/jmeter/gui/GuiPackage.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/GuiPackage.java?rev=1779101&r1=1779100&r2=1779101&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/GuiPackage.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/GuiPackage.java Mon Jan 16 20:18:54 2017
@@ -37,6 +37,8 @@ import javax.swing.SwingUtilities;
 import org.apache.jmeter.engine.util.ValueReplacer;
 import org.apache.jmeter.exceptions.IllegalUserActionException;
 import org.apache.jmeter.gui.UndoHistory.HistoryListener;
+import org.apache.jmeter.gui.action.TreeNodeNamingPolicy;
+import org.apache.jmeter.gui.action.impl.DefaultTreeNodeNamingPolicy;
 import org.apache.jmeter.gui.tree.JMeterTreeListener;
 import org.apache.jmeter.gui.tree.JMeterTreeModel;
 import org.apache.jmeter.gui.tree.JMeterTreeNode;
@@ -69,6 +71,10 @@ public final class GuiPackage implements
     /** Logging. */
     private static final Logger log = LoggingManager.getLoggerForClass();
 
+    private static final String NAMING_POLICY_IMPLEMENTATION = 
+            JMeterUtils.getPropDefault("naming_policy_impl", //$NON-NLS-1$ 
+                    DefaultTreeNodeNamingPolicy.class.getName());
+
     /** Singleton instance. */
     private static GuiPackage guiPack;
 
@@ -653,6 +659,8 @@ public final class GuiPackage implements
 
     private final List<Stoppable> stoppables = Collections.synchronizedList(new ArrayList<Stoppable>());
 
+    private TreeNodeNamingPolicy namingPolicy;
+
     /**
      * Sets the filepath of the current test plan. It's shown in the main frame
      * title and used on saving.
@@ -856,4 +864,21 @@ public final class GuiPackage implements
         ((JMeterToolBar)toolbar).updateUndoRedoIcons(history.canUndo(), history.canRedo());
     }
 
+    /**
+     * @return {@link TreeNodeNamingPolicy}
+     */
+    public TreeNodeNamingPolicy getNamingPolicy() {
+        if(namingPolicy == null) {
+            try {
+                Class<?> implementationClass = Class.forName(NAMING_POLICY_IMPLEMENTATION);
+                this.namingPolicy = (TreeNodeNamingPolicy) implementationClass.newInstance();
+                
+            } catch (Exception ex) {
+                log.error("Failed to create configured naming policy:"+NAMING_POLICY_IMPLEMENTATION+", will use default one", ex);
+                this.namingPolicy = new DefaultTreeNodeNamingPolicy();
+            }
+        }
+        return namingPolicy;
+    }
+
 }

Modified: jmeter/trunk/src/core/org/apache/jmeter/gui/action/ActionNames.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/action/ActionNames.java?rev=1779101&r1=1779100&r2=1779101&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/action/ActionNames.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/action/ActionNames.java Mon Jan 16 20:18:54 2017
@@ -33,8 +33,9 @@ public final class ActionNames {
     public static final String ADD              = "Add"; // $NON-NLS-1$
     public static final String ADD_ALL          = "add_all"; // $NON-NLS-1$
     public static final String ADD_PARENT       = "Add Parent"; // $NON-NLS-1$
-    public static final String ANALYZE_FILE     = "Analyze File"; // $NON-NLS-1$
     public static final String ADD_THINK_TIME_BETWEEN_EACH_STEP    = "Add Think Time between each step"; // $NON-NLS-1$
+    public static final String ANALYZE_FILE     = "Analyze File"; // $NON-NLS-1$
+    public static final String APPLY_NAMING_CONVENTION    = "Apply Naming Convention"; // $NON-NLS-1$
     public static final String CHANGE_LANGUAGE  = "change_language"; // $NON-NLS-1$
     public static final String CHANGE_PARENT    = "Change Parent"; // $NON-NLS-1$
     public static final String CHECK_DIRTY      = "check_dirty"; // $NON-NLS-1$

Modified: jmeter/trunk/src/core/org/apache/jmeter/gui/action/AddToTree.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/action/AddToTree.java?rev=1779101&r1=1779100&r2=1779101&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/action/AddToTree.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/action/AddToTree.java Mon Jan 16 20:18:54 2017
@@ -68,6 +68,7 @@ public class AddToTree extends AbstractA
             TestElement testElement = guiPackage.createTestElement(((JComponent) e.getSource()).getName());
             JMeterTreeNode parentNode = guiPackage.getCurrentNode();
             JMeterTreeNode node = guiPackage.getTreeModel().addComponent(testElement, parentNode);
+            guiPackage.getNamingPolicy().nameOnCreation(node);
             guiPackage.getMainFrame().getTree().setSelectionPath(new TreePath(node.getPath()));
         } catch (Exception err) {
             log.error("", err); // $NON-NLS-1$

Added: jmeter/trunk/src/core/org/apache/jmeter/gui/action/ApplyNamingConvention.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/action/ApplyNamingConvention.java?rev=1779101&view=auto
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/action/ApplyNamingConvention.java (added)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/action/ApplyNamingConvention.java Mon Jan 16 20:18:54 2017
@@ -0,0 +1,92 @@
+/*
+ * 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 org.apache.jmeter.gui.action;
+
+import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.jmeter.control.Controller;
+import org.apache.jmeter.gui.GuiPackage;
+import org.apache.jmeter.gui.tree.JMeterTreeNode;
+import org.apache.jmeter.util.JMeterUtils;
+import org.apache.jorphan.logging.LoggingManager;
+import org.apache.log.Logger;
+
+/**
+ * Allows to apply naming convention on nodes
+ * @since 3.2
+ */
+public class ApplyNamingConvention extends AbstractAction {
+    private static final Logger log = LoggingManager.getLoggerForClass();
+
+    private static final Set<String> commands = new HashSet<>();
+    
+
+    static {
+        commands.add(ActionNames.APPLY_NAMING_CONVENTION);
+    }
+
+    public ApplyNamingConvention() {
+    }
+
+    @Override
+    public void doAction(ActionEvent e) {
+        GuiPackage guiPackage = GuiPackage.getInstance();
+        JMeterTreeNode currentNode = guiPackage.getTreeListener().getCurrentNode();
+        if (!(currentNode.getUserObject() instanceof Controller)) {
+            Toolkit.getDefaultToolkit().beep();
+            return;
+        }
+        try {
+            applyNamingPolicyToCurrentNode(guiPackage, currentNode);            
+        } catch (Exception err) {
+            Toolkit.getDefaultToolkit().beep();
+            log.error("Failed to apply naming policy", err);
+            JMeterUtils.reportErrorToUser("Failed to apply naming policy", err);
+        }
+
+    }
+
+    /**
+     * Apply the naming policy of currentNode children
+     * @param guiPackage {@link GuiPackage}
+     * @param currentNode Parent node of elements on which we apply naming policy
+     */
+    private void applyNamingPolicyToCurrentNode(GuiPackage guiPackage, 
+            JMeterTreeNode currentNode) {
+        TreeNodeNamingPolicy namingPolicy = guiPackage.getNamingPolicy();
+        guiPackage.updateCurrentNode();
+        Enumeration<JMeterTreeNode> enumeration = currentNode.children();
+        int index = 0;
+        namingPolicy.resetState(currentNode);
+        while(enumeration.hasMoreElements()) {
+            JMeterTreeNode childNode = enumeration.nextElement();
+            namingPolicy.rename(currentNode, childNode, index);
+            index++;
+        }        
+    }
+
+    @Override
+    public Set<String> getActionNames() {
+        return commands;
+    }
+}

Propchange: jmeter/trunk/src/core/org/apache/jmeter/gui/action/ApplyNamingConvention.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: jmeter/trunk/src/core/org/apache/jmeter/gui/action/TreeNodeNamingPolicy.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/action/TreeNodeNamingPolicy.java?rev=1779101&view=auto
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/action/TreeNodeNamingPolicy.java (added)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/action/TreeNodeNamingPolicy.java Mon Jan 16 20:18:54 2017
@@ -0,0 +1,53 @@
+/*
+ * 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 org.apache.jmeter.gui.action;
+
+import org.apache.jmeter.gui.tree.JMeterTreeNode;
+
+/**
+ * Naming policy applied to JMeter Tree nodes :
+ * <ul>
+ * <li>on creation through {@link TreeNodeNamingPolicy#nameOnCreation(JMeterTreeNode)}</li>
+ * <li>By applying naming policy on Controller child nodes through {@link TreeNodeNamingPolicy#resetState(JMeterTreeNode)}
+    and {@link TreeNodeNamingPolicy#rename(JMeterTreeNode, JMeterTreeNode, int)}</li>
+ * </ul> 
+ * @since 3.2
+ */
+public interface TreeNodeNamingPolicy {
+
+    /**
+     * Called by Apply Naming Policy popup menu on TransactionController nodes
+     * Rename childNode based on custom policy 
+     * @param parentNode Parent node
+     * @param childNode Child node
+     * @param index index of child node
+     */
+    void rename(JMeterTreeNode parentNode, JMeterTreeNode childNode, int index);
+
+    /**
+     * Called within Apply Naming Policy popup menu on TransactionController nodes to 
+     * init the naming process. 
+     * @param parentNode {@link JMeterTreeNode} Parent of nodes that will be renamed
+     */
+    void resetState(JMeterTreeNode parentNode);
+    
+    /**
+     * @param node {@link JMeterTreeNode} node that has been added to JMeter Tree node
+     */
+    void nameOnCreation(JMeterTreeNode node);
+}

Propchange: jmeter/trunk/src/core/org/apache/jmeter/gui/action/TreeNodeNamingPolicy.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: jmeter/trunk/src/core/org/apache/jmeter/gui/action/impl/DefaultTreeNodeNamingPolicy.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/action/impl/DefaultTreeNodeNamingPolicy.java?rev=1779101&view=auto
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/action/impl/DefaultTreeNodeNamingPolicy.java (added)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/action/impl/DefaultTreeNodeNamingPolicy.java Mon Jan 16 20:18:54 2017
@@ -0,0 +1,76 @@
+/*
+ * 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 org.apache.jmeter.gui.action.impl;
+
+import java.text.DecimalFormat;
+
+import org.apache.jmeter.control.TransactionController;
+import org.apache.jmeter.gui.action.TreeNodeNamingPolicy;
+import org.apache.jmeter.gui.tree.JMeterTreeNode;
+import org.apache.jmeter.samplers.Sampler;
+import org.apache.jmeter.testelement.TestElement;
+import org.apache.jmeter.util.JMeterUtils;
+
+/**
+ * Default implementation of {@link TreeNodeNamingPolicy}
+ * @since 3.2
+ */
+public class DefaultTreeNodeNamingPolicy implements TreeNodeNamingPolicy {
+    private static final String PREFIX = JMeterUtils.getPropDefault("naming_policy.prefix", ""); 
+    private static final String SUFFIX = JMeterUtils.getPropDefault("naming_policy.suffix", ""); 
+    private int numberOfChildren;
+    private int index;
+    private DecimalFormat formatter;
+
+
+    /**
+     * @see org.apache.jmeter.gui.action.TreeNodeNamingPolicy#rename(org.apache.jmeter.gui.tree.JMeterTreeNode, org.apache.jmeter.gui.tree.JMeterTreeNode, int)
+     */
+    @Override
+    public void rename(JMeterTreeNode parentNode, JMeterTreeNode childNode, int iterationIndex) {
+        if(childNode.getUserObject() instanceof TransactionController ||
+                childNode.getUserObject() instanceof Sampler) {
+            childNode.setName(parentNode.getName()+"-"+formatter.format(index));
+            index++;
+        }
+    }
+
+    /**
+     * @see org.apache.jmeter.gui.action.TreeNodeNamingPolicy#resetState(org.apache.jmeter.gui.tree.JMeterTreeNode)
+     */
+    @Override
+    public void resetState(JMeterTreeNode rootNode) {
+        this.numberOfChildren = rootNode.getChildCount();
+        this.index = 0;
+        int numberOfDigits = String.valueOf(numberOfChildren).length();
+        StringBuilder formatSB = new StringBuilder(numberOfDigits);
+        for (int i=0; i<numberOfDigits;i++) {
+            formatSB.append("0");
+        }
+        this.formatter = new DecimalFormat(formatSB.toString());
+    }
+
+    @Override
+    public void nameOnCreation(JMeterTreeNode node) {
+        if(node.getName().isEmpty()) {
+            node.setName(((TestElement)node.getUserObject()).getClass().getSimpleName());
+        }
+        node.setName(PREFIX+node.getName()+SUFFIX);
+    }
+}

Propchange: jmeter/trunk/src/core/org/apache/jmeter/gui/action/impl/DefaultTreeNodeNamingPolicy.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: jmeter/trunk/src/core/org/apache/jmeter/gui/util/MenuFactory.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/gui/util/MenuFactory.java?rev=1779101&r1=1779100&r2=1779101&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/gui/util/MenuFactory.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/gui/util/MenuFactory.java Mon Jan 16 20:18:54 2017
@@ -290,6 +290,9 @@ public final class MenuFactory {
         pop.add(MenuFactory.makeMenuItemRes("add_think_times",// $NON-NLS-1$
                 ActionNames.ADD_THINK_TIME_BETWEEN_EACH_STEP));
 
+        pop.add(MenuFactory.makeMenuItemRes("apply_naming",// $NON-NLS-1$
+                ActionNames.APPLY_NAMING_CONVENTION));
+        
         pop.add(makeMenus(MENU_PARENT_CONTROLLER,
                 JMeterUtils.getResString("change_parent"),// $NON-NLS-1$
                 ActionNames.CHANGE_PARENT));

Modified: jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties?rev=1779101&r1=1779100&r2=1779101&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties Mon Jan 16 20:18:54 2017
@@ -100,6 +100,7 @@ als_message3=/lib directory and enter th
 analyze=Analyze Data File...
 anchor_modifier_title=HTML Link Parser
 appearance=Look and Feel
+apply_naming=Apply Naming Policy
 argument_must_not_be_negative=The Argument must not be negative\!
 arguments_panel_title=Command parameters
 assertion_assume_success=Ignore Status

Modified: jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties?rev=1779101&r1=1779100&r2=1779101&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties Mon Jan 16 20:18:54 2017
@@ -93,6 +93,7 @@ als_message3=r\u00E9pertoire /lib et ent
 analyze=En train d'analyser le fichier de donn\u00E9es
 anchor_modifier_title=Analyseur de lien HTML
 appearance=Apparence
+apply_naming=Appliquer Convention Nommage
 argument_must_not_be_negative=L'argument ne peut pas \u00EAtre n\u00E9gatif \!
 arguments_panel_title=Param\u00E8tres de commande
 assertion_assume_success=Ignorer le statut

Modified: jmeter/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1779101&r1=1779100&r2=1779101&view=diff
==============================================================================
--- jmeter/trunk/xdocs/changes.xml [utf-8] (original)
+++ jmeter/trunk/xdocs/changes.xml [utf-8] Mon Jan 16 20:18:54 2017
@@ -152,6 +152,7 @@ JMeter now requires Java 8. Ensure you u
 <ul>
     <li><bug>54525</bug>Search Feature : Enhance it with ability to replace</li>
     <li><bug>60530</bug>Add API to create JMeter threads while test is running. Based on a contribution by Logan Mauzaize (logan.mauzaize at gmail.com) and Maxime Chassagneux (maxime.chassagneux at gmail.com).</li>
+    <li><bug>60514</bug>Ability to apply a naming convention on Children of a Transaction Controller. Contributed by Ubik Load Pack (support at ubikloadpack.com)</li>
 </ul>
 
 <ch_section>Non-functional changes</ch_section>