From 3a60c3af7e55a3d16fd6d950f4dcb882dba10b10 Mon Sep 17 00:00:00 2001
From: Steve Loughran
Date: Fri, 22 Feb 2002 08:29:37 +0000
Subject: [PATCH] Utility task to list all your current properties along with
unit tests, as written by Matt Albrecht . Added a prefix to save a subset of
the properties for the very silly. Left it in optional.jar although it has no
dependencies.
git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271507 13f79535-47bb-0310-9956-ffa450edef68
---
docs/manual/OptionalTasks/echoproperties.html | 82 +++++++
docs/manual/optionaltasklist.html | 1 +
docs/manual/tasksoverview.html | 7 +
.../taskdefs/optional/echoproperties.xml | 49 ++++
.../tools/ant/taskdefs/defaults.properties | 1 +
.../ant/taskdefs/optional/EchoProperties.java | 209 ++++++++++++++++++
.../taskdefs/optional/EchoPropertiesTest.java | 206 +++++++++++++++++
7 files changed, 555 insertions(+)
create mode 100644 docs/manual/OptionalTasks/echoproperties.html
create mode 100644 src/etc/testcases/taskdefs/optional/echoproperties.xml
create mode 100644 src/main/org/apache/tools/ant/taskdefs/optional/EchoProperties.java
create mode 100644 src/testcases/org/apache/tools/ant/taskdefs/optional/EchoPropertiesTest.java
diff --git a/docs/manual/OptionalTasks/echoproperties.html b/docs/manual/OptionalTasks/echoproperties.html
new file mode 100644
index 000000000..6119526dd
--- /dev/null
+++ b/docs/manual/OptionalTasks/echoproperties.html
@@ -0,0 +1,82 @@
+
+
+
+
+Echoproperties Task
+
+
+
+
+
+Description
+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 <ant> invocation,
+but is really for debugging build files.
+Parameters
+
+
+ Attribute |
+ Description |
+ Required |
+
+
+ destfile |
+ 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. |
+ No |
+
+
+ prefix |
+
+ a prefix which is used to filter the properties
+ only those properties starting with this prefix will be echoed.
+
+ |
+ No |
+
+
+
+
+
+ failonerror |
+ 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. |
+ No |
+
+
+Examples
+
+ <echoproperties />
+
+Report the current properties to the log.
+
+ <echoproperties destfile="my.properties" />
+
+Report the current properties to the file "my.properties", and will
+fail the build if the file could not be created or written to.
+
+ <echoproperties destfile="my.properties" failonerror="false" />
+
+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.
+
+ <echoproperties prefix="java."/>
+
+List all properties beginning with "java."
+
+
+Copyright © 2002 Apache Software Foundation. All rights
+Reserved.
+
+
+
+
diff --git a/docs/manual/optionaltasklist.html b/docs/manual/optionaltasklist.html
index 62f0c9067..a3677e680 100644
--- a/docs/manual/optionaltasklist.html
+++ b/docs/manual/optionaltasklist.html
@@ -20,6 +20,7 @@
Continuus/Synergy Tasks
Depend
EJB Tasks
+Echoproperties
FTP
IContract
JavaCC
diff --git a/docs/manual/tasksoverview.html b/docs/manual/tasksoverview.html
index 4d53179f5..b061797b5 100644
--- a/docs/manual/tasksoverview.html
+++ b/docs/manual/tasksoverview.html
@@ -820,6 +820,13 @@ documentation.
generalization of Available and
Uptodate.
+
+
+ Echoproperties
+
+ |
+ Lists the current properties |
+
LoadFile |
diff --git a/src/etc/testcases/taskdefs/optional/echoproperties.xml b/src/etc/testcases/taskdefs/optional/echoproperties.xml
new file mode 100644
index 000000000..0000bc86e
--- /dev/null
+++ b/src/etc/testcases/taskdefs/optional/echoproperties.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/org/apache/tools/ant/taskdefs/defaults.properties b/src/main/org/apache/tools/ant/taskdefs/defaults.properties
index 87e79a3e4..b94cbe17e 100644
--- a/src/main/org/apache/tools/ant/taskdefs/defaults.properties
+++ b/src/main/org/apache/tools/ant/taskdefs/defaults.properties
@@ -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
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/EchoProperties.java b/src/main/org/apache/tools/ant/taskdefs/optional/EchoProperties.java
new file mode 100644
index 000000000..591e20ef6
--- /dev/null
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/EchoProperties.java
@@ -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
+ * .
+ */
+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.
+ *
+ * Attribute "destfile" defines a file to send the properties to. This can be
+ * processed as a standard property file later.
+ *
+ * Attribute "prefix" defines a prefix which is used to filter the properties
+ * only those properties starting with this prefix will be echoed.
+ *
+ * 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.
+ *
+ * Examples:
+ * <echoproperties />
+ *
Report the current properties to the log.
+ *
+ *
+ * <echoproperties destfile="my.properties" />
+ *
Report the current properties to the file "my.properties", and will
+ * fail the build if the file could not be created or written to.
+ *
+ *
+ * <echoproperties destfile="my.properties" failonerror="false"
+ * prefix="ant" />
+ *
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
+ * groboclown@users.sourceforge.net
+ *@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 true if IO exceptions are reported as build
+ * exceptions, or false 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();
+ }
+ }
+}
+
diff --git a/src/testcases/org/apache/tools/ant/taskdefs/optional/EchoPropertiesTest.java b/src/testcases/org/apache/tools/ant/taskdefs/optional/EchoPropertiesTest.java
new file mode 100644
index 000000000..31081595e
--- /dev/null
+++ b/src/testcases/org/apache/tools/ant/taskdefs/optional/EchoPropertiesTest.java
@@ -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
+ * .
+ */
+
+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 groboclown@users.sourceforge.net
+ * @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 );
+ }
+}
+