blob: 0087f806603a6ab0e857a195ced96ecfe1a4a31d [file] [log] [blame]
/*
* 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.chemistry.opencmis.workbench.checks;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.Writer;
import java.util.List;
import java.util.Map;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.SwingConstants;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import org.apache.chemistry.opencmis.tck.CmisTest;
import org.apache.chemistry.opencmis.tck.CmisTestGroup;
import org.apache.chemistry.opencmis.tck.CmisTestReport;
import org.apache.chemistry.opencmis.tck.CmisTestResult;
import org.apache.chemistry.opencmis.tck.report.AbstractCmisTestReport;
import org.apache.chemistry.opencmis.tck.report.HtmlReport;
import org.apache.chemistry.opencmis.tck.report.TextReport;
import org.apache.chemistry.opencmis.tck.report.XmlReport;
import org.apache.chemistry.opencmis.workbench.ClientHelper;
/**
* Swing Report.
*/
public class SwingReport extends AbstractCmisTestReport {
private static final Icon GROUP_ICON = new ColorIcon(Color.GRAY);
private static final Icon TEST_ICON = new ColorIcon(Color.BLUE);
private static final Icon STATUS_OK_ICON = new ColorIcon(Color.GREEN);
private static final Icon STATUS_WARNING_ICON = new ColorIcon(Color.YELLOW);
private static final Icon STATUS_FAILURE_ICON = new ColorIcon(Color.RED);
private static final Icon OTHER_ICON = new ColorIcon(Color.LIGHT_GRAY);
private final Frame owner;
private final int width;
private final int height;
private Map<String, String> parameters;
private List<CmisTestGroup> groups;
public SwingReport(Frame owner, int width, int height) {
this.owner = owner;
this.width = width;
this.height = height;
}
@Override
public void createReport(Map<String, String> parameters, List<CmisTestGroup> groups, Writer writer) {
this.parameters = parameters;
this.groups = groups;
new SwingReportDialog();
}
/**
* Report dialog.
*/
private class SwingReportDialog extends JDialog {
private static final long serialVersionUID = 1L;
public SwingReportDialog() {
super(owner, "Test Report");
createGUI();
}
private void createGUI() {
setPreferredSize(new Dimension(width, height));
setMinimumSize(new Dimension(width, height));
setLayout(new BorderLayout());
DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Groups");
for (CmisTestGroup group : groups) {
if (!group.isEnabled()) {
continue;
}
DefaultMutableTreeNode groupNode = new DefaultMutableTreeNode(group);
rootNode.add(groupNode);
for (CmisTest test : group.getTests()) {
if (!test.isEnabled()) {
continue;
}
DefaultMutableTreeNode testNode = new DefaultMutableTreeNode(test);
groupNode.add(testNode);
populateResultBranch(testNode, test.getResults());
}
}
JTree groupTree = new JTree(rootNode);
groupTree.setRootVisible(false);
groupTree.setCellRenderer(new ReportTreeCellRenderer());
for (int i = 0; i < groupTree.getRowCount(); i++) {
groupTree.expandRow(i);
}
add(new JScrollPane(groupTree), BorderLayout.CENTER);
final JPanel reportPanel = new JPanel();
reportPanel.add(new JLabel("Open report as "));
final JComboBox reportType = new JComboBox(new Object[] { "HTML", "Text", "XML" });
reportPanel.add(reportType);
final JButton reportButton = new JButton("go");
reportPanel.add(reportButton);
reportButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
try {
// create report
File tempReportFile = null;
CmisTestReport report = null;
switch (reportType.getSelectedIndex()) {
case 1:
tempReportFile = File.createTempFile("cmistck", ".txt");
report = new TextReport();
break;
case 2:
tempReportFile = File.createTempFile("cmistck", ".xml");
report = new XmlReport();
break;
default:
tempReportFile = File.createTempFile("cmistck", ".html");
report = new HtmlReport();
break;
}
tempReportFile.deleteOnExit();
report.createReport(parameters, groups, tempReportFile);
// show report
Desktop desktop = Desktop.getDesktop();
if (!desktop.isSupported(Desktop.Action.OPEN)) {
JOptionPane.showMessageDialog(owner, "Report: " + tempReportFile.getAbsolutePath(),
"Report", JOptionPane.INFORMATION_MESSAGE);
} else {
desktop.open(tempReportFile);
}
} catch (Exception e) {
JOptionPane.showMessageDialog(owner, "Error: " + e.getMessage(), "Report Error",
JOptionPane.ERROR_MESSAGE);
}
}
});
add(reportPanel, BorderLayout.PAGE_END);
ClientHelper.installEscapeBinding(this, getRootPane(), true);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
private void populateResultBranch(DefaultMutableTreeNode parent, List<CmisTestResult> results) {
if (results == null) {
return;
}
for (CmisTestResult result : results) {
DefaultMutableTreeNode resultNode = new DefaultMutableTreeNode(result);
parent.add(resultNode);
populateResultBranch(resultNode, result.getChildren());
}
}
private class ReportTreeCellRenderer extends DefaultTreeCellRenderer {
private static final long serialVersionUID = 1L;
public ReportTreeCellRenderer() {
}
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
super.getTreeCellRendererComponent(tree, "", sel, expanded, leaf, row, hasFocus);
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
if (node.getUserObject() instanceof CmisTestGroup) {
setText(((CmisTestGroup) node.getUserObject()).getName());
setIcon(GROUP_ICON);
} else if (node.getUserObject() instanceof CmisTest) {
setText(((CmisTest) node.getUserObject()).getName());
setIcon(TEST_ICON);
} else if (node.getUserObject() instanceof CmisTestResult) {
CmisTestResult result = (CmisTestResult) node.getUserObject();
String text = "<html><b>" + result.getStatus() + ": " + result.getMessage() + "</b>";
if ((result.getStackTrace() != null) && (result.getStackTrace().length > 0)) {
text += " (" + result.getStackTrace()[0].getFileName() + ":"
+ result.getStackTrace()[0].getLineNumber() + ")";
}
setText(text);
switch (result.getStatus()) {
case OK:
setIcon(STATUS_OK_ICON);
break;
case WARNING:
setIcon(STATUS_WARNING_ICON);
break;
case FAILURE:
case UNEXPECTED_EXCEPTION:
setIcon(STATUS_FAILURE_ICON);
break;
default:
setIcon(OTHER_ICON);
}
} else {
setText(value.toString());
setIcon(OTHER_ICON);
}
setVerticalTextPosition(SwingConstants.TOP);
return this;
}
}
}
private static class ColorIcon implements Icon {
private final Color color;
public ColorIcon(Color color) {
this.color = color;
}
public void paintIcon(Component c, Graphics g, int x, int y) {
g.setColor(color);
g.fillRect(0, 0, getIconWidth(), getIconHeight());
}
public int getIconWidth() {
return 8;
}
public int getIconHeight() {
return 18;
}
}
}