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/ccm.html">Continuus/Synergy Tasks</a><br> | ||||
<a href="OptionalTasks/depend.html">Depend</a><br> | <a href="OptionalTasks/depend.html">Depend</a><br> | ||||
<a href="OptionalTasks/ejb.html">EJB Tasks</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/ftp.html">FTP</a><br> | ||||
<a href="OptionalTasks/icontract.html">IContract</a><br> | <a href="OptionalTasks/icontract.html">IContract</a><br> | ||||
<a href="OptionalTasks/javacc.html">JavaCC</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 | generalization of <a href="CoreTasks/available.html">Available</a> and | ||||
<a href="CoreTasks/uptodate.html">Uptodate</a>.</p></td> | <a href="CoreTasks/uptodate.html">Uptodate</a>.</p></td> | ||||
</tr> | </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"> | <tr valign="top"> | ||||
<td nowrap><a href="CoreTasks/loadfile.html">LoadFile</a></td> | <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 | soscheckin=org.apache.tools.ant.taskdefs.optional.sos.SOSCheckin | ||||
soscheckout=org.apache.tools.ant.taskdefs.optional.sos.SOSCheckout | soscheckout=org.apache.tools.ant.taskdefs.optional.sos.SOSCheckout | ||||
soslabel=org.apache.tools.ant.taskdefs.optional.sos.SOSLabel | soslabel=org.apache.tools.ant.taskdefs.optional.sos.SOSLabel | ||||
echoproperties=org.apache.tools.ant.taskdefs.optional.EchoProperties | |||||
# deprecated ant tasks (kept for back compatibility) | # deprecated ant tasks (kept for back compatibility) | ||||
starteam=org.apache.tools.ant.taskdefs.optional.scm.AntStarTeamCheckOut | 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 ); | |||||
} | |||||
} | |||||