diff --git a/src/core/src/main/java/org/apache/jmeter/gui/action/SearchTreeDialog.java b/src/core/src/main/java/org/apache/jmeter/gui/action/SearchTreeDialog.java index 51f0f7c63ac..ef746abe0e2 100644 --- a/src/core/src/main/java/org/apache/jmeter/gui/action/SearchTreeDialog.java +++ b/src/core/src/main/java/org/apache/jmeter/gui/action/SearchTreeDialog.java @@ -104,6 +104,8 @@ public class SearchTreeDialog extends JDialog implements ActionListener { // NOS private JCheckBox isCaseSensitiveCB; + private JCheckBox isNamesReplaceableCB; + private transient Triple lastSearchConditions = null; @@ -171,14 +173,17 @@ private void init() { // WARNING: called from ctor so must not be overridden (i. statusLabel.setMinimumSize(new Dimension(100, 20)); isRegexpCB = new JCheckBox(JMeterUtils.getResString("search_text_chkbox_regexp"), false); //$NON-NLS-1$ isCaseSensitiveCB = new JCheckBox(JMeterUtils.getResString("search_text_chkbox_case"), true); //$NON-NLS-1$ + isNamesReplaceableCB = new JCheckBox(JMeterUtils.getResString("search_text_chkbox_names_replaceable"), false); //$NON-NLS-1$ JFactory.small(isRegexpCB); JFactory.small(isCaseSensitiveCB); + JFactory.small(isNamesReplaceableCB); JPanel searchCriterionPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); searchCriterionPanel.setBorder(BorderFactory.createTitledBorder(JMeterUtils.getResString("search_matching"))); //$NON-NLS-1$ searchCriterionPanel.add(isCaseSensitiveCB); searchCriterionPanel.add(isRegexpCB); + searchCriterionPanel.add(isNamesReplaceableCB); JPanel searchPanel = new JPanel(); searchPanel.setLayout(new MigLayout("fillx, wrap 2", "[][fill,grow]")); @@ -288,7 +293,8 @@ private void doReplace() { String wordToReplace = replaceTF.getText(); String regex = isRegexpCB.isSelected() ? wordToSearch : Pattern.quote(wordToSearch); boolean caseSensitiveReplacement = isCaseSensitiveCB.isSelected(); - Pair pair = doReplacementInCurrentNode(currentNode, regex, wordToReplace, caseSensitiveReplacement); + boolean namesReplacement = isNamesReplaceableCB.isSelected(); + Pair pair = doReplacementInCurrentNode(currentNode, regex, wordToReplace, caseSensitiveReplacement, namesReplacement); if(pair != null) { nbReplacements = pair.getLeft(); GuiPackage.getInstance().updateCurrentGui(); @@ -437,12 +443,13 @@ private void doReplaceAll(ActionEvent e) { String regex = isRegexpCB.isSelected() ? wordToSearch : Pattern.quote(wordToSearch); GuiPackage guiPackage = GuiPackage.getInstance(); boolean caseSensitiveReplacement = isCaseSensitiveCB.isSelected(); + boolean namesReplacement = isNamesReplaceableCB.isSelected(); int totalReplaced = 0; Pair> result = searchInTree(guiPackage, searcher, wordToSearch); Set matchingNodes = result.getRight(); Set replacedNodes = new HashSet<>(); for (JMeterTreeNode jMeterTreeNode : matchingNodes) { - Pair pair = doReplacementInCurrentNode(jMeterTreeNode, regex, wordToReplace, caseSensitiveReplacement); + Pair pair = doReplacementInCurrentNode(jMeterTreeNode, regex, wordToReplace, caseSensitiveReplacement, namesReplacement); if(pair != null) { totalReplaced += pair.getLeft(); replacedNodes.add(pair.getRight()); @@ -468,11 +475,15 @@ private void doReplaceAll(ActionEvent e) { * @return null if no replacement occurred or Pair of (number of replacement, current tree node) */ private static Pair doReplacementInCurrentNode(JMeterTreeNode jMeterTreeNode, - String regex, String replaceBy, boolean caseSensitiveReplacement) { + String regex, String replaceBy, boolean caseSensitiveReplacement, boolean namesReplacement) { try { if (jMeterTreeNode.getUserObject() instanceof Replaceable) { Replaceable replaceable = (Replaceable) jMeterTreeNode.getUserObject(); int numberOfReplacements = replaceable.replace(regex, replaceBy, caseSensitiveReplacement); + if (namesReplacement) { + jMeterTreeNode.setName(jMeterTreeNode.getName().replaceAll(regex, replaceBy)); + numberOfReplacements++; + } if (numberOfReplacements > 0) { if (logger.isInfoEnabled()) { logger.info("Replaced {} in element:{}", numberOfReplacements, @@ -480,7 +491,11 @@ private static Pair doReplacementInCurrentNode(JMeterTr } return Pair.of(numberOfReplacements, jMeterTreeNode); } + } else if (namesReplacement) { + jMeterTreeNode.setName(jMeterTreeNode.getName().replaceAll(regex, replaceBy)); + return Pair.of(1, jMeterTreeNode); } + } catch (Exception ex) { logger.error("Error occurred replacing data in node:{}", jMeterTreeNode.getName(), ex); } diff --git a/src/core/src/main/resources/org/apache/jmeter/resources/messages.properties b/src/core/src/main/resources/org/apache/jmeter/resources/messages.properties index 23721c4b4c9..283c559ea08 100644 --- a/src/core/src/main/resources/org/apache/jmeter/resources/messages.properties +++ b/src/core/src/main/resources/org/apache/jmeter/resources/messages.properties @@ -1125,6 +1125,7 @@ search_text_button_close=Close search_text_button_find=Find search_text_chkbox_case=Case sensitive search_text_chkbox_regexp=Regular exp. +search_text_chkbox_names_replaceable=Names replace search_text_field=Search\: search_tree_matches={0} node(s) match the search search_text_replace=Replace by\: