diff --git a/src/etc/testcases/taskdefs/optional/jspc.xml b/src/etc/testcases/taskdefs/optional/jspc.xml index cfd1cdfc2..d437d8767 100644 --- a/src/etc/testcases/taskdefs/optional/jspc.xml +++ b/src/etc/testcases/taskdefs/optional/jspc.xml @@ -9,6 +9,7 @@ + @@ -23,6 +24,7 @@ @@ -30,6 +32,7 @@ + @@ -58,6 +62,7 @@ destdir="${jsp.output.dir}" uriroot="${jsp.dir}" srcdir="${jsp.dir}" + compiler="${jsp.compiler}" verbose="${jsp.verbosity}"> @@ -68,6 +73,7 @@ @@ -79,6 +85,7 @@ @@ -90,6 +97,7 @@ @@ -100,6 +108,7 @@ diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/jsp/JspC.java b/src/main/org/apache/tools/ant/taskdefs/optional/jsp/JspC.java index 7d1ec1acd..3f0e98278 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/jsp/JspC.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/jsp/JspC.java @@ -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 true. @@ -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()); diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/jsp/JspNameMangler.java b/src/main/org/apache/tools/ant/taskdefs/optional/jsp/JspNameMangler.java index d511cf7b9..abd2025e6 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/jsp/JspNameMangler.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/jsp/JspNameMangler.java @@ -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; diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/JasperC.java b/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/JasperC.java index f256ce381..78452516b 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/JasperC.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/JasperC.java @@ -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; } } diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/JspCompilerAdapterFactory.java b/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/JspCompilerAdapterFactory.java index 8c5deba99..5776a244d 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/JspCompilerAdapterFactory.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/JspCompilerAdapterFactory.java @@ -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 J D Glanville * @author Matthew Watson mattw@i3sp.com + * @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); } diff --git a/src/testcases/org/apache/tools/ant/taskdefs/optional/JspcTest.java b/src/testcases/org/apache/tools/ant/taskdefs/optional/JspcTest.java index f5bcca520..16cae919c 100644 --- a/src/testcases/org/apache/tools/ant/taskdefs/optional/JspcTest.java +++ b/src/testcases/org/apache/tools/ant/taskdefs/optional/JspcTest.java @@ -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)); + } + + }