001    /******************************************************************************
002     * Copyright (C) MActor Developers. All rights reserved.                        *
003     * ---------------------------------------------------------------------------*
004     * This file is part of MActor.                                               *
005     *                                                                            *
006     * MActor is free software; you can redistribute it and/or modify             *
007     * it under the terms of the GNU General Public License as published by       *
008     * the Free Software Foundation; either version 2 of the License, or          *
009     * (at your option) any later version.                                        *
010     *                                                                            *
011     * MActor is distributed in the hope that it will be useful,                  *
012     * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
013     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *
014     * GNU General Public License for more details.                               *
015     *                                                                            *
016     * You should have received a copy of the GNU General Public License          *
017     * along with MActor; if not, write to the Free Software                      *
018     * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA *
019     ******************************************************************************/
020    package org.mactor.ui;
021    
022    import java.io.File;
023    import java.io.FileOutputStream;
024    import java.io.IOException;
025    import java.text.SimpleDateFormat;
026    import java.util.Calendar;
027    import java.util.List;
028    import java.util.Map.Entry;
029    
030    import org.dom4j.Document;
031    import org.dom4j.DocumentFactory;
032    import org.dom4j.Element;
033    import org.dom4j.io.OutputFormat;
034    import org.dom4j.io.XMLWriter;
035    import org.mactor.framework.MactorException;
036    import org.mactor.framework.TestSuiteSummary_old;
037    import org.mactor.framework.TestSummary_old;
038    import org.mactor.framework.TestSummary_old.MessageInfo;
039    
040    public class ReportUtil {
041            private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
042            public static void writeReportToFile(File file, TestSuiteSummary_old summary, List<TestSummary_old> result) throws MactorException {
043                    Document doc = buildReport(summary, result);
044                    write(file, doc);
045            }
046            private static void write(File file, Document doc) throws MactorException {
047                    try {
048                            OutputFormat format = OutputFormat.createPrettyPrint();
049                            FileOutputStream fos = new FileOutputStream(file);
050                            XMLWriter writer = new XMLWriter(fos, format);
051                            writer.write(doc);
052                            writer.flush();
053                            fos.close();
054                    } catch (IOException ioe) {
055                            throw new MactorException("Failed to write the  file '" + file.getAbsolutePath() + "'. Error:" + ioe.getMessage(), ioe);
056                    }
057            }
058            private static Document buildReport(TestSuiteSummary_old summary, List<TestSummary_old> result) {
059                    Document doc = DocumentFactory.getInstance().createDocument();
060                    Element rootEl = doc.addElement("report");
061                    Element summaryEl = rootEl.addElement("summary");
062                    addEl(summaryEl, "start_time", summary.getTestStart());
063                    addEl(summaryEl, "complete_time", summary.getTestStart());
064                    addEl(summaryEl, "success_count", summary.getSuccessCount());
065                    addEl(summaryEl, "failed_count", summary.getFailedCount());
066                    addEl(summaryEl, "avg_success_time_ms", summary.getAverageSuccessCompleteTimeMs());
067                    addEl(summaryEl, "avg_failed_time_ms", summary.getAverageFailedCompleteTimeMs());
068                    addEl(summaryEl, "message_sent_count", summary.getMessageSentCount());
069                    addEl(summaryEl, "message_received_count", summary.getMessageReceivedCount());
070                    Element testsEl = rootEl.addElement("tests");
071                    for (TestSummary_old test : result) {
072                            Element tEl = testsEl.addElement("test");
073                            addEl(tEl, "start_time", test.getTestStartTime());
074                            addEl(tEl, "complete_time", test.getTestCompleteTime());
075                            addEl(tEl, "succesful", test.isSuccess());
076                            if (!test.isSuccess())
077                                    addEl(tEl, "failure_message", test.getFailedMessage());
078                            Element valsEl = tEl.addElement("context_values");
079                            for (Entry<String, String> val : test.getContextValues().entrySet()) {
080                                    Element vEl = valsEl.addElement("context_value");
081                                    vEl.addAttribute("name", val.getKey());
082                                    vEl.setText(val.getValue());
083                            }
084                            Element messagesEl = tEl.addElement("messages");
085                            for (MessageInfo mi : test.getMessageHistory()) {
086                                    Element mEl = messagesEl.addElement("message");
087                                    addEl(mEl, "time", mi.getCreatedTime());
088                                    addEl(mEl, "incoming", mi.isIncoming() + "");
089                                    addEl(mEl, "response", mi.isResponse() + "");
090                                    addEl(mEl, "archive_path", mi.getArchivePath());
091                                    if (mi.getChannel() != null)
092                                            addEl(mEl, "channel", mi.getChannel());
093                            }
094                    }
095                    return doc;
096            }
097            private static void addEl(Element el, String name, Object value) {
098                    String formatted = null;
099                    if (value == null)
100                            formatted = "";
101                    else if (value instanceof Calendar)
102                            formatted = sdf.format(((Calendar) value).getTime());
103                    else
104                            formatted = value.toString();
105                    Element newEl = el.addElement(name);
106                    newEl.setText(formatted);
107            }
108    }