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    }