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 |
*/ |