diff --git a/src/main/org/apache/tools/ant/ProjectHelper.java b/src/main/org/apache/tools/ant/ProjectHelper.java index f03a23dbd..c1fae2375 100644 --- a/src/main/org/apache/tools/ant/ProjectHelper.java +++ b/src/main/org/apache/tools/ant/ProjectHelper.java @@ -18,11 +18,12 @@ package org.apache.tools.ant; import java.io.File; -import java.net.URL; import java.util.Hashtable; import java.util.Locale; import java.util.Vector; +import org.apache.tools.ant.types.Resource; +import org.apache.tools.ant.types.resources.FileResource; import org.apache.tools.ant.util.LoaderUtils; import org.xml.sax.AttributeList; @@ -64,16 +65,17 @@ public class ProjectHelper { public static final String PROJECTHELPER_REFERENCE = MagicNames.REFID_PROJECT_HELPER; /** - * Configures the project with the contents of the specified XML file. + * Configures the project with the contents of the specified build file. * * @param project The project to configure. Must not be null. - * @param buildFile An XML file giving the project's configuration. + * @param buildFile A build file giving the project's configuration. * Must not be null. * * @exception BuildException if the configuration is invalid or cannot be read */ public static void configureProject(Project project, File buildFile) throws BuildException { - ProjectHelper helper = ProjectHelperRepository.getInstance().getProjectHelper(buildFile); + FileResource resource = new FileResource(buildFile); + ProjectHelper helper = ProjectHelperRepository.getInstance().getProjectHelperForBuildFile(resource); project.addReference(PROJECTHELPER_REFERENCE, helper); helper.parse(project, buildFile); } @@ -498,7 +500,7 @@ public class ProjectHelper { * * @since Ant 1.8.0 */ - public boolean canParseAntlibDescriptor(URL url) { + public boolean canParseAntlibDescriptor(Resource r) { return false; } @@ -509,7 +511,7 @@ public class ProjectHelper { * @since ant 1.8.0 */ public UnknownElement parseAntlibDescriptor(Project containingProject, - URL source) { + Resource source) { throw new BuildException("can't parse antlib descriptors"); } @@ -522,7 +524,7 @@ public class ProjectHelper { * @return true if the helper supports it * @since Ant 1.8.0 */ - public boolean supportsBuildFile(File buildFile) { + public boolean canParseBuildFile(Resource buildFile) { return true; } diff --git a/src/main/org/apache/tools/ant/ProjectHelperRepository.java b/src/main/org/apache/tools/ant/ProjectHelperRepository.java index 9829e043c..ecb4eba6e 100644 --- a/src/main/org/apache/tools/ant/ProjectHelperRepository.java +++ b/src/main/org/apache/tools/ant/ProjectHelperRepository.java @@ -18,7 +18,6 @@ package org.apache.tools.ant; import java.io.BufferedReader; -import java.io.File; import java.io.InputStream; import java.io.InputStreamReader; import java.lang.reflect.Constructor; @@ -29,6 +28,7 @@ import java.util.Iterator; import java.util.List; import org.apache.tools.ant.helper.ProjectHelper2; +import org.apache.tools.ant.types.Resource; import org.apache.tools.ant.util.LoaderUtils; /** @@ -206,20 +206,20 @@ public class ProjectHelperRepository { } /** - * Get the helper that will be able to parse the specified file. The helper + * Get the helper that will be able to parse the specified build file. The helper * will be chosen among the ones found in the classpath * * @return the first ProjectHelper that fit the requirement (never null). */ - public ProjectHelper getProjectHelper(File buildFile) throws BuildException { + public ProjectHelper getProjectHelperForBuildFile(Resource buildFile) throws BuildException { Iterator it = getHelpers(); while (it.hasNext()) { ProjectHelper helper = (ProjectHelper) it.next(); - if (helper.supportsBuildFile(buildFile)) { + if (helper.canParseBuildFile(buildFile)) { if (DEBUG) { System.out.println("ProjectHelper " + helper.getClass().getName() - + " selected for the file " + + " selected for the build file " + buildFile); } return helper; @@ -229,6 +229,30 @@ public class ProjectHelperRepository { + "have supported the file " + buildFile); } + /** + * Get the helper that will be able to parse the specified antlib. The helper + * will be chosen among the ones found in the classpath + * + * @return the first ProjectHelper that fit the requirement (never null). + */ + public ProjectHelper getProjectHelperForAntlib(Resource antlib) throws BuildException { + Iterator it = getHelpers(); + while (it.hasNext()) { + ProjectHelper helper = (ProjectHelper) it.next(); + if (helper.canParseAntlibDescriptor(antlib)) { + if (DEBUG) { + System.out.println("ProjectHelper " + + helper.getClass().getName() + + " selected for the antlib " + + antlib); + } + return helper; + } + } + throw new RuntimeException("BUG: at least the ProjectHelper2 should " + + "have supported the file " + antlib); + } + /** * Get an iterator on the list of project helpers configured. The iterator * will always return at least one element as there will always be the diff --git a/src/main/org/apache/tools/ant/helper/ProjectHelper2.java b/src/main/org/apache/tools/ant/helper/ProjectHelper2.java index 95126de5c..d521c2f97 100644 --- a/src/main/org/apache/tools/ant/helper/ProjectHelper2.java +++ b/src/main/org/apache/tools/ant/helper/ProjectHelper2.java @@ -27,6 +27,8 @@ import org.apache.tools.ant.Target; import org.apache.tools.ant.TargetGroup; import org.apache.tools.ant.Task; import org.apache.tools.ant.UnknownElement; +import org.apache.tools.ant.types.Resource; +import org.apache.tools.ant.types.resources.URLResource; import org.apache.tools.ant.util.FileUtils; import org.apache.tools.ant.util.JAXPUtils; import org.xml.sax.Attributes; @@ -83,7 +85,7 @@ public class ProjectHelper2 extends ProjectHelper { * * @since Ant 1.8.0 */ - public boolean canParseAntlibDescriptor(URL url) { + public boolean canParseAntlibDescriptor(Resource resource) { return true; } @@ -97,8 +99,11 @@ public class ProjectHelper2 extends ProjectHelper { * @since ant 1.8.0 */ public UnknownElement parseAntlibDescriptor(Project containingProject, - URL source) { - return parseUnknownElement(containingProject, source); + Resource resource) { + if (!(resource instanceof URLResource)) { + throw new BuildException("Unsupported resource type: " + resource); + } + return parseUnknownElement(containingProject, ((URLResource)resource).getURL()); } /** diff --git a/src/main/org/apache/tools/ant/taskdefs/Antlib.java b/src/main/org/apache/tools/ant/taskdefs/Antlib.java index 9278a43c1..737bccc38 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Antlib.java +++ b/src/main/org/apache/tools/ant/taskdefs/Antlib.java @@ -28,10 +28,11 @@ import org.apache.tools.ant.BuildException; import org.apache.tools.ant.ComponentHelper; import org.apache.tools.ant.Project; import org.apache.tools.ant.ProjectHelper; +import org.apache.tools.ant.ProjectHelperRepository; import org.apache.tools.ant.Task; import org.apache.tools.ant.TaskContainer; import org.apache.tools.ant.UnknownElement; -import org.apache.tools.ant.helper.ProjectHelper2; +import org.apache.tools.ant.types.resources.URLResource; /** @@ -70,6 +71,7 @@ public class Antlib extends Task implements TaskContainer { ComponentHelper helper = ComponentHelper.getComponentHelper(project); helper.enterAntLib(uri); + URLResource antlibResource = new URLResource(antlibUrl); try { // Should be safe to parse ProjectHelper parser = null; @@ -77,18 +79,17 @@ public class Antlib extends Task implements TaskContainer { project.getReference(ProjectHelper.PROJECTHELPER_REFERENCE); if (p instanceof ProjectHelper) { parser = (ProjectHelper) p; - if (!parser.canParseAntlibDescriptor(antlibUrl)) { - project.log("ProjectHelper class " + p.getClass().getName() - + " can't parse Antlib descriptors, falling back" - + " to ProjectHelper2."); + if (!parser.canParseAntlibDescriptor(antlibResource)) { parser = null; } } if (parser == null) { - parser = new ProjectHelper2(); + ProjectHelperRepository helperRepository = + ProjectHelperRepository.getInstance(); + parser = helperRepository.getProjectHelperForAntlib(antlibResource); } UnknownElement ue = - parser.parseAntlibDescriptor(project, antlibUrl); + parser.parseAntlibDescriptor(project, antlibResource); // Check name is "antlib" if (!(ue.getTag().equals(TAG))) { throw new BuildException(