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

Reply via email to