org.apache.jmeter.visualizers.RenderAsXPath2 Maven / Gradle / Ivy
/*
* 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.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.jmeter.extractor.XPath2Extractor;
import org.apache.jmeter.gui.util.JSyntaxTextArea;
import org.apache.jmeter.gui.util.JTextScrollPane;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jmeter.util.XPathUtil;
import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Implement ResultsRender for XPath tester
*/
public class RenderAsXPath2 implements ResultRenderer, ActionListener {
private static final Logger log = LoggerFactory.getLogger(RenderAsXPath2.class);
private static final String XPATH_TESTER_COMMAND = "xpath_tester"; // $NON-NLS-1$
private static final String XPATH_NAMESPACES_COMMAND = "xpath_namespaces"; // $NON-NLS-1$
private JPanel xmlWithXPathPane;
private JSyntaxTextArea xmlDataField;
private JTextField xpathExpressionField;
private JSyntaxTextArea xpathResultField;
private JTabbedPane rightSide;
// Should we return fragment as text, rather than text of fragment?
private final JCheckBox getFragment =
new JCheckBox(JMeterUtils.getResString("xpath_tester_fragment"));//$NON-NLS-1$
private JSyntaxTextArea namespacesTA;
/** {@inheritDoc} */
@Override
public void clearData() {
// N.B. don't set xpathExpressionField to empty to keep xpath
this.xmlDataField.setText(""); // $NON-NLS-1$
this.xpathResultField.setText(""); // $NON-NLS-1$
}
/** {@inheritDoc} */
@Override
public void init() {
// Create the panels for the xpath tab
xmlWithXPathPane = createXpathExtractorPanel();
}
/**
* 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
*/
@Override
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
String xmlDataFieldText = xmlDataField.getText();
if (StringUtils.isEmpty(xmlDataFieldText)) {
return;
}
if (XPATH_TESTER_COMMAND.equals(command)) {
XPath2Extractor extractor = new XPath2Extractor();
extractor.setFragment(getFragment.isSelected());
executeAndShowXPathTester(xmlDataFieldText, extractor);
}
else if (XPATH_NAMESPACES_COMMAND.equals(command)) {
this.xpathResultField.setText(getDocumentNamespaces(xmlDataFieldText));
}
}
/**
* Launch xpath engine to parse a input text
* @param textToParse
*/
private void executeAndShowXPathTester(String textToParse, XPath2Extractor extractor) {
if (textToParse != null && textToParse.length() > 0
&& this.xpathExpressionField.getText().length() > 0) {
this.xpathResultField.setText(process(textToParse, extractor));
this.xpathResultField.setCaretPosition(0); // go to first line
}
}
private String process(String textToParse, XPath2Extractor extractor) {
try {
List matchStrings = new ArrayList<>();
XPathUtil.putValuesForXPathInListUsingSaxon(textToParse, xpathExpressionField.getText(),
matchStrings, extractor.getFragment(), -1, namespacesTA.getText());
StringBuilder builder = new StringBuilder();
int nbFound = matchStrings.size();
builder.append("Match count: ").append(nbFound).append("\n");
for (int i = 0; i < nbFound; i++) {
builder.append("Match[").append(i+1).append("]=").append(matchStrings.get(i)).append("\n");
}
return builder.toString();
} catch (Exception e) {
return "Exception:"+ ExceptionUtils.getStackTrace(e);
}
}
private String getDocumentNamespaces(String textToParse) {
StringBuilder result = new StringBuilder();
try {
List namespaces = XPathUtil.getNamespaces(textToParse);
for (int i = 0;i