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

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              throws Exception {
86          this.parameters = parameters;
87          this.groups = groups;
88          new SwingReportDialog();
89      }
90  
91      /**
92       * Report dialog.
93       */
94      private class SwingReportDialog extends JDialog {
95  
96          private static final long serialVersionUID = 1L;
97  
98          public SwingReportDialog() {
99              super(owner, "Test Report");
100             createGUI();
101         }
102 
103         private void createGUI() {
104             setPreferredSize(new Dimension(width, height));
105             setMinimumSize(new Dimension(width, height));
106 
107             setLayout(new BorderLayout());
108 
109             DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Groups");
110 
111             for (CmisTestGroup group : groups) {
112                 if (!group.isEnabled()) {
113                     continue;
114                 }
115 
116                 DefaultMutableTreeNode groupNode = new DefaultMutableTreeNode(group);
117                 rootNode.add(groupNode);
118                 for (CmisTest test : group.getTests()) {
119                     if (!test.isEnabled()) {
120                         continue;
121                     }
122 
123                     DefaultMutableTreeNode testNode = new DefaultMutableTreeNode(test);
124                     groupNode.add(testNode);
125                     populateResultBranch(testNode, test.getResults());
126                 }
127             }
128 
129             JTree groupTree = new JTree(rootNode);
130             groupTree.setRootVisible(false);
131             groupTree.setCellRenderer(new ReportTreeCellRenderer());
132 
133             for (int i = 0; i < groupTree.getRowCount(); i++) {
134                 groupTree.expandRow(i);
135             }
136 
137             add(new JScrollPane(groupTree), BorderLayout.CENTER);
138 
139             final JPanel reportPanel = new JPanel();
140             reportPanel.add(new JLabel("Open report as "));
141             final JComboBox reportType = new JComboBox(new Object[] { "HTML", "Text", "XML" });
142             reportPanel.add(reportType);
143             final JButton reportButton = new JButton("go");
144             reportPanel.add(reportButton);
145 
146             reportButton.addActionListener(new ActionListener() {
147                 public void actionPerformed(ActionEvent event) {
148                     try {
149                         // create report
150                         File tempReportFile = null;
151                         CmisTestReport report = null;
152 
153                         switch (reportType.getSelectedIndex()) {
154                         case 0:
155                             tempReportFile = File.createTempFile("cmistck", ".html");
156                             report = new HtmlReport();
157                             break;
158                         case 1:
159                             tempReportFile = File.createTempFile("cmistck", ".txt");
160                             report = new TextReport();
161                             break;
162                         case 2:
163                             tempReportFile = File.createTempFile("cmistck", ".xml");
164                             report = new XmlReport();
165                             break;
166                         }
167 
168                         tempReportFile.deleteOnExit();
169                         report.createReport(parameters, groups, tempReportFile);
170 
171                         // show report
172                         Desktop desktop = Desktop.getDesktop();
173                         if (!desktop.isSupported(Desktop.Action.OPEN)) {
174                             JOptionPane.showMessageDialog(owner, "Report: " + tempReportFile.getAbsolutePath(),
175                                     "Report", JOptionPane.INFORMATION_MESSAGE);
176                         } else {
177                             desktop.open(tempReportFile);
178                         }
179                     } catch (Exception e) {
180                         JOptionPane.showMessageDialog(owner, "Error: " + e.getMessage(), "Report Error",
181                                 JOptionPane.ERROR_MESSAGE);
182                     }
183                 }
184             });
185 
186             add(reportPanel, BorderLayout.PAGE_END);
187 
188             ClientHelper.installEscapeBinding(this, getRootPane(), true);
189 
190             setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
191             pack();
192             setLocationRelativeTo(null);
193             setVisible(true);
194         }
195 
196         private void populateResultBranch(DefaultMutableTreeNode parent, List<CmisTestResult> results) {
197             if (results == null) {
198                 return;
199             }
200 
201             for (CmisTestResult result : results) {
202                 DefaultMutableTreeNode resultNode = new DefaultMutableTreeNode(result);
203                 parent.add(resultNode);
204                 populateResultBranch(resultNode, result.getChildren());
205             }
206         }
207 
208         private class ReportTreeCellRenderer extends DefaultTreeCellRenderer {
209 
210             private static final long serialVersionUID = 1L;
211 
212             public ReportTreeCellRenderer() {
213             }
214 
215             public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded,
216                     boolean leaf, int row, boolean hasFocus) {
217                 super.getTreeCellRendererComponent(tree, "", sel, expanded, leaf, row, hasFocus);
218 
219                 DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
220 
221                 if (node.getUserObject() instanceof CmisTestGroup) {
222                     setText(((CmisTestGroup) node.getUserObject()).getName());
223                     setIcon(GROUP_ICON);
224                 } else if (node.getUserObject() instanceof CmisTest) {
225                     setText(((CmisTest) node.getUserObject()).getName());
226                     setIcon(TEST_ICON);
227                 } else if (node.getUserObject() instanceof CmisTestResult) {
228                     CmisTestResult result = (CmisTestResult) node.getUserObject();
229 
230                     String text = "<html><b>" + result.getStatus() + ": " + result.getMessage() + "</b>";
231                     if ((result.getStackTrace() != null) && (result.getStackTrace().length > 0)) {
232                         text += " (" + result.getStackTrace()[0].getFileName() + ":"
233                                 + result.getStackTrace()[0].getLineNumber() + ")";
234                     }
235                     setText(text);
236 
237                     switch (result.getStatus()) {
238                     case OK:
239                         setIcon(STATUS_OK_ICON);
240                         break;
241                     case WARNING:
242                         setIcon(STATUS_WARNING_ICON);
243                         break;
244                     case FAILURE:
245                     case UNEXPECTED_EXCEPTION:
246                         setIcon(STATUS_FAILURE_ICON);
247                         break;
248                     default:
249                         setIcon(OTHER_ICON);
250                     }
251                 } else {
252                     setText(value.toString());
253                     setIcon(OTHER_ICON);
254                 }
255 
256                 setVerticalTextPosition(SwingConstants.TOP);
257 
258                 return this;
259             }
260         }
261     }
262 
263     private static class ColorIcon implements Icon {
264 
265         private final Color color;
266 
267         public ColorIcon(Color color) {
268             this.color = color;
269         }
270 
271         public void paintIcon(Component c, Graphics g, int x, int y) {
272             g.setColor(color);
273             g.fillRect(0, 0, getIconWidth(), getIconHeight());
274         }
275 
276         public int getIconWidth() {
277             return 8;
278         }
279 
280         public int getIconHeight() {
281             return 18;
282         }
283     }
284 }