View | Details | Raw Unified | Return to bug 62234
Collapse All | Expand All

(-)src/core/org/apache/jmeter/gui/action/RawTextSearcher.java (-11 lines)
Lines 55-69 Link Here
55
                .map(token -> caseSensitive ? token : token.toLowerCase())
55
                .map(token -> caseSensitive ? token : token.toLowerCase())
56
                .anyMatch(token -> token.contains(textToSearch));
56
                .anyMatch(token -> token.contains(textToSearch));
57
    }
57
    }
58
59
    /**
60
     * Returns true if searchedTextLowerCase is in value
61
     * @param value string in which the search will be done
62
     * @param searchedTextLowerCase string which will be searched for
63
     * @return true if searchedTextLowerCase is in value
64
     */
65
    protected boolean testField(String value, String searchedTextLowerCase) {
66
        return !StringUtils.isEmpty(value)
67
                && value.toLowerCase().contains(searchedTextLowerCase);
68
    }
69
}
58
}
(-)src/core/org/apache/jmeter/gui/action/SearchTreeDialog.java (-78 / +207 lines)
Lines 22-31 Link Here
22
import java.awt.Dimension;
22
import java.awt.Dimension;
23
import java.awt.FlowLayout;
23
import java.awt.FlowLayout;
24
import java.awt.Font;
24
import java.awt.Font;
25
import java.awt.GridLayout;
25
import java.awt.event.ActionEvent;
26
import java.awt.event.ActionEvent;
26
import java.awt.event.ActionListener;
27
import java.awt.event.ActionListener;
27
import java.text.MessageFormat;
28
import java.text.MessageFormat;
29
import java.util.ArrayList;
28
import java.util.HashSet;
30
import java.util.HashSet;
31
import java.util.LinkedHashSet;
29
import java.util.List;
32
import java.util.List;
30
import java.util.Set;
33
import java.util.Set;
31
import java.util.regex.Pattern;
34
import java.util.regex.Pattern;
Lines 34-40 Link Here
34
import javax.swing.Action;
37
import javax.swing.Action;
35
import javax.swing.ActionMap;
38
import javax.swing.ActionMap;
36
import javax.swing.BorderFactory;
39
import javax.swing.BorderFactory;
37
import javax.swing.BoxLayout;
40
import javax.swing.Box;
38
import javax.swing.InputMap;
41
import javax.swing.InputMap;
39
import javax.swing.JButton;
42
import javax.swing.JButton;
40
import javax.swing.JCheckBox;
43
import javax.swing.JCheckBox;
Lines 49-54 Link Here
49
import javax.swing.tree.TreePath;
52
import javax.swing.tree.TreePath;
50
53
51
import org.apache.commons.lang3.StringUtils;
54
import org.apache.commons.lang3.StringUtils;
55
import org.apache.commons.lang3.tuple.Pair;
56
import org.apache.commons.lang3.tuple.Triple;
52
import org.apache.jmeter.gui.GuiPackage;
57
import org.apache.jmeter.gui.GuiPackage;
53
import org.apache.jmeter.gui.Replaceable;
58
import org.apache.jmeter.gui.Replaceable;
54
import org.apache.jmeter.gui.Searchable;
59
import org.apache.jmeter.gui.Searchable;
Lines 58-64 Link Here
58
import org.apache.jmeter.util.JMeterUtils;
63
import org.apache.jmeter.util.JMeterUtils;
59
import org.apache.jorphan.gui.ComponentUtil;
64
import org.apache.jorphan.gui.ComponentUtil;
60
import org.apache.jorphan.gui.JLabeledTextField;
65
import org.apache.jorphan.gui.JLabeledTextField;
61
import org.apache.jorphan.gui.layout.VerticalLayout;
62
import org.slf4j.Logger;
66
import org.slf4j.Logger;
63
import org.slf4j.LoggerFactory;
67
import org.slf4j.LoggerFactory;
64
68
Lines 77-82 Link Here
77
81
78
    private JButton searchButton;
82
    private JButton searchButton;
79
83
84
    private JButton nextButton;
85
    
86
    private JButton previousButton;
87
    
88
    private JButton searchAndExpandButton;
89
    
90
    private JButton replaceButton;
91
    
92
    private JButton replaceAllButton;
93
    
94
    private JButton replaceAndFindButton;
95
96
    private JButton cancelButton;
97
80
    private JLabeledTextField searchTF;
98
    private JLabeledTextField searchTF;
81
99
82
    private JLabeledTextField replaceTF;
100
    private JLabeledTextField replaceTF;
Lines 87-97 Link Here
87
105
88
    private JCheckBox isCaseSensitiveCB;
106
    private JCheckBox isCaseSensitiveCB;
89
107
90
    private JButton cancelButton;
91
108
92
    private transient String lastSearch = null;
109
    private transient Triple<String, Boolean, Boolean> lastSearchConditions = null;
93
110
94
    private JButton searchAndExpandButton;
111
    private List<JMeterTreeNode> lastSearchResult = new ArrayList<>();
112
    private int currentSearchIndex;
95
113
96
    public SearchTreeDialog() {
114
    public SearchTreeDialog() {
97
        super((JFrame) null, JMeterUtils.getResString("search_tree_title"), false); //$NON-NLS-1$
115
        super((JFrame) null, JMeterUtils.getResString("search_tree_title"), false); //$NON-NLS-1$
Lines 135-145 Link Here
135
        this.getContentPane().setLayout(new BorderLayout(10,10));
153
        this.getContentPane().setLayout(new BorderLayout(10,10));
136
154
137
        searchTF = new JLabeledTextField(JMeterUtils.getResString("search_text_field"), 20); //$NON-NLS-1$
155
        searchTF = new JLabeledTextField(JMeterUtils.getResString("search_text_field"), 20); //$NON-NLS-1$
138
        if (!StringUtils.isEmpty(lastSearch)) {
156
        searchTF.setAlignmentY(TOP_ALIGNMENT);
139
            searchTF.setText(lastSearch);
157
        if (lastSearchConditions != null) {
158
            searchTF.setText(lastSearchConditions.getLeft());
159
            isCaseSensitiveCB.setSelected(lastSearchConditions.getMiddle());
160
            isRegexpCB.setSelected(lastSearchConditions.getRight());
140
        }
161
        }
141
162
142
        replaceTF = new JLabeledTextField(JMeterUtils.getResString("search_text_replace"), 20); //$NON-NLS-1$
163
        replaceTF = new JLabeledTextField(JMeterUtils.getResString("search_text_replace"), 20); //$NON-NLS-1$
164
        replaceTF.setAlignmentX(TOP_ALIGNMENT);
143
        statusLabel = new JLabel(" ");
165
        statusLabel = new JLabel(" ");
144
        statusLabel.setPreferredSize(new Dimension(100, 20));
166
        statusLabel.setPreferredSize(new Dimension(100, 20));
145
        statusLabel.setMinimumSize(new Dimension(100, 20));
167
        statusLabel.setMinimumSize(new Dimension(100, 20));
Lines 150-184 Link Here
150
        isCaseSensitiveCB.setFont(FONT_SMALL);
172
        isCaseSensitiveCB.setFont(FONT_SMALL);
151
173
152
        JPanel searchCriterionPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
174
        JPanel searchCriterionPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
175
        searchCriterionPanel.setBorder(BorderFactory.createTitledBorder(JMeterUtils.getResString("search_matching"))); //$NON-NLS-1$
153
        searchCriterionPanel.add(isCaseSensitiveCB);
176
        searchCriterionPanel.add(isCaseSensitiveCB);
154
        searchCriterionPanel.add(isRegexpCB);
177
        searchCriterionPanel.add(isRegexpCB);
155
178
156
        JPanel searchPanel = new JPanel();
179
        JPanel searchPanel = new JPanel();
157
        searchPanel.setLayout(new BoxLayout(searchPanel, BoxLayout.Y_AXIS));
180
        searchPanel.setLayout(new GridLayout(4, 1));
158
        searchPanel.setBorder(BorderFactory.createEmptyBorder(7, 3, 3, 3));        
181
        searchPanel.setBorder(BorderFactory.createEmptyBorder(7, 3, 3, 3));
159
        searchPanel.add(searchTF);
182
        searchPanel.add(searchTF);
160
        searchPanel.add(replaceTF);
183
        searchPanel.add(replaceTF);
161
        searchPanel.add(statusLabel);
184
        searchPanel.add(statusLabel);
185
        searchPanel.add(searchCriterionPanel);
162
186
163
        JPanel buttonsPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
187
        JPanel buttonsPanel = new JPanel(new GridLayout(9, 1));
164
        searchButton = new JButton(JMeterUtils.getResString("search")); //$NON-NLS-1$
188
        searchButton = createButton("search_search_all"); //$NON-NLS-1$
165
        searchButton.addActionListener(this);
189
        searchButton.addActionListener(this);
166
        searchAndExpandButton = new JButton(JMeterUtils.getResString("search_expand")); //$NON-NLS-1$
190
        nextButton = createButton("search_next"); //$NON-NLS-1$
191
        nextButton.addActionListener(this);
192
        previousButton = createButton("search_previous"); //$NON-NLS-1$
193
        previousButton.addActionListener(this);
194
        searchAndExpandButton = createButton("search_search_all_expand"); //$NON-NLS-1$
167
        searchAndExpandButton.addActionListener(this);
195
        searchAndExpandButton.addActionListener(this);
168
        JButton replaceButton = new JButton(JMeterUtils.getResString("search_replace_all")); //$NON-NLS-1$
196
        replaceButton = createButton("search_replace"); //$NON-NLS-1$
169
        replaceButton.addActionListener(this);
197
        replaceButton.addActionListener(this);
170
        cancelButton = new JButton(JMeterUtils.getResString("cancel")); //$NON-NLS-1$
198
        replaceAllButton = createButton("search_replace_all"); //$NON-NLS-1$
199
        replaceAllButton.addActionListener(this);
200
        replaceAndFindButton = createButton("search_replace_and_find"); //$NON-NLS-1$
201
        replaceAndFindButton.addActionListener(this);
202
        cancelButton = createButton("cancel"); //$NON-NLS-1$
171
        cancelButton.addActionListener(this);
203
        cancelButton.addActionListener(this);
204
        buttonsPanel.add(nextButton);
205
        buttonsPanel.add(previousButton);
172
        buttonsPanel.add(searchButton);
206
        buttonsPanel.add(searchButton);
173
        buttonsPanel.add(searchAndExpandButton);
207
        buttonsPanel.add(searchAndExpandButton);
208
        buttonsPanel.add(Box.createVerticalStrut(30));
174
        buttonsPanel.add(replaceButton);
209
        buttonsPanel.add(replaceButton);
210
        buttonsPanel.add(replaceAllButton);
211
        buttonsPanel.add(replaceAndFindButton);
175
        buttonsPanel.add(cancelButton);
212
        buttonsPanel.add(cancelButton);
176
213
177
        JPanel searchAndReplacePanel = new JPanel();
214
        JPanel searchAndReplacePanel = new JPanel();
178
        searchAndReplacePanel.setLayout(new VerticalLayout());
215
        searchAndReplacePanel.setLayout(new BorderLayout());
179
        searchAndReplacePanel.add(searchPanel);
216
        searchAndReplacePanel.add(searchPanel, BorderLayout.CENTER);
180
        searchAndReplacePanel.add(searchCriterionPanel);
217
        searchAndReplacePanel.add(buttonsPanel, BorderLayout.EAST);
181
        searchAndReplacePanel.add(buttonsPanel);
182
        this.getContentPane().add(searchAndReplacePanel);
218
        this.getContentPane().add(searchAndReplacePanel);
183
        searchTF.requestFocusInWindow();
219
        searchTF.requestFocusInWindow();
184
220
Lines 186-250 Link Here
186
        ComponentUtil.centerComponentInWindow(this);
222
        ComponentUtil.centerComponentInWindow(this);
187
    }
223
    }
188
224
225
    private JButton createButton(String messageKey) {
226
        return new JButton(JMeterUtils.getResString(messageKey));
227
    }
228
189
    /**
229
    /**
190
     * Do search
230
     * Do search
191
     * @param e {@link ActionEvent}
231
     * @param e {@link ActionEvent}
192
     */
232
     */
193
    @Override
233
    @Override
194
    public void actionPerformed(ActionEvent e) {
234
    public void actionPerformed(ActionEvent e) {
235
        Object source = e.getSource();
195
        statusLabel.setText("");
236
        statusLabel.setText("");
196
        if (e.getSource() == cancelButton) {
237
        if (source == cancelButton) {
197
            searchTF.requestFocusInWindow();
238
            searchTF.requestFocusInWindow();
198
            this.setVisible(false);
239
            this.setVisible(false);
199
        } else if (e.getSource() == searchButton
240
        } else if (source == searchButton
200
                || e.getSource() == searchAndExpandButton) {
241
                || source == searchAndExpandButton) {
201
            doSearch(e);
242
            doSearch(e);
202
        } else {
243
        } else if (source == nextButton ||
244
                source == previousButton) {
245
            doNavigateToSearchResult(source == nextButton);
246
        } else if (source == replaceAllButton){
203
            doReplaceAll(e);
247
            doReplaceAll(e);
248
        } else if (!lastSearchResult.isEmpty() && source == replaceButton){
249
            doReplace();
250
        } else if (source == replaceAndFindButton){
251
            if(!lastSearchResult.isEmpty()) {
252
                doReplace();
253
            }
254
            doNavigateToSearchResult(true);
204
        }
255
        }
205
    }
256
    }
206
257
207
    /**
258
    /**
259
     * 
260
     */
261
    private void doReplace() {
262
        GuiPackage.getInstance().updateCurrentNode();
263
        JMeterTreeNode currentNode = lastSearchResult.get(currentSearchIndex);
264
        if(currentNode != null) {
265
            String wordToSearch = searchTF.getText();
266
            String wordToReplace = replaceTF.getText();
267
            String regex = isRegexpCB.isSelected() ? wordToSearch : Pattern.quote(wordToSearch);
268
            boolean caseSensitiveReplacement = isCaseSensitiveCB.isSelected();
269
            Pair<Integer, JMeterTreeNode> pair = doReplacementInCurrentNode(currentNode, regex, wordToReplace, caseSensitiveReplacement);
270
            int nbReplacements = 0;
271
            if(pair != null) {
272
                nbReplacements = pair.getLeft();
273
                GuiPackage.getInstance().updateCurrentGui();
274
                GuiPackage.getInstance().getMainFrame().repaint();
275
            } 
276
            statusLabel.setText(MessageFormat.format("Replaced {0} occurrences", nbReplacements));
277
        }
278
    }
279
280
    private JMeterTreeNode doNavigateToSearchResult(boolean isNext) {
281
        boolean doSearchAgain = 
282
                lastSearchConditions == null || 
283
                !Triple.of(searchTF.getText(), isCaseSensitiveCB.isSelected(), isRegexpCB.isSelected())
284
                .equals(lastSearchConditions);
285
        if(doSearchAgain) {
286
            String wordToSearch = searchTF.getText();
287
            if (StringUtils.isEmpty(wordToSearch)) {
288
                this.lastSearchConditions = null;
289
                return null;
290
            } else {
291
                this.lastSearchConditions = Triple.of(wordToSearch, isCaseSensitiveCB.isSelected(), isRegexpCB.isSelected());
292
            }
293
            Searcher searcher = createSearcher(wordToSearch);
294
            searchInTree(GuiPackage.getInstance(), searcher, wordToSearch);
295
        }
296
        if(!lastSearchResult.isEmpty()) {
297
            if(isNext) {
298
                currentSearchIndex = ++currentSearchIndex % lastSearchResult.size();
299
            } else {
300
                currentSearchIndex = currentSearchIndex > 0 ? --currentSearchIndex : lastSearchResult.size()-1;
301
            }
302
            JMeterTreeNode selectedNode = lastSearchResult.get(currentSearchIndex);
303
            TreePath selection = new TreePath(selectedNode.getPath());
304
            GuiPackage.getInstance().getMainFrame().getTree().setSelectionPath(selection);
305
            GuiPackage.getInstance().getMainFrame().getTree().scrollPathToVisible(selection);
306
            return selectedNode;
307
        }
308
        return null;
309
    }
310
311
    /**
208
     * @param e {@link ActionEvent}
312
     * @param e {@link ActionEvent}
209
     */
313
     */
210
    private void doSearch(ActionEvent e) {
314
    private void doSearch(ActionEvent e) {
211
        boolean expand = e.getSource()==searchAndExpandButton;
315
        boolean expand = e.getSource()==searchAndExpandButton;
212
        String wordToSearch = searchTF.getText();
316
        String wordToSearch = searchTF.getText();
213
        if (StringUtils.isEmpty(wordToSearch)) {
317
        if (StringUtils.isEmpty(wordToSearch)) {
318
            this.lastSearchConditions = null;
214
            return;
319
            return;
215
        } else {
320
        } else {
216
            this.lastSearch = wordToSearch;
321
            this.lastSearchConditions = Triple.of(wordToSearch, isCaseSensitiveCB.isSelected(), isRegexpCB.isSelected());
217
        }
322
        }
218
323
219
        // reset previous result
324
        // reset previous result
220
        ActionRouter.getInstance().doActionNow(new ActionEvent(e.getSource(), e.getID(), ActionNames.SEARCH_RESET));
325
        ActionRouter.getInstance().doActionNow(new ActionEvent(e.getSource(), e.getID(), ActionNames.SEARCH_RESET));
221
        // do search
326
        // do search
222
        Searcher searcher;
327
        Searcher searcher = createSearcher(wordToSearch);
223
        if (isRegexpCB.isSelected()) {
224
            searcher = new RegexpSearcher(isCaseSensitiveCB.isSelected(), searchTF.getText());
225
        } else {
226
            searcher = new RawTextSearcher(isCaseSensitiveCB.isSelected(), searchTF.getText());
227
        }
228
        GuiPackage guiPackage = GuiPackage.getInstance();
328
        GuiPackage guiPackage = GuiPackage.getInstance();
329
        guiPackage.beginUndoTransaction();
229
        int numberOfMatches = 0;
330
        int numberOfMatches = 0;
230
        try {
331
        try {
231
            guiPackage.beginUndoTransaction();
332
            Pair<Integer, Set<JMeterTreeNode>> result = searchInTree(guiPackage, searcher, wordToSearch);
232
            JMeterTreeModel jMeterTreeModel = guiPackage.getTreeModel();
333
            numberOfMatches = result.getLeft();
233
            Set<JMeterTreeNode> nodes = new HashSet<>();
334
            markConcernedNodes(expand, result.getRight());
234
            for (JMeterTreeNode jMeterTreeNode : jMeterTreeModel.getNodesOfType(Searchable.class)) {
235
                try {
236
                    Searchable searchable = (Searchable) jMeterTreeNode.getUserObject();
237
                    List<String> searchableTokens = searchable.getSearchableTokens();
238
                    boolean result = searcher.search(searchableTokens);
239
                    if (result) {
240
                        numberOfMatches++;
241
                        nodes.add(jMeterTreeNode);
242
                    }
243
                } catch (Exception ex) {
244
                    logger.error("Error occurred searching for word:"+ wordToSearch+ " in node:"+jMeterTreeNode.getName(), ex);
245
                }
246
            }
247
            markConcernedNodes(expand, nodes);
248
        } finally {
335
        } finally {
249
            guiPackage.endUndoTransaction();
336
            guiPackage.endUndoTransaction();
250
        }
337
        }
Lines 256-261 Link Here
256
    }
343
    }
257
344
258
    /**
345
    /**
346
     * @param wordToSearch
347
     * @return
348
     */
349
    private Searcher createSearcher(String wordToSearch) {
350
        if (isRegexpCB.isSelected()) {
351
            return new RegexpSearcher(isCaseSensitiveCB.isSelected(), wordToSearch);
352
        } else {
353
            return new RawTextSearcher(isCaseSensitiveCB.isSelected(), wordToSearch);
354
        }
355
    }
356
    
357
    private Pair<Integer, Set<JMeterTreeNode>> searchInTree(GuiPackage guiPackage, Searcher searcher, String wordToSearch) {
358
        int numberOfMatches = 0;
359
        JMeterTreeModel jMeterTreeModel = guiPackage.getTreeModel();
360
        Set<JMeterTreeNode> nodes = new LinkedHashSet<>();
361
        for (JMeterTreeNode jMeterTreeNode : jMeterTreeModel.getNodesOfType(Searchable.class)) {
362
            try {
363
                Searchable searchable = (Searchable) jMeterTreeNode.getUserObject();
364
                List<String> searchableTokens = searchable.getSearchableTokens();
365
                boolean result = searcher.search(searchableTokens);
366
                if (result) {
367
                    numberOfMatches++;
368
                    nodes.add(jMeterTreeNode);
369
                }
370
            } catch (Exception ex) {
371
                logger.error("Error occurred searching for word:{} in node:{}", wordToSearch, jMeterTreeNode.getName(), ex);
372
            }
373
        }
374
        this.currentSearchIndex = -1;
375
        this.lastSearchResult.clear();
376
        this.lastSearchResult.addAll(nodes);
377
        return Pair.of(numberOfMatches, nodes);
378
    }
379
380
    /**
259
     * @param expand true if we want to expand
381
     * @param expand true if we want to expand
260
     * @param nodes Set of {@link JMeterTreeNode} to mark
382
     * @param nodes Set of {@link JMeterTreeNode} to mark
261
     */
383
     */
Lines 282-288 Link Here
282
        boolean expand = e.getSource()==searchAndExpandButton;
404
        boolean expand = e.getSource()==searchAndExpandButton;
283
        String wordToSearch = searchTF.getText();
405
        String wordToSearch = searchTF.getText();
284
        String wordToReplace = replaceTF.getText();
406
        String wordToReplace = replaceTF.getText();
285
286
        if (StringUtils.isEmpty(wordToReplace)) {
407
        if (StringUtils.isEmpty(wordToReplace)) {
287
            return;
408
            return;
288
        }
409
        }
Lines 290-332 Link Here
290
        GuiPackage.getInstance().updateCurrentNode();
411
        GuiPackage.getInstance().updateCurrentNode();
291
        // reset previous result
412
        // reset previous result
292
        ActionRouter.getInstance().doActionNow(new ActionEvent(e.getSource(), e.getID(), ActionNames.SEARCH_RESET));
413
        ActionRouter.getInstance().doActionNow(new ActionEvent(e.getSource(), e.getID(), ActionNames.SEARCH_RESET));
293
        Searcher searcher;
414
        Searcher searcher = createSearcher(wordToSearch);
294
        String regex;
415
        String regex = isRegexpCB.isSelected() ? wordToSearch : Pattern.quote(wordToSearch);
295
        if (isRegexpCB.isSelected()) {
296
            regex = wordToSearch;
297
            searcher = new RegexpSearcher(isCaseSensitiveCB.isSelected(), wordToSearch);
298
        } else {
299
            regex = Pattern.quote(wordToSearch);
300
            searcher = new RawTextSearcher(isCaseSensitiveCB.isSelected(), wordToSearch);
301
        }
302
        GuiPackage guiPackage = GuiPackage.getInstance();
416
        GuiPackage guiPackage = GuiPackage.getInstance();
303
        JMeterTreeModel jMeterTreeModel = guiPackage.getTreeModel();
304
        Set<JMeterTreeNode> nodes = new HashSet<>();
305
        boolean caseSensitiveReplacement = isCaseSensitiveCB.isSelected();
417
        boolean caseSensitiveReplacement = isCaseSensitiveCB.isSelected();
306
        int totalReplaced = 0;
418
        int totalReplaced = 0;
307
        for (JMeterTreeNode jMeterTreeNode : jMeterTreeModel.getNodesOfType(Searchable.class)) {
419
        Pair<Integer, Set<JMeterTreeNode>> result = searchInTree(guiPackage, searcher, wordToSearch);
308
            try {
420
        Set<JMeterTreeNode> matchingNodes = result.getRight();
309
                Searchable searchable = (Searchable) jMeterTreeNode.getUserObject();
421
        Set<JMeterTreeNode> replacedNodes = new HashSet<>();
310
                List<String> searchableTokens = searchable.getSearchableTokens();
422
        for (JMeterTreeNode jMeterTreeNode : matchingNodes) {
311
                boolean result = searcher.search(searchableTokens);
423
            Pair<Integer, JMeterTreeNode> pair = doReplacementInCurrentNode(jMeterTreeNode, regex, wordToReplace, caseSensitiveReplacement);
312
                if (result && jMeterTreeNode.getUserObject() instanceof Replaceable) {
424
            if(pair != null) {
313
                    Replaceable replaceable = (Replaceable) jMeterTreeNode.getUserObject();
425
                totalReplaced += pair.getLeft();
314
                    int numberOfReplacements = replaceable.replace(regex, wordToReplace, caseSensitiveReplacement);
426
                replacedNodes.add(pair.getRight());
315
                    if (logger.isInfoEnabled()) {
316
                        logger.info("Replaced " + numberOfReplacements + " in element:"
317
                                + ((TestElement) jMeterTreeNode.getUserObject()).getName());
318
                    }
319
                    totalReplaced += numberOfReplacements;
320
                    if (numberOfReplacements > 0) {
321
                        nodes.add(jMeterTreeNode);
322
                    }
323
                }
324
            } catch (Exception ex) {
325
                logger.error("Error occurred replacing data in node:" + jMeterTreeNode.getName(), ex);
326
            }
427
            }
327
        }
428
        }
328
        statusLabel.setText(MessageFormat.format("Replaced {0} occurrences", totalReplaced));
429
        statusLabel.setText(MessageFormat.format("Replaced {0} occurrences", totalReplaced));
329
        markConcernedNodes(expand, nodes);
430
        markConcernedNodes(expand, replacedNodes);
330
        // Update GUI as current node may be concerned by changes
431
        // Update GUI as current node may be concerned by changes
331
        if (totalReplaced > 0) {
432
        if (totalReplaced > 0) {
332
            GuiPackage.getInstance().refreshCurrentGui();
433
            GuiPackage.getInstance().refreshCurrentGui();
Lines 336-341 Link Here
336
        searchTF.requestFocusInWindow();
437
        searchTF.requestFocusInWindow();
337
    }
438
    }
338
439
440
    /**
441
     * Replace in jMeterTreeNode regex by replaceBy
442
     * @param jMeterTreeNode Current {@link JMeterTreeNode}
443
     * @param regex Text to search (can be regex)
444
     * @param replaceBy Replacement text
445
     * @param caseSensitiveReplacement boolean if search is case sensitive
446
     * @return null if no replacement occurred or Pair of (number of replacement, current tree node)
447
     */
448
    private Pair<Integer, JMeterTreeNode> doReplacementInCurrentNode(JMeterTreeNode jMeterTreeNode,
449
            String regex, String replaceBy, boolean caseSensitiveReplacement) {
450
        try {
451
            if (jMeterTreeNode.getUserObject() instanceof Replaceable) {
452
                Replaceable replaceable = (Replaceable) jMeterTreeNode.getUserObject();
453
                int numberOfReplacements = replaceable.replace(regex, replaceBy, caseSensitiveReplacement);
454
                if (numberOfReplacements > 0) {
455
                    if (logger.isInfoEnabled()) {
456
                        logger.info("Replaced {} in element:{}", numberOfReplacements,
457
                                ((TestElement) jMeterTreeNode.getUserObject()).getName());
458
                    }
459
                    return Pair.of(numberOfReplacements, jMeterTreeNode);
460
                }
461
            }
462
        } catch (Exception ex) {
463
            logger.error("Error occurred replacing data in node:{}", jMeterTreeNode.getName(), ex);
464
        }
465
        return null;
466
    }
467
339
    /* (non-Javadoc)
468
    /* (non-Javadoc)
340
     * @see java.awt.Dialog#setVisible(boolean)
469
     * @see java.awt.Dialog#setVisible(boolean)
341
     */
470
     */
(-)src/core/org/apache/jmeter/resources/messages.properties (-3 / +9 lines)
Lines 1029-1046 Link Here
1029
scope=Scope
1029
scope=Scope
1030
search=Search
1030
search=Search
1031
search_base=Search base
1031
search_base=Search base
1032
search_expand=Search & Expand
1033
search_filter=Search Filter
1032
search_filter=Search Filter
1033
search_matching=Matching
1034
search_next=Next
1035
search_previous=Previous
1036
search_replace=Replace
1034
search_replace_all=Replace All
1037
search_replace_all=Replace All
1038
search_replace_and_find=Replace & Find
1039
search_search_all=Search All
1040
search_search_all_expand=Search All & Expand
1035
search_test=Search Test
1041
search_test=Search Test
1036
search_text_button_close=Close
1042
search_text_button_close=Close
1037
search_text_button_find=Find
1043
search_text_button_find=Find
1038
search_text_button_next=Find next
1044
search_text_button_next=Find next
1039
search_text_chkbox_case=Case sensitive
1045
search_text_chkbox_case=Case sensitive
1040
search_text_chkbox_regexp=Regular exp.
1046
search_text_chkbox_regexp=Regular exp.
1041
search_text_field=Search: 
1047
search_text_field=Search\: 
1042
search_tree_matches={0} node(s) match the search
1048
search_tree_matches={0} node(s) match the search
1043
search_text_replace=Replace by
1049
search_text_replace=Replace by\:
1044
search_text_title_not_found=Not found
1050
search_text_title_not_found=Not found
1045
search_tree_title=Search Tree
1051
search_tree_title=Search Tree
1046
searchbase=Search base
1052
searchbase=Search base
(-)src/core/org/apache/jmeter/resources/messages_fr.properties (-3 / +9 lines)
Lines 1016-1032 Link Here
1016
scheduler=Programmateur de d\u00E9marrage
1016
scheduler=Programmateur de d\u00E9marrage
1017
scheduler_configuration=Configuration du programmateur
1017
scheduler_configuration=Configuration du programmateur
1018
scope=Port\u00E9e
1018
scope=Port\u00E9e
1019
search=Rechercher
1019
search=Rechercher\:
1020
search_base=Base de recherche
1020
search_base=Base de recherche
1021
search_expand=Rechercher & D\u00E9plier
1022
search_filter=Filtre de recherche
1021
search_filter=Filtre de recherche
1022
search_matching=Correspondance
1023
search_next=Suivant
1024
search_previous=Pr\u00E9c\u00E9dent
1025
search_replace=Remplacer dans noeud s\u00E9lectionn\u00E9\:
1023
search_replace_all=Tout remplacer
1026
search_replace_all=Tout remplacer
1027
search_replace_and_find=Remplacer & Rechercher
1028
search_search_all=Tout Rechercher
1029
search_search_all_expand=Tout Rechercher & D\u00E9plier
1024
search_test=Recherche
1030
search_test=Recherche
1025
search_text_button_close=Fermer
1031
search_text_button_close=Fermer
1026
search_text_button_find=Rechercher
1032
search_text_button_find=Rechercher
1027
search_text_button_next=Suivant
1033
search_text_button_next=Suivant
1028
search_text_chkbox_case=Consid\u00E9rer la casse
1034
search_text_chkbox_case=Consid\u00E9rer la casse
1029
search_text_chkbox_regexp=Exp. reguli\u00E8re
1035
search_text_chkbox_regexp=Exp. r\u00E9guli\u00E8re
1030
search_text_field=Rechercher \:
1036
search_text_field=Rechercher \:
1031
search_text_replace=Remplacer par
1037
search_text_replace=Remplacer par
1032
search_text_title_not_found=Pas trouv\u00E9
1038
search_text_title_not_found=Pas trouv\u00E9

Return to bug 62234