git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@273936 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -9,6 +9,7 @@ | |||
| <property name="jsp.dir" location="jsp"/> | |||
| <property name="jsp.output.dir" location="${jsp.dir}/java"/> | |||
| <property name="jsp.verbosity" value="3"/> | |||
| <property name="jsp.compiler" value="jasper41"/> | |||
| <mkdir dir="${jsp.output.dir}"/> | |||
| </target> | |||
| @@ -23,6 +24,7 @@ | |||
| <jspc | |||
| destdir="${jsp.output.dir}" | |||
| srcdir="${jsp.dir}" | |||
| compiler="${jsp.compiler}" | |||
| verbose="${jsp.verbosity}"> | |||
| <include | |||
| name="missing_tld.jsp"/> | |||
| @@ -30,6 +32,7 @@ | |||
| </target> | |||
| <!-- this should compile to simple.java --> | |||
| <!-- also, stick to the default compiler here to ensure it still works--> | |||
| <target name="testSimple" depends="init"> | |||
| <jspc | |||
| destdir="${jsp.output.dir}" | |||
| @@ -46,6 +49,7 @@ | |||
| destdir="${jsp.output.dir}" | |||
| uriroot="${jsp.dir}" | |||
| srcdir="${jsp.dir}" | |||
| compiler="${jsp.compiler}" | |||
| verbose="${jsp.verbosity}"> | |||
| <include | |||
| name="uriroot.jsp"/> | |||
| @@ -58,6 +62,7 @@ | |||
| destdir="${jsp.output.dir}" | |||
| uriroot="${jsp.dir}" | |||
| srcdir="${jsp.dir}" | |||
| compiler="${jsp.compiler}" | |||
| verbose="${jsp.verbosity}"> | |||
| <include name="xml.jsp"/> | |||
| </jspc> | |||
| @@ -68,6 +73,7 @@ | |||
| <jspc | |||
| destdir="${jsp.output.dir}" | |||
| srcdir="${jsp.dir}" | |||
| compiler="${jsp.compiler}" | |||
| verbose="${jsp.verbosity}"> | |||
| <include | |||
| name="default.jsp"/> | |||
| @@ -79,6 +85,7 @@ | |||
| <jspc | |||
| destdir="${jsp.output.dir}" | |||
| srcdir="${jsp.dir}" | |||
| compiler="${jsp.compiler}" | |||
| verbose="${jsp.verbosity}"> | |||
| <include | |||
| name="1nvalid-classname.jsp"/> | |||
| @@ -90,6 +97,7 @@ | |||
| <jspc | |||
| destdir="${jsp.output.dir}" | |||
| srcdir="${jsp.dir}" | |||
| compiler="${jsp.compiler}" | |||
| verbose="${jsp.verbosity}"> | |||
| <include | |||
| name="wrong_type.txt"/> | |||
| @@ -100,6 +108,7 @@ | |||
| <target name="testWebapp" depends="init"> | |||
| <jspc | |||
| destdir="${jsp.output.dir}" | |||
| compiler="${jsp.compiler}" | |||
| verbose="${jsp.verbosity}"> | |||
| <webapp basedir="${jsp.dir}" /> | |||
| </jspc> | |||
| @@ -106,7 +106,6 @@ import org.apache.tools.ant.types.Reference; | |||
| * @since 1.5 | |||
| */ | |||
| public class JspC extends MatchingTask { | |||
| /* ------------------------------------------------------------ */ | |||
| private Path classpath; | |||
| private Path compilerClasspath; | |||
| private Path src; | |||
| @@ -155,11 +154,11 @@ public class JspC extends MatchingTask { | |||
| private static final String FAIL_MSG | |||
| = "Compile failed, messages should have been provided."; | |||
| /* ------------------------------------------------------------ */ | |||
| /** | |||
| * Path for source JSP files. | |||
| * Set the path for source JSP files. | |||
| */ | |||
| public void setSrcdir(Path srcDir) { | |||
| public void setSrcDir(Path srcDir) { | |||
| if (src == null) { | |||
| src = srcDir; | |||
| } else { | |||
| @@ -169,7 +168,7 @@ public class JspC extends MatchingTask { | |||
| public Path getSrcDir(){ | |||
| return src; | |||
| } | |||
| /* ------------------------------------------------------------ */ | |||
| /** | |||
| * Set the destination directory into which the JSP source | |||
| * files should be compiled. | |||
| @@ -180,7 +179,6 @@ public class JspC extends MatchingTask { | |||
| public File getDestdir(){ | |||
| return destDir; | |||
| } | |||
| /* ------------------------------------------------------------ */ | |||
| /** | |||
| * Set the name of the package the compiled jsp files should be in. | |||
| @@ -193,7 +191,6 @@ public class JspC extends MatchingTask { | |||
| return packageName; | |||
| } | |||
| /* ------------------------------------------------------------ */ | |||
| /** | |||
| * Set the verbose level of the compiler | |||
| */ | |||
| @@ -204,7 +201,6 @@ public class JspC extends MatchingTask { | |||
| return verbose; | |||
| } | |||
| /* ------------------------------------------------------------ */ | |||
| /** | |||
| * Whether or not the build should halt if compilation fails. | |||
| * Defaults to <code>true</code>. | |||
| @@ -218,15 +214,15 @@ public class JspC extends MatchingTask { | |||
| public boolean getFailonerror() { | |||
| return failOnError; | |||
| } | |||
| /* ------------------------------------------------------------ */ | |||
| public String getIeplugin() { | |||
| return iepluginid; | |||
| } | |||
| /** | |||
| * Java Plugin CLASSID for Internet Explorer | |||
| */ | |||
| public void setIeplugin(String iepluginid_) { | |||
| iepluginid = iepluginid_; | |||
| public void setIeplugin(String iepluginid) { | |||
| this.iepluginid = iepluginid; | |||
| } | |||
| /** | |||
| @@ -237,12 +233,13 @@ public class JspC extends MatchingTask { | |||
| public boolean isMapped() { | |||
| return mapped; | |||
| } | |||
| /** | |||
| * If true, generate separate write() calls for each HTML line | |||
| * in the JSP. | |||
| */ | |||
| public void setMapped(boolean mapped_) { | |||
| mapped = mapped_; | |||
| public void setMapped(boolean mapped) { | |||
| this.mapped = mapped; | |||
| } | |||
| /** | |||
| @@ -426,12 +423,12 @@ public class JspC extends MatchingTask { | |||
| // make sure that we've got a srcdir | |||
| if (src == null) { | |||
| throw new BuildException("srcdir attribute must be set!", | |||
| location); | |||
| } | |||
| getLocation()); | |||
| } | |||
| String [] list = src.list(); | |||
| if (list.length == 0) { | |||
| throw new BuildException("srcdir attribute must be set!", | |||
| location); | |||
| getLocation()); | |||
| } | |||
| @@ -449,7 +446,7 @@ public class JspC extends MatchingTask { | |||
| resetFileLists(); | |||
| int filecount = 0; | |||
| for (int i = 0; i < list.length; i++) { | |||
| File srcDir = (File) getProject().resolveFile(list[i]); | |||
| File srcDir = getProject().resolveFile(list[i]); | |||
| if (!srcDir.exists()) { | |||
| throw new BuildException("srcdir \"" + srcDir.getPath() + | |||
| "\" does not exist!", getLocation()); | |||
| @@ -55,7 +55,7 @@ package org.apache.tools.ant.taskdefs.optional.jsp; | |||
| import java.io.File; | |||
| /** | |||
| * This is a class derived from the Jasper code | |||
| * This is a class derived from the Jasper code | |||
| * (org.apache.jasper.compiler.CommandLineCompiler) to map from a JSP filename | |||
| * to a valid Java classname. | |||
| * | |||
| @@ -159,7 +159,7 @@ public class JspNameMangler implements JspMangler { | |||
| * definition of the char escaping algorithm | |||
| * | |||
| * @param ch char to mangle | |||
| * @return mangled string; 5 digit hex value | |||
| * @return mangled string; 5 digit hex value | |||
| */ | |||
| private static final String mangleChar(char ch) { | |||
| @@ -183,7 +183,7 @@ public class JspNameMangler implements JspMangler { | |||
| /** | |||
| * taking in the substring representing the path relative to the source dir | |||
| * return a new string representing the destination path | |||
| * @todo | |||
| * not supported, as jasper in tomcat4.0 doesnt either | |||
| */ | |||
| public String mapPath(String path) { | |||
| return null; | |||
| @@ -73,6 +73,17 @@ import org.apache.tools.ant.types.Path; | |||
| * @since ant1.5 | |||
| */ | |||
| public class JasperC extends DefaultJspCompilerAdapter { | |||
| /** | |||
| * what produces java classes from .jsp files | |||
| */ | |||
| JspMangler mangler; | |||
| public JasperC(JspMangler mangler) { | |||
| this.mangler = mangler; | |||
| } | |||
| /** | |||
| * our execute method | |||
| */ | |||
| @@ -80,28 +91,11 @@ public class JasperC extends DefaultJspCompilerAdapter { | |||
| throws BuildException { | |||
| getJspc().log("Using jasper compiler", Project.MSG_VERBOSE); | |||
| CommandlineJava cmd = setupJasperCommand(); | |||
| /* | |||
| Path classpath=cmd.createClasspath(getProject()); | |||
| if (getJspc().getClasspath() != null) { | |||
| classpath=getJspc().getClasspath(); | |||
| } else { | |||
| classpath.concatSystemClasspath(); | |||
| } | |||
| ExecuteJava exec=new ExecuteJava(); | |||
| exec.execute(getProject()); | |||
| if ((err = executeJava()) != 0) { | |||
| if (failOnError) { | |||
| throw new BuildException("Java returned: " + err, location); | |||
| } else { | |||
| log("Java Result: " + err, Project.MSG_ERR); | |||
| } | |||
| */ | |||
| try { | |||
| // Create an instance of the compiler, redirecting output to | |||
| // the project log | |||
| // REVISIT. ugly. | |||
| Java java = (Java) (getProject().createTask("java")); | |||
| if (getJspc().getClasspath() != null) { | |||
| getProject().log("using user supplied classpath: "+getJspc().getClasspath(), | |||
| @@ -175,6 +169,6 @@ public class JasperC extends DefaultJspCompilerAdapter { | |||
| */ | |||
| public JspMangler createMangler() { | |||
| return new JspNameMangler(); | |||
| return mangler; | |||
| } | |||
| } | |||
| @@ -56,6 +56,8 @@ 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; | |||
| import org.apache.tools.ant.taskdefs.optional.jsp.JspNameMangler; | |||
| import org.apache.tools.ant.taskdefs.optional.jsp.Jasper41Mangler; | |||
| /** | |||
| @@ -63,6 +65,7 @@ import org.apache.tools.ant.Task; | |||
| * | |||
| * @author <a href="mailto:jayglanville@home.com">J D Glanville</a> | |||
| * @author Matthew Watson <a href="mailto:mattw@i3sp.com">mattw@i3sp.com</a> | |||
| * @author Steve Loughran | |||
| */ | |||
| public class JspCompilerAdapterFactory { | |||
| @@ -112,11 +115,14 @@ public class JspCompilerAdapterFactory { | |||
| 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(); | |||
| //tomcat4.0 gets the old mangler | |||
| return new JasperC(new JspNameMangler()); | |||
| } | |||
| if (compilerType.equalsIgnoreCase("jasper41")) { | |||
| //tomcat4.1 gets the new one | |||
| return new JasperC(new Jasper41Mangler()); | |||
| } | |||
| return resolveClassName(compilerType, loader); | |||
| } | |||
| @@ -57,6 +57,12 @@ import java.io.*; | |||
| import java.util.Properties; | |||
| import org.apache.tools.ant.BuildFileTest; | |||
| import org.apache.tools.ant.taskdefs.optional.jsp.JspMangler; | |||
| import org.apache.tools.ant.taskdefs.optional.jsp.Jasper41Mangler; | |||
| import org.apache.tools.ant.taskdefs.optional.jsp.JspC; | |||
| import org.apache.tools.ant.taskdefs.optional.jsp.JspNameMangler; | |||
| import org.apache.tools.ant.taskdefs.optional.jsp.compilers.JspCompilerAdapterFactory; | |||
| import org.apache.tools.ant.taskdefs.optional.jsp.compilers.JspCompilerAdapter; | |||
| /** | |||
| * Tests the Jspc task. | |||
| @@ -163,7 +169,22 @@ public class JspcTest extends BuildFileTest { | |||
| } | |||
| /** | |||
| * A unit test for JUnit | |||
| */ | |||
| public void testNotAJspFile() throws Exception { | |||
| executeTarget("testNotAJspFile"); | |||
| } | |||
| /** | |||
| * webapp test is currently broken, because it picks up | |||
| * on the missing_tld file, and bails. | |||
| */ | |||
| /* | |||
| public void testWebapp() throws Exception { | |||
| executeTarget("testWebapp"); | |||
| } | |||
| */ | |||
| /** | |||
| * run a target then verify the named file gets created | |||
| * | |||
| @@ -191,7 +212,6 @@ public class JspcTest extends BuildFileTest { | |||
| assertTrue("file " + filename + " is empty", file.length() > 0); | |||
| } | |||
| /** | |||
| * Gets the OutputFile attribute of the JspcTest object | |||
| * | |||
| @@ -201,5 +221,48 @@ public class JspcTest extends BuildFileTest { | |||
| protected File getOutputFile(String subpath) { | |||
| return new File(outDir, subpath); | |||
| } | |||
| /** | |||
| * verify that we select the appropriate mangler | |||
| */ | |||
| public void testJasperNameManglerSelection() { | |||
| JspCompilerAdapter adapter= | |||
| JspCompilerAdapterFactory.getCompiler("jasper", null,null); | |||
| JspMangler mangler=adapter.createMangler(); | |||
| assertTrue(mangler instanceof JspNameMangler); | |||
| adapter= JspCompilerAdapterFactory.getCompiler("jasper41", null, null); | |||
| mangler = adapter.createMangler(); | |||
| assertTrue(mangler instanceof Jasper41Mangler); | |||
| } | |||
| public void testJasper41() { | |||
| JspMangler mangler = new Jasper41Mangler(); | |||
| //java keywords are not special | |||
| assertMapped(mangler, "for.jsp", "for_jsp"); | |||
| //underscores go in front of invalid start chars | |||
| assertMapped(mangler, "0.jsp", "_0_jsp"); | |||
| //underscores at the front get an underscore too | |||
| assertMapped(mangler, "_.jsp", "___jsp"); | |||
| //non java char at start => underscore then the the _hex value | |||
| assertMapped(mangler, "-.jsp", "__0002d_jsp"); | |||
| //and paths are stripped | |||
| char s = File.separatorChar; | |||
| assertMapped(mangler, "" + s + s + "somewhere" + s + "file" + s + "index.jsp", "index_jsp"); | |||
| } | |||
| /** | |||
| * assert our mapping rules | |||
| * @param mangler | |||
| * @param filename | |||
| * @param classname | |||
| */ | |||
| protected void assertMapped(JspMangler mangler, String filename, String classname) { | |||
| String mappedname = mangler.mapJspToJavaName(new File(filename)); | |||
| assertTrue(filename+" should have mapped to "+classname | |||
| +" but instead mapped to "+mappedname, | |||
| classname.equals(mappedname)); | |||
| } | |||
| } | |||