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
008 * Copyright (C) 2005 Nathan Wilson
009 * Copyright (C) 2005 Alex Ruiz
010 *
011 * Redistribution and use in source and binary forms, with or without
012 * modification, are permitted provided that the following conditions
013 * are met:
014 *
015 * 1. Redistributions of source code must retain the above copyright
016 * notice, this list of conditions and the following disclaimer.
017 *
018 * 2. Redistributions in binary form must reproduce the above copyright
019 * notice, this list of conditions and the following disclaimer in
020 * the documentation and/or other materials provided with the
021 * distribution.
022 *
023 * 3. The end-user documentation included with the redistribution, if
024 * any, must include the following acknowlegement:
025 * "This product includes software developed by the
026 * Apache Software Foundation (http://www.apache.org/)."
027 * Alternately, this acknowlegement may appear in the software itself,
028 * if and wherever such third-party acknowlegements normally appear.
029 *
030 * 4. The names "Ant" and "Apache Software
031 * Foundation" must not be used to endorse or promote products derived
032 * from this software without prior written permission. For written
033 * permission, please contact apache@apache.org.
034 *
035 * 5. Products derived from this software may not be called "Apache"
036 * nor may "Apache" appear in their names without prior written
037 * permission of the Apache Group.
038 *
039 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
040 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
041 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
042 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
043 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
044 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
045 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
046 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
047 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
048 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
049 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
050 * SUCH DAMAGE.
051 * ====================================================================
052 *
053 * This software consists of voluntary contributions made by many
054 * individuals on behalf of the Apache Software Foundation. For more
055 * information on the Apache Software Foundation, please see
056 * <http://www.apache.org/>.
057 */
058
059 package net.sourceforge.cobertura.ant;
060
061 import java.net.URL;
062 import java.net.URLClassLoader;
063 import java.util.HashSet;
064 import java.util.Iterator;
065 import java.util.Set;
066
067 import org.apache.tools.ant.AntClassLoader;
068 import org.apache.tools.ant.BuildException;
069 import org.apache.tools.ant.taskdefs.Java;
070 import org.apache.tools.ant.taskdefs.MatchingTask;
071 import org.apache.tools.ant.types.Path;
072 import org.apache.tools.ant.types.Reference;
073
074 /**
075 * An ant task that can be used to optionally fail an ant build if
076 * the coverage percentage for lines or branches is below a certain,
077 * user specifiable threshold.
078 */
079 public class CheckTask extends MatchingTask
080 {
081
082 private String dataFile = null;
083
084 final Set regexes = new HashSet();
085
086 private String branchRate = null;
087
088 private String lineRate = null;
089
090 private String packageBranchRate = null;
091
092 private String packageLineRate = null;
093
094 private String totalBranchRate = null;
095
096 private String totalLineRate = null;
097
098 private String failureProperty = null;
099
100 private boolean haltOnFailure = true;
101
102 private Java java = null;
103
104 public void execute() throws BuildException
105 {
106 if (dataFile != null)
107 {
108 getJava().createArg().setValue("--datafile");
109 getJava().createArg().setValue(dataFile);
110 }
111
112 if (branchRate != null)
113 {
114 getJava().createArg().setValue("--branch");
115 getJava().createArg().setValue(branchRate);
116 }
117
118 if (lineRate != null)
119 {
120 getJava().createArg().setValue("--line");
121 getJava().createArg().setValue(lineRate);
122 }
123
124 if (packageBranchRate != null)
125 {
126 getJava().createArg().setValue("--packagebranch");
127 getJava().createArg().setValue(packageBranchRate);
128 }
129
130 if (packageLineRate != null)
131 {
132 getJava().createArg().setValue("--packageline");
133 getJava().createArg().setValue(packageLineRate);
134 }
135
136 if (totalBranchRate != null)
137 {
138 getJava().createArg().setValue("--totalbranch");
139 getJava().createArg().setValue(totalBranchRate);
140 }
141
142 if (totalLineRate != null)
143 {
144 getJava().createArg().setValue("--totalline");
145 getJava().createArg().setValue(totalLineRate);
146 }
147
148 Iterator iter = regexes.iterator();
149 while (iter.hasNext())
150 {
151 getJava().createArg().setValue("--regex");
152 getJava().createArg().setValue(iter.next().toString());
153 }
154
155 AntUtil.transferCoberturaDataFileProperty(getJava());
156 int returnCode = getJava().executeJava();
157
158 // Check the return code and print a message
159 if (returnCode == 0)
160 {
161 System.out.println("All checks passed.");
162 }
163 else
164 {
165 if (haltOnFailure)
166 throw new BuildException(
167 "Coverage check failed. See messages above.");
168 else if (failureProperty != null)
169 getProject().setProperty(failureProperty, "true");
170 else
171 System.err
172 .println("Coverage check failed. See messages above.");
173 }
174 }
175
176 public Regex createRegex()
177 {
178 Regex regex = new Regex();
179 regexes.add(regex);
180 return regex;
181 }
182
183 protected Java getJava()
184 {
185 if (java == null)
186 {
187 java = (Java)getProject().createTask("java");
188 java.setTaskName(getTaskName());
189 java.setClassname("net.sourceforge.cobertura.check.Main");
190 java.setFork(true);
191 java.setDir(getProject().getBaseDir());
192
193 if (getClass().getClassLoader() instanceof AntClassLoader)
194 {
195 createClasspath().setPath(
196 ((AntClassLoader)getClass().getClassLoader())
197 .getClasspath());
198 }
199 else if (getClass().getClassLoader() instanceof URLClassLoader)
200 {
201 URL[] earls = ((URLClassLoader)getClass().getClassLoader())
202 .getURLs();
203 for (int i = 0; i < earls.length; i++)
204 {
205 createClasspath().setPath(earls[i].getFile());
206 }
207 }
208 }
209
210 return java;
211 }
212
213 public Path createClasspath()
214 {
215 return getJava().createClasspath().createPath();
216 }
217
218 public void setClasspath(Path classpath)
219 {
220 createClasspath().append(classpath);
221 }
222
223 public void setClasspathRef(Reference r)
224 {
225 createClasspath().setRefid(r);
226 }
227
228 public void setDataFile(String dataFile)
229 {
230 this.dataFile = dataFile;
231 }
232
233 public void setBranchRate(String branchRate)
234 {
235 this.branchRate = branchRate;
236 }
237
238 public void setLineRate(String lineRate)
239 {
240 this.lineRate = lineRate;
241 }
242
243 public void setPackageBranchRate(String packageBranchRate)
244 {
245 this.packageBranchRate = packageBranchRate;
246 }
247
248 public void setPackageLineRate(String packageLineRate)
249 {
250 this.packageLineRate = packageLineRate;
251 }
252
253 public void setTotalBranchRate(String totalBranchRate)
254 {
255 this.totalBranchRate = totalBranchRate;
256 }
257
258 public void setTotalLineRate(String totalLineRate)
259 {
260 this.totalLineRate = totalLineRate;
261 }
262
263 public void setFailureProperty(String failureProperty)
264 {
265 this.failureProperty = failureProperty;
266 }
267
268 public void setHaltOnFailure(boolean haltOnFailure)
269 {
270 this.haltOnFailure = haltOnFailure;
271 }
272
273 }