/* * Copyright 2003-2004 The Apache Software Foundation * * Licensed 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 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. * *

Example:

 * 
 *     
 *     
 *         
 *     
 * 
 * 
* Copies all java sources from src to build and adds the * content of apache-license-java.txt add the beginning of each * file.

* * @since 1.6 * @version 2003-09-23 */ public final class ConcatFilter extends BaseParamFilterReader implements ChainableReader { /** File to add before the content. */ private File prepend; /** File to add after the content. */ private File append; /** Reader for prepend-file. */ private Reader prependReader = null; /** Reader for append-file. */ private Reader appendReader = null; /** * 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 null. */ 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 "prepend" // after that the "content" and at the end the "append" file. if (prependReader != null) { ch = prependReader.read(); if (ch == -1) { // I am the only one so I have to close the reader prependReader.close(); prependReader = null; } } if (ch == -1) { ch = super.read(); } if (ch == -1) { // don't call super.close() because that reader is used // on other places ... if (appendReader != null) { ch = appendReader.read(); if (ch == -1) { // I am the only one so I have to close the reader appendReader.close(); appendReader = null; } } } return ch; } /** * Sets prepend attribute. * @param prepend new value */ public void setPrepend(final File prepend) { this.prepend = prepend; } /** * Returns prepend attribute. * @return prepend attribute */ public File getPrepend() { return prepend; } /** * Sets append attribute. * @param append new value */ public void setAppend(final File append) { this.append = append; } /** * Returns append attribute. * @return append attribute */ public File getAppend() { return append; } /** * Creates a new ConcatReader using the passed in * Reader for instantiation. * * @param rdr A Reader object providing the underlying stream. * Must not be null. * * @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.setPrepend(getPrepend()); newFilter.setAppend(getAppend()); // Usually the initialized is set to true. But here it must not. // Because the prepend and append 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 ("prepend".equals(params[i].getName())) { setPrepend(new File(params[i].getValue())); continue; } if ("append".equals(params[i].getName())) { setAppend(new File(params[i].getValue())); continue; } } } if (prepend != null) { if (!prepend.isAbsolute()) { prepend = new File(getProject().getBaseDir(), prepend.getPath()); } prependReader = new BufferedReader(new FileReader(prepend)); } if (append != null) { if (!append.isAbsolute()) { append = new File(getProject().getBaseDir(), append.getPath()); } appendReader = new BufferedReader(new FileReader(append)); } } }