001 /* 002 * The Apache Software License, Version 1.1 003 * 004 * Copyright (c) 2000-2002 The Apache Software Foundation. All rights 005 * reserved. 006 * 007 * Redistribution and use in source and binary forms, with or without 008 * modification, are permitted provided that the following conditions 009 * are met: 010 * 011 * 1. Redistributions of source code must retain the above copyright 012 * notice, this list of conditions and the following disclaimer. 013 * 014 * 2. Redistributions in binary form must reproduce the above copyright 015 * notice, this list of conditions and the following disclaimer in 016 * the documentation and/or other materials provided with the 017 * distribution. 018 * 019 * 3. The end-user documentation included with the redistribution, if 020 * any, must include the following acknowlegement: 021 * "This product includes software developed by the 022 * Apache Software Foundation (http://www.apache.org/)." 023 * Alternately, this acknowlegement may appear in the software itself, 024 * if and wherever such third-party acknowlegements normally appear. 025 * 026 * 4. The names "Ant" and "Apache Software 027 * Foundation" must not be used to endorse or promote products derived 028 * from this software without prior written permission. For written 029 * permission, please contact apache@apache.org. 030 * 031 * 5. Products derived from this software may not be called "Apache" 032 * nor may "Apache" appear in their names without prior written 033 * permission of the Apache Group. 034 * 035 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 036 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 037 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 038 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR 039 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 040 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 041 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 042 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 043 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 044 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 045 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 046 * SUCH DAMAGE. 047 * ==================================================================== 048 * 049 * This software consists of voluntary contributions made by many 050 * individuals on behalf of the Apache Software Foundation. For more 051 * information on the Apache Software Foundation, please see 052 * <http://www.apache.org/>. 053 */ 054 package com.jcoverage.ant; 055 056 import java.io.File; 057 import java.io.FileInputStream; 058 import java.io.FileOutputStream; 059 import java.io.InputStream; 060 import java.io.IOException; 061 import java.io.OutputStream; 062 063 import java.net.URLClassLoader; 064 import java.net.URL; 065 066 import java.util.Arrays; 067 import java.util.HashSet; 068 import java.util.Iterator; 069 import java.util.LinkedList; 070 import java.util.List; 071 import java.util.Set; 072 073 import org.apache.tools.ant.AntClassLoader; 074 import org.apache.tools.ant.BuildException; 075 import org.apache.tools.ant.DirectoryScanner; 076 import org.apache.tools.ant.Project; 077 import org.apache.tools.ant.taskdefs.Copy; 078 import org.apache.tools.ant.taskdefs.Java; 079 import org.apache.tools.ant.taskdefs.MatchingTask; 080 import org.apache.tools.ant.types.FileSet; 081 import org.apache.tools.ant.types.Path; 082 import org.apache.tools.ant.types.Reference; 083 import org.apache.tools.ant.util.IdentityMapper; 084 import org.apache.tools.ant.util.SourceFileScanner; 085 086 087 public abstract class CommonMatchingTask extends MatchingTask { 088 final String className; 089 final List fileSets=new LinkedList(); 090 091 private Java java=null; 092 093 File toDir=null; 094 095 public CommonMatchingTask(String className) { 096 this.className=className; 097 } 098 099 private String getClassName() { 100 return className; 101 } 102 103 protected Java getJava() { 104 if(java==null) { 105 java=(Java)getProject().createTask("java"); 106 java.setTaskName(getTaskName()); 107 java.setClassname(getClassName()); 108 java.setFork(true); 109 java.setDir(getProject().getBaseDir()); 110 111 if(getClass().getClassLoader() instanceof AntClassLoader) { 112 createClasspath().setPath(((AntClassLoader)getClass().getClassLoader()).getClasspath()); 113 } else if(getClass().getClassLoader() instanceof URLClassLoader) { 114 URL[] earls=((URLClassLoader)getClass().getClassLoader()).getURLs(); 115 for(int i=0;i<earls.length;i++) { 116 createClasspath().setPath(earls[i].getFile()); 117 } 118 } 119 } 120 121 return java; 122 } 123 124 public void setTodir(File toDir) { 125 this.toDir=toDir; 126 } 127 128 public Path createClasspath() { 129 return getJava().createClasspath().createPath(); 130 } 131 132 public void setClasspath(Path classpath) { 133 createClasspath().append(classpath); 134 } 135 136 public void setClasspathRef(Reference r) { 137 createClasspath().setRefid(r); 138 } 139 140 DirectoryScanner getDirectoryScanner(FileSet fileSet) { 141 return fileSet.getDirectoryScanner(getProject()); 142 } 143 144 String[] getIncludedFiles(FileSet fileSet) { 145 return getDirectoryScanner(fileSet).getIncludedFiles(); 146 } 147 148 String[] getExcludedFiles(FileSet fileSet) { 149 return getDirectoryScanner(fileSet).getExcludedFiles(); 150 } 151 152 String[] getFilenames(FileSet fileSet) { 153 String[] filesToReturn = getIncludedFiles(fileSet); 154 155 if(toDir!=null) { 156 IdentityMapper m=new IdentityMapper(); 157 SourceFileScanner sfs=new SourceFileScanner(this); 158 filesToReturn=sfs.restrict(getIncludedFiles(fileSet),fileSet.getDir(getProject()),toDir,m); 159 } 160 161 return filesToReturn; 162 } 163 164 String baseDir(FileSet fileSet) { 165 return fileSet.getDirectoryScanner(getProject()).getBasedir().toString(); 166 } 167 168 public void addFileset(FileSet fileSet) { 169 fileSets.add(fileSet); 170 } 171 }