umagesh     2003/04/22 11:23:55

  Modified:    .        WHATSNEW build.xml
               docs/manual/CoreTypes filterchain.html
               src/etc/testcases/filters build.xml
               src/etc/testcases/filters/expected head-tail.headtail.test
               src/etc/testcases/filters/input head-tail.test
                        stripjavacomments.test
               src/etc/testcases/taskdefs copy.filterset
               src/main/org/apache/tools/ant/filters HeadFilter.java
                        StripJavaComments.java TailFilter.java
                        TokenFilter.java
               src/main/org/apache/tools/ant/util FileUtils.java
               src/testcases/org/apache/tools/ant/filters HeadTailTest.java
  Added:       src/testcases/org/apache/tools/ant/filters
                        NoNewLineTest.java
  Log:
  filter readers modify lineendings.
  
  PR: 18476
  
  Submitted by: [EMAIL PROTECTED] (peter reilly)
  
  Revision  Changes    Path
  1.402     +3 -0      ant/WHATSNEW
  
  Index: WHATSNEW
  ===================================================================
  RCS file: /home/cvs/ant/WHATSNEW,v
  retrieving revision 1.401
  retrieving revision 1.402
  diff -u -r1.401 -r1.402
  --- WHATSNEW  18 Apr 2003 22:36:18 -0000      1.401
  +++ WHATSNEW  22 Apr 2003 18:23:52 -0000      1.402
  @@ -32,6 +32,9 @@
   
   Fixed bugs:
   -----------
  +* Filter readers were not handling line endings properly.  Bugzilla
  +  Report 18476.
  +
   * Expand tasks did not behave as expected with PatternSets.
   
   * <property environment=... /> now works on OS/400.
  
  
  
  1.367     +1 -1      ant/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/ant/build.xml,v
  retrieving revision 1.366
  retrieving revision 1.367
  diff -u -r1.366 -r1.367
  --- build.xml 17 Apr 2003 13:09:17 -0000      1.366
  +++ build.xml 22 Apr 2003 18:23:53 -0000      1.367
  @@ -277,7 +277,7 @@
     <patternset id="teststhatfail">
       <exclude name="${optional.package}/BeanShellScriptTest.java"/>
       <exclude name="${ant.package}/taskdefs/ImportTest.java"/>
  -    <exclude name="${ant.package}/filters/HeadTailTest.java"/>
  +<!--    <exclude name="${ant.package}/filters/HeadTailTest.java"/> -->
     </patternset>
   
     <!--
  
  
  
  1.9       +30 -3     ant/docs/manual/CoreTypes/filterchain.html
  
  Index: filterchain.html
  ===================================================================
  RCS file: /home/cvs/ant/docs/manual/CoreTypes/filterchain.html,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- filterchain.html  14 Apr 2003 18:07:31 -0000      1.8
  +++ filterchain.html  22 Apr 2003 18:23:54 -0000      1.9
  @@ -898,10 +898,24 @@
   The tokenizer delimits lines
   by "\r", "\n" or "\r\n".
   This is the default tokenizer.
  +<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>includeDelims</TD>
  +    <TD vAlign=top>
  +      Include the line endings in the token.
  +      Default is false.
  +    </TD>
  +    <TD vAlign=top align="center">No</TD>
  +  </TR>
  +</TABLE>
   <H4>Examples:</H4>
   
   Convert input current line endings to unix style line endings.
  -<em>This currently has no effect when used in the copy task.</em>
   <BLOCKQUOTE><PRE>
   &lt;tokenfilter delimoutput=&quot;\n&quot;/&gt;
   </PRE></BLOCKQUOTE>
  @@ -955,13 +969,26 @@
     <tr>
       <td valign="top">delimsaretokens</td>
       <td valign="top">If this is true,
  -     each delimiter character is returned as a token</td>
  +      each delimiter character is returned as a token.
  +      Default is false.
  +    </td>
       <td valign="top" align="center">No</td>
     </tr>
     <tr>
       <td valign="top">suppressdelims</td>
  -    <td valign="top">If this is true, delimiters are not returned. </td>
  +    <td valign="top">
  +      If this is true, delimiters are not returned.
  +      Default is false.
  +    </td>
       <td valign="top" align="center">No</td>
  +  </tr>
  +  <tr>
  +    <td vAlign=top>includeDelims</td>
  +    <td vAlign=top>
  +      Include the delimiters in the token.
  +      Default is false.
  +    </td>
  +    <td vAlign=top align="center">No</td>
     </tr>
   </TABLE>
   
  
  
  
  1.5       +14 -3     ant/src/etc/testcases/filters/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/ant/src/etc/testcases/filters/build.xml,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- build.xml 9 Apr 2003 15:28:51 -0000       1.4
  +++ build.xml 22 Apr 2003 18:23:54 -0000      1.5
  @@ -20,11 +20,11 @@
           </filterreader>
         </filterchain>
       </copy>
  -    <!--fixcrlf srcdir="result" eol="lf">
  +    <!--<fixcrlf srcdir="result" eol="lf">
         <include name="linecontains.test"/>
  -    </fixcrlf-->
  +    </fixcrlf>-->
     </target>
  -
  +  
     <target name="testEscapeUnicode" depends="init">
       <copy todir="result" encoding="UTF-8">
         <fileset dir="input">
  @@ -57,6 +57,17 @@
           </replacetokens>
         </filterchain>
       </copy>
  +  </target>
  +
  +  <target name="testNoAddNewLine" depends="init">
  +    <concat destfile="result/nonl">This has no new lines</concat>
  +    <copy file="result/nonl" tofile="result/nonl-copyfilter">
  +      <filterchain><tokenfilter/></filterchain>
  +    </copy>
  +    <condition property="filterchain.files.are.same">
  +      <filesmatch file1="result/nonl" file2="result/nonl-copyfilter"/>
  +    </condition>
  +    <fail unless="filterchain.files.are.same">File was modified</fail>
     </target>
   
   </project>
  
  
  
  1.2       +1 -0      
ant/src/etc/testcases/filters/expected/head-tail.headtail.test
  
  Index: head-tail.headtail.test
  ===================================================================
  RCS file: 
/home/cvs/ant/src/etc/testcases/filters/expected/head-tail.headtail.test,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- head-tail.headtail.test   14 Apr 2003 15:37:45 -0000      1.1
  +++ head-tail.headtail.test   22 Apr 2003 18:23:54 -0000      1.2
  @@ -1 +1,2 @@
  +Line  3
   Line  4
  
  
  
  1.2       +1 -1      ant/src/etc/testcases/filters/input/head-tail.test
  
  Index: head-tail.test
  ===================================================================
  RCS file: /home/cvs/ant/src/etc/testcases/filters/input/head-tail.test,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- head-tail.test    14 Apr 2003 15:37:47 -0000      1.1
  +++ head-tail.test    22 Apr 2003 18:23:54 -0000      1.2
  @@ -57,4 +57,4 @@
   Line 57
   Line 58
   Line 59
  -Line 60
  \ No newline at end of file
  +Line 60
  
  
  
  1.2       +1 -1      
ant/src/etc/testcases/filters/input/stripjavacomments.test
  
  Index: stripjavacomments.test
  ===================================================================
  RCS file: 
/home/cvs/ant/src/etc/testcases/filters/input/stripjavacomments.test,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- stripjavacomments.test    27 Mar 2003 16:54:00 -0000      1.1
  +++ stripjavacomments.test    22 Apr 2003 18:23:54 -0000      1.2
  @@ -27,4 +27,4 @@
       private String url = "http://ant.apache.org/";; // very difficult!
       private String url2 = "\"http://ant.apache.org/\"";; // even worse
   
  -}
  \ No newline at end of file
  +}
  
  
  
  1.2       +1 -1      ant/src/etc/testcases/taskdefs/copy.filterset
  
  Index: copy.filterset
  ===================================================================
  RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/copy.filterset,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- copy.filterset    3 Mar 2002 01:30:03 -0000       1.1
  +++ copy.filterset    22 Apr 2003 18:23:54 -0000      1.2
  @@ -1 +1 @@
  -This is the @[EMAIL PROTECTED]
  \ No newline at end of file
  +This is the @[EMAIL PROTECTED]
  
  
  
  1.9       +42 -17    ant/src/main/org/apache/tools/ant/filters/HeadFilter.java
  
  Index: HeadFilter.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/main/org/apache/tools/ant/filters/HeadFilter.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- HeadFilter.java   14 Apr 2003 15:37:47 -0000      1.8
  +++ HeadFilter.java   22 Apr 2003 18:23:54 -0000      1.9
  @@ -88,6 +88,14 @@
       /** Number of lines to be skipped. */
       private long skip = 0;
   
  +    /** A line tokenizer */
  +    private TokenFilter.LineTokenizer lineTokenizer = null;
  +    
  +    /** the current line from the input stream */
  +    private String    line      = null;
  +    /** the position in the current line */
  +    private int       linePos   = 0;
  +
       /**
        * Constructor for "dummy" instances.
        *
  @@ -105,6 +113,8 @@
        */
       public HeadFilter(final Reader in) {
           super(in);
  +        lineTokenizer = new TokenFilter.LineTokenizer();
  +        lineTokenizer.setIncludeDelims(true);
       }
   
       /**
  @@ -125,23 +135,18 @@
               setInitialized(true);
           }
   
  -        int ch = -1;
  -
  -        // skip the lines (if set)
  -        while (skip > 0) {
  -            for (int tmp = in.read(); tmp != '\n'; tmp = in.read());
  -            skip--;
  -        }
  -
  -        if ( (linesRead < lines) || (lines < 0) ){
  -
  -            ch = in.read();
  -
  -            if (ch == '\n') {
  -                linesRead++;
  -            }
  +        while (line == null || line.length() == 0) {
  +            line = lineTokenizer.getToken(in);
  +            if (line == null)
  +                return -1;
  +            line = headFilter(line);
  +            linePos = 0;
           }
   
  +        int ch = line.charAt(linePos);
  +        linePos++;
  +        if (linePos == line.length())
  +            line = null;
           return ch;
       }
   
  @@ -202,6 +207,7 @@
       /**
        * Scans the parameters list for the "lines" parameter and uses
        * it to set the number of lines to be returned in the filtered stream.
  +     * also scan for skip parameter.
        */
       private final void initialize() {
           Parameter[] params = getParameters();
  @@ -209,13 +215,32 @@
               for (int i = 0; i < params.length; i++) {
                   if (LINES_KEY.equals(params[i].getName())) {
                       lines = new Long(params[i].getValue()).longValue();
  -                    break;
  +                    continue;
                   }
                   if (SKIP_KEY.equals(params[i].getName())) {
                       skip = new Long(params[i].getValue()).longValue();
  -                    break;
  +                    continue;
                   }
               }
           }
  +    }
  +
  +    /**
  +     * implements a head filter on the input stream
  +     */
  +    private String headFilter(String line) {
  +        linesRead++;
  +        if (skip > 0) {
  +            if ((linesRead - 1) < skip) {
  +                return null;
  +            }
  +        }
  +
  +        if (lines > 0) {
  +            if (linesRead > (lines + skip)) {
  +                return null;
  +            }
  +        }
  +        return line;
       }
   }
  
  
  
  1.10      +17 -11    
ant/src/main/org/apache/tools/ant/filters/StripJavaComments.java
  
  Index: StripJavaComments.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/main/org/apache/tools/ant/filters/StripJavaComments.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- StripJavaComments.java    27 Mar 2003 17:03:13 -0000      1.9
  +++ StripJavaComments.java    22 Apr 2003 18:23:54 -0000      1.10
  @@ -66,28 +66,28 @@
   public final class StripJavaComments
       extends BaseFilterReader
       implements ChainableReader {
  -        
  -    /** 
  +
  +    /**
        * The read-ahead character, used for effectively pushing a single
  -     * character back. A value of -1 indicates that no character is in the 
  +     * character back. A value of -1 indicates that no character is in the
        * buffer.
        */
       private int readAheadCh = -1;
   
  -    /** 
  +    /**
        * Whether or not the parser is currently in the middle of a string
        * literal.
        */
       private boolean inString = false;
   
  -    /** 
  +    /**
        * Whether or not the last char has been a backslash.
        */
       private boolean quoted = false;
   
       /**
        * Constructor for "dummy" instances.
  -     * 
  +     *
        * @see BaseFilterReader#BaseFilterReader()
        */
       public StripJavaComments() {
  @@ -107,12 +107,12 @@
       /**
        * Returns the next character in the filtered stream, not including
        * Java comments.
  -     * 
  +     *
        * @return the next character in the resulting stream, or -1
        * if the end of the resulting stream has been reached
  -     * 
  +     *
        * @exception IOException if the underlying stream throws an IOException
  -     * during reading     
  +     * during reading
        */
       public final int read() throws IOException {
           int ch = -1;
  @@ -132,9 +132,15 @@
                       if (ch == '/') {
                           ch = in.read();
                           if (ch == '/') {
  +                            int prevCh = -1;
                               while (ch != '\n' && ch != -1) {
  +                                prevCh = ch;
                                   ch = in.read();
                               }
  +                            if ( ch == '\n' && prevCh == '\r' ) {
  +                                readAheadCh = ch;
  +                                ch = prevCh;
  +                            }
                           } else if (ch == '*') {
                               while (ch != -1) {
                                   ch = in.read();
  @@ -165,10 +171,10 @@
       /**
        * Creates a new StripJavaComments using the passed in
        * Reader for instantiation.
  -     * 
  +     *
        * @param rdr A Reader object providing the underlying stream.
        *            Must not be <code>null</code>.
  -     * 
  +     *
        * @return a new filter based on this configuration, but filtering
        *         the specified reader
        */
  
  
  
  1.9       +69 -74    ant/src/main/org/apache/tools/ant/filters/TailFilter.java
  
  Index: TailFilter.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/main/org/apache/tools/ant/filters/TailFilter.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- TailFilter.java   14 Apr 2003 15:37:47 -0000      1.8
  +++ TailFilter.java   22 Apr 2003 18:23:54 -0000      1.9
  @@ -55,6 +55,7 @@
   
   import java.io.IOException;
   import java.io.Reader;
  +import java.util.LinkedList;
   import org.apache.tools.ant.types.Parameter;
   
   /**
  @@ -90,18 +91,22 @@
       /** Number of lines to be skipped. */
       private long skip = 0;
   
  -    /** 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;
  -
       /** Whether or not read-ahead been completed. */
       private boolean completedReadAhead = false;
   
       /** Current index position on the buffer. */
       private int bufferPos = 0;
   
  +    /** A line tokenizer */
  +    private TokenFilter.LineTokenizer lineTokenizer = null;
  +    
  +    /** the current line from the input stream */
  +    private String    line      = null;
  +    /** the position in the current line */
  +    private int       linePos   = 0;
  +
  +    private LinkedList lineList = new LinkedList();
  +    
       /**
        * Constructor for "dummy" instances.
        *
  @@ -119,6 +124,8 @@
        */
       public TailFilter(final Reader in) {
           super(in);
  +        lineTokenizer = new TokenFilter.LineTokenizer();
  +        lineTokenizer.setIncludeDelims(true);
       }
   
       /**
  @@ -140,74 +147,19 @@
               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 (lines > 0) {
  -                    if (ch == '\n' || ch == -1) {
  -                        ++linesRead;
  -
  -                        if ((linesRead == lines + skip)) {
  -                            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;
  -        }
  -
  -        // Because the complete stream is read into the buffer I can delete
  -        // the "skip lines" from back to the beginning.
  -        if (skip > 0) {
  -            // searching...
  -            int i;
  -            for (i = buffer.length - 1; skip > 0; i--) {
  -                if (buffer[i]=='\n') {
  -                    skip--;
  -                }
  -            }
  -
  -           // cut the buffer to the new length
  -           char[] newBuffer = new char[i];
  -           System.arraycopy(buffer, 0, newBuffer, 0, i);
  -           buffer = newBuffer;
  -
  -           // donīt forget to set the "lastposition" new
  -           bufferPos = i;
  +        while (line == null || line.length() == 0) {
  +            line = lineTokenizer.getToken(in);
  +            line = tailFilter(line);
  +            if (line == null)
  +                return -1;
  +            linePos = 0;
           }
   
  -        ++returnedCharPos;
  -        if (returnedCharPos >= bufferPos) {
  -            return -1;
  -        } else {
  -            return buffer[returnedCharPos];
  -        }
  +        int ch = line.charAt(linePos);
  +        linePos++;
  +        if (linePos == line.length())
  +            line = null;
  +        return ch;
       }
   
       /**
  @@ -267,6 +219,7 @@
       /**
        * Scans the parameters list for the "lines" parameter and uses
        * it to set the number of lines to be returned in the filtered stream.
  +     * also scan for "skip" parameter.
        */
       private final void initialize() {
           Parameter[] params = getParameters();
  @@ -274,13 +227,55 @@
               for (int i = 0; i < params.length; i++) {
                   if (LINES_KEY.equals(params[i].getName())) {
                       setLines(new Long(params[i].getValue()).longValue());
  -                    break;
  +                    continue;
                   }
                   if (SKIP_KEY.equals(params[i].getName())) {
                       skip = new Long(params[i].getValue()).longValue();
  -                    break;
  +                    continue;
                   }
               }
           }
  +    }
  +
  +    /**
  +     * implement a tail filter on a stream of lines.
  +     * line = null is the end of the stream.
  +     * @return "" while reading in the lines,
  +     *         line while outputing the lines
  +     *         null at the end of outputting the lines
  +     */
  +    private String tailFilter(String line) {
  +        if (! completedReadAhead) {
  +            if (line != null) {
  +                lineList.add(line);
  +                if (lines == -1) {
  +                    if (lineList.size() > skip) {
  +                        return (String) lineList.removeFirst();
  +                    }
  +                }
  +                else {
  +                    long linesToKeep = lines + (skip > 0 ? skip : 0);
  +                    if (linesToKeep < lineList.size()) {
  +                        lineList.removeFirst();
  +                    }
  +                }
  +                return "";
  +            }
  +            completedReadAhead = true;
  +            if (skip > 0) {
  +                for (int i = 0; i < skip; ++i) {
  +                    lineList.removeLast();
  +                }
  +            }
  +            if (lines > -1) {
  +                while (lineList.size() > lines) {
  +                    lineList.removeFirst();
  +                }
  +            }
  +        }
  +        if (lineList.size() > 0) {
  +            return (String) lineList.removeFirst();
  +        }
  +        return null;
       }
   }
  
  
  
  1.2       +47 -4     
ant/src/main/org/apache/tools/ant/filters/TokenFilter.java
  
  Index: TokenFilter.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/main/org/apache/tools/ant/filters/TokenFilter.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- TokenFilter.java  14 Apr 2003 18:02:24 -0000      1.1
  +++ TokenFilter.java  22 Apr 2003 18:23:54 -0000      1.2
  @@ -389,9 +389,20 @@
       public static class LineTokenizer
           implements Tokenizer
       {
  -        String lineEnd = "";
  -        int    pushed = -2;
  -
  +        private String  lineEnd = "";
  +        private int     pushed = -2;
  +        private boolean includeDelims = false;
  +
  +        /**
  +         * attribute includedelims - whether to include
  +         * the line ending with the line, or to return
  +         * it in the posttoken
  +         */
  +        
  +        public void setIncludeDelims(boolean includeDelims) {
  +            this.includeDelims = true;
  +        }
  +        
           public String getToken(Reader in)
               throws IOException
           {
  @@ -440,12 +451,19 @@
                   lineEnd = "\r";
               }
   
  +            if (includeDelims) {
  +                line.append(lineEnd);
  +            }
               return line.toString();
           }
   
           public String getPostToken() {
  +            if (includeDelims) {
  +                return "";
  +            }
               return lineEnd;
           }
  +
       }
   
       /**
  @@ -464,17 +482,39 @@
           private char[] delims = null;
           private boolean delimsAreTokens = false;
           private boolean suppressDelims = false;
  +        private boolean includeDelims = false;
   
  +        /**
  +         * attribute delims - the delimeter characters
  +         */
           public void setDelims(String delims) {
               this.delims = resolveBackSlash(delims).toCharArray();
           }
   
  +        /**
  +         * attribute delimsaretokens - treat delimiters as
  +         * separate tokens.
  +         */
  +          
           public void setDelimsAreTokens(boolean delimsAreTokens) {
               this.delimsAreTokens = delimsAreTokens;
           }
  +        /**
  +         * attribute suppressdelims - suppress delimiters.
  +         * default - false
  +         */
           public void setSuppressDelims(boolean suppressDelims) {
               this.suppressDelims = suppressDelims;
           }
  +        
  +        /**
  +         * attribute includedelims - treat delimiters as part
  +         * of the token.
  +         * default - false
  +         */
  +        public void setIncludeDelims(boolean includeDelims) {
  +            this.includeDelims = true;
  +        }
   
           public String getToken(Reader in)
               throws IOException
  @@ -525,11 +565,14 @@
                   ch = in.read();
               }
               intraString = padding.toString();
  +            if (includeDelims) {
  +                word.append(intraString);
  +            }
               return word.toString();
           }
   
           public String getPostToken() {
  -            if (suppressDelims)
  +            if (suppressDelims || includeDelims)
                   return "";
               return intraString;
           }
  
  
  
  1.41      +55 -5     ant/src/main/org/apache/tools/ant/util/FileUtils.java
  
  Index: FileUtils.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/util/FileUtils.java,v
  retrieving revision 1.40
  retrieving revision 1.41
  diff -u -r1.40 -r1.41
  --- FileUtils.java    27 Mar 2003 16:32:19 -0000      1.40
  +++ FileUtils.java    22 Apr 2003 18:23:55 -0000      1.41
  @@ -399,10 +399,7 @@
               final boolean filterChainsAvailable = (filterChains != null
                                                      && filterChains.size() > 
0);
   
  -            if (filterSetsAvailable || filterChainsAvailable
  -                || (inputEncoding != null 
  -                    && !inputEncoding.equals(outputEncoding))
  -                || (inputEncoding == null && outputEncoding != null)) {
  +            if (filterSetsAvailable) {
                   BufferedReader in = null;
                   BufferedWriter out = null;
   
  @@ -459,6 +456,59 @@
                           in.close();
                       }
                   }
  +            } else if (filterChainsAvailable
  +                       || (inputEncoding != null 
  +                           && !inputEncoding.equals(outputEncoding))
  +                       || (inputEncoding == null && outputEncoding != null)) 
{
  +                BufferedReader in = null;
  +                BufferedWriter out = null;
  + 
  +                 try {
  +                     if (inputEncoding == null) {
  +                         in = new BufferedReader(new FileReader(sourceFile));
  +                     } else {
  +                         in =
  +                             new BufferedReader(
  +                                 new InputStreamReader(
  +                                     new FileInputStream(sourceFile),
  +                                     inputEncoding));
  +                     }
  + 
  +                     if (outputEncoding == null) {
  +                         out = new BufferedWriter(new FileWriter(destFile));
  +                     } else {
  +                         out =
  +                             new BufferedWriter(
  +                                 new OutputStreamWriter(
  +                                     new FileOutputStream(destFile),
  +                                     outputEncoding));
  +                     }
  + 
  +                     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);
  +                     }
  +                     char buffer[] = new char[1024*8];
  +                     while (true) {
  +                         int nRead = in.read(buffer, 0, buffer.length);
  +                         if (nRead == -1) {
  +                             break;
  +                         }
  +                         out.write(buffer, 0, nRead);
  +                      }
  +                  } finally {
  +                      if (out != null) {
  +                         out.close();
  +                     }
  +                     if (in != null) {
  +                         in.close();
  +                     }
  +                 }
               } else {
                   FileInputStream in = null;
                   FileOutputStream out = null;
  
  
  
  1.2       +28 -2     
ant/src/testcases/org/apache/tools/ant/filters/HeadTailTest.java
  
  Index: HeadTailTest.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/testcases/org/apache/tools/ant/filters/HeadTailTest.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- HeadTailTest.java 14 Apr 2003 15:37:48 -0000      1.1
  +++ HeadTailTest.java 22 Apr 2003 18:23:55 -0000      1.2
  @@ -112,6 +112,19 @@
           assertTrue("testHeadLinesSkip: Result not like expected", 
fu.contentEquals(expected, result));
       }
   
  +/*
  +    public void testFilterReaderHeadLinesSkip() throws IOException {
  +        executeTarget("testFilterReaderHeadLinesSkip");
  +        File expected = getProject().resolveFile(
  +            "expected/head-tail.filterReaderHeadLinesSkip.test");
  +        File result = getProject().resolveFile(
  +            "result/head-tail.headLinesSkip.test");
  +        FileUtils fu = FileUtils.newFileUtils();
  +        assertTrue("testFilterReaderHeadLinesSkip: Result not like expected",
  +                   fu.contentEquals(expected, result));
  +    }
  +
  +*/
       public void testTail() throws IOException {
           executeTarget("testTail");
           File expected = 
getProject().resolveFile("expected/head-tail.tail.test");
  @@ -144,10 +157,23 @@
           assertTrue("testTailLinesSkip: Result not like expected", 
fu.contentEquals(expected, result));
       }
   
  +/*
  +    public void testFilterReaderTailLinesSkip() throws IOException {
  +        executeTarget("testFilterReaderTailLinesSkip");
  +        File expected = getProject().resolveFile(
  +            "expected/head-tail.filterReaderTailLinesSkip.test");
  +        File result = getProject().resolveFile(
  +            "result/head-tail.tailLinesSkip.test");
  +        FileUtils fu = FileUtils.newFileUtils();
  +        assertTrue("testFilterReaderTailLinesSkip: Result not like expected",
  +                   fu.contentEquals(expected, result));
  +    }
  +*/
  +
       public void testHeadTail() throws IOException {
           executeTarget("testHeadTail");
  -        File expected = 
getProject().resolveFile("expected/head-tail.headTail.test");
  -        File result = 
getProject().resolveFile("result/head-tail.headTail.test");
  +        File expected = 
getProject().resolveFile("expected/head-tail.headtail.test");
  +        File result = 
getProject().resolveFile("result/head-tail.headtail.test");
           FileUtils fu = FileUtils.newFileUtils();
           assertTrue("testHeadTail: Result not like expected", 
fu.contentEquals(expected, result));
       }
  
  
  
  1.1                  
ant/src/testcases/org/apache/tools/ant/filters/NoNewLineTest.java
  
  Index: NoNewLineTest.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "Ant" and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  package org.apache.tools.ant.filters;
  
  import java.io.File;
  import java.io.IOException;
  
  import org.apache.tools.ant.BuildFileTest;
  import org.apache.tools.ant.util.FileUtils;
  
  /** JUnit Testcases for No new line when filterchain used
   * @author Peter Reilly
   */
  
  
  public class NoNewLineTest extends BuildFileTest {
  
      public NoNewLineTest(String name) {
          super(name);
      }
  
      public void setUp() {
          configureProject("src/etc/testcases/filters/build.xml");
      }
  
      public void tearDown() {
          executeTarget("cleanup");
      }
  
      public void testNoAddNewLine() throws IOException {
          executeTarget("testNoAddNewLine");
      }
  
  
  }
  
  
  
  

Reply via email to