diff --git a/proposal/sandbox/filterreaders/src/main/org/apache/tools/ant/taskdefs/LoadFile.java b/proposal/sandbox/filterreaders/src/main/org/apache/tools/ant/taskdefs/LoadFile.java index 3ff866e1b..5156a93a5 100644 --- a/proposal/sandbox/filterreaders/src/main/org/apache/tools/ant/taskdefs/LoadFile.java +++ b/proposal/sandbox/filterreaders/src/main/org/apache/tools/ant/taskdefs/LoadFile.java @@ -60,10 +60,9 @@ import org.apache.tools.ant.types.AntFilterReader; import org.apache.tools.ant.types.FilterReaderSet; import org.apache.tools.ant.types.Parameter; import org.apache.tools.ant.types.Parameterizable; +import org.apache.tools.ant.util.ChainReaderHelper; import java.io.*; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; import java.util.Vector; /** @@ -194,7 +193,12 @@ public final class LoadFile extends Task { instream = new InputStreamReader(bis, encoding); } - String text = processStream(instream, size); + ChainReaderHelper crh = new ChainReaderHelper(); + crh.setBufferSize(size); + crh.setPrimaryReader(instream); + crh.setFilterReaderSets(filterReaderSets); + + String text = crh.processStream(); if(evaluateProperties) { text = project.replaceProperties(text); @@ -229,79 +233,6 @@ public final class LoadFile extends Task { } } - /** - * Process the input by passing it through the reader chain. - */ - private final String processStream(final Reader inputReader, final int size) - throws BuildException, IOException { - - Reader instream = inputReader; - final char[] buffer = new char[size]; - final int filterReadersCount = filterReaderSets.size(); - final Vector finalFilters = new Vector(); - - for (int i = 0; i < filterReadersCount; i++) { - final FilterReaderSet filterset = - (FilterReaderSet) filterReaderSets.elementAt(i); - final Vector filterReaders = filterset.getFilterReaders(); - final int readerCount = filterReaders.size(); - for (int j = 0; j < readerCount; j++) { - final AntFilterReader afr = - (AntFilterReader) filterReaders.elementAt(j); - finalFilters.addElement(afr); - } - } - - final int filtersCount = finalFilters.size(); - - if (filtersCount > 0) { - for (int i = 0; i < filtersCount; i++) { - final AntFilterReader filter = - (AntFilterReader) finalFilters.elementAt(i); - final String className = filter.getClassName(); - if (className != null) { - try { - final Class clazz = Class.forName(className); - if (clazz != null) { - final Constructor[] constructors = - clazz.getConstructors(); - final Reader[] rdr = {instream}; - instream = - (Reader) constructors[0].newInstance(rdr); - if (Parameterizable.class.isAssignableFrom(clazz)) { - final Parameter[] params = filter.getParams(); - ((Parameterizable) - instream).setParameters(params); - } - } - } catch (final ClassNotFoundException cnfe) { - throw new BuildException(cnfe, location); - } catch (final InstantiationException ie) { - throw new BuildException(ie, location); - } catch (final IllegalAccessException iae) { - throw new BuildException(iae, location); - } catch (final InvocationTargetException ite) { - throw new BuildException(ite, location); - } - } - } - } - - int bufferLength = 0; - String text = null; - while (bufferLength != -1) { - bufferLength = instream.read(buffer); - if (bufferLength != -1) { - if (text == null) { - text = new String(buffer, 0, bufferLength); - } else { - text += new String(buffer, 0, bufferLength); - } - } - } - return text; - } - /** * Add the FilterReaderSet element. */ diff --git a/proposal/sandbox/filterreaders/src/main/org/apache/tools/ant/taskdefs/LoadProperties.java b/proposal/sandbox/filterreaders/src/main/org/apache/tools/ant/taskdefs/LoadProperties.java index 9cf1ab9ff..f6802e15f 100644 --- a/proposal/sandbox/filterreaders/src/main/org/apache/tools/ant/taskdefs/LoadProperties.java +++ b/proposal/sandbox/filterreaders/src/main/org/apache/tools/ant/taskdefs/LoadProperties.java @@ -60,10 +60,9 @@ import org.apache.tools.ant.types.AntFilterReader; import org.apache.tools.ant.types.FilterReaderSet; import org.apache.tools.ant.types.Parameter; import org.apache.tools.ant.types.Parameterizable; +import org.apache.tools.ant.util.ChainReaderHelper; import java.io.*; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; import java.util.Vector; /** @@ -125,7 +124,12 @@ public final class LoadProperties extends Task { bis = new BufferedInputStream(fis); instream = new InputStreamReader(bis); - String text = processStream(instream, size); + ChainReaderHelper crh = new ChainReaderHelper(); + crh.setBufferSize(size); + crh.setPrimaryReader(instream); + crh.setFilterReaderSets(filterReaderSets); + + String text = crh.processStream(); if (!text.endsWith("\n")) { text = text + "\n"; } @@ -184,79 +188,6 @@ public final class LoadProperties extends Task { } } - /** - * Process the input by passing it through the reader chain. - */ - private final String processStream(final Reader inputReader, final int size) - throws BuildException, IOException { - - Reader instream = inputReader; - final char[] buffer = new char[size]; - final int filterReadersCount = filterReaderSets.size(); - final Vector finalFilters = new Vector(); - - for (int i = 0; i < filterReadersCount; i++) { - final FilterReaderSet filterset = - (FilterReaderSet) filterReaderSets.elementAt(i); - final Vector filterReaders = filterset.getFilterReaders(); - final int readerCount = filterReaders.size(); - for (int j = 0; j < readerCount; j++) { - final AntFilterReader afr = - (AntFilterReader) filterReaders.elementAt(j); - finalFilters.addElement(afr); - } - } - - final int filtersCount = finalFilters.size(); - - if (filtersCount > 0) { - for (int i = 0; i < filtersCount; i++) { - final AntFilterReader filter = - (AntFilterReader) finalFilters.elementAt(i); - final String className = filter.getClassName(); - if (className != null) { - try { - final Class clazz = Class.forName(className); - if (clazz != null) { - final Constructor[] constructors = - clazz.getConstructors(); - final Reader[] rdr = {instream}; - instream = - (Reader) constructors[0].newInstance(rdr); - if (Parameterizable.class.isAssignableFrom(clazz)) { - final Parameter[] params = filter.getParams(); - ((Parameterizable) - instream).setParameters(params); - } - } - } catch (final ClassNotFoundException cnfe) { - throw new BuildException(cnfe, location); - } catch (final InstantiationException ie) { - throw new BuildException(ie, location); - } catch (final IllegalAccessException iae) { - throw new BuildException(iae, location); - } catch (final InvocationTargetException ite) { - throw new BuildException(ite, location); - } - } - } - } - - int bufferLength = 0; - String text = null; - while (bufferLength != -1) { - bufferLength = instream.read(buffer); - if (bufferLength != -1) { - if (text == null) { - text = new String(buffer, 0, bufferLength); - } else { - text += new String(buffer, 0, bufferLength); - } - } - } - return text; - } - /** * Add the FilterReaderSet element. */ diff --git a/proposal/sandbox/filterreaders/src/main/org/apache/tools/ant/util/ChainReaderHelper.java b/proposal/sandbox/filterreaders/src/main/org/apache/tools/ant/util/ChainReaderHelper.java new file mode 100644 index 000000000..3b2764317 --- /dev/null +++ b/proposal/sandbox/filterreaders/src/main/org/apache/tools/ant/util/ChainReaderHelper.java @@ -0,0 +1,188 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Ant", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.util; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.types.AntFilterReader; +import org.apache.tools.ant.types.FilterReaderSet; +import org.apache.tools.ant.types.Parameter; +import org.apache.tools.ant.types.Parameterizable; + +import java.io.*; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.Vector; + +/** + * Process a FilterReader chain. + * + * @author Magesh Umasankar + * @created 23 February 2002 + */ +public final class ChainReaderHelper { + + /** + * The primary reader to which the reader chain is to be attached. + */ + public Reader primaryReader; + + /** + * The size of the buffer to be used. + */ + public int bufferSize = 4096; + + /** + * Collection of 'FilterReaderSet's. + */ + public Vector filterReaderSets = new Vector(); + + /** + * Sets the primary reader + */ + public final void setPrimaryReader(Reader rdr) { + primaryReader = rdr; + } + + /** + * Sets the buffer size to be used. Defaults to 4096, + * if this method is not invoked. + */ + public final void setBufferSize(int size) { + bufferSize = size; + } + + /** + * Sets the collection of filter reader sets + */ + public final void setFilterReaderSets(Vector frsets) { + filterReaderSets = frsets; + } + + /** + * Process the reader chain + */ + public final String processStream() + throws BuildException, IOException { + + if (primaryReader == null) { + throw new BuildException("primaryReader must not be null."); + } + + Reader instream = primaryReader; + final char[] buffer = new char[bufferSize]; + final int filterReadersCount = filterReaderSets.size(); + final Vector finalFilters = new Vector(); + + for (int i = 0; i < filterReadersCount; i++) { + final FilterReaderSet filterset = + (FilterReaderSet) filterReaderSets.elementAt(i); + final Vector filterReaders = filterset.getFilterReaders(); + final int readerCount = filterReaders.size(); + for (int j = 0; j < readerCount; j++) { + final AntFilterReader afr = + (AntFilterReader) filterReaders.elementAt(j); + finalFilters.addElement(afr); + } + } + + final int filtersCount = finalFilters.size(); + + if (filtersCount > 0) { + for (int i = 0; i < filtersCount; i++) { + final AntFilterReader filter = + (AntFilterReader) finalFilters.elementAt(i); + final String className = filter.getClassName(); + if (className != null) { + try { + final Class clazz = Class.forName(className); + if (clazz != null) { + final Constructor[] constructors = + clazz.getConstructors(); + final Reader[] rdr = {instream}; + instream = + (Reader) constructors[0].newInstance(rdr); + if (Parameterizable.class.isAssignableFrom(clazz)) { + final Parameter[] params = filter.getParams(); + ((Parameterizable) + instream).setParameters(params); + } + } + } catch (final ClassNotFoundException cnfe) { + throw new BuildException(cnfe); + } catch (final InstantiationException ie) { + throw new BuildException(ie); + } catch (final IllegalAccessException iae) { + throw new BuildException(iae); + } catch (final InvocationTargetException ite) { + throw new BuildException(ite); + } + } + } + } + + int bufferLength = 0; + String text = null; + while (bufferLength != -1) { + bufferLength = instream.read(buffer); + if (bufferLength != -1) { + if (text == null) { + text = new String(buffer, 0, bufferLength); + } else { + text += new String(buffer, 0, bufferLength); + } + } + } + return text; + } +}