FileDocCategorySizeDatePackage
ChainReaderHelper.javaAPI DocApache Ant 1.708911Wed Dec 13 06:16:20 GMT 2006org.apache.tools.ant.filters.util

ChainReaderHelper

public final class ChainReaderHelper extends Object
Process a FilterReader chain.

Fields Summary
private static final int
DEFAULT_BUFFER_SIZE
public Reader
primaryReader
The primary reader to which the reader chain is to be attached.
public int
bufferSize
The size of the buffer to be used.
public Vector
filterChains
Chain of filters
private org.apache.tools.ant.Project
project
The Ant project
Constructors Summary
Methods Summary
public java.io.ReadergetAssembledReader()
Assemble the reader

return
the assembled reader
exception
BuildException if an error occurs

        if (primaryReader == null) {
            throw new BuildException("primaryReader must not be null.");
        }

        Reader instream = primaryReader;
        final int filterReadersCount = filterChains.size();
        final Vector finalFilters = new Vector();

        for (int i = 0; i < filterReadersCount; i++) {
            final FilterChain filterchain =
                (FilterChain) filterChains.elementAt(i);
            final Vector filterReaders = filterchain.getFilterReaders();
            final int readerCount = filterReaders.size();
            for (int j = 0; j < readerCount; j++) {
                finalFilters.addElement(filterReaders.elementAt(j));
            }
        }

        final int filtersCount = finalFilters.size();

        if (filtersCount > 0) {
            for (int i = 0; i < filtersCount; i++) {
                Object o = finalFilters.elementAt(i);

                if (o instanceof AntFilterReader) {
                    final AntFilterReader filter
                        = (AntFilterReader) finalFilters.elementAt(i);
                    final String className = filter.getClassName();
                    final Path classpath = filter.getClasspath();
                    final Project pro = filter.getProject();
                    if (className != null) {
                        try {
                            Class clazz = null;
                            if (classpath == null) {
                                clazz = Class.forName(className);
                            } else {
                                AntClassLoader al
                                    = pro.createClassLoader(classpath);
                                clazz = Class.forName(className, true, al);
                            }
                            if (clazz != null) {
                                if (!FilterReader.class.isAssignableFrom(clazz)) {
                                    throw new BuildException(className
                                        + " does not extend java.io.FilterReader");
                                }
                                final Constructor[] constructors =
                                    clazz.getConstructors();
                                int j = 0;
                                boolean consPresent = false;
                                for (; j < constructors.length; j++) {
                                    Class[] types = constructors[j]
                                                      .getParameterTypes();
                                    if (types.length == 1
                                        && types[0].isAssignableFrom(Reader.class)) {
                                        consPresent = true;
                                        break;
                                    }
                                }
                                if (!consPresent) {
                                    throw new BuildException(className
                                        + " does not define a public constructor"
                                        + " that takes in a Reader as its "
                                        + "single argument.");
                                }
                                final Reader[] rdr = {instream};
                                instream =
                                    (Reader) constructors[j].newInstance((Object[]) rdr);
                                setProjectOnObject(instream);
                                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);
                        }
                    }
                } else if (o instanceof ChainableReader) {
                    setProjectOnObject(o);
                    instream = ((ChainableReader) o).chain(instream);
                    setProjectOnObject(instream);
                }
            }
        }
        return instream;
    
public org.apache.tools.ant.ProjectgetProject()
Get the project

return
the current project

        return project;
    
public java.lang.StringreadFully(java.io.Reader rdr)
Read data from the reader and return the contents as a string.

param
rdr the reader object
return
the contents of the file as a string
exception
IOException if an error occurs

        return FileUtils.readFully(rdr, bufferSize);
    
public voidsetBufferSize(int size)
Sets the buffer size to be used. Defaults to 8192, if this method is not invoked.

param
size the buffer size to use

        bufferSize = size;
    
public voidsetFilterChains(java.util.Vector fchain)
Sets the collection of filter reader sets

param
fchain the filter chains collection

        filterChains = fchain;
    
public voidsetPrimaryReader(java.io.Reader rdr)
Sets the primary reader

param
rdr the reader object


    // CheckStyle:VisibilityModifier ON

                  
        
        primaryReader = rdr;
    
public voidsetProject(org.apache.tools.ant.Project project)
Set the project to work with

param
project the current project

        this.project = project;
    
private voidsetProjectOnObject(java.lang.Object obj)
helper method to set the project on an object. the reflection setProject does not work for anonymous/protected/private classes, even if they have public methods.

        if (project == null) {
            return;
        }
        if (obj instanceof BaseFilterReader) {
            ((BaseFilterReader) obj).setProject(project);
            return;
        }
        project.setProjectReference(obj);