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;
}
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);
}
Aggregations