Search in sources :

Example 1 with AntFilterReader

use of org.apache.tools.ant.types.AntFilterReader in project ant by apache.

the class ChainReaderHelper method expandReader.

/**
 * Creates and parameterizes a new FilterReader from a
 * <filterreader> element.
 *
 * @since Ant 1.8.0
 */
private Reader expandReader(final AntFilterReader filter, final Reader ancestor, final List<AntClassLoader> classLoadersToCleanUp) {
    final String className = filter.getClassName();
    final Path classpath = filter.getClasspath();
    if (className != null) {
        try {
            Class<? extends FilterReader> clazz;
            try {
                if (classpath == null) {
                    clazz = Class.forName(className).asSubclass(FilterReader.class);
                } else {
                    AntClassLoader al = filter.getProject().createClassLoader(classpath);
                    classLoadersToCleanUp.add(al);
                    clazz = Class.forName(className, true, al).asSubclass(FilterReader.class);
                }
            } catch (ClassCastException ex) {
                throw new BuildException("%s does not extend %s", className, FilterReader.class.getName());
            }
            Optional<Constructor<?>> ctor = Stream.of(clazz.getConstructors()).filter(c -> c.getParameterCount() == 1 && c.getParameterTypes()[0].isAssignableFrom(Reader.class)).findFirst();
            Object instream = ctor.orElseThrow(() -> new BuildException("%s does not define a public constructor that takes in a %s as its single argument.", className, Reader.class.getSimpleName())).newInstance(ancestor);
            setProjectOnObject(instream);
            if (Parameterizable.class.isAssignableFrom(clazz)) {
                ((Parameterizable) instream).setParameters(filter.getParams());
            }
            return (Reader) instream;
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | InvocationTargetException ex) {
            throw new BuildException(ex);
        }
    }
    // backwards compatibility makes it hard to change, though.
    return ancestor;
}
Also used : Path(org.apache.tools.ant.types.Path) FileUtils(org.apache.tools.ant.util.FileUtils) AntClassLoader(org.apache.tools.ant.AntClassLoader) Collection(java.util.Collection) FilterChain(org.apache.tools.ant.types.FilterChain) FilterReader(java.io.FilterReader) IOException(java.io.IOException) BuildException(org.apache.tools.ant.BuildException) BaseFilterReader(org.apache.tools.ant.filters.BaseFilterReader) Reader(java.io.Reader) ChainableReader(org.apache.tools.ant.filters.ChainableReader) Constructor(java.lang.reflect.Constructor) Collectors(java.util.stream.Collectors) InvocationTargetException(java.lang.reflect.InvocationTargetException) ArrayList(java.util.ArrayList) Path(org.apache.tools.ant.types.Path) Consumer(java.util.function.Consumer) List(java.util.List) Vector(java.util.Vector) Stream(java.util.stream.Stream) AntFilterReader(org.apache.tools.ant.types.AntFilterReader) Optional(java.util.Optional) Project(org.apache.tools.ant.Project) Parameterizable(org.apache.tools.ant.types.Parameterizable) Constructor(java.lang.reflect.Constructor) FilterReader(java.io.FilterReader) BaseFilterReader(org.apache.tools.ant.filters.BaseFilterReader) Reader(java.io.Reader) ChainableReader(org.apache.tools.ant.filters.ChainableReader) AntFilterReader(org.apache.tools.ant.types.AntFilterReader) AntClassLoader(org.apache.tools.ant.AntClassLoader) InvocationTargetException(java.lang.reflect.InvocationTargetException) Parameterizable(org.apache.tools.ant.types.Parameterizable) BuildException(org.apache.tools.ant.BuildException) FilterReader(java.io.FilterReader) BaseFilterReader(org.apache.tools.ant.filters.BaseFilterReader) AntFilterReader(org.apache.tools.ant.types.AntFilterReader)

Example 2 with AntFilterReader

use of org.apache.tools.ant.types.AntFilterReader in project ant by apache.

the class ChainReaderHelper method getAssembledReader.

/**
 * Assemble the reader
 * @return the assembled reader
 * @exception BuildException if an error occurs
 */
public ChainReader getAssembledReader() throws BuildException {
    if (primaryReader == null) {
        throw new BuildException("primaryReader must not be null.");
    }
    Reader instream = primaryReader;
    final List<AntClassLoader> classLoadersToCleanUp = new ArrayList<>();
    final List<Object> finalFilters = filterChains.stream().map(FilterChain::getFilterReaders).flatMap(Collection::stream).collect(Collectors.toList());
    if (!finalFilters.isEmpty()) {
        boolean success = false;
        try {
            for (Object o : finalFilters) {
                if (o instanceof AntFilterReader) {
                    instream = expandReader((AntFilterReader) o, instream, classLoadersToCleanUp);
                } else if (o instanceof ChainableReader) {
                    setProjectOnObject(o);
                    instream = ((ChainableReader) o).chain(instream);
                    setProjectOnObject(instream);
                }
            }
            success = true;
        } finally {
            if (!success && !classLoadersToCleanUp.isEmpty()) {
                cleanUpClassLoaders(classLoadersToCleanUp);
            }
        }
    }
    return new ChainReader(instream, classLoadersToCleanUp);
}
Also used : AntFilterReader(org.apache.tools.ant.types.AntFilterReader) FilterChain(org.apache.tools.ant.types.FilterChain) ArrayList(java.util.ArrayList) FilterReader(java.io.FilterReader) BaseFilterReader(org.apache.tools.ant.filters.BaseFilterReader) Reader(java.io.Reader) ChainableReader(org.apache.tools.ant.filters.ChainableReader) AntFilterReader(org.apache.tools.ant.types.AntFilterReader) AntClassLoader(org.apache.tools.ant.AntClassLoader) BuildException(org.apache.tools.ant.BuildException) ChainableReader(org.apache.tools.ant.filters.ChainableReader)

Aggregations

FilterReader (java.io.FilterReader)2 Reader (java.io.Reader)2 ArrayList (java.util.ArrayList)2 AntClassLoader (org.apache.tools.ant.AntClassLoader)2 BuildException (org.apache.tools.ant.BuildException)2 BaseFilterReader (org.apache.tools.ant.filters.BaseFilterReader)2 ChainableReader (org.apache.tools.ant.filters.ChainableReader)2 AntFilterReader (org.apache.tools.ant.types.AntFilterReader)2 FilterChain (org.apache.tools.ant.types.FilterChain)2 IOException (java.io.IOException)1 Constructor (java.lang.reflect.Constructor)1 InvocationTargetException (java.lang.reflect.InvocationTargetException)1 Collection (java.util.Collection)1 List (java.util.List)1 Optional (java.util.Optional)1 Vector (java.util.Vector)1 Consumer (java.util.function.Consumer)1 Collectors (java.util.stream.Collectors)1 Stream (java.util.stream.Stream)1 Project (org.apache.tools.ant.Project)1