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.util.HashSet;
062    import java.util.Iterator;
063    import java.util.Set;
064    
065    import org.apache.tools.ant.BuildException;
066    
067    /**
068     * An ant task that can be used to optionally fail an ant build if
069     * the coverage percentage for lines or branches is below a certain,
070     * user specifiable threshold.
071     */
072    public class CheckTask extends CommonMatchingTask
073    {
074    
075            private String dataFile = null;
076    
077            final Set regexes = new HashSet();
078    
079            private String branchRate = null;
080    
081            private String lineRate = null;
082    
083            private String packageBranchRate = null;
084    
085            private String packageLineRate = null;
086    
087            private String totalBranchRate = null;
088    
089            private String totalLineRate = null;
090    
091            private String failureProperty = null;
092    
093            private boolean haltOnFailure = true;
094    
095            public CheckTask() {
096                    super("net.sourceforge.cobertura.check.Main");
097            }
098            
099            public void execute() throws BuildException
100            {
101                    if (dataFile != null)
102                    {
103                            getJava().createArg().setValue("--datafile");
104                            getJava().createArg().setValue(dataFile);
105                    }
106    
107                    if (branchRate != null)
108                    {
109                            getJava().createArg().setValue("--branch");
110                            getJava().createArg().setValue(branchRate);
111                    }
112    
113                    if (lineRate != null)
114                    {
115                            getJava().createArg().setValue("--line");
116                            getJava().createArg().setValue(lineRate);
117                    }
118    
119                    if (packageBranchRate != null)
120                    {
121                            getJava().createArg().setValue("--packagebranch");
122                            getJava().createArg().setValue(packageBranchRate);
123                    }
124    
125                    if (packageLineRate != null)
126                    {
127                            getJava().createArg().setValue("--packageline");
128                            getJava().createArg().setValue(packageLineRate);
129                    }
130    
131                    if (totalBranchRate != null)
132                    {
133                            getJava().createArg().setValue("--totalbranch");
134                            getJava().createArg().setValue(totalBranchRate);
135                    }
136    
137                    if (totalLineRate != null)
138                    {
139                            getJava().createArg().setValue("--totalline");
140                            getJava().createArg().setValue(totalLineRate);
141                    }
142    
143                    Iterator iter = regexes.iterator();
144                    while (iter.hasNext())
145                    {
146                            getJava().createArg().setValue("--regex");
147                            getJava().createArg().setValue(iter.next().toString());
148                    }
149    
150                    AntUtil.transferCoberturaDataFileProperty(getJava());
151                    int returnCode = getJava().executeJava();
152    
153                    // Check the return code and print a message
154                    if (returnCode == 0)
155                    {
156                            System.out.println("All checks passed.");
157                    }
158                    else
159                    {
160                            if (haltOnFailure)
161                                    throw new BuildException(
162                                                    "Coverage check failed. See messages above.");
163                            else if (failureProperty != null)
164                                    getProject().setProperty(failureProperty, "true");
165                            else
166                                    System.err
167                                                    .println("Coverage check failed. See messages above.");
168                    }
169            }
170    
171            public Regex createRegex()
172            {
173                    Regex regex = new Regex();
174                    regexes.add(regex);
175                    return regex;
176            }
177    
178            public void setDataFile(String dataFile)
179            {
180                    this.dataFile = dataFile;
181            }
182    
183            public void setBranchRate(String branchRate)
184            {
185                    this.branchRate = branchRate;
186            }
187    
188            public void setLineRate(String lineRate)
189            {
190                    this.lineRate = lineRate;
191            }
192    
193            public void setPackageBranchRate(String packageBranchRate)
194            {
195                    this.packageBranchRate = packageBranchRate;
196            }
197    
198            public void setPackageLineRate(String packageLineRate)
199            {
200                    this.packageLineRate = packageLineRate;
201            }
202    
203            public void setTotalBranchRate(String totalBranchRate)
204            {
205                    this.totalBranchRate = totalBranchRate;
206            }
207    
208            public void setTotalLineRate(String totalLineRate)
209            {
210                    this.totalLineRate = totalLineRate;
211            }
212    
213            public void setFailureProperty(String failureProperty)
214            {
215                    this.failureProperty = failureProperty;
216            }
217    
218            public void setHaltOnFailure(boolean haltOnFailure)
219            {
220                    this.haltOnFailure = haltOnFailure;
221            }
222    
223    }