001 /*
002 * Cobertura - http://cobertura.sourceforge.net/
003 *
004 * Copyright (C) 2003 jcoverage ltd.
005 * Copyright (C) 2005 Mark Doliner <thekingant@users.sourceforge.net>
006 *
007 * Cobertura is free software; you can redistribute it and/or modify
008 * it under the terms of the GNU General Public License as published
009 * by the Free Software Foundation; either version 2 of the License,
010 * or (at your option) any later version.
011 *
012 * Cobertura is distributed in the hope that it will be useful, but
013 * WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015 * General Public License for more details.
016 *
017 * You should have received a copy of the GNU General Public License
018 * along with Cobertura; if not, write to the Free Software
019 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
020 * USA
021 */
022
023 package net.sourceforge.cobertura.reporting;
024
025 import gnu.getopt.Getopt;
026 import gnu.getopt.LongOpt;
027
028 import java.io.File;
029 import java.io.FileInputStream;
030 import java.io.InputStream;
031 import java.io.ObjectInputStream;
032 import java.util.Map;
033
034 import net.sourceforge.cobertura.reporting.html.HTMLReport;
035 import net.sourceforge.cobertura.reporting.xml.XMLReport;
036
037 import org.apache.log4j.Logger;
038
039 public class Main
040 {
041
042 private static final Logger logger = Logger.getLogger(Main.class);
043
044 // TODO: make these not static?
045 static String format;
046 static File serializationFile;
047 static File sourceDir;
048 static File outputDir;
049
050 public static void main(String[] args) throws Exception
051 {
052 long startTime = System.currentTimeMillis();
053
054 LongOpt[] longOpts = new LongOpt[4];
055 longOpts[0] = new LongOpt("format", LongOpt.REQUIRED_ARGUMENT, null,
056 'f');
057 longOpts[1] = new LongOpt("instrumentation",
058 LongOpt.REQUIRED_ARGUMENT, null, 'i');
059 longOpts[2] = new LongOpt("output", LongOpt.REQUIRED_ARGUMENT, null,
060 'o');
061 longOpts[3] = new LongOpt("source", LongOpt.REQUIRED_ARGUMENT, null,
062 's');
063
064 Getopt g = new Getopt(Main.class.getName(), args, ":f:i:o:s:",
065 longOpts);
066
067 int c;
068
069 while ((c = g.getopt()) != -1)
070 {
071 switch (c)
072 {
073 case 'f':
074 format = new String(g.getOptarg());
075 if (!format.equalsIgnoreCase("html")
076 && !format.equalsIgnoreCase("xml"))
077 {
078 throw new Exception("Error: format \"" + format
079 + "\" must be either html or xml");
080 }
081 break;
082
083 case 'i':
084 serializationFile = new File(g.getOptarg());
085 if (!serializationFile.exists())
086 {
087 throw new Exception("Error: serialization file "
088 + serializationFile + " does not exist");
089 }
090 if (serializationFile.isDirectory())
091 {
092 throw new Exception("Error: serialization file "
093 + serializationFile
094 + " cannot be a directory");
095 }
096 break;
097
098 case 'o':
099 outputDir = new File(g.getOptarg());
100 if (outputDir.exists() && outputDir.isFile())
101 {
102 throw new Exception("Error: destination directory "
103 + outputDir + " already exists and is a file");
104 }
105 outputDir.mkdirs();
106 break;
107
108 case 's':
109 sourceDir = new File(g.getOptarg());
110 if (!sourceDir.exists())
111 {
112 throw new Exception("Error: source directory "
113 + sourceDir + " does not exist");
114 }
115 if (sourceDir.isFile())
116 {
117 throw new Exception("Error: source directory "
118 + sourceDir
119 + " should be a directory, not a file");
120 }
121 break;
122 }
123 }
124
125 if (logger.isDebugEnabled())
126 {
127 logger.debug("format is " + format);
128 logger.debug("serializationFile is "
129 + serializationFile.getAbsolutePath());
130 logger.debug("outputDir is " + outputDir.getAbsolutePath());
131 logger.debug("sourceDir is " + sourceDir.getAbsolutePath());
132 }
133
134 InputStream is = null;
135 ObjectInputStream objects = null;
136 try
137 {
138 is = new FileInputStream(serializationFile);
139 objects = new ObjectInputStream(is);
140 Map coverageData = (Map)objects.readObject();
141 CoverageReport coverage = new CoverageReport(coverageData);
142
143 if (format.equalsIgnoreCase("xml"))
144 {
145 new XMLReport(coverage, outputDir, sourceDir);
146 }
147 else if (format.equalsIgnoreCase("html"))
148 {
149 new HTMLReport(coverage, outputDir, sourceDir);
150 }
151 }
152 finally
153 {
154 if (is != null)
155 is.close();
156 if (objects != null)
157 objects.close();
158 }
159
160 long stopTime = System.currentTimeMillis();
161 System.out
162 .println("Reporting time: " + (stopTime - startTime) + "ms");
163 }
164
165 }