|
JMeter example source code file (SearchTextExtension.java)
The JMeter SearchTextExtension.java source code
/*
* 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.visualizers;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JEditorPane;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.Document;
import javax.swing.text.Highlighter;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.log.Logger;
public class SearchTextExtension implements ActionListener, DocumentListener {
private static final Logger log = LoggingManager.getLoggerForClass();
private static final String SEARCH_TEXT_COMMAND = "search_text"; // $NON-NLS-1$
private static volatile int LAST_POSITION_DEFAULT = 0;
private int lastPosition = LAST_POSITION_DEFAULT;
private final static Color HILIT_COLOR = Color.LIGHT_GRAY;
private Highlighter selection;
private Highlighter.HighlightPainter painter;
private JLabel label;
private JButton findButton;
private JTextField textToFindField;
private JCheckBox caseChkBox;
private JCheckBox regexpChkBox;
private String lastTextTofind;
private boolean newSearch = false;
private JEditorPane results;
private JPanel searchPanel;
public void init(JPanel resultsPane) {
}
public void setResults(JEditorPane results) {
if (this.results != null) {
newSearch = true;
resetTextToFind();
}
this.results = results;
// prepare highlighter to show text find with search command
selection = new DefaultHighlighter();
painter = new DefaultHighlighter.DefaultHighlightPainter(HILIT_COLOR);
results.setHighlighter(selection);
}
/**
* Launch find text engine on response text
*/
private void executeAndShowTextFind() {
String textToFind = textToFindField.getText();
if (results != null && results.getText().length() > 0
&& textToFind.length() > 0) {
// new search?
if (lastTextTofind != null && !lastTextTofind.equals(textToFind)) {
lastPosition = LAST_POSITION_DEFAULT;
}
if (log.isDebugEnabled()) {
log.debug("lastPosition=" + lastPosition);
}
Matcher matcher = null;
try {
Pattern pattern = createPattern(textToFind);
Document contentDoc = results.getDocument();
String body = contentDoc.getText(lastPosition,
(contentDoc.getLength() - lastPosition));
matcher = pattern.matcher(body);
if ((matcher != null) && (matcher.find())) {
selection.removeAllHighlights();
selection.addHighlight(lastPosition + matcher.start(),
lastPosition + matcher.end(), painter);
results.setCaretPosition(lastPosition + matcher.end());
// save search position
lastPosition = lastPosition + matcher.end();
findButton.setText(JMeterUtils
.getResString("search_text_button_next"));// $NON-NLS-1$
lastTextTofind = textToFind;
newSearch = true;
} else {
// Display not found message and reset search
JOptionPane.showMessageDialog(null, JMeterUtils
.getResString("search_text_msg_not_found"),// $NON-NLS-1$
JMeterUtils.getResString("search_text_title_not_found"), // $NON-NLS-1$
JOptionPane.INFORMATION_MESSAGE);
lastPosition = LAST_POSITION_DEFAULT;
findButton.setText(JMeterUtils
.getResString("search_text_button_find"));// $NON-NLS-1$
results.setCaretPosition(0);
}
} catch (BadLocationException ble) {
log.error("Location exception in text find", ble);// $NON-NLS-1$
}
}
}
/**
* Create the text find task pane
*
* @return Text find task pane
*/
private JPanel createSearchTextPanel() {
Font font = new Font("SansSerif", Font.PLAIN, 10);
// Search field
searchPanel = new JPanel();
searchPanel.setLayout(new BoxLayout(searchPanel, BoxLayout.X_AXIS));
searchPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
label = new JLabel(JMeterUtils.getResString("search_text_field")); // $NON-NLS-1$
label.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5));
searchPanel.add(label);
textToFindField = new JTextField(); // $NON-NLS-1$
searchPanel.add(textToFindField);
searchPanel.add(Box.createRigidArea(new Dimension(5,0)));
// add listener to intercept texttofind changes and reset search
textToFindField.getDocument().addDocumentListener(this);
// Buttons
findButton = new JButton(JMeterUtils
.getResString("search_text_button_find")); // $NON-NLS-1$
findButton.setFont(font);
findButton.setActionCommand(SEARCH_TEXT_COMMAND);
findButton.addActionListener(this);
searchPanel.add(findButton);
// checkboxes
caseChkBox = new JCheckBox(JMeterUtils
.getResString("search_text_chkbox_case"), false); // $NON-NLS-1$
caseChkBox.setFont(font);
searchPanel.add(caseChkBox);
regexpChkBox = new JCheckBox(JMeterUtils
.getResString("search_text_chkbox_regexp"), false); // $NON-NLS-1$
regexpChkBox.setFont(font);
searchPanel.add(regexpChkBox);
// when Enter is pressed, search start
InputMap im = textToFindField
.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
im.put(KeyStroke.getKeyStroke("ENTER"), SEARCH_TEXT_COMMAND);
ActionMap am = textToFindField.getActionMap();
am.put(SEARCH_TEXT_COMMAND, new EnterAction());
// default not visible
searchPanel.setVisible(true);
return searchPanel;
}
JPanel createSearchTextExtensionPane() {
JPanel pane = new JPanel();
pane.setLayout(new BoxLayout(pane, BoxLayout.X_AXIS));
pane.add(createSearchTextPanel());
return pane;
}
/**
* Display the response as text or as rendered HTML. Change the text on the
* button appropriate to the current display.
*
* @param e
* the ActionEvent being processed
*/
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
// Search text in response data
if (SEARCH_TEXT_COMMAND.equals(command)) {
executeAndShowTextFind();
}
}
private class EnterAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent ev) {
executeAndShowTextFind();
}
}
// DocumentListener method
public void changedUpdate(DocumentEvent e) {
// do nothing
}
// DocumentListener method
public void insertUpdate(DocumentEvent e) {
resetTextToFind();
}
// DocumentListener method
public void removeUpdate(DocumentEvent e) {
resetTextToFind();
}
void resetTextToFind() {
if (newSearch) {
log.debug("reset pass");
// Reset search
lastPosition = LAST_POSITION_DEFAULT;
lastTextTofind = null;
findButton.setText(JMeterUtils
.getResString("search_text_button_find"));// $NON-NLS-1$
selection.removeAllHighlights();
results.setCaretPosition(0);
newSearch = false;
}
}
private Pattern createPattern(String textToFind) {
// desactivate or not specials regexp char
String textToFindQ = Pattern.quote(textToFind);
if (regexpChkBox.isSelected()) {
textToFindQ = textToFind;
}
Pattern pattern = null;
if (caseChkBox.isSelected()) {
pattern = Pattern.compile(textToFindQ);
} else {
pattern = Pattern.compile(textToFindQ, Pattern.CASE_INSENSITIVE);
}
return pattern;
}
}
Other JMeter examples (source code examples)Here is a short list of links related to this JMeter SearchTextExtension.java source code file: |
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.