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     *
009     * Redistribution and use in source and binary forms, with or without
010     * modification, are permitted provided that the following conditions
011     * are met:
012     *
013     * 1. Redistributions of source code must retain the above copyright
014     *    notice, this list of conditions and the following disclaimer.
015     *
016     * 2. Redistributions in binary form must reproduce the above copyright
017     *    notice, this list of conditions and the following disclaimer in
018     *    the documentation and/or other materials provided with the
019     *    distribution.
020     *
021     * 3. The end-user documentation included with the redistribution, if
022     *    any, must include the following acknowlegement:
023     *       "This product includes software developed by the
024     *        Apache Software Foundation (http://www.apache.org/)."
025     *    Alternately, this acknowlegement may appear in the software itself,
026     *    if and wherever such third-party acknowlegements normally appear.
027     *
028     * 4. The names "Ant" and "Apache Software
029     *    Foundation" must not be used to endorse or promote products derived
030     *    from this software without prior written permission. For written
031     *    permission, please contact apache@apache.org.
032     *
033     * 5. Products derived from this software may not be called "Apache"
034     *    nor may "Apache" appear in their names without prior written
035     *    permission of the Apache Group.
036     *
037     * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
038     * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
039     * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
040     * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
041     * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
042     * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
043     * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
044     * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
045     * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
046     * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
047     * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
048     * SUCH DAMAGE.
049     * ====================================================================
050     *
051     * This software consists of voluntary contributions made by many
052     * individuals on behalf of the Apache Software Foundation.  For more
053     * information on the Apache Software Foundation, please see
054     * <http://www.apache.org/>.
055     */
056    
057    package net.sourceforge.cobertura.ant;
058    
059    import java.net.URL;
060    import java.net.URLClassLoader;
061    import java.util.HashSet;
062    import java.util.Iterator;
063    import java.util.Set;
064    
065    import org.apache.tools.ant.AntClassLoader;
066    import org.apache.tools.ant.BuildException;
067    import org.apache.tools.ant.taskdefs.Java;
068    import org.apache.tools.ant.taskdefs.MatchingTask;
069    import org.apache.tools.ant.types.Path;
070    import org.apache.tools.ant.types.Reference;
071    
072    /**
073     * An ant task that can be used to optionally fail an ant build if
074     * the coverage percentage for lines or branches is below a certain,
075     * user specifiable threshold.
076     */
077    public class CheckTask extends MatchingTask
078    {
079    
080            final Set regexes = new HashSet();
081    
082            protected String branchCoverageRate = null;
083            protected String lineCoverageRate = null;
084    
085            private Java java = null;
086    
087            public void setBranch(String branchCoverageRate)
088            {
089                    this.branchCoverageRate = branchCoverageRate;
090            }
091    
092            public void setLine(String lineCoverageRate)
093            {
094                    this.lineCoverageRate = lineCoverageRate;
095            }
096    
097            public void execute() throws BuildException
098            {
099                    if (lineCoverageRate != null)
100                    {
101                            getJava().createArg().setValue("-l");
102                            getJava().createArg().setValue(lineCoverageRate);
103                    }
104    
105                    if (branchCoverageRate != null)
106                    {
107                            getJava().createArg().setValue("-b");
108                            getJava().createArg().setValue(branchCoverageRate);
109                    }
110    
111                    Iterator i = regexes.iterator();
112                    while (i.hasNext())
113                    {
114                            getJava().createArg().setValue("-r");
115                            getJava().createArg().setValue(i.next().toString());
116                    }
117    
118                    if (getJava().executeJava() != 0)
119                    {
120                            throw new BuildException();
121                    }
122            }
123    
124            public Regex createRegex()
125            {
126                    Regex regex = new Regex();
127                    regexes.add(regex);
128                    return regex;
129            }
130    
131            protected Java getJava()
132            {
133                    if (java == null)
134                    {
135                            java = (Java)getProject().createTask("java");
136                            java.setTaskName(getTaskName());
137                            java.setClassname("net.sourceforge.cobertura.check.Main");
138                            java.setFork(true);
139                            java.setDir(getProject().getBaseDir());
140    
141                            if (getClass().getClassLoader() instanceof AntClassLoader)
142                            {
143                                    createClasspath().setPath(
144                                                    ((AntClassLoader)getClass().getClassLoader())
145                                                                    .getClasspath());
146                            }
147                            else if (getClass().getClassLoader() instanceof URLClassLoader)
148                            {
149                                    URL[] earls = ((URLClassLoader)getClass().getClassLoader())
150                                                    .getURLs();
151                                    for (int i = 0; i < earls.length; i++)
152                                    {
153                                            createClasspath().setPath(earls[i].getFile());
154                                    }
155                            }
156                    }
157    
158                    return java;
159            }
160    
161            public Path createClasspath()
162            {
163                    return getJava().createClasspath().createPath();
164            }
165    
166            public void setClasspath(Path classpath)
167            {
168                    createClasspath().append(classpath);
169            }
170    
171            public void setClasspathRef(Reference r)
172            {
173                    createClasspath().setRefid(r);
174            }
175    
176    }