I will take a look at commiting it in the next few days...
----- Original Message -----
From: David Kavanagh
To: Ant Developers List
Sent: Wednesday, May 28, 2003 1:52 AM
Subject: Re: copy task addition
OK, so I made a FilterProperties class that does the token filtering like I
wanted. I've attached the code for that class and the diff for the
FilterChain.java file.
In the <copy> task, you can now use
<filterchain>
<filterproperties/>
</filterchain>
and filter for tokens of the form @token@ based on the project properties.
As a refresher, I needed this because I wanted to read properties from
${user.dir} and ${base.dir} and use the same @token@ notation.
What's the chance this could be added to the next release. It is pretty
harmless.
David
Stefan Bodewig wrote:
On Tue, 27 May 2003, David Kavanagh <[EMAIL PROTECTED]> wrote:
My stuff must function differently,
<expandproperties/> will replace ${foo} style constructs while you
need to replace @foo@ IIUC.
but I can see that implementing it as a filterchain option would be
better than the attribute I chose to use.
Yes, I think so.
Stefan
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 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 "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 [EMAIL PROTECTED]
*
* 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.filters;
import java.io.IOException;
import java.io.Reader;
import java.util.Iterator;
import java.util.Hashtable;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.FilterSet;
/**
* Expands Ant properties, if any, in the data. Derived from
ExpandProperties,
* but uses FilterSet token ('@').
* <p>
* Example:<br>
* <pre><filterproperties/></pre>
* Or:
* <pre><filterreader
classname="org.apache.tools.ant.filters.FilterProperties"/></pr
e>
*
* @author David Kavanagh
* @author Magesh Umasankar
*/
public final class FilterProperties
extends BaseFilterReader
implements ChainableReader {
/** Data that must be read from, if not null. */
private String queuedData = null;
private FilterSet props;
private boolean inited = false;
/**
* Constructor for "dummy" instances.
*
* @see BaseFilterReader#BaseFilterReader()
*/
public FilterProperties() {
super();
}
/**
* Creates a new filtered reader.
*
* @param in A Reader object providing the underlying stream.
* Must not be <code>null</code>.
*/
public FilterProperties(final Reader in) {
super(in);
}
/**
* Returns the next character in the filtered stream. The original
* stream is first read in fully, and the Ant properties are expanded.
* The results of this expansion are then queued so they can be read
* character-by-character.
*
* @return the next character in the resulting stream, or -1
* if the end of the resulting stream has been reached
*
* @exception IOException if the underlying stream throws an IOException
* during reading
*/
public final int read() throws IOException {
if (!inited)
init();
int ch = -1;
if (queuedData != null && queuedData.length() == 0) {
queuedData = null;
}
if (queuedData != null) {
ch = queuedData.charAt(0);
queuedData = queuedData.substring(1);
if (queuedData.length() == 0) {
queuedData = null;
}
} else {
queuedData = readFully();
if (queuedData == null) {
ch = -1;
} else {
queuedData = props.replaceTokens(queuedData);
return read();
}
}
return ch;
}
/**
* Creates a new FilterProperties filter using the passed in
* Reader for instantiation.
*
* @param rdr A Reader object providing the underlying stream.
* Must not be <code>null</code>.
*
* @return a new filter based on this configuration, but filtering
* the specified reader
*/
public final Reader chain(final Reader rdr) {
FilterProperties newFilter = new FilterProperties(rdr);
newFilter.setProject(getProject());
return newFilter;
}
/**
* Sets up a filter set based on project properties.
*/
private void init() {
synchronized(this) {
this.props = new FilterSet();
Hashtable projectProps = getProject().getProperties();
Iterator iter = projectProps.keySet().iterator();
while (iter.hasNext()) {
String name = (String)iter.next();
this.props.addFilter(name, (String)projectProps.get(name));
}
this.inited = true;
}
}
}
*** FilterChain.java.orig Wed May 28 01:25:08 2003
--- FilterChain.java Wed May 28 01:25:34 2003
***************
*** 58,63 ****
--- 58,64 ----
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.filters.ClassConstants;
import org.apache.tools.ant.filters.ExpandProperties;
+ import org.apache.tools.ant.filters.FilterProperties;
import org.apache.tools.ant.filters.HeadFilter;
import org.apache.tools.ant.filters.LineContains;
import org.apache.tools.ant.filters.LineContainsRegExp;
***************
*** 94,99 ****
--- 95,104 ----
filterReaders.addElement(expandProperties);
}
+ public final void addFilterProperties(final FilterProperties
filterProperties) {
+ filterReaders.addElement(filterProperties);
+ }
+
public final void addHeadFilter(final HeadFilter headFilter) {
filterReaders.addElement(headFilter);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]