use of org.apache.tools.ant.types.Parameterizable 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;
}
Aggregations