costin      00/12/08 15:19:01

  Modified:    src/facade22/org/apache/tomcat/facade ServletWrapper.java
                        WebXmlReader.java
               src/facade22/org/apache/tomcat/modules/facade22
                        JspInterceptor.java
               src/share/org/apache/jasper/compiler
                        CommandLineCompiler.java
               src/share/org/apache/tomcat/context ErrorHandler.java
               src/share/org/apache/tomcat/core ContextManager.java
                        Handler.java
               src/share/org/apache/tomcat/request AccessInterceptor.java
                        InvokerInterceptor.java SimpleMapper1.java
                        StaticInterceptor.java
               src/share/org/apache/tomcat/util FileUtil.java
                        PrefixMapper.java
               src/share/org/apache/tomcat/util/log Logger.java
  Removed:     src/share/org/apache/tomcat/util URLUtil.java
  Log:
  First round of Handler refactoring/simplification.
  - added "state" ( will be used instead of guessing from initialized, errors,
  etc)
  - moved servlet-specific code to facade ( will continue for other
  upper-layer code that is still in core )
  
  Added few more comments to the code.
  
  Also, removed URLUtil ( since most of it isn't used ), keep FileUtil
  for path manipulation tools.
  
  Revision  Changes    Path
  1.13      +42 -31    
jakarta-tomcat/src/facade22/org/apache/tomcat/facade/ServletWrapper.java
  
  Index: ServletWrapper.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/facade22/org/apache/tomcat/facade/ServletWrapper.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- ServletWrapper.java       2000/12/06 03:59:29     1.12
  +++ ServletWrapper.java       2000/12/08 23:18:29     1.13
  @@ -68,6 +68,14 @@
   
   /**
    * Class used to represent a servlet inside a Context.
  + *
  + * It will deal with all servlet-specific issues:
  + * - load on startup
  + * - servlet class name ( dynamic loading )
  + * - init parameters
  + * - security roles/mappings ( per servlet )
  + * - jsp that acts like a servlet ( web.xml )
  + * - reloading
    * 
    * @author James Duncan Davidson [[EMAIL PROTECTED]]
    * @author Jason Hunter [[EMAIL PROTECTED]]
  @@ -101,6 +109,10 @@
       // is running ( this have to be revisited !) 
       protected long lastAccessed;
       protected int serviceCount = 0;
  +    protected String servletClassName;
  +
  +    // special case for "jsp servlet"
  +    boolean jspServletInitialized=false;
       
       //    int loadOnStartup=0;
   
  @@ -109,14 +121,10 @@
       public ServletWrapper() {
       }
   
  -    public void setContext( Context context) {
  -     super.setContext( context );
  -     isReloadable=context.getReloadable();
  -        configF = new ServletConfigImpl(this);
  -    }
  -
       public String toString() {
  -     return name + "(" + servletClassName + "/" + path + ")";
  +     if( path==null )
  +         return "Servlet " + name + "(" + servletClassName  + ")";
  +     return "Jsp " + name + "(" + path + ")";
       }
       
       // -------------------- Servlet specific properties 
  @@ -139,10 +147,6 @@
        isReloadable = reloadable;
       }
   
  -    public String getName() {
  -     return getServletName();
  -    }
  -    
       public String getServletName() {
        if(name!=null) return name;
        return path;
  @@ -173,10 +177,13 @@
           return this.servletClassName;
       }
   
  -    public void setServletClass(String servletClassName) {
  -     super.setServletClass( servletClassName );
  +    public void setServletClassName(String servletClassName) {
        servlet=null; // reset the servlet, if it was set
        servletClass=null;
  +     this.servletClassName=servletClassName;
  +    }
  +    public void setServletClass(String servletClassName) {
  +     setServletClassName(servletClassName);
       }
   
       public Exception getErrorException() {
  @@ -233,6 +240,8 @@
   
       public void setPath(String path) {
           this.path = path;
  +     if( name==null )
  +         name=path; // the path will serve as servlet name if not set
       }
   
       // -------------------- 
  @@ -304,8 +313,14 @@
        // ( and easier to read )
        //      log("LoadServlet " + servletClass + " "
        //                         + servletClassName);
  +
  +     // default
  +     if( servletClassName==null )
  +         servletClassName=servletName;
  +     
        if (servletClass == null) {
            if (servletClassName == null) {
  +             // It happens :-(
                throw new IllegalStateException("Can't happen - classname "
                                                + "is null, who added this ?");
            }
  @@ -334,9 +349,12 @@
   
          // make sure the servlet is loaded before calling preInit
        // Jsp case - maybe another Jsp engine is used
  -     if( servlet==null && path != null &&  servletClassName == null) {
  -         log("Calling handleJspInit " + servletClassName);
  +
  +     if( servlet==null && path != null && ! jspServletInitialized ) {
  +         //      log("Calling handleJspInit " + servletClassName);
  +         // dual mode
            handleJspInit();
  +         jspServletInitialized=true;
        }
   
        if( servlet==null ) {
  @@ -376,6 +394,9 @@
       protected void doInit()
        throws Exception
       {
  +     isReloadable=context.getReloadable();
  +        configF = new ServletConfigImpl(this);
  +
        // ASSERT synchronized at higher level, initialized must be false
        try {
            final Servlet sinstance = servlet;
  @@ -394,11 +415,7 @@
        }
       }
   
  -    /** Override service to hook reloading - it can be done in a clean
  -     interceptor. It also hooks jsp - we should have a separate
  -     JspHandler
  -    */
  -    public void service(Request req, Response res) 
  +    protected void doService(Request req, Response res)
        throws Exception
       {
        // <servlet><jsp-file> case
  @@ -428,14 +445,6 @@
                        " unavailable time expired, trying again ");
        }
   
  -     // we reach here of there is no error or the exception has expired
  -     // will do an init
  -     super.service( req, res );
  -    }
  -
  -    protected void doService(Request req, Response res)
  -     throws Exception
  -    {
        // Get facades - each req have one facade per context
        // the facade itself is very light.
   
  @@ -458,6 +467,7 @@
        try {
            doService( reqF, resF );
        } catch ( Exception ex ) {
  +         // support for UnavailableException
            if ( ex instanceof UnavailableException ) {
                // if error not set
                if ( ! isExceptionPresent() ) {
  @@ -471,8 +481,7 @@
                    }
                }
            }
  -         // save error state on request and response
  -         saveError( req, res, ex );
  +         throw ex; // will be saved/handled by Handler
        }
       }
   
  @@ -490,6 +499,8 @@
       }
   
       // -------------------- Jsp hooks
  +    ServletWrapper jspServletW=null;
  +    
       // <servlet><jsp-file> case - we know it's a jsp
       void handleJspInit() {
        // XXX Jsp Servlet is initialized, the servlet is not generated -
  @@ -498,7 +509,7 @@
        // I don't think that ever worked anyway - and I don't think
        // it can work without integrating Jsp handling into tomcat
        // ( using interceptor )
  -     ServletWrapper jspServletW = (ServletWrapper)context.getServletByName("jsp");
  +     jspServletW = (ServletWrapper)context.getServletByName("jsp");
        servletClassName = jspServletW.getServletClass();
       }
   
  
  
  
  1.5       +2 -2      
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.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- WebXmlReader.java 2000/09/30 04:43:28     1.4
  +++ WebXmlReader.java 2000/12/08 23:18:29     1.5
  @@ -40,10 +40,10 @@
       private Handler addServlet( Context ctx, String name, String classN )
        throws TomcatException
       {
  -     Handler sw=new ServletWrapper(); // ctx.createHandler();
  +     ServletWrapper sw=new ServletWrapper(); // ctx.createHandler();
        sw.setContext(ctx);
        sw.setServletName( name );
  -     sw.setServletClass( classN);
  +     sw.setServletClassName( classN);
        ctx.addServlet( sw );
        sw.setLoadOnStartUp( -2147483646 );
        return sw;
  
  
  
  1.13      +1 -1      
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.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- JspInterceptor.java       2000/12/05 14:02:38     1.12
  +++ JspInterceptor.java       2000/12/08 23:18:33     1.13
  @@ -219,7 +219,7 @@
                    log( "Added mapping " + servletPath +
                         " path=" + servletPath );
            }
  -         wrapper.setServletClass( classN );
  +         wrapper.setServletClassName( classN );
            wrapper.setNote( jspInfoNOTE, jspInfo );
            // set initial exception on the servlet if one is present
            if ( jspInfo.isExceptionPresent() ) {
  
  
  
  1.6       +5 -5      
jakarta-tomcat/src/share/org/apache/jasper/compiler/CommandLineCompiler.java
  
  Index: CommandLineCompiler.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/share/org/apache/jasper/compiler/CommandLineCompiler.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- CommandLineCompiler.java  2000/02/25 20:10:46     1.5
  +++ CommandLineCompiler.java  2000/12/08 23:18:34     1.6
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-tomcat/src/share/org/apache/jasper/compiler/CommandLineCompiler.java,v
 1.5 2000/02/25 20:10:46 mandar Exp $
  - * $Revision: 1.5 $
  - * $Date: 2000/02/25 20:10:46 $
  + * $Header: 
/home/cvs/jakarta-tomcat/src/share/org/apache/jasper/compiler/CommandLineCompiler.java,v
 1.6 2000/12/08 23:18:34 costin Exp $
  + * $Revision: 1.6 $
  + * $Date: 2000/12/08 23:18:34 $
    *
    * The Apache Software License, Version 1.1
    *
  @@ -110,7 +110,7 @@
           }
           computeClassFileName();
           computeJavaFileName();
  -    };
  +    }
   
   
       /**
  @@ -119,7 +119,7 @@
        */
       public boolean isOutDated() {
           return true;
  -    };
  +    }
   
   
       public final void computeJavaFileName() {
  
  
  
  1.10      +4 -4      
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.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- ErrorHandler.java 2000/12/06 03:59:29     1.9
  +++ ErrorHandler.java 2000/12/08 23:18:40     1.10
  @@ -336,7 +336,7 @@
       
       NotFoundHandler() {
        initialized=true;
  -     internal=true;
  +     setOrigin( Handler.ORIGIN_INTERNAL );
        name="tomcat.notFoundHandler";
       }
   
  @@ -389,7 +389,7 @@
   
       ExceptionHandler() {
        initialized=true;
  -     internal=true;
  +     setOrigin( Handler.ORIGIN_INTERNAL );
        name="tomcat.exceptionHandler";
       }
   
  @@ -463,7 +463,7 @@
   
       StatusHandler() {
        initialized=true;
  -     internal=true;
  +     setOrigin( Handler.ORIGIN_INTERNAL );
        name="tomcat.statusHandler";
       }
       
  @@ -524,7 +524,7 @@
   
       RedirectHandler() {
        initialized=true;
  -     internal=true;
  +     setOrigin( Handler.ORIGIN_INTERNAL );
        name="tomcat.redirectHandler";
       }
   
  
  
  
  1.157     +2 -2      
jakarta-tomcat/src/share/org/apache/tomcat/core/ContextManager.java
  
  Index: ContextManager.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/ContextManager.java,v
  retrieving revision 1.156
  retrieving revision 1.157
  diff -u -r1.156 -r1.157
  --- ContextManager.java       2000/12/05 13:20:46     1.156
  +++ ContextManager.java       2000/12/08 23:18:43     1.157
  @@ -895,7 +895,7 @@
   
       // -------------------- Error handling --------------------
   
  -    /** Called for error-codes. Will call the error hook.
  +    /** Called for error-codes. Will call the error hook with a status code.
        */
       public final void handleStatus( Request req, Response res, int code ) {
        if( code!=0 )
  @@ -912,7 +912,7 @@
       }
   
       /**
  -     *  Call error hook
  +     *  Call error hook with an exception code.
        */
       public final void handleError( Request req, Response res , Throwable t  ) {
        BaseInterceptor ri[];
  
  
  
  1.25      +149 -88   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.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- Handler.java      2000/12/07 19:52:45     1.24
  +++ Handler.java      2000/12/08 23:18:43     1.25
  @@ -59,24 +59,44 @@
   package org.apache.tomcat.core;
   
   import org.apache.tomcat.util.*;
  +import org.apache.tomcat.util.log.*;
   import org.apache.tomcat.util.collections.EmptyEnumeration;
   import java.io.*;
   import java.net.*;
   import java.util.*;
   
   /**
  - * The class that will generate the actual response.
  + * The class that will generate the actual response or response fragment.
    * Each Handler has a "name" that will determine the content that
    * it will handle.
  - * 
  - * @author [EMAIL PROTECTED]
  + *
  + * The choice to not use "mime/type" as Apache, NES, IIS
  + * is based on the fact that most of the time servlets have "names", and
  + * the mime handling is very different in servlet API.
  + * It is possible to use mime types as a name, and special interceptors can
  + * take advantage of that ( to better integrate with the server ), but
  + * this is not a basic feature.
  + *
  + * Handlers will implement doService, doInit, doDestroy - all methods are
  + * protected and can't be called from outside. This ensures the only entry
  + * points are service(), init(), destroy() and the state and error handling
  + * is consistent.
  + *
  + * Common properties:
  + * <ul>
  + *   <li>name
  + *   <li>configuration parameters
  + *   <li>
  + * </ul>
  + *
  + * @author Costin Manolache
    */
   public class Handler {
  -    /** ServletWrapper counts. The accounting design is not
  -     final, but all this is needed to tune up tomcat
  -     ( and to understand and be able to implement a good
  -     solution )
  -    */
  +    /** 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;
  @@ -86,29 +106,54 @@
       
       public static final int ACCOUNTS=6;
   
  -    /** The servlet was declared in web.xml
  +    // -------------------- 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. Jsp and invoker are particular
  -     cases
  +     safely be removed.
       */
       public static final int ORIGIN_DYNAMIC=3;
  -    /** The servlet was added by the admin, it should be saved
  -     preferably in web.xml
  -    */
  +    /** 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 --------------------
  +
  +    public static final int STATE_NEW=0;
  +
  +    public static final int STATE_ADDED=1;
  +
  +    public static final int STATE_READY=2;
  +
  +    public static final int STATE_TEMP_DISABLED=3;
  +
  +    public static final int STATE_DISABLED=4;
  +    
  +
       // -------------------- Properties --------------------
       protected Context context;
       protected ContextManager contextM;
  -
  +    
       protected String name;
   
  +    protected int state=STATE_NEW;
  +    
       /** True if it can handle requests.
        404 or error if not.
       */
  @@ -116,16 +161,11 @@
       
       Hashtable initArgs=null;
   
  -    
       // who creates the servlet definition
       protected int origin;
   
  -    protected boolean internal=false;
  -
       protected String path;
   
  -    protected String servletClassName;
  -
       protected String servletName;
   
       protected int loadOnStartup=-1;
  @@ -136,82 +176,76 @@
       
       // Debug
       protected int debug=0;
  +    protected Log logger=null;
       protected String debugHead=null;
   
       private Counters cntr=new Counters( ACCOUNTS );
       private Object notes[]=new Object[ContextManager.MAX_NOTES];
   
       // -------------------- Constructor --------------------
  -    
  +
  +    /** Creates a new handler.
  +     */
       public Handler() {
       }
   
  -    public void setContext( Context context) {
  +    /** 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();
       }
   
  -    public Context getContext() {
  +    /** Return the context associated with the handler
  +     */
  +    public final Context getContext() {
        return context;
       }
   
  -    public void reload() {
  +    public int getState() {
  +     return state;
       }
   
  -    public boolean isInternal() {
  -     return internal;
  +    public void setState( int i ) {
  +     this.state=i;
       }
       
  -    public String getName() {
  +    // -------------------- configuration --------------------
  +
  +    public final String getName() {
        return name;
       }
   
  -    public void setName(String servletName) {
  -        this.name=servletName;
  +    public final void setName(String handlerName) {
  +        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 void setOrigin( int origin ) {
  +     *       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 int getOrigin() {
  +    
  +    public final int getOrigin() {
        return origin;
       }
   
  -    /** Accounting
  +    /** Accounting information
        */
       public final Counters getCounters() {
        return cntr;
       }
   
       // -------------------- Common servlet attributes
  -    public String getServletName() {
  -     if(name!=null) return name;
  -     return path;
  -    }
  -
  -    public void setServletName(String servletName) {
  -        this.servletName=servletName;
  -     name=servletName;
  -    }
  -
  -    public String getServletClass() {
  -        return this.servletClassName;
  -    }
  -
  -    public void setServletClass(String servletClassName) {
  -     if( name==null ) name=servletClassName;
  -     this.servletClassName = servletClassName;
  -     initialized=false;
  -    }
  -
       public void setLoadOnStartUp( int level ) {
        loadOnStartup=level;
       }
  @@ -264,10 +298,16 @@
   
       public void setPath(String path) {
           this.path = path;
  +     if( name==null )
  +         name=path; // the path will serve as servlet name if not set
       }
   
       // -------------------- Init params
  -    
  +
  +    /** Add configuration properties associated with this handler.
  +     *  This is a non-final method, handler may override it with an
  +     *  improved/specialized version.
  +     */
       public void addInitParam( String name, String value ) {
        if( initArgs==null) {
            initArgs=new Hashtable();
  @@ -295,7 +335,7 @@
   
       /** Destroy a handler, and notify all the interested interceptors
        */
  -    public void destroy() throws Exception {
  +    public final void destroy() throws Exception {
        if ( ! initialized ) {
            errorException = null;
            return;// already destroyed or not init.
  @@ -312,7 +352,7 @@
   
       /** Call the init method, and notify all interested listeners.
        */
  -    public void init()
  +    public /* final */ void init()
        throws Exception
       {
        // if initialized, then we were sync blocked when first init() succeeded
  @@ -322,6 +362,7 @@
        if (errorException != null) throw errorException;
        try {
            doInit();
  +         initialized=true;
        } catch( Exception ex ) {
            // save error, assume permanent
            setErrorException(ex);
  @@ -349,7 +390,7 @@
        *  Tomcat should be able to handle and log any other exception ( including
        *  runtime exceptions )
        */
  -    public /*final*/ void service(Request req, Response res)
  +    public final void service(Request req, Response res)
        throws Exception
       {
        if( ! initialized ) {
  @@ -371,7 +412,7 @@
            if ( ex != null ) {
                // save error state on request and response
                saveError( req, res, ex );
  -             context.log("Exception in init  " + ex.getMessage(), ex );
  +             log("Exception in init  " + ex.getMessage(), ex );
                // if in included, defer handling to higher level
                if (res.isIncluded()) return;
                // handle init error since at top level
  @@ -383,13 +424,14 @@
            }
        }
        
  -     if( ! internal ) {
  -         BaseInterceptor reqI[]=
  -             req.getContainer().getInterceptors(Container.H_preService);
  -         for( int i=0; i< reqI.length; i++ ) {
  -             reqI[i].preService( req, res );
  -         }
  +     //      if( ! internal ) {
  +     // no distinction for internal handlers !
  +     BaseInterceptor reqI[]=
  +         req.getContainer().getInterceptors(Container.H_preService);
  +     for( int i=0; i< reqI.length; i++ ) {
  +         reqI[i].preService( req, res );
        }
  +     //}
   
        try {
            doService( req, res );
  @@ -399,13 +441,12 @@
        }
   
        // continue with the postService
  -     if( ! internal ) {
  -         BaseInterceptor reqI[]=
  -             req.getContainer().getInterceptors(Container.H_postService);
  -         for( int i=0; i< reqI.length; i++ ) {
  -             reqI[i].postService( req, res );
  -         }
  +     //      if( ! internal ) {
  +     reqI=req.getContainer().getInterceptors(Container.H_postService);
  +     for( int i=0; i< reqI.length; i++ ) {
  +         reqI[i].postService( req, res );
        }
  +     //      }
   
        // if no error
        if( ! res.isExceptionPresent() ) return;
  @@ -414,21 +455,24 @@
        // handle original error since at top level
        contextM.handleError( req, res, res.getErrorException() );
       }
  +
  +    // -------------------- methods you can override --------------------
   
  -    // -------------------- Abstract methods --------------------
  +    /** Reload notification. This hook is called whenever the
  +     *  application ( this handler ) is reloaded
  +     */
  +    public void reload() {
  +    }
           
       /** This method will be called when the handler
  -     is removed ( by admin or timeout ). Various handlers
  -     can implement this, but it can't be called from outside.
  -     ( the "guarded" doDestroy is public )
  -    */
  +     *       is removed ( by admin or timeout ).
  +     */
       protected void doDestroy() throws Exception {
   
       }
   
       /** Initialize the handler. Handler can override this
  -     method to initialize themself.
  -     The method must set initialised=true if successfull.
  +     *       method to initialize themself.
        */
       protected void doInit() throws Exception
       {
  @@ -436,7 +480,10 @@
       }
   
       /** This is the actual content generator. Can't be called
  -     from outside.
  +     *  from outside.
  +     *
  +     *  This method can't be called directly, you must use service(),
  +     *  which also tests the initialization and deals with the errors.
        */
       protected void doService(Request req, Response res)
        throws Exception
  @@ -450,27 +497,41 @@
        return name;
       }
   
  +    /** Debug level for this handler.
  +     */
       public final void setDebug( int d ) {
        debug=d;
       }
   
       protected final void log( String s ) {
  -     context.log(s);
  +     if ( logger==null ) 
  +         contextM.log(s);
  +     else 
  +         logger.log(s);
       }
   
       protected final void log( String s, Throwable t ) {
  -     context.log(s, t);
  +     if(logger==null )
  +         contextM.log(s, t);
  +     else
  +         logger.log(s, t);
       }
   
       // --------------- Error Handling ----------------
   
  -    public final void saveError( Request req, Response res, Exception ex ) {
  +    /** If an error happens during init or service it will be saved in
  +     *  request and response.
  +     */
  +    // XXX error handling in Handler shouldn't be exposed to childs, need
  +    // simplifications
  +    protected final void saveError( Request req, Response res, Exception ex ) {
        // save current exception on the request
        req.setErrorException( ex );
        // if the first exception, save info on the response
        if ( ! res.isExceptionPresent() ) {
            res.setErrorException( ex );
  -         res.setErrorURI( 
(String)req.getAttribute("javax.servlet.include.request_uri") );
  +         res.setErrorURI( (String)req.
  +                       getAttribute("javax.servlet.include.request_uri"));
        }
       }
   
  
  
  
  1.25      +4 -4      
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.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- AccessInterceptor.java    2000/12/01 08:19:16     1.24
  +++ AccessInterceptor.java    2000/12/08 23:18:48     1.25
  @@ -312,7 +312,7 @@
            }
            return true;
        case Container.EXTENSION_MAP:
  -         return ctPath.substring( 1 ).equals( URLUtil.getExtension( path ));
  +         return ctPath.substring( 1 ).equals(FileUtil.getExtension( path ));
        case Container.PATH_MAP:
            return path.equals( ctPath );
        }
  @@ -343,7 +343,7 @@
       
       BasicAuthHandler() {
        initialized=true;
  -     internal=true;
  +     setOrigin( Handler.ORIGIN_INTERNAL );
        name="tomcat.basicAuthHandler";
       }
   
  @@ -390,7 +390,7 @@
       
       FormAuthHandler() {
        initialized=true;
  -     internal=true;
  +     setOrigin( Handler.ORIGIN_INTERNAL );
        name="tomcat.formAuthHandler";
       }
   
  @@ -448,7 +448,7 @@
       
       FormSecurityCheckHandler() {
        initialized=true;
  -     internal=true;
  +     setOrigin( Handler.ORIGIN_INTERNAL );
        name="tomcat.formSecurityCheck";
       }
   
  
  
  
  1.15      +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.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- InvokerInterceptor.java   2000/11/02 21:44:50     1.14
  +++ InvokerInterceptor.java   2000/12/08 23:18:48     1.15
  @@ -150,7 +150,7 @@
            //      sw.setContext(ctx);
            //      sw.setServletName(servletName);
            //      ctx.addServlet( sw );
  -         sw.setServletClass( servletName );
  +         //      sw.setServletClass( servletName );
            sw.setOrigin( Handler.ORIGIN_INVOKER );
            wrapper=sw;
   
  
  
  
  1.27      +1 -1      
jakarta-tomcat/src/share/org/apache/tomcat/request/SimpleMapper1.java
  
  Index: SimpleMapper1.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/request/SimpleMapper1.java,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- SimpleMapper1.java        2000/11/30 17:34:12     1.26
  +++ SimpleMapper1.java        2000/12/08 23:18:48     1.27
  @@ -356,7 +356,7 @@
        String path = req.getServletPath(); // we haven't matched any prefix,
        if( path == null ) return null;
   
  -     String extension=URLUtil.getExtension( path );
  +     String extension=FileUtil.getExtension( path );
        if( extension == null ) return null;
   
        if(debug>0)
  
  
  
  1.25      +2 -2      
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.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- StaticInterceptor.java    2000/11/02 21:44:51     1.24
  +++ StaticInterceptor.java    2000/12/08 23:18:49     1.25
  @@ -218,7 +218,7 @@
   
       FileHandler() {
        initialized=true;
  -     internal=true;
  +     setOrigin( Handler.ORIGIN_INTERNAL );
        name="tomcat.fileHandler";
       }
   
  @@ -330,7 +330,7 @@
       
       DirHandler() {
        initialized=true;
  -     internal=true;
  +     setOrigin( Handler.ORIGIN_INTERNAL );
        name="tomcat.dirHandler";
       }
   
  
  
  
  1.16      +27 -3     jakarta-tomcat/src/share/org/apache/tomcat/util/FileUtil.java
  
  Index: FileUtil.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/util/FileUtil.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- FileUtil.java     2000/11/11 15:19:42     1.15
  +++ FileUtil.java     2000/12/08 23:18:53     1.16
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/util/FileUtil.java,v 1.15 
2000/11/11 15:19:42 larryi Exp $
  - * $Revision: 1.15 $
  - * $Date: 2000/11/11 15:19:42 $
  + * $Header: 
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/util/FileUtil.java,v 1.16 
2000/12/08 23:18:53 costin Exp $
  + * $Revision: 1.16 $
  + * $Date: 2000/12/08 23:18:53 $
    *
    * ====================================================================
    *
  @@ -323,5 +323,29 @@
           }
       }
       
  +    public static String removeLast( String s) {
  +     int i = s.lastIndexOf("/");
  +     
  +     if (i > 0) {
  +         s = s.substring(0, i);
  +     } else if (i == 0 && ! s.equals("/")) {
  +         s = "/";
  +     } else {
  +         s = "";
  +     }
  +     return s;
  +    }
  +
  +    public static String getExtension( String path ) {
  +        int i = path.lastIndexOf(".");
  +     int j = path.lastIndexOf("/");
  +
  +     if ((i > 0) && (i > j))
  +         return path.substring(i);
  +     else
  +         return null;
  +    }
  +
  +
   
   }
  
  
  
  1.6       +4 -4      
jakarta-tomcat/src/share/org/apache/tomcat/util/PrefixMapper.java
  
  Index: PrefixMapper.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/util/PrefixMapper.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- PrefixMapper.java 2000/11/30 17:34:12     1.5
  +++ PrefixMapper.java 2000/12/08 23:18:54     1.6
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/util/PrefixMapper.java,v 1.5 
2000/11/30 17:34:12 costin Exp $
  - * $Revision: 1.5 $
  - * $Date: 2000/11/30 17:34:12 $
  + * $Header: 
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/util/PrefixMapper.java,v 1.6 
2000/12/08 23:18:54 costin Exp $
  + * $Revision: 1.6 $
  + * $Date: 2000/12/08 23:18:54 $
    *
    * ====================================================================
    *
  @@ -227,7 +227,7 @@
            container = myMap.prefixMappedServlets.get(s);
            
            if (container == null) {
  -             s=URLUtil.removeLast( s );
  +             s=FileUtil.removeLast( s );
            }  else {
                if( myMap.mapCacheEnabled ) {
                    // XXX implement LRU or another replacement alghoritm
  
  
  
  1.2       +1 -1      jakarta-tomcat/src/share/org/apache/tomcat/util/log/Logger.java
  
  Index: Logger.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/util/log/Logger.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Logger.java       2000/09/29 14:33:37     1.1
  +++ Logger.java       2000/12/08 23:18:59     1.2
  @@ -108,7 +108,7 @@
         
       // Usefull for subclasses
       private static final String separator = System.getProperty("line.separator", 
"\n");
  -    public static final char[] NEWLINE=separator.toCharArray();;
  +    public static final char[] NEWLINE=separator.toCharArray();
   
   
       /**
  
  
  

Reply via email to