git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271507 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -0,0 +1,82 @@ | |||
| <html> | |||
| <head> | |||
| <meta http-equiv="Content-Language" content="en-us"> | |||
| <title>Echoproperties Task</title> | |||
| </head> | |||
| <body> | |||
| <h2><a name="echoproperties">echoproperties</a></h2> | |||
| <h3>Description</h3> | |||
| <p>Displays all the current properties in the project. The output can be | |||
| sent to a file if desired. You can also specify a subset of properties | |||
| to save by naming a prefix: only properties starting with this | |||
| prefix will be saved. This task can be used as a somewhat contrived | |||
| means of returning data from an <tt><ant></tt> invocation, | |||
| but is really for debugging build files.</p> | |||
| <h3>Parameters</h3> | |||
| <table border="1" cellpadding="2" cellspacing="0"> | |||
| <tr> | |||
| <td valign="top"><b>Attribute</b></td> | |||
| <td valign="top"><b>Description</b></td> | |||
| <td align="center" valign="top"><b>Required</b></td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">destfile</td> | |||
| <td valign="top">If specified, the value indicates the name of the | |||
| file to send the output of the statement to. The generated output file | |||
| is compatible for loading by any Java application as a property file. | |||
| If not specified, then the output will go to the Ant log.</td> | |||
| <td valign="top" align="center">No</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">prefix</td> | |||
| <td valign="top"> | |||
| a prefix which is used to filter the properties | |||
| only those properties starting with this prefix will be echoed. | |||
| <P> | |||
| </td> | |||
| <td valign="top" align="center">No</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">failonerror</td> | |||
| <td valign="top">By default, the "failonerror" attribute is enabled. | |||
| If an error occurs while writing the properties to a file, and this | |||
| attribute is enabled, then a BuildException will be thrown, causing the | |||
| build to fail. If disabled, then IO errors will be reported as a log | |||
| statement, and the build will continue without failure from this task.</td> | |||
| <td valign="top" align="center">No</td> | |||
| </tr> | |||
| </table> | |||
| <h3>Examples</h3> | |||
| <blockquote><pre> | |||
| <echoproperties /> | |||
| </pre></blockquote> | |||
| <p>Report the current properties to the log.</p> | |||
| <blockquote><pre> | |||
| <echoproperties destfile="my.properties" /> | |||
| </pre></blockquote> | |||
| <p>Report the current properties to the file "my.properties", and will | |||
| fail the build if the file could not be created or written to.</p> | |||
| <blockquote><pre> | |||
| <echoproperties destfile="my.properties" failonerror="false" /> | |||
| </pre></blockquote> | |||
| <p>Report the current properties to the file "my.properties", and will | |||
| log a message if the file could not be created or written to, but will still | |||
| allow the build to continue.</p> | |||
| <blockquote><pre> | |||
| <echoproperties prefix="java."/> | |||
| </pre></blockquote> | |||
| <p>List all properties beginning with "java."</p> | |||
| <hr> | |||
| <p align="center">Copyright © 2002 Apache Software Foundation. All rights | |||
| Reserved.</p> | |||
| </body> | |||
| </html> | |||
| @@ -20,6 +20,7 @@ | |||
| <a href="OptionalTasks/ccm.html">Continuus/Synergy Tasks</a><br> | |||
| <a href="OptionalTasks/depend.html">Depend</a><br> | |||
| <a href="OptionalTasks/ejb.html">EJB Tasks</a><br> | |||
| <a href="OptionalTasks/echoproperties.html">Echoproperties</a><br> | |||
| <a href="OptionalTasks/ftp.html">FTP</a><br> | |||
| <a href="OptionalTasks/icontract.html">IContract</a><br> | |||
| <a href="OptionalTasks/javacc.html">JavaCC</a><br> | |||
| @@ -820,6 +820,13 @@ documentation.</p> | |||
| generalization of <a href="CoreTasks/available.html">Available</a> and | |||
| <a href="CoreTasks/uptodate.html">Uptodate</a>.</p></td> | |||
| </tr> | |||
| <tr valign="top"> | |||
| <td nowrap> | |||
| <a href="OptionalTasks/echoproperties.html">Echoproperties</a><br> | |||
| </td> | |||
| <td><p>Lists the current properties</p></td> | |||
| </tr> | |||
| <tr valign="top"> | |||
| <td nowrap><a href="CoreTasks/loadfile.html">LoadFile</a></td> | |||
| @@ -0,0 +1,49 @@ | |||
| <project name="test" default="def" basedir="."> | |||
| <target name="def"> | |||
| </target> | |||
| <target name="setup"> | |||
| <property name="a.set" value="true" /> | |||
| <property name="b.set" value="false" /> | |||
| </target> | |||
| <target name="testEchoToLog" depends="setup"> | |||
| <echoproperties /> | |||
| </target> | |||
| <target name="testEchoToBadFile" depends="setup"> | |||
| <echoproperties destfile="." /> | |||
| </target> | |||
| <target name="testEchoToBadFileFail" depends="setup"> | |||
| <echoproperties destfile="." failonerror="yes" /> | |||
| </target> | |||
| <target name="testEchoToBadFileNoFail" depends="setup"> | |||
| <echoproperties destfile="." failonerror="no" /> | |||
| </target> | |||
| <target name="testEchoToGoodFile" depends="setup"> | |||
| <echoproperties destfile="test.properties" /> | |||
| </target> | |||
| <target name="testEchoToGoodFileFail" depends="setup"> | |||
| <echoproperties destfile="test.properties" failonerror="yes" /> | |||
| </target> | |||
| <target name="testEchoToGoodFileNoFail" depends="setup"> | |||
| <echoproperties destfile="test.properties" failonerror="no" /> | |||
| </target> | |||
| <target name="testEchoPrefix" depends="setup"> | |||
| <echoproperties destfile="test-prefix.properties" prefix="a." /> | |||
| </target> | |||
| <target name="cleanup"> | |||
| <delete file="test.properties" failonerror="no" /> | |||
| <delete file="test-prefix.properties" failonerror="no" /> | |||
| </target> | |||
| </project> | |||
| @@ -139,6 +139,7 @@ sosget=org.apache.tools.ant.taskdefs.optional.sos.SOSGet | |||
| soscheckin=org.apache.tools.ant.taskdefs.optional.sos.SOSCheckin | |||
| soscheckout=org.apache.tools.ant.taskdefs.optional.sos.SOSCheckout | |||
| soslabel=org.apache.tools.ant.taskdefs.optional.sos.SOSLabel | |||
| echoproperties=org.apache.tools.ant.taskdefs.optional.EchoProperties | |||
| # deprecated ant tasks (kept for back compatibility) | |||
| starteam=org.apache.tools.ant.taskdefs.optional.scm.AntStarTeamCheckOut | |||
| @@ -0,0 +1,209 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2000 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.tools.ant.taskdefs.optional; | |||
| import org.apache.tools.ant.Project; | |||
| import org.apache.tools.ant.Task; | |||
| import org.apache.tools.ant.BuildException; | |||
| import java.util.Properties; | |||
| import java.util.Hashtable; | |||
| import java.util.Enumeration; | |||
| import java.io.ByteArrayOutputStream; | |||
| import java.io.OutputStream; | |||
| import java.io.File; | |||
| import java.io.IOException; | |||
| import java.io.FileOutputStream; | |||
| /** | |||
| * Displays all the current properties in the build. The output can be sent to | |||
| * a file if desired. <P> | |||
| * | |||
| * Attribute "destfile" defines a file to send the properties to. This can be | |||
| * processed as a standard property file later. <P> | |||
| * | |||
| * Attribute "prefix" defines a prefix which is used to filter the properties | |||
| * only those properties starting with this prefix will be echoed. <P> | |||
| * | |||
| * By default, the "failonerror" attribute is enabled. If an error occurs while | |||
| * writing the properties to a file, and this attribute is enabled, then a | |||
| * BuildException will be thrown. If disabled, then IO errors will be reported | |||
| * as a log statement, but no error will be thrown. <P> | |||
| * | |||
| * Examples: <pre> | |||
| * <echoproperties /> | |||
| * </pre> Report the current properties to the log. <P> | |||
| * | |||
| * <pre> | |||
| * <echoproperties destfile="my.properties" /> | |||
| * </pre> Report the current properties to the file "my.properties", and will | |||
| * fail the build if the file could not be created or written to. <P> | |||
| * | |||
| * <pre> | |||
| * <echoproperties destfile="my.properties" failonerror="false" | |||
| * prefix="ant" /> | |||
| * </pre> Report all properties beginning with 'ant' to the file | |||
| * "my.properties", and will log a message if the file could not be created or | |||
| * written to, but will still allow the build to continue. | |||
| * | |||
| *@author Matt Albrecht <a href="mailto:groboclown@users.sourceforge.net"> | |||
| * groboclown@users.sourceforge.net</a> | |||
| *@created 17-Jan-2002 | |||
| *@since Ant 1.5 | |||
| */ | |||
| public class EchoProperties extends Task { | |||
| /** | |||
| * File object pointing to the output file. If this is null, then we output | |||
| * to the project log, not to a file. | |||
| */ | |||
| private File destfile = null; | |||
| /** | |||
| * If this is true, then errors generated during file output will become | |||
| * build errors, and if false, then such errors will be logged, but not | |||
| * thrown. | |||
| */ | |||
| private boolean failonerror = true; | |||
| /** | |||
| * prefix string controls which properties to save | |||
| */ | |||
| private String prefix = null; | |||
| /** | |||
| * set a file to use for the output | |||
| */ | |||
| public void setDestfile(File destfile) { | |||
| this.destfile = destfile; | |||
| } | |||
| /** | |||
| *@param failonerror <tt>true</tt> if IO exceptions are reported as build | |||
| * exceptions, or <tt>false</tt> if IO exceptions are ignored. | |||
| */ | |||
| public void setFailOnError(boolean failonerror) { | |||
| this.failonerror = failonerror; | |||
| } | |||
| /** | |||
| *@param prefix The new prefix value | |||
| */ | |||
| public void setPrefix(String prefix) { | |||
| this.prefix = prefix; | |||
| } | |||
| /** | |||
| * Run the task. | |||
| * | |||
| *@exception BuildException trouble, probably file IO | |||
| */ | |||
| public void execute() throws BuildException { | |||
| //copy the properties file | |||
| Hashtable allProps = project.getProperties(); | |||
| try { | |||
| if (destfile == null) { | |||
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); | |||
| saveProperties(allProps, baos); | |||
| log(baos.toString(), Project.MSG_INFO); | |||
| } else { | |||
| OutputStream os = new FileOutputStream(this.destfile); | |||
| saveProperties(allProps, os); | |||
| } | |||
| } catch (IOException ioe) { | |||
| String message = | |||
| "Destfile " + destfile + " could not be written to."; | |||
| if (failonerror) { | |||
| throw new BuildException(message, ioe, | |||
| location); | |||
| } else { | |||
| log(message, Project.MSG_INFO); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Send the key/value pairs in the hashtable to the given output stream. | |||
| * The output stream will be closed when this method returns. | |||
| * | |||
| *@param allProps propfile to save | |||
| *@param os output stream | |||
| *@exception IOException trouble | |||
| */ | |||
| protected void saveProperties(Hashtable allProps, OutputStream os) | |||
| throws IOException { | |||
| Properties props = new Properties(); | |||
| Enumeration enum = allProps.keys(); | |||
| while (enum.hasMoreElements()) { | |||
| String name = (String) enum.nextElement(); | |||
| String value = (String) allProps.get(name); | |||
| if (prefix == null || name.indexOf(prefix) == 0 ) { | |||
| props.setProperty(name, value); | |||
| } | |||
| } | |||
| try { | |||
| props.store(os, "Ant properties"); | |||
| } finally { | |||
| os.close(); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,206 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2000-2002 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.tools.ant.taskdefs.optional; | |||
| import org.apache.tools.ant.BuildFileTest; | |||
| import java.io.*; | |||
| import java.util.Properties; | |||
| /** | |||
| * Tests the EchoProperties task. | |||
| * | |||
| * @author Matt Albrecht <a href="mailto:groboclown@users.sourceforge.net">groboclown@users.sourceforge.net</a> | |||
| * @created 17-Jan-2002 | |||
| * @since Ant 1.5 | |||
| */ | |||
| public class EchoPropertiesTest extends BuildFileTest { | |||
| private final static String TASKDEFS_DIR = "src/etc/testcases/taskdefs/optional/"; | |||
| private static final String GOOD_OUTFILE = "test.properties"; | |||
| private static final String PREFIX_OUTFILE = "test-prefix.properties"; | |||
| private static final String BAD_OUTFILE = "."; | |||
| public EchoPropertiesTest(String name) { | |||
| super(name); | |||
| } | |||
| public void setUp() { | |||
| configureProject(TASKDEFS_DIR + "echoproperties.xml"); | |||
| project.setProperty( "test.property", "is set" ); | |||
| } | |||
| public void tearDown() { | |||
| executeTarget("cleanup"); | |||
| } | |||
| public void testEchoToLog() { | |||
| executeTarget( "testEchoToLog" ); | |||
| String out = getLog(); | |||
| assertTrue( | |||
| "Did not output testEchoToLog.", | |||
| out.indexOf( "test.property=is set" ) >= 0 ); | |||
| } | |||
| public void testEchoToBadFile() { | |||
| expectBuildExceptionContaining( "testEchoToBadFile", | |||
| "outfile is not writeable", | |||
| "Destfile "+toAbsolute(BAD_OUTFILE)+" could not be written to." ); | |||
| } | |||
| public void testEchoToBadFileFail() { | |||
| expectBuildExceptionContaining( "testEchoToBadFileFail", | |||
| "outfile is not writeable", | |||
| "Destfile "+toAbsolute(BAD_OUTFILE)+" could not be written to." ); | |||
| } | |||
| public void testEchoToBadFileNoFail() { | |||
| expectLog( "testEchoToBadFileNoFail", | |||
| "Destfile "+toAbsolute(BAD_OUTFILE)+" could not be written to." ); | |||
| } | |||
| public void testEchoToGoodFile() throws Exception { | |||
| executeTarget( "testEchoToGoodFile" ); | |||
| assertGoodFile(); | |||
| } | |||
| public void testEchoToGoodFileFail() throws Exception { | |||
| executeTarget( "testEchoToGoodFileFail" ); | |||
| assertGoodFile(); | |||
| } | |||
| public void testEchoToGoodFileNoFail() throws Exception { | |||
| executeTarget( "testEchoToGoodFileNoFail" ); | |||
| assertGoodFile(); | |||
| } | |||
| public void testEchoPrefix() throws Exception { | |||
| executeTarget( "testEchoPrefix" ); | |||
| Properties props=loadPropFile(PREFIX_OUTFILE); | |||
| // props.list(System.out); | |||
| assertEquals("prefix didn't include 'a.set' property","true",props.getProperty("a.set")); | |||
| assertNull("prefix failed to filter out property 'b.set'", | |||
| props.getProperty("b.set")); | |||
| } | |||
| protected Properties loadPropFile(String relativeFilename) | |||
| throws IOException { | |||
| File f = createRelativeFile( relativeFilename ); | |||
| Properties props=new Properties(); | |||
| InputStream in=null; | |||
| try { | |||
| in=new BufferedInputStream(new FileInputStream(f)); | |||
| props.load(in); | |||
| } finally { | |||
| if(in!=null) { | |||
| try { in.close(); } catch(IOException e) {} | |||
| } | |||
| } | |||
| return props; | |||
| } | |||
| protected void assertGoodFile() throws Exception { | |||
| File f = createRelativeFile( GOOD_OUTFILE ); | |||
| assertTrue( | |||
| "Did not create "+f.getAbsolutePath(), | |||
| f.exists() ); | |||
| Properties props=loadPropFile(GOOD_OUTFILE); | |||
| props.list(System.out); | |||
| assertEquals("test property not found ", | |||
| "is set",props.getProperty("test.property")); | |||
| /* | |||
| // read in the file | |||
| FileReader fr = new FileReader( f ); | |||
| try { | |||
| BufferedReader br = new BufferedReader( fr ); | |||
| String read = null; | |||
| while ( (read = br.readLine()) != null) | |||
| { | |||
| if (read.indexOf("test.property=is set") >= 0) | |||
| { | |||
| // found the property we set - it's good. | |||
| return; | |||
| } | |||
| } | |||
| fail( "did not encounter set property in generated file." ); | |||
| } finally { | |||
| try { fr.close(); } catch(IOException e) {} | |||
| } | |||
| */ | |||
| } | |||
| protected String toAbsolute( String filename ) { | |||
| return createRelativeFile( filename ).getAbsolutePath(); | |||
| } | |||
| protected File createRelativeFile( String filename ) { | |||
| if (filename.equals( "." )) { | |||
| return getProjectDir(); | |||
| } | |||
| // else | |||
| return new File( getProjectDir(), filename ); | |||
| } | |||
| } | |||