costin      00/12/13 11:58:04

  Modified:    src/facade22/org/apache/tomcat/facade ServletHandler.java
                        ServletInfo.java WebXmlReader.java
               src/facade22/org/apache/tomcat/modules/facade22
                        JspInterceptor.java
               src/share/org/apache/tomcat/context AutoSetup.java
                        ErrorHandler.java
               src/share/org/apache/tomcat/core BaseInterceptor.java
                        Context.java Handler.java
               src/share/org/apache/tomcat/modules/session SessionId.java
               src/share/org/apache/tomcat/request AccessInterceptor.java
                        AccountingInterceptor.java InvokerInterceptor.java
                        Jdk12Interceptor.java StaticInterceptor.java
               src/tests/webpages/WEB-INF web.xml
  Added:       src/tests/webpages/jsp params.jsp
  Log:
  One more step in Handler refactoring. We are very close, I think
  Handler starts to be simple enough and ServletWrapper is now at least
  readable ( that was one of the most complex parts of tomcat3).
  
  In the process I also fixed a number of bugs ( it's amazing what you
  find when the code is simpler ) and added few improvements on the
  JspInterceptor ( now the main target for refactoring )
  
  - added get/setModule - the handler is associated with an interceptor the
  same way as in apache, etc. The interceptor creates the handler and sets
  it ( properties, debug ) - Servlet22Interceptor and JspInterceptor are doing
  this for servlets/jsps
  
  - many fixes in JspInterceptor - the error handling had few problems,
  same for reloading.
  
  - changed JspInterceptor to use the same mechanism for reloading with
  servlets - now expire checks are done periodically, not for each
  request.
  
  - started to simplify and better organize JspInterceptor
  
  - fixed bugs related with jsps declared in web.xml
  
  - added a small test for jsp declarations
  
  - use a prefix for the names declared by JspInterceptor, to avoid
  conflicts with web.xml names
  
  - changed the Context logger to report the context path
  
  - removed accounting from Handler - a better mechanism is needed, and
  it's not a priority.
  
  - that simplifies a lot the Handler, and make it possible and easy to
  pass options using server.xml
  
  - removed "origin" from handler - it's implied by Module
  
  - removed Context from handler - it's used only in ServletHandler.
  
  - Small hack in ServletInfo so that servlets declared by WebXmlReader will
  have Servlet22Interceptor as "owner".
  
  Revision  Changes    Path
  1.3       +16 -2     
jakarta-tomcat/src/facade22/org/apache/tomcat/facade/ServletHandler.java
  
  Index: ServletHandler.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/facade22/org/apache/tomcat/facade/ServletHandler.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ServletHandler.java       2000/12/12 22:32:54     1.2
  +++ ServletHandler.java       2000/12/13 19:57:58     1.3
  @@ -110,6 +110,7 @@
       private String path;
       protected Class servletClass;
       protected Servlet servlet;
  +    protected Context context;
       
       // If init() fails, Handler.errorException will hold the reason.
       // In the case of an UnavailableException, this field will hold
  @@ -121,7 +122,7 @@
       }
   
       public String toString() {
  -     return "ServletHandler " + name + "(" + sw  + ")";
  +     return "ServletH " + name + "(" + sw  + ")";
       }
   
       public void setServletInfo( ServletInfo sw ) {
  @@ -137,6 +138,19 @@
        return sw;
       }
   
  +    /**
  +     */
  +    public void setContext( Context context) {
  +        this.context = context;
  +    }
  +
  +    /** Return the context associated with the handler
  +     */
  +    public Context getContext() {
  +     return context;
  +    }
  +
  +
       public void setServletClassName( String servletClassName) {
        servlet=null; // reset the servlet, if it was set
        servletClass=null;
  @@ -394,7 +408,7 @@
            if( state!= STATE_DISABLED ) {
                init();
            }
  -         if( state== STATE_DISABLED ) {
  +         if( state== STATE_DISABLED || state==STATE_DELAYED_INIT ) {
                // the init failed because of an exception
                Exception ex=getErrorException();
                // save error state on request and response
  
  
  
  1.2       +19 -3     
jakarta-tomcat/src/facade22/org/apache/tomcat/facade/ServletInfo.java
  
  Index: ServletInfo.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/facade22/org/apache/tomcat/facade/ServletInfo.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ServletInfo.java  2000/12/12 20:21:24     1.1
  +++ ServletInfo.java  2000/12/13 19:57:58     1.2
  @@ -115,16 +115,32 @@
       }
   
       public String toString() {
  -     return "SW " + handler.getName() + "(" + path + "/" +
  +     return "SW (" + path + " CN=" +
            handler.getServletClassName() +  ")";
       }
   
       // -------------------- Configuration hook
  -
       /** This method can called to add the servlet to the web application.
        * ( typlically used from the config - WebXmlReader ).
        */
  -    public void addServlet(Context ctx) throws TomcatException {
  +    public void addServlet(Context ctx, WebXmlReader wxR)
  +     throws TomcatException
  +    {
  +     // set the owner module for the servlet.
  +     // Even if the servlets are defined in WebXmlReader, they should
  +     // belong to Servlet22Interceptor. ( it's easy to set WebXmlReader,
  +     // but it's more intuitive to set debug and options on Servlet22 )
  +     BaseInterceptor mods[]=ctx.getContainer().getInterceptors();
  +     for( int i=0; i<mods.length; i++ ) {
  +         if( mods[i] instanceof Servlet22Interceptor ) {
  +             handler.setModule( mods[i] );
  +             break;
  +         }
  +     }
  +     // if not found - then we don't have a Servlet22Interceptor.
  +     // That means a configuration problem.
  +     if( handler.getModule() == null )
  +         throw new TomcatException("Can't find Servlet22Interceptor");
        ctx.addServlet( handler );
        handler.setContext( ctx );
       }
  
  
  
  1.8       +2 -1      
jakarta-tomcat/src/facade22/org/apache/tomcat/facade/WebXmlReader.java
  
  Index: WebXmlReader.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/facade22/org/apache/tomcat/facade/WebXmlReader.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- WebXmlReader.java 2000/12/12 20:21:25     1.7
  +++ WebXmlReader.java 2000/12/13 19:57:58     1.8
  @@ -190,13 +190,14 @@
            xh.addRule("web-app/servlet", xh.setParent( "setContext") ); // remove it 
from stack when done
            //      xh.addRule("web-app/servlet", xh.addChild("addServlet", 
"org.apache.tomcat.core.Handler") );
   
  +         final WebXmlReader wxr=this;
            xh.addRule("web-app/servlet", new XmlAction() {
                           public void end( SaxContext xctx)
                               throws Exception {
                               ServletInfo sw=(ServletInfo)
                                   xctx.currentObject();
                               Context cctx=(Context)xctx.previousObject();
  -                            sw.addServlet(cctx);
  +                            sw.addServlet(cctx, wxr);
                           }
                       }
                   );
  
  
  
  1.16      +116 -64   
jakarta-tomcat/src/facade22/org/apache/tomcat/modules/facade22/JspInterceptor.java
  
  Index: JspInterceptor.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/facade22/org/apache/tomcat/modules/facade22/JspInterceptor.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- JspInterceptor.java       2000/12/12 20:21:29     1.15
  +++ JspInterceptor.java       2000/12/13 19:57:59     1.16
  @@ -66,6 +66,7 @@
   
   import org.apache.tomcat.util.log.*;
   import org.apache.tomcat.util.*;
  +import org.apache.tomcat.util.depend.*;
   
   import org.apache.jasper.*;
   import org.apache.jasper.Constants;
  @@ -186,39 +187,66 @@
        }
   
        Context ctx= req.getContext();
  +     DependManager dm=ctx.getDependManager();
  +     if( dm==null ) {
  +         dm=new DependManager();
  +         ctx.setDependManager( dm );
  +     }
   
        // If this Wrapper was already used, we have all the info
        JspInfo jspInfo=(JspInfo)wrapper.getNote( jspInfoNOTE );
        if( jspInfo == null ) {
  -         if( debug > 0 ) log("New jsp page - no jspInfo ");
  +         if( debug>0) log("Handler never processed " + wrapper );
  +         
            jspInfo=new JspInfo(req);
  -         mapJspPage( req, jspInfo, jspInfo.uri, jspInfo.fullClassN);
  -     }
  -
  -     if( debug > 3) {
  -         log( "Check if source is up-to-date " +
  -              jspInfo.jspSource + " " + 
  -              jspInfo.jspSource.lastModified() + " "
  -              + jspInfo.compileTime );
  +         if( "jsp".equals(wrapper.getName())) {
  +             wrapper = mapJspPage( ctx, jspInfo );
  +         }
  +         wrapper.setNote( jspInfoNOTE, jspInfo );
  +         dm.addDependency( jspInfo.expireCheck );
  +         ((ServletHandler)wrapper).
  +             setServletClassName( jspInfo.fullClassN );
  +         req.setHandler( wrapper );
        }
   
  -     if( jspInfo.jspSource.lastModified() 
  -         > jspInfo.compileTime ) {
  -         //XXX           destroy();
  +     if( debug > 3) 
  +         log( "Check if source is up-to-date " +  jspInfo.jspSource + " " + 
  +              jspInfo.jspSource.lastModified()+" "+ jspInfo.compileTime );
  +       
  +     if( jspInfo.expireCheck.isExpired() ) {
  +         //XXX old servlet -  destroy(); 
            
            // jump version number - the file needs to
            // be recompiled, and we don't want a reload
            if( debug > 0 ) log( "Before sync block  " + jspInfo );
            synchronized( jspInfo ) {
  -             //              if( debug>0 )
  -             if( jspInfo.jspSource.lastModified() 
  -                 > jspInfo.compileTime ) {
  +             // if still expired ( we may enter the sync block after
  +             // another thread re-compiled )
  +             if( jspInfo.expireCheck.isExpired() ) {
  +                 // reset the handler error, un-initialize the servlet
  +                 wrapper.setErrorException( null );
  +                 jspInfo.setCompileException( null );
  +                 wrapper.setState( Handler.STATE_ADDED );
  +                 
                    if( debug > 0 ) log( "Compiling " + jspInfo );
  -             
  +                 // Move to the next class name
                    jspInfo.nextVersion();
  +
                    compile( req, jspInfo );
  -                 mapJspPage( req , jspInfo, jspInfo.uri,
  -                             jspInfo.fullClassN);
  +
  +                 // Update the class name in wrapper
  +                 ((ServletHandler)wrapper).
  +                     setServletClassName( jspInfo.fullClassN );
  +
  +                 // set initial exception on the servlet if one is present
  +                 if ( jspInfo.isExceptionPresent() ) {
  +                     wrapper.
  +                         setErrorException(jspInfo.getCompileException());
  +                     wrapper.setState(Handler.STATE_DISABLED);
  +                     // until the jsp cahnges, when it'll be enabled again
  +                 }
  +                 jspInfo.expireCheck.setExpired( false );
  +
                }
            } 
        }
  @@ -226,57 +254,56 @@
        return 0;
       }
   
  +    private static final String SERVLET_NAME_PREFIX="tomcat_jsp.";
  +    
       /** Add an exact map that will avoid *.jsp mapping and intermediate
  -     *  steps
  +     *  steps. It's equivalent with declaring
  +     *  <servlet-name>tomcat_jsp.uri</>
  +     *  <servlet-mapping><servlet-name>tomcat_jsp.uri</><url-pattern>uri</></>
        */
  -    void mapJspPage( Request req, JspInfo jspInfo,
  -                  String servletName, String classN )
  +    Handler mapJspPage( Context ctx, JspInfo jspInfo)
       {
  -     Context ctx=req.getContext();
  -     Handler wrapper=null;
  -     String servletPath=servletName;
  +     String uri=jspInfo.uri;
  +     String servletName= SERVLET_NAME_PREFIX + uri;
  +
  +     log( "mapJspPage " + ctx + " " + jspInfo + " " + servletName + " " +
  +          uri  );
  +
        // add the mapping - it's a "invoker" map ( i.e. it
        // can be removed to keep memory under control.
        // The memory usage is smaller than JspSerlvet anyway, but
        // can be further improved.
        try {
  -         wrapper=ctx.getServletByName( servletName );
  +         Handler wrapper=ctx.getServletByName( servletName );
  +         
            // We may want to replace the class and reset it if changed
            
            if( wrapper==null ) {
                wrapper=new ServletHandler();
  -             wrapper.setContext(ctx);
  +             wrapper.setModule( this );
  +             ((ServletHandler)wrapper).setContext(ctx);
                wrapper.setName(servletName);
  -             wrapper.setOrigin( Handler.ORIGIN_INVOKER );
   
                ((ServletHandler)wrapper).getServletInfo().
  -                 setPath( servletPath );
  +                 setPath( uri );
                ctx.addServlet( wrapper );
                
  -             ctx.addServletMapping( servletPath ,
  -                                    servletPath );
  +             ctx.addServletMapping( uri ,
  +                                    servletName );
                if( debug > 0 )
  -                 log( "Added mapping " + servletPath +
  -                      " path=" + servletPath );
  +                 log( "Added mapping " + uri +
  +                      " path=" + servletName );
            }
  -         ((ServletHandler)wrapper).setServletClassName( classN );
  -         wrapper.setNote( jspInfoNOTE, jspInfo );
  -         // set initial exception on the servlet if one is present
  -         if ( jspInfo.isExceptionPresent() ) {
  -             wrapper.setErrorException(jspInfo.getCompileException());
  -             wrapper.setState(Handler.STATE_DISABLED);
  -         }
  +         return wrapper;
        } catch( TomcatException ex ) {
  -         log("mapJspPage: request=" + req +
  +         log("mapJspPage: ctx=" + ctx +
                ", jspInfo=" + jspInfo +
  -             ", servletName=" + servletName +
  -             ", classN=" + classN, ex);
  -         return ;
  +             ", servletName=" + servletName, ex);
  +         return null;
        }
  -     req.setHandler( wrapper );
  -     if( debug>0) log("Handler " + wrapper);
       }
   
  +     
       /** Convert the .jsp file to a java file, then compile it to class
        */
       void compile(Request req, JspInfo jspInfo ) {
  @@ -302,10 +329,14 @@
            // record time of attempted translate-and-compile
            jspInfo.touch();
   
  -         synchronized ( this ) {
  +         synchronized ( jspInfo ) {
                compiler.compile();
            }
  -         
  +         if( debug > 0 ) {
  +             File f = new File( mangler.getJavaFileName());
  +             log( "Created file : " + f +  " " + f.lastModified());
  +
  +         }
            javac( createJavaCompiler( options ), ctxt, mangler );
            
            if(debug>0)log( "Compiled to " + jspInfo.realClassPath );
  @@ -345,13 +376,14 @@
        String cp=System.getProperty("java.class.path")+ sep + 
            ctxt.getClassPath() + sep + ctxt.getOutputDir();
           javac.setClasspath( cp );
  -     if( debug>0) log( "ClassPath " + cp);
  +     if( debug>5) log( "ClassPath " + cp);
        
        ByteArrayOutputStream out = new ByteArrayOutputStream (256);
        javac.setOutputDir(ctxt.getOutputDir());
           javac.setMsgOutput(out);
   
        String javaFileName = mangler.getJavaFileName();
  +     if( debug>0) log( "Compiling java file " + javaFileName);
        /**
            * Execute the compiler
            */
  @@ -367,6 +399,7 @@
               throw new JasperException("Unable to compile "
                                         + msg);
           }
  +     if( debug > 0 ) log("Compiled ok");
       }
   
       /** tool for customizing javac
  @@ -415,11 +448,13 @@
    */
   class JspInfo {
       Request request;
  -    
  -    String uri; // path
   
  +    String jspPath; // real jsp path - if the request URI is mapped to
  +    // a named jsp.
  +    String uri; // path from request URI
  +
       int version; // version
  -    int debug=0;
  +    int debug=9;
       String pkg;
       String pkgDir;
       String baseClassN;
  @@ -436,13 +471,15 @@
       long compileTime;// tstamp of last compile attemp
   
       Exception compileException; // translation/compile exception 
  -
  +    Dependency expireCheck=new Dependency();
  +    
       JspInfo( Request req ) {
  +     expireCheck.setLocal( true );
        init( req );
       }
   
       public String toString() {
  -     return uri +" " + version;
  +     return "JSPInfo: " + jspPath + " " + uri +" " + version;
       }
   
       /** Update compile time
  @@ -519,22 +556,28 @@
        compileException = null;
        //      String includeUri
        //          = (String) req.getAttribute(Constants.INC_SERVLET_PATH);
  +     Handler w=req.getHandler();
        uri=req.getServletPath();
  +
  +     if("jsp".equals( w.getName()))
  +         jspPath=uri;
  +     else
  +         jspPath=((ServletHandler)w).getServletInfo().getPath();
        Context ctx=req.getContext();
        outputDir = ctx.getWorkDir().getAbsolutePath();
        String jspFilePath=FileUtil.safePath( ctx.getAbsolutePath(),
  -                                           uri); 
  +                                           jspPath); 
        jspSource = new File(jspFilePath);
        
        // extension
  -     int lastComp=uri.lastIndexOf(  "/" );
  +     int lastComp=jspPath.lastIndexOf(  "/" );
        String endUnproc=null;
        if( lastComp > 0 ) {
            // has package
  -         pkgDir=uri.substring( 1, lastComp );
  -         endUnproc=uri.substring( lastComp+1 );
  +         pkgDir=jspPath.substring( 1, lastComp );
  +         endUnproc=jspPath.substring( lastComp+1 );
        } else {
  -         endUnproc=uri.substring( 1 );
  +         endUnproc=jspPath.substring( 1 );
        }
   
        if( pkgDir!=null ) {
  @@ -554,10 +597,10 @@
            baseClassN=endUnproc;
        }
        // XXX insert "mangle" to make names safer
  -    if (pkgDir!=null)
  -     mapPath = outputDir + "/" + pkgDir + "/" + baseClassN + ".ver";
  -    else
  -     mapPath = outputDir + "/" + baseClassN + ".ver";
  +     if (pkgDir!=null)
  +         mapPath = outputDir + "/" + pkgDir + "/" + baseClassN + ".ver";
  +     else
  +         mapPath = outputDir + "/" + baseClassN + ".ver";
   
        File mapFile=new File(mapPath);
        if( mapFile.exists() ) {
  @@ -570,11 +613,20 @@
            updateVersionedPaths();
            compileTime=0;
        }
  -
  +     
  +     expireCheck.setOrigin( jspSource );
  +     expireCheck.setTarget( this );
  +     // if the file has been compiled before, we'll use the
  +     // time of the compilation.
  +     expireCheck.setLastModified( compileTime );
  +     // update isExpired()
  +     expireCheck.checkExpiry();
  +     
        if( debug>0  )
            log("uri=" + uri +
                //" outputDir=" + outputDir +
  -             //" jspSource=" + jspSource +
  +             " jspSource=" + jspSource +
  +             " jspPath=" + jspPath +
                " pkgDir=" + pkgDir +
                " baseClassN=" + baseClassN +
                " ext=" + ext +
  
  
  
  1.19      +0 -4      
jakarta-tomcat/src/share/org/apache/tomcat/context/AutoSetup.java
  
  Index: AutoSetup.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/context/AutoSetup.java,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- AutoSetup.java    2000/11/02 00:43:48     1.18
  +++ AutoSetup.java    2000/12/13 19:58:00     1.19
  @@ -174,8 +174,4 @@
        }
       }
   
  -    public void setDebug( int i ) {
  -     debug=i;
  -    }
  -
   }
  
  
  
  1.12      +17 -13    
jakarta-tomcat/src/share/org/apache/tomcat/context/ErrorHandler.java
  
  Index: ErrorHandler.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/context/ErrorHandler.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- ErrorHandler.java 2000/12/12 00:42:43     1.11
  +++ ErrorHandler.java 2000/12/13 19:58:00     1.12
  @@ -102,13 +102,13 @@
       {
        if( ctx.getHost() == null && ctx.getPath().equals(""))
            rootContext = ctx;
  -     ctx.addServlet( new ExceptionHandler());
  -     ctx.addServlet( new StatusHandler());
  +     ctx.addServlet( new ExceptionHandler(this));
  +     ctx.addServlet( new StatusHandler(this));
   
        // Default status handlers
  -     ctx.addServlet( new RedirectHandler());
  +     ctx.addServlet( new RedirectHandler(this));
        ctx.addErrorPage( "302", "tomcat.redirectHandler");
  -     ctx.addServlet( new NotFoundHandler());
  +     ctx.addServlet( new NotFoundHandler(this));
        ctx.addErrorPage( "404", "tomcat.notFoundHandler");
       }
   
  @@ -186,7 +186,7 @@
            // has clicked "STOP"
            // we need to log any other error - something may be
            // broken if the error servlet has errors.
  -         ctx.log( "Error in errorServlet", ex);
  +         ctx.log( "Error in default status handler", ex);
        } 
       }
   
  @@ -330,9 +330,10 @@
        getManager("org.apache.tomcat.resources");
       int sbNote=0;
       
  -    NotFoundHandler() {
  -     setOrigin( Handler.ORIGIN_INTERNAL );
  +    NotFoundHandler(BaseInterceptor bi) {
  +     //      setOrigin( Handler.ORIGIN_INTERNAL );
        name="tomcat.notFoundHandler";
  +     setModule(bi);
       }
   
       public void doService(Request req, Response res)
  @@ -382,9 +383,10 @@
        getManager("org.apache.tomcat.resources");
       int sbNote=0;
   
  -    ExceptionHandler() {
  -     setOrigin( Handler.ORIGIN_INTERNAL );
  +    ExceptionHandler(BaseInterceptor bi) {
  +     //      setOrigin( Handler.ORIGIN_INTERNAL );
        name="tomcat.exceptionHandler";
  +     setModule( bi );
       }
   
       public void doService(Request req, Response res)
  @@ -455,9 +457,10 @@
        getManager("org.apache.tomcat.resources");
       int sbNote=0;
   
  -    StatusHandler() {
  -     setOrigin( Handler.ORIGIN_INTERNAL );
  +    StatusHandler(BaseInterceptor bi) {
  +     //setOrigin( Handler.ORIGIN_INTERNAL );
        name="tomcat.statusHandler";
  +     setModule( bi );
       }
       
       // We don't want interceptors called for redirect
  @@ -515,9 +518,10 @@
        getManager("org.apache.tomcat.resources");
       int sbNote=0;
   
  -    RedirectHandler() {
  -     setOrigin( Handler.ORIGIN_INTERNAL );
  +    RedirectHandler(BaseInterceptor bi) {
  +     //setOrigin( Handler.ORIGIN_INTERNAL );
        name="tomcat.redirectHandler";
  +     setModule( bi );
       }
   
       // We don't want interceptors called for redirect
  
  
  
  1.30      +15 -7     
jakarta-tomcat/src/share/org/apache/tomcat/core/BaseInterceptor.java
  
  Index: BaseInterceptor.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/BaseInterceptor.java,v
  retrieving revision 1.29
  retrieving revision 1.30
  diff -u -r1.29 -r1.30
  --- BaseInterceptor.java      2000/12/04 18:47:46     1.29
  +++ BaseInterceptor.java      2000/12/13 19:58:00     1.30
  @@ -409,16 +409,20 @@
       // -------------------- Helpers --------------------
       // Methods used in internal housekeeping
       
  -    public void setDebug( int d ) {
  +    public final void setDebug( int d ) {
        debug=d;
       }
   
  -    public void setContextManager( ContextManager cm ) {
  +    public final void setContextManager( ContextManager cm ) {
        this.cm=cm;
        this.ct=cm.getContainer();
        loghelper.setLogger(cm.getLogger());
       }
   
  +    public final ContextManager getContextManager() {
  +     return cm;
  +    }
  +
       /** Called for context-level interceptors
        */
       public void setContext( Context ctx ) {
  @@ -428,23 +432,27 @@
        loghelper.setLogger(ctx.getLog().getLogger());
       }
   
  -    public void log( String s ) {
  +    public final void log( String s ) {
        loghelper.log(s);
       }
   
  -    public void log( String s, Throwable t ) {
  +    public final void log( String s, Throwable t ) {
        loghelper.log(s, t);
       }
       
  -    public void log( String s, int level ) {
  +    public final void log( String s, int level ) {
        loghelper.log(s, level);
       }
       
  -    public void log( String s, Throwable t, int level ) {
  +    public final void log( String s, Throwable t, int level ) {
        loghelper.log(s, t, level);
       }
   
  -    public int getDebug() {
  +    public Log getLog() {
  +     return loghelper;
  +    }
  +    
  +    public final int getDebug() {
           return debug;
       }
       
  
  
  
  1.129     +6 -2      jakarta-tomcat/src/share/org/apache/tomcat/core/Context.java
  
  Index: Context.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Context.java,v
  retrieving revision 1.128
  retrieving revision 1.129
  diff -u -r1.128 -r1.129
  --- Context.java      2000/12/12 00:42:44     1.128
  +++ Context.java      2000/12/13 19:58:01     1.129
  @@ -327,7 +327,8 @@
   
        containers.put( path, map );
        mappings.put( path, sw );
  -
  +     if( debug > 4 )
  +         log( "Map " + path + " -> " + mappings.get(path));
       }
   
       /** Will add a new security constraint:
  @@ -492,6 +493,7 @@
        if( "/".equals(path) )
            path="";
        this.path = path;
  +     loghelper.setLogPrefix("Ctx("+ path +") ");
       }
   
       /**
  @@ -819,7 +821,7 @@
       public final  void addServlet(Handler wrapper)
        throws TomcatException
       {
  -     wrapper.setContext( this );
  +     //      wrapper.setContext( this );
        wrapper.setState( Handler.STATE_ADDED );
        String name=wrapper.getName();
   
  @@ -828,6 +830,8 @@
            log("Removing duplicate servlet " + name  + " " + wrapper);
               removeServletByName(name);
           }
  +     if( debug>5 ) log( "Adding servlet=" + name + "-> "
  +                        + wrapper);
        servlets.put(name, wrapper);
       }
   
  
  
  
  1.29      +29 -81    jakarta-tomcat/src/share/org/apache/tomcat/core/Handler.java
  
  Index: Handler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Handler.java,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- Handler.java      2000/12/12 22:33:02     1.28
  +++ Handler.java      2000/12/13 19:58:01     1.29
  @@ -92,47 +92,6 @@
    * @author Costin Manolache
    */
   public class Handler {
  -    /** accounting - various informations we capture about servlet
  -     *       execution.
  -     *  // XXX Not implemented
  -     *  @see org.apache.tomcat.util.Counters
  -     */
  -    public static final int ACC_LAST_ACCESSED=0;
  -    public static final int ACC_INVOCATION_COUNT=1;
  -    public static final int ACC_SERVICE_TIME=2;
  -    public static final int ACC_ERRORS=3;
  -    public static final int ACC_OVERHEAD=4;
  -    public static final int ACC_IN_INCLUDE=5;
  -    
  -    public static final int ACCOUNTS=6;
  -
  -    // -------------------- Origin --------------------
  -    /** The handler is declared in a configuration file.
  -     */
  -    public static final int ORIGIN_WEB_XML=0;
  -    /** The handler is automatically added by an "invoker" interceptor,
  -     *  that is able to add new servlets based on request
  -     */
  -    public static final int ORIGIN_INVOKER=1;
  -    /** The handler is automatically added by an interceptor that
  -     * implements a templating system.
  -     */
  -    public static final int ORIGIN_JSP=2;
  -    /** any tomcat-specific component that can
  -     register mappings that are "re-generable",
  -     i.e. can be recreated - the mapping can
  -     safely be removed.
  -    */
  -    public static final int ORIGIN_DYNAMIC=3;
  -    /** The handler was added by the admin interface, it should be saved
  -     *       preferably in web.xml
  -     */
  -    public static final int ORIGIN_ADMIN=4;
  -
  -    /** This handler is created internally by tomcat
  -     */
  -    public static final int ORIGIN_INTERNAL=5;
  -
       // -------------------- State --------------------
   
       /** The handler is new, not part of any application.
  @@ -159,22 +118,21 @@
       public static final int STATE_DISABLED=4;
   
       // -------------------- Properties --------------------
  -    protected Context context;
  +    // the handler is part of a module
  +    protected BaseInterceptor module;
  +    
       protected ContextManager contextM;
       
       protected String name;
       protected int state=STATE_NEW;
   
  -    // who creates the servlet definition
  -    protected int origin;
  -
       protected Exception errorException=null;
       
       // Debug
       protected int debug=0;
       protected Log logger=null;
   
  -    private Counters cntr=new Counters( ACCOUNTS );
  +    private Counters cntr=new Counters(ContextManager.MAX_NOTES);
       private Object notes[]=new Object[ContextManager.MAX_NOTES];
   
       // -------------------- Constructor --------------------
  @@ -184,23 +142,25 @@
       public Handler() {
       }
   
  -    /** A handler "belongs" to a single application ( many->one ).
  -     *  We don't support handlers that spawn multiple Contexts -
  -     *  the model is simpler because we can set the security constraints,
  -     *  properties, etc on a application basis.
  -     */
  -    public final void setContext( Context context) {
  -        this.context = context;
  -     contextM=context.getContextManager();
  -     logger=context.getLog();
  +    /** A handler is part of a module. The module can create a number
  +     of handlers. Since the module is configurable, it can 
  +     also configure the handlers - including debug, etc.
  +
  +     The handler shares the same log file with the module ( it
  +     can log to different logs, but the default for debug information
  +     is shared with the other components of a module ).
  +     */
  +    public void setModule(BaseInterceptor module ) {
  +     this.module=module;
  +     contextM=module.getContextManager();
  +     debug=module.getDebug();
  +     logger=module.getLog();
       }
   
  -    /** Return the context associated with the handler
  -     */
  -    public final Context getContext() {
  -     return context;
  +    public BaseInterceptor getModule() {
  +     return module;
       }
  -
  +    
       // -------------------- configuration --------------------
   
       public int getState() {
  @@ -219,27 +179,6 @@
           this.name=handlerName;
       }
   
  -    /** Who created this servlet definition - default is 0, i.e. the
  -     *       web.xml mapping. It can also be the Invoker, the admin ( by using a
  -     *  web interface), JSP engine or something else.
  -     * 
  -     *  Tomcat can do special actions - for example remove non-used
  -     *       mappings if the source is the invoker or a similar component
  -     */
  -    public final void setOrigin( int origin ) {
  -     this.origin=origin;
  -    }
  -    
  -    public final int getOrigin() {
  -     return origin;
  -    }
  -
  -    /** Accounting information
  -     */
  -    public final Counters getCounters() {
  -     return cntr;
  -    }
  -
       // -------------------- Common servlet attributes
       /** Sets an exception that relates to the ability of the
        servlet to execute.  An exception may be set by an
  @@ -386,5 +325,14 @@
       public final Object getNote( int pos ) {
        return notes[pos];
       }
  +
  +    /** Accounting information. Not implemented - it'll contain usefull
  +     information like LAST_ACCESSED, INVOCATION_COUNT, SERVICE_TIME,
  +     ERRROS, IN_INCLUDE, etc.
  +     */
  +    public final Counters getCounters() {
  +     return cntr;
  +    }
  +
   
   }
  
  
  
  1.6       +0 -4      
jakarta-tomcat/src/share/org/apache/tomcat/modules/session/SessionId.java
  
  Index: SessionId.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/session/SessionId.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- SessionId.java    2000/12/01 08:19:14     1.5
  +++ SessionId.java    2000/12/13 19:58:02     1.6
  @@ -101,10 +101,6 @@
       public SessionId() {
       }
   
  -    public void setContextManager( ContextManager cm ) {
  -     this.cm=cm;
  -    }
  -
       public void setNoCookies(boolean noCookies) {
           this.noCookies = noCookies;
       }
  
  
  
  1.27      +13 -7     
jakarta-tomcat/src/share/org/apache/tomcat/request/AccessInterceptor.java
  
  Index: AccessInterceptor.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/request/AccessInterceptor.java,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- AccessInterceptor.java    2000/12/12 00:42:48     1.26
  +++ AccessInterceptor.java    2000/12/13 19:58:03     1.27
  @@ -135,7 +135,9 @@
            if(page==null || errorPage==null) {
                ctx.log( "Form login without form pages, defaulting to basic "
                         + page + " " + errorPage);
  -             ctx.addServlet( new BasicAuthHandler());
  +             BasicAuthHandler baH=new BasicAuthHandler();
  +             baH.setModule( this );
  +             ctx.addServlet( baH );
                ctx.addErrorPage( "401", "tomcat.basicAuthHandler");
                return;
            }
  @@ -173,9 +175,11 @@
            ctx.setFormErrorPage( errorPage );
   
            FormAuthHandler formH=new FormAuthHandler();
  -         formH.setDebug(20);
  +         formH.setModule( this );
            ctx.addServlet( formH );
  -         ctx.addServlet( new FormSecurityCheckHandler() );
  +         FormSecurityCheckHandler fscH=new FormSecurityCheckHandler();
  +         fscH.setModule( this );
  +         ctx.addServlet( fscH );
            ctx.addErrorPage( "401", "tomcat.formAuthHandler");
   
            // Add mapping for the POST handler
  @@ -193,7 +197,9 @@
                         " to tomcat.formSecurityCheck for " +
                         page);
        } else if( "BASIC".equals( login_type )) {
  -         ctx.addServlet( new BasicAuthHandler());
  +         BasicAuthHandler baH=new BasicAuthHandler();
  +         baH.setModule( this );
  +         ctx.addServlet( baH );
            ctx.addErrorPage( "401", "tomcat.basicAuthHandler");
        } else {
            // if unknown, leave the normal 404 error handler to deal
  @@ -344,7 +350,7 @@
       int sbNote=0;
       
       BasicAuthHandler() {
  -     setOrigin( Handler.ORIGIN_INTERNAL );
  +     //      setOrigin( Handler.ORIGIN_INTERNAL );
        name="tomcat.basicAuthHandler";
       }
   
  @@ -390,7 +396,7 @@
   class FormAuthHandler extends Handler {
       
       FormAuthHandler() {
  -     setOrigin( Handler.ORIGIN_INTERNAL );
  +     //      setOrigin( Handler.ORIGIN_INTERNAL );
        name="tomcat.formAuthHandler";
       }
   
  @@ -447,7 +453,7 @@
   class FormSecurityCheckHandler extends Handler {
       
       FormSecurityCheckHandler() {
  -     setOrigin( Handler.ORIGIN_INTERNAL );
  +     //      setOrigin( Handler.ORIGIN_INTERNAL );
        name="tomcat.formSecurityCheck";
       }
   
  
  
  
  1.6       +0 -8      
jakarta-tomcat/src/share/org/apache/tomcat/request/AccountingInterceptor.java
  
  Index: AccountingInterceptor.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/request/AccountingInterceptor.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- AccountingInterceptor.java        2000/10/01 22:21:45     1.5
  +++ AccountingInterceptor.java        2000/12/13 19:58:03     1.6
  @@ -80,18 +80,10 @@
       public AccountingInterceptor() {
       }
   
  -    public void setDebug( int i ) {
  -     debug=i;
  -    }
  -
       public void setTrace( String file ) {
        trace=file;
       }
       
  -    public void setContextManager( ContextManager cm ) {
  -     this.cm=cm;
  -    }
  -
       /** Called when the ContextManger is started
        */
       public void engineInit(ContextManager cm) throws TomcatException {
  
  
  
  1.16      +1 -1      
jakarta-tomcat/src/share/org/apache/tomcat/request/InvokerInterceptor.java
  
  Index: InvokerInterceptor.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/request/InvokerInterceptor.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- InvokerInterceptor.java   2000/12/08 23:18:48     1.15
  +++ InvokerInterceptor.java   2000/12/13 19:58:03     1.16
  @@ -151,7 +151,7 @@
            //      sw.setServletName(servletName);
            //      ctx.addServlet( sw );
            //      sw.setServletClass( servletName );
  -         sw.setOrigin( Handler.ORIGIN_INVOKER );
  +         //sw.setOrigin( Handler.ORIGIN_INVOKER );
            wrapper=sw;
   
            if( debug > 0)
  
  
  
  1.12      +0 -8      
jakarta-tomcat/src/share/org/apache/tomcat/request/Jdk12Interceptor.java
  
  Index: Jdk12Interceptor.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/request/Jdk12Interceptor.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- Jdk12Interceptor.java     2000/08/02 02:17:27     1.11
  +++ Jdk12Interceptor.java     2000/12/13 19:58:03     1.12
  @@ -76,14 +76,6 @@
       public Jdk12Interceptor() {
       }
   
  -    public void setContextManager( ContextManager cm ) {
  -     this.cm=cm;
  -    }
  -
  -    public void setDebug( int i ) {
  -     debug=i;
  -    }
  -
       public void preServletInit( Context ctx, Handler sw )
        throws TomcatException
       {
  
  
  
  1.27      +23 -9     
jakarta-tomcat/src/share/org/apache/tomcat/request/StaticInterceptor.java
  
  Index: StaticInterceptor.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/request/StaticInterceptor.java,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- StaticInterceptor.java    2000/12/12 00:42:48     1.26
  +++ StaticInterceptor.java    2000/12/13 19:58:03     1.27
  @@ -106,13 +106,16 @@
       {
        FileHandler fileHandler=new FileHandler();
        DirHandler dirHandler=new DirHandler();
  +     fileHandler.setModule( this );
  +     fileHandler.setContext( ctx );
        fileHandler.setNoteId( realFileNote );
  -     dirHandler.setNoteId( realFileNote );
        ctx.addServlet( fileHandler );
  +
  +     dirHandler.setNoteId( realFileNote );
  +     dirHandler.setContext( ctx );
  +     dirHandler.setModule( this );
        if (listings)
            ctx.addServlet( dirHandler );
  -     fileHandler.setDebug( debug );
  -     dirHandler.setDebug( debug );
       }
   
       public int requestMap(Request req) {
  @@ -129,7 +132,8 @@
        String absPath=FileUtil.safePath( ctx.getAbsolutePath(),
                                          pathInfo);
   
  -     if( debug > 0 ) log( "RequestMap " + req + " " + absPath + " " + 
ctx.getAbsolutePath() );
  +     if( debug > 0 ) log( "RequestMap " + req + " " + absPath + " " +
  +                          ctx.getAbsolutePath() );
        if( absPath == null ) return 0;
        String requestURI=req.requestURI().toString();
   
  @@ -213,14 +217,19 @@
   /** Serve the content of a file ( and nothing more !).
    *
    */
  -class FileHandler extends Handler  {
  +final class FileHandler extends Handler  {
       int realFileNote;
  -
  +    Context context;
  +    
       FileHandler() {
  -     setOrigin( Handler.ORIGIN_INTERNAL );
  +     //      setOrigin( Handler.ORIGIN_INTERNAL );
        name="tomcat.fileHandler";
       }
   
  +    public void setContext(Context ctx) {
  +     this.context=ctx;
  +    }
  +
       public void setNoteId( int n ) {
        realFileNote=n;
       }
  @@ -322,13 +331,14 @@
   /** HTML-display for directories ( and nothing more !).
    *  This is the handler for static resources of type "dir".
    */
  -class DirHandler extends Handler  {
  +final class DirHandler extends Handler  {
       private static final String datePattern = "EEE, dd MMM yyyyy HH:mm z";
       int realFileNote;
       int sbNote=0;
  +    Context context;
       
       DirHandler() {
  -     setOrigin( Handler.ORIGIN_INTERNAL );
  +     //      setOrigin( Handler.ORIGIN_INTERNAL );
        name="tomcat.dirHandler";
       }
   
  @@ -336,6 +346,10 @@
        realFileNote=n;
       }
   
  +    public void setContext(Context ctx) {
  +     this.context=ctx;
  +    }
  +    
       public void doService(Request req, Response res)
        throws Exception
       {
  
  
  
  1.8       +88 -0     jakarta-tomcat/src/tests/webpages/WEB-INF/web.xml
  
  Index: web.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/tests/webpages/WEB-INF/web.xml,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- web.xml   2000/07/06 22:55:37     1.7
  +++ web.xml   2000/12/13 19:58:04     1.8
  @@ -37,6 +37,94 @@
               requestMap.Servlet4
           </servlet-class>
       </servlet>
  +
  +        <servlet>
  +      <servlet-name>
  +          jspParams1
  +      </servlet-name>
  +      <jsp-file>
  +          /jsp/params.jsp
  +      </jsp-file>
  +      <init-param>
  +        <param-name>abc</param-name>
  +        <param-value>def</param-value>
  +      </init-param>
  +    </servlet>
  +    <servlet>
  +      <servlet-name>
  +          jspParams2.jsp
  +      </servlet-name>
  +      <jsp-file>
  +          /jsp/params.jsp
  +      </jsp-file>
  +      <init-param>
  +        <param-name>xyz</param-name>
  +        <param-value>klm</param-value>
  +      </init-param>
  +    </servlet>
  +    <servlet>
  +      <servlet-name>
  +          jspParams3
  +      </servlet-name>
  +      <jsp-file>
  +          /jsp/params.jsp
  +      </jsp-file>
  +      <init-param>
  +        <param-name>foo</param-name>
  +        <param-value>bar</param-value>
  +      </init-param>
  +      <init-param>
  +        <param-name>foo1</param-name>
  +        <param-value>bar1</param-value>
  +      </init-param>
  +    </servlet>
  +    
  +     <servlet-mapping>
  +        <servlet-name>
  +           jspParams1            
  +        </servlet-name>
  +        <url-pattern>
  +            /jsp/jspParams1
  +        </url-pattern>
  +    </servlet-mapping>
  +    <servlet-mapping>
  +        <servlet-name>
  +           jspParams1            
  +        </servlet-name>
  +        <url-pattern>
  +            /jsp/jspParams11
  +        </url-pattern>
  +    </servlet-mapping>
  +
  +    <servlet-mapping>
  +        <servlet-name>
  +           jspParams2.jsp            
  +        </servlet-name>
  +        <url-pattern>
  +            /jsp/jspParams2
  +        </url-pattern>
  +    </servlet-mapping>
  +
  +    <servlet-mapping>
  +        <servlet-name>
  +           jspParams2.jsp            
  +        </servlet-name>
  +        <url-pattern>
  +            /jsp/jspParams2.jsp
  +        </url-pattern>
  +    </servlet-mapping>
  +
  +    <servlet-mapping>
  +        <servlet-name>
  +           jspParams3            
  +        </servlet-name>
  +        <url-pattern>
  +            /jsp/jspParams3
  +        </url-pattern>
  +    </servlet-mapping>
  +
  +
  +
       <servlet-mapping>
           <servlet-name>
               servlet1
  
  
  
  1.1                  jakarta-tomcat/src/tests/webpages/jsp/params.jsp
  
  Index: params.jsp
  ===================================================================
  <html>
  <!--
    Copyright (c) 1999 The Apache Software Foundation.  All rights 
    reserved.
  -->
  
  <body bgcolor="white">
  <h1> Jsp params: </h1>
  <font size="4">
  
  <% 
    javax.servlet.ServletConfig sc=getServletConfig();
    java.util.Enumeration enum=sc.getInitParameterNames();
    while( enum.hasMoreElements() ) {
       String name=(String)enum.nextElement();
  %>
       Parameter <%= name %> = <%= sc.getInitParameter( name ) %>
  <br>
  <%
    }
  %>
  </font>
  </body>
  </html>
  
  
  

Reply via email to