kinman 02/04/23 19:21:05 Modified: jasper2/src/share/org/apache/jasper CommandLineContext.java JspCompilationContext.java JspEngineContext.java Options.java jasper2/src/share/org/apache/jasper/compiler CommandLineCompiler.java Compiler.java JspCompiler.java TldLocationsCache.java jasper2/src/share/org/apache/jasper/servlet JspServlet.java Removed: jasper2/src/share/org/apache/jasper JasperError.java Log: - Fixed 6907, to prevent jasper from simultaneous compilation of the same page, yet allows for simultaneous compilation of different pages. - Fixed 6909, to remove double file separator in file names. - Incorporate patch from jasper head branch to illegal class names used by Jspc. - Javadoc fixes. Revision Changes Path 1.2 +24 -22 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/CommandLineContext.java Index: CommandLineContext.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/CommandLineContext.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- CommandLineContext.java 28 Mar 2002 18:46:15 -0000 1.1 +++ CommandLineContext.java 24 Apr 2002 02:21:04 -0000 1.2 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/CommandLineContext.java,v 1.1 2002/03/28 18:46:15 kinman Exp $ - * $Revision: 1.1 $ - * $Date: 2002/03/28 18:46:15 $ + * $Header: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/CommandLineContext.java,v 1.2 2002/04/24 02:21:04 kinman Exp $ + * $Revision: 1.2 $ + * $Date: 2002/04/24 02:21:04 $ * * ==================================================================== * @@ -178,7 +178,8 @@ } /** - * What is the scratch directory we are generating code into? + * The scratch directory to generate code into. + * * FIXME: In some places this is called scratchDir and in some * other places it is called outputDir. */ @@ -187,7 +188,8 @@ } /** - * What is the scratch directory we are generating code into? + * The scratch directory to generate code into for javac. + * * FIXME: In some places this is called scratchDir and in some * other places it is called outputDir. */ @@ -213,33 +215,32 @@ /** * The package name for the generated class. + * The final package is assembled from the one specified in -p, and + * the one derived from the path to jsp file. */ public String getServletPackageName() { - //get the path to the jsp file - int indexOfSlash = getJspFile().lastIndexOf('/'); + //Get the path to the jsp file. Note that the jspFile, by the + //time it gets here, would have been normalized to use '/' + //as file separator. + + int indexOfSlash = getJspFile().lastIndexOf('/'); String pathName; if (indexOfSlash != -1) { pathName = getJspFile().substring(0, indexOfSlash); } else { pathName = "/"; } - //Assemble the package name from the base package name speced on + + //Assemble the package name from the base package name specified on //the command line and the package name derived from the path to //the jsp file String packageName = ""; - if (servletPackageName != null && !servletPackageName.equals("")) { + if (servletPackageName != null) { packageName = servletPackageName; } - if (packageName.equals("")) { - packageName = pathName.replace('/', '.'); - } else { - packageName += pathName.replace('/', '.'); - } - //strip off any leading '.' in the package name - if (!packageName.equals("") && packageName.charAt(0) == '.') { - packageName = packageName.substring(1); - } - return packageName; + packageName += pathName.replace('/', '.'); + + return CommandLineCompiler.manglePackage(packageName); } /** @@ -258,8 +259,9 @@ } /** - * What's the content type of this JSP? Content type includes - * content type and encoding. + * The content type of this JSP. + * + * Content type includes content type and encoding. */ public String getContentType() { return contentType; @@ -340,7 +342,7 @@ /** * Gets a resource as a stream, relative to the meanings of this * context's implementation. - *@returns a null if the resource cannot be found or represented + * @return a null if the resource cannot be found or represented * as an InputStream. */ public java.io.InputStream getResourceAsStream(String res) { 1.2 +15 -9 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/JspCompilationContext.java Index: JspCompilationContext.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/JspCompilationContext.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- JspCompilationContext.java 28 Mar 2002 18:46:15 -0000 1.1 +++ JspCompilationContext.java 24 Apr 2002 02:21:05 -0000 1.2 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/JspCompilationContext.java,v 1.1 2002/03/28 18:46:15 kinman Exp $ - * $Revision: 1.1 $ - * $Date: 2002/03/28 18:46:15 $ + * $Header: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/JspCompilationContext.java,v 1.2 2002/04/24 02:21:05 kinman Exp $ + * $Revision: 1.2 $ + * $Date: 2002/04/24 02:21:05 $ * * ==================================================================== * @@ -111,14 +111,16 @@ public boolean isErrorPage(); /** - * What is the scratch directory we are generating code into? + * The scratch directory to generate code into. + * * FIXME: In some places this is called scratchDir and in some * other places it is called outputDir. */ public String getOutputDir(); /** - * What is the scratch directory we are generating code into? + * The scratch directory to generate code into for javac. + * * FIXME: In some places this is called scratchDir and in some * other places it is called outputDir. */ @@ -153,8 +155,9 @@ public boolean keepGenerated(); /** - * What's the content type of this JSP? Content type includes - * content type and encoding. + * The content type of this JSP. + * + * Content type includes content type and encoding. */ public String getContentType(); @@ -193,7 +196,7 @@ /** * Gets a resource as a stream, relative to the meanings of this * context's implementation. - *@returns a null if the resource cannot be found or represented + * @return a null if the resource cannot be found or represented * as an InputStream. */ public java.io.InputStream getResourceAsStream(String res); @@ -206,11 +209,14 @@ */ public String getRealPath(String path); + static interface Interface1 { + } + /** * Get the 'location' of the TLD associated with * a given taglib 'uri'. * - * @returns An array of two Strings. The first one is + * @return An array of two Strings. The first one is * real path to the TLD. If the path to the TLD points * to a jar file, then the second string is the * name of the entry for the TLD in the jar file. 1.3 +12 -11 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/JspEngineContext.java Index: JspEngineContext.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/JspEngineContext.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- JspEngineContext.java 30 Mar 2002 09:36:29 -0000 1.2 +++ JspEngineContext.java 24 Apr 2002 02:21:05 -0000 1.3 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/JspEngineContext.java,v 1.2 2002/03/30 09:36:29 remm Exp $ - * $Revision: 1.2 $ - * $Date: 2002/03/30 09:36:29 $ + * $Header: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/JspEngineContext.java,v 1.3 2002/04/24 02:21:05 kinman Exp $ + * $Revision: 1.3 $ + * $Date: 2002/04/24 02:21:05 $ * * ==================================================================== * @@ -186,16 +186,15 @@ } /** - * What class loader to use for loading classes while compiling - * this JSP? I don't think this is used right now -- akv. + * The class loader to use for loading classes while compiling + * this JSP. */ public ClassLoader getClassLoader() { return Thread.currentThread().getContextClassLoader(); } /** - * Are we processing something that has been declared as an - * errorpage? + * Return true if the current page is an errorpage. */ public boolean isErrorPage() { return isErrPage; @@ -211,7 +210,8 @@ } /** - * What is the scratch directory we are generating code into? + * Get the scratch directory to place generated code for javac. + * * FIXME: In some places this is called scratchDir and in some * other places it is called outputDir. */ @@ -258,8 +258,9 @@ } /** - * What's the content type of this JSP? Content type includes - * content type and encoding. + * Get the content type of this JSP. + * + * Content type includes content type and encoding. */ public String getContentType() { return contentType; @@ -357,7 +358,7 @@ /** * Gets a resource as a stream, relative to the meanings of this * context's implementation. - *@returns a null if the resource cannot be found or represented + * @return a null if the resource cannot be found or represented * as an InputStream. */ public java.io.InputStream getResourceAsStream(String res) 1.2 +3 -3 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/Options.java Index: Options.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/Options.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- Options.java 28 Mar 2002 18:46:15 -0000 1.1 +++ Options.java 24 Apr 2002 02:21:05 -0000 1.2 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/Options.java,v 1.1 2002/03/28 18:46:15 kinman Exp $ - * $Revision: 1.1 $ - * $Date: 2002/03/28 18:46:15 $ + * $Header: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/Options.java,v 1.2 2002/04/24 02:21:05 kinman Exp $ + * $Revision: 1.2 $ + * $Date: 2002/04/24 02:21:05 $ * * ==================================================================== * @@ -137,7 +137,7 @@ * web.xml or implicitely via the uri tag in the TLD * of a taglib deployed in a jar file (WEB-INF/lib). * - * @returns the instance of the TldLocationsCache + * @return the instance of the TldLocationsCache * for the web-application. */ public TldLocationsCache getTldLocationsCache(); 1.3 +45 -18 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/CommandLineCompiler.java Index: CommandLineCompiler.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/CommandLineCompiler.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- CommandLineCompiler.java 4 Apr 2002 02:34:01 -0000 1.2 +++ CommandLineCompiler.java 24 Apr 2002 02:21:05 -0000 1.3 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/CommandLineCompiler.java,v 1.2 2002/04/04 02:34:01 kinman Exp $ - * $Revision: 1.2 $ - * $Date: 2002/04/04 02:34:01 $ + * $Header: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/CommandLineCompiler.java,v 1.3 2002/04/24 02:21:05 kinman Exp $ + * $Revision: 1.3 $ + * $Date: 2002/04/24 02:21:05 $ * * The Apache Software License, Version 1.1 * @@ -61,6 +61,7 @@ import java.io.File; import java.io.IOException; +import java.util.StringTokenizer; import org.apache.jasper.Constants; import org.apache.jasper.JspCompilationContext; @@ -86,8 +87,6 @@ jsp = new File(ctxt.getJspFile()); outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath(); packageName = ctxt.getServletPackageName(); - if( packageName == null ) - packageName = ""; pkgName = packageName; setMangler(this); @@ -113,7 +112,7 @@ /** * Always outDated. (Of course we are, this is an explicit invocation - *@returns true + * @return true */ public boolean isOutDated() { return true; @@ -163,33 +162,39 @@ className = jsp.getName().substring(0, jsp.getName().length() - 4); else className = jsp.getName(); + } + return mangleName(className); + } + private static final String mangleName(String name) { + // since we don't mangle extensions like the servlet does, // we need to check for keywords as class names for (int i = 0; i < keywords.length; i++) { - if (className.equals(keywords[i])) { - className += "%"; + if (name.equals(keywords[i])) { + name += "%"; + break; }; }; // Fix for invalid characters. If you think of more add to the list. - StringBuffer modifiedClassName = new StringBuffer(); - if (Character.isJavaIdentifierStart(className.charAt(0))) - modifiedClassName.append(className.charAt(0)); + StringBuffer modifiedName = new StringBuffer(); + if (Character.isJavaIdentifierStart(name.charAt(0))) + modifiedName.append(name.charAt(0)); else - modifiedClassName.append(mangleChar(className.charAt(0))); - for (int i = 1; i < className.length(); i++) { - if (Character.isJavaIdentifierPart(className.charAt(i))) - modifiedClassName.append(className.charAt(i)); + modifiedName.append(mangleChar(name.charAt(0))); + for (int i = 1; i < name.length(); i++) { + if (Character.isJavaIdentifierPart(name.charAt(i))) + modifiedName.append(name.charAt(i)); else - modifiedClassName.append(mangleChar(className.charAt(i))); + modifiedName.append(mangleChar(name.charAt(i))); } - return modifiedClassName.toString(); + return modifiedName.toString(); } - public static final String mangleChar(char ch) { + private static final String mangleChar(char ch) { if(ch == File.separatorChar) { ch = '/'; @@ -205,6 +210,28 @@ return new String(result); } + /** + * Make sure that the package name is a legal Java name + * + * @param name The input string, containing arbitary chars separated by + * '.'s, with possible leading, trailing, or double '.'s + * @return legal Java package name. + */ + public static String manglePackage(String name) { + boolean first = true; + + StringBuffer b = new StringBuffer(); + StringTokenizer t = new StringTokenizer(name, "."); + while (t.hasMoreTokens()) { + String nt = t.nextToken(); + if (nt.length() > 0) { + if (b.length() > 0) + b.append('.'); + b.append(mangleName(nt)); + } + } + return b.toString(); + } public final String getClassName() { return className; 1.3 +6 -19 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Compiler.java Index: Compiler.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Compiler.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- Compiler.java 30 Mar 2002 09:36:30 -0000 1.2 +++ Compiler.java 24 Apr 2002 02:21:05 -0000 1.3 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Compiler.java,v 1.2 2002/03/30 09:36:30 remm Exp $ - * $Revision: 1.2 $ - * $Date: 2002/03/30 09:36:30 $ + * $Header: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Compiler.java,v 1.3 2002/04/24 02:21:05 kinman Exp $ + * $Revision: 1.3 $ + * $Date: 2002/04/24 02:21:05 $ * * ==================================================================== * @@ -67,7 +67,6 @@ import org.apache.jasper.JspCompilationContext; import org.apache.jasper.Constants; import org.apache.jasper.JasperException; -import org.apache.jasper.JasperError; import org.apache.jasper.logging.Logger; /** @@ -99,21 +98,10 @@ /** * Compile the jsp file from the current engine context - * - * @return true if the class file was outdated the jsp file - * was recompiled. */ - public boolean compile() + public void compile() throws FileNotFoundException, JasperException, Exception { - String classFileName = mangler.getClassFileName(); - - String className = mangler.getClassName(); - ctxt.setServletClassName(className); - - if (!isOutDated()) - return false; - // Setup page info area pageInfo = new PageInfo(new BeanRepository(ctxt.getClassLoader())); @@ -192,6 +180,7 @@ b.append(" "); } + Constants.message("jsp.message.compiling_with", new Object[] { b.toString() }, Logger.DEBUG); @@ -204,7 +193,7 @@ // if no compiler was set we can kick out now if (javac == null) { - return true; + return; } /* @@ -230,8 +219,6 @@ if (!success) { errDispatcher.javacError(out.toString(), javaFileName, pageNodes); } - - return true; } /** 1.3 +7 -18 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/JspCompiler.java Index: JspCompiler.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/JspCompiler.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- JspCompiler.java 30 Mar 2002 09:36:30 -0000 1.2 +++ JspCompiler.java 24 Apr 2002 02:21:05 -0000 1.3 @@ -85,11 +85,6 @@ String jsp; String outputDir; - // ClassFileData cfd; - boolean outDated; - - long lastChecked = -1; - Logger.Helper loghelper = new Logger.Helper("JASPER_LOG", "JspCompiler"); public JspCompiler(JspCompilationContext ctxt) throws JasperException { @@ -97,13 +92,14 @@ this.jsp = ctxt.getJspFile(); this.outputDir = ctxt.getOutputDir(); - this.outDated = false; setMangler(this); } public final String getClassName() { - if( realClassName == null ) + if( realClassName == null ) { realClassName = getBaseClassName(); + ctxt.setServletClassName(realClassName); + } return realClassName; } @@ -111,7 +107,7 @@ if( javaFileName!=null ) return javaFileName; javaFileName = getClassName() + ".java"; if (outputDir != null && !outputDir.equals("")) - javaFileName = outputDir + File.separatorChar + javaFileName; + javaFileName = outputDir + javaFileName; return javaFileName; } @@ -177,10 +173,6 @@ public boolean isOutDated() { long time = System.currentTimeMillis(); - if (time < lastChecked) - return false; - - lastChecked = time + 2000; long jspRealLastModified = 0; @@ -195,13 +187,10 @@ } File classFile = new File(getClassFileName()); - if (classFile.exists()) { - outDated = classFile.lastModified() < jspRealLastModified; - } else { - outDated = true; - } + if (classFile.exists()) + return classFile.lastModified() < jspRealLastModified; - return outDated; + return true; } } 1.2 +1 -1 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/TldLocationsCache.java Index: TldLocationsCache.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/TldLocationsCache.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- TldLocationsCache.java 28 Mar 2002 18:46:17 -0000 1.1 +++ TldLocationsCache.java 24 Apr 2002 02:21:05 -0000 1.2 @@ -290,7 +290,7 @@ * Get the 'location' of the TLD associated with * a given taglib 'uri'. * - * @returns An array of two Strings. The first one is + * @return An array of two Strings. The first one is * real path to the TLD. If the path to the TLD points * to a jar file, then the second string is the * name of the entry for the TLD in the jar file. 1.3 +34 -32 jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/servlet/JspServlet.java Index: JspServlet.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/servlet/JspServlet.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- JspServlet.java 30 Mar 2002 09:36:30 -0000 1.2 +++ JspServlet.java 24 Apr 2002 02:21:05 -0000 1.3 @@ -83,7 +83,6 @@ import java.security.Policy; import java.security.PrivilegedAction; -import org.apache.jasper.JasperError; import org.apache.jasper.JasperException; import org.apache.jasper.Constants; import org.apache.jasper.Options; @@ -101,7 +100,7 @@ import org.apache.jasper.logging.JasperLogger; /** - * The JSP engine (a.k.a Jasper)! + * The JSP engine (a.k.a Jasper). * * The servlet container is responsible for providing a * URLClassLoader for the web application context Jasper @@ -113,6 +112,7 @@ * @author Anil K. Vijendran * @author Harish Prabandham * @author Remy Maucherat + * @author Kin-man Chung */ public class JspServlet extends HttpServlet { @@ -396,10 +396,13 @@ boolean isErrorPage = exception != null; - JspServletWrapper wrapper = (JspServletWrapper) jsps.get(jspUri); - if (wrapper == null) { - wrapper = new JspServletWrapper(jspUri, isErrorPage); - jsps.put(jspUri, wrapper); + JspServletWrapper wrapper; + synchronized (this) { + wrapper = (JspServletWrapper) jsps.get(jspUri); + if (wrapper == null) { + wrapper = new JspServletWrapper(jspUri, isErrorPage); + jsps.put(jspUri, wrapper); + } } wrapper.service(request, response, precompile); @@ -497,9 +500,6 @@ serviceJspFile(request, response, jspUri, null, precompile); } catch (RuntimeException e) { throw e; - } catch (JasperError ex) { - response.setContentType("text/html"); - response.getWriter().print(ex.getMessage()); } catch (ServletException e) { throw e; } catch (IOException e) { @@ -567,19 +567,16 @@ req, res); } JspCompilationContext ctxt = jsw.ctxt; - boolean outDated = false; - + boolean outDated; Compiler compiler = ctxt.createCompiler(); try { - outDated = compiler.compile(); - if ( (jsw.servletClass == null) || (compiler.isOutDated()) ) { - synchronized ( this ) { - if ((jsw.servletClass == null) || - (compiler.isOutDated() )) { - outDated = compiler.compile(); - } - } + synchronized(jsw) { + // Synchronizing on jsw enables simultaneous compilations of + // different pages, but not the same page. + outDated = compiler.isOutDated(); + if (outDated) + compiler.compile(); } } catch (FileNotFoundException ex) { compiler.removeGeneratedFiles(); @@ -591,18 +588,24 @@ ex); } - // Reload only if it's outdated - if((jsw.servletClass == null) || outDated) { + // Reload only if it's outdated + if ((jsw.servletClass == null) || outDated) { try { - URL [] urls = new URL[1]; - File outputDir = new File(normalize(ctxt.getOutputDir())); - urls[0] = outputDir.toURL(); - jsw.loader = new JasperLoader(urls,ctxt.getServletClassName(), - parentClassLoader, - permissionCollection, - codeSource); - jsw.servletClass = jsw.loader.loadClass( - Constants.JSP_PACKAGE_NAME + "." + ctxt.getServletClassName()); + synchronized (jsw) { + if (jsw.servletClass == null) { + URL [] urls = new URL[1]; + File outputDir = new File(normalize(ctxt.getOutputDir())); + urls[0] = outputDir.toURL(); + jsw.loader = new JasperLoader( + urls,ctxt.getServletClassName(), + parentClassLoader, + permissionCollection, + codeSource); + jsw.servletClass = jsw.loader.loadClass( + Constants.JSP_PACKAGE_NAME + "." + + ctxt.getServletClassName()); + } + } } catch (ClassNotFoundException cex) { throw new JasperException( Constants.getString("jsp.error.unable.load"),cex); @@ -620,6 +623,7 @@ /** * Determines whether the current JSP class is older than the JSP file * from whence it came + * KMC: This is currently no used */ public boolean isOutDated(File jsp, JspCompilationContext ctxt, Mangler mangler ) { @@ -695,6 +699,4 @@ return (normalized); } - - }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>