billbarker    2002/08/20 21:07:35

  Modified:    src/share/org/apache/tomcat/modules/mappers
                        ReloadInterceptor.java
  Log:
  Support for reloading session.
  
  Also synchronized reloading, to prevent a double-adding bug.
  Reported by: Hugh J.L. [EMAIL PROTECTED]
  
  Revision  Changes    Path
  1.15      +61 -53    
jakarta-tomcat/src/share/org/apache/tomcat/modules/mappers/ReloadInterceptor.java
  
  Index: ReloadInterceptor.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/mappers/ReloadInterceptor.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- ReloadInterceptor.java    2 Oct 2001 05:50:30 -0000       1.14
  +++ ReloadInterceptor.java    21 Aug 2002 04:07:35 -0000      1.15
  @@ -160,7 +160,6 @@
        context.setAttribute( "org.apache.tomcat.classloader", loader);
       }
   
  -    
       public int contextMap( Request request ) {
        Context ctx=request.getContext();
        if( ctx==null) return 0;
  @@ -184,59 +183,68 @@
            ContextManager cm=ctx.getContextManager();
            
            if( fullReload ) {
  -             Vector sI=new Vector();  // saved local interceptors
  -             BaseInterceptor[] eI;    // all exisiting interceptors
  -
  -             // save the ones with the same context, they are local
  -             eI=ctx.getContainer().getInterceptors();
  -             for(int i=0; i < eI.length ; i++)
  -                 if(ctx == eI[i].getContext()) sI.addElement(eI[i]);
  -                
  -             Enumeration e;
  -             // Need to find all the "config" that
  -             // was read from server.xml.
  -             // So far we work as if the admin interface was
  -             // used to remove/add the context.
  -             // Or like the deploytool in J2EE.
  -             Context ctx1=cm.createContext();
  -             ctx1.setContextManager( cm );
  -             ctx1.setPath(ctx.getPath());
  -             ctx1.setDocBase(ctx.getDocBase());
  -             ctx1.setReloadable( ctx.getReloadable());
  -             ctx1.setDebug( ctx.getDebug());
  -             ctx1.setHost( ctx.getHost());
  -             ctx1.setTrusted( ctx.isTrusted());
  -             e=ctx.getHostAliases();
  -             while( e.hasMoreElements())
  -                 ctx1.addHostAlias( (String)e.nextElement());
  -
  -             cm.removeContext( ctx );
  -
  -             cm.addContext( ctx1 );
  -
  -             // put back saved local interceptors
  -             e=sI.elements();
  -             while(e.hasMoreElements()){
  -                 BaseInterceptor savedI=(BaseInterceptor)e.nextElement();
  -
  -                 ctx1.addInterceptor(savedI);
  -                 savedI.setContext(ctx1);
  -                 savedI.reload(request,ctx1);
  +             synchronized(ctx) {
  +                 if(ctx.getState() == Context.STATE_NEW)
  +                     return 0; // Already reloaded.
  +                 Vector sI=new Vector();  // saved local interceptors
  +                 BaseInterceptor[] eI;    // all exisiting interceptors
  +
  +                 // save the ones with the same context, they are local
  +                 eI=ctx.getContainer().getInterceptors();
  +                 for(int i=0; i < eI.length ; i++)
  +                     if(ctx == eI[i].getContext()) sI.addElement(eI[i]);
  +                 
  +                 Enumeration e;
  +                 // Need to find all the "config" that
  +                 // was read from server.xml.
  +                 // So far we work as if the admin interface was
  +                 // used to remove/add the context.
  +                 // Or like the deploytool in J2EE.
  +                 Context ctx1=cm.createContext();
  +                 ctx1.setContextManager( cm );
  +                 ctx1.setPath(ctx.getPath());
  +                 ctx1.setDocBase(ctx.getDocBase());
  +                 ctx1.setReloadable( ctx.getReloadable());
  +                 ctx1.setDebug( ctx.getDebug());
  +                 ctx1.setHost( ctx.getHost());
  +                 ctx1.setTrusted( ctx.isTrusted());
  +                 e=ctx.getHostAliases();
  +                 while( e.hasMoreElements())
  +                     ctx1.addHostAlias( (String)e.nextElement());
  +
  +                 BaseInterceptor ri[] = 
  +                     cm.getContainer().getInterceptors(Container.H_copyContext);
  +                 int i;
  +                 for( i=0; i < ri.length; i++) {
  +                     ri[i].copyContext(request, ctx, ctx1);
  +                 }
  +                 cm.removeContext( ctx );
  +                 
  +                 cm.addContext( ctx1 );
  +
  +                 // put back saved local interceptors
  +                 e=sI.elements();
  +                 while(e.hasMoreElements()){
  +                     BaseInterceptor savedI=(BaseInterceptor)e.nextElement();
  +                     
  +                     ctx1.addInterceptor(savedI);
  +                     savedI.setContext(ctx1);
  +                     savedI.reload(request,ctx1);
  +                 }
  +
  +                 ctx1.init();
  +
  +                 // remap the request
  +                 request.setAttribute("tomcat.ReloadInterceptor", this);
  +                 ri = cm.getContainer().getInterceptors(Container.H_contextMap);
  +                 
  +                 for( i=0; i< ri.length; i++ ) {
  +                     if( ri[i]==this ) break;
  +                     int status=ri[i].contextMap( request );
  +                     if( status!=0 ) return status;
  +                 }
                }
  -
  -             ctx1.init();
  -
  -             // remap the request
  -             request.setAttribute("tomcat.ReloadInterceptor", this);
  -             BaseInterceptor ri[]=
  -                 cm.getContainer().getInterceptors(Container.H_contextMap);
  -             
  -             for( int i=0; i< ri.length; i++ ) {
  -                 if( ri[i]==this ) break;
  -                 int status=ri[i].contextMap( request );
  -                 if( status!=0 ) return status;
  -             }
  -
  +                 
            } else {
                // This is the old ( buggy) behavior
                // ctx.reload() has some fixes - it removes most of the
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to