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> | |||||