Browse Source

- use the project helper repository for antlib too

- 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-ffa450edef68
master
Nicolas Lalevee 15 years ago
parent
commit
89ddfa3d6c
4 changed files with 54 additions and 22 deletions
  1. +9
    -7
      src/main/org/apache/tools/ant/ProjectHelper.java
  2. +29
    -5
      src/main/org/apache/tools/ant/ProjectHelperRepository.java
  3. +8
    -3
      src/main/org/apache/tools/ant/helper/ProjectHelper2.java
  4. +8
    -7
      src/main/org/apache/tools/ant/taskdefs/Antlib.java

+ 9
- 7
src/main/org/apache/tools/ant/ProjectHelper.java View File

@@ -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;
} }




+ 29
- 5
src/main/org/apache/tools/ant/ProjectHelperRepository.java View File

@@ -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


+ 8
- 3
src/main/org/apache/tools/ant/helper/ProjectHelper2.java View File

@@ -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());
} }


/** /**


+ 8
- 7
src/main/org/apache/tools/ant/taskdefs/Antlib.java View File

@@ -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(


Loading…
Cancel
Save