001    /*
002     * Cobertura - http://cobertura.sourceforge.net/
003     *
004     * Copyright (C) 2003 jcoverage ltd.
005     * Copyright (C) 2005 Mark Doliner
006     * Copyright (C) 2005 Jeremy Thomerson
007     * Copyright (C) 2005 Grzegorz Lukasik
008     * Copyright (C) 2006 Dan Godfrey
009     *
010     * Cobertura is free software; you can redistribute it and/or modify
011     * it under the terms of the GNU General Public License as published
012     * by the Free Software Foundation; either version 2 of the License,
013     * or (at your option) any later version.
014     *
015     * Cobertura is distributed in the hope that it will be useful, but
016     * WITHOUT ANY WARRANTY; without even the implied warranty of
017     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
018     * General Public License for more details.
019     *
020     * You should have received a copy of the GNU General Public License
021     * along with Cobertura; if not, write to the Free Software
022     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
023     * USA
024     */
025    
026    package net.sourceforge.cobertura.reporting;
027    
028    import java.io.File;
029    
030    import net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler;
031    import net.sourceforge.cobertura.coveragedata.ProjectData;
032    import net.sourceforge.cobertura.reporting.html.HTMLReport;
033    import net.sourceforge.cobertura.reporting.xml.SummaryXMLReport;
034    import net.sourceforge.cobertura.reporting.xml.XMLReport;
035    import net.sourceforge.cobertura.util.CommandLineBuilder;
036    import net.sourceforge.cobertura.util.FileFinder;
037    import net.sourceforge.cobertura.util.Header;
038    
039    import org.apache.log4j.Logger;
040    
041    public class Main {
042    
043            private static final Logger LOGGER = Logger.getLogger(Main.class);
044    
045            private String format = "html";
046            private File dataFile = null;
047            private File destinationDir = null;
048            private String encoding = "UTF-8";
049            
050            private void parseArguments(String[] args) throws Exception {
051                    FileFinder finder = new FileFinder();
052                    String baseDir = null;
053                    for (int i = 0; i < args.length; i++) {
054                            if (args[i].equals("--basedir")) {
055                                    baseDir = args[++i];
056                            } else if (args[i].equals("--datafile")) {
057                                    setDataFile( args[++i]);
058                            } else if (args[i].equals("--destination")) {
059                                    setDestination( args[++i]);
060                            } else if (args[i].equals("--format")) {
061                                    setFormat( args[++i]);
062                            } else if (args[i].equals("--encoding")) {
063                                    setEncoding( args[++i]);
064                            } else {
065                                    if( baseDir==null) {
066                                            finder.addSourceDirectory( args[i]);
067                                    } else {
068                                            finder.addSourceFile( baseDir, args[i]);
069                                    }
070                            }
071                    }
072    
073                    if (dataFile == null)
074                            dataFile = CoverageDataFileHandler.getDefaultDataFile();
075    
076                    if (destinationDir == null)
077                    {
078                            System.err.println("Error: destination directory must be set");
079                            System.exit(1);
080                    }
081    
082                    if (format == null)
083                    {
084                            System.err.println("Error: format must be set");
085                            System.exit(1);
086                    }
087                    
088                    if (LOGGER.isDebugEnabled())
089                    {
090                            LOGGER.debug("format is " + format + " encoding is " + encoding);
091                            LOGGER.debug("dataFile is " + dataFile.getAbsolutePath());
092                            LOGGER.debug("destinationDir is "
093                                            + destinationDir.getAbsolutePath());
094                    }
095    
096                    ProjectData projectData = CoverageDataFileHandler.loadCoverageData(dataFile);
097    
098                    if (projectData == null) {
099                            System.err.println("Error: Unable to read from data file " + dataFile.getAbsolutePath());
100                            System.exit(1);
101                    }
102    
103                    ComplexityCalculator complexity = new ComplexityCalculator(finder);
104                    if (format.equalsIgnoreCase("html")) {
105                            new HTMLReport(projectData, destinationDir, finder, complexity, encoding);
106                    } else if (format.equalsIgnoreCase("xml")) {
107                            new XMLReport(projectData, destinationDir, finder, complexity);
108                    } else if (format.equalsIgnoreCase("summaryXml")) {
109                            new SummaryXMLReport(projectData, destinationDir, finder, complexity);
110                    }
111            }
112            
113            private void setFormat(String value) 
114            {
115                    format = value;
116                    if (!format.equalsIgnoreCase("html") 
117                                    && !format.equalsIgnoreCase("xml")
118                                    && !format.equalsIgnoreCase("summaryXml")) {
119                            System.err.println("" +
120                                            "Error: format \"" +
121                                            format + "\" is invalid. Must be either html or xml or summaryXml"
122                                            );
123                            System.exit(1);
124                    }
125            }
126    
127            private void setDataFile(String value) 
128            {
129                    dataFile = new File(value);
130                    if (!dataFile.exists())
131                    {
132                            System.err.println("Error: data file " + dataFile.getAbsolutePath()
133                                            + " does not exist");
134                            System.exit(1);
135                    }
136                    if (!dataFile.isFile())
137                    {
138                            System.err.println("Error: data file " + dataFile.getAbsolutePath()
139                                            + " must be a regular file");
140                            System.exit(1);
141                    }
142            }
143    
144            private void setDestination(String value) 
145            {
146                    destinationDir = new File(value);
147                    if (destinationDir.exists() && !destinationDir.isDirectory())
148                    {
149                            System.err.println("Error: destination directory " + destinationDir
150                                            + " already exists but is not a directory");
151                            System.exit(1);
152                    }
153                    destinationDir.mkdirs();
154            }
155    
156            private void setEncoding(String encoding){
157                    this.encoding = encoding;
158            }
159            
160            public static void main(String[] args) throws Exception {
161                    Header.print(System.out);
162    
163                    long startTime = System.currentTimeMillis();
164    
165                    Main main = new Main();
166    
167                    try {
168                            args = CommandLineBuilder.preprocessCommandLineArguments( args);
169                    } catch( Exception ex) {
170                            System.err.println( "Error: Cannot process arguments: " + ex.getMessage());
171                            System.exit(1);
172                    }
173                    
174                    main.parseArguments(args);
175    
176                    long stopTime = System.currentTimeMillis();
177                    System.out.println("Report time: " + (stopTime - startTime) + "ms");
178            }
179    
180    }