001/*
002 * Cobertura - http://cobertura.sourceforge.net/
003 *
004 * Copyright (C) 2008 Julian Gamble 
005 *
006 * Cobertura is free software; you can redistribute it and/or modify
007 * it under the terms of the GNU General Public License as published
008 * by the Free Software Foundation; either version 2 of the License,
009 * or (at your option) any later version.
010 *
011 * Cobertura is distributed in the hope that it will be useful, but
012 * WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 * General Public License for more details.
015 *
016 * You should have received a copy of the GNU General Public License
017 * along with Cobertura; if not, write to the Free Software
018 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
019 * USA
020 */
021
022package net.sourceforge.cobertura.reporting.xml;
023
024import java.io.File;
025import java.io.IOException;
026import java.io.PrintWriter;
027import java.util.Date;
028
029import net.sourceforge.cobertura.coveragedata.ProjectData;
030import net.sourceforge.cobertura.reporting.ComplexityCalculator;
031import net.sourceforge.cobertura.util.FileFinder;
032import net.sourceforge.cobertura.util.Header;
033import net.sourceforge.cobertura.util.IOUtil;
034
035public class SummaryXMLReport
036{
037        
038
039        private final PrintWriter pw;
040        private int indent = 0;
041
042        
043        public SummaryXMLReport(ProjectData projectData, File destinationDir,
044                        FileFinder finder, ComplexityCalculator complexity) throws IOException
045        {
046                File file = new File(destinationDir, "coverage-summary.xml");
047                pw = IOUtil.getPrintWriter(file);
048
049                try
050                {
051                        println("<?xml version=\"1.0\"?>");
052                        println("<!DOCTYPE coverage SYSTEM \"http://cobertura.sourceforge.net/xml/"
053                                        + XMLReport.coverageDTD + "\">");
054                        println("");
055
056                        double ccn = complexity.getCCNForProject(projectData);
057                        int numLinesCovered = projectData.getNumberOfCoveredLines();
058                        int numLinesValid = projectData.getNumberOfValidLines();
059                        int numBranchesCovered = projectData.getNumberOfCoveredBranches();
060                        int numBranchesValid = projectData.getNumberOfValidBranches();
061
062                        
063                        // TODO: Set a schema?
064                        //println("<coverage " + sourceDirectories.toString() + " xmlns=\"http://cobertura.sourceforge.net\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://cobertura.sourceforge.net/xml/coverage.xsd\">");
065                        println(
066                                        "<coverage line-rate=\"" + projectData.getLineCoverageRate()
067                                        + "\" branch-rate=\"" + projectData.getBranchCoverageRate()
068                                        + "\" lines-covered=\"" + numLinesCovered
069                                        + "\" lines-valid=\"" + numLinesValid
070                                        + "\" branches-covered=\"" + numBranchesCovered
071                                        + "\" branches-valid=\"" + numBranchesValid
072
073                                        + "\" complexity=\"" + ccn
074
075                                        + "\" version=\"" + Header.version()
076                                        + "\" timestamp=\"" + new Date().getTime()
077                                        + "\">");
078
079                        //the DTD requires a "packages" element
080                        increaseIndentation();
081                        println("<packages />");
082                        decreaseIndentation();
083                        
084                        println("</coverage>");
085                }
086                finally
087                {
088                        pw.close();
089                }
090
091        }
092        
093        void increaseIndentation()
094        {
095                indent++;
096        }
097
098        void decreaseIndentation()
099        {
100                if (indent > 0)
101                        indent--;
102        }
103
104        private void println(String ln)
105        {
106                indent();
107                pw.println(ln);
108        }
109
110        private void indent()
111        {
112                for (int i = 0; i < indent; i++)
113                {
114                        pw.print("\t");
115                }
116        }
117}