⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 viewresultsfullvisualizer.java

📁 测试工具
💻 JAVA
📖 第 1 页 / 共 3 页
字号:

		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 = "&lt;"; // $NON-NLS-1$
					break;
				case '>': // $NON-NLS-1$
					toReturn = "&gt;"; // $NON-NLS-1$
					break;
				case '\'': // $NON-NLS-1$
					toReturn = "&apos;"; // $NON-NLS-1$
					break;
				case '\"': // $NON-NLS-1$
					toReturn = "&quot;"; // $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 + -