This project has retired. For details please refer to its Attic page.
SwingReport xref
View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   * http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.chemistry.opencmis.workbench.checks;
20  
21  import java.awt.BorderLayout;
22  import java.awt.Color;
23  import java.awt.Component;
24  import java.awt.Desktop;
25  import java.awt.Dimension;
26  import java.awt.Frame;
27  import java.awt.Graphics;
28  import java.awt.event.ActionEvent;
29  import java.awt.event.ActionListener;
30  import java.io.File;
31  import java.io.Writer;
32  import java.util.List;
33  import java.util.Map;
34  
35  import javax.swing.Icon;
36  import javax.swing.JButton;
37  import javax.swing.JComboBox;
38  import javax.swing.JDialog;
39  import javax.swing.JFrame;
40  import javax.swing.JLabel;
41  import javax.swing.JOptionPane;
42  import javax.swing.JPanel;
43  import javax.swing.JScrollPane;
44  import javax.swing.JTree;
45  import javax.swing.SwingConstants;
46  import javax.swing.tree.DefaultMutableTreeNode;
47  import javax.swing.tree.DefaultTreeCellRenderer;
48  
49  import org.apache.chemistry.opencmis.tck.CmisTest;
50  import org.apache.chemistry.opencmis.tck.CmisTestGroup;
51  import org.apache.chemistry.opencmis.tck.CmisTestReport;
52  import org.apache.chemistry.opencmis.tck.CmisTestResult;
53  import org.apache.chemistry.opencmis.tck.report.AbstractCmisTestReport;
54  import org.apache.chemistry.opencmis.tck.report.HtmlReport;
55  import org.apache.chemistry.opencmis.tck.report.TextReport;
56  import org.apache.chemistry.opencmis.tck.report.XmlReport;
57  import org.apache.chemistry.opencmis.workbench.ClientHelper;
58  
59  /**
60   * Swing Report.
61   */
62  public class SwingReport extends AbstractCmisTestReport {
63  
64      private static final Icon GROUP_ICON = new ColorIcon(Color.GRAY);
65      private static final Icon TEST_ICON = new ColorIcon(Color.BLUE);
66      private static final Icon STATUS_OK_ICON = new ColorIcon(Color.GREEN);
67      private static final Icon STATUS_WARNING_ICON = new ColorIcon(Color.YELLOW);
68      private static final Icon STATUS_FAILURE_ICON = new ColorIcon(Color.RED);
69      private static final Icon OTHER_ICON = new ColorIcon(Color.LIGHT_GRAY);
70  
71      private final Frame owner;
72      private final int width;
73      private final int height;
74      private Map<String, String> parameters;
75      private List<CmisTestGroup> groups;
76  
77      public SwingReport(Frame owner, int width, int height) {
78          this.owner = owner;
79          this.width = width;
80          this.height = height;
81      }
82  
83      @Override
84      public void createReport(Map<String, String> parameters, List<CmisTestGroup> groups, Writer writer) {
85          this.parameters = parameters;
86          this.groups = groups;
87          new SwingReportDialog();
88      }
89  
90      /**
91       * Report dialog.
92       */
93      private class SwingReportDialog extends JDialog {
94  
95          private static final long serialVersionUID = 1L;
96  
97          public SwingReportDialog() {
98              super(owner, "Test Report");
99              createGUI();
100         }
101 
102         private void createGUI() {
103             setPreferredSize(new Dimension(width, height));
104             setMinimumSize(new Dimension(width, height));
105 
106             setLayout(new BorderLayout());
107 
108             DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Groups");
109 
110             for (CmisTestGroup group : groups) {
111                 if (!group.isEnabled()) {
112                     continue;
113                 }
114 
115                 DefaultMutableTreeNode groupNode = new DefaultMutableTreeNode(group);
116                 rootNode.add(groupNode);
117                 for (CmisTest test : group.getTests()) {
118                     if (!test.isEnabled()) {
119                         continue;
120                     }
121 
122                     DefaultMutableTreeNode testNode = new DefaultMutableTreeNode(test);
123                     groupNode.add(testNode);
124                     populateResultBranch(testNode, test.getResults());
125                 }
126             }
127 
128             JTree groupTree = new JTree(rootNode);
129             groupTree.setRootVisible(false);
130             groupTree.setCellRenderer(new ReportTreeCellRenderer());
131 
132             for (int i = 0; i < groupTree.getRowCount(); i++) {
133                 groupTree.expandRow(i);
134             }
135 
136             add(new JScrollPane(groupTree), BorderLayout.CENTER);
137 
138             final JPanel reportPanel = new JPanel();
139             reportPanel.add(new JLabel("Open report as "));
140             final JComboBox reportType = new JComboBox(new Object[] { "HTML", "Text", "XML" });
141             reportPanel.add(reportType);
142             final JButton reportButton = new JButton("go");
143             reportPanel.add(reportButton);
144 
145             reportButton.addActionListener(new ActionListener() {
146                 public void actionPerformed(ActionEvent event) {
147                     try {
148                         // create report
149                         File tempReportFile = null;
150                         CmisTestReport report = null;
151 
152                         switch (reportType.getSelectedIndex()) {
153                         case 1:
154                             tempReportFile = File.createTempFile("cmistck", ".txt");
155                             report = new TextReport();
156                             break;
157                         case 2:
158                             tempReportFile = File.createTempFile("cmistck", ".xml");
159                             report = new XmlReport();
160                             break;
161                         default:
162                             tempReportFile = File.createTempFile("cmistck", ".html");
163                             report = new HtmlReport();
164                             break;
165                         }
166 
167                         tempReportFile.deleteOnExit();
168                         report.createReport(parameters, groups, tempReportFile);
169 
170                         // show report
171                         Desktop desktop = Desktop.getDesktop();
172                         if (!desktop.isSupported(Desktop.Action.OPEN)) {
173                             JOptionPane.showMessageDialog(owner, "Report: " + tempReportFile.getAbsolutePath(),
174                                     "Report", JOptionPane.INFORMATION_MESSAGE);
175                         } else {
176                             desktop.open(tempReportFile);
177                         }
178                     } catch (Exception e) {
179                         JOptionPane.showMessageDialog(owner, "Error: " + e.getMessage(), "Report Error",
180                                 JOptionPane.ERROR_MESSAGE);
181                     }
182                 }
183             });
184 
185             add(reportPanel, BorderLayout.PAGE_END);
186 
187             ClientHelper.installEscapeBinding(this, getRootPane(), true);
188 
189             setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
190             pack();
191             setLocationRelativeTo(null);
192             setVisible(true);
193         }
194 
195         private void populateResultBranch(DefaultMutableTreeNode parent, List<CmisTestResult> results) {
196             if (results == null) {
197                 return;
198             }
199 
200             for (CmisTestResult result : results) {
201                 DefaultMutableTreeNode resultNode = new DefaultMutableTreeNode(result);
202                 parent.add(resultNode);
203                 populateResultBranch(resultNode, result.getChildren());
204             }
205         }
206 
207         private class ReportTreeCellRenderer extends DefaultTreeCellRenderer {
208 
209             private static final long serialVersionUID = 1L;
210 
211             public ReportTreeCellRenderer() {
212             }
213 
214             public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded,
215                     boolean leaf, int row, boolean hasFocus) {
216                 super.getTreeCellRendererComponent(tree, "", sel, expanded, leaf, row, hasFocus);
217 
218                 DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
219 
220                 if (node.getUserObject() instanceof CmisTestGroup) {
221                     setText(((CmisTestGroup) node.getUserObject()).getName());
222                     setIcon(GROUP_ICON);
223                 } else if (node.getUserObject() instanceof CmisTest) {
224                     setText(((CmisTest) node.getUserObject()).getName());
225                     setIcon(TEST_ICON);
226                 } else if (node.getUserObject() instanceof CmisTestResult) {
227                     CmisTestResult result = (CmisTestResult) node.getUserObject();
228 
229                     String text = "<html><b>" + result.getStatus() + ": " + result.getMessage() + "</b>";
230                     if ((result.getStackTrace() != null) && (result.getStackTrace().length > 0)) {
231                         text += " (" + result.getStackTrace()[0].getFileName() + ":"
232                                 + result.getStackTrace()[0].getLineNumber() + ")";
233                     }
234                     setText(text);
235 
236                     switch (result.getStatus()) {
237                     case OK:
238                         setIcon(STATUS_OK_ICON);
239                         break;
240                     case WARNING:
241                         setIcon(STATUS_WARNING_ICON);
242                         break;
243                     case FAILURE:
244                     case UNEXPECTED_EXCEPTION:
245                         setIcon(STATUS_FAILURE_ICON);
246                         break;
247                     default:
248                         setIcon(OTHER_ICON);
249                     }
250                 } else {
251                     setText(value.toString());
252                     setIcon(OTHER_ICON);
253                 }
254 
255                 setVerticalTextPosition(SwingConstants.TOP);
256 
257                 return this;
258             }
259         }
260     }
261 
262     private static class ColorIcon implements Icon {
263 
264         private final Color color;
265 
266         public ColorIcon(Color color) {
267             this.color = color;
268         }
269 
270         public void paintIcon(Component c, Graphics g, int x, int y) {
271             g.setColor(color);
272             g.fillRect(0, 0, getIconWidth(), getIconHeight());
273         }
274 
275         public int getIconWidth() {
276             return 8;
277         }
278 
279         public int getIconHeight() {
280             return 18;
281         }
282     }
283 }