/* * Copyright [1999-2015] Wellcome Trust Sanger Institute and the EMBL-European Bioinformatics Institute * Copyright [2016-2017] EMBL-European Bioinformatics Institute * * Licensed 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.ensembl.healthcheck.eg_gui; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.FileOutputStream; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.ToolTipManager; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import org.ensembl.healthcheck.ReportLine; import org.ensembl.healthcheck.ReportManager; import org.ensembl.healthcheck.eg_gui.GuiTestResultWindowTab; import org.ensembl.healthcheck.eg_gui.JLabelTreeCellRenderer; import org.ensembl.healthcheck.eg_gui.ResultNode; import org.ensembl.healthcheck.eg_gui.ResultTreePanel; /** * <p> * This is mostly the same as org.ensembl.healthcheck.gui.GuiTestResultWindow * with some minor changes so it can appear in the eg_gui for people who want * to view the test results in the format to which they are used. * </p> * * Display the results of a test run. */ public class GuiTestResultWindowTab extends JPanel { private static final String OUTPUT_FILE = "GuiTestRunner.txt"; /** * Create a new GuiTestResultWindow. * @param outputLevelAsString * @param outputLevel */ public GuiTestResultWindowTab(String outputLevelAsString, int outputLevel) { //super("Healthcheck Results"); //Container contentPane = getContentPane(); this.setLayout(new BorderLayout()); JPanel topPanel = new JPanel(new BorderLayout()); topPanel.setBackground(Color.RED); ResultTreePanel resultTreePanel = new ResultTreePanel(outputLevelAsString, outputLevel); topPanel.add(resultTreePanel, BorderLayout.CENTER); JPanel bottomPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); bottomPanel.setBackground(Color.WHITE); //JButton saveButton = new JButton("Save", new ImageIcon(this.getClass().getResource("save.gif"))); JButton saveButton = new JButton("Save"); saveButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { PrintWriter pw = new PrintWriter(new FileOutputStream(OUTPUT_FILE)); pw.write("---- RESULTS BY TEST CASE ----\n"); Map map = ReportManager.getAllReportsByTestCase(); Set keys = map.keySet(); Iterator it = keys.iterator(); while (it.hasNext()) { String key = (String) it.next(); System.out.println("\n" + key); List lines = (List) map.get(key); Iterator it2 = lines.iterator(); while (it2.hasNext()) { ReportLine reportLine = (ReportLine) it2.next(); pw.write(" " + reportLine.getDatabaseName() + ": " + reportLine.getMessage() + "\n"); } // while it2 } // while it pw.close(); } catch (Exception ee) { System.err.println("Error writing to " + OUTPUT_FILE); ee.printStackTrace(); } JOptionPane.showMessageDialog((Component) e.getSource(), "Results saved to " + OUTPUT_FILE); } }); // JButton closeButton = new JButton("Close", new ImageIcon(this.getClass().getResource("close.gif"))); // closeButton.addActionListener(new ActionListener() { // // public void actionPerformed(ActionEvent e) { // // dispose(); // // } // }); bottomPanel.add(saveButton); // bottomPanel.add(closeButton); this.add(topPanel, BorderLayout.CENTER); this.add(bottomPanel, BorderLayout.SOUTH); //pack(); // Centre on screen Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); Rectangle frame = getBounds(); setLocation((screen.width - frame.width) / 2, (screen.height - frame.height) / 2); } // ------------------------------------------------------------------------- /** * Command-line entry point. * * @param args The command-line arguments. */ public static void main(String[] args) { GuiTestResultWindowTab gtrw = new GuiTestResultWindowTab("", 0); //gtrw.pack(); gtrw.setVisible(true); } // ------------------------------------------------------------------------- } // GuiTestResultWindow //------------------------------------------------------------------------- /** * A class that creates a panel (in a JScrollPane) containing tests, and provides methods for * accessing the selected ones. */ class ResultTreePanel extends JScrollPane { private JTree tree; //public ResultTreePanel(GuiTestRunnerFrame gtrf) { public ResultTreePanel(String outputLevelAsString, int outputLevel) { JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); panel.setBackground(Color.GREEN); String title = "Test Results - minimum output level: " + outputLevelAsString.toLowerCase(); DefaultMutableTreeNode top = new DefaultMutableTreeNode(new ResultNode(title, false, false, false, false)); Map reportsByTest = ReportManager.getAllReportsByTestCase(outputLevel); Set tests = reportsByTest.keySet(); Iterator it = tests.iterator(); while (it.hasNext()) { String test = (String) it.next(); ResultNode n1 = new ResultNode(test, true, false, false, ReportManager.allDatabasesPassed(test)); DefaultMutableTreeNode testNode = new DefaultMutableTreeNode(n1); List reports = (ArrayList) reportsByTest.get(test); Iterator it2 = reports.iterator(); String lastDB = ""; while (it2.hasNext()) { ReportLine line = (ReportLine) it2.next(); String database = line.getDatabaseName(); if (!database.equals(lastDB)) { ResultNode n2 = new ResultNode(database, false, true, false, ReportManager.databasePassed(test, database)); DefaultMutableTreeNode dbNode = new DefaultMutableTreeNode(n2); testNode.add(dbNode); String detail = htmlize(ReportManager.getReports(test, database)); ResultNode n3 = new ResultNode(detail, false, false, true, false); DefaultMutableTreeNode detailNode = new DefaultMutableTreeNode(n3); dbNode.add(detailNode); } lastDB = database; } // while it2 top.add(testNode); } tree = new JTree(top); //tree.setRootVisible(false); ToolTipManager.sharedInstance().registerComponent(tree); tree.setCellRenderer(new JLabelTreeCellRenderer()); tree.setRowHeight(0); panel.add(tree); setViewportView(panel); // make window as wide as it needs to be plus a bit of padding, fixed height setPreferredSize(new Dimension(getPreferredSize().width + 150, 500)); } // ------------------------------------------------------------------------- private String htmlize(List reports) { StringBuffer buf = new StringBuffer(); buf.append("<html>"); Iterator it = reports.iterator(); while (it.hasNext()) { ReportLine line = (ReportLine) it.next(); buf.append(getFontForReport(line)); buf.append(line.getMessage()); buf.append("</font>"); buf.append("<br>"); } buf.append("</html>"); return buf.toString(); } //--------------------------------------------------------------------- private String getFontForReport(ReportLine line) { String s1 = ""; switch (line.getLevel()) { case (ReportLine.PROBLEM): s1 = "<font color='red'>"; break; case (ReportLine.WARNING): s1 = "<font color='black'>"; break; case (ReportLine.INFO): s1 = "<font color='grey'>"; break; case (ReportLine.CORRECT): s1 = "<font color='green'>"; break; default: s1 = "<font color='black'>"; } return s1; } // ------------------------------------------------------------------------- } // ResultTreePanel // ------------------------------------------------------------------------- /** * Custom cell renderer for a tree of JLabels. */ class JLabelTreeCellRenderer extends DefaultTreeCellRenderer { // private ImageIcon smallCross = new ImageIcon(this.getClass().getResource("small_cross.gif")); // // private ImageIcon smallTick = new ImageIcon(this.getClass().getResource("small_tick.gif")); // // private ImageIcon listPass = new ImageIcon(this.getClass().getResource("list_pass.gif")); // // private ImageIcon listFail = new ImageIcon(this.getClass().getResource("list_fail.gif")); private Color green = new Color(0, 192, 0); private Color red = new Color(192, 0, 0); public JLabelTreeCellRenderer() { } public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); DefaultMutableTreeNode dmtNode = (DefaultMutableTreeNode) value; ResultNode node = (ResultNode) (dmtNode.getUserObject()); String defaultFontName = getFont().getName(); int defaultFontSize = getFont().getSize(); // defaults setText(node.getText()); setIcon(null); setForeground(Color.BLACK); setBackground(Color.WHITE); setFont(new Font(defaultFontName, Font.PLAIN, defaultFontSize)); setToolTipText(null); // node is rendered differently depending on how its flags are set if (node.isTestName()) { setFont(new Font(defaultFontName, Font.BOLD, defaultFontSize)); if (node.passed()) { setForeground(green); //setIcon(listPass); } else { setForeground(red); //setIcon(listFail); } int[] passesFails = ReportManager.countPassesAndFailsTest(node.getText()); setToolTipText(passesFails[0] + " databases passed, " + passesFails[1] + " databases failed"); } else if (node.isDatabaseName()) { if (node.passed()) { setForeground(green); //setIcon(smallTick); } else { setForeground(red); //setIcon(smallCross); } int[] passesFails = ReportManager.countPassesAndFailsDatabase(node.getText()); setToolTipText(node.getText() + " passed a total of " + passesFails[0] + " tests and failed a total of " + passesFails[1] + " tests"); } else { // other nodes - e.g. root setFont(new Font(defaultFontName, Font.BOLD, defaultFontSize)); int[] passesFails = ReportManager.countPassesAndFailsAll(); setToolTipText("A total of " + passesFails[0] + " individual tests passed and " + passesFails[1] + " failed"); } return this; } } // ------------------------------------------------------------------------- /** * Class to store information about a node of the result tree; a node may represent a test, a * database name, a database label, or nothing in particular. */ class ResultNode { private String text; private boolean isDatabaseName; private boolean isTestName; private boolean isDatabaseLabel; private boolean passed; public ResultNode(String text, boolean isTestName, boolean isDatabaseName, boolean isDatabaseLabel, boolean passed) { this.text = text; this.isTestName = isTestName; this.isDatabaseName = isDatabaseName; this.isDatabaseLabel = isDatabaseLabel; this.passed = passed; } public boolean passed() { return passed; } /** * @return Returns the isDatabaseLabel. */ public boolean isDatabaseLabel() { return isDatabaseLabel; } /** * @return Returns the isDatabaseName. */ public boolean isDatabaseName() { return isDatabaseName; } /** * @return Returns the isTestName. */ public boolean isTestName() { return isTestName; } /** * @return Returns the text. */ public String getText() { return text; } public String toString() { return text; } } // -------------------------------------------------------------------------