Browse Source

Remove contents from filter reader proposal, now that the code has been migrated to the main tree.

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

+ 4
- 0
proposal/sandbox/filterreaders/README View File

@@ -1,3 +1,7 @@

***** Filter Readers is now available in Ant's main development tree *****


Ant Filter Readers Ant Filter Readers
================== ==================




+ 0
- 97
proposal/sandbox/filterreaders/docs/manual/CoreTasks/loadfile.html View File

@@ -1,97 +0,0 @@
<html>
<head>
<title>LoadFile Task</title>
</head>

<body>


<h2><a name="loadfile">LoadFile</a></h2>
<h3>Description</h3>
<p>
Load a text file into a single property. Unless an encoding is specified,
the encoding of the current locale is used.

</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>
<tr>
<td valign="top">property</td>
<td valign="top">property to save to</td>
<td valign="top" align="center">Yes</td>
</tr>
<tr>
<td valign="top">encoding</td>
<td valign="top">encoding to use when loading the file</td>
<td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">failonerror</td>
<td valign="top">Whether to halt the build on failure</td>
<td align="center" valign="top">No, default "true"</td>
</tr>
</table>
<p>
The LoadFile task supports nested <a href="../CoreTypes/filterchain.html">
FilterChain</a>s.

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

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

<pre> &lt;loadfile
property="optional.value"
srcFile="optional.txt"
failonerror="false" /&gt;
</pre>
Load a file, don't fail if it is missing (a message is printed, though)

<pre> &lt;loadfile
property="mail.recipients"
srcFile="recipientlist.txt"&gt;
&lt;filterchain&gt;
&lt;<a href="../CoreTypes/filterchain.html#striplinebreaks">striplinebreaks</a>/&gt;
&lt;/filterchaint&gt;
&lt;/loadfile&gt;
</pre>
Load a property which can be used as a parameter for another task (in this case mail),
merging lines to ensure this happens.

<pre> &lt;loadfile
property="system.configuration.xml"
srcFile="configuration.xml"&gt;
&lt;<a href="../CoreTypes/filterchain.html#expandproperties">expandproperties</a>/&gt;
&lt;/loadfile&gt;
</pre>
Load an XML file into a property, expanding all properties declared
in the file in the process.


<hr>

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

</body>
</html>


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

@@ -1,59 +0,0 @@
<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>


+ 0
- 488
proposal/sandbox/filterreaders/docs/manual/CoreTypes/filterchain.html View File

@@ -1,488 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>
<HEAD>
<TITLE>FilterChains and FilterReaders</TITLE>
</HEAD>

<BODY>

<H2>FilterChains and FilterReaders</H2>
Look at Unix pipes - they offer you so much flexibility -
say you wanted to copy just those lines that contained the
string blee from the first 10 lines of a file 'foo'
to a file 'bar' - you would do something like<P>
<code>
cat foo|head -n10|grep blee > bar
</code><P>
Ant was not flexible enough. There was no way for the
&lt;copy&gt; task to do something similar. If you wanted
the &lt;copy&gt; task to get the first 10 lines, you would have
had to create special attributes:<P>
<code>
&lt;copy file=&quot;foo&quot; tofile=&quot;bar&quot; head=&quot;10&quot; contains=&quot;blee&quot;/&gt;
</code><P>
The obvious problem thus surfaced: Ant tasks would not be able
to accomodate such data transformation attributes as they would
be endless. The task would also not know in which order these
attributes were to be interpreted. That is, must the task execute the
contains attribute first and then the head attribute or vice-versa?
What Ant tasks needed was a mechanism to allow pluggable filter (data
tranformer) chains. Ant would provide a few filters for which there
have been repeated requests. Users with special filtering needs
would be able to easily write their own and plug them in.<P>

The solution was to refactor data transformation oriented
tasks to support FilterChains. A FilterChain is a group of
ordered FilterReaders. Users can define their own FilterReaders
by just extending the java.io.FilterReader class. Such custom
FilterReaders can be easily plugged in as nested elements of
&lt;filterchain&gt; by using &lt;filterreader&gt; elements.
<P>
Example:
<BLOCKQUOTE><PRE>
&lt;copy file=&quot;${src.file}&quot; tofile=&quot;${dest.file}&quot;&gt;
&lt;filterchain&gt;
&lt;filterreader classname=&quot;your.extension.of.java.io.FilterReader&quot;&gt;
&lt;param name=&quot;foo&quot; value=&quot;bar&quot;/&gt;
&lt;/filterreader&gt;
&lt;filterreader classname=&quot;another.extension.of.java.io.FilterReader&quot;&gt;
&lt;classpath&gt;
&lt;pathelement path="${classpath}"/&gt;
&lt;/classpath&gt;
&lt;param name=&quot;blah&quot; value=&quot;blee&quot;/&gt;
&lt;param type=&quot;abra&quot; value=&quot;cadabra&quot;/&gt;
&lt;/filterreader&gt;
&lt;/filterchain&gt;
&lt;/copy&gt;
</PRE></BLOCKQUOTE>

Ant provides some built-in filter readers. These filter readers
can also be declared using a syntax similar to the above syntax.
However, they can be declared using some simpler syntax also.<P>
Example:
<BLOCKQUOTE><PRE>
&lt;loadfile srcfile=&quot;${src.file}&quot; property=&quot;${src.file.head}&quot;&gt;
&lt;filterchain&gt;
&lt;headfilter lines=&quot;15&quot;/&gt;
&lt;/filterchain&gt;
&lt;/loadfile&gt;
</PRE></BLOCKQUOTE>
is equivalent to:
<BLOCKQUOTE><PRE>
&lt;loadfile srcfile=&quot;${src.file}&quot; property=&quot;${src.file.head}&quot;&gt;
&lt;filterchain&gt;
&lt;filterreader classname=&quot;org.apache.tools.ant.filters.HeadFilter&quot;&gt;
&lt;param name=&quot;lines&quot; value=&quot;15&quot;/&gt;
&lt;/filterreader&gt;
&lt;/filterchain&gt;
&lt;/loadfile&gt;
</PRE></BLOCKQUOTE>

The following built-in tasks support nested &lt;filterchain&gt; elements.<BR>
<a href="../CoreTasks/copy.html">Copy</a>,<BR>
<a href="../CoreTasks/loadfile.html">LoadFile</a>,<BR>
<a href="../CoreTasks/loadproperties.html">LoadProperties</a>,<BR>
<a href="../CoreTasks/move.html">Move</a><BR><BR>

A FilterChain is formed by defining zero or more of the following
nested elements.<BR>
<a href="#filterreader">FilterReader</a><BR>
<a href="#classconstants">ClassConstants</a><BR>
<a href="#expandproperties">ExpandProperties</a><BR>
<a href="#headfilter">HeadFilter</a><BR>
<a href="#linecontains">LineContains</a><BR>
<a href="#linecontainsregexp">LineContainsRegExp</a><BR>
<a href="#prefixlines">PrefixLines</a><BR>
<a href="#replacetokens">ReplaceTokens</a><BR>
<a href="#stripjavacomments">StripJavaComments</a><BR>
<a href="#striplinebreaks">StripLineBreaks</a><BR>
<a href="#striplinecomments">StripLineComments</a><BR>
<a href="#tabstospaces">TabsToSpaces</a><BR>
<a href="#tailfilter">TailFilter</a><BR>

<H3><a name="filterreader">FilterReader</a></H3>

The filterreader element is the generic way to
define a filter. User defined filter elements are
defined in the build file using this. Please note that
built in filter readers can also be defined using this
syntax.

A FilterReader element must be supplied with a class name as
an attribute value. The class resolved by this name must
extend java.io.FilterReader. If the custom filter reader
needs to be parameterized, it must implement
org.apache.tools.type.Parameterizable.

<TABLE cellSpacing=0 cellPadding=2 border=1>
<TR>
<TD vAlign=top><B>Attribute</B></TD>
<TD vAlign=top><B>Description</B></TD>
<TD vAlign=top align="center"><B>Required</B></TD>
</TR>
<TR>
<TD vAlign=top>classname</TD>
<TD vAlign=top>The class name of the filter reader.</TD>
<TD vAlign=top align="center">Yes</TD>
</TR>
</TABLE>

<P>
<H4>Nested Elements:</H4>
&lt;filterreader&gt; supports &lt;classpath&gt; and &lt;param&gt;
as nested elements. Each &lt;param&gt; element may take in the following
attributes - name, type and value.
<P>
The following FilterReaders are supplied with the default
distribution.

<H3><a name="classconstants">ClassConstants</a></H3>
<P>
This filters basic constants defined in a Java Class,
and outputs them in lines composed of the format name=value
<P>
<H4>Example:</H4>

This loads the basic constants defined in a Java class as Ant properties.
<BLOCKQUOTE><PRE>
&lt;loadproperties srcfile=&quot;foo.class&quot;&gt;
&lt;filterchain&gt;
&lt;filterreader classname=&quot;org.apache.tools.ant.filters.ClassConstants&quot;/&gt;
&lt;/filterchain&gt;
&lt;/loadproperties&gt;
</PRE></BLOCKQUOTE>

Convenience method:
<BLOCKQUOTE><PRE>
&lt;loadproperties srcfile=&quot;foo.class&quot;&gt;
&lt;filterchain&gt;
&lt;classconstants/&gt;
&lt;/filterchain&gt;
&lt;/loadproperties&gt;
</PRE></BLOCKQUOTE>

<H3><a name="expandproperties">ExpandProperties</a></H3>
<P>
If the data contains data that represents Ant
properties (of the form ${...}), that is substituted
with the property's actual value.
<P>
<H4>Example:</H4>

This results in the property modifiedmessage holding the value
&quot;All these moments will be lost in time, like teardrops in the rain&quot;
<BLOCKQUOTE><PRE>
&lt;echo
message=&quot;All these moments will be lost in time, like teardrops in the ${weather}&quot;
file=&quot;loadfile1.tmp&quot;
/&gt;
&lt;property name=&quot;weather&quot; value=&quot;rain&quot; /&gt;
&lt;loadfile property=&quot;modifiedmessage&quot; srcFile=&quot;loadfile1.tmp&quot;&gt;
&lt;filterchain&gt;
&lt;filterreader classname=&quot;org.apache.tools.ant.filters.ExpandProperties&quot;/&gt;
&lt;/filterchain&gt;
&lt;/loadfile&gt;
</PRE></BLOCKQUOTE>

Convenience method:
<BLOCKQUOTE><PRE>
&lt;echo
message=&quot;All these moments will be lost in time, like teardrops in the ${weather}&quot;
file=&quot;loadfile1.tmp&quot;
/&gt;
&lt;property name=&quot;weather&quot; value=&quot;rain&quot; /&gt;
&lt;loadfile property=&quot;modifiedmessage&quot; srcFile=&quot;loadfile1.tmp&quot;&gt;
&lt;filterchain&gt;
&lt;expandproperties/&gt;
&lt;/filterchain&gt;
&lt;/loadfile&gt;
</PRE></BLOCKQUOTE>

<H3><a name="headfilter">HeadFilter</a></H3>

This filter reads the first few lines from the data supplied to it.

<TABLE cellSpacing=0 cellPadding=2 border=1>
<TR>
<TD vAlign=top><B>Parameter Name</B></TD>
<TD vAlign=top><B>Parameter Value</B></TD>
<TD vAlign=top align="center"><B>Required</B></TD>
</TR>
<TR>
<TD vAlign=top>lines</TD>
<TD vAlign=top align="center">Number of lines to be read.
Defaults to &quot;10&quot;</TD>
<TD vAlign=top align="center">No</TD>
</TR>
</TABLE>
<P>
<H4>Example:</H4>

This stores the first 15 lines of the supplied data in the property ${src.file.head}
<BLOCKQUOTE><PRE>
&lt;loadfile srcfile=&quot;${src.file}&quot; property=&quot;${src.file.head}&quot;&gt;
&lt;filterchain&gt;
&lt;filterreader classname=&quot;org.apache.tools.ant.filters.HeadFilter&quot;&gt;
&lt;param name=&quot;lines&quot; value=&quot;15&quot;/&gt;
&lt;/filterreader&gt;
&lt;/filterchain&gt;
&lt;/loadfile&gt;
</PRE></BLOCKQUOTE>

Convenience method:
<BLOCKQUOTE><PRE>
&lt;loadfile srcfile=&quot;${src.file}&quot; property=&quot;${src.file.head}&quot;&gt;
&lt;filterchain&gt;
&lt;headfilter lines=&quot;15&quot;/&gt;
&lt;/filterchain&gt;
&lt;/loadfile&gt;
</PRE></BLOCKQUOTE>

<H3><a name="replacetokens">ReplaceTokens</a></H3>

This filter reader replaces all strings that are
sandwiched between begintoken and endtoken with
user defined values.

<TABLE cellSpacing=0 cellPadding=2 border=1>
<TR>
<TD vAlign=top><B>Parameter Type</B></TD>
<TD vAlign=top><B>Parameter Name</B></TD>
<TD vAlign=top><B>Parameter Value</B></TD>
<TD vAlign=top align="center"><B>Required</B></TD>
</TR>
<TR>
<TD vAlign=top>tokenchar</TD>
<TD vAlign=top>begintoken</TD>
<TD vAlign=top>Character marking the
beginning of a token. Defaults to @</TD>
<TD vAlign=top align="center">No</TD>
</TR>
<TR>
<TD vAlign=top>tokenchar</TD>
<TD vAlign=top>endtoken</TD>
<TD vAlign=top>Character marking the
end of a token. Defaults to @</TD>
<TD vAlign=top align="center">No</TD>
</TR>
<TR>
<TD vAlign=top>token</TD>
<TD vAlign=top>User defined String.</TD>
<TD vAlign=top>User defined search String</TD>
<TD vAlign=top align="center">Yes</TD>
</TR>
</TABLE>
<P>

<H4>Example:</H4>

This replaces occurences of the string @DATE@ in the data
with today's date and stores it in the property ${src.file.replaced}
<BLOCKQUOTE><PRE>
&lt;tstamp/&gt;
&lt;loadfile srcfile=&quot;${src.file}&quot; property=&quot;${src.file.replaced}&quot;&gt;
&lt;filterchain&gt;
&lt;filterreader classname=&quot;org.apache.tools.ant.filters.ReplaceTokens&quot;&gt;
&lt;param type=&quot;token&quot; name=&quot;DATE&quot; value=&quot;${TODAY}&quot;/&gt;
&lt;/filterreader&gt;
&lt;/filterchain&gt;
&lt;/loadfile&gt;
</PRE></BLOCKQUOTE>

Convenience method:
<BLOCKQUOTE><PRE>
&lt;tstamp/&gt;
&lt;loadfile srcfile=&quot;${src.file}&quot; property=&quot;${src.file.replaced}&quot;&gt;
&lt;filterchain&gt;
&lt;replacetokens&gt;
&lt;token key=&quot;DATE&quot; value=&quot;${TODAY}&quot;/&gt;
&lt;/replacetokens&gt;
&lt;/filterchain&gt;
&lt;/loadfile&gt;
</PRE></BLOCKQUOTE>

<H3><a name="stripjavacomments">StripJavaComments</a></H3>

This filter reader strips away comments from the data,
using Java syntax guidelines. This filter does not
take in any parameters.
<P>
<H4>Example:</H4>

<BLOCKQUOTE><PRE>
&lt;loadfile srcfile=&quot;${java.src.file}&quot; property=&quot;${java.src.file.nocomments}&quot;&gt;
&lt;filterchain&gt;
&lt;filterreader classname=&quot;org.apache.tools.ant.filters.StripJavaComments&quot;/&gt;
&lt;/filterchain&gt;
&lt;/loadfile&gt;
</PRE></BLOCKQUOTE>

Convenience method:
<BLOCKQUOTE><PRE>
&lt;loadfile srcfile=&quot;${java.src.file}&quot; property=&quot;${java.src.file.nocomments}&quot;&gt;
&lt;filterchain&gt;
&lt;stripjavacomments/&gt;
&lt;/filterchain&gt;
&lt;/loadfile&gt;
</PRE></BLOCKQUOTE>

<H3><a name="striplinebreaks">StripLineBreaks</a></H3>

This filter reader strips away specific characters
from the data supplied to it.

<TABLE cellSpacing=0 cellPadding=2 border=1>
<TR>
<TD vAlign=top><B>Parameter Name</B></TD>
<TD vAlign=top><B>Parameter Value</B></TD>
<TD vAlign=top align="center"><B>Required</B></TD>
</TR>
<TR>
<TD vAlign=top>linebreaks</TD>
<TD vAlign=top align="center">Characters that are to
be stripped out. Defaults to &quot;\r\n&quot;</TD>
<TD vAlign=top align="center">No</TD>
</TR>
</TABLE>
<P>
<H4>Examples:</H4>

This strips the '\r' and '\n' characters.
<BLOCKQUOTE><PRE>
&lt;loadfile srcfile=&quot;${src.file}&quot; property=&quot;${src.file.contents}&quot;&gt;
&lt;filterchain&gt;
&lt;filterreader classname=&quot;org.apache.tools.ant.filters.StripLineBreaks&quot;/&gt;
&lt;/filterchain&gt;
&lt;/loadfile&gt;
</PRE></BLOCKQUOTE>

Convenience method:
<BLOCKQUOTE><PRE>
&lt;loadfile srcfile=&quot;${src.file}&quot; property=&quot;${src.file.contents}&quot;&gt;
&lt;filterchain&gt;
&lt;striplinebreaks/&gt;
&lt;/filterchain&gt;
&lt;/loadfile&gt;
</PRE></BLOCKQUOTE>

This treats the '(' and ')' characters as line break characters and
strips them.
<BLOCKQUOTE><PRE>
&lt;loadfile srcfile=&quot;${src.file}&quot; property=&quot;${src.file.contents}&quot;&gt;
&lt;filterchain&gt;
&lt;filterreader classname=&quot;org.apache.tools.ant.filters.StripLineBreaks&quot;&gt;
&lt;param name=&quot;linebreaks&quot; value=&quot;()&quot;/&gt;
&lt;/filterreader&gt;
&lt;/filterchain&gt;
&lt;/loadfile&gt;
</PRE></BLOCKQUOTE>

<H3><a name="tabstospaces">TabsToSpaces</a></H3>

This filter replaces tabs with spaces

<TABLE cellSpacing=0 cellPadding=2 border=1>
<TR>
<TD vAlign=top><B>Parameter Name</B></TD>
<TD vAlign=top><B>Parameter Value</B></TD>
<TD vAlign=top align="center"><B>Required</B></TD>
</TR>
<TR>
<TD vAlign=top>lines</TD>
<TD vAlign=top align="center">tablength
Defaults to &quot;8&quot;</TD>
<TD vAlign=top align="center">No</TD>
</TR>
</TABLE>
<P>
<H4>Examples:</H4>

This replaces tabs in ${src.file} with spaces.
<BLOCKQUOTE><PRE>
&lt;loadfile srcfile=&quot;${src.file}&quot; property=&quot;${src.file.notab}&quot;&gt;
&lt;filterchain&gt;
&lt;filterreader classname=&quot;org.apache.tools.ant.filters.TabsToSpaces&quot;/&gt;
&lt;/filterchain&gt;
&lt;/loadfile&gt;
</PRE></BLOCKQUOTE>

Convenience method:
<BLOCKQUOTE><PRE>
&lt;loadfile srcfile=&quot;${src.file}&quot; property=&quot;${src.file.notab}&quot;&gt;
&lt;filterchain&gt;
&lt;tabstospaces/&gt;
&lt;/filterchain&gt;
&lt;/loadfile&gt;
</PRE></BLOCKQUOTE>

<H3><a name="tailfilter">TailFilter</a></H3>

This filter reads the last few lines from the data supplied to it.

<TABLE cellSpacing=0 cellPadding=2 border=1>
<TR>
<TD vAlign=top><B>Parameter Name</B></TD>
<TD vAlign=top><B>Parameter Value</B></TD>
<TD vAlign=top align="center"><B>Required</B></TD>
</TR>
<TR>
<TD vAlign=top>lines</TD>
<TD vAlign=top align="center">Number of lines to be read.
Defaults to &quot;10&quot;</TD>
<TD vAlign=top align="center">No</TD>
</TR>
</TABLE>
<P>
<H4>Examples:</H4>

This stores the last 15 lines of the supplied data in the property ${src.file.tail}
<BLOCKQUOTE><PRE>
&lt;loadfile srcfile=&quot;${src.file}&quot; property=&quot;${src.file.tail}&quot;&gt;
&lt;filterchain&gt;
&lt;filterreader classname=&quot;org.apache.tools.ant.filters.TailFilter&quot;&gt;
&lt;param name=&quot;lines&quot; value=&quot;15&quot;/&gt;
&lt;/filterreader&gt;
&lt;/filterchain&gt;
&lt;/loadfile&gt;
</PRE></BLOCKQUOTE>

Convenience method:
<BLOCKQUOTE><PRE>
&lt;loadfile srcfile=&quot;${src.file}&quot; property=&quot;${src.file.tail}&quot;&gt;
&lt;filterchain&gt;
&lt;tailfilter lines=&quot;15&quot;/&gt;
&lt;/filterchain&gt;
&lt;/loadfile&gt;
</PRE></BLOCKQUOTE>


This stores the last 5 lines of the first 15 lines of the supplied
data in the property ${src.file.mid}
<BLOCKQUOTE><PRE>
&lt;loadfile srcfile=&quot;${src.file}&quot; property=&quot;${src.file.mid}&quot;&gt;
&lt;filterchain&gt;
&lt;filterreader classname=&quot;org.apache.tools.ant.filters.HeadFilter&quot;&gt;
&lt;param name=&quot;lines&quot; value=&quot;15&quot;/&gt;
&lt;/filterreader&gt;
&lt;filterreader classname=&quot;org.apache.tools.ant.filters.TailFilter&quot;&gt;
&lt;param name=&quot;lines&quot; value=&quot;5&quot;/&gt;
&lt;/filterreader&gt;
&lt;/filterchain&gt;
&lt;/loadfile&gt;
</PRE></BLOCKQUOTE>

Convenience method:
<BLOCKQUOTE><PRE>
&lt;loadfile srcfile=&quot;${src.file}&quot; property=&quot;${src.file.mid}&quot;&gt;
&lt;filterchain&gt;
&lt;HeadFilter lines=&quot;15&quot;/&gt;
&lt;TailFilter lines=&quot;5&quot;/&gt;
&lt;/filterchain&gt;
&lt;/loadfile&gt;
</PRE></BLOCKQUOTE>

<HR>

<P align=center>Copyright &copy; 2002 Apache Software Foundation. All rights
Reserved.</P></BODY></HTML>

+ 0
- 1
proposal/sandbox/filterreaders/src/etc/testcases/taskdefs/copy.filterset View File

@@ -1 +0,0 @@
This is the @TITLE@.

+ 0
- 78
proposal/sandbox/filterreaders/src/etc/testcases/taskdefs/copy.xml View File

@@ -1,78 +0,0 @@
<?xml version="1.0"?>

<project name="copy-test" basedir="." default="test1">

<target name="test1">
<copy file="copy.xml" tofile="copytest1.tmp" />
</target>
<target name="test2">
<copy file="copy.xml" todir="copytest1dir" overwrite="true"/>
</target>

<target name="test3">
<!-- create an empty file -->
<touch file="copytest3.tmp"/>
<!--wait -->
<sleep seconds="4"/>
<!-- copy a different file to two places -->
<copy file="copy.xml" tofile="copytest3a.tmp" overwrite="true"/>
<copy file="copy.xml" tofile="copytest3b.tmp" overwrite="true"/>
<!--wait -->
<sleep seconds="4"/>
<!-- copy an old file onto a newer file (should not work) -->
<copy file="copytest3.tmp" tofile="copytest3b.tmp" />
<!-- copy an older file onto a new one, should succeed -->
<copy file="copytest3.tmp" tofile="copytest3c.tmp"
overwrite="true"
preservelastmodified="true" />
<!-- copy a newer file onto an older one (should work) -->
<copy file="copytest3a.tmp" tofile="copytest3.tmp"
preservelastmodified="true" />
<!-- expected state :
3a.tmp==3.tmp==copy.xml
timeof(3a.tmp)==timeof(3.tmp)==now()-4
sizeof(3c)==0
timeof(3c.tmp)<timeof(3a.tmp);
3b.tmp==copy.xml
-->
</target>
<target name="test_single_file_fileset">
<copy tofile="copytest_single_file_fileset.tmp">
<fileset dir="." includes="copy.xml"/>
</copy>
</target>
<target name="testFilterSet">
<copy file="copy.filterset" tofile="copy.filterset.tmp">
<filterset>
<filter token="TITLE" value="Apache Ant Project"/>
</filterset>
</copy>
</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">
<delete file="copytest1.tmp"/>
<delete file="copytest3.tmp"/>
<delete file="copytest3a.tmp"/>
<delete file="copytest3b.tmp"/>
<delete file="copytest3c.tmp"/>
<delete file="copytest_single_file_fileset.tmp"/>
<delete file="copy.filterset.tmp"/>
<delete file="copy.filterchain.tmp"/>
<delete dir="copytest1dir"/>
</target>


</project>

+ 0
- 1
proposal/sandbox/filterreaders/src/etc/testcases/taskdefs/expected/copy.filterset.filtered View File

@@ -1 +0,0 @@
This is the Apache Ant Project.

+ 0
- 110
proposal/sandbox/filterreaders/src/etc/testcases/taskdefs/loadfile.xml View File

@@ -1,110 +0,0 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<project name="loadfile-test" basedir="." default="testLoadAFile">


<target name="init">
</target>

<target name="testNoSourcefileDefined" depends="init">
<loadfile property="foo" />
</target>

<target name="testNoPropertyDefined"
depends="init">
<loadfile srcFile="somefile" />
</target>


<target name="testNoSourcefilefound"
depends="init">
<loadfile property="missing" srcFile="somefile" />
</target>

<target name="testFailOnError"
depends="init">
<loadfile
property="testFailOnError"
srcFile="somefile"
failonerror="false"/>
</target>

<target name="testLoadAFile"
depends="init">
<echo
message="What's it going to be then, eh?"
file="loadfile1.tmp"
/>
<loadfile property="testLoadAFile" srcFile="loadfile1.tmp" />
<echo>${testLoadAFile}</echo>
</target>

<target name="testLoadAFileEnc"
depends="init">
<loadfile property="testLoadAFileEnc"
srcFile="loadfile.xml"
encoding="ISO-8859-1"/>
</target>

<target name="testEvalProps"
depends="init">
<property name="weather" value="rain" />
<echo
message="All these moments will be lost in time, like teardrops in the ${weather}"
file="loadfile1.tmp"
/>
<loadfile property="testEvalProps"
srcFile="loadfile1.tmp">
<filterchain>
<expandproperties/>
</filterchain>
</loadfile>
<echo>${testEvalProps}</echo>
</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"
depends="init">
<echo
message="1,&#10;2,&#13;3,&#13;&#10;4"
file="loadfile1.tmp"
/>
<loadfile property="testOneLine"
srcFile="loadfile1.tmp">
<filterchain>
<striplinebreaks/>
</filterchain>
</loadfile>
<echo>${testOneLine}</echo>
</target>


<target name="cleanup">
<delete file="loadfile1.tmp"/>
</target>

</project>

+ 0
- 30
proposal/sandbox/filterreaders/src/etc/testcases/taskdefs/move.xml View File

@@ -1,30 +0,0 @@
<?xml version="1.0"?>

<project name="move-test" basedir="." default="testFilterSet">

<target name="testFilterSet">
<copy file="copy.filterset" tofile="move.filterset"/>
<move file="move.filterset" tofile="move.filterset.tmp">
<filterset>
<filter token="TITLE" value="Apache Ant Project"/>
</filterset>
</move>
</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">
<delete file="move.filterset.tmp"/>
<delete file="move.filterchain.tmp"/>
</target>

</project>

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

@@ -1,207 +0,0 @@
/*
* 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);
}
}

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

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

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

@@ -1,65 +0,0 @@
/*
* 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);
}

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

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

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

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

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

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

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

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

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

@@ -1,208 +0,0 @@
/*
* 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);
}
}
}
}
}

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

@@ -1,234 +0,0 @@
/*
* 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);
}
}

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

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

+ 0
- 514
proposal/sandbox/filterreaders/src/main/org/apache/tools/ant/taskdefs/Copy.java View File

@@ -1,514 +0,0 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000-2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/

package org.apache.tools.ant.taskdefs;

import org.apache.tools.ant.Task;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.types.FileSet;
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.FilterSetCollection;
import org.apache.tools.ant.util.FileUtils;
import org.apache.tools.ant.util.FileNameMapper;
import org.apache.tools.ant.util.FlatFileNameMapper;
import org.apache.tools.ant.util.IdentityMapper;
import org.apache.tools.ant.util.SourceFileScanner;

import java.io.File;
import java.io.IOException;
import java.util.Vector;
import java.util.Hashtable;
import java.util.Enumeration;

/**
* A consolidated copy task. Copies a file or directory to a new file
* or directory. Files are only copied if the source file is newer
* than the destination file, or when the destination file does not
* exist. It is possible to explicitly overwrite existing files.</p>
*
* <p>This implementation is based on Arnout Kuiper's initial design
* document, the following mailing list discussions, and the
* copyfile/copydir tasks.</p>
*
* @author Glenn McAllister <a href="mailto:glennm@ca.ibm.com">glennm@ca.ibm.com</a>
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
* @author <A href="gholam@xtra.co.nz">Michael McCallum</A>
* @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a>
*
* @version $Revision$
*
* @ant:task category="filesystem"
*/
public class Copy extends Task {
protected File file = null; // the source file
protected File destFile = null; // the destination file
protected File destDir = null; // the destination directory
protected Vector filesets = new Vector();

protected boolean filtering = false;
protected boolean preserveLastModified = false;
protected boolean forceOverwrite = false;
protected boolean flatten = false;
protected int verbosity = Project.MSG_VERBOSE;
protected boolean includeEmpty = true;

protected Hashtable fileCopyMap = new Hashtable();
protected Hashtable dirCopyMap = new Hashtable();
protected Hashtable completeDirMap = new Hashtable();

protected Mapper mapperElement = null;
private Vector filterChains = new Vector();
private Vector filterSets = new Vector();
private FileUtils fileUtils;
private String encoding = null;

public Copy() {
fileUtils = FileUtils.newFileUtils();
}

protected FileUtils getFileUtils() {return fileUtils;}

/**
* Sets a single source file to copy.
*/
public void setFile(File file) {
this.file = file;
}

/**
* Sets the destination file.
*/
public void setTofile(File destFile) {
this.destFile = destFile;
}

/**
* Sets the destination directory.
*/
public void setTodir(File destDir) {
this.destDir = destDir;
}

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

/**
* Create a nested filterset
*/
public FilterSet createFilterSet() {
FilterSet filterSet = new FilterSet();
filterSets.addElement(filterSet);
return filterSet;
}

/**
* Give the copied files the same last modified time as the original files.
* @deprecated setPreserveLastModified(String) has been deprecated and
* replaced with setPreserveLastModified(boolean) to
* consistently let the Introspection mechanism work.
*/
public void setPreserveLastModified(String preserve) {
setPreserveLastModified(Project.toBoolean(preserve));
}

/**
* Give the copied files the same last modified time as the original files.
*/
public void setPreserveLastModified(boolean preserve) {
preserveLastModified = preserve;
}

/**
* Whether to give the copied files the same last modified time as
* the original files.
*
* @since 1.32, Ant 1.5
*/
public boolean getPreserveLastModified() {
return preserveLastModified;
}

/**
* Get the filtersets being applied to this operation.
*
* @return a vector of FilterSet objects
*/
protected Vector getFilterSets() {
return filterSets;
}

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

/**
* Sets filtering.
*/
public void setFiltering(boolean filtering) {
this.filtering = filtering;
}

/**
* Overwrite any existing destination file(s).
*/
public void setOverwrite(boolean overwrite) {
this.forceOverwrite = overwrite;
}

/**
* When copying directory trees, the files can be "flattened"
* into a single directory. If there are multiple files with
* the same name in the source directory tree, only the first
* file will be copied into the "flattened" directory, unless
* the forceoverwrite attribute is true.
*/
public void setFlatten(boolean flatten) {
this.flatten = flatten;
}

/**
* Used to force listing of all names of copied files.
*/
public void setVerbose(boolean verbose) {
if (verbose) {
this.verbosity = Project.MSG_INFO;
} else {
this.verbosity = Project.MSG_VERBOSE;
}
}

/**
* Used to copy empty directories.
*/
public void setIncludeEmptyDirs(boolean includeEmpty) {
this.includeEmpty = includeEmpty;
}

/**
* Adds a set of files (nested fileset attribute).
*/
public void addFileset(FileSet set) {
filesets.addElement(set);
}

/**
* Defines the FileNameMapper to use (nested mapper element).
*/
public Mapper createMapper() throws BuildException {
if (mapperElement != null) {
throw new BuildException("Cannot define more than one mapper",
location);
}
mapperElement = new Mapper(project);
return mapperElement;
}

/**
* Sets the character encoding
*
* @since 1.32, Ant 1.5
*/
public void setEncoding (String encoding) {
this.encoding = encoding;
}

/**
* @return the character encoding, <code>null</code> if not set.
*
* @since 1.32, Ant 1.5
*/
public String getEncoding() {
return encoding;
}

/**
* Performs the copy operation.
*/
public void execute() throws BuildException {
// make sure we don't have an illegal set of options
validateAttributes();

// deal with the single file
if (file != null) {
if (file.exists()) {
if (destFile == null) {
destFile = new File(destDir, file.getName());
}

if (forceOverwrite ||
(file.lastModified() > destFile.lastModified())) {
fileCopyMap.put(file.getAbsolutePath(), destFile.getAbsolutePath());
} else {
log(file + " omitted as " + destFile + " is up to date.",
Project.MSG_VERBOSE);
}
} else {
String message = "Could not find file "
+ file.getAbsolutePath() + " to copy.";
log(message);
throw new BuildException(message);
}
}

// deal with the filesets
for (int i=0; i<filesets.size(); i++) {
FileSet fs = (FileSet) filesets.elementAt(i);
DirectoryScanner ds = fs.getDirectoryScanner(project);
File fromDir = fs.getDir(project);

String[] srcFiles = ds.getIncludedFiles();
String[] srcDirs = ds.getIncludedDirectories();
boolean isEverythingIncluded = ds.isEverythingIncluded();
if (isEverythingIncluded
&& !flatten && mapperElement == null) {
completeDirMap.put(fromDir, destDir);
}
scan(fromDir, destDir, srcFiles, srcDirs);
}

// do all the copy operations now...
doFileOperations();

// clean up destDir again - so this instance can be used a second
// time without throwing an exception
if (destFile != null) {
destDir = null;
}
fileCopyMap.clear();
dirCopyMap.clear();
completeDirMap.clear();
}

//************************************************************************
// protected and private methods
//************************************************************************

/**
* Ensure we have a consistent and legal set of attributes, and set
* any internal flags necessary based on different combinations
* of attributes.
*/
protected void validateAttributes() throws BuildException {
if (file == null && filesets.size() == 0) {
throw new BuildException("Specify at least one source - a file or a fileset.");
}

if (destFile != null && destDir != null) {
throw new BuildException("Only one of tofile and todir may be set.");
}

if (destFile == null && destDir == null) {
throw new BuildException("One of tofile or todir must be set.");
}

if (file != null && file.exists() && file.isDirectory()) {
throw new BuildException("Use a fileset to copy directories.");
}

if (destFile != null && filesets.size() > 0) {
if (filesets.size() > 1) {
throw new BuildException(
"Cannot concatenate multiple files into a single file.");
} else {
FileSet fs = (FileSet) filesets.elementAt(0);
DirectoryScanner ds = fs.getDirectoryScanner(project);
String[] srcFiles = ds.getIncludedFiles();

if (srcFiles.length > 0) {
if (file == null) {
file = new File(ds.getBasedir(), srcFiles[0]);
filesets.removeElementAt(0);
} else {
throw new BuildException(
"Cannot concatenate multiple files into a single file.");
}
} else {
throw new BuildException(
"Cannot perform operation from directory to file.");
}
}
}

if (destFile != null) {
destDir = new File(destFile.getParent()); // be 1.1 friendly
}

}

/**
* Compares source files to destination files to see if they should be
* copied.
*/
protected void scan(File fromDir, File toDir, String[] files, String[] dirs) {
FileNameMapper mapper = null;
if (mapperElement != null) {
mapper = mapperElement.getImplementation();
} else if (flatten) {
mapper = new FlatFileNameMapper();
} else {
mapper = new IdentityMapper();
}

buildMap(fromDir, toDir, files, mapper, fileCopyMap);

if (includeEmpty) {
buildMap(fromDir, toDir, dirs, mapper, dirCopyMap);
}
}

protected void buildMap(File fromDir, File toDir, String[] names,
FileNameMapper mapper, Hashtable map) {

String[] toCopy = null;
if (forceOverwrite) {
Vector v = new Vector();
for (int i=0; i<names.length; i++) {
if (mapper.mapFileName(names[i]) != null) {
v.addElement(names[i]);
}
}
toCopy = new String[v.size()];
v.copyInto(toCopy);
} else {
SourceFileScanner ds = new SourceFileScanner(this);
toCopy = ds.restrict(names, fromDir, toDir, mapper);
}

for (int i = 0; i < toCopy.length; i++) {
File src = new File(fromDir, toCopy[i]);
File dest = new File(toDir, mapper.mapFileName(toCopy[i])[0]);
map.put( src.getAbsolutePath(), dest.getAbsolutePath() );
}
}

/**
* Actually does the file (and possibly empty directory) copies.
* This is a good method for subclasses to override.
*/
protected void doFileOperations() {
if (fileCopyMap.size() > 0) {
log("Copying " + fileCopyMap.size() +
" file" + (fileCopyMap.size() == 1 ? "" : "s") +
" to " + destDir.getAbsolutePath() );

Enumeration e = fileCopyMap.keys();
while (e.hasMoreElements()) {
String fromFile = (String) e.nextElement();
String toFile = (String) fileCopyMap.get(fromFile);

if( fromFile.equals( toFile ) ) {
log("Skipping self-copy of " + fromFile, verbosity);
continue;
}

try {
log("Copying " + fromFile + " to " + toFile, verbosity);

FilterSetCollection executionFilters = new FilterSetCollection();
if (filtering) {
executionFilters.addFilterSet(project.getGlobalFilterSet());
}
for (Enumeration filterEnum = filterSets.elements(); filterEnum.hasMoreElements();) {
executionFilters.addFilterSet((FilterSet)filterEnum.nextElement());
}
fileUtils.copyFile(fromFile, toFile, executionFilters, filterChains,
forceOverwrite, preserveLastModified,
encoding, project);
} catch (IOException ioe) {
String msg = "Failed to copy " + fromFile + " to " + toFile
+ " due to " + ioe.getMessage();
throw new BuildException(msg, ioe, location);
}
}
}

if (includeEmpty) {
Enumeration e = dirCopyMap.elements();
int count = 0;
while (e.hasMoreElements()) {
File d = new File((String)e.nextElement());
if (!d.exists()) {
if (!d.mkdirs()) {
log("Unable to create directory " + d.getAbsolutePath(), Project.MSG_ERR);
} else {
count++;
}
}
}

if (count > 0) {
log("Copied " + count +
" empty director" +
(count==1?"y":"ies") +
" to " + destDir.getAbsolutePath());
}
}
}

}

+ 0
- 228
proposal/sandbox/filterreaders/src/main/org/apache/tools/ant/taskdefs/LoadFile.java View File

@@ -1,228 +0,0 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001-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.util.ChainReaderHelper;

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

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

/**
* source file, usually null
*/
private File srcFile = null;

/**
* what to do when it goes pear-shaped
*/
private boolean failOnError = true;

/**
* Encoding to use for filenames, defaults to the platform's default
* encoding.
*/
private String encoding = null;

/**
* name of property
*/
private String property = null;

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

/**
* Encoding to use for filenames, defaults to the platform's default
* encoding. <p>
*
* For a list of possible values see <a href="http://java.sun.com/products/jdk/1.2/docs/guide/internat/encoding.doc.html">
* http://java.sun.com/products/jdk/1.2/docs/guide/internat/encoding.doc.html
* </a>.</p>
*
* @param encoding The new Encoding value
*/

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


/**
* Sets the Property attribute of the LoadFile object
*
* @param property The new Property value
*/
public final void setProperty(final String property) {
this.property = property;
}


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


/**
* Sets the Failonerror attribute of the LoadFile object
*
* @param fail The new Failonerror value
*/
public final void setFailonerror(final boolean fail) {
failOnError = fail;
}


/**
* read in a source file to a property
*
* @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 (property == null) {
throw new BuildException("output property not defined");
}
FileInputStream fis = null;
BufferedInputStream bis = null;
Reader instream = null;
log("loading "+srcFile+" into property "+property,Project.MSG_VERBOSE);
try {
final long len = srcFile.length();
log("file size = "+len,Project.MSG_DEBUG);
//discard most of really big files
final int size=(int) len;
//open up the file
fis = new FileInputStream(srcFile);
bis = new BufferedInputStream(fis);
if (encoding == null) {
instream = new InputStreamReader(bis);
}
else {
instream = new InputStreamReader(bis, encoding);
}

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);
}

} catch (final IOException ioe) {
final String message = "Unable to load file: " + ioe.toString();
if (failOnError) {
throw new BuildException(message, ioe, location);
}
else {
log(message, Project.MSG_ERR);
}
} catch (final BuildException be) {
if (failOnError) {
throw be;
}
else {
log(be.getMessage(), Project.MSG_ERR);
}
} 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
}

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

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

+ 0
- 312
proposal/sandbox/filterreaders/src/main/org/apache/tools/ant/taskdefs/Move.java View File

@@ -1,312 +0,0 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000-2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/

package org.apache.tools.ant.taskdefs;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.FilterSetCollection;
import org.apache.tools.ant.types.FilterSet;
import org.apache.tools.ant.types.FileSet;

import java.io.File;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Vector;

/**
* Moves a file or directory to a new file or directory. By default,
* the destination is overwriten when existing. When overwrite is
* turned off, then files are only moved if the source file is
* newer than the destination file, or when the destination file does
* not exist.</p>
*
* <p>Source files and directories are only deleted when the file or
* directory has been copied to the destination successfully. Filtering
* also works.</p>
*
* <p>This implementation is based on Arnout Kuiper's initial design
* document, the following mailing list discussions, and the
* copyfile/copydir tasks.</p>
*
* @author Glenn McAllister <a href="mailto:glennm@ca.ibm.com">glennm@ca.ibm.com</a>
* @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a>
* @version $Revision$
*
* @ant:task category="filesystem"
*/
public class Move extends Copy {

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

public Move() {
super();
forceOverwrite = true;
}

//************************************************************************
// protected and private methods
//************************************************************************

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

//Attempt complete directory renames, if any, first.
if (completeDirMap.size() > 0) {
Enumeration e = completeDirMap.keys();
while (e.hasMoreElements()) {
File fromDir = (File) e.nextElement();
File toDir = (File) completeDirMap.get(fromDir);
try {
log("Attempting to rename dir: " + fromDir +
" to " + toDir, verbosity);
renameFile(fromDir, toDir, filtering, forceOverwrite);
} catch (IOException ioe) {
String msg = "Failed to rename dir " + fromDir
+ " to " + toDir
+ " due to " + ioe.getMessage();
throw new BuildException(msg, ioe, location);
}
}
}
if (fileCopyMap.size() > 0) { // files to move
log("Moving " + fileCopyMap.size() + " files to " +
destDir.getAbsolutePath() );

Enumeration e = fileCopyMap.keys();
while (e.hasMoreElements()) {
String fromFile = (String) e.nextElement();
String toFile = (String) fileCopyMap.get(fromFile);

if( fromFile.equals( toFile ) ) {
log("Skipping self-move of " + fromFile, verbosity);
continue;
}

boolean moved = false;
File f = new File(fromFile);

if (f.exists()) { //Is this file still available to be moved?
File d = new File(toFile);

try {
log("Attempting to rename: " + fromFile +
" to " + toFile, verbosity);
moved = renameFile(f, d, filtering, forceOverwrite);
} catch (IOException ioe) {
String msg = "Failed to rename " + fromFile
+ " to " + toFile
+ " due to " + ioe.getMessage();
throw new BuildException(msg, ioe, location);
}

if (!moved) {
try {
log("Moving " + fromFile + " to " + toFile, verbosity);

FilterSetCollection executionFilters = new FilterSetCollection();
if (filtering) {
executionFilters.addFilterSet(project.getGlobalFilterSet());
}
for (Enumeration filterEnum = getFilterSets().elements(); filterEnum.hasMoreElements();) {
executionFilters.addFilterSet((FilterSet)filterEnum.nextElement());
}
getFileUtils().copyFile(f, d, executionFilters, filterChains,
forceOverwrite,
getPreserveLastModified(),
getEncoding(), project);

f = new File(fromFile);
if (!f.delete()) {
throw new BuildException("Unable to delete file "
+ f.getAbsolutePath());
}
} catch (IOException ioe) {
String msg = "Failed to copy " + fromFile + " to "
+ toFile
+ " due to " + ioe.getMessage();
throw new BuildException(msg, ioe, location);
}
}
}
}
}

if (includeEmpty) {
Enumeration e = dirCopyMap.elements();
int count = 0;
while (e.hasMoreElements()) {
File d = new File((String)e.nextElement());
if (!d.exists()) {
if (!d.mkdirs()) {
log("Unable to create directory " + d.getAbsolutePath(), Project.MSG_ERR);
} else {
count++;
}
}
}

if (count > 0) {
log("Moved " + count + " empty directories to " + destDir.getAbsolutePath());
}
}

if (filesets.size() > 0) {
Enumeration e = filesets.elements();
while (e.hasMoreElements()) {
FileSet fs = (FileSet)e.nextElement();
File dir = fs.getDir(project);

if (okToDelete(dir)) {
deleteDir(dir);
}
}
}
}

/**
* Its only ok to delete a directory tree if there are
* no files in it.
*/
protected boolean okToDelete(File d) {
String[] list = d.list();
if (list == null) {
return false;
} // maybe io error?

for (int i = 0; i < list.length; i++) {
String s = list[i];
File f = new File(d, s);
if (f.isDirectory()) {
if (!okToDelete(f)) {
return false;
}
} else {
return false; // found a file
}
}

return true;
}

/**
* Go and delete the directory tree.
*/
protected void deleteDir(File d) {
String[] list = d.list();
if (list == null) {
return;
} // on an io error list() can return null

for (int i = 0; i < list.length; i++) {
String s = list[i];
File f = new File(d, s);
if (f.isDirectory()) {
deleteDir(f);
} else {
throw new BuildException("UNEXPECTED ERROR - The file " + f.getAbsolutePath() + " should not exist!");
}
}
log("Deleting directory " + d.getAbsolutePath(), verbosity);
if (!d.delete()) {
throw new BuildException("Unable to delete directory " + d.getAbsolutePath());
}
}

/**
* Attempts to rename a file from a source to a destination.
* If overwrite is set to true, this method overwrites existing file
* even if the destination file is newer. Otherwise, the source file is
* renamed only if the destination file is older than it.
* Method then checks if token filtering is used. If it is, this method
* returns false assuming it is the responsibility to the copyFile method.
*
* @throws IOException
*/
protected boolean renameFile(File sourceFile, File destFile,
boolean filtering, boolean overwrite)
throws IOException, BuildException {

boolean renamed = true;
if ((filterSets != null && filterSets.size() > 0) ||
(filterChains != null && filterChains.size() > 0)) {
renamed = false;
} else {
if (!filtering) {
// ensure that parent dir of dest file exists!
// not using getParentFile method to stay 1.1 compat
String parentPath = destFile.getParent();
if (parentPath != null) {
File parent = new File(parentPath);
if (!parent.exists()) {
parent.mkdirs();
}
}

if (destFile.exists()) {
if (!destFile.delete()) {
throw new BuildException("Unable to remove existing file "
+ destFile);
}
}
renamed = sourceFile.renameTo(destFile);
} else {
renamed = false;
}
}
return renamed;
}
}

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

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

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

@@ -1,139 +0,0 @@
/*
* 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);
}
}

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

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

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

@@ -1,65 +0,0 @@
/*
* 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);
}

+ 0
- 744
proposal/sandbox/filterreaders/src/main/org/apache/tools/ant/util/FileUtils.java View File

@@ -1,744 +0,0 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001-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.util;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Reader;

import java.lang.reflect.Method;
import java.text.DecimalFormat;
import java.util.Random;
import java.util.Stack;
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.filters.util.ChainReaderHelper;
import org.apache.tools.ant.types.FilterSetCollection;

/**
* This class also encapsulates methods which allow Files to be
* refered to using abstract path names which are translated to native
* system file paths at runtime as well as copying files or setting
* there last modification time.
*
* @author duncan@x180.com
* @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:umagesh@apache.org">Magesh Umasankar</a>
*
* @version $Revision$
*/

public class FileUtils {
private static Random rand = new Random(System.currentTimeMillis());
private static Object lockReflection = new Object();
private static java.lang.reflect.Method setLastModified = null;

/**
* Factory method.
*/
public static FileUtils newFileUtils() {
return new FileUtils();
}

/**
* Empty constructor.
*/
protected FileUtils() {}

/**
* Convienence method to copy a file from a source to a destination.
* No filtering is performed.
*
* @throws IOException
*/
public void copyFile(String sourceFile, String destFile) throws IOException {
copyFile(new File(sourceFile), new File(destFile), null, false, false);
}

/**
* Convienence method to copy a file from a source to a destination
* specifying if token filtering must be used.
*
* @throws IOException
*/
public void copyFile(String sourceFile, String destFile, FilterSetCollection filters)
throws IOException
{
copyFile(new File(sourceFile), new File(destFile), filters, false, false);
}

/**
* Convienence method to copy a file from a source to a
* destination specifying if token filtering must be used and if
* source files may overwrite newer destination files.
*
* @throws IOException
*/
public void copyFile(String sourceFile, String destFile, FilterSetCollection filters,
boolean overwrite) throws IOException {
copyFile(new File(sourceFile), new File(destFile), filters,
overwrite, false);
}

/**
* Convienence method to copy a file from a source to a
* destination specifying if token filtering 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
*/
public void copyFile(String sourceFile, String destFile, FilterSetCollection filters,
boolean overwrite, boolean preserveLastModified)
throws IOException {
copyFile(new File(sourceFile), new File(destFile), filters,
overwrite, preserveLastModified);
}

/**
* Convienence method to copy a file from a source to a
* destination specifying if token filtering 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.14, Ant 1.5
*/
public void copyFile(String sourceFile, String destFile,
FilterSetCollection filters, boolean overwrite,
boolean preserveLastModified, String encoding)
throws IOException {
copyFile(new File(sourceFile), new File(destFile), filters,
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.
* No filtering is performed.
*
* @throws IOException
*/
public void copyFile(File sourceFile, File destFile) throws IOException {
copyFile(sourceFile, destFile, null, false, false);
}

/**
* Convienence method to copy a file from a source to a destination
* specifying if token filtering must be used.
*
* @throws IOException
*/
public void copyFile(File sourceFile, File destFile, FilterSetCollection filters)
throws IOException {
copyFile(sourceFile, destFile, filters, false, false);
}

/**
* Convienence method to copy a file from a source to a
* destination specifying if token filtering must be used and if
* source files may overwrite newer destination files.
*
* @throws IOException
*/
public void copyFile(File sourceFile, File destFile, FilterSetCollection filters,
boolean overwrite) throws IOException {
copyFile(sourceFile, destFile, filters, overwrite, false);
}

/**
* Convienence method to copy a file from a source to a
* destination specifying if token filtering 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
*/
public void copyFile(File sourceFile, File destFile, FilterSetCollection filters,
boolean overwrite, boolean preserveLastModified)
throws IOException {
copyFile(sourceFile, destFile, filters, overwrite,
preserveLastModified, null);
}

/**
* Convienence method to copy a file from a source to a
* destination specifying if token filtering must be used, if
* source files may overwrite newer destination files, the last
* modified time of <code>destFile</code> file should be made
* equal to the last modified time of <code>sourceFile</code> and
* which character encoding to assume.
*
* @throws IOException
*
* @since 1.14, Ant 1.5
*/
public void copyFile(File sourceFile, File destFile,
FilterSetCollection filters, boolean overwrite,
boolean preserveLastModified, String encoding)
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() ||
destFile.lastModified() < sourceFile.lastModified()) {

if (destFile.exists() && destFile.isFile()) {
destFile.delete();
}

// ensure that parent dir of dest file exists!
// not using getParentFile method to stay 1.1 compat
File parent = getParentFile(destFile);
if (!parent.exists()) {
parent.mkdirs();
}

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

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

if (encoding == null) {
in = new BufferedReader(new FileReader(sourceFile));
out = new BufferedWriter(new FileWriter(destFile));
} else {
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;
String newline = null;
String line = in.readLine();
while (line != null) {
if (line.length() == 0) {
out.newLine();
} else {
if (filterSetsAvailable) {
newline = filters.replaceTokens(line);
} else {
newline = line;
}
out.write(newline);
out.newLine();
}
line = in.readLine();
}

out.close();
in.close();
} else {
FileInputStream in = new FileInputStream(sourceFile);
FileOutputStream out = new FileOutputStream(destFile);

byte[] buffer = new byte[8 * 1024];
int count = 0;
do {
out.write(buffer, 0, count);
count = in.read(buffer, 0, buffer.length);
} while (count != -1);

in.close();
out.close();
}

if (preserveLastModified) {
setFileLastModified(destFile, sourceFile.lastModified());
}
}
}

/**
* see whether we have a setLastModified method in File and return it.
*/
protected final Method getSetLastModified() {
if (Project.getJavaVersion() == Project.JAVA_1_1) {
return null;
}
if (setLastModified == null) {
synchronized (lockReflection) {
if (setLastModified == null) {
try {
setLastModified =
java.io.File.class.getMethod("setLastModified",
new Class[] {Long.TYPE});
} catch (NoSuchMethodException nse) {
throw new BuildException("File.setlastModified not in JDK > 1.1?",
nse);
}
}
}
}
return setLastModified;
}

/**
* Calls File.setLastModified(long time) in a Java 1.1 compatible way.
*/
public void setFileLastModified(File file, long time) throws BuildException {
if (Project.getJavaVersion() == Project.JAVA_1_1) {
return;
}
Long[] times = new Long[1];
if (time < 0) {
times[0] = new Long(System.currentTimeMillis());
} else {
times[0] = new Long(time);
}

try {
getSetLastModified().invoke(file, times);
} catch (java.lang.reflect.InvocationTargetException ite) {
Throwable nested = ite.getTargetException();
throw new BuildException("Exception setting the modification time "
+ "of " + file, nested);
} catch (Throwable other) {
throw new BuildException("Exception setting the modification time "
+ "of " + file, other);
}
}

/**
* Interpret the filename as a file relative to the given file -
* unless the filename already represents an absolute filename.
*
* @param file the "reference" file for relative paths. This
* instance must be an absolute file and must not contain
* &quot;./&quot; or &quot;../&quot; sequences (same for \ instead
* of /). If it is null, this call is equivalent to
* <code>new java.io.File(filename)</code>.
*
* @param filename a file name
*
* @return an absolute file that doesn't contain &quot;./&quot; or
* &quot;../&quot; sequences and uses the correct separator for
* the current platform.
*/
public File resolveFile(File file, String filename) {
filename = filename.replace('/', File.separatorChar)
.replace('\\', File.separatorChar);

// deal with absolute files
if (filename.startsWith(File.separator) ||

(filename.length() >= 2 &&
Character.isLetter(filename.charAt(0)) &&
filename.charAt(1) == ':')

) {
return normalize(filename);
}

if (file == null) {
return new File(filename);
}

File helpFile = new File(file.getAbsolutePath());
StringTokenizer tok = new StringTokenizer(filename, File.separator);
while (tok.hasMoreTokens()) {
String part = tok.nextToken();
if (part.equals("..")) {
helpFile = getParentFile(helpFile);
if (helpFile == null) {
String msg = "The file or path you specified ("
+ filename + ") is invalid relative to "
+ file.getPath();
throw new BuildException(msg);
}
} else if (part.equals(".")) {
// Do nothing here
} else {
helpFile = new File(helpFile, part);
}
}

return new File(helpFile.getAbsolutePath());
}

/**
* &quot;normalize&quot; the given absolute path.
*
* <p>This includes:
* <ul>
* <li>Uppercase the drive letter if there is one.</li>
* <li>Remove redundant slashes after the drive spec.</li>
* <li>resolve all ./, .\, ../ and ..\ sequences.</li>
* <li>DOS style paths that start with a drive letter will have
* \ as the separator.</li>
* </ul>
*
* @throws java.lang.NullPointerException if the file path is
* equal to null.
*/
public File normalize(String path) {
String orig = path;

path = path.replace('/', File.separatorChar)
.replace('\\', File.separatorChar);

// make sure we are dealing with an absolute path
if (!path.startsWith(File.separator) &&
! (path.length() >= 2 &&
Character.isLetter(path.charAt(0)) &&
path.charAt(1) == ':')
) {
String msg = path + " is not an absolute path";
throw new BuildException(msg);
}

boolean dosWithDrive = false;
String root = null;
// Eliminate consecutive slashes after the drive spec
if (path.length() >= 2 &&
Character.isLetter(path.charAt(0)) &&
path.charAt(1) == ':') {

dosWithDrive = true;

char[] ca = path.replace('/', '\\').toCharArray();
StringBuffer sb = new StringBuffer();
sb.append(Character.toUpperCase(ca[0])).append(':');

for (int i = 2; i < ca.length; i++) {
if ((ca[i] != '\\') ||
(ca[i] == '\\' && ca[i - 1] != '\\')
) {
sb.append(ca[i]);
}
}

path = sb.toString().replace('\\', File.separatorChar);
if (path.length() == 2) {
root = path;
path = "";
} else {
root = path.substring(0, 3);
path = path.substring(3);
}

} else {
if (path.length() == 1) {
root = File.separator;
path = "";
} else if (path.charAt(1) == File.separatorChar) {
// UNC drive
root = File.separator+File.separator;
path = path.substring(2);
} else {
root = File.separator;
path = path.substring(1);
}
}

Stack s = new Stack();
s.push(root);
StringTokenizer tok = new StringTokenizer(path, File.separator);
while (tok.hasMoreTokens()) {
String thisToken = tok.nextToken();
if (".".equals(thisToken)) {
continue;
} else if ("..".equals(thisToken)) {
if (s.size() < 2) {
throw new BuildException("Cannot resolve path "+orig);
} else {
s.pop();
}
} else { // plain component
s.push(thisToken);
}
}

StringBuffer sb = new StringBuffer();
for (int i=0; i<s.size(); i++) {
if (i > 1) {
// not before the filesystem root and not after it, since root
// already contains one
sb.append(File.separatorChar);
}
sb.append(s.elementAt(i));
}


path = sb.toString();
if (dosWithDrive) {
path = path.replace('/', '\\');
}
return new File(path);
}

/**
* Create a temporary file in a given directory.
*
* <p>The file denoted by the returned abstract pathname did not
* exist before this method was invoked, any subsequent invocation
* of this method will yield a different file name.</p>
*
* <p>This method is different to File.createTempFile of JDK 1.2
* as it doesn't create the file itself and doesn't use platform
* specific temporary directory when the parentDir attribute is
* null.</p>
*
* @param parentDir Directory to create the temporary file in -
* current working directory will be assumed if this parameter is
* null.
*
* @since 1.8
*/
public File createTempFile(String prefix, String suffix, File parentDir) {

File result = null;
String parent = null;
if (parentDir != null) {
parent = parentDir.getPath();
}
DecimalFormat fmt = new DecimalFormat("#####");
synchronized (rand) {
do {
result = new File(parent,
prefix + fmt.format(rand.nextInt())
+ suffix);
} while (result.exists());
}
return result;
}

/**
* Compares the contents of two files.
*
* <p>simple but sub-optimal comparision algorithm. written for
* working rather than fast. Better would be a block read into
* buffers followed by long comparisions apart from the final 1-7
* bytes.</p>
*
* @since 1.9
*/
public boolean contentEquals(File f1, File f2) throws IOException {
if (f1.exists() != f2.exists()) {
return false;
}

if (!f1.exists()) {
// two not existing files are equal
return true;
}

if (f1.isDirectory() || f2.isDirectory()) {
// don't want to compare directory contents for now
return false;
}

if (f1.equals(f2)) {
// same filename => true
return true;
}

if (f1.length() != f2.length()) {
// different size =>false
return false;
}

InputStream in1 = null;
InputStream in2 = null;
try {
in1 = new BufferedInputStream(new FileInputStream(f1));
in2 = new BufferedInputStream(new FileInputStream(f2));

int expectedByte = in1.read();
while (expectedByte != -1) {
if (expectedByte != in2.read()) {
return false;
}
expectedByte = in1.read();
}
if (in2.read() != -1) {
return false;
}
return true;
} finally {
if (in1 != null) {
try {
in1.close();
} catch (IOException e) {}
}
if (in2 != null) {
try {
in2.close();
} catch (IOException e) {}
}
}
}

/**
* Emulation of File.getParentFile for JDK 1.1
*
* @since 1.10
*/
public File getParentFile(File f) {
if (f != null) {
String p = f.getParent();
if (p != null) {
return new File(p);
}
}
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;
}
}


+ 0
- 152
proposal/sandbox/filterreaders/src/testcases/org/apache/tools/ant/taskdefs/CopyTest.java View File

@@ -1,152 +0,0 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000-2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/

package org.apache.tools.ant.taskdefs;

import org.apache.tools.ant.BuildFileTest;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.util.FileUtils;
import java.io.File;
import java.io.IOException;

/**
* Tests FileSet using the Copy task.
*
* @author David Rees <dave@ubiqsoft.com>
*/
public class CopyTest extends BuildFileTest {

public CopyTest(String name) {
super(name);
}

public void setUp() {
configureProject("src/etc/testcases/taskdefs/copy.xml");
}

public void test1() {
executeTarget("test1");
File f = new File(getProjectDir(), "copytest1.tmp");
if ( !f.exists()) {
fail("Copy failed");
}
}

public void tearDown() {
executeTarget("cleanup");
}

public void test2() {
executeTarget("test2");
File f = new File(getProjectDir(), "copytest1dir/copy.xml");
if ( !f.exists()) {
fail("Copy failed");
}
}

public void test3() {
executeTarget("test3");
File file3 = new File(getProjectDir(), "copytest3.tmp");
assertTrue(file3.exists());
File file3a = new File(getProjectDir(), "copytest3a.tmp");
assertTrue(file3a.exists());
File file3b = new File(getProjectDir(), "copytest3b.tmp");
assertTrue(file3b.exists());
File file3c = new File(getProjectDir(), "copytest3c.tmp");
assertTrue(file3c.exists());

//file length checks rely on touch generating a zero byte file
if(file3.length()==0) {
fail("could not overwrite an existing, older file");
}
if(file3c.length()!=0) {
fail("could not force overwrite an existing, newer file");
}
if(file3b.length()==0) {
fail("unexpectedly overwrote an existing, newer file");
}

//file time checks for java1.2+
if (Project.getJavaVersion() != Project.JAVA_1_1) {
assertTrue(file3a.lastModified()==file3.lastModified());
assertTrue(file3c.lastModified()<file3a.lastModified());
}

}

public void testFilterSet() throws IOException {
executeTarget("testFilterSet");
FileUtils fileUtils = FileUtils.newFileUtils();
File tmp = new File(getProjectDir(), "copy.filterset.tmp");
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(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());
}
}

+ 0
- 185
proposal/sandbox/filterreaders/src/testcases/org/apache/tools/ant/taskdefs/LoadFileTest.java View File

@@ -1,185 +0,0 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001-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.BuildFileTest;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.BuildException;
import java.io.File;

/**
* Test the load file task
*
* @author Steve Loughran
* @created 10 December 2001
*/
public class LoadFileTest extends BuildFileTest {

/**
* Constructor for the LoadFileTest object
*
* @param name Description of Parameter
*/
public LoadFileTest(String name) {
super(name);
}


/**
* The JUnit setup method
*/
public void setUp() {
configureProject("src/etc/testcases/taskdefs/loadfile.xml");
}


/**
* The teardown method for JUnit
*/
public void tearDown() {
executeTarget("cleanup");
}


/**
* A unit test for JUnit
*/
public void testNoSourcefileDefined() {
expectBuildException("testNoSourcefileDefined",
"source file not defined");
}


/**
* A unit test for JUnit
*/
public void testNoPropertyDefined() {
expectBuildException("testNoPropertyDefined",
"output property not defined");
}


/**
* A unit test for JUnit
*/
public void testNoSourcefilefound() {
expectBuildExceptionContaining("testNoSourcefilefound",
"File not found",
"Unable to load file");
}

/**
* A unit test for JUnit
*/
public void testFailOnError()
throws BuildException {
expectPropertyUnset("testFailOnError","testFailOnError");
}


/**
* A unit test for JUnit
*/
public void testLoadAFile()
throws BuildException {
executeTarget("testLoadAFile");
if(project.getProperty("testLoadAFile").indexOf("eh?")<0) {
fail("property is not all in the file");
}
}


/**
* A unit test for JUnit
*/
public void testLoadAFileEnc()
throws BuildException {
executeTarget("testLoadAFileEnc");
if(project.getProperty("testLoadAFileEnc")==null) {
fail("file load failed");
}
}

/**
* A unit test for JUnit
*/
public void testEvalProps()
throws BuildException {
executeTarget("testEvalProps");
if(project.getProperty("testEvalProps").indexOf("rain")<0) {
fail("property eval broken");
}
}

/**
* 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
*/
public void testOneLine()
throws BuildException {
expectPropertySet("testOneLine","testOneLine","1,2,3,4");

}
}

+ 0
- 106
proposal/sandbox/filterreaders/src/testcases/org/apache/tools/ant/taskdefs/MoveTest.java View File

@@ -1,106 +0,0 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000-2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/

package org.apache.tools.ant.taskdefs;

import org.apache.tools.ant.BuildFileTest;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.util.FileUtils;
import java.io.File;
import java.io.IOException;

/**
* Tests the Move task.
*
* @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
*/
public class MoveTest extends BuildFileTest {

public MoveTest(String name) {
super(name);
}

public void setUp() {
configureProject("src/etc/testcases/taskdefs/move.xml");
}

public void tearDown() {
executeTarget("cleanup");
}

public void testFilterSet() throws IOException {
executeTarget("testFilterSet");
FileUtils fileUtils = FileUtils.newFileUtils();
File tmp = new File(getProjectDir(), "move.filterset.tmp");
File check = new File(getProjectDir(), "expected/copy.filterset.filtered");
assertTrue(tmp.exists());
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());
}

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