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]>