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 */ 023 package com.jcoverage.coverage.reporting; 024 025 import gnu.getopt.Getopt; 026 import gnu.getopt.LongOpt; 027 028 import java.io.BufferedInputStream; 029 import java.io.File; 030 import java.io.FileInputStream; 031 import java.io.FileOutputStream; 032 import java.io.IOException; 033 import java.io.InputStream; 034 import java.io.ObjectInputStream; 035 import java.util.Iterator; 036 import java.util.Map; 037 038 import org.apache.log4j.Logger; 039 040 import com.jcoverage.coverage.Instrumentation; 041 042 public 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 }