001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018: package org.apache.tools.ant.filters;
019:
020: import java.io.IOException;
021: import java.io.Reader;
022: import org.apache.tools.ant.types.Parameter;
023:
024: /**
025: * Attaches a prefix to every line.
026: *
027: * Example:
028: * <pre><prefixlines prefix="Foo"/></pre>
029: *
030: * Or:
031: *
032: * <pre><filterreader classname="org.apache.tools.ant.filters.PrefixLines">
033: * <param name="prefix" value="Foo"/>
034: * </filterreader></pre>
035: *
036: */
037: public final class PrefixLines extends BaseParamFilterReader implements
038: ChainableReader {
039: /** Parameter name for the prefix. */
040: private static final String PREFIX_KEY = "prefix";
041:
042: /** The prefix to be used. */
043: private String prefix = null;
044:
045: /** Data that must be read from, if not null. */
046: private String queuedData = null;
047:
048: /**
049: * Constructor for "dummy" instances.
050: *
051: * @see BaseFilterReader#BaseFilterReader()
052: */
053: public PrefixLines() {
054: super ();
055: }
056:
057: /**
058: * Creates a new filtered reader.
059: *
060: * @param in A Reader object providing the underlying stream.
061: * Must not be <code>null</code>.
062: */
063: public PrefixLines(final Reader in) {
064: super (in);
065: }
066:
067: /**
068: * Returns the next character in the filtered stream. One line is read
069: * from the original input, and the prefix added. The resulting
070: * line is then used until it ends, at which point the next original line
071: * is read, etc.
072: *
073: * @return the next character in the resulting stream, or -1
074: * if the end of the resulting stream has been reached
075: *
076: * @exception IOException if the underlying stream throws an IOException
077: * during reading
078: */
079: public int read() throws IOException {
080: if (!getInitialized()) {
081: initialize();
082: setInitialized(true);
083: }
084:
085: int ch = -1;
086:
087: if (queuedData != null && queuedData.length() == 0) {
088: queuedData = null;
089: }
090:
091: if (queuedData != null) {
092: ch = queuedData.charAt(0);
093: queuedData = queuedData.substring(1);
094: if (queuedData.length() == 0) {
095: queuedData = null;
096: }
097: } else {
098: queuedData = readLine();
099: if (queuedData == null) {
100: ch = -1;
101: } else {
102: if (prefix != null) {
103: queuedData = prefix + queuedData;
104: }
105: return read();
106: }
107: }
108: return ch;
109: }
110:
111: /**
112: * Sets the prefix to add at the start of each input line.
113: *
114: * @param prefix The prefix to add at the start of each input line.
115: * May be <code>null</code>, in which case no prefix
116: * is added.
117: */
118: public void setPrefix(final String prefix) {
119: this .prefix = prefix;
120: }
121:
122: /**
123: * Returns the prefix which will be added at the start of each input line.
124: *
125: * @return the prefix which will be added at the start of each input line
126: */
127: private String getPrefix() {
128: return prefix;
129: }
130:
131: /**
132: * Creates a new PrefixLines filter using the passed in
133: * Reader for instantiation.
134: *
135: * @param rdr A Reader object providing the underlying stream.
136: * Must not be <code>null</code>.
137: *
138: * @return a new filter based on this configuration, but filtering
139: * the specified reader
140: */
141: public Reader chain(final Reader rdr) {
142: PrefixLines newFilter = new PrefixLines(rdr);
143: newFilter.setPrefix(getPrefix());
144: newFilter.setInitialized(true);
145: return newFilter;
146: }
147:
148: /**
149: * Initializes the prefix if it is available from the parameters.
150: */
151: private void initialize() {
152: Parameter[] params = getParameters();
153: if (params != null) {
154: for (int i = 0; i < params.length; i++) {
155: if (PREFIX_KEY.equals(params[i].getName())) {
156: prefix = params[i].getValue();
157: break;
158: }
159: }
160: }
161: }
162: }
|