You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by David Kavanagh <da...@dotech.com> on 2003/05/26 16:23:06 UTC

copy task addition

I just signed on to contribute something we found useful.

We wanted to filter files based on the project properties. This is 
because we do something like this in the top of our build.xml file;

    <property file="${user.home}/.membership-build.properties" />
    <property file="${user.home}/.build.properties" />
    <property file="${basedir}/.build.properties" />

So, we couldn't use properties pulled from any arbitrary files without 
modifying the copy task. So, what I did was to add a propsFiltering flag 
that uses the project properties as a filter set. Here is the diff of 
the Copy.java file from the 1.5.3-1 src dist. We've used this and it 
works great!

David

74a75
 > import java.util.Iterator;
106a108,110
 >       // DAK: filter from props
 >     protected boolean propsFiltering = false;
 >       // DAK
225a230,238
 >       // DAK: filter from props
 >     /**
 >      * If true, enables props filtering.
 >      */
 >     public void setPropsFiltering(boolean propsFiltering) {
 >         this.propsFiltering = propsFiltering;
 >     }
 >       // DAK
 >
521a535,545
 >                }
 >                // DAK: filter from props
 >                if (propsFiltering) {
 >                    FilterSet props = new FilterSet();
 >                    Hashtable projectProps = getProject().getProperties();
 >                    Iterator iter = projectProps.keySet().iterator();
 >                    while (iter.hasNext()) {
 >                        String name = (String)iter.next();
 >                        props.addFilter(name, 
(String)projectProps.get(name));
 >                    }
 >                    executionFilters.addFilterSet(props);
522a547
 >               // DAK:


Re: copy task addition

Posted by peter reilly <pe...@corvil.com>.
You can use a custom filter or use a reference -
      <filterchain id="filter.props">
        <replaceregex pattern="@([^@]*)@" replace="${\1}" flags="g"/>
        <expandproperties/>
      </filterchain>

<copy ...>
   <filterchain refid="filter.props"/>
</copy>

Peter

On Wednesday 28 May 2003 14:27, David Kavanagh wrote:
> Thanks for trying. The below starts getting a bit verbose in the
> build.xml. All I'm trying to do is use the existing filtering (using the
> <filter> tag) with the project properties. I could easily add another
> mode to the <filter> tag that would make use of the project properties.
> I can understand not wanting to confuse the <filterchain> by building in
> different ways to accomplish the same thing.
> How about I provide for something like this.
> <copy ...>
>     <filter projectprops="true"/>
>      ....
> </copy>
> I could implement this as easily as the other two mechanisms.
>
> David
>
> PS. I hate to seem like I'm stuck on this, but we have 7 projects on a
> tight schedule who use the @token@ in a bunch of files. I'm trying to
> provide a mechanism that we can go foward with that would keep a bunch
> of people from having to switch over our tokenized files.
>
> Magesh Umasankar wrote:
> >oh, ok.  That takes care of David's needs,
> >I would think.
> >
> >Cheers,
> >Magesh
> >
> >----- Original Message -----
>
> From: "peter reilly" <pe...@corvil.com>
>
> >To: "Ant Developers List" <de...@ant.apache.org>
> >Sent: Wednesday, May 28, 2003 7:38 AM
> >Subject: Re: copy task addition
> >
> >
> >I do not think this is a good idea. It will
> >add @property@ to ${property} as a way
> >for dealing with properties.
> >
> >This could be a custom filter or nearly
> >the same behaviour could be achieved by
> >using replaceregex and expandproperties:
> >
> >      <filterchain>
> >        <replaceregex pattern="@([^@]*)@" replace="${\1}" flags="g"/>
> >        <expandproperties/>
> >      </filterchain>
> >
> >(when I fix the bug with regex handling of $)
> >
> >Peter
> >
> >On Wednesday 28 May 2003 12:22, Magesh Umasankar wrote:
> >>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 <da...@dotech.com> 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: dev-unsubscribe@ant.apache.org
> >>For additional commands, e-mail: dev-help@ant.apache.org
> >>
> >>
> >>
> >>
> >>
> >>
> >>/*
> >> * 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 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.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>&lt;filterproperties/&gt;</pre>
> >> * Or:
> >> * <pre>&lt;filterreader
> >
> >classname=&quot;org.apache.tools.ant.filters.FilterProperties&quot;/&gt;</
> >p
> >
> >>r 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: dev-unsubscribe@ant.apache.org
> >>For additional commands, e-mail: dev-help@ant.apache.org
> >>
> >>
> >>---------------------------------------------------------------------
> >>To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
> >>For additional commands, e-mail: dev-help@ant.apache.org
> >
> >---------------------------------------------------------------------
> >To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
> >For additional commands, e-mail: dev-help@ant.apache.org
> >
> >
> >
> >---------------------------------------------------------------------
> >To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
> >For additional commands, e-mail: dev-help@ant.apache.org


Re: copy task addition

Posted by Stefan Bodewig <bo...@apache.org>.
On Wed, 28 May 2003, David Kavanagh <da...@dotech.com> wrote:

> I could easily add another mode to the <filter> tag that would make
> use of the project properties.

Hmm, if you want to explore that road further, you may want to look at
the new propertyset data-type in CVS, something like

<filterset>
  <propertyset builtin="all"/>
</filterset>

could be used for your usecase while the remaining abilities of
propertyset would allow for even more flexibility.

I'm just thinking load.

Stefan

Re: copy task addition

Posted by David Kavanagh <da...@dotech.com>.
Thanks for trying. The below starts getting a bit verbose in the 
build.xml. All I'm trying to do is use the existing filtering (using the 
<filter> tag) with the project properties. I could easily add another 
mode to the <filter> tag that would make use of the project properties. 
I can understand not wanting to confuse the <filterchain> by building in 
different ways to accomplish the same thing.
How about I provide for something like this.
<copy ...>
    <filter projectprops="true"/>
     ....
</copy>
I could implement this as easily as the other two mechanisms.

David

PS. I hate to seem like I'm stuck on this, but we have 7 projects on a 
tight schedule who use the @token@ in a bunch of files. I'm trying to 
provide a mechanism that we can go foward with that would keep a bunch 
of people from having to switch over our tokenized files.

Magesh Umasankar wrote:

>oh, ok.  That takes care of David's needs,
>I would think.
>
>Cheers,
>Magesh
>
>----- Original Message -----
>From: "peter reilly" <pe...@corvil.com>
>To: "Ant Developers List" <de...@ant.apache.org>
>Sent: Wednesday, May 28, 2003 7:38 AM
>Subject: Re: copy task addition
>
>
>I do not think this is a good idea. It will
>add @property@ to ${property} as a way
>for dealing with properties.
>
>This could be a custom filter or nearly
>the same behaviour could be achieved by
>using replaceregex and expandproperties:
>
>      <filterchain>
>        <replaceregex pattern="@([^@]*)@" replace="${\1}" flags="g"/>
>        <expandproperties/>
>      </filterchain>
>
>(when I fix the bug with regex handling of $)
>
>Peter
>
>On Wednesday 28 May 2003 12:22, Magesh Umasankar wrote:
>  
>
>>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 <da...@dotech.com> 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: dev-unsubscribe@ant.apache.org
>>For additional commands, e-mail: dev-help@ant.apache.org
>>
>>
>>
>>
>>
>>
>>/*
>> * 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 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.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>&lt;filterproperties/&gt;</pre>
>> * Or:
>> * <pre>&lt;filterreader
>>
>>    
>>
>classname=&quot;org.apache.tools.ant.filters.FilterProperties&quot;/&gt;</p
>  
>
>>r 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: dev-unsubscribe@ant.apache.org
>>For additional commands, e-mail: dev-help@ant.apache.org
>>
>>
>>---------------------------------------------------------------------
>>To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
>>For additional commands, e-mail: dev-help@ant.apache.org
>>    
>>
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
>For additional commands, e-mail: dev-help@ant.apache.org
>
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
>For additional commands, e-mail: dev-help@ant.apache.org
>  
>


Re: copy task addition

Posted by Magesh Umasankar <um...@apache.org>.
oh, ok.  That takes care of David's needs,
I would think.

Cheers,
Magesh

----- Original Message -----
From: "peter reilly" <pe...@corvil.com>
To: "Ant Developers List" <de...@ant.apache.org>
Sent: Wednesday, May 28, 2003 7:38 AM
Subject: Re: copy task addition


I do not think this is a good idea. It will
add @property@ to ${property} as a way
for dealing with properties.

This could be a custom filter or nearly
the same behaviour could be achieved by
using replaceregex and expandproperties:

      <filterchain>
        <replaceregex pattern="@([^@]*)@" replace="${\1}" flags="g"/>
        <expandproperties/>
      </filterchain>

(when I fix the bug with regex handling of $)

Peter

On Wednesday 28 May 2003 12:22, Magesh Umasankar wrote:
> 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 <da...@dotech.com> 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: dev-unsubscribe@ant.apache.org
> For additional commands, e-mail: dev-help@ant.apache.org
>
>
>
>
>
>
> /*
>  * 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 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.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>&lt;filterproperties/&gt;</pre>
>  * Or:
>  * <pre>&lt;filterreader
>
classname=&quot;org.apache.tools.ant.filters.FilterProperties&quot;/&gt;</p
>r 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: dev-unsubscribe@ant.apache.org
> For additional commands, e-mail: dev-help@ant.apache.org
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
> For additional commands, e-mail: dev-help@ant.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org



Re: copy task addition

Posted by peter reilly <pe...@corvil.com>.
I do not think this is a good idea. It will
add @property@ to ${property} as a way
for dealing with properties.

This could be a custom filter or nearly
the same behaviour could be achieved by
using replaceregex and expandproperties:

      <filterchain>
        <replaceregex pattern="@([^@]*)@" replace="${\1}" flags="g"/>
        <expandproperties/>
      </filterchain>

(when I fix the bug with regex handling of $)

Peter

On Wednesday 28 May 2003 12:22, Magesh Umasankar wrote:
> 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 <da...@dotech.com> 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: dev-unsubscribe@ant.apache.org
> For additional commands, e-mail: dev-help@ant.apache.org
>
>
>
>
>
>
> /*
>  * 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 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.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>&lt;filterproperties/&gt;</pre>
>  * Or:
>  * <pre>&lt;filterreader
> classname=&quot;org.apache.tools.ant.filters.FilterProperties&quot;/&gt;</p
>r 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: dev-unsubscribe@ant.apache.org
> For additional commands, e-mail: dev-help@ant.apache.org
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
> For additional commands, e-mail: dev-help@ant.apache.org


Re: copy task addition

Posted by Magesh Umasankar <um...@apache.org>.
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 <da...@dotech.com> 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: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org






/*
 * 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 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.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>&lt;filterproperties/&gt;</pre>
 * Or:
 * <pre>&lt;filterreader
classname=&quot;org.apache.tools.ant.filters.FilterProperties&quot;/&gt;</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: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org


Re: copy task addition

Posted by David Kavanagh <da...@dotech.com>.
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 <da...@dotech.com> 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: dev-unsubscribe@ant.apache.org
>For additional commands, e-mail: dev-help@ant.apache.org
>  
>


Re: copy task addition

Posted by Stefan Bodewig <bo...@apache.org>.
On Tue, 27 May 2003, David Kavanagh <da...@dotech.com> 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

Re: copy task addition

Posted by David Kavanagh <da...@dotech.com>.
Conor,
I was hoping you were right. I followed the docs on how to use the 
filterchain in my copy task and I can't get those values to be replaced. 
I even tried defining a property inside my build.xml file and that 
didn't get picked up either.
My stuff must function differently, but I can see that implementing it 
as a filterchain option would be better than the attribute I chose to use.

Here is my copy task... I did it properly, right?

      <copy toDir="${classes}" file="cocoon/WEB-INF/jrules.properties" 
overwrite="true" filtering="true">
            <filterchain>
                <expandproperties/>
            </filterchain>
        </copy>


David

Conor MacNeill wrote:

>On Tue, 27 May 2003 12:23 am, David Kavanagh wrote:
>  
>
>>I just signed on to contribute something we found useful.
>>
>>We wanted to filter files based on the project properties. This is
>>because we do something like this in the top of our build.xml file;
>>
>>    <property file="${user.home}/.membership-build.properties" />
>>    <property file="${user.home}/.build.properties" />
>>    <property file="${basedir}/.build.properties" />
>>
>>So, we couldn't use properties pulled from any arbitrary files without
>>modifying the copy task. So, what I did was to add a propsFiltering flag
>>that uses the project properties as a filter set. Here is the diff of
>>the Copy.java file from the 1.5.3-1 src dist. We've used this and it
>>works great!
>>
>>    
>>
>
>Can't you use a filterchain?
>
>  <filterchain>
>    <expandproperties/>
>  </filterchain>
>
>Conor
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
>For additional commands, e-mail: dev-help@ant.apache.org
>  
>


Re: copy task addition

Posted by Conor MacNeill <co...@cortexebusiness.com.au>.
On Tue, 27 May 2003 12:23 am, David Kavanagh wrote:
> I just signed on to contribute something we found useful.
>
> We wanted to filter files based on the project properties. This is
> because we do something like this in the top of our build.xml file;
>
>     <property file="${user.home}/.membership-build.properties" />
>     <property file="${user.home}/.build.properties" />
>     <property file="${basedir}/.build.properties" />
>
> So, we couldn't use properties pulled from any arbitrary files without
> modifying the copy task. So, what I did was to add a propsFiltering flag
> that uses the project properties as a filter set. Here is the diff of
> the Copy.java file from the 1.5.3-1 src dist. We've used this and it
> works great!
>

Can't you use a filterchain?

  <filterchain>
    <expandproperties/>
  </filterchain>

Conor