diff --git a/src/main/org/apache/tools/ant/ProjectHelperRepository.java b/src/main/org/apache/tools/ant/ProjectHelperRepository.java index d8cf87382..09b144c71 100644 --- a/src/main/org/apache/tools/ant/ProjectHelperRepository.java +++ b/src/main/org/apache/tools/ant/ProjectHelperRepository.java @@ -4,6 +4,7 @@ import java.io.BufferedReader; import java.io.File; import java.io.InputStream; import java.io.InputStreamReader; +import java.lang.reflect.Constructor; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; @@ -14,10 +15,10 @@ import org.apache.tools.ant.helper.ProjectHelper2; import org.apache.tools.ant.util.LoaderUtils; /** - * Repository of {@link ProjectHelper} found in the classpath or via some System - * properties. - *
- * See the ProjectHelper documentation in the manual. + * Repository of {@link ProjectHelper} found in the classpath or via + * some System properties. + + *
See the ProjectHelper documentation in the manual.
* * @since Ant 1.8.0 */ @@ -34,7 +35,10 @@ public class ProjectHelperRepository { private static ProjectHelperRepository instance = new ProjectHelperRepository(); - private List/*null
).
*/
public ProjectHelper getProjectHelper(File buildFile) throws BuildException {
- Iterator it = helpers.iterator();
+ Iterator it = getHelpers();
while (it.hasNext()) {
ProjectHelper helper = (ProjectHelper) it.next();
if (helper.supportsBuildFile(buildFile)) {
@@ -209,6 +220,32 @@ public class ProjectHelperRepository {
* @return an iterator of {@link ProjectHelper}
*/
public Iterator getHelpers() {
- return helpers.iterator();
+ return new ConstructingIterator(helpers.iterator());
+ }
+
+ private static class ConstructingIterator implements Iterator {
+ private final Iterator nested;
+
+ ConstructingIterator(Iterator nested) {
+ this.nested = nested;
+ }
+
+ public boolean hasNext() {
+ return nested.hasNext();
+ }
+
+ public Object next() {
+ Constructor c = (Constructor) nested.next();
+ try {
+ return c.newInstance(NO_OBJECT);
+ } catch (Exception e) {
+ throw new BuildException("Failed to invoke no-arg constructor"
+ + " on " + c.getName());
+ }
+ }
+
+ public void remove() {
+ throw new UnsupportedOperationException("remove is not supported");
+ }
}
}