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 ); | |||
} | |||
} | |||