- change the ProjectHelper API to start using Resource instead of URL or File git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@829947 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -18,11 +18,12 @@ | |||||
| package org.apache.tools.ant; | package org.apache.tools.ant; | ||||
| import java.io.File; | import java.io.File; | ||||
| import java.net.URL; | |||||
| import java.util.Hashtable; | import java.util.Hashtable; | ||||
| import java.util.Locale; | import java.util.Locale; | ||||
| import java.util.Vector; | 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.apache.tools.ant.util.LoaderUtils; | ||||
| import org.xml.sax.AttributeList; | import org.xml.sax.AttributeList; | ||||
| @@ -64,16 +65,17 @@ public class ProjectHelper { | |||||
| public static final String PROJECTHELPER_REFERENCE = MagicNames.REFID_PROJECT_HELPER; | 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 <code>null</code>. | * @param project The project to configure. Must not be <code>null</code>. | ||||
| * @param buildFile An XML file giving the project's configuration. | |||||
| * @param buildFile A build file giving the project's configuration. | |||||
| * Must not be <code>null</code>. | * Must not be <code>null</code>. | ||||
| * | * | ||||
| * @exception BuildException if the configuration is invalid or cannot be read | * @exception BuildException if the configuration is invalid or cannot be read | ||||
| */ | */ | ||||
| public static void configureProject(Project project, File buildFile) throws BuildException { | 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); | project.addReference(PROJECTHELPER_REFERENCE, helper); | ||||
| helper.parse(project, buildFile); | helper.parse(project, buildFile); | ||||
| } | } | ||||
| @@ -498,7 +500,7 @@ public class ProjectHelper { | |||||
| * | * | ||||
| * @since Ant 1.8.0 | * @since Ant 1.8.0 | ||||
| */ | */ | ||||
| public boolean canParseAntlibDescriptor(URL url) { | |||||
| public boolean canParseAntlibDescriptor(Resource r) { | |||||
| return false; | return false; | ||||
| } | } | ||||
| @@ -509,7 +511,7 @@ public class ProjectHelper { | |||||
| * @since ant 1.8.0 | * @since ant 1.8.0 | ||||
| */ | */ | ||||
| public UnknownElement parseAntlibDescriptor(Project containingProject, | public UnknownElement parseAntlibDescriptor(Project containingProject, | ||||
| URL source) { | |||||
| Resource source) { | |||||
| throw new BuildException("can't parse antlib descriptors"); | throw new BuildException("can't parse antlib descriptors"); | ||||
| } | } | ||||
| @@ -522,7 +524,7 @@ public class ProjectHelper { | |||||
| * @return true if the helper supports it | * @return true if the helper supports it | ||||
| * @since Ant 1.8.0 | * @since Ant 1.8.0 | ||||
| */ | */ | ||||
| public boolean supportsBuildFile(File buildFile) { | |||||
| public boolean canParseBuildFile(Resource buildFile) { | |||||
| return true; | return true; | ||||
| } | } | ||||
| @@ -18,7 +18,6 @@ | |||||
| package org.apache.tools.ant; | package org.apache.tools.ant; | ||||
| import java.io.BufferedReader; | import java.io.BufferedReader; | ||||
| import java.io.File; | |||||
| import java.io.InputStream; | import java.io.InputStream; | ||||
| import java.io.InputStreamReader; | import java.io.InputStreamReader; | ||||
| import java.lang.reflect.Constructor; | import java.lang.reflect.Constructor; | ||||
| @@ -29,6 +28,7 @@ import java.util.Iterator; | |||||
| import java.util.List; | import java.util.List; | ||||
| import org.apache.tools.ant.helper.ProjectHelper2; | import org.apache.tools.ant.helper.ProjectHelper2; | ||||
| import org.apache.tools.ant.types.Resource; | |||||
| import org.apache.tools.ant.util.LoaderUtils; | 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 | * will be chosen among the ones found in the classpath | ||||
| * | * | ||||
| * @return the first ProjectHelper that fit the requirement (never <code>null</code>). | * @return the first ProjectHelper that fit the requirement (never <code>null</code>). | ||||
| */ | */ | ||||
| public ProjectHelper getProjectHelper(File buildFile) throws BuildException { | |||||
| public ProjectHelper getProjectHelperForBuildFile(Resource buildFile) throws BuildException { | |||||
| Iterator it = getHelpers(); | Iterator it = getHelpers(); | ||||
| while (it.hasNext()) { | while (it.hasNext()) { | ||||
| ProjectHelper helper = (ProjectHelper) it.next(); | ProjectHelper helper = (ProjectHelper) it.next(); | ||||
| if (helper.supportsBuildFile(buildFile)) { | |||||
| if (helper.canParseBuildFile(buildFile)) { | |||||
| if (DEBUG) { | if (DEBUG) { | ||||
| System.out.println("ProjectHelper " | System.out.println("ProjectHelper " | ||||
| + helper.getClass().getName() | + helper.getClass().getName() | ||||
| + " selected for the file " | |||||
| + " selected for the build file " | |||||
| + buildFile); | + buildFile); | ||||
| } | } | ||||
| return helper; | return helper; | ||||
| @@ -229,6 +229,30 @@ public class ProjectHelperRepository { | |||||
| + "have supported the file " + buildFile); | + "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 <code>null</code>). | |||||
| */ | |||||
| 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 | * 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 | * will always return at least one element as there will always be the | ||||
| @@ -27,6 +27,8 @@ import org.apache.tools.ant.Target; | |||||
| import org.apache.tools.ant.TargetGroup; | import org.apache.tools.ant.TargetGroup; | ||||
| import org.apache.tools.ant.Task; | import org.apache.tools.ant.Task; | ||||
| import org.apache.tools.ant.UnknownElement; | 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.FileUtils; | ||||
| import org.apache.tools.ant.util.JAXPUtils; | import org.apache.tools.ant.util.JAXPUtils; | ||||
| import org.xml.sax.Attributes; | import org.xml.sax.Attributes; | ||||
| @@ -83,7 +85,7 @@ public class ProjectHelper2 extends ProjectHelper { | |||||
| * | * | ||||
| * @since Ant 1.8.0 | * @since Ant 1.8.0 | ||||
| */ | */ | ||||
| public boolean canParseAntlibDescriptor(URL url) { | |||||
| public boolean canParseAntlibDescriptor(Resource resource) { | |||||
| return true; | return true; | ||||
| } | } | ||||
| @@ -97,8 +99,11 @@ public class ProjectHelper2 extends ProjectHelper { | |||||
| * @since ant 1.8.0 | * @since ant 1.8.0 | ||||
| */ | */ | ||||
| public UnknownElement parseAntlibDescriptor(Project containingProject, | 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()); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -28,10 +28,11 @@ import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.ComponentHelper; | import org.apache.tools.ant.ComponentHelper; | ||||
| import org.apache.tools.ant.Project; | import org.apache.tools.ant.Project; | ||||
| import org.apache.tools.ant.ProjectHelper; | import org.apache.tools.ant.ProjectHelper; | ||||
| import org.apache.tools.ant.ProjectHelperRepository; | |||||
| import org.apache.tools.ant.Task; | import org.apache.tools.ant.Task; | ||||
| import org.apache.tools.ant.TaskContainer; | import org.apache.tools.ant.TaskContainer; | ||||
| import org.apache.tools.ant.UnknownElement; | 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 helper = | ||||
| ComponentHelper.getComponentHelper(project); | ComponentHelper.getComponentHelper(project); | ||||
| helper.enterAntLib(uri); | helper.enterAntLib(uri); | ||||
| URLResource antlibResource = new URLResource(antlibUrl); | |||||
| try { | try { | ||||
| // Should be safe to parse | // Should be safe to parse | ||||
| ProjectHelper parser = null; | ProjectHelper parser = null; | ||||
| @@ -77,18 +79,17 @@ public class Antlib extends Task implements TaskContainer { | |||||
| project.getReference(ProjectHelper.PROJECTHELPER_REFERENCE); | project.getReference(ProjectHelper.PROJECTHELPER_REFERENCE); | ||||
| if (p instanceof ProjectHelper) { | if (p instanceof ProjectHelper) { | ||||
| parser = (ProjectHelper) p; | 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; | parser = null; | ||||
| } | } | ||||
| } | } | ||||
| if (parser == null) { | if (parser == null) { | ||||
| parser = new ProjectHelper2(); | |||||
| ProjectHelperRepository helperRepository = | |||||
| ProjectHelperRepository.getInstance(); | |||||
| parser = helperRepository.getProjectHelperForAntlib(antlibResource); | |||||
| } | } | ||||
| UnknownElement ue = | UnknownElement ue = | ||||
| parser.parseAntlibDescriptor(project, antlibUrl); | |||||
| parser.parseAntlibDescriptor(project, antlibResource); | |||||
| // Check name is "antlib" | // Check name is "antlib" | ||||
| if (!(ue.getTag().equals(TAG))) { | if (!(ue.getTag().equals(TAG))) { | ||||
| throw new BuildException( | throw new BuildException( | ||||