remm 02/05/29 23:14:41 Modified: jasper2/src/share/org/apache/jasper JspEngineContext.java jasper2/src/share/org/apache/jasper/compiler Compiler.java Log: - Part one of the compiler refactoring. - Remove dependencies on the "helper" classes and sub-compilers, which actually had circular side effects back to the original object. - Warning: this is a Costin-style refactoring, so stuff will be broken ;-) Revision Changes Path 1.8 +114 -10 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.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- JspEngineContext.java 11 May 2002 05:00:22 -0000 1.7 +++ JspEngineContext.java 30 May 2002 06:14:41 -0000 1.8 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/JspEngineContext.java,v 1.7 2002/05/11 05:00:22 remm Exp $ - * $Revision: 1.7 $ - * $Date: 2002/05/11 05:00:22 $ + * $Header: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/JspEngineContext.java,v 1.8 2002/05/30 06:14:41 remm Exp $ + * $Revision: 1.8 $ + * $Date: 2002/05/30 06:14:41 $ * * ==================================================================== * @@ -87,8 +87,6 @@ import org.apache.jasper.compiler.JspRuntimeContext; import org.apache.jasper.compiler.ServletWriter; import org.apache.jasper.compiler.Compiler; -import org.apache.jasper.compiler.JspCompiler; -import org.apache.jasper.compiler.SunJavaCompiler; import org.apache.jasper.compiler.JavaCompiler; import org.apache.jasper.logging.Logger; import org.apache.jasper.servlet.JasperLoader; @@ -102,6 +100,7 @@ * @author Harish Prabandham * @author Pierre Delisle * @author Glenn Nielsen + * @author Remy Maucherat */ public class JspEngineContext implements JspCompilationContext { private JspReader reader; @@ -111,11 +110,13 @@ private Compiler jspCompiler; private boolean isErrPage; private String jspUri; + private String jspPath; private String baseURI; private String outDir; private URL [] outUrls = new URL[1]; private Class servletClass; private String servletClassName; + private String classFileName; private String servletPackageName = Constants.JSP_PACKAGE_NAME; private String servletJavaFileName; private String contentType; @@ -208,7 +209,8 @@ public boolean isErrorPage() { return isErrPage; } - + + /** * What is the scratch directory we are generating code into? * FIXME: In some places this is called scratchDir and in some @@ -218,6 +220,7 @@ return outDir; } + /** * Get the scratch directory to place generated code for javac. * @@ -228,6 +231,7 @@ return null; } + /** * Path of the JSP URI. Note that this is not a file name. This is * the context rooted URI of the JSP file. @@ -235,15 +239,62 @@ public String getJspFile() { return jspUri; } - + + + /** + * Path of the JSP relative to the work directory. + */ + public String getJspPath() { + if (jspPath != null) { + return jspPath; + } + String dirName = getJspFile(); + int pos = dirName.lastIndexOf('/'); + if (pos > 0) { + dirName = dirName.substring(0, pos + 1); + } else { + dirName = ""; + } + jspPath = dirName + getServletClassName() + ".java"; + if (jspPath.startsWith("/")) { + jspPath = jspPath.substring(1); + } + return jspPath; + } + + /** * Just the class name (does not include package name) of the * generated class. */ public String getServletClassName() { + if (servletClassName != null) { + return servletClassName; + } + int iSep = jspUri.lastIndexOf('/') + 1; + int iEnd = jspUri.length(); + StringBuffer modifiedClassName = + new StringBuffer(jspUri.length() - iSep); + if (!Character.isJavaIdentifierStart(jspUri.charAt(iSep))) { + // If the first char is not a legal Java letter or digit, + // prepend a '$'. + modifiedClassName.append('$'); + } + for (int i = iSep; i < iEnd; i++) { + char ch = jspUri.charAt(i); + if (Character.isLetterOrDigit(ch)) { + modifiedClassName.append(ch); + } else if (ch == '.') { + modifiedClassName.append('$'); + } else { + modifiedClassName.append(mangleChar(ch)); + } + } + servletClassName = modifiedClassName.toString(); return servletClassName; } - + + /** * Package name for the generated class. */ @@ -251,14 +302,27 @@ return servletPackageName; } + /** * Full path name of the Java file into which the servlet is being * generated. */ public String getServletJavaFileName() { - return servletJavaFileName; + + if (servletJavaFileName != null) { + return servletJavaFileName; + } + + String outputDir = getOutputDir(); + servletJavaFileName = getServletClassName() + ".java"; + if (outputDir != null && !outputDir.equals("")) { + servletJavaFileName = outputDir + servletJavaFileName; + } + return servletJavaFileName; + } + /** * Are we keeping generated code around? */ @@ -322,6 +386,7 @@ return jspCompiler; } + /* String compilerPath = options.getJspCompilerPath(); Class jspCompilerPlugin = options.getJspCompilerPlugin(); JavaCompiler javac; @@ -345,7 +410,10 @@ jspCompiler = new JspCompiler(this,jsw); jspCompiler.setJavaCompiler(javac); - + */ + + jspCompiler = new Compiler(this, jsw); + return jspCompiler; } @@ -516,5 +584,41 @@ return (normalized); } + + + public final String getClassFileName() { + + if (classFileName != null) { + return classFileName; + } + + String outputDir = getOutputDir(); + classFileName = getServletClassName() + ".class"; + if (outputDir != null && !outputDir.equals("")) { + classFileName = outputDir + File.separatorChar + classFileName; + } + return classFileName; + + } + + + /** + * Mangle the specified character to create a legal Java class name. + */ + private static final String mangleChar(char ch) { + + String s = Integer.toHexString(ch); + int nzeros = 5 - s.length(); + char[] result = new char[6]; + result[0] = '_'; + for (int i = 1; i <= nzeros; i++) { + result[i] = '0'; + } + for (int i = nzeros+1, j = 0; i < 6; i++, j++) { + result[i] = s.charAt(j); + } + return new String(result); + } + } 1.8 +75 -9 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.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- Compiler.java 24 May 2002 01:15:27 -0000 1.7 +++ Compiler.java 30 May 2002 06:14:41 -0000 1.8 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Compiler.java,v 1.7 2002/05/24 01:15:27 remm Exp $ - * $Revision: 1.7 $ - * $Date: 2002/05/24 01:15:27 $ + * $Header: /home/cvs/jakarta-tomcat-jasper/jasper2/src/share/org/apache/jasper/compiler/Compiler.java,v 1.8 2002/05/30 06:14:41 remm Exp $ + * $Revision: 1.8 $ + * $Date: 2002/05/30 06:14:41 $ * * ==================================================================== * @@ -62,6 +62,7 @@ import java.util.*; import java.io.*; +import java.net.URL; import javax.servlet.jsp.tagext.TagInfo; import org.xml.sax.Attributes; @@ -76,9 +77,12 @@ import org.apache.jasper.JspCompilationContext; import org.apache.jasper.Constants; import org.apache.jasper.JasperException; +import org.apache.jasper.JspEngineContext; import org.apache.jasper.Options; import org.apache.jasper.logging.Logger; import org.apache.jasper.util.SystemLogHandler; +import org.apache.jasper.runtime.HttpJspBase; +import org.apache.jasper.servlet.JspServletWrapper; /** * Main JSP compiler class. This class uses Ant for compiling. @@ -110,6 +114,7 @@ private ErrorDispatcher errDispatcher; private PageInfo pageInfo; + private JspServletWrapper jsw; protected Project project; @@ -120,6 +125,12 @@ public Compiler(JspCompilationContext ctxt) { + this(ctxt, null); + } + + + public Compiler(JspCompilationContext ctxt, JspServletWrapper jsw) { + this.jsw = jsw; this.ctxt = ctxt; this.errDispatcher = new ErrorDispatcher(); this.options = ctxt.getOptions(); @@ -214,6 +225,8 @@ javac.setSrcdir(srcPath); // Build includes path + javac.setIncludes(((JspEngineContext) ctxt).getJspPath()); + /* String dirName = ctxt.getJspFile(); int pos = dirName.lastIndexOf('/'); if (pos > 0) { @@ -225,7 +238,7 @@ if (includePath.startsWith("/")) { includePath = includePath.substring(1); } - javac.setIncludes(includePath); + */ // Start capturing the System.err output for this thread SystemLogHandler.setThread(); @@ -257,7 +270,60 @@ * to do all the compilation. */ public boolean isOutDated() { - return true; + + String jsp = ctxt.getJspFile(); + + long jspRealLastModified = 0; + try { + URL jspUrl = ctxt.getResource(jsp); + if (jspUrl == null) { + ((JspEngineContext)ctxt).incrementRemoved(); + return false; + } + jspRealLastModified = jspUrl.openConnection().getLastModified(); + } catch (Exception e) { + e.printStackTrace(); + return true; + } + + File classFile = new File(((JspEngineContext) ctxt).getClassFileName()); + if (!classFile.exists()) { + return true; + } + long classLastModified = classFile.lastModified(); + if (classLastModified < jspRealLastModified) { + return true; + } + + // Determine if compile time includes have been changed + HttpJspBase servlet = jsw.getServlet(); + if (servlet == null) { + return false; + } + List includes = servlet.getIncludes(); + if (includes == null) { + return false; + } + + Iterator it = includes.iterator(); + while (it.hasNext()) { + String include = (String)it.next(); + try { + URL includeUrl = ctxt.getResource(include); + if (includeUrl == null) { + return true; + } + if (includeUrl.openConnection().getLastModified() > + classLastModified) { + return true; + } + } catch (Exception e) { + e.printStackTrace(); + return true; + } + } + return false; + } @@ -272,8 +338,8 @@ * Set Mangler which will be used as part of compile(). */ public void setMangler(Mangler mangler) { - this.mangler = mangler; - ctxt.setServletJavaFileName(mangler.getJavaFileName()); + //this.mangler = mangler; + //ctxt.setServletJavaFileName(mangler.getJavaFileName()); } @@ -347,7 +413,7 @@ classFile.delete(); } } catch (Exception e) { - //Remove as much as possible, ignore possible exceptions + // Remove as much as possible, ignore possible exceptions } try { String javaFileName = mangler.getJavaFileName(); @@ -356,7 +422,7 @@ javaFile.delete(); } } catch (Exception e) { - //Remove as much as possible, ignore possible exceptions + // Remove as much as possible, ignore possible exceptions } }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>