Browse Source

Promote Filter Reader proposal to main trunk.

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271759 13f79535-47bb-0310-9956-ffa450edef68
master
Magesh Umasankar 23 years ago
parent
commit
f9c551b16e
40 changed files with 4207 additions and 174 deletions
  1. +10
    -0
      WHATSNEW
  2. +2
    -0
      build.xml
  3. +15
    -35
      docs/manual/CoreTasks/loadfile.html
  4. +59
    -0
      docs/manual/CoreTasks/loadproperties.html
  5. +1
    -0
      docs/manual/conceptstypeslist.html
  6. +1
    -0
      docs/manual/coretasklist.html
  7. +11
    -0
      src/etc/testcases/taskdefs/copy.xml
  8. +37
    -8
      src/etc/testcases/taskdefs/loadfile.xml
  9. +12
    -0
      src/etc/testcases/taskdefs/move.xml
  10. +207
    -0
      src/main/org/apache/tools/ant/filters/BaseFilterReader.java
  11. +106
    -0
      src/main/org/apache/tools/ant/filters/BaseParamFilterReader.java
  12. +65
    -0
      src/main/org/apache/tools/ant/filters/ChainableReader.java
  13. +187
    -0
      src/main/org/apache/tools/ant/filters/ClassConstants.java
  14. +140
    -0
      src/main/org/apache/tools/ant/filters/ExpandProperties.java
  15. +171
    -0
      src/main/org/apache/tools/ant/filters/HeadFilter.java
  16. +225
    -0
      src/main/org/apache/tools/ant/filters/LineContains.java
  17. +208
    -0
      src/main/org/apache/tools/ant/filters/LineContainsRegExp.java
  18. +183
    -0
      src/main/org/apache/tools/ant/filters/PrefixLines.java
  19. +299
    -0
      src/main/org/apache/tools/ant/filters/ReplaceTokens.java
  20. +115
    -0
      src/main/org/apache/tools/ant/filters/StringInputStream.java
  21. +150
    -0
      src/main/org/apache/tools/ant/filters/StripJavaComments.java
  22. +176
    -0
      src/main/org/apache/tools/ant/filters/StripLineBreaks.java
  23. +227
    -0
      src/main/org/apache/tools/ant/filters/StripLineComments.java
  24. +178
    -0
      src/main/org/apache/tools/ant/filters/TabsToSpaces.java
  25. +218
    -0
      src/main/org/apache/tools/ant/filters/TailFilter.java
  26. +234
    -0
      src/main/org/apache/tools/ant/filters/util/ChainReaderHelper.java
  27. +103
    -0
      src/main/org/apache/tools/ant/filters/util/JavaClassHelper.java
  28. +23
    -3
      src/main/org/apache/tools/ant/taskdefs/Copy.java
  29. +42
    -70
      src/main/org/apache/tools/ant/taskdefs/LoadFile.java
  30. +180
    -0
      src/main/org/apache/tools/ant/taskdefs/LoadProperties.java
  31. +7
    -4
      src/main/org/apache/tools/ant/taskdefs/Move.java
  32. +1
    -0
      src/main/org/apache/tools/ant/taskdefs/defaults.properties
  33. +141
    -0
      src/main/org/apache/tools/ant/types/AntFilterReader.java
  34. +139
    -0
      src/main/org/apache/tools/ant/types/FilterChain.java
  35. +89
    -0
      src/main/org/apache/tools/ant/types/Parameter.java
  36. +65
    -0
      src/main/org/apache/tools/ant/types/Parameterizable.java
  37. +139
    -39
      src/main/org/apache/tools/ant/util/FileUtils.java
  38. +17
    -10
      src/testcases/org/apache/tools/ant/taskdefs/CopyTest.java
  39. +14
    -4
      src/testcases/org/apache/tools/ant/taskdefs/LoadFileTest.java
  40. +10
    -1
      src/testcases/org/apache/tools/ant/taskdefs/MoveTest.java

+ 10
- 0
WHATSNEW View File

@@ -77,6 +77,16 @@ Fixed bugs:


Other changes: Other changes:
-------------- --------------
* New filter readers: ClassConstants, ExpandProperties, HeadFilter,
LineContains, LineContainsRegExp, PrefixLines, ReplaceTokens,
StripJavaComments, StripLineBreaks, StripLineComments, TabsToSpaces,
TailFilter.

* <copy>, <loadfile>, <loadproperties>, <move> support FilterChains
of FilterReaders.
* New task <loadproperties> to load contents of file as Ant properties.
* Users can control what <zip> and <jar> must do when duplicate files * Users can control what <zip> and <jar> must do when duplicate files
are found. A new element <zipgroupfileset> allows for multiple zip are found. A new element <zipgroupfileset> allows for multiple zip
files to be merged into the archive. In addition, <jar> also has files to be merged into the archive. In addition, <jar> also has


+ 2
- 0
build.xml View File

@@ -208,6 +208,8 @@
unless="jakarta.oro.present"/> unless="jakarta.oro.present"/>
</patternset> </patternset>
<patternset id="needs.jakarta.bcel"> <patternset id="needs.jakarta.bcel">
<exclude name="${ant.package}/filters/util/JavaClassHelper.java"
unless="bcel.present" />
<exclude name="${optional.type.package}/depend/*.java" <exclude name="${optional.type.package}/depend/*.java"
unless="bcel.present" /> unless="bcel.present" />
<exclude name="${util.package}/depend/*.java" <exclude name="${util.package}/depend/*.java"


+ 15
- 35
docs/manual/CoreTasks/loadfile.html View File

@@ -10,10 +10,7 @@
<h3>Description</h3> <h3>Description</h3>
<p> <p>
Load a text file into a single property. Unless an encoding is specified, Load a text file into a single property. Unless an encoding is specified,
the encoding of the current locale is used. There is no explicit limit
upon the size of the file which can be loaded, but loading very large
files is not something anyone has yet explored. Because the file is
converted to text
the encoding of the current locale is used.


</p> </p>


@@ -44,40 +41,21 @@
<td valign="top">Whether to halt the build on failure</td> <td valign="top">Whether to halt the build on failure</td>
<td align="center" valign="top">No, default "true"</td> <td align="center" valign="top">No, default "true"</td>
</tr> </tr>
<tr>
<td valign="top">evaluateProperties</td>
<td valign="top">flag to enable property evalation in the file</td>
<td align="center" valign="top">No, default "false"</td>
</tr>
<tr>
<td valign="top">makeOneLine</td>
<td valign="top">flag to strip out newlines (but not spaces or
tabs) from the file</td>
<td align="center" valign="top">No, default "false"</td>
</tr>
</table> </table>
<p> <p>
The <tt>makeOneLine</tt> parameter enables you to use a file as an
input to task parameters which expect single line input. It flattens
the file by removing all carriage return and line feed characters,
so that the file
<pre>a
b
c
</pre>would become "abc": you need spaces or
commas at the end/start of line to stop alphanumeric characters
being merged together.
The LoadFile task supports nested <a href="../CoreTypes/filterchain.html">
FilterChain</a>s.


<h3>Examples</h3> <h3>Examples</h3>
<pre> &lt;loadfile property="message" <pre> &lt;loadfile property="message"
srcFile="message.txt" / &gt;
srcFile="message.txt" /&gt;
</pre> </pre>
Load file message.txt into property "message"; an <tt>&lt;echo&gt;</tt> Load file message.txt into property "message"; an <tt>&lt;echo&gt;</tt>
can print this. can print this.


<pre> &lt;loadfile property="encoded-file" <pre> &lt;loadfile property="encoded-file"
srcFile="loadfile.xml" srcFile="loadfile.xml"
encoding="ISO-8859-1" / &gt;
encoding="ISO-8859-1" /&gt;
</pre> </pre>
Load a file using the latin-1 encoding Load a file using the latin-1 encoding


@@ -90,20 +68,22 @@ Load a file, don't fail if it is missing (a message is printed, though)


<pre> &lt;loadfile <pre> &lt;loadfile
property="mail.recipients" property="mail.recipients"
srcFile="recipientlist.txt"
makeOneLine="true" /&gt;
srcFile="recipientlist.txt"&gt;
&lt;filterchain&gt;
&lt;<a href="../CoreTypes/filterchain.html#striplinebreaks">striplinebreaks</a>/&gt;
&lt;/filterchaint&gt;
&lt;/loadfile&gt;
</pre> </pre>

load a property which can be used as a parameter for another task (in this case mail),
Load a property which can be used as a parameter for another task (in this case mail),
merging lines to ensure this happens. merging lines to ensure this happens.


<pre> &lt;loadfile <pre> &lt;loadfile
property="system.configuration.xml" property="system.configuration.xml"
srcFile="configuration.xml"
evaluateProperties="true" /&gt;
srcFile="configuration.xml"&gt;
&lt;<a href="../CoreTypes/filterchain.html#expandproperties">expandproperties</a>/&gt;
&lt;/loadfile&gt;
</pre> </pre>

load an XML file into a property, expanding all properties declared
Load an XML file into a property, expanding all properties declared
in the file in the process. in the file in the process.






+ 59
- 0
docs/manual/CoreTasks/loadproperties.html View File

@@ -0,0 +1,59 @@
<html>
<head>
<title>LoadProperties Task</title>
</head>

<body>


<h2><a name="loadproperties">LoadProperties</a></h2>
<h3>Description</h3>
<p>
Load a file's contents as Ant properties. This is equivalent
to &lt;property file=&quot;...&quot;/&gt; except that it
supports nested &lt;filterchain&gt; elements and it cannot be
specified outside a target.

</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">srcFile</td>
<td valign="top">source file</td>
<td valign="top" align="center">Yes</td>
</tr>
</table>
<p>
The LoadProperties task supports nested <a href="../CoreTypes/filterchain.html">
FilterChain</a>s.

<h3>Examples</h3>
<pre> &lt;loadproperties srcFile="file.properties" /&gt;
</pre>
Load contents of file.properties as Ant properties.

<pre> &lt;loadproperties srcFile="file.properties"&gt;
&lt;filterchain&gt;
&lt;<a href="../CoreTypes/filterchain.html#linecontains">linecontains</a>&gt;
&lt;contains value="import.&quot;/&gt;
&lt;linecontains/&gt;
&lt;/filterchaint&gt;
&lt;/loadproperties&gt;
</pre>
Read the lines that contain the string &quot;import.&quot;
from the file &quot;file.properties&quot; and load them as
Ant properties.
<hr>

<p align="center">Copyright &copy; 2002 Apache Software Foundation. All rights
Reserved.</p>

</body>
</html>


+ 1
- 0
docs/manual/conceptstypeslist.html View File

@@ -18,6 +18,7 @@
<a href="CoreTypes/filelist.html">FileList</a><br> <a href="CoreTypes/filelist.html">FileList</a><br>
<a href="CoreTypes/fileset.html">FileSet</a><br> <a href="CoreTypes/fileset.html">FileSet</a><br>
<a href="CoreTypes/mapper.html">File Mappers</a><br> <a href="CoreTypes/mapper.html">File Mappers</a><br>
<a href="CoreTypes/filterchain.html">FilterChains and FilterReaders</a><br>
<a href="CoreTypes/filterset.html">Filterset</a><br> <a href="CoreTypes/filterset.html">Filterset</a><br>
<a href="CoreTypes/patternset.html">Patternset</a><br> <a href="CoreTypes/patternset.html">Patternset</a><br>




+ 1
- 0
docs/manual/coretasklist.html View File

@@ -48,6 +48,7 @@
<a href="CoreTasks/javac.html">Javac</a><br> <a href="CoreTasks/javac.html">Javac</a><br>
<a href="CoreTasks/javadoc.html">Javadoc/<i>Javadoc2</i></a><br> <a href="CoreTasks/javadoc.html">Javadoc/<i>Javadoc2</i></a><br>
<a href="CoreTasks/loadfile.html">LoadFile</a><br> <a href="CoreTasks/loadfile.html">LoadFile</a><br>
<a href="CoreTasks/loadproperties.html">LoadProperties</a><br>
<a href="CoreTasks/mail.html">Mail</a><br> <a href="CoreTasks/mail.html">Mail</a><br>
<a href="CoreTasks/manifest.html">Manifest</a><br> <a href="CoreTasks/manifest.html">Manifest</a><br>
<a href="CoreTasks/mkdir.html">Mkdir</a><br> <a href="CoreTasks/mkdir.html">Mkdir</a><br>


+ 11
- 0
src/etc/testcases/taskdefs/copy.xml View File

@@ -52,6 +52,16 @@
</copy> </copy>
</target> </target>


<target name="testFilterChain">
<copy file="copy.filterset" tofile="copy.filterchain.tmp">
<filterchain>
<replacetokens>
<token key="TITLE" value="Apache Ant Project"/>
</replacetokens>
</filterchain>
</copy>
</target>

<target name="cleanup"> <target name="cleanup">
<delete file="copytest1.tmp"/> <delete file="copytest1.tmp"/>
<delete file="copytest3.tmp"/> <delete file="copytest3.tmp"/>
@@ -60,6 +70,7 @@
<delete file="copytest3c.tmp"/> <delete file="copytest3c.tmp"/>
<delete file="copytest_single_file_fileset.tmp"/> <delete file="copytest_single_file_fileset.tmp"/>
<delete file="copy.filterset.tmp"/> <delete file="copy.filterset.tmp"/>
<delete file="copy.filterchain.tmp"/>
<delete dir="copytest1dir"/> <delete dir="copytest1dir"/>
</target> </target>




+ 37
- 8
src/etc/testcases/taskdefs/loadfile.xml View File

@@ -53,12 +53,39 @@
file="loadfile1.tmp" file="loadfile1.tmp"
/> />
<loadfile property="testEvalProps" <loadfile property="testEvalProps"
srcFile="loadfile1.tmp"
evaluateProperties="true"
/>
<echo>${testLoadAFile}</echo>
srcFile="loadfile1.tmp">
<filterchain>
<expandproperties/>
</filterchain>
</loadfile>
<echo>${testEvalProps}</echo>
</target> </target>


<target name="testFilterChain"
depends="init">
<echo file="loadfile1.tmp">#Line 1
REM Line 2
--Line 3
Line 4
Hello World!</echo>
<loadfile srcFile="loadfile1.tmp"
property="testFilterChain">
<filterchain>
<headfilter lines="5"/>
<striplinecomments>
<comment value="--"/>
<comment value="REM "/>
<comment value="#"/>
</striplinecomments>
<filterreader classname="org.apache.tools.ant.filters.TailFilter">
<param name="lines" value="1"/>
</filterreader>
<linecontains>
<contains value="World!"/>
</linecontains>
</filterchain>
</loadfile>
</target>


<target name="testOneLine" <target name="testOneLine"
depends="init"> depends="init">
@@ -67,10 +94,12 @@
file="loadfile1.tmp" file="loadfile1.tmp"
/> />
<loadfile property="testOneLine" <loadfile property="testOneLine"
srcFile="loadfile1.tmp"
makeOneLine="true"
/>
<echo>${testLoadAFile}</echo>
srcFile="loadfile1.tmp">
<filterchain>
<striplinebreaks/>
</filterchain>
</loadfile>
<echo>${testOneLine}</echo>
</target> </target>






+ 12
- 0
src/etc/testcases/taskdefs/move.xml View File

@@ -11,8 +11,20 @@
</move> </move>
</target> </target>


<target name="testFilterChain">
<copy file="copy.filterset" tofile="move.filterchain"/>
<move file="move.filterchain" tofile="move.filterchain.tmp">
<filterchain>
<replacetokens>
<token key="TITLE" value="Apache Ant Project"/>
</replacetokens>
</filterchain>
</move>
</target>

<target name="cleanup"> <target name="cleanup">
<delete file="move.filterset.tmp"/> <delete file="move.filterset.tmp"/>
<delete file="move.filterchain.tmp"/>
</target> </target>


</project> </project>

+ 207
- 0
src/main/org/apache/tools/ant/filters/BaseFilterReader.java View File

@@ -0,0 +1,207 @@
/*
* 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 "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.filters;

import java.io.FilterReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

import org.apache.tools.ant.Project;
import org.apache.tools.ant.util.FileUtils;

/**
* Base class for core filter readers.
*
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
*/
public abstract class BaseFilterReader
extends FilterReader
{
/** Have the parameters passed been interpreted? */
private boolean initialized = false;

/** The Ant project */
private Project project = null;

/**
* This constructor is a dummy constructor and is
* not meant to be used by any class other than Ant's
* introspection mechanism. This will close the filter
* that is created making it useless for further operations.
*/
public BaseFilterReader() {
// Dummy constructor to be invoked by Ant's Introspector
super(new StringReader(new String()));
try {
close();
} catch (IOException ioe) {
// Ignore
}
}

/**
* Create a new filtered reader.
*
* @param in a Reader object providing the underlying stream.
*/
public BaseFilterReader(final Reader in) {
super(in);
}

/**
* Read characters into a portion of an array. This method will block
* until some input is available, an I/O error occurs, or the end of the
* stream is reached.
*
* @param cbuf Destination buffer
* @param off Offset at which to start storing characters
* @param len Maximum number of characters to read
*
* @return The number of characters read, or -1 if the end of the
* stream has been reached
*
* @exception IOException If an I/O error occurs
*/
public final int read(final char cbuf[], final int off,
final int len) throws IOException {
for (int i = 0; i < len; i++) {
final int ch = read();
if (ch == -1) {
if (i == 0) {
return -1;
} else {
return i;
}
}
cbuf[off + i] = (char) ch;
}
return len;
}

/**
* Skip characters. This method will block until some characters are
* available, an I/O error occurs, or the end of the stream is reached.
*
* @param n The number of characters to skip
*
* @return The number of characters actually skipped
*
* @exception IllegalArgumentException If <code>n</code> is negative.
* @exception IOException If an I/O error occurs
*/
public final long skip(final long n) throws IOException {
if (n < 0L) {
throw new IllegalArgumentException("skip value is negative");
}

for (long i = 0; i < n; i++) {
if (read() == -1) {
return i;
}
}
return n;
}

/**
* Set the initialized status.
*/
protected final void setInitialized(final boolean initialized) {
this.initialized = initialized;
}

/**
* Get the initialized status.
*/
protected final boolean getInitialized() {
return initialized;
}

/**
* Set the project to work with
*/
public final void setProject(final Project project) {
this.project = project;
}

/**
* Get the project
*/
protected final Project getProject() {
return project;
}

/**
* Read till EOL
*/
protected final String readLine() throws IOException {
int ch = in.read();
String line = (ch == -1) ? null : "";
while (ch != -1) {
line += (char) ch;
if (ch == '\n') {
break;
}
ch = in.read();
}
return line;
}

/**
* Read till EOF
*/
protected final String readFully() throws IOException {
return FileUtils.readFully(in, 8192);
}
}

+ 106
- 0
src/main/org/apache/tools/ant/filters/BaseParamFilterReader.java View File

@@ -0,0 +1,106 @@
/*
* 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 "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.filters;

import java.io.FilterReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

import org.apache.tools.ant.types.Parameter;
import org.apache.tools.ant.types.Parameterizable;

/**
* Parameterized Base class for core filter readers.
*
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
*/
public abstract class BaseParamFilterReader
extends BaseFilterReader
implements Parameterizable
{
/** The passed in parameter array. */
private Parameter[] parameters;

/**
* This constructor is a dummy constructor and is
* not meant to be used by any class other than Ant's
* introspection mechanism. This will close the filter
* that is created making it useless for further operations.
*/
public BaseParamFilterReader() {
super();
}

/**
* Create a new filtered reader.
*
* @param in a Reader object providing the underlying stream.
*/
public BaseParamFilterReader(final Reader in) {
super(in);
}

/**
* Set Parameters
*/
public final void setParameters(final Parameter[] parameters) {
this.parameters = parameters;
setInitialized(false);
}

protected final Parameter[] getParameters() {
return parameters;
}
}

+ 65
- 0
src/main/org/apache/tools/ant/filters/ChainableReader.java View File

@@ -0,0 +1,65 @@
/*
* 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 "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.filters;

import java.io.Reader;

/**
* Chains readers.
*
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
*/
public interface ChainableReader {
public Reader chain(Reader rdr);
}

+ 187
- 0
src/main/org/apache/tools/ant/filters/ClassConstants.java View File

@@ -0,0 +1,187 @@
/*
* 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 "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.filters;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.Reader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.apache.tools.ant.Project;

/**
* Assemble the constants declared in a Java class in
* key1=value1(line separator)key2=value2
* format
*
* Notes:
* =====
* 1. This filter uses the BCEL external toolkit.
* 2. This assembles only those constants that are not created
* using the syntax new whatever().
* 3. This assembles constants declared using the basic datatypes
* and String only.
* 4. The access modifiers of the declared constants do not matter.
*
* Example:
* =======
*
* &lt;classconstants/&gt;
*
* Or:
*
* &lt;filterreader classname=&quot;org.apache.tools.ant.filters.ClassConstants&quot;/&gt;
*
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
*/
public final class ClassConstants
extends BaseFilterReader
implements ChainableReader
{
/** Data that must be read from, if not null. */
private String queuedData = null;

/** Helper Class to be invoked via reflection. */
private String JAVA_CLASS_HELPER =
"org.apache.tools.ant.filters.util.JavaClassHelper";

/**
* This constructor is a dummy constructor and is
* not meant to be used by any class other than Ant's
* introspection mechanism. This will close the filter
* that is created making it useless for further operations.
*/
public ClassConstants() {
super();
}

/**
* Create a new filtered reader.
*
* @param in a Reader object providing the underlying stream.
*/
public ClassConstants(final Reader in) {
super(in);
}

/**
* Read and assemble the constants declared in a class file.
*/
public final int read() throws IOException {

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 {
final String clazz = readFully();
if (clazz == null) {
ch = -1;
} else {
final byte[] bytes = clazz.getBytes();
try {
final Class javaClassHelper =
Class.forName(JAVA_CLASS_HELPER);
if (javaClassHelper != null) {
final Class params[] = {
byte[].class
};
final Method getConstants =
javaClassHelper.getMethod("getConstants", params);
final Object[] args = {
bytes
};
// getConstants is a staic method, no need to
// pass in the object
final StringBuffer sb = (StringBuffer)
getConstants.invoke(null, args);
if (sb.length() > 0) {
queuedData = sb.toString();
return read();
}
}
} catch (ClassNotFoundException cnfe) {
throw new IOException(cnfe.getMessage());
} catch (NoSuchMethodException nsme) {
throw new IOException(nsme.getMessage());
} catch (IllegalAccessException iae) {
throw new IOException(iae.getMessage());
} catch (IllegalArgumentException iarge) {
throw new IOException(iarge.getMessage());
} catch (InvocationTargetException ite) {
throw new IOException(ite.getMessage());
}
}
}
return ch;
}

/**
* Create a new ClassConstants using the passed in
* Reader for instantiation.
*/
public final Reader chain(final Reader rdr) {
ClassConstants newFilter = new ClassConstants(rdr);
return newFilter;
}
}

+ 140
- 0
src/main/org/apache/tools/ant/filters/ExpandProperties.java View File

@@ -0,0 +1,140 @@
/*
* 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 "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.filters;

import java.io.IOException;
import java.io.Reader;

import org.apache.tools.ant.Project;

/**
* Expand Ant properties, if any, in the data.
*
* Example:
* =======
*
* &lt;expandproperties/&gt;
*
* Or:
*
* &lt;filterreader classname=&quot;org.apache.tools.ant.filters.ExpandProperties&quot;/&gt;
*
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
*/
public final class ExpandProperties
extends BaseFilterReader
implements ChainableReader
{
/** Data that must be read from, if not null. */
private String queuedData = null;

/**
* This constructor is a dummy constructor and is
* not meant to be used by any class other than Ant's
* introspection mechanism. This will close the filter
* that is created making it useless for further operations.
*/
public ExpandProperties() {
super();
}

/**
* Create a new filtered reader.
*
* @param in a Reader object providing the underlying stream.
*/
public ExpandProperties(final Reader in) {
super(in);
}

/**
* Prefix lines with user defined prefix.
*/
public final int read() throws IOException {

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 {
Project project = getProject();
queuedData = project.replaceProperties(queuedData);
return read();
}
}
return ch;
}

/**
* Create a new PrefixLines using the passed in
* Reader for instantiation.
*/
public final Reader chain(final Reader rdr) {
ExpandProperties newFilter = new ExpandProperties(rdr);
newFilter.setProject(getProject());
return newFilter;
}
}

+ 171
- 0
src/main/org/apache/tools/ant/filters/HeadFilter.java View File

@@ -0,0 +1,171 @@
/*
* 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 "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.filters;

import java.io.IOException;
import java.io.Reader;

import org.apache.tools.ant.types.Parameter;

/**
* Read the first n lines (Default is first 10 lines)
*
* Example:
* =======
*
* &lt;headfilter lines=&quot;3&quot;/&gt;
*
* Or:
*
* &lt;filterreader classname=&quot;org.apache.tools.ant.filters.HeadFilter&quot;&gt;
* &lt;param name=&quot;lines&quot; value=&quot;3&quot;/&gt;
* &lt;/filterreader&gt;
*
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
*/
public final class HeadFilter
extends BaseParamFilterReader
implements ChainableReader
{
/** Lines key to represent the number of lines to be returned. */
private static final String LINES_KEY = "lines";

/** Number of lines currently read in. */
private long linesRead = 0;

/** Default number of lines returned. */
private long lines = 10;

/**
* This constructor is a dummy constructor and is
* not meant to be used by any class other than Ant's
* introspection mechanism. This will close the filter
* that is created making it useless for further operations.
*/
public HeadFilter() {
super();
}

/**
* Create a new filtered reader.
*
* @param in a Reader object providing the underlying stream.
*/
public HeadFilter(final Reader in) {
super(in);
}

/**
* Read the first n lines.
*/
public final int read() throws IOException {
if (!getInitialized()) {
initialize();
setInitialized(true);
}

int ch = -1;

if (linesRead < lines) {

ch = in.read();

if (ch == '\n') {
linesRead++;
}
}

return ch;
}

/**
* Set number of lines to be returned.
*/
public final void setLines(final long lines) {
this.lines = lines;
}

/**
* Get number of lines to be returned.
*/
private final long getLines() {
return lines;
}

/**
* Create a new HeadFilter using the passed in
* Reader for instantiation.
*/
public final Reader chain(final Reader rdr) {
HeadFilter newFilter = new HeadFilter(rdr);
newFilter.setLines(getLines());
newFilter.setInitialized(true);
return newFilter;
}

/**
* Scan for the lines parameter.
*/
private final void initialize() {
Parameter[] params = getParameters();
if (params != null) {
for (int i = 0; i < params.length; i++) {
if (LINES_KEY.equals(params[i].getName())) {
lines = new Long(params[i].getValue()).longValue();
break;
}
}
}
}
}

+ 225
- 0
src/main/org/apache/tools/ant/filters/LineContains.java View File

@@ -0,0 +1,225 @@
/*
* 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 "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.filters;

import java.io.IOException;
import java.io.Reader;
import java.util.Vector;

import org.apache.tools.ant.types.Parameter;

/**
* Filter Reader to fetch only those lines that contain user specified
* strings.
*
* Example:
* =======
*
* &lt;linecontains&gt;
* &lt;contains value=&quot;foo&quot;&gt;
* &lt;contains value=&quot;bar&quot;&gt;
* &lt;/linecontains&gt;
*
* Or:
*
* &lt;filterreader classname="org.apache.tools.ant.filters.LineContains"&gt;
* &lt;param type="contains" value="foo"/&gt;
* &lt;param type="contains" value="bar"/&gt;
* &lt;/filterreader&gt;
*
* This will fetch all those lines that contain foo and bar
*
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
*/
public final class LineContains
extends BaseParamFilterReader
implements ChainableReader
{
/** contains key */
private static final String CONTAINS_KEY = "contains";

/** Vector that holds the strings that input lines must contain. */
private Vector contains = new Vector();

/** Currently read in line. */
private String line = null;

/**
* This constructor is a dummy constructor and is
* not meant to be used by any class other than Ant's
* introspection mechanism. This will close the filter
* that is created making it useless for further operations.
*/
public LineContains() {
super();
}

/**
* Create a new filtered reader.
*
* @param in a Reader object providing the underlying stream.
*/
public LineContains(final Reader in) {
super(in);
}

/**
* Choose only those lines that contains
* user defined values.
*/
public final int read() throws IOException {
if (!getInitialized()) {
initialize();
setInitialized(true);
}

int ch = -1;

if (line != null) {
ch = line.charAt(0);
if (line.length() == 1) {
line = null;
} else {
line = line.substring(1);
}
} else {
line = readLine();
if (line == null) {
ch = -1;
} else {
int containsSize = contains.size();
for (int i = 0; i < containsSize; i++) {
String containsStr = (String) contains.elementAt(i);
if (line.indexOf(containsStr) == -1) {
line = null;
break;
}
}

return read();
}
}

return ch;
}

/**
* Add a contains element.
*/
public final void addConfiguredContains(final Contains contains) {
this.contains.addElement(contains.getValue());
}

/**
* Set contains vector.
*/
private void setContains(final Vector contains) {
this.contains = contains;
}

/**
* Get contains vector.
*/
private final Vector getContains() {
return contains;
}

/**
* Create a new LineContains using the passed in
* Reader for instantiation.
*/
public final Reader chain(final Reader rdr) {
LineContains newFilter = new LineContains(rdr);
newFilter.setContains(getContains());
newFilter.setInitialized(true);
return newFilter;
}

/**
* Parse params to add user defined contains strings.
*/
private final void initialize() {
Parameter[] params = getParameters();
if (params != null) {
for (int i = 0; i < params.length; i++) {
if (CONTAINS_KEY.equals(params[i].getType())) {
contains.addElement(params[i].getValue());
}
}
}
}

/**
* Holds a contains element
*/
public static class Contains {

/** User defined contains string */
private String value;

/**
* Set the contains string
*/
public final void setValue(String contains) {
value = contains;
}

/**
* Get the contains string
*/
public final String getValue() {
return value;
}
}
}

+ 208
- 0
src/main/org/apache/tools/ant/filters/LineContainsRegExp.java View File

@@ -0,0 +1,208 @@
/*
* 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 "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.filters;

import java.io.IOException;
import java.io.Reader;
import java.util.Vector;

import org.apache.tools.ant.types.Parameter;
import org.apache.tools.ant.types.RegularExpression;
import org.apache.tools.ant.util.regexp.Regexp;

/**
* Filter Reader to fetch only those lines that contain user specified
* regular expression matching strings.
*
* Example:
* =======
*
* &lt;linecontainsregexp&gt;
* &lt;regexp pattern=&quot;foo*&quot;&gt;
* &lt;/linecontainsregexp&gt;
*
* Or:
*
* &lt;filterreader classname=&quot;org.apache.tools.ant.filters.LineContainsRegExp&quot;&gt;
* &lt;param type=&quot;regexp&quot; value=&quot;foo*&quot;/&gt;
* &lt;/filterreader&gt;
*
* This will fetch all those lines that contain the pattern foo
*
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
*/
public final class LineContainsRegExp
extends BaseParamFilterReader
implements ChainableReader
{
/** contains key */
private static final String REGEXP_KEY = "regexp";

/** Vector that holds the strings that input lines must contain. */
private Vector regexps = new Vector();

/** Currently read in line. */
private String line = null;

/**
* This constructor is a dummy constructor and is
* not meant to be used by any class other than Ant's
* introspection mechanism. This will close the filter
* that is created making it useless for further operations.
*/
public LineContainsRegExp() {
super();
}

/**
* Create a new filtered reader.
*
* @param in a Reader object providing the underlying stream.
*/
public LineContainsRegExp(final Reader in) {
super(in);
}

/**
* Choose only those lines that contains
* user defined values.
*/
public final int read() throws IOException {
if (!getInitialized()) {
initialize();
setInitialized(true);
}

int ch = -1;

if (line != null) {
ch = line.charAt(0);
if (line.length() == 1) {
line = null;
} else {
line = line.substring(1);
}
} else {
line = readLine();
if (line == null) {
ch = -1;
} else {
final int regexpsSize = regexps.size();
for (int i = 0; i < regexpsSize; i++) {
RegularExpression regexp = (RegularExpression)
regexps.elementAt(i);
Regexp re = regexp.getRegexp(getProject());
boolean matches = re.matches(line);
if (!matches) {
line = null;
break;
}
}

return read();
}
}

return ch;
}

/**
* Add a contains element.
*/
public final void addConfiguredRegexp(final RegularExpression regExp) {
this.regexps.addElement(regExp);
}

/**
* Set regexps vector.
*/
private void setRegexps(final Vector regexps) {
this.regexps = regexps;
}

/**
* Get regexps vector.
*/
private final Vector getRegexps() {
return regexps;
}

/**
* Create a new LineContainsRegExp using the passed in
* Reader for instantiation.
*/
public final Reader chain(final Reader rdr) {
LineContainsRegExp newFilter = new LineContainsRegExp(rdr);
newFilter.setRegexps(getRegexps());
newFilter.setInitialized(true);
return newFilter;
}

/**
* Parse params to add user defined contains strings.
*/
private final void initialize() {
Parameter[] params = getParameters();
if (params != null) {
for (int i = 0; i < params.length; i++) {
if (REGEXP_KEY.equals(params[i].getType())) {
String pattern = params[i].getValue();
RegularExpression regexp = new RegularExpression();
regexp.setPattern(pattern);
regexps.addElement(regexp);
}
}
}
}
}

+ 183
- 0
src/main/org/apache/tools/ant/filters/PrefixLines.java View File

@@ -0,0 +1,183 @@
/*
* 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 "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.filters;

import java.io.IOException;
import java.io.Reader;

import org.apache.tools.ant.types.Parameter;

/**
* Attach a prefix to every line
*
* Example:
* =======
*
* &lt;prefixlines prefix=&quot;Foo&quot;/&gt;
*
* Or:
*
* &lt;filterreader classname=&quot;org.apache.tools.ant.filters.PrefixLines&quot;&gt;
* &lt;param name=&quot;prefix&quot; value=&quot;Foo&quot;/&gt;
* &lt;/filterreader&gt;
*
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
*/
public final class PrefixLines
extends BaseParamFilterReader
implements ChainableReader
{
/** prefix key */
private static final String PREFIX_KEY = "prefix";

/** The prefix to be used. */
private String prefix = null;

/** Data that must be read from, if not null. */
private String queuedData = null;

/**
* This constructor is a dummy constructor and is
* not meant to be used by any class other than Ant's
* introspection mechanism. This will close the filter
* that is created making it useless for further operations.
*/
public PrefixLines() {
super();
}

/**
* Create a new filtered reader.
*
* @param in a Reader object providing the underlying stream.
*/
public PrefixLines(final Reader in) {
super(in);
}

/**
* Prefix lines with user defined prefix.
*/
public final int read() throws IOException {
if (!getInitialized()) {
initialize();
setInitialized(true);
}

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 = readLine();
if (queuedData == null) {
ch = -1;
} else {
if (prefix != null) {
queuedData = prefix + queuedData;
}
return read();
}
}
return ch;
}

/**
* Set the prefix
*/
public final void setPrefix(final String prefix) {
this.prefix = prefix;
}

/**
* Get the prefix
*/
private final String getPrefix() {
return prefix;
}

/**
* Create a new PrefixLines using the passed in
* Reader for instantiation.
*/
public final Reader chain(final Reader rdr) {
PrefixLines newFilter = new PrefixLines(rdr);
newFilter.setPrefix(getPrefix());
newFilter.setInitialized(true);
return newFilter;
}

/**
* Initialize prefix if available from the param element.
*/
private final void initialize() {
Parameter[] params = getParameters();
if (params != null) {
for (int i = 0; i < params.length; i++) {
if (PREFIX_KEY.equals(params[i].getName())) {
prefix = params[i].getValue();
break;
}
}
}
}
}

+ 299
- 0
src/main/org/apache/tools/ant/filters/ReplaceTokens.java View File

@@ -0,0 +1,299 @@
/*
* 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 "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.filters;

import java.io.IOException;
import java.io.Reader;
import java.util.Hashtable;

import org.apache.tools.ant.types.Parameter;

/**
* Replace tokens with user supplied values
*
* Example Usage:
* =============
*
* &lt;replacetokens begintoken=&quot;#&quot; endtoken=&quot;#&quot;&gt;
* &lt;token key=&quot;DATE&quot; value=&quot;${TODAY}&quot;/&gt;
* &lt;/replacetokens&gt;
*
* Or:
*
* &lt;filterreader classname="org.apache.tools.ant.filters.ReplaceTokens"&gt;
* &lt;param type="tokenchar" name="begintoken" value="#"/&gt;
* &lt;param type="tokenchar" name="endtoken" value="#"/&gt;
* &lt;param type="token" name="DATE" value="${TODAY}"/&gt;
* &lt;/filterreader&gt;
*
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
*/
public final class ReplaceTokens
extends BaseParamFilterReader
implements ChainableReader
{
/** Default begin token character. */
private static final char DEFAULT_BEGIN_TOKEN = '@';

/** Default end token character. */
private static final char DEFAULT_END_TOKEN = '@';

/** Data that must be read from, if not null. */
private String queuedData = null;

/** Hashtable to hold the replacee-replacer pairs. */
private Hashtable hash = new Hashtable();

/** Begin token. */
private char beginToken = DEFAULT_BEGIN_TOKEN;

/** End token. */
private char endToken = DEFAULT_END_TOKEN;

/**
* This constructor is a dummy constructor and is
* not meant to be used by any class other than Ant's
* introspection mechanism. This will close the filter
* that is created making it useless for further operations.
*/
public ReplaceTokens() {
super();
}

/**
* Create a new filtered reader.
*
* @param in a Reader object providing the underlying stream.
*/
public ReplaceTokens(final Reader in) {
super(in);
}

/**
* Replace tokens with values.
*/
public final int read() throws IOException {
if (!getInitialized()) {
initialize();
setInitialized(true);
}

if (queuedData != null && queuedData.length() > 0) {
final int ch = queuedData.charAt(0);
if (queuedData.length() > 1) {
queuedData = queuedData.substring(1);
} else {
queuedData = null;
}
return ch;
}

int ch = in.read();
if (ch == beginToken) {
final StringBuffer key = new StringBuffer("");
do {
ch = in.read();
if (ch != -1) {
key.append((char) ch);
} else {
break;
}
} while (ch != endToken);

if (ch == -1) {
queuedData = beginToken + key.toString();
return read();
} else {
key.setLength(key.length() - 1);
final String replaceWith = (String) hash.get(key.toString());
if (replaceWith != null) {
queuedData = replaceWith;
return read();
} else {
queuedData = beginToken + key.toString() + endToken;
return read();
}
}
}
return ch;
}

/**
* Set begin token.
*/
public final void setBeginToken(final char beginToken) {
this.beginToken = beginToken;
}

/**
* Get begin token.
*/
private final char getBeginToken() {
return beginToken;
}

/**
* Set end token.
*/
public final void setEndToken(final char endToken) {
this.endToken = endToken;
}

/**
* Get begin token.
*/
private final char getEndToken() {
return endToken;
}

/**
* Add a token element.
*/
public final void addConfiguredToken(final Token token) {
hash.put(token.getKey(), token.getValue());
}

/**
* Set the tokens.
*/
private void setTokens(final Hashtable hash) {
this.hash = hash;
}

/**
* Get the tokens.
*/
private final Hashtable getTokens() {
return hash;
}

/**
* Create a new ReplaceTokens using the passed in
* Reader for instantiation.
*/
public final Reader chain(final Reader rdr) {
ReplaceTokens newFilter = new ReplaceTokens(rdr);
newFilter.setBeginToken(getBeginToken());
newFilter.setEndToken(getEndToken());
newFilter.setTokens(getTokens());
newFilter.setInitialized(true);
return newFilter;
}

/**
* Initialize tokens and load the replacee-replacer hashtable.
*/
private final void initialize() {
Parameter[] params = getParameters();
if (params != null) {
for (int i = 0; i < params.length; i++) {
if (params[i] != null) {
final String type = params[i].getType();
if ("tokenchar".equals(type)) {
final String name = params[i].getName();
if ("begintoken".equals(name)) {
beginToken = params[i].getValue().charAt(0);
} else if ("endtoken".equals(name)) {
endToken = params[i].getValue().charAt(0);
}
} else if ("token".equals(type)) {
final String name = params[i].getName();
final String value = params[i].getValue();
hash.put(name, value);
}
}
}
}
}

/**
* Holds a token
*/
public static class Token {

/** token key */
private String key;

/** token value */
private String value;

/**
* Set the token key
*/
public final void setKey(String key) {
this.key = key;
}

/**
* Set the token value
*/
public final void setValue(String value) {
this.value = value;
}

/**
* Get the token key
*/
public final String getKey() {
return key;
}

/**
* Get the token value
*/
public final String getValue() {
return value;
}
}
}

+ 115
- 0
src/main/org/apache/tools/ant/filters/StringInputStream.java View File

@@ -0,0 +1,115 @@
/*
* 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 "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.filters;

import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;

/**
* Wrap a String as an InputStream
*
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
* @created 20 February 2002
*/
public class StringInputStream
extends InputStream
{
/** Source string is stored as a StringReader */
private StringReader in;

/**
* Compose a stream from a String
*/
public StringInputStream(String source) {
in = new StringReader(source);
}

/**
* Read from the Stringreader
*/
public int read() throws IOException {
return in.read();
}

/**
* Close the Stringreader
*/
public void close() throws IOException {
in.close();
}

/**
* Mark the read limit of the StringReader
*/
public synchronized void mark(final int limit) {
try {
in.mark(limit);
} catch (IOException ioe) {
throw new RuntimeException(ioe.getMessage());
}
}

/**
* Resetthe StringReader
*/
public synchronized void reset() throws IOException {
in.reset();
}

public boolean markSupported() {
return true;
}
}


+ 150
- 0
src/main/org/apache/tools/ant/filters/StripJavaComments.java View File

@@ -0,0 +1,150 @@
/*
* 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 "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.filters;

import java.io.IOException;
import java.io.Reader;

/**
* This is a java comment and string stripper reader that filters
* these lexical tokens out for purposes of simple Java parsing.
* (if you have more complex Java parsing needs, use a real lexer).
* Since this class heavily relies on the single char read function,
* you are reccomended to make it work on top of a buffered reader.
*/
public final class StripJavaComments
extends BaseFilterReader
implements ChainableReader
{
/**
* This constructor is a dummy constructor and is
* not meant to be used by any class other than Ant's
* introspection mechanism. This will close the filter
* that is created making it useless for further operations.
*/
public StripJavaComments() {
super();
}

/**
* Create a new filtered reader.
*
* @param in a Reader object providing the underlying stream.
*/
public StripJavaComments(final Reader in) {
super(in);
}

/**
* Filter out Java Style comments
*/
public final int read() throws IOException {
int ch = in.read();
if (ch == '/') {
ch = in.read();
if (ch == '/') {
while (ch != '\n' && ch != -1) {
ch = in.read();
}
} else if (ch == '*') {
while (ch != -1) {
ch = in.read();
if (ch == '*') {
ch = in.read();
while (ch == '*' && ch != -1) {
ch = in.read();
}

if (ch == '/') {
ch = read();
break;
}
}
}
}
}

if (ch == '"') {
while (ch != -1) {
ch = in.read();
if (ch == '\\') {
ch = in.read();
} else if (ch == '"') {
ch = read();
break;
}
}
}

if (ch == '\'') {
ch = in.read();
if (ch == '\\') {
ch = in.read();
}
ch = in.read();
ch = read();
}

return ch;
}

/**
* Create a new StripJavaComments object using the passed in
* Reader for instantiation.
*/
public final Reader chain(final Reader rdr) {
StripJavaComments newFilter = new StripJavaComments(rdr);
return newFilter;
}
}

+ 176
- 0
src/main/org/apache/tools/ant/filters/StripLineBreaks.java View File

@@ -0,0 +1,176 @@
/*
* 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 "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.filters;

import java.io.IOException;
import java.io.Reader;

import org.apache.tools.ant.types.Parameter;

/**
* Filter to flatten the stream to a single line.
*
* &lt;striplinebreaks/&gt;
*
* Or:
*
* &lt;filterreader classname=&quot;org.apache.tools.ant.filters.StripLineBreaks&quot;/&gt;
*
* @author Steve Loughran
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
*/
public final class StripLineBreaks
extends BaseParamFilterReader
implements ChainableReader
{
/**
* Linebreaks. What do to on funny IBM mainframes with odd line endings?
*/
private static final String DEFAULT_LINE_BREAKS = "\r\n";

/**
* Linebreaks key that can be set via param element of
* AntFilterReader
*/
private static final String LINE_BREAKS_KEY = "linebreaks";


/** Holds the characters that are recognized as line breaks. */
private String lineBreaks = DEFAULT_LINE_BREAKS;

/**
* This constructor is a dummy constructor and is
* not meant to be used by any class other than Ant's
* introspection mechanism. This will close the filter
* that is created making it useless for further operations.
*/
public StripLineBreaks() {
super();
}

/**
* Create a new filtered reader.
*
* @param in a Reader object providing the underlying stream.
*/
public StripLineBreaks(final Reader in) {
super(in);
}

/**
* If the character that is being read in is a
* line break character, ignore it and move on to the
* next one.
*/
public final int read() throws IOException {
if (!getInitialized()) {
initialize();
setInitialized(true);
}

int ch = in.read();
while (ch != -1) {
if (lineBreaks.indexOf(ch) == -1) {
break;
} else {
ch = in.read();
}
}
return ch;
}

/**
* Set the line break characters.
*/
public final void setLineBreaks(final String lineBreaks) {
this.lineBreaks = lineBreaks;
}

/**
* Get the line breaks characters
*/
private final String getLineBreaks() {
return lineBreaks;
}

/**
* Create a new StripLineBreaks object using the passed in
* Reader for instantiation.
*/
public final Reader chain(final Reader rdr) {
StripLineBreaks newFilter = new StripLineBreaks(rdr);
newFilter.setLineBreaks(getLineBreaks());
newFilter.setInitialized(true);
return newFilter;
}

/**
* Line break characters set using the param element.
*/
private final void initialize() {
String userDefinedLineBreaks = null;
Parameter[] params = getParameters();
if (params != null) {
for (int i = 0; i < params.length; i++) {
if (LINE_BREAKS_KEY.equals(params[i].getName())) {
userDefinedLineBreaks = params[i].getValue();
break;
}
}
}
if (userDefinedLineBreaks != null) {
lineBreaks = userDefinedLineBreaks;
}
}
}

+ 227
- 0
src/main/org/apache/tools/ant/filters/StripLineComments.java View File

@@ -0,0 +1,227 @@
/*
* 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 "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.filters;

import java.io.IOException;
import java.io.Reader;
import java.util.Vector;

import org.apache.tools.ant.types.Parameter;

/**
* This is a line comment stripper reader
*
* Example:
* =======
*
* &lt;striplinecomments&gt;
* &lt;comment value=&quot;#&quot;/&gt;
* &lt;comment value=&quot;--&quot;/&gt;
* &lt;comment value=&quot;REM &quot;/&gt;
* &lt;comment value=&quot;rem &quot;/&gt;
* &lt;comment value=&quot;//&quot;/&gt;
* &lt;/striplinecomments&gt;
*
* Or:
*
* &lt;filterreader classname=&quot;org.apache.tools.ant.filters.StripLineComments&quot;&gt;
* &lt;param type=&quot;comment&quot; value="#&quot;/&gt;
* &lt;param type=&quot;comment&quot; value=&quot;--&quot;/&gt;
* &lt;param type=&quot;comment&quot; value=&quot;REM &quot;/&gt;
* &lt;param type=&quot;comment&quot; value=&quot;rem &quot;/&gt;
* &lt;param type=&quot;comment&quot; value=&quot;//&quot;/&gt;
* &lt;/filterreader&gt;
*
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
*/
public final class StripLineComments
extends BaseParamFilterReader
implements ChainableReader
{
/** The type that param recognizes to set the comments. */
private static final String COMMENTS_KEY = "comment";

/** Vector that holds comments. */
private Vector comments = new Vector();

/** The line that has been read ahead. */
private String line = null;

/**
* This constructor is a dummy constructor and is
* not meant to be used by any class other than Ant's
* introspection mechanism. This will close the filter
* that is created making it useless for further operations.
*/
public StripLineComments() {
super();
}

/**
* Create a new filtered reader.
*
* @param in a Reader object providing the underlying stream.
*/
public StripLineComments(final Reader in) {
super(in);
}

/**
* Read in line by line; Ignore line if it
* begins with a comment string.
*/
public final int read() throws IOException {
if (!getInitialized()) {
initialize();
setInitialized(true);
}

int ch = -1;

if (line != null) {
ch = line.charAt(0);
if (line.length() == 1) {
line = null;
} else {
line = line.substring(1);
}
} else {
line = readLine();
if (line == null) {
ch = -1;
} else {
int commentsSize = comments.size();
for (int i = 0; i < commentsSize; i++) {
String comment = (String) comments.elementAt(i);
if (line.startsWith(comment)) {
line = null;
break;
}
}
return read();
}
}

return ch;
}

/**
* Add the Comment element.
*/
public final void addConfiguredComment(final Comment comment) {
comments.addElement(comment.getValue());
}

/**
* Set the comments vector.
*/
private void setComments(final Vector comments) {
this.comments = comments;
}

/**
* Get the comments vector.
*/
private final Vector getComments() {
return comments;
}

/**
* Create a new StripLineComments object using the passed in
* Reader for instantiation.
*/
public final Reader chain(final Reader rdr) {
StripLineComments newFilter = new StripLineComments(rdr);
newFilter.setComments(getComments());
newFilter.setInitialized(true);
return newFilter;
}

/**
* Comments set using the param element.
*/
private final void initialize() {
Parameter[] params = getParameters();
if (params != null) {
for (int i = 0; i < params.length; i++) {
if (COMMENTS_KEY.equals(params[i].getType())) {
comments.addElement(params[i].getValue());
}
}
}
}

/**
* The class that holds a comment.
*/
public static class Comment {

/** The comment*/
private String value;

/**
* Set the comment.
*/
public final void setValue(String comment) {
value = comment;
}

/**
* Get the comment.
*/
public final String getValue() {
return value;
}
}
}

+ 178
- 0
src/main/org/apache/tools/ant/filters/TabsToSpaces.java View File

@@ -0,0 +1,178 @@
/*
* 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 "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.filters;

import java.io.IOException;
import java.io.Reader;

import org.apache.tools.ant.types.Parameter;

/**
* Converts tabs to spaces.
*
* Example Usage:
* =============
*
* &lt;tabtospaces tablength=&quot;8&quot;/&gt;
*
* Or:
*
* <filterreader classname=&quot;org.apache.tools.ant.filters.TabsToSpaces&quot;>
* <param name=&quot;tablength&quot; value=&quot;8&quot;/>
* </filterreader>
*
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
*/
public final class TabsToSpaces
extends BaseParamFilterReader
implements ChainableReader
{
/** The default tab length is 8 */
private static final int DEFAULT_TAB_LENGTH = 8;

/** The name that param recognizes to set the tablength. */
private static final String TAB_LENGTH_KEY = "tablength";

/** Default tab length. */
private int tabLength = DEFAULT_TAB_LENGTH;

/** How many more spaces must be returned to replace a tab? */
private int spacesRemaining = 0;

/**
* This constructor is a dummy constructor and is
* not meant to be used by any class other than Ant's
* introspection mechanism. This will close the filter
* that is created making it useless for further operations.
*/
public TabsToSpaces() {
super();
}

/**
* Create a new filtered reader.
*
* @param in a Reader object providing the underlying stream.
*/
public TabsToSpaces(final Reader in) {
super(in);
}

/**
* Convert tabs with spaces
*/
public final int read() throws IOException {
if (!getInitialized()) {
initialize();
setInitialized(true);
}

int ch = -1;

if (spacesRemaining > 0) {
spacesRemaining--;
ch = ' ';
} else {
ch = in.read();
if (ch == '\t') {
spacesRemaining = tabLength - 1;
ch = ' ';
}
}
return ch;
}

/**
* Set the tab length.
*/
public final void setTablength(final int tabLength) {
this.tabLength = tabLength;
}

/**
* Get the tab length
*/
private final int getTablength() {
return tabLength;
}

/**
* Create a new TabsToSpaces object using the passed in
* Reader for instantiation.
*/
public final Reader chain(final Reader rdr) {
TabsToSpaces newFilter = new TabsToSpaces(rdr);
newFilter.setTablength(getTablength());
newFilter.setInitialized(true);
return newFilter;
}

/**
* Initialize tokens
*/
private final void initialize() {
Parameter[] params = getParameters();
if (params != null) {
for (int i = 0; i < params.length; i++) {
if (params[i] != null) {
if (TAB_LENGTH_KEY.equals(params[i].getName())) {
tabLength =
new Integer(params[i].getValue()).intValue();
break;
}
}
}
}
}
}

+ 218
- 0
src/main/org/apache/tools/ant/filters/TailFilter.java View File

@@ -0,0 +1,218 @@
/*
* 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 "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.filters;

import java.io.IOException;
import java.io.Reader;

import org.apache.tools.ant.types.Parameter;

/**
* Read the last n lines. Default is last 10 lines.
*
* Example:
* =======
*
* &lt;tailfilter lines=&quot;3&quot;/&gt;
*
* Or:
*
* &lt;filterreader classname=&quot;org.apache.tools.ant.filters.TailFilter&quot;&gt;
* &lt;param name=&quot;lines&quot; value=&quot;3&quot;/&gt;
* &lt;/filterreader&gt;
*
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
*/
public final class TailFilter
extends BaseParamFilterReader
implements ChainableReader
{
/** The name that param recognizes to set the number of lines. */
private static final String LINES_KEY = "lines";

/** Number of lines currently read in. */
private long linesRead = 0;

/** Default number of lines returned. */
private long lines = 10;

/** Buffer to hold in characters read ahead. */
private char[] buffer = new char[4096];

/** The character position that has been returned from the buffer. */
private int returnedCharPos = -1;

/** Has read ahead been completed? */
private boolean completedReadAhead = false;

/** Current index position on the buffer. */
private int bufferPos = 0;

/**
* This constructor is a dummy constructor and is
* not meant to be used by any class other than Ant's
* introspection mechanism. This will close the filter
* that is created making it useless for further operations.
*/
public TailFilter() {
super();
}

/**
* Create a new filtered reader.
*
* @param in a Reader object providing the underlying stream.
*/
public TailFilter(final Reader in) {
super(in);
}

/**
* Read ahead and keep in buffer last n lines only at any given
* point. Grow buffer as needed.
*/
public final int read() throws IOException {
if (!getInitialized()) {
initialize();
setInitialized(true);
}

if (!completedReadAhead) {
int ch = -1;
while ((ch = in.read()) != -1) {
if (buffer.length == bufferPos) {
if (returnedCharPos != -1) {
final char[] tmpBuffer = new char[buffer.length];
System.arraycopy(buffer, returnedCharPos + 1, tmpBuffer,
0, buffer.length - (returnedCharPos + 1));
buffer = tmpBuffer;
bufferPos = bufferPos - (returnedCharPos + 1);
returnedCharPos = -1;
} else {
final char[] tmpBuffer = new char[buffer.length * 2];
System.arraycopy(buffer, 0, tmpBuffer, 0, bufferPos);
buffer = tmpBuffer;
}
}

if (ch == '\n' || ch == -1) {
++linesRead;

if (linesRead == lines) {
int i = 0;
for (i = returnedCharPos + 1;
buffer[i] != 0 && buffer[i] != '\n'; i++) {
}
returnedCharPos = i;
--linesRead;
}
}
if (ch == -1) {
break;
}

buffer[bufferPos] = (char) ch;
bufferPos++;
}
completedReadAhead = true;
}

++returnedCharPos;
if (returnedCharPos >= bufferPos) {
return -1;
} else {
return buffer[returnedCharPos];
}
}

/**
* Set number of lines to be returned.
*/
public final void setLines(final long lines) {
this.lines = lines;
}

/**
* Get number of lines to be returned.
*/
private final long getLines() {
return lines;
}

/**
* Create a new TailFilter using the passed in
* Reader for instantiation.
*/
public final Reader chain(final Reader rdr) {
TailFilter newFilter = new TailFilter(rdr);
newFilter.setLines(getLines());
newFilter.setInitialized(true);
return newFilter;
}

/**
* Scan for the lines parameter.
*/
private final void initialize() {
Parameter[] params = getParameters();
if (params != null) {
for (int i = 0; i < params.length; i++) {
if (LINES_KEY.equals(params[i].getName())) {
setLines(new Long(params[i].getValue()).longValue());
break;
}
}
}
}
}

+ 234
- 0
src/main/org/apache/tools/ant/filters/util/ChainReaderHelper.java View File

@@ -0,0 +1,234 @@
/*
* 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 "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.filters.util;

import org.apache.tools.ant.AntClassLoader;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.filters.BaseFilterReader;
import org.apache.tools.ant.filters.ChainableReader;
import org.apache.tools.ant.types.AntFilterReader;
import org.apache.tools.ant.types.FilterChain;
import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.types.Parameter;
import org.apache.tools.ant.types.Parameterizable;
import org.apache.tools.ant.util.FileUtils;

import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Vector;

/**
* Process a FilterReader chain.
*
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
* @created 23 February 2002
*/
public final class ChainReaderHelper {

/**
* The primary reader to which the reader chain is to be attached.
*/
public Reader primaryReader;

/**
* The size of the buffer to be used.
*/
public int bufferSize = 8192;

/**
* Chain of filters
*/
public Vector filterChains = new Vector();

/** The Ant project */
private Project project = null;

/**
* Sets the primary reader
*/
public final void setPrimaryReader(Reader rdr) {
primaryReader = rdr;
}

/**
* Set the project to work with
*/
public final void setProject(final Project project) {
this.project = project;
}

/**
* Get the project
*/
public final Project getProject() {
return project;
}

/**
* Sets the buffer size to be used. Defaults to 4096,
* if this method is not invoked.
*/
public final void setBufferSize(int size) {
bufferSize = size;
}

/**
* Sets the collection of filter reader sets
*/
public final void setFilterChains(Vector fchain) {
filterChains = fchain;
}

/**
* Assemble the reader
*/
public final Reader getAssembledReader() throws BuildException {
if (primaryReader == null) {
throw new BuildException("primaryReader must not be null.");
}

Reader instream = primaryReader;
final int filterReadersCount = filterChains.size();
final Vector finalFilters = new Vector();

for (int i = 0; i < filterReadersCount; i++) {
final FilterChain filterchain =
(FilterChain) filterChains.elementAt(i);
final Vector filterReaders = filterchain.getFilterReaders();
final int readerCount = filterReaders.size();
for (int j = 0; j < readerCount; j++) {
finalFilters.addElement(filterReaders.elementAt(j));
}
}

final int filtersCount = finalFilters.size();

if (filtersCount > 0) {
for (int i = 0; i < filtersCount; i++) {
Object o = finalFilters.elementAt(i);

if (o instanceof AntFilterReader) {
final AntFilterReader filter = (AntFilterReader) finalFilters.elementAt(i);
final String className = filter.getClassName();
final Path classpath = filter.getClasspath();
final Project project = filter.getProject();
if (className != null) {
try {
Class clazz = null;
if (classpath == null) {
clazz = Class.forName(className);
} else {
AntClassLoader al = new AntClassLoader(project,
classpath);
clazz = al.loadClass(className);
AntClassLoader.initializeClass(clazz);
}
if (clazz != null) {
if (!FilterReader.class.isAssignableFrom(clazz)) {
throw new BuildException(className +
" does not extend java.io.FilterReader");
}
final Constructor[] constructors =
clazz.getConstructors();
int j = 0;
for (; j < constructors.length; j++) {
Class[] types = constructors[j]
.getParameterTypes();
if (types.length == 1 &&
types[0].isAssignableFrom(Reader.class)) {
break;
}
}
final Reader[] rdr = {instream};
instream =
(Reader) constructors[j].newInstance(rdr);
if (Parameterizable.class.isAssignableFrom(clazz)) {
final Parameter[] params = filter.getParams();
((Parameterizable)
instream).setParameters(params);
}
}
} catch (final ClassNotFoundException cnfe) {
throw new BuildException(cnfe);
} catch (final InstantiationException ie) {
throw new BuildException(ie);
} catch (final IllegalAccessException iae) {
throw new BuildException(iae);
} catch (final InvocationTargetException ite) {
throw new BuildException(ite);
}
}
} else if (o instanceof ChainableReader &&
o instanceof Reader) {
if (project != null && o instanceof BaseFilterReader) {
((BaseFilterReader) o).setProject(project);
}
instream = ((ChainableReader) o).chain(instream);
}
}
}
return instream;
}

/**
* Read data from the reader and return the
* contents as a string.
*/
public final String readFully(Reader rdr)
throws IOException {
return FileUtils.readFully(rdr, bufferSize);
}
}

+ 103
- 0
src/main/org/apache/tools/ant/filters/util/JavaClassHelper.java View File

@@ -0,0 +1,103 @@
/*
* 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 "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.filters.util;

import java.io.ByteArrayInputStream;
import java.io.IOException;

import org.apache.bcel.classfile.ClassParser;
import org.apache.bcel.classfile.ConstantValue;
import org.apache.bcel.classfile.Field;
import org.apache.bcel.classfile.JavaClass;

/**
* Helper class that filters constants from a Java Class
*
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
*/
public final class JavaClassHelper {

/** System specific line separator. */
private static final String LS = System.getProperty("line.separator");

/**
* Get the constants declared in a file as name=value
*/
public static final StringBuffer getConstants(byte[] bytes)
throws IOException {
final StringBuffer sb = new StringBuffer();
final ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
final ClassParser parser = new ClassParser(bis, "");
final JavaClass javaClass = parser.parse();
final Field[] fields = javaClass.getFields();
for (int i = 0; i < fields.length; i++) {
final Field field = fields[i];
if (field != null) {
final ConstantValue cv = field.getConstantValue();
if (cv != null) {
String cvs = cv.toString();
//Remove start and end quotes if field is a String
if (cvs.startsWith("\"") && cvs.endsWith("\"")) {
cvs = cvs.substring(1, cvs.length() - 1);
}
sb.append(field.getName());
sb.append('=');
sb.append(cvs);
sb.append(LS);
}
}
}
return sb;
}
}

+ 23
- 3
src/main/org/apache/tools/ant/taskdefs/Copy.java View File

@@ -60,6 +60,7 @@ import org.apache.tools.ant.Project;
import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.types.FileSet; import org.apache.tools.ant.types.FileSet;
import org.apache.tools.ant.types.Mapper; import org.apache.tools.ant.types.Mapper;
import org.apache.tools.ant.types.FilterChain;
import org.apache.tools.ant.types.FilterSet; import org.apache.tools.ant.types.FilterSet;
import org.apache.tools.ant.types.FilterSetCollection; import org.apache.tools.ant.types.FilterSetCollection;
import org.apache.tools.ant.util.FileUtils; import org.apache.tools.ant.util.FileUtils;
@@ -91,7 +92,7 @@ import java.util.Enumeration;
* *
* @version $Revision$ * @version $Revision$
* *
* @ant.task category="filesystem"
* @ant:task category="filesystem"
*/ */
public class Copy extends Task { public class Copy extends Task {
protected File file = null; // the source file protected File file = null; // the source file
@@ -111,6 +112,7 @@ public class Copy extends Task {
protected Hashtable completeDirMap = new Hashtable(); protected Hashtable completeDirMap = new Hashtable();


protected Mapper mapperElement = null; protected Mapper mapperElement = null;
private Vector filterChains = new Vector();
private Vector filterSets = new Vector(); private Vector filterSets = new Vector();
private FileUtils fileUtils; private FileUtils fileUtils;
private String encoding = null; private String encoding = null;
@@ -142,6 +144,15 @@ public class Copy extends Task {
this.destDir = destDir; this.destDir = destDir;
} }


/**
* Create a nested filterchain
*/
public FilterChain createFilterChain() {
FilterChain filterChain = new FilterChain();
filterChains.addElement(filterChain);
return filterChain;
}

/** /**
* Create a nested filterset * Create a nested filterset
*/ */
@@ -187,6 +198,15 @@ public class Copy extends Task {
return filterSets; return filterSets;
} }


/**
* Get the filterchains being applied to this operation.
*
* @return a vector of FilterChain objects
*/
protected Vector getFilterChains() {
return filterChains;
}

/** /**
* Sets filtering. * Sets filtering.
*/ */
@@ -457,9 +477,9 @@ public class Copy extends Task {
for (Enumeration filterEnum = filterSets.elements(); filterEnum.hasMoreElements();) { for (Enumeration filterEnum = filterSets.elements(); filterEnum.hasMoreElements();) {
executionFilters.addFilterSet((FilterSet)filterEnum.nextElement()); executionFilters.addFilterSet((FilterSet)filterEnum.nextElement());
} }
fileUtils.copyFile(fromFile, toFile, executionFilters,
fileUtils.copyFile(fromFile, toFile, executionFilters, filterChains,
forceOverwrite, preserveLastModified, forceOverwrite, preserveLastModified,
encoding);
encoding, project);
} catch (IOException ioe) { } catch (IOException ioe) {
String msg = "Failed to copy " + fromFile + " to " + toFile String msg = "Failed to copy " + fromFile + " to " + toFile
+ " due to " + ioe.getMessage(); + " due to " + ioe.getMessage();


+ 42
- 70
src/main/org/apache/tools/ant/taskdefs/LoadFile.java View File

@@ -56,18 +56,20 @@ package org.apache.tools.ant.taskdefs;
import org.apache.tools.ant.Task; import org.apache.tools.ant.Task;
import org.apache.tools.ant.Project; import org.apache.tools.ant.Project;
import org.apache.tools.ant.BuildException; import org.apache.tools.ant.BuildException;

import org.apache.tools.ant.types.FilterChain;
import org.apache.tools.ant.filters.util.ChainReaderHelper;


import java.io.*; import java.io.*;
import java.util.Vector;


/** /**
* Load a file into a property * Load a file into a property
* *
* @author Steve Loughran * @author Steve Loughran
*
* @ant.task category="utility"
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
* @created 10 December 2001
*/ */
public class LoadFile extends Task {
public final class LoadFile extends Task {


/** /**
* source file, usually null * source file, usually null
@@ -90,16 +92,10 @@ public class LoadFile extends Task {
*/ */
private String property = null; private String property = null;



/** flag to control if we flatten the file or no'
*
*/
private boolean makeOneLine=false;

/** /**
* flag to control whether props get evaluated or not
* Holds FilterChains
*/ */
private boolean evaluateProperties=false;
private final Vector filterChains = new Vector();


/** /**
* Encoding to use for filenames, defaults to the platform's default * Encoding to use for filenames, defaults to the platform's default
@@ -112,7 +108,7 @@ public class LoadFile extends Task {
* @param encoding The new Encoding value * @param encoding The new Encoding value
*/ */


public void setEncoding(String encoding) {
public final void setEncoding(final String encoding) {
this.encoding = encoding; this.encoding = encoding;
} }


@@ -122,7 +118,7 @@ public class LoadFile extends Task {
* *
* @param property The new Property value * @param property The new Property value
*/ */
public void setProperty(String property) {
public final void setProperty(final String property) {
this.property = property; this.property = property;
} }


@@ -132,7 +128,7 @@ public class LoadFile extends Task {
* *
* @param srcFile The new SrcFile value * @param srcFile The new SrcFile value
*/ */
public void setSrcFile(File srcFile) {
public final void setSrcFile(final File srcFile) {
this.srcFile = srcFile; this.srcFile = srcFile;
} }


@@ -142,33 +138,17 @@ public class LoadFile extends Task {
* *
* @param fail The new Failonerror value * @param fail The new Failonerror value
*/ */
public void setFailonerror(boolean fail) {
public final void setFailonerror(final boolean fail) {
failOnError = fail; failOnError = fail;
} }


/**
* setter to flatten the file to a single line
* @since 1.6
*/
public void setMakeOneLine(boolean makeOneLine) {
this.makeOneLine=makeOneLine;
}

/**
* setter to eval properties.
* @since 1.6
*/
public void setEvaluateProperties(boolean evaluateProperties) {
this.evaluateProperties=evaluateProperties;
}



/** /**
* read in a source file to a property * read in a source file to a property
* *
* @exception BuildException if something goes wrong with the build * @exception BuildException if something goes wrong with the build
*/ */
public void execute()
public final void execute()
throws BuildException { throws BuildException {
//validation //validation
if (srcFile == null) { if (srcFile == null) {
@@ -182,14 +162,10 @@ public class LoadFile extends Task {
Reader instream = null; Reader instream = null;
log("loading "+srcFile+" into property "+property,Project.MSG_VERBOSE); log("loading "+srcFile+" into property "+property,Project.MSG_VERBOSE);
try { try {
long len = srcFile.length();
final long len = srcFile.length();
log("file size = "+len,Project.MSG_DEBUG); log("file size = "+len,Project.MSG_DEBUG);
//discard most of really big files //discard most of really big files
if (len > Integer.MAX_VALUE) {
log("this file is far to big to load completely");
}
int size=(int) len;
char[] buffer = new char[size];
final int size=(int) len;
//open up the file //open up the file
fis = new FileInputStream(srcFile); fis = new FileInputStream(srcFile);
bis = new BufferedInputStream(fis); bis = new BufferedInputStream(fis);
@@ -199,57 +175,53 @@ public class LoadFile extends Task {
else { else {
instream = new InputStreamReader(bis, encoding); instream = new InputStreamReader(bis, encoding);
} }
instream.read(buffer);
String text = new String(buffer);
if (makeOneLine) {
text=stripLineBreaks(text);
}
if(evaluateProperties) {
text = project.replaceProperties(text);

ChainReaderHelper crh = new ChainReaderHelper();
crh.setBufferSize(size);
crh.setPrimaryReader(instream);
crh.setFilterChains(filterChains);
crh.setProject(project);
instream = crh.getAssembledReader();

String text = crh.readFully(instream);

if (text != null) {
project.setNewProperty(property, text);
log("loaded " + text.length() + " characters",Project.MSG_VERBOSE);
log(property+" := "+text,Project.MSG_DEBUG);
} }
project.setNewProperty(property, text);
log("loaded "+buffer.length+" characters",Project.MSG_VERBOSE);
log(property+" := "+text,Project.MSG_DEBUG);


} catch (IOException ioe) {
String message = "Unable to load file: " + ioe.toString();
} catch (final IOException ioe) {
final String message = "Unable to load file: " + ioe.toString();
if (failOnError) { if (failOnError) {
throw new BuildException(message, ioe, location); throw new BuildException(message, ioe, location);
} }
else { else {
log(message, Project.MSG_ERR); log(message, Project.MSG_ERR);
} }
} catch (final BuildException be) {
if (failOnError) {
throw be;
}
else {
log(be.getMessage(), Project.MSG_ERR);
}
} finally { } finally {
try { try {
if (fis != null) { if (fis != null) {
fis.close(); fis.close();
} }
} catch (IOException ioex) { } catch (IOException ioex) {
//ignore
} }
} }
} }


/** /**
* strip out all line breaks from a string.
* @param source source
* This implementation always duplicates the string; it is nominally possible to probe
* the string first looking for any line breaks before bothering to do a copy. But we assume if
* the option is requested, then line breaks are probably in the source string.
* Add the FilterChain element.
*/ */
protected String stripLineBreaks(String source) {
//Linebreaks. What do to on funny IBM mainframes with odd line endings?
String linebreaks="\r\n";
int len=source.length();

StringBuffer dest=new StringBuffer(len);
for(int i=0;i<len;++i) {
char ch=source.charAt(i);
if(linebreaks.indexOf(ch)==-1) {
dest.append(ch);
}
}
return new String(dest);

public final void addFilterChain(FilterChain filter) {
filterChains.addElement(filter);
} }


//end class //end class


+ 180
- 0
src/main/org/apache/tools/ant/taskdefs/LoadProperties.java View File

@@ -0,0 +1,180 @@
/*
* 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 "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;

import org.apache.tools.ant.Task;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.types.FilterChain;
import org.apache.tools.ant.filters.StringInputStream;
import org.apache.tools.ant.filters.util.ChainReaderHelper;

import java.io.*;
import java.util.Enumeration;
import java.util.Properties;
import java.util.Vector;

/**
* Load a file's contents as Ant Properties.
*
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
* @created 20 February 2002
*/
public final class LoadProperties extends Task {

/**
* Source file
*/
private File srcFile = null;

/**
* Holds filterchains
*/
private final Vector filterChains = new Vector();

/**
* Sets the srcfile attribute.
*
* @param srcFile The new SrcFile value
*/
public final void setSrcFile(final File srcFile) {
this.srcFile = srcFile;
}

/**
* read in a source file's contents and load them up as Ant properties
*
* @exception BuildException if something goes wrong with the build
*/
public final void execute() throws BuildException {
//validation
if (srcFile == null) {
throw new BuildException("Source file not defined.");
}

if (!srcFile.exists()) {
throw new BuildException("Source file does not exist.");
}

if (!srcFile.isFile()) {
throw new BuildException("Source file is not a file.");
}

FileInputStream fis = null;
BufferedInputStream bis = null;
Reader instream = null;

try {
final long len = srcFile.length();
final int size=(int) len;

//open up the file
fis = new FileInputStream(srcFile);
bis = new BufferedInputStream(fis);
instream = new InputStreamReader(bis);

ChainReaderHelper crh = new ChainReaderHelper();
crh.setBufferSize(size);
crh.setPrimaryReader(instream);
crh.setFilterChains(filterChains);
crh.setProject(project);
instream = crh.getAssembledReader();

String text = crh.readFully(instream);

if (text != null) {
if (!text.endsWith("\n")) {
text = text + "\n";
}

final StringInputStream sis = new StringInputStream(text);
final Properties props = new Properties();
props.load(sis);
final Enumeration e = props.keys();
while (e.hasMoreElements()) {
final String key = (String) e.nextElement();
final String value = props.getProperty(key);
if (key != null && value != null
&& value.trim().length() > 0) {
project.setNewProperty(key, value);
}
}
sis.close();
}

} catch (final IOException ioe) {
final String message = "Unable to load file: " + ioe.toString();
throw new BuildException(message, ioe, location);
} catch (final BuildException be) {
throw be;
} finally {
try {
if (fis != null) {
fis.close();
}
} catch (IOException ioex) {
//ignore
}
}
}

/**
* Add the FilterChain element.
*/
public final void addFilterChain(FilterChain filter) {
filterChains.addElement(filter);
}

//end class
}

+ 7
- 4
src/main/org/apache/tools/ant/taskdefs/Move.java View File

@@ -84,11 +84,12 @@ import java.util.Vector;
* @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> * @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a>
* @version $Revision$ * @version $Revision$
* *
* @ant.task category="filesystem"
* @ant:task category="filesystem"
*/ */
public class Move extends Copy { public class Move extends Copy {


private Vector filterSets = null; private Vector filterSets = null;
private Vector filterChains = null;


public Move() { public Move() {
super(); super();
@@ -101,6 +102,7 @@ public class Move extends Copy {


protected void doFileOperations() { protected void doFileOperations() {
filterSets = getFilterSets(); filterSets = getFilterSets();
filterChains = getFilterChains();


//Attempt complete directory renames, if any, first. //Attempt complete directory renames, if any, first.
if (completeDirMap.size() > 0) { if (completeDirMap.size() > 0) {
@@ -162,10 +164,10 @@ public class Move extends Copy {
for (Enumeration filterEnum = getFilterSets().elements(); filterEnum.hasMoreElements();) { for (Enumeration filterEnum = getFilterSets().elements(); filterEnum.hasMoreElements();) {
executionFilters.addFilterSet((FilterSet)filterEnum.nextElement()); executionFilters.addFilterSet((FilterSet)filterEnum.nextElement());
} }
getFileUtils().copyFile(f, d, executionFilters,
getFileUtils().copyFile(f, d, executionFilters, filterChains,
forceOverwrite, forceOverwrite,
getPreserveLastModified(), getPreserveLastModified(),
getEncoding());
getEncoding(), project);


f = new File(fromFile); f = new File(fromFile);
if (!f.delete()) { if (!f.delete()) {
@@ -279,7 +281,8 @@ public class Move extends Copy {
throws IOException, BuildException { throws IOException, BuildException {


boolean renamed = true; boolean renamed = true;
if (filterSets != null && filterSets.size() > 0) {
if ((filterSets != null && filterSets.size() > 0) ||
(filterChains != null && filterChains.size() > 0)) {
renamed = false; renamed = false;
} else { } else {
if (!filtering) { if (!filtering) {


+ 1
- 0
src/main/org/apache/tools/ant/taskdefs/defaults.properties View File

@@ -60,6 +60,7 @@ waitfor=org.apache.tools.ant.taskdefs.WaitFor
input=org.apache.tools.ant.taskdefs.Input input=org.apache.tools.ant.taskdefs.Input
loadfile=org.apache.tools.ant.taskdefs.LoadFile loadfile=org.apache.tools.ant.taskdefs.LoadFile
manifest=org.apache.tools.ant.taskdefs.Manifest manifest=org.apache.tools.ant.taskdefs.Manifest
loadproperties=org.apache.tools.ant.taskdefs.LoadProperties


# optional tasks # optional tasks
script=org.apache.tools.ant.taskdefs.optional.Script script=org.apache.tools.ant.taskdefs.optional.Script


+ 141
- 0
src/main/org/apache/tools/ant/types/AntFilterReader.java View File

@@ -0,0 +1,141 @@
/*
* 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 "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.types;

import java.io.FilterReader;
import java.util.Hashtable;
import java.util.Vector;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;

/**
* An AntFileReader is a wrapper class that encloses the classname
* and configuration of a Configurable FilterReader.
*
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
*/
public final class AntFilterReader
extends DataType
implements Cloneable {

private String className;

private final Vector parameters = new Vector();

private Path classpath;

public final void setClassName(final String className) {
this.className = className;
}

public final String getClassName() {
return className;
}

public final void addParam(final Parameter param) {
parameters.addElement(param);
}

/**
* Set the classpath to load the FilterReader through (attribute).
*/
public final void setClasspath(Path classpath) {
if (isReference()) {
throw tooManyAttributes();
}
if (this.classpath == null) {
this.classpath = classpath;
} else {
this.classpath.append(classpath);
}
}

/**
* Set the classpath to load the FilterReader through (nested element).
*/
public final Path createClasspath() {
if (isReference()) {
throw noChildrenAllowed();
}
if (this.classpath == null) {
this.classpath = new Path(getProject());
}
return this.classpath.createPath();
}

/**
* Get the classpath
*/
public final Path getClasspath() {
return classpath;
}

/**
* Set the classpath to load the FilterReader through via
* reference (attribute).
*/
public void setClasspathRef(Reference r) {
if (isReference()) {
throw tooManyAttributes();
}
createClasspath().setRefid(r);
}

public final Parameter[] getParams() {
Parameter[] params = new Parameter[parameters.size()];
parameters.copyInto(params);
return params;
}
}

+ 139
- 0
src/main/org/apache/tools/ant/types/FilterChain.java View File

@@ -0,0 +1,139 @@
/*
* 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 "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.types;

import java.util.Vector;

import org.apache.tools.ant.filters.ClassConstants;
import org.apache.tools.ant.filters.ExpandProperties;
import org.apache.tools.ant.filters.HeadFilter;
import org.apache.tools.ant.filters.LineContains;
import org.apache.tools.ant.filters.LineContainsRegExp;
import org.apache.tools.ant.filters.PrefixLines;
import org.apache.tools.ant.filters.ReplaceTokens;
import org.apache.tools.ant.filters.StripJavaComments;
import org.apache.tools.ant.filters.StripLineBreaks;
import org.apache.tools.ant.filters.StripLineComments;
import org.apache.tools.ant.filters.TabsToSpaces;
import org.apache.tools.ant.filters.TailFilter;

/**
* FilterChain may contain a chained set of filter readers.
*
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
*/
public final class FilterChain {

private final Vector filterReaders = new Vector();

public final void addFilterReader(final AntFilterReader filterReader) {
filterReaders.addElement(filterReader);
}

public final Vector getFilterReaders() {
return filterReaders;
}

public final void addClassConstants(final ClassConstants classConstants) {
filterReaders.addElement(classConstants);
}

public final void addExpandProperties(final ExpandProperties expandProperties) {
filterReaders.addElement(expandProperties);
}

public final void addHeadFilter(final HeadFilter headFilter) {
filterReaders.addElement(headFilter);
}

public final void addLineContains(final LineContains lineContains) {
filterReaders.addElement(lineContains);
}

public final void addLineContainsRegExp(final LineContainsRegExp
lineContainsRegExp) {
filterReaders.addElement(lineContainsRegExp);
}

public final void addPrefixLines(final PrefixLines prefixLines) {
filterReaders.addElement(prefixLines);
}

public final void addReplaceTokens(final ReplaceTokens replaceTokens) {
filterReaders.addElement(replaceTokens);
}

public final void addStripJavaComments(final StripJavaComments
stripJavaComments) {
filterReaders.addElement(stripJavaComments);
}

public final void addStripLineBreaks(final StripLineBreaks
stripLineBreaks) {
filterReaders.addElement(stripLineBreaks);
}

public final void addStripLineComments(final StripLineComments
stripLineComments) {
filterReaders.addElement(stripLineComments);
}

public final void addTabsToSpaces(final TabsToSpaces tabsToSpaces) {
filterReaders.addElement(tabsToSpaces);
}

public final void addTailFilter(final TailFilter tailFilter) {
filterReaders.addElement(tailFilter);
}
}

+ 89
- 0
src/main/org/apache/tools/ant/types/Parameter.java View File

@@ -0,0 +1,89 @@
/*
* 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 "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.types;

/**
* A parameter is composed of a name, type and value.
*
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
*/
public final class Parameter {
private String name = null;
private String type = null;
private String value = null;

public final void setName(final String name) {
this.name = name;
}

public final void setType(final String type) {
this.type = type;
}

public final void setValue(final String value) {
this.value = value;
}

public final String getName() {
return name;
}

public final String getType() {
return type;
}

public final String getValue() {
return value;
}
}

+ 65
- 0
src/main/org/apache/tools/ant/types/Parameterizable.java View File

@@ -0,0 +1,65 @@
/*
* 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 "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.types;

import java.util.Vector;

/**
* Parameterizable objects take genric key value pairs.
*
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
*/
public interface Parameterizable {
void setParameters(Parameter[] parameters);
}

+ 139
- 39
src/main/org/apache/tools/ant/util/FileUtils.java View File

@@ -66,16 +66,19 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.OutputStreamWriter; import java.io.OutputStreamWriter;
import java.io.Reader;


import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.util.Random; import java.util.Random;
import java.util.Stack; import java.util.Stack;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import java.util.Vector;


import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.FilterSetCollection;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.filters.util.ChainReaderHelper;
import org.apache.tools.ant.types.FilterSetCollection;


/** /**
* This class also encapsulates methods which allow Files to be * This class also encapsulates methods which allow Files to be
@@ -85,11 +88,12 @@ import org.apache.tools.ant.types.FilterSetCollection;
* *
* @author duncan@x180.com * @author duncan@x180.com
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> * @author <a href="mailto:conor@apache.org">Conor MacNeill</a>
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
* *
* @version $Revision$ * @version $Revision$
*/ */
public class FileUtils { public class FileUtils {
private static Random rand = new Random(System.currentTimeMillis()); private static Random rand = new Random(System.currentTimeMillis());
private static Object lockReflection = new Object(); private static Object lockReflection = new Object();
@@ -134,27 +138,27 @@ public class FileUtils {
* destination specifying if token filtering must be used and if * destination specifying if token filtering must be used and if
* source files may overwrite newer destination files. * source files may overwrite newer destination files.
* *
* @throws IOException
* @throws IOException
*/ */
public void copyFile(String sourceFile, String destFile, FilterSetCollection filters, public void copyFile(String sourceFile, String destFile, FilterSetCollection filters,
boolean overwrite) throws IOException { boolean overwrite) throws IOException {
copyFile(new File(sourceFile), new File(destFile), filters,
copyFile(new File(sourceFile), new File(destFile), filters,
overwrite, false); overwrite, false);
} }


/**
/**
* Convienence method to copy a file from a source to a * Convienence method to copy a file from a source to a
* destination specifying if token filtering must be used, if * destination specifying if token filtering must be used, if
* source files may overwrite newer destination files and the * source files may overwrite newer destination files and the
* last modified time of <code>destFile</code> file should be made equal * last modified time of <code>destFile</code> file should be made equal
* to the last modified time of <code>sourceFile</code>. * to the last modified time of <code>sourceFile</code>.
* *
* @throws IOException
* @throws IOException
*/ */
public void copyFile(String sourceFile, String destFile, FilterSetCollection filters, public void copyFile(String sourceFile, String destFile, FilterSetCollection filters,
boolean overwrite, boolean preserveLastModified) boolean overwrite, boolean preserveLastModified)
throws IOException { throws IOException {
copyFile(new File(sourceFile), new File(destFile), filters,
copyFile(new File(sourceFile), new File(destFile), filters,
overwrite, preserveLastModified); overwrite, preserveLastModified);
} }


@@ -165,18 +169,40 @@ public class FileUtils {
* last modified time of <code>destFile</code> file should be made equal * last modified time of <code>destFile</code> file should be made equal
* to the last modified time of <code>sourceFile</code>. * to the last modified time of <code>sourceFile</code>.
* *
* @throws IOException
* @throws IOException
* *
* @since 1.14, Ant 1.5 * @since 1.14, Ant 1.5
*/ */
public void copyFile(String sourceFile, String destFile,
FilterSetCollection filters, boolean overwrite,
public void copyFile(String sourceFile, String destFile,
FilterSetCollection filters, boolean overwrite,
boolean preserveLastModified, String encoding) boolean preserveLastModified, String encoding)
throws IOException { throws IOException {
copyFile(new File(sourceFile), new File(destFile), filters,
copyFile(new File(sourceFile), new File(destFile), filters,
overwrite, preserveLastModified, encoding); overwrite, preserveLastModified, encoding);
} }


/**
* Convienence method to copy a file from a source to a
* destination specifying if token filtering must be used, if
* filter chains must be used, if source files may overwrite
* newer destination files and the last modified time of
* <code>destFile</code> file should be made equal
* to the last modified time of <code>sourceFile</code>.
*
* @throws IOException
*
* @since 1.15, Ant 1.5
*/
public void copyFile(String sourceFile, String destFile,
FilterSetCollection filters, Vector filterChains,
boolean overwrite, boolean preserveLastModified,
String encoding, Project project)
throws IOException {
copyFile(new File(sourceFile), new File(destFile), filters,
filterChains, overwrite, preserveLastModified,
encoding, project);
}

/** /**
* Convienence method to copy a file from a source to a destination. * Convienence method to copy a file from a source to a destination.
* No filtering is performed. * No filtering is performed.
@@ -203,7 +229,7 @@ public class FileUtils {
* destination specifying if token filtering must be used and if * destination specifying if token filtering must be used and if
* source files may overwrite newer destination files. * source files may overwrite newer destination files.
* *
* @throws IOException
* @throws IOException
*/ */
public void copyFile(File sourceFile, File destFile, FilterSetCollection filters, public void copyFile(File sourceFile, File destFile, FilterSetCollection filters,
boolean overwrite) throws IOException { boolean overwrite) throws IOException {
@@ -217,12 +243,12 @@ public class FileUtils {
* last modified time of <code>destFile</code> file should be made equal * last modified time of <code>destFile</code> file should be made equal
* to the last modified time of <code>sourceFile</code>. * to the last modified time of <code>sourceFile</code>.
* *
* @throws IOException
* @throws IOException
*/ */
public void copyFile(File sourceFile, File destFile, FilterSetCollection filters, public void copyFile(File sourceFile, File destFile, FilterSetCollection filters,
boolean overwrite, boolean preserveLastModified) boolean overwrite, boolean preserveLastModified)
throws IOException { throws IOException {
copyFile(sourceFile, destFile, filters, overwrite,
copyFile(sourceFile, destFile, filters, overwrite,
preserveLastModified, null); preserveLastModified, null);
} }


@@ -234,15 +260,36 @@ public class FileUtils {
* equal to the last modified time of <code>sourceFile</code> and * equal to the last modified time of <code>sourceFile</code> and
* which character encoding to assume. * which character encoding to assume.
* *
* @throws IOException
* @throws IOException
* *
* @since 1.14, Ant 1.5 * @since 1.14, Ant 1.5
*/ */
public void copyFile(File sourceFile, File destFile,
FilterSetCollection filters, boolean overwrite,
public void copyFile(File sourceFile, File destFile,
FilterSetCollection filters, boolean overwrite,
boolean preserveLastModified, String encoding) boolean preserveLastModified, String encoding)
throws IOException { throws IOException {
copyFile(sourceFile, destFile, filters, null, overwrite,
preserveLastModified, encoding, null);
}

/**
* Convienence method to copy a file from a source to a
* destination specifying if token filtering must be used, if
* filter chains must be used, if source files may overwrite
* newer destination files and the last modified time of
* <code>destFile</code> file should be made equal
* to the last modified time of <code>sourceFile</code>.
*
* @throws IOException
*
* @since 1.15, Ant 1.5
*/
public void copyFile(File sourceFile, File destFile,
FilterSetCollection filters, Vector filterChains,
boolean overwrite, boolean preserveLastModified,
String encoding, Project project)
throws IOException {

if (overwrite || !destFile.exists() || if (overwrite || !destFile.exists() ||
destFile.lastModified() < sourceFile.lastModified()) { destFile.lastModified() < sourceFile.lastModified()) {


@@ -257,7 +304,12 @@ public class FileUtils {
parent.mkdirs(); parent.mkdirs();
} }


if (filters != null && filters.hasFilters()) {
final boolean filterSetsAvailable = (filters != null
&& filters.hasFilters());
final boolean filterChainsAvailable = (filterChains != null
&& filterChains.size() > 0);

if (filterSetsAvailable || filterChainsAvailable) {
BufferedReader in = null; BufferedReader in = null;
BufferedWriter out = null; BufferedWriter out = null;


@@ -265,8 +317,20 @@ public class FileUtils {
in = new BufferedReader(new FileReader(sourceFile)); in = new BufferedReader(new FileReader(sourceFile));
out = new BufferedWriter(new FileWriter(destFile)); out = new BufferedWriter(new FileWriter(destFile));
} else { } else {
in = new BufferedReader(new InputStreamReader(new FileInputStream(sourceFile), encoding));
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(destFile), encoding));
in = new BufferedReader(new InputStreamReader(
new FileInputStream(sourceFile), encoding));
out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(destFile), encoding));
}

if (filterChainsAvailable) {
ChainReaderHelper crh = new ChainReaderHelper();
crh.setBufferSize(8192);
crh.setPrimaryReader(in);
crh.setFilterChains(filterChains);
crh.setProject(project);
Reader rdr = crh.getAssembledReader();
in = new BufferedReader(rdr);
} }


int length; int length;
@@ -276,7 +340,11 @@ public class FileUtils {
if (line.length() == 0) { if (line.length() == 0) {
out.newLine(); out.newLine();
} else { } else {
newline = filters.replaceTokens(line);
if (filterSetsAvailable) {
newline = filters.replaceTokens(line);
} else {
newline = line;
}
out.write(newline); out.write(newline);
out.newLine(); out.newLine();
} }
@@ -317,8 +385,8 @@ public class FileUtils {
synchronized (lockReflection) { synchronized (lockReflection) {
if (setLastModified == null) { if (setLastModified == null) {
try { try {
setLastModified =
java.io.File.class.getMethod("setLastModified",
setLastModified =
java.io.File.class.getMethod("setLastModified",
new Class[] {Long.TYPE}); new Class[] {Long.TYPE});
} catch (NoSuchMethodException nse) { } catch (NoSuchMethodException nse) {
throw new BuildException("File.setlastModified not in JDK > 1.1?", throw new BuildException("File.setlastModified not in JDK > 1.1?",
@@ -399,7 +467,7 @@ public class FileUtils {
helpFile = getParentFile(helpFile); helpFile = getParentFile(helpFile);
if (helpFile == null) { if (helpFile == null) {
String msg = "The file or path you specified (" String msg = "The file or path you specified ("
+ filename + ") is invalid relative to "
+ filename + ") is invalid relative to "
+ file.getPath(); + file.getPath();
throw new BuildException(msg); throw new BuildException(msg);
} }
@@ -422,7 +490,7 @@ public class FileUtils {
* <li>Remove redundant slashes after the drive spec.</li> * <li>Remove redundant slashes after the drive spec.</li>
* <li>resolve all ./, .\, ../ and ..\ sequences.</li> * <li>resolve all ./, .\, ../ and ..\ sequences.</li>
* <li>DOS style paths that start with a drive letter will have * <li>DOS style paths that start with a drive letter will have
* \ as the separator.</li>
* \ as the separator.</li>
* </ul> * </ul>
* *
* @throws java.lang.NullPointerException if the file path is * @throws java.lang.NullPointerException if the file path is
@@ -439,11 +507,11 @@ public class FileUtils {
! (path.length() >= 2 && ! (path.length() >= 2 &&
Character.isLetter(path.charAt(0)) && Character.isLetter(path.charAt(0)) &&
path.charAt(1) == ':') path.charAt(1) == ':')
) {
) {
String msg = path + " is not an absolute path"; String msg = path + " is not an absolute path";
throw new BuildException(msg); throw new BuildException(msg);
} }
boolean dosWithDrive = false; boolean dosWithDrive = false;
String root = null; String root = null;
// Eliminate consecutive slashes after the drive spec // Eliminate consecutive slashes after the drive spec
@@ -473,7 +541,7 @@ public class FileUtils {
root = path.substring(0, 3); root = path.substring(0, 3);
path = path.substring(3); path = path.substring(3);
} }
} else { } else {
if (path.length() == 1) { if (path.length() == 1) {
root = File.separator; root = File.separator;
@@ -515,7 +583,7 @@ public class FileUtils {
} }
sb.append(s.elementAt(i)); sb.append(s.elementAt(i));
} }


path = sb.toString(); path = sb.toString();
if (dosWithDrive) { if (dosWithDrive) {
@@ -552,8 +620,8 @@ public class FileUtils {
DecimalFormat fmt = new DecimalFormat("#####"); DecimalFormat fmt = new DecimalFormat("#####");
synchronized (rand) { synchronized (rand) {
do { do {
result = new File(parent,
prefix + fmt.format(rand.nextInt())
result = new File(parent,
prefix + fmt.format(rand.nextInt())
+ suffix); + suffix);
} while (result.exists()); } while (result.exists());
} }
@@ -579,22 +647,22 @@ public class FileUtils {
// two not existing files are equal // two not existing files are equal
return true; return true;
} }
if (f1.isDirectory() || f2.isDirectory()) { if (f1.isDirectory() || f2.isDirectory()) {
// don't want to compare directory contents for now // don't want to compare directory contents for now
return false; return false;
} }
if (f1.equals(f2)) { if (f1.equals(f2)) {
// same filename => true // same filename => true
return true; return true;
} }
if (f1.length() != f2.length()) { if (f1.length() != f2.length()) {
// different size =>false // different size =>false
return false; return false;
} }
InputStream in1 = null; InputStream in1 = null;
InputStream in2 = null; InputStream in2 = null;
try { try {
@@ -640,5 +708,37 @@ public class FileUtils {
} }
return null; return null;
} }

/**
* Read from reader till EOF
*/
public static final String readFully(Reader rdr) throws IOException {
return readFully(rdr, 8192);
}

/**
* Read from reader till EOF
*/
public static final String readFully(Reader rdr, int bufferSize) throws IOException {
final char[] buffer = new char[bufferSize];
int bufferLength = 0;
String text = null;
StringBuffer textBuffer = null;
while (bufferLength != -1) {
bufferLength = rdr.read(buffer);
if (bufferLength != -1) {
if (textBuffer == null) {
textBuffer = new StringBuffer(
new String(buffer, 0, bufferLength));
} else {
textBuffer.append(new String(buffer, 0, bufferLength));
}
}
}
if (textBuffer != null) {
text = textBuffer.toString();
}
return text;
}
} }



+ 17
- 10
src/testcases/org/apache/tools/ant/taskdefs/CopyTest.java View File

@@ -57,7 +57,6 @@ package org.apache.tools.ant.taskdefs;
import org.apache.tools.ant.BuildFileTest; import org.apache.tools.ant.BuildFileTest;
import org.apache.tools.ant.Project; import org.apache.tools.ant.Project;
import org.apache.tools.ant.util.FileUtils; import org.apache.tools.ant.util.FileUtils;

import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;


@@ -126,20 +125,28 @@ public class CopyTest extends BuildFileTest {


} }


public void testSingleFileFileset() {
executeTarget("test_single_file_fileset");
File file = new File(getProjectDir(),
"copytest_single_file_fileset.tmp");
assertTrue(file.exists());
}

public void testFilterSet() throws IOException { public void testFilterSet() throws IOException {
executeTarget("testFilterSet"); executeTarget("testFilterSet");
FileUtils fileUtils = FileUtils.newFileUtils(); FileUtils fileUtils = FileUtils.newFileUtils();
File tmp = new File(getProjectDir(), "copy.filterset.tmp"); File tmp = new File(getProjectDir(), "copy.filterset.tmp");
File check = new File(getProjectDir(),
"expected/copy.filterset.filtered");
File check = new File(getProjectDir(), "expected/copy.filterset.filtered");
assertTrue(tmp.exists());
assertTrue(fileUtils.contentEquals(tmp, check));
}

public void testFilterChain() throws IOException {
executeTarget("testFilterChain");
FileUtils fileUtils = FileUtils.newFileUtils();
File tmp = new File(getProjectDir(), "copy.filterchain.tmp");
File check = new File(getProjectDir(), "expected/copy.filterset.filtered");
assertTrue(tmp.exists()); assertTrue(tmp.exists());
assertTrue(fileUtils.contentEquals(tmp, check)); assertTrue(fileUtils.contentEquals(tmp, check));
} }

public void testSingleFileFileset() {
executeTarget("test_single_file_fileset");
File file = new File(getProjectDir(),
"copytest_single_file_fileset.tmp");
assertTrue(file.exists());
}
} }

+ 14
- 4
src/testcases/org/apache/tools/ant/taskdefs/LoadFileTest.java View File

@@ -151,7 +151,7 @@ public class LoadFileTest extends BuildFileTest {
} }
} }


/**
/**
* A unit test for JUnit * A unit test for JUnit
*/ */
public void testEvalProps() public void testEvalProps()
@@ -162,7 +162,19 @@ public class LoadFileTest extends BuildFileTest {
} }
} }


/**
/**
* A unit test for JUnit
*/
public void testFilterChain()
throws BuildException {
executeTarget("testFilterChain");
if(project.getProperty("testFilterChain").indexOf("World!")<0) {
fail("Filter Chain broken");
}
}


/**
* A unit test for JUnit * A unit test for JUnit
*/ */
public void testOneLine() public void testOneLine()
@@ -171,5 +183,3 @@ public class LoadFileTest extends BuildFileTest {


} }
} }



+ 10
- 1
src/testcases/org/apache/tools/ant/taskdefs/MoveTest.java View File

@@ -1,7 +1,7 @@
/* /*
* The Apache Software License, Version 1.1 * The Apache Software License, Version 1.1
* *
* Copyright (c) 2002 The Apache Software Foundation. All rights
* Copyright (c) 2000-2002 The Apache Software Foundation. All rights
* reserved. * reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@@ -87,4 +87,13 @@ public class MoveTest extends BuildFileTest {
assertTrue(tmp.exists()); assertTrue(tmp.exists());
assertTrue(fileUtils.contentEquals(tmp, check)); assertTrue(fileUtils.contentEquals(tmp, check));
} }

public void testFilterChain() throws IOException {
executeTarget("testFilterChain");
FileUtils fileUtils = FileUtils.newFileUtils();
File tmp = new File(getProjectDir(), "move.filterchain.tmp");
File check = new File(getProjectDir(), "expected/copy.filterset.filtered");
assertTrue(tmp.exists());
assertTrue(fileUtils.contentEquals(tmp, check));
}
} }

Loading…
Cancel
Save