git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272843 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -107,6 +107,20 @@ The Task has the following attributes:<p> | |||
| </td> | |||
| <td valign="top" align="center">No</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">compiler</td> | |||
| <td valign="top"> | |||
| Class name of jsp compiler adapter to use. Defaults to | |||
| the standard adapter for Jasper. | |||
| </td> | |||
| <td valign="top" align="center">No</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">compilerclasspath</td> | |||
| <td valign="top">The classpath used to find the compiler adapter specified | |||
| by the <code>compiler</code> attribute.</td> | |||
| <td valign="top" align="center">No</td> | |||
| </tr> | |||
| </table> | |||
| <P>The <tt>mapped</tt> option will, if set to true, split the JSP text content into a | |||
| @@ -155,6 +169,10 @@ classpath. | |||
| <h4>classpathref</h4> | |||
| a reference to an existing classpath | |||
| <h4>compilerclasspath</h4> | |||
| The classpath used to locate an optional compiler adapter specified by | |||
| <code>compiler</code> | |||
| <h3>Example</h3> | |||
| <pre> | |||
| <jspc srcdir="${basedir}/src/war" | |||
| @@ -60,6 +60,7 @@ import java.util.Date; | |||
| import java.util.Vector; | |||
| import java.util.Enumeration; | |||
| import org.apache.tools.ant.AntClassLoader; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.DirectoryScanner; | |||
| import org.apache.tools.ant.Project; | |||
| @@ -113,6 +114,7 @@ import org.apache.tools.ant.types.Reference; | |||
| public class JspC extends MatchingTask { | |||
| /* ------------------------------------------------------------ */ | |||
| private Path classpath; | |||
| private Path compilerClasspath; | |||
| private Path src; | |||
| private File destDir; | |||
| private String packageName ; | |||
| @@ -297,6 +299,35 @@ public class JspC extends MatchingTask { | |||
| return classpath; | |||
| } | |||
| /* ------------------------------------------------------------ */ | |||
| /** | |||
| * Set the classpath to be used to find this compiler adapter | |||
| */ | |||
| public void setCompilerclasspath(Path cp) { | |||
| if (compilerClasspath == null) { | |||
| compilerClasspath = cp; | |||
| } else { | |||
| compilerClasspath.append(cp); | |||
| } | |||
| } | |||
| /** | |||
| * get the classpath used to find the compiler adapter | |||
| */ | |||
| public Path getCompilerclasspath(){ | |||
| return compilerClasspath; | |||
| } | |||
| /** | |||
| * Support nested compiler classpath, used to locate compiler adapter | |||
| */ | |||
| public Path createCompilerclasspath() { | |||
| if (compilerClasspath == null) { | |||
| compilerClasspath = new Path(project); | |||
| } | |||
| return compilerClasspath.createPath(); | |||
| } | |||
| /** | |||
| * -webxml <file> Creates a complete web.xml when using the -webapp option. | |||
| * | |||
| @@ -384,7 +415,8 @@ public class JspC extends MatchingTask { | |||
| //bind to a compiler | |||
| JspCompilerAdapter compiler = | |||
| JspCompilerAdapterFactory.getCompiler(compilerName, this); | |||
| JspCompilerAdapterFactory.getCompiler(compilerName, this, | |||
| new AntClassLoader(getProject(), compilerClasspath)); | |||
| // if the compiler does its own dependency stuff, we just call it right now | |||
| if (compiler.implementsOwnDependencyChecking()) { | |||
| @@ -53,6 +53,7 @@ | |||
| */ | |||
| package org.apache.tools.ant.taskdefs.optional.jsp.compilers; | |||
| import org.apache.tools.ant.AntClassLoader; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.Task; | |||
| @@ -87,13 +88,37 @@ public class JspCompilerAdapterFactory { | |||
| */ | |||
| public static JspCompilerAdapter getCompiler(String compilerType, Task task) | |||
| throws BuildException { | |||
| return getCompiler(compilerType, task, | |||
| new AntClassLoader(task.getProject(), null)); | |||
| } | |||
| /** | |||
| * Based on the parameter passed in, this method creates the necessary | |||
| * factory desired. | |||
| * | |||
| * The current mapping for compiler names are as follows: | |||
| * <ul><li>jasper = jasper compiler (the default) | |||
| * <li><i>a fully quallified classname</i> = the name of a jsp compiler | |||
| * adapter | |||
| * </ul> | |||
| * | |||
| * @param compilerType either the name of the desired compiler, or the | |||
| * full classname of the compiler's adapter. | |||
| * @param task a task to log through. | |||
| * @param loader AntClassLoader with which the compiler should be loaded | |||
| * @throws BuildException if the compiler type could not be resolved into | |||
| * a compiler adapter. | |||
| */ | |||
| public static JspCompilerAdapter getCompiler(String compilerType, Task task, | |||
| AntClassLoader loader) | |||
| throws BuildException { | |||
| /* If I've done things right, this should be the extent of the | |||
| * conditional statements required. | |||
| */ | |||
| if (compilerType.equalsIgnoreCase("jasper")) { | |||
| return new JasperC(); | |||
| } | |||
| return resolveClassName(compilerType); | |||
| return resolveClassName(compilerType, loader); | |||
| } | |||
| /** | |||
| @@ -101,13 +126,15 @@ public class JspCompilerAdapterFactory { | |||
| * Throws a fit if it can't. | |||
| * | |||
| * @param className The fully qualified classname to be created. | |||
| * @param classloader Classloader with which to load the class | |||
| * @throws BuildException This is the fit that is thrown if className | |||
| * isn't an instance of JspCompilerAdapter. | |||
| */ | |||
| private static JspCompilerAdapter resolveClassName(String className) | |||
| private static JspCompilerAdapter resolveClassName(String className, | |||
| AntClassLoader classloader) | |||
| throws BuildException { | |||
| try { | |||
| Class c = Class.forName(className); | |||
| Class c = classloader.findClass(className); | |||
| Object o = c.newInstance(); | |||
| return (JspCompilerAdapter) o; | |||
| } catch (ClassNotFoundException cnfe) { | |||