001/**
002 * www.jcoverage.com
003 * Copyright (C)2003 jcoverage ltd.
004 *
005 * This file is part of jcoverage.
006 *
007 * jcoverage 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 * jcoverage 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 jcoverage; if not, write to the Free Software
019 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
020 * USA
021 *
022 */
023package com.jcoverage.coverage.reporting;
024
025import gnu.getopt.Getopt;
026import gnu.getopt.LongOpt;
027
028import java.io.BufferedInputStream;
029import java.io.File;
030import java.io.FileInputStream;
031import java.io.FileOutputStream;
032import java.io.IOException;
033import java.io.InputStream;
034import java.io.ObjectInputStream;
035import java.util.Iterator;
036import java.util.Map;
037
038import org.apache.log4j.Logger;
039
040import com.jcoverage.coverage.Instrumentation;
041
042public class Main {
043  static final Logger logger=Logger.getLogger(Main.class);
044
045  static File serializationFile,srcDir,destDir;
046
047  public static void main(String[] args) throws Exception {
048    LongOpt[] longOpts=new LongOpt[3];
049    longOpts[0]=new LongOpt("instrumentation",LongOpt.REQUIRED_ARGUMENT,null,'i');
050    longOpts[1]=new LongOpt("output",LongOpt.REQUIRED_ARGUMENT,null,'o');
051    longOpts[2]=new LongOpt("source",LongOpt.REQUIRED_ARGUMENT,null,'s');
052
053    Getopt g=new Getopt(Main.class.getName(),args,":i:o:s:",longOpts);
054
055    int c;
056
057    while((c=g.getopt())!=-1) {
058      switch(c) {
059      case 'i':
060        serializationFile=new File(g.getOptarg());
061
062        if (!serializationFile.exists()) {
063          throw new Exception("Error: serialization file "+serializationFile+" does not exist");
064        }
065        if (serializationFile.isDirectory()) {
066          throw new Exception("Error: serialization file "+serializationFile+" cannot be a directory");
067        }
068        break;
069      case 'o':
070        destDir=new File(g.getOptarg());
071
072        if (destDir.exists() && destDir.isFile()) {
073          throw new Exception("Error: destination directory "+destDir+" already exists and is a file");
074        }
075        destDir.mkdirs();
076        break;
077      case 's':
078        srcDir=new File(g.getOptarg());
079
080        if (!srcDir.exists()) {
081          throw new Exception("Error: source directory "+srcDir+" does not exist");
082        }
083        if (srcDir.isFile()) {
084          throw new Exception("Error: source directory "+srcDir+" should be a directory, not a file");
085        }
086        break;
087      }
088    }
089
090    if(logger.isDebugEnabled()) {
091      logger.debug("serializationFile is "+serializationFile);
092      logger.debug("srcDir is "+srcDir);
093      logger.debug("destDir is "+destDir);
094    }
095
096    // Copy gifs
097    File imagesDir=new File(destDir,"images");
098    imagesDir.mkdirs();
099    copyResource("red.gif",imagesDir);
100    copyResource("green.gif",imagesDir);
101
102    ReportDriver driver=new ReportDriver(srcDir);
103
104    InputStream is=new FileInputStream(serializationFile);
105    ObjectInputStream objects=new ObjectInputStream(is);
106
107    for(Iterator it=((Map)objects.readObject()).entrySet().iterator();it.hasNext();) {
108      Map.Entry entry=(Map.Entry)it.next();
109      driver.addInstrumentation((String)entry.getKey(),(Instrumentation)entry.getValue());
110    }
111
112    driver.generate(destDir);
113  }
114
115  static String toPackage(String clzName) {
116    int i=clzName.lastIndexOf('.');
117    if (i==-1) {
118      return "default";
119    } else {
120      return clzName.substring(0,i);
121    }
122  }
123
124  static byte[] buf=new byte[2^12];
125
126  static void copyResource(String resname,File dir) throws IOException {
127    FileOutputStream fos=new FileOutputStream(new File(dir,resname));
128    InputStream in=new BufferedInputStream(Main.class.getResourceAsStream(resname));
129    while(true) {
130      int n=in.read(buf,0,buf.length);
131      if (n==-1) {
132        break;
133      }
134
135      fos.write(buf,0,n);
136    }
137    in.close();
138    fos.close();
139  }
140}