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]