Browse Source

complement prefixlines with appendtolines

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@894462 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 15 years ago
parent
commit
24fbc8626d
5 changed files with 265 additions and 0 deletions
  1. +2
    -0
      WHATSNEW
  2. +34
    -0
      docs/manual/CoreTypes/filterchain.html
  3. +173
    -0
      src/main/org/apache/tools/ant/filters/AppendToLines.java
  4. +14
    -0
      src/main/org/apache/tools/ant/types/FilterChain.java
  5. +42
    -0
      src/tests/antunit/filters/append-test.xml

+ 2
- 0
WHATSNEW View File

@@ -1038,6 +1038,8 @@ Other changes:
list of resources from non-file resources and may return resources
that are not files.

* a new filterreader appendtolines complements prefixlines.

Changes from Ant 1.7.0 TO Ant 1.7.1
=============================================



+ 34
- 0
docs/manual/CoreTypes/filterchain.html View File

@@ -107,6 +107,7 @@ The following built-in tasks support nested <code>&lt;filterchain&gt;</code> ele
A FilterChain is formed by defining zero or more of the following
nested elements.<br>
<a href="#filterreader">FilterReader</a><br>
<a href="#appendtolines">AppendToLines</a><br>
<a href="#classconstants">ClassConstants</a><br>
<a href="#escapeunicode">EscapeUnicode</a><br>
<a href="#expandproperties">ExpandProperties</a><br>
@@ -478,6 +479,39 @@ Convenience method:
&lt;prefixlines prefix=&quot;Foo&quot;/&gt;
</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>
&lt;filterreader classname=&quot;org.apache.tools.ant.filters.AppendToLines&quot;&gt;
&lt;param name=&quot;append&quot; value=&quot;Foo&quot;/&gt;
&lt;/filterreader&gt;
</pre></blockquote>

Convenience method:
<blockquote><pre>
&lt;appendtolines append=&quot;Foo&quot;/&gt;
</pre></blockquote>

<h3><a name="replacetokens">ReplaceTokens</a></h3>

This filter reader replaces all strings that are


+ 173
- 0
src/main/org/apache/tools/ant/filters/AppendToLines.java View File

@@ -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>&lt;appendtolines append=&quot;Foo&quot;/&gt;</pre>
*
* Or:
*
* <pre>&lt;filterreader classname=&quot;org.apache.tools.ant.filters.AppendToLines&quot;&gt;
* &lt;param name=&quot;append&quot; value=&quot;Foo&quot;/&gt;
* &lt;/filterreader&gt;</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;
}
}
}
}
}

+ 14
- 0
src/main/org/apache/tools/ant/types/FilterChain.java View File

@@ -23,6 +23,7 @@ import java.util.Vector;

import org.apache.tools.ant.BuildException;
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.ClassConstants;
import org.apache.tools.ant.filters.EscapeUnicode;
@@ -154,6 +155,19 @@ public class FilterChain extends DataType
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.
*


+ 42
- 0
src/tests/antunit/filters/append-test.xml View File

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

Loading…
Cancel
Save