Author: pmouawad
Date: Tue Oct 11 17:32:43 2011
New Revision: 1181906

URL: http://svn.apache.org/viewvc?rev=1181906&view=rev
Log:
Bug 51876 - Functionnality to search in Samplers TreeView

Added:
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/Searchable.java   (with 
props)
    
jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/action/SearchTreeCommand.java
   (with props)
Modified:
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/action/ActionNames.java
    
jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/tree/JMeterCellRenderer.java
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/tree/JMeterTreeNode.java
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/util/JMeterMenuBar.java
    
jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties
    
jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties
    
jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java
    jakarta/jmeter/trunk/xdocs/changes.xml
    jakarta/jmeter/trunk/xdocs/usermanual/hints_and_tips.xml

Added: jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/Searchable.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/Searchable.java?rev=1181906&view=auto
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/Searchable.java (added)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/Searchable.java Tue Oct 
11 17:32:43 2011
@@ -0,0 +1,34 @@
+/*
+ * 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;
+
+/**
+ * Interface for nodes that are searchable
+ */
+public interface Searchable {
+
+    /**
+     * 
+     * @param textToSearch
+     * @return true if search was successful
+     */
+    boolean searchContent(String textToSearch)
+        throws Exception ;
+
+}

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

Modified: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/action/ActionNames.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/action/ActionNames.java?rev=1181906&r1=1181905&r2=1181906&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/action/ActionNames.java 
(original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/action/ActionNames.java 
Tue Oct 11 17:32:43 2011
@@ -83,6 +83,7 @@ public class ActionNames {
     public static final String SUB_TREE_SAVED   = "sub_tree_saved"; // 
$NON-NLS-1$
     public static final String TOGGLE           = "toggle"; // $NON-NLS-1$ 
enable/disable
     public static final String WHAT_CLASS       = "what_class"; // $NON-NLS-1$
+    public static final String SEARCH_TREE      = "search_tree"; // $NON-NLS-1$
 
     // Prevent instantiation
     private ActionNames(){

Added: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/action/SearchTreeCommand.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/action/SearchTreeCommand.java?rev=1181906&view=auto
==============================================================================
--- 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/action/SearchTreeCommand.java
 (added)
+++ 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/action/SearchTreeCommand.java
 Tue Oct 11 17:32:43 2011
@@ -0,0 +1,90 @@
+/*
+ * 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.event.ActionEvent;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import javax.swing.JOptionPane;
+
+import org.apache.jmeter.gui.GuiPackage;
+import org.apache.jmeter.gui.Searchable;
+import org.apache.jmeter.gui.tree.JMeterTreeModel;
+import org.apache.jmeter.gui.tree.JMeterTreeNode;
+import org.apache.jmeter.util.JMeterUtils;
+import org.apache.jorphan.logging.LoggingManager;
+import org.apache.log.Logger;
+
+/**
+ * Search nodes for a text
+ * TODO Enhance search dialog to select kind of nodes ....
+ */
+public class SearchTreeCommand extends AbstractAction {
+    private Logger logger = LoggingManager.getLoggerForClass();
+    private static final Set<String> commands = new HashSet<String>();
+
+    static {
+        commands.add(ActionNames.SEARCH_TREE);
+    }
+
+    /**
+     * @see Command#doAction(ActionEvent)
+     */
+    @Override
+    public void doAction(ActionEvent e) {
+        String wordToSearch = JOptionPane.showInputDialog(
+                GuiPackage.getInstance().getMainFrame(),
+                JMeterUtils.getResString("search_word"),  // $NON-NLS-1$
+                JMeterUtils.getResString("search_tree_title"),  // $NON-NLS-1$
+                JOptionPane.QUESTION_MESSAGE);
+        GuiPackage guiPackage = GuiPackage.getInstance();
+        JMeterTreeModel jMeterTreeModel = guiPackage.getTreeModel();
+        Iterator<?> iter = 
jMeterTreeModel.getNodesOfType(Searchable.class).iterator();
+        while (iter.hasNext()) {
+            try {
+                JMeterTreeNode jMeterTreeNode = (JMeterTreeNode) iter.next();
+                if (jMeterTreeNode.getUserObject() instanceof Searchable){
+                    Searchable searchable = (Searchable) 
jMeterTreeNode.getUserObject();
+                    
+                    boolean result = searchable.searchContent(wordToSearch);
+                    if(result) {
+                        jMeterTreeNode.setMarkedBySearch(true);
+                    }
+                    else {
+                        jMeterTreeNode.setMarkedBySearch(false);   
+                    }
+                }
+            } catch (Exception ex) {
+                logger.error("Error occured searching for word:"+ 
wordToSearch, ex);
+            }
+        }
+        GuiPackage.getInstance().getMainFrame().repaint();
+    }
+
+
+    /**
+     * @see Command#getActionNames()
+     */
+    @Override
+    public Set<String> getActionNames() {
+        return commands;
+    }
+}

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

Modified: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/tree/JMeterCellRenderer.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/tree/JMeterCellRenderer.java?rev=1181906&r1=1181905&r2=1181906&view=diff
==============================================================================
--- 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/tree/JMeterCellRenderer.java
 (original)
+++ 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/tree/JMeterCellRenderer.java
 Tue Oct 11 17:32:43 2011
@@ -18,8 +18,10 @@
 
 package org.apache.jmeter.gui.tree;
 
+import java.awt.Color;
 import java.awt.Component;
 
+import javax.swing.BorderFactory;
 import javax.swing.ImageIcon;
 import javax.swing.JTree;
 import javax.swing.tree.DefaultTreeCellRenderer;
@@ -36,10 +38,11 @@ public class JMeterCellRenderer extends 
     @Override
     public Component getTreeCellRendererComponent(JTree tree, Object value, 
boolean sel, boolean expanded,
             boolean leaf, int row, boolean p_hasFocus) {
-        super.getTreeCellRendererComponent(tree, ((JMeterTreeNode) 
value).getName(), sel, expanded, leaf, row,
+        JMeterTreeNode node = (JMeterTreeNode) value;
+        super.getTreeCellRendererComponent(tree, node.getName(), sel, 
expanded, leaf, row,
                 p_hasFocus);
-        boolean enabled = ((JMeterTreeNode) value).isEnabled();
-        ImageIcon ic = ((JMeterTreeNode) value).getIcon(enabled);
+        boolean enabled = node.isEnabled();
+        ImageIcon ic = node.getIcon(enabled);
         if (ic != null) {
             if (enabled) {
                 setIcon(ic);
@@ -51,13 +54,19 @@ public class JMeterCellRenderer extends 
             {
                 // Must therefore set the enabled icon so there is at least 
some
                 // icon
-                ic = ((JMeterTreeNode) value).getIcon();
+                ic = node.getIcon();
                 if (ic != null) {
                     setIcon(ic);
                 }
             }
         }
         this.setEnabled(enabled);
+        if(node.isMarkedBySearch()) {
+            setBorder(BorderFactory.createLineBorder(Color.red));
+        }
+        else {
+            setBorder(null);
+        }
         return this;
     }
 }

Modified: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/tree/JMeterTreeNode.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/tree/JMeterTreeNode.java?rev=1181906&r1=1181905&r2=1181906&view=diff
==============================================================================
--- 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/tree/JMeterTreeNode.java 
(original)
+++ 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/tree/JMeterTreeNode.java 
Tue Oct 11 17:32:43 2011
@@ -45,6 +45,8 @@ public class JMeterTreeNode extends Defa
 
     private final JMeterTreeModel treeModel;
 
+    private boolean markedBySearch;
+
     public JMeterTreeNode() {// Allow serializable test to work
         // TODO: is the serializable test necessary now that JMeterTreeNode is
         // no longer a GUI component?
@@ -64,6 +66,23 @@ public class JMeterTreeNode extends Defa
         getTestElement().setProperty(new BooleanProperty(TestElement.ENABLED, 
enabled));
         treeModel.nodeChanged(this);
     }
+    
+    /**
+     * Tag Node as result of a search
+     * @return
+     */
+    public void setMarkedBySearch(boolean tagged) {
+        this.markedBySearch = tagged;
+        treeModel.nodeChanged(this);
+    }
+    
+    /**
+     * Node is markedBySearch by a search
+     * @return
+     */
+    public boolean isMarkedBySearch() {
+        return this.markedBySearch;
+    }
 
     public ImageIcon getIcon() {
         return getIcon(true);

Modified: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/util/JMeterMenuBar.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/util/JMeterMenuBar.java?rev=1181906&r1=1181905&r2=1181906&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/util/JMeterMenuBar.java 
(original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/gui/util/JMeterMenuBar.java 
Tue Oct 11 17:32:43 2011
@@ -127,6 +127,8 @@ public class JMeterMenuBar extends JMenu
 
     private Collection<JMenuItem> remote_engine_exit;
 
+    private JMenu searchMenu;
+
     public JMeterMenuBar() {
         // List for recent files menu items
         file_load_recent_files = new LinkedList<JComponent>();
@@ -253,8 +255,10 @@ public class JMeterMenuBar extends JMenu
         makeRunMenu();
         makeOptionsMenu();
         makeHelpMenu();
+        makeSearchMenu();
         this.add(fileMenu);
         this.add(editMenu);
+        this.add(searchMenu);
         this.add(runMenu);
         this.add(optionsMenu);
         this.add(helpMenu);
@@ -491,6 +495,15 @@ public class JMeterMenuBar extends JMenu
         fileMenu.add(file_exit);
     }
 
+    private void makeSearchMenu() {
+        // Search MENU
+        searchMenu = makeMenuRes("menu_search"); //$NON-NLS-1$
+
+        JMenuItem search = makeMenuItemRes("menu_search", 
ActionNames.SEARCH_TREE); //$NON-NLS-1$
+        searchMenu.add(search);
+        searchMenu.setEnabled(true);
+    }
+    
     public void setRunning(boolean running, String host) {
         log.info("setRunning(" + running + "," + host + ")");
 

Modified: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties?rev=1181906&r1=1181905&r2=1181906&view=diff
==============================================================================
--- 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties 
(original)
+++ 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties 
Tue Oct 11 17:32:43 2011
@@ -504,6 +504,7 @@ menu_open=Open
 menu_post_processors=Post Processors
 menu_pre_processors=Pre Processors
 menu_response_based_modifiers=Response Based Modifiers
+menu_search=Search
 menu_tables=Table
 menu_timer=Timer
 metadata=MetaData
@@ -758,6 +759,8 @@ search_text_chkbox_regexp=Regular exp.
 search_text_field=Search: 
 search_text_msg_not_found=Text not found
 search_text_title_not_found=Not found
+search_tree_title=Search Tree
+search_word=Search Word
 searchbase=Search base
 searchfilter=Search Filter
 searchtest=Search test

Modified: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties?rev=1181906&r1=1181905&r2=1181906&view=diff
==============================================================================
--- 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties
 (original)
+++ 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties
 Tue Oct 11 17:32:43 2011
@@ -462,6 +462,7 @@ menu_open=Ouvrir...
 menu_post_processors=Post-Processeurs
 menu_pre_processors=Pr\u00E9-Processeurs
 menu_response_based_modifiers=Modificateurs bas\u00E9s sur la r\u00E9ponse
+menu_search=Rechercher
 menu_threads=Moteurs d'utilisateurs
 menu_timer=Compteurs de temps
 metadata=M\u00E9ta-donn\u00E9es
@@ -671,6 +672,8 @@ search_text_chkbox_regexp=Exp. reguli\u0
 search_text_field=Rechercher \:
 search_text_msg_not_found=Texte non trouv\u00E9
 search_text_title_not_found=Pas trouv\u00E9
+search_tree_title=Rechercher dans l'arbre
+search_word=Rechercher le mot
 searchbase=Base de recherche
 searchfilter=Filtre de recherche
 searchtest=Recherche

Modified: 
jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java?rev=1181906&r1=1181905&r2=1181906&view=diff
==============================================================================
--- 
jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java
 (original)
+++ 
jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.java
 Tue Oct 11 17:32:43 2011
@@ -40,9 +40,11 @@ import java.util.concurrent.ThreadPoolEx
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
+import org.apache.commons.lang.StringUtils;
 import org.apache.jmeter.config.Argument;
 import org.apache.jmeter.config.Arguments;
 import org.apache.jmeter.engine.event.LoopIterationEvent;
+import org.apache.jmeter.gui.Searchable;
 import org.apache.jmeter.protocol.http.control.AuthManager;
 import org.apache.jmeter.protocol.http.control.CacheManager;
 import org.apache.jmeter.protocol.http.control.CookieManager;
@@ -82,7 +84,7 @@ import org.apache.oro.text.regex.Perl5Ma
  *
  */
 public abstract class HTTPSamplerBase extends AbstractSampler
-    implements TestListener, ThreadListener, HTTPConstantsInterface {
+    implements TestListener, ThreadListener, HTTPConstantsInterface, 
Searchable {
 
     private static final long serialVersionUID = 240L;
 
@@ -1692,5 +1694,46 @@ public abstract class HTTPSamplerBase ex
             return sample(url, method, areFollowingRedirect, depth);
         }
     }
-}
+
+    /**
+     * We search in URL and arguments
+     * TODO Can be enhanced
+     * {@inheritDoc}
+     */
+    public boolean searchContent(String textToSearch) throws Exception {
+        String searchedTextLowerCase = textToSearch.toLowerCase();
+        if(testField(getUrl().toString(), searchedTextLowerCase)) {
+            return true;
+        }
+        Arguments arguments = getArguments();
+        if(arguments != null) {
+            for (int i = 0; i < arguments.getArgumentCount(); i++) {
+                Argument argument = arguments.getArgument(i);
+                if(testField(argument.getName(), searchedTextLowerCase)) {
+                    return true;
+                }
+                if(testField(argument.getValue(), searchedTextLowerCase)) {
+                    return true;
+                }
+            }
+        }
+        if(testField(getComment(), searchedTextLowerCase)) {
+            return true;
+        }
+        return false;
+    }
+    
+    /**
+     * Returns true if searchedTextLowerCase is in value
+     * @param value
+     * @param searchedTextLowerCase
+     * @return
+     */
+    private boolean testField(String value, String searchedTextLowerCase) {
+        if(!StringUtils.isEmpty(value)) {
+            return value.toLowerCase().indexOf(searchedTextLowerCase)>=0;
+        }
+        return false;
+    }
+ }
 

Modified: jakarta/jmeter/trunk/xdocs/changes.xml
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/changes.xml?rev=1181906&r1=1181905&r2=1181906&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/changes.xml (original)
+++ jakarta/jmeter/trunk/xdocs/changes.xml Tue Oct 11 17:32:43 2011
@@ -164,6 +164,7 @@ Mirror server now uses default port 8081
 <ul>
 <li>Bug 51892 - Default mirror port should be different from default proxy 
port</li>
 <li>Bug 51817 - Moving variables up and down in User Defined Variables 
control</li>
+<li>Bug 51876 - Functionnality to search in Samplers TreeView</li>
 </ul>
 
 <h2>Non-functional changes</h2>

Modified: jakarta/jmeter/trunk/xdocs/usermanual/hints_and_tips.xml
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/usermanual/hints_and_tips.xml?rev=1181906&r1=1181905&r2=1181906&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/usermanual/hints_and_tips.xml (original)
+++ jakarta/jmeter/trunk/xdocs/usermanual/hints_and_tips.xml Tue Oct 11 
17:32:43 2011
@@ -64,6 +64,13 @@ You can use these to determine the corre
 </p>
 </subsection>
 
+<subsection name="&sect-num;.3 Searching" anchor="searching">
+<p>
+It is sometimes hard to find in a Test Plan tree and elements using a variable 
or containing a certain URL or parameter.
+A new feature is now available since 2.5.2, you can access it in Menu Search.
+For now this feature only searches HTTP Samplers. If you find it useful log a 
Bugzilla enhancement request.
+</p>
+</subsection>
 </section>
 
 </body>



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to