001 /* 002 * The Apache Software License, Version 1.1 003 * 004 * Copyright (C) 2000-2002 The Apache Software Foundation. All rights 005 * reserved. 006 * Copyright (C) 2003 jcoverage ltd. 007 * Copyright (C) 2005 Mark Doliner <thekingant@users.sourceforge.net> 008 * Copyright (C) 2005 Joakim Erdfelt <joakim@erdfelt.net> 009 * 010 * Redistribution and use in source and binary forms, with or without 011 * modification, are permitted provided that the following conditions 012 * are met: 013 * 014 * 1. Redistributions of source code must retain the above copyright 015 * notice, this list of conditions and the following disclaimer. 016 * 017 * 2. Redistributions in binary form must reproduce the above copyright 018 * notice, this list of conditions and the following disclaimer in 019 * the documentation and/or other materials provided with the 020 * distribution. 021 * 022 * 3. The end-user documentation included with the redistribution, if 023 * any, must include the following acknowlegement: 024 * "This product includes software developed by the 025 * Apache Software Foundation (http://www.apache.org/)." 026 * Alternately, this acknowlegement may appear in the software itself, 027 * if and wherever such third-party acknowlegements normally appear. 028 * 029 * 4. The names "Ant" and "Apache Software 030 * Foundation" must not be used to endorse or promote products derived 031 * from this software without prior written permission. For written 032 * permission, please contact apache@apache.org. 033 * 034 * 5. Products derived from this software may not be called "Apache" 035 * nor may "Apache" appear in their names without prior written 036 * permission of the Apache Group. 037 * 038 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 039 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 040 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 041 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR 042 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 043 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 044 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 045 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 046 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 047 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 048 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 049 * SUCH DAMAGE. 050 * ==================================================================== 051 * 052 * This software consists of voluntary contributions made by many 053 * individuals on behalf of the Apache Software Foundation. For more 054 * information on the Apache Software Foundation, please see 055 * <http://www.apache.org/>. 056 */ 057 058 package net.sourceforge.cobertura.ant; 059 060 import java.util.Arrays; 061 import java.util.HashSet; 062 import java.util.Iterator; 063 import java.util.Set; 064 065 import net.sourceforge.cobertura.util.Copyright; 066 067 import org.apache.tools.ant.BuildException; 068 import org.apache.tools.ant.Project; 069 import org.apache.tools.ant.types.FileSet; 070 071 public class InstrumentTask extends CommonMatchingTask 072 { 073 074 Ignore ignoreRegex = null; 075 076 public InstrumentTask() 077 { 078 super("net.sourceforge.cobertura.coverage.Main"); 079 } 080 081 public Ignore createIgnore() 082 { 083 ignoreRegex = new Ignore(); 084 return ignoreRegex; 085 } 086 087 void coverage(String[] filenames) 088 { 089 if (filenames.length == 0) 090 { 091 return; 092 } 093 094 for (int i = 0; i < filenames.length; i++) 095 { 096 getProject().log("Adding " + filenames[i] + " to list", 097 Project.MSG_VERBOSE); 098 addArg(filenames[i]); 099 } 100 101 saveArgs(); 102 103 Copyright.print(System.out); 104 System.out.println("instrumenting " + filenames.length + " " 105 + (filenames.length == 1 ? "class" : "classes") 106 + (toDir != null ? " to " + toDir : "")); 107 108 /** 109 * TODO: Do something here so that we can set System.in and System.out on 110 * getJava() to the one we're using now. So that when instrumentation calls 111 * System.out, it will show up as "[instrument] doing stuff" instead of 112 * "[java] doing stuff" in the ant output. 113 */ 114 if (getJava().executeJava() != 0) 115 { 116 throw new BuildException(); 117 } 118 } 119 120 public void execute() throws BuildException 121 { 122 initArgs(); 123 if (toDir != null) 124 { 125 addArg("-d"); 126 addArg(toDir.toString()); 127 } 128 129 // TODO: ignoreRegex.setRegex() is never called 130 if (ignoreRegex != null) 131 { 132 addArg("-ignore"); 133 addArg(ignoreRegex.getRegex()); 134 } 135 136 Set filenames = new HashSet(); 137 Iterator i = fileSets.iterator(); 138 139 while (i.hasNext()) 140 { 141 FileSet fileSet = (FileSet)i.next(); 142 143 addArg("-basedir"); 144 addArg(baseDir(fileSet)); 145 146 filenames.addAll(Arrays.asList(getFilenames(fileSet))); 147 } 148 149 coverage((String[])filenames.toArray(new String[filenames.size()])); 150 151 unInitArgs(); 152 } 153 }