📄 viewresultsfullvisualizer.java
字号:
JPanel pane = new JPanel();
pane.add(textButton);
pane.add(htmlButton);
pane.add(xmlButton);
pane.add(jsonButton);
pane.add(downloadAll);
return pane;
}
/**
* Initialize this visualizer
*/
private void init() {
setLayout(new BorderLayout(0, 5));
setBorder(makeBorder());
add(makeTitlePanel(), BorderLayout.NORTH);
Component leftSide = createLeftPanel();
rightSide = new JTabbedPane();
// Add the common tab
rightSide.addTab(JMeterUtils.getResString("view_results_tab_sampler"), createResponseMetadataPanel()); // $NON-NLS-1$
// Create the panels for the other tabs
requestPane = createRequestPanel();
resultsPane = createResponseDataPanel();
JSplitPane mainSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftSide, rightSide);
add(mainSplit, BorderLayout.CENTER);
}
private void setupTabPaneForSampleResult() {
// Set the title for the first tab
rightSide.setTitleAt(0, JMeterUtils.getResString("view_results_tab_sampler")); //$NON-NLS-1$
// Add the other tabs if not present
if(rightSide.indexOfTab(JMeterUtils.getResString("view_results_tab_request")) < 0) { // $NON-NLS-1$
rightSide.addTab(JMeterUtils.getResString("view_results_tab_request"), requestPane); // $NON-NLS-1$
}
if(rightSide.indexOfTab(JMeterUtils.getResString("view_results_tab_response")) < 0) { // $NON-NLS-1$
rightSide.addTab(JMeterUtils.getResString("view_results_tab_response"), resultsPane); // $NON-NLS-1$
}
}
private void setupTabPaneForAssertionResult() {
// Set the title for the first tab
rightSide.setTitleAt(0, JMeterUtils.getResString("view_results_tab_assertion")); //$NON-NLS-1$
// Remove the other tabs if present
int requestTabIndex = rightSide.indexOfTab(JMeterUtils.getResString("view_results_tab_request")); // $NON-NLS-1$
if(requestTabIndex >= 0) {
rightSide.removeTabAt(requestTabIndex);
}
int responseTabIndex = rightSide.indexOfTab(JMeterUtils.getResString("view_results_tab_response")); // $NON-NLS-1$
if(responseTabIndex >= 0) {
rightSide.removeTabAt(responseTabIndex);
}
}
private Component createLeftPanel() {
SampleResult rootSampleResult = new SampleResult();
rootSampleResult.setSampleLabel("Root");
rootSampleResult.setSuccessful(true);
root = new DefaultMutableTreeNode(rootSampleResult);
treeModel = new DefaultTreeModel(root);
jTree = new JTree(treeModel);
jTree.setCellRenderer(new ResultsNodeRenderer());
jTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
jTree.addTreeSelectionListener(this);
jTree.setRootVisible(false);
jTree.setShowsRootHandles(true);
JScrollPane treePane = new JScrollPane(jTree);
treePane.setPreferredSize(new Dimension(200, 300));
return treePane;
}
private Component createResponseMetadataPanel() {
stats = new JTextPane();
stats.setEditable(false);
stats.setBackground(getBackground());
// Add styles to use for different types of status messages
StyledDocument doc = (StyledDocument) stats.getDocument();
Style style = doc.addStyle(STYLE_REDIRECT, null);
StyleConstants.setForeground(style, REDIRECT_COLOR);
style = doc.addStyle(STYLE_CLIENT_ERROR, null);
StyleConstants.setForeground(style, CLIENT_ERROR_COLOR);
style = doc.addStyle(STYLE_SERVER_ERROR, null);
StyleConstants.setForeground(style, SERVER_ERROR_COLOR);
JScrollPane pane = makeScrollPane(stats);
pane.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
return pane;
}
private JPanel createRequestPanel() {
sampleDataField = new JTextArea();
sampleDataField.setEditable(false);
sampleDataField.setLineWrap(true);
sampleDataField.setWrapStyleWord(true);
JPanel pane = new JPanel(new BorderLayout(0, 5));
pane.add(makeScrollPane(sampleDataField));
return pane;
}
private JPanel createResponseDataPanel() {
results = new JEditorPane();
results.setEditable(false);
resultsScrollPane = makeScrollPane(results);
imageLabel = new JLabel();
JPanel panel = new JPanel(new BorderLayout());
panel.add(resultsScrollPane, BorderLayout.CENTER);
panel.add(createHtmlOrTextPane(), BorderLayout.SOUTH);
return panel;
}
private static class ResultsNodeRenderer extends DefaultTreeCellRenderer {
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded,
boolean leaf, int row, boolean focus) {
super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, focus);
boolean failure = true;
Object userObject = ((DefaultMutableTreeNode) value).getUserObject();
if(userObject instanceof SampleResult) {
failure = !(((SampleResult) userObject).isSuccessful());
}
else if(userObject instanceof AssertionResult) {
AssertionResult assertion = (AssertionResult) userObject;
failure = assertion.isError() || assertion.isFailure();
}
// Set the status for the node
if (failure) {
this.setForeground(Color.red);
this.setIcon(imageFailure);
} else {
this.setIcon(imageSuccess);
}
return this;
}
}
private static class LocalHTMLEditorKit extends HTMLEditorKit {
private static final ViewFactory defaultFactory = new LocalHTMLFactory();
public ViewFactory getViewFactory() {
return defaultFactory;
}
private static class LocalHTMLFactory extends javax.swing.text.html.HTMLEditorKit.HTMLFactory {
/*
* Provide dummy implementations to suppress download and display of
* related resources: - FRAMEs - IMAGEs TODO create better dummy
* displays TODO suppress LINK somehow
*/
public View create(Element elem) {
Object o = elem.getAttributes().getAttribute(StyleConstants.NameAttribute);
if (o instanceof HTML.Tag) {
HTML.Tag kind = (HTML.Tag) o;
if (kind == HTML.Tag.FRAME) {
return new ComponentView(elem);
} else if (kind == HTML.Tag.IMG) {
return new ComponentView(elem);
}
}
return super.create(elem);
}
}
}
/**
*
* A Dom tree panel for to display response as tree view author <a
* href="mailto:d.maung@mdl.com">Dave Maung</a> TODO implement to find any
* nodes in the tree using TreePath.
*
*/
private static class DOMTreePanel extends JPanel {
private JTree domJTree;
public DOMTreePanel(org.w3c.dom.Document document) {
super(new GridLayout(1, 0));
try {
Node firstElement = getFirstElement(document);
DefaultMutableTreeNode top = new XMLDefaultMutableTreeNode(firstElement);
domJTree = new JTree(top);
domJTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
domJTree.setShowsRootHandles(true);
JScrollPane domJScrollPane = new JScrollPane(domJTree);
domJTree.setAutoscrolls(true);
this.add(domJScrollPane);
ToolTipManager.sharedInstance().registerComponent(domJTree);
domJTree.setCellRenderer(new DomTreeRenderer());
this.setPreferredSize(new Dimension(800, 600));
} catch (SAXException e) {
log.warn("", e);
}
}
/**
* Skip all DTD nodes, all prolog nodes. They dont support in tree view
* We let user to insert them however in DOMTreeView, we dont display it
*
* @param root
* @return
*/
private Node getFirstElement(Node parent) {
NodeList childNodes = parent.getChildNodes();
Node toReturn = null;
for (int i = 0; i < childNodes.getLength(); i++) {
Node childNode = childNodes.item(i);
toReturn = childNode;
if (childNode.getNodeType() == Node.ELEMENT_NODE)
break;
}
return toReturn;
}
/**
* This class is to view as tooltext. This is very useful, when the
* contents has long string and does not fit in the view. it will also
* automatically wrap line for each 100 characters since tool tip
* support html. author <a href="mailto:d.maung@mdl.com">Dave Maung</a>
*/
private static class DomTreeRenderer extends DefaultTreeCellRenderer {
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded,
boolean leaf, int row, boolean phasFocus) {
super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, phasFocus);
DefaultMutableTreeNode valueTreeNode = (DefaultMutableTreeNode) value;
setToolTipText(getHTML(valueTreeNode.toString(), "<br>", 100)); // $NON-NLS-1$
return this;
}
/**
* get the html
*
* @param str
* @param separator
* @param maxChar
* @return
*/
private String getHTML(String str, String separator, int maxChar) {
StringBuffer strBuf = new StringBuffer("<html><body bgcolor=\"yellow\"><b>"); // $NON-NLS-1$
char[] chars = str.toCharArray();
for (int i = 0; i < chars.length; i++) {
if (i % maxChar == 0 && i != 0)
strBuf.append(separator);
strBuf.append(encode(chars[i]));
}
strBuf.append("</b></body></html>"); // $NON-NLS-1$
return strBuf.toString();
}
private String encode(char c) {
String toReturn = String.valueOf(c);
switch (c) {
case '<': // $NON-NLS-1$
toReturn = "<"; // $NON-NLS-1$
break;
case '>': // $NON-NLS-1$
toReturn = ">"; // $NON-NLS-1$
break;
case '\'': // $NON-NLS-1$
toReturn = "'"; // $NON-NLS-1$
break;
case '\"': // $NON-NLS-1$
toReturn = """; // $NON-NLS-1$
break;
}
return toReturn;
}
}
}
private static void showErrorMessageDialog(String message, int messageType) {
JOptionPane.showMessageDialog(null, message, "Error", messageType);
}
// Helper method to construct SAX error details
private static String errorDetails(SAXParseException spe) {
StringBuffer str = new StringBuffer(80);
int i;
i = spe.getLineNumber();
if (i != -1) {
str.append("line=");
str.append(i);
str.append(" col=");
str.append(spe.getColumnNumber());
str.append(" ");
}
str.append(spe.getLocalizedMessage());
return str.toString();
}
private static class SAXErrorHandler implements ErrorHandler {
private String msg;
private int messageType;
public SAXErrorHandler() {
msg = ""; // $NON-NLS-1$
}
public void error(SAXParseException exception) throws SAXParseException {
msg = "error: " + errorDetails(exception);
log.debug(msg);
messageType = JOptionPane.ERROR_MESSAGE;
throw exception;
}
/*
* Can be caused by: - premature end of file - non-whitespace content
* after trailer
*/
public void fatalError(SAXParseException exception) throws SAXParseException {
msg = "fatal: " + errorDetails(exception);
messageType = JOptionPane.ERROR_MESSAGE;
log.debug(msg);
throw exception;
}
/*
* Not clear what can cause this ? conflicting versions perhaps
*/
public void warning(SAXParseException exception) throws SAXParseException {
msg = "warning: " + errorDetails(exception);
log.debug(msg);
messageType = JOptionPane.WARNING_MESSAGE;
}
/**
* get the JOptionPaneMessage Type
*
* @return the message type
*/
public int getMessageType() {
return messageType;
}
/**
* get error message
*
* @return the error message
*/
public String getErrorMessage() {
return msg;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -