costin      01/07/26 21:03:29

  Modified:    src/share/org/apache/tomcat/modules/config
                        TrustedLoader.java
  Log:
  That's the big fix - TrustedLoader didn't worked as expected, due to
  class loader problems in some special cases. Now it does.
  
  The trick is to add the modules before the server goes "stable" (
  CONFIG state means all important modules have been added, and we're
  ready to roll ).
  
  Revision  Changes    Path
  1.2       +105 -22   
jakarta-tomcat/src/share/org/apache/tomcat/modules/config/TrustedLoader.java
  
  Index: TrustedLoader.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/config/TrustedLoader.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- TrustedLoader.java        2001/07/19 05:54:52     1.1
  +++ TrustedLoader.java        2001/07/27 04:03:29     1.2
  @@ -88,12 +88,112 @@
       // -------------------- Properties --------------------
       
       // -------------------- Hooks --------------------
  +    /** Called when the server is configured - all base modules are added,
  +     some contexts are added ( explicitely or by AutoDeploy/AutoAdd ).
  +     No addContext callback has been called.
  +
  +     We assume all modules are loaded from config or AutoDeploy ( so
  +     they are trusted ). We check for trusted contexts, and load
  +     any eventual module.
  +
  +     Note that the loader used to load the module will be different
  +     from the "real" one, used on reloading or init ( XXX all
  +     modules must be prepared to handle reloading !!! )
  +    */
  +    public void engineState( ContextManager cm , int state )
  +     throws TomcatException
  +    {
  +     if( state!=ContextManager.STATE_CONFIG ) return;
  +     Vector modV=new Vector();
  +
  +     Enumeration ctxsE= cm.getContexts();
  +     while( ctxsE.hasMoreElements() ) {
  +         Context context=(Context)ctxsE.nextElement();
  +         if( ! context.isTrusted() ) continue;
  +
  +         File modules=getModuleFile( context );
  +         if( modules==null ) continue;
  +         
  +         /*  We'll create a temporary loader for this context, and use it
  +          *  to create a module. The module will be notified for all
  +          *  contexts that were added so far, as with any normal module.
  +          * 
  +          *  What's special is that at init stage, the module will be
  +          *  removed and loaded again, with the real class loader.
  +          *  Same thing will happen when the application is reloaded.
  +          *
  +          *  BTW, modules are supposed to be reloadable, but there is
  +          *  a lot of work still needed ( mostly in modules, to make them
  +          *  aware )
  +          */
  +         LoaderInterceptor11 loaderHelper=new LoaderInterceptor11();
  +         loaderHelper.setContextManager( cm );
  +         loaderHelper.addContext( cm, context );
  +         loaderHelper.contextInit( context );
  +
  +         modV=new Vector();
  +         loadInterceptors( context, modules, modV );
  +         cm.setNote( "trustedLoader.currentContext", context );
  +         // Now add all modules to cm
  +         for( int i=0; i< modV.size(); i++ ) {
  +             BaseInterceptor bi=(BaseInterceptor)modV.elementAt( i );
  +             cm.addInterceptor( bi );
  +         }   
  +         cm.setNote(  "trustedLoader.currentContext", null );
  +     }
   
  -    public void contextInit(  Context ctx )
  +    }
  +
  +    public void loadInterceptors( Context ctx, File modulesF, Vector modulesV )
        throws TomcatException
       {
  -     if( ! ctx.isTrusted() ) return;
  +     
  +     XmlMapper xh=new XmlMapper();
  +     xh.setClassLoader( ctx.getClassLoader());
  +     xh.setDebug( debug );
  +
  +     // no backward compat rules. The file must be self-contained,
  +     // with <module> definition and the module itself
  +     setTagRules( xh );
  +
  +     // then load the actual config 
  +     ServerXmlReader.loadConfigFile(xh,modulesF,modulesV);
  +
  +    }
   
  +    public static void addTagRule( XmlMapper xh, String tag, String classN ) {
  +     xh.addRule( tag ,
  +                 xh.objectCreate( classN, null ));
  +     xh.addRule( tag ,
  +                 xh.setProperties());
  +     xh.addRule( tag,
  +                 new XmlAction() {
  +                     public void end( SaxContext ctx) throws Exception {
  +                         Vector modules=(Vector)ctx.getRoot();
  +                         Object obj=ctx.currentObject();
  +                         modules.addElement( obj );
  +                     }
  +                 });
  +    }
  +
  +    
  +    public static void setTagRules( XmlMapper xh ) {
  +     xh.addRule( "module",  new XmlAction() {
  +             public void start(SaxContext ctx ) throws Exception {
  +                 Object elem=ctx.currentObject();
  +                 AttributeList attributes = ctx.getCurrentAttributes();
  +                 String name=attributes.getValue("name");
  +                 String classN=attributes.getValue("javaClass");
  +                 if( name==null || classN==null ) return;
  +                 addTagRule( ctx.getMapper(), name, classN );
  +                 if( ctx.getDebug() > 0 ) ctx.log("Adding " + name + " " + classN );
  +             }
  +         });
  +    }
  +
  +    
  +    
  +    private File getModuleFile(Context ctx ) {
        // PathSetter is the first module in the chain, we shuld have
        // a valid path by now 
        String dir=ctx.getAbsolutePath();
  @@ -103,31 +203,14 @@
                               "interceptors.xml" );
        if( modules.exists() ) {
            ctx.log( "Loading modules from webapp " + modules );
  +         return modules;
        } else {
            if( debug > 0 )
                ctx.log( "Can't find " + modules );
  -         return;
  +         return null;
        }
  -
  -     cm.setNote( "trustedLoader.currentContext", ctx );
  -     
  -     XmlMapper xh=new XmlMapper();
  -     xh.setClassLoader( ctx.getClassLoader());
  -     xh.setDebug( debug );
  -
  -     ServerXmlReader.setTagRules( xh );
  -     // first, load <module> definitions
  -     ServerXmlReader.loadConfigFile(xh,modules,cm);
  -     
  -     ServerXmlReader.setPropertiesRules( cm, xh );
  -     ServerXmlReader.addTagRules( cm, xh );
  -     // no backward compat rules. Use Module ( taskdef :-) and the tag
  -
  -     // then load the actual config 
  -     ServerXmlReader.loadConfigFile(xh,modules,cm);
  -
  -     cm.setNote( "trustedLoader.currentContext", null );
       }
  +    
   
   }
   
  
  
  

Reply via email to