tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From cos...@apache.org
Subject cvs commit: jakarta-tomcat/src/share/org/apache/tomcat/modules/config ProfileLoader.java
Date Thu, 08 Mar 2001 00:59:43 GMT
costin      01/03/07 16:59:42

  Modified:    src/share/org/apache/tomcat/modules/config
                        ProfileLoader.java
  Log:
  Another step in ProfileLoader implementation. Now it has support
  for separate class loaders for each profile, allowing groups
  of application that share a certain set of common jars without
  affecting the rest ( i.e. in configs with many applications, you
  can partition both the config and the shared classes )
  
  The code is not very clean ( a lot of cut&paste), but this is not used
  by default.
  
  I'll propose moving this to the "outside-of-stable-release" area, so
  that (likely) changes in ProfileLoader will not delay or affect the release
  quality.
  
  Revision  Changes    Path
  1.2       +194 -39   jakarta-tomcat/src/share/org/apache/tomcat/modules/config/ProfileLoader.java
  
  Index: ProfileLoader.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/modules/config/ProfileLoader.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ProfileLoader.java	2001/02/27 17:16:50	1.1
  +++ ProfileLoader.java	2001/03/08 00:59:41	1.2
  @@ -67,6 +67,8 @@
   import org.apache.tomcat.util.res.StringManager;
   import org.apache.tomcat.util.io.FileUtil;
   import org.apache.tomcat.util.xml.*;
  +import org.apache.tomcat.util.compat.*;
  +import org.apache.tomcat.util.IntrospectionUtils;
   import org.apache.tomcat.core.*;
   import org.apache.tomcat.modules.server.*;
   import org.apache.tomcat.util.log.*;
  @@ -85,6 +87,8 @@
    */
   public class ProfileLoader extends BaseInterceptor {
       Hashtable profiles=new Hashtable();
  +    ClassLoader parentLoader;
  +    static final Jdk11Compat jdk11Compat=Jdk11Compat.getJdkCompat();
       
       public ProfileLoader() {
       }
  @@ -99,7 +103,7 @@
   
       public void addProfile( Profile p ) {
   	String name=p.getName();
  -	if( debug > -1 ) log ( "Adding " + name );
  +	if( debug > 0 ) log ( "Adding " + name );
   	if( name==null ) return;
   	profiles.put( name, p );
       }
  @@ -113,18 +117,29 @@
       {
   	String ctxProfile=ctx.getProperty("profile");
   	if( ctxProfile==null ) ctxProfile="default";
  -
   	Profile p=(Profile)profiles.get( ctxProfile );
   	if( p==null ) {
   	    log( "Can't find profile " + ctxProfile );
   	    p=(Profile)profiles.get("default");
   	}
   
  +	
   	if( p==null ) throw new TomcatException( "Can't load profile");
  +
  +	URL[] cp=p.commonClassPath;
  +	for (int i=0; i<cp.length; i++ ) {
  +	    ctx.addClassPath( cp[i]);
  +	}
  +	cp=p.sharedClassPath;
  +	for (int i=0; i<cp.length; i++ ) {
  +	    ctx.addClassPath( cp[i]);
  +	}
  +
  +	
   	Enumeration en=p.getModules();
   	while( en.hasMoreElements()) {
   	    BaseInterceptor bi=(BaseInterceptor)en.nextElement();
  -	    log( ctx + " " + bi );
  +	    if( debug > 0 ) log( ctx + " " + bi );
   	    ctx.addInterceptor( bi );
   	}
       }
  @@ -140,11 +155,13 @@
       {
   	if( this != module ) return;
   
  +	parentLoader=cm.getParentLoader();
  +
   	XmlMapper xh=new XmlMapper();
   	xh.setDebug( debug );
   
   	addProfileRules( xh );
  -	addTagRules( cm, xh );
  +	addTagRules( cm, ctx, xh );
   	
   	if (configFile == null)
   	    configFile=DEFAULT_CONFIG;
  @@ -165,60 +182,194 @@
   
       // -------------------- Xml reading details --------------------
   
  -    public void addTagRules( ContextManager cm, XmlMapper xh )
  +    public void addTagRules( ContextManager cm, Context ctx, XmlMapper xh )
   	throws TomcatException
       {
   	Hashtable modules=(Hashtable)cm.getNote("modules");
   	if( modules==null) return;
   	Enumeration keys=modules.keys();
  +
   	while( keys.hasMoreElements() ) {
   	    String name=(String)keys.nextElement();
   	    String classN=(String)modules.get( name );
   
   	    String tag="Profile" + "/" + name;
  -	    xh.addRule(  tag ,
  -			 xh.objectCreate( classN, null ));
  -	    xh.addRule( tag ,
  -			xh.setProperties());
  -	    xh.addRule( tag, new XmlAction() {
  -		    public void end(SaxContext ctx ) throws Exception {
  -			BaseInterceptor obj=(BaseInterceptor)
  -			    ctx.currentObject();
  -			Profile parent=(Profile)
  -			    ctx.previousObject();
  -
  -			parent.addModule( obj );
  -		    }
  -		});
  +	    xh.addRule( tag, new TagAction(classN));
   	}
       }
   
       public  void addProfileRules( XmlMapper xh ) {
  -	xh.addRule( "Profile", new XmlAction() {
  -		public void start(SaxContext ctx ) throws Exception {
  -		    Profile p=new Profile();
  -		    AttributeList attributes = ctx.getCurrentAttributes();
  -		    p.setName( attributes.getValue("name"));
  -		    ctx.pushObject( p );
  -		}
  -		public void end(SaxContext ctx ) {
  -		    ProfileLoader parent=(ProfileLoader)
  -			ctx.previousObject();
  -		    Profile obj=(Profile)
  -			ctx.currentObject();
  -		    System.out.println("XXX " + obj.getName());
  -		    parent.addProfile( obj );
  -
  -		}
  -		public void cleanup( SaxContext ctx ) {
  -		    ctx.popObject();
  -		}
  -	    });
  +	xh.addRule( "Profile", new ProfileAction(this));
  +    }
  +
  +    // -------------------- Utils --------------------
  +
  +    static class ProfileAction extends XmlAction {
  +	ProfileLoader ploader;
  +	
  +	ProfileAction( ProfileLoader ploader ) {
  +	    this.ploader=ploader;
  +	}
  +	
  +	public void start(SaxContext ctx ) throws Exception {
  +	    Profile p=new Profile();
  +	    AttributeList attributes = ctx.getCurrentAttributes();
  +	    p.setName( attributes.getValue("name"));
  +	    ploader.setLoaders(p);
  +	    ctx.pushObject( p );
  +	}
  +	public void end(SaxContext ctx ) {
  +	    Profile obj=(Profile)ctx.currentObject();
  +	    ploader.addProfile( obj );
  +
  +	}
  +	public void cleanup( SaxContext ctx ) {
  +	    ctx.popObject();
  +	}
  +    }
  +
  +
  +    static class TagAction extends XmlAction {
  +	String className;
  +	
  +	TagAction( String classN ) {
  +	    this.className=classN;
  +	}
  +
  +	public void start( SaxContext ctx) throws Exception {	
  +	    String tag=ctx.getCurrentElement();
  +	    Profile profile=(Profile)ctx.currentObject();
  +	    Class c=null;
  +	    ClassLoader cl=profile.containerLoader;	
  +	    System.out.println( "CCL1 " + cl );    
  +// 	    try {
  +// 		c=Class.forName( className );
  +// 	    } catch( ClassNotFoundException ex ) {
  +// 		if( cl!=null )
  +	    try {
  +			c=cl.loadClass( className );
  +	    } catch( ClassNotFoundException ex2 ) {
  +		System.out.println( "CCL2 " + profile.commonLoader );
  +		System.out.println(((java.net.URLClassLoader)cl).getParent());
  +		c=profile.commonLoader.loadClass(className);
  +	    }
  +// 		else throw ex;
  +// 	    }
  +
  +	    Object o=c.newInstance();
  +
  +	    AttributeList attributes = ctx.getCurrentAttributes();
  +
  +	    for (int i = 0; i < attributes.getLength (); i++) {
  +		String type = attributes.getType (i);
  +		String name=attributes.getName(i);
  +		String value=attributes.getValue(i);
  +		
  +		IntrospectionUtils.setProperty( o, name, value );
  +	    }
  +
  +	    profile.addModule( (BaseInterceptor)o );
  +	}
       }
  +
  +    void setLoaders( Profile p ) {
  +	String name=p.getName();
  +	String home=cm.getHome();
  +
  +	System.out.println("XXXXX " + parentLoader );
  +	p.commonClassPath=getClassPath(home + "/lib/common/" + name, false);
  +	p.commonLoader=
  +	    jdk11Compat.newClassLoaderInstance(p.commonClassPath ,
  +					       parentLoader);
  +	for( int i=0; i< p.commonClassPath.length; i++ ) {
  +	    log( "Common " + name + " " + p.commonClassPath[i]);
  +	}
  +	
  +	p.sharedClassPath=getClassPath(home + "/lib/apps/" + name, false);
  +	p.appLoader=jdk11Compat.newClassLoaderInstance(p.sharedClassPath ,
  +						       p.commonLoader);
  +
  +	URL[] serverClassPath=getClassPath(home + "/lib/container/" + name,
  +					   true);
  +	p.containerLoader=jdk11Compat.newClassLoaderInstance(serverClassPath ,
  +							     p.commonLoader);
  +	log( "CCL " + p.containerLoader + " " + p.commonLoader);
  +	for( int i=0; i< serverClassPath.length; i++ ) {
  +	    log( "Container " + name + " " + serverClassPath[i]);
  +	}
  +    }
  +
  +    private URL[] getClassPath(String p0, boolean javacInc)
  +    {
  +        Vector urlV=new Vector();
  +        try{
  +            String cpComp[]=getJarFiles(p0);
  +            if (cpComp != null){
  +                int jarCount=cpComp.length;
  +                for( int i=0; i< jarCount ; i++ ) {
  +                    urlV.addElement( getURL(  p0 , cpComp[i] ));
  +                }
  +            }
  +	    if( javacInc ) {
  +		urlV.addElement( new URL( "file", null ,
  +					  System.getProperty( "java.home" ) +
  +					  "/../lib/tools.jar"));
  +	    }
  +        }catch(Exception ex){
  +            ex.printStackTrace();
  +        }
  +        return getURLs(urlV);
  +    }
  +
  +    public static URL getURL( String base, String file ) {
  +        try {
  +            File baseF = new File(base);
  +            File f = new File(baseF,file);
  +            String path = f.getCanonicalPath();
  +            if( f.isDirectory() ){
  +                    path +="/";
  +            }
  +            return new URL( "file", null, path );
  +        } catch (Exception ex) {
  +            ex.printStackTrace();
  +            return null;
  +        }
  +    }
  +
  +    public String[] getJarFiles(String ld) {
  +	File dir = new File(ld);
  +        String[] names=null;
  +        if (dir.isDirectory()){
  +            names = dir.list( new FilenameFilter(){
  +            public boolean accept(File d, String name) {
  +                if (name.endsWith(".jar")){
  +                    return true;
  +                }
  +                return false;
  +            }
  +            });
  +        }
  +
  +	return names;
  +    }
  +    
  +    private URL[] getURLs(Vector v){
  +        URL[] urls=new URL[ v.size() ];
  +        for( int i=0; i<v.size(); i++ ) {
  +            urls[i]=(URL)v.elementAt( i );
  +        }
  +        return urls;
  +    }
  +
   }
   
   class Profile {
       String name;
  +    URL[] sharedClassPath;
  +    URL[] commonClassPath;
  +    ClassLoader commonLoader;
  +    ClassLoader containerLoader;
  +    ClassLoader appLoader;
       Vector modules=new Vector();
       
       public Profile() {};
  @@ -239,4 +390,8 @@
   	modules.addElement( bi );
       }
   
  +    ClassLoader getContainerLoader() {
  +	return containerLoader;
  +    }
  +    
   }
  
  
  

Mime
View raw message