jhm 2003/09/18 08:39:26 Modified: . WHATSNEW Added: src/etc/testcases/filters concat.xml src/main/org/apache/tools/ant/filters ConcatFilter.java src/testcases/org/apache/tools/ant/filters ConcatFilterTest.java Log: New filter <concatfilter>. Adds the content of file at the beginning or end of a file. Discussion started at http://marc.theaimsgroup.com/?l=ant-user&m=106336791228585&w=2 Revision Changes Path 1.501 +4 -0 ant/WHATSNEW Index: WHATSNEW =================================================================== RCS file: /home/cvs/ant/WHATSNEW,v retrieving revision 1.500 retrieving revision 1.501 diff -u -r1.500 -r1.501 --- WHATSNEW 16 Sep 2003 10:38:14 -0000 1.500 +++ WHATSNEW 18 Sep 2003 15:39:26 -0000 1.501 @@ -604,6 +604,10 @@ used to checkout/list files based on a date instead of a label. Bugzilla Report 20578. +* New filter <concatfilter>. Adds the content of file at the beginning + or end of a file. Discussion started at + http://marc.theaimsgroup.com/?l=ant-user&m=106336791228585&w=2 + Changes from Ant 1.5.3 to Ant 1.5.4 =================================== 1.1 ant/src/etc/testcases/filters/concat.xml Index: concat.xml =================================================================== <?xml version="1.0"?> <project default="cleanup" basedir="."> <target name="init"> <mkdir dir="result" /> <echo file="result/before.txt" message="this-should-be-the-first-line${line.separator}"/> <echo file="result/after.txt" message="this-should-be-the-last-line${line.separator}"/> <copy file="input/head-tail.test" tofile="input/concatfilter.test"/> <fixcrlf srcDir="input" includes="concatfilter.test"/> </target> <target name="cleanup"> <delete dir="result"/> <delete> <fileset dir="input" includes="concatfilter.test"/> </delete> </target> <target name="testFilterReaderNoArgs" depends="init"> <copy file="input/concatfilter.test" tofile="result/concat.filterReaderNoArgs.test"> <filterchain> <filterreader classname="org.apache.tools.ant.filters.ConcatFilter"/> </filterchain> </copy> </target> <target name="testFilterReaderBefore" depends="init"> <copy file="input/concatfilter.test" tofile="result/concat.filterReaderBefore.test"> <filterchain> <filterreader classname="org.apache.tools.ant.filters.ConcatFilter"> <param name="before" value="result/before.txt"/> </filterreader> </filterchain> </copy> </target> <target name="testFilterReaderAfter" depends="init"> <copy file="input/concatfilter.test" tofile="result/concat.filterReaderAfter.test"> <filterchain> <filterreader classname="org.apache.tools.ant.filters.ConcatFilter"> <param name="after" value="result/after.txt"/> </filterreader> </filterchain> </copy> </target> <target name="testFilterReaderBeforeAfter" depends="init"> <copy file="input/concatfilter.test" tofile="result/concat.filterReaderBeforeAfter.test"> <filterchain> <filterreader classname="org.apache.tools.ant.filters.ConcatFilter"> <param name="before" value="result/before.txt"/> <param name="after" value="result/after.txt"/> </filterreader> </filterchain> </copy> </target> <target name="testConcatFilter" depends="init"> <typedef name="concatfilter" classname="org.apache.tools.ant.filters.ConcatFilter"/> <copy file="input/concatfilter.test" tofile="result/concat.concatfilter.test"> <filterchain> <concatfilter/> </filterchain> </copy> </target> <target name="testConcatFilterBefore" depends="init"> <typedef name="concatfilter" classname="org.apache.tools.ant.filters.ConcatFilter"/> <copy file="input/concatfilter.test" tofile="result/concat.concatfilterBefore.test"> <filterchain> <concatfilter before="result/before.txt"/> </filterchain> </copy> </target> <target name="testConcatFilterAfter" depends="init"> <typedef name="concatfilter" classname="org.apache.tools.ant.filters.ConcatFilter"/> <copy file="input/concatfilter.test" tofile="result/concat.concatfilterAfter.test"> <filterchain> <concatfilter after="result/after.txt"/> </filterchain> </copy> </target> <target name="testConcatFilterBeforeAfter" depends="init"> <typedef name="concatfilter" classname="org.apache.tools.ant.filters.ConcatFilter"/> <copy file="input/concatfilter.test" tofile="result/concat.concatfilterBeforeAfter.test"> <filterchain> <concatfilter before="result/before.txt" after="result/after.txt"/> </filterchain> </copy> </target> </project> 1.1 ant/src/main/org/apache/tools/ant/filters/ConcatFilter.java Index: ConcatFilter.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.IOException; import java.io.Reader; import java.io.File; import java.io.BufferedReader; import java.io.FileReader; import org.apache.tools.ant.types.Parameter; /** * Concats a file before and/or after the file. * * <p>Example:<pre> * <copy todir="build"> * <fileset dir="src" includes="*.java"/> * <filterchain> * <concatfilter before="apache-license-java.txt"/> * </filterchain> * </copy> * </pre> * Copies all java sources from <i>src</i> to <i>build</i> and adds the * content of <i>apache-license-java.txt</i> add the beginning of each * file.</p> * * @since 1.6 * @version 2003-09-17 * @author Jan Matèrne */ public final class ConcatFilter extends BaseParamFilterReader implements ChainableReader { /** File to add before the content. */ private File before; /** File to add after the content. */ private File after; /** Reader for before-file. */ private Reader beforeReader = new EmptyReader(); /** Reader for after-file. */ private Reader afterReader = new EmptyReader(); /** * Constructor for "dummy" instances. * * @see BaseFilterReader#BaseFilterReader() */ public ConcatFilter() { super(); } /** * Creates a new filtered reader. * * @param in A Reader object providing the underlying stream. * Must not be <code>null</code>. */ public ConcatFilter(final Reader in) { super(in); } /** * Returns the next character in the filtered stream. If the desired * number of lines have already been read, the resulting stream is * effectively at an end. Otherwise, the next character from the * underlying stream is read and returned. * * @return the next character in the resulting stream, or -1 * if the end of the resulting stream has been reached * * @exception IOException if the underlying stream throws an IOException * during reading */ public int read() throws IOException { // do the "singleton" initialization if (!getInitialized()) { initialize(); setInitialized(true); } int ch = -1; // The readers return -1 if they end. So simply read the "before" // after that the "content" and at the end the "after" file. ch = beforeReader.read(); if (ch == -1) { ch = super.read(); } if (ch == -1) { ch = afterReader.read(); } return ch; } /** * Sets <i>before</i> attribute. * @param before new value */ public void setBefore(final File before) { this.before = before; } /** * Returns <i>before</i> attribute. * @return before attribute */ public File getBefore() { return before; } /** * Sets <i>after</i> attribute. * @param after new value */ public void setAfter(final File after) { this.after = after; } /** * Returns <i>after</i> attribute. * @return after attribute */ public File getAfter() { return after; } /** * Creates a new ConcatReader using the passed in * Reader for instantiation. * * @param rdr A Reader object providing the underlying stream. * Must not be <code>null</code>. * * @return a new filter based on this configuration, but filtering * the specified reader */ public Reader chain(final Reader rdr) { ConcatFilter newFilter = new ConcatFilter(rdr); newFilter.setBefore(getBefore()); newFilter.setAfter(getAfter()); // Usually the initialized is set to true. But here it must not. // Because the before and after readers have to be instantiated // on runtime //newFilter.setInitialized(true); return newFilter; } /** * 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 void initialize() throws IOException { // get parameters Parameter[] params = getParameters(); if (params != null) { for (int i = 0; i < params.length; i++) { if ("before".equals(params[i].getName())) { setBefore(new File(params[i].getValue())); continue; } if ("after".equals(params[i].getName())) { setAfter(new File(params[i].getValue())); continue; } } } if (before != null) { if (!before.isAbsolute()) { before = new File(getProject().getBaseDir(), before.getPath()); } beforeReader = new BufferedReader(new FileReader(before)); } if (after != null) { if (!after.isAbsolute()) { after = new File(getProject().getBaseDir(), after.getPath()); } afterReader = new BufferedReader(new FileReader(after)); } } /** * Reader which is always at the end of file. * Used for easier algorithm (polymorphism instead if-cascades). */ private class EmptyReader extends Reader { public int read(char[] ch, int i1, int i2) { return -1; } public void close() { } } } 1.1 ant/src/testcases/org/apache/tools/ant/filters/ConcatFilterTest.java Index: ConcatFilterTest.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 ConcatReader * @author Jan Matèrne */ public class ConcatFilterTest extends BuildFileTest { private static FileUtils fu = FileUtils.newFileUtils(); private static final String lSep = System.getProperty("line.separator"); private static final String FILE_BEGINNING_WITH = "this-should-be-the-first-line" + lSep + "Line 1" + lSep + "Line 2" + lSep + "Line 3" + lSep + "Line 4" + lSep ; private static final String FILE_BEGINNING = "Line 1" + lSep + "Line 2" + lSep + "Line 3" + lSep + "Line 4" + lSep + "Line 5" + lSep ; private static final String FILE_ENDING_WITH = "Line 57" + lSep + "Line 58" + lSep + "Line 59" + lSep + "Line 60" + lSep + "this-should-be-the-last-line" + lSep ; private static final String FILE_ENDING = "Line 56" + lSep + "Line 57" + lSep + "Line 58" + lSep + "Line 59" + lSep + "Line 60" + lSep ; public ConcatFilterTest(String name) { super(name); } public void setUp() { configureProject("src/etc/testcases/filters/concat.xml"); } public void tearDown() { // I dont know why - but on my machine I always get a // "Unable to delete file ...result\after.txt" (or before.txt) // from Delete.removeDir(Delete.java:612). // Win2000, JDK 1.4.1_02 // A <sleep> before <delete> doesn´t work. From 10ms to 3000ms. // I modified the taskdefs.Delete.DELETE_RETRY_SLEEP_MILLIS // from 10 up to 2000 ms, but no success. // So I give up - and hope for a suggestion from another one. // But this shouldn´t let the testcases fail, so I do the cleanup // inside a try-block // Jan try { executeTarget("cleanup"); } catch (Exception e) { e.printStackTrace(); } } public void testFilterReaderNoArgs() throws IOException { executeTarget("testFilterReaderNoArgs"); File expected = getProject().resolveFile("input/concatfilter.test"); File result = getProject().resolveFile("result/concat.filterReaderNoArgs.test"); assertTrue("testFilterReaderNoArgs: Result not like expected", fu.contentEquals(expected, result)); } public void testFilterReaderBefore() throws IOException { executeTarget("testFilterReaderBefore"); File resultFile = getProject().resolveFile("result/concat.filterReaderBefore.test"); String resultContent = fu.readFully(new java.io.FileReader(resultFile)); assertTrue("First 5 lines differs.", resultContent.startsWith(FILE_BEGINNING_WITH)); assertTrue("Last 5 lines differs.", resultContent.endsWith(FILE_ENDING)); } public void testFilterReaderAfter() throws IOException { executeTarget("testFilterReaderAfter"); File resultFile = getProject().resolveFile("result/concat.filterReaderAfter.test"); String resultContent = fu.readFully(new java.io.FileReader(resultFile)); assertTrue("First 5 lines differs.", resultContent.startsWith(FILE_BEGINNING)); assertTrue("Last 5 lines differs.", resultContent.endsWith(FILE_ENDING_WITH)); } public void testFilterReaderBeforeAfter() throws IOException { executeTarget("testFilterReaderBeforeAfter"); File resultFile = getProject().resolveFile("result/concat.filterReaderBeforeAfter.test"); String resultContent = fu.readFully(new java.io.FileReader(resultFile)); assertTrue("First 5 lines differs.", resultContent.startsWith(FILE_BEGINNING_WITH)); assertTrue("Last 5 lines differs.", resultContent.endsWith(FILE_ENDING_WITH)); } public void testConcatFilter() throws IOException { executeTarget("testConcatFilter"); File resultFile = getProject().resolveFile("result/concat.concatfilter.test"); String resultContent = fu.readFully(new java.io.FileReader(resultFile)); assertTrue("First 5 lines differs.", resultContent.startsWith(FILE_BEGINNING)); assertTrue("Last 5 lines differs.", resultContent.endsWith(FILE_ENDING)); } public void testConcatFilterBefore() throws IOException { executeTarget("testConcatFilterBefore"); File resultFile = getProject().resolveFile("result/concat.concatfilterBefore.test"); String resultContent = fu.readFully(new java.io.FileReader(resultFile)); assertTrue("First 5 lines differs.", resultContent.startsWith(FILE_BEGINNING_WITH)); assertTrue("Last 5 lines differs.", resultContent.endsWith(FILE_ENDING)); } public void testConcatFilterAfter() throws IOException { executeTarget("testConcatFilterAfter"); File resultFile = getProject().resolveFile("result/concat.concatfilterAfter.test"); String resultContent = fu.readFully(new java.io.FileReader(resultFile)); assertTrue("First 5 lines differs.", resultContent.startsWith(FILE_BEGINNING)); assertTrue("Last 5 lines differs.", resultContent.endsWith(FILE_ENDING_WITH)); } public void testConcatFilterBeforeAfter() throws IOException { executeTarget("testConcatFilterBeforeAfter"); File resultFile = getProject().resolveFile("result/concat.concatfilterBeforeAfter.test"); String resultContent = fu.readFully(new java.io.FileReader(resultFile)); assertTrue("First 5 lines differs.", resultContent.startsWith(FILE_BEGINNING_WITH)); assertTrue("Last 5 lines differs.", resultContent.endsWith(FILE_ENDING_WITH)); } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]