git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@894462 13f79535-47bb-0310-9956-ffa450edef68master
@@ -1038,6 +1038,8 @@ Other changes: | |||||
list of resources from non-file resources and may return resources | list of resources from non-file resources and may return resources | ||||
that are not files. | that are not files. | ||||
* a new filterreader appendtolines complements prefixlines. | |||||
Changes from Ant 1.7.0 TO Ant 1.7.1 | Changes from Ant 1.7.0 TO Ant 1.7.1 | ||||
============================================= | ============================================= | ||||
@@ -107,6 +107,7 @@ The following built-in tasks support nested <code><filterchain></code> ele | |||||
A FilterChain is formed by defining zero or more of the following | A FilterChain is formed by defining zero or more of the following | ||||
nested elements.<br> | nested elements.<br> | ||||
<a href="#filterreader">FilterReader</a><br> | <a href="#filterreader">FilterReader</a><br> | ||||
<a href="#appendtolines">AppendToLines</a><br> | |||||
<a href="#classconstants">ClassConstants</a><br> | <a href="#classconstants">ClassConstants</a><br> | ||||
<a href="#escapeunicode">EscapeUnicode</a><br> | <a href="#escapeunicode">EscapeUnicode</a><br> | ||||
<a href="#expandproperties">ExpandProperties</a><br> | <a href="#expandproperties">ExpandProperties</a><br> | ||||
@@ -478,6 +479,39 @@ Convenience method: | |||||
<prefixlines prefix="Foo"/> | <prefixlines prefix="Foo"/> | ||||
</pre></blockquote> | </pre></blockquote> | ||||
<h3><a name="appendtolines">AppendToLines</a></h3> | |||||
Attaches an appendix to every line. | |||||
<p><em>since Ant 1.8.0</em></p> | |||||
<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>append</td> | |||||
<td vAlign=top align="center">Appendix to be attached to lines.</td> | |||||
<td vAlign=top align="center">Yes</td> | |||||
</tr> | |||||
</table> | |||||
<p> | |||||
<h4>Example:</h4> | |||||
This will attach the appendix <code>Foo</code> to all lines. | |||||
<blockquote><pre> | |||||
<filterreader classname="org.apache.tools.ant.filters.AppendToLines"> | |||||
<param name="append" value="Foo"/> | |||||
</filterreader> | |||||
</pre></blockquote> | |||||
Convenience method: | |||||
<blockquote><pre> | |||||
<appendtolines append="Foo"/> | |||||
</pre></blockquote> | |||||
<h3><a name="replacetokens">ReplaceTokens</a></h3> | <h3><a name="replacetokens">ReplaceTokens</a></h3> | ||||
This filter reader replaces all strings that are | This filter reader replaces all strings that are | ||||
@@ -0,0 +1,173 @@ | |||||
/* | |||||
* Licensed to the Apache Software Foundation (ASF) under one or more | |||||
* contributor license agreements. See the NOTICE file distributed with | |||||
* this work for additional information regarding copyright ownership. | |||||
* The ASF licenses this file to You under the Apache License, Version 2.0 | |||||
* (the "License"); you may not use this file except in compliance with | |||||
* the License. You may obtain a copy of the License at | |||||
* | |||||
* http://www.apache.org/licenses/LICENSE-2.0 | |||||
* | |||||
* Unless required by applicable law or agreed to in writing, software | |||||
* distributed under the License is distributed on an "AS IS" BASIS, | |||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
* See the License for the specific language governing permissions and | |||||
* limitations under the License. | |||||
* | |||||
*/ | |||||
package org.apache.tools.ant.filters; | |||||
import java.io.IOException; | |||||
import java.io.Reader; | |||||
import org.apache.tools.ant.types.Parameter; | |||||
/** | |||||
* Attaches a suffix to every line. | |||||
* | |||||
* Example: | |||||
* <pre><appendtolines append="Foo"/></pre> | |||||
* | |||||
* Or: | |||||
* | |||||
* <pre><filterreader classname="org.apache.tools.ant.filters.AppendToLines"> | |||||
* <param name="append" value="Foo"/> | |||||
* </filterreader></pre> | |||||
* | |||||
* @since Ant 1.8.0 | |||||
*/ | |||||
public final class AppendToLines | |||||
extends BaseParamFilterReader | |||||
implements ChainableReader { | |||||
/** Parameter name for the prefix. */ | |||||
private static final String APPEND_KEY = "append"; | |||||
/** The appendix to be used. */ | |||||
private String append = null; | |||||
/** Data that must be read from, if not null. */ | |||||
private String queuedData = null; | |||||
/** | |||||
* Constructor for "dummy" instances. | |||||
* | |||||
* @see BaseFilterReader#BaseFilterReader() | |||||
*/ | |||||
public AppendToLines() { | |||||
super(); | |||||
} | |||||
/** | |||||
* Creates a new filtered reader. | |||||
* | |||||
* @param in A Reader object providing the underlying stream. | |||||
* Must not be <code>null</code>. | |||||
*/ | |||||
public AppendToLines(final Reader in) { | |||||
super(in); | |||||
} | |||||
/** | |||||
* Returns the next character in the filtered stream. One line is read | |||||
* from the original input, and the appendix added. The resulting | |||||
* line is then used until it ends, at which point the next original line | |||||
* is read, etc. | |||||
* | |||||
* @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 { | |||||
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 (append != null) { | |||||
String lf = ""; | |||||
if (queuedData.endsWith("\r\n")) { | |||||
lf = "\r\n"; | |||||
} else if (queuedData.endsWith("\n")) { | |||||
lf = "\n"; | |||||
} | |||||
queuedData = | |||||
queuedData.substring(0, | |||||
queuedData.length() - lf.length()) | |||||
+ append + lf; | |||||
} | |||||
return read(); | |||||
} | |||||
} | |||||
return ch; | |||||
} | |||||
/** | |||||
* Sets the appendix to add at the end of each input line. | |||||
* | |||||
* @param append The appendix to add at the end of each input line. | |||||
* May be <code>null</code>, in which case no appendix | |||||
* is added. | |||||
*/ | |||||
public void setAppend(final String append) { | |||||
this.append = append; | |||||
} | |||||
/** | |||||
* Returns the appendix which will be added at the end of each input line. | |||||
* | |||||
* @return the appendix which will be added at the end of each input line | |||||
*/ | |||||
private String getAppend() { | |||||
return append; | |||||
} | |||||
/** | |||||
* Creates a new AppendToLines filter 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) { | |||||
AppendToLines newFilter = new AppendToLines(rdr); | |||||
newFilter.setAppend(getAppend()); | |||||
newFilter.setInitialized(true); | |||||
return newFilter; | |||||
} | |||||
/** | |||||
* Initializes the appendix if it is available from the parameters. | |||||
*/ | |||||
private void initialize() { | |||||
Parameter[] params = getParameters(); | |||||
if (params != null) { | |||||
for (int i = 0; i < params.length; i++) { | |||||
if (APPEND_KEY.equals(params[i].getName())) { | |||||
append = params[i].getValue(); | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -23,6 +23,7 @@ import java.util.Vector; | |||||
import org.apache.tools.ant.BuildException; | import org.apache.tools.ant.BuildException; | ||||
import org.apache.tools.ant.Project; | import org.apache.tools.ant.Project; | ||||
import org.apache.tools.ant.filters.AppendToLines; | |||||
import org.apache.tools.ant.filters.ChainableReader; | import org.apache.tools.ant.filters.ChainableReader; | ||||
import org.apache.tools.ant.filters.ClassConstants; | import org.apache.tools.ant.filters.ClassConstants; | ||||
import org.apache.tools.ant.filters.EscapeUnicode; | import org.apache.tools.ant.filters.EscapeUnicode; | ||||
@@ -154,6 +155,19 @@ public class FilterChain extends DataType | |||||
filterReaders.addElement(prefixLines); | filterReaders.addElement(prefixLines); | ||||
} | } | ||||
/** | |||||
* Add a PrefixLines filter. | |||||
* | |||||
* @param prefixLines a <code>AppendToLines</code> value | |||||
*/ | |||||
public void addAppendToLines(final AppendToLines appendToLines) { | |||||
if (isReference()) { | |||||
throw noChildrenAllowed(); | |||||
} | |||||
setChecked(false); | |||||
filterReaders.addElement(appendToLines); | |||||
} | |||||
/** | /** | ||||
* Add a ReplaceTokens filter. | * Add a ReplaceTokens filter. | ||||
* | * | ||||
@@ -0,0 +1,42 @@ | |||||
<?xml version="1.0"?> | |||||
<!-- | |||||
Licensed to the Apache Software Foundation (ASF) under one or more | |||||
contributor license agreements. See the NOTICE file distributed with | |||||
this work for additional information regarding copyright ownership. | |||||
The ASF licenses this file to You under the Apache License, Version 2.0 | |||||
(the "License"); you may not use this file except in compliance with | |||||
the License. You may obtain a copy of the License at | |||||
http://www.apache.org/licenses/LICENSE-2.0 | |||||
Unless required by applicable law or agreed to in writing, software | |||||
distributed under the License is distributed on an "AS IS" BASIS, | |||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
See the License for the specific language governing permissions and | |||||
limitations under the License. | |||||
--> | |||||
<project default="antunit" xmlns:au="antlib:org.apache.ant.antunit"> | |||||
<import file="../antunit-base.xml" /> | |||||
<target name="setUp"> | |||||
<mkdir dir="${input}"/> | |||||
<mkdir dir="${output}"/> | |||||
</target> | |||||
<target name="testSimple"> | |||||
<echo file="${input}/a.txt">a | |||||
b | |||||
c</echo> | |||||
<echo file="${input}/b.txt">aFoo | |||||
bFoo | |||||
cFoo</echo> | |||||
<copy todir="${output}"> | |||||
<fileset dir="${input}"/> | |||||
<filterchain> | |||||
<appendtolines append="Foo"/> | |||||
</filterchain> | |||||
</copy> | |||||
<au:assertFilesMatch expected="${input}/b.txt" | |||||
actual="${output}/a.txt"/> | |||||
</target> | |||||
</project> |