mcconnell 2003/01/05 17:03:59 Modified: assembly/src/java/org/apache/avalon/assembly/engine EngineClassLoader.java Log: Updates to eliminate dependency on extension directories during bootstrap enabling support for java WebStart. Revision Changes Path 1.18 +83 -5 avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/engine/EngineClassLoader.java Index: EngineClassLoader.java =================================================================== RCS file: /home/cvs/avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/engine/EngineClassLoader.java,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- EngineClassLoader.java 27 Dec 2002 16:18:42 -0000 1.17 +++ EngineClassLoader.java 6 Jan 2003 01:03:59 -0000 1.18 @@ -155,6 +155,11 @@ private URL[] m_urls = new URL[0]; /** + * Unparsed parent URLs + */ + private URL[] m_parsable = new URL[0]; + + /** * The supplied configuration. The configuration may be empty * as defaults are provided for all values. */ @@ -267,25 +272,28 @@ { super( new URL[ 0 ] ); m_graph = new DependencyGraph(); + m_parsable = getParentURLs(); } /** * Creation of a new engine with a parent. */ - public EngineClassLoader( EngineClassLoader parent ) + public EngineClassLoader( ClassLoader parent ) { super( new URL[ 0 ], parent ); - m_graph = new DependencyGraph( parent.getDependencyGraph() ); + m_graph = getDependencyGraph( parent ); + m_parsable = getParentURLs(); } /** * Creation of a new engine with a partner and URL array. */ - public EngineClassLoader( URL[] urls, EngineClassLoader parent ) + public EngineClassLoader( URL[] urls, ClassLoader parent ) { super( new URL[ 0 ], parent ); - m_graph = new DependencyGraph( parent.getDependencyGraph() ); + m_graph = getDependencyGraph( parent ); m_urls = urls; + m_parsable = getParentURLs(); } //======================================================================= @@ -468,6 +476,11 @@ } } + for( int k=0; k<m_parsable.length; k++ ) + { + m_repository.install( m_parsable[k] ); + } + if( m_bootstrap ) { String sep = System.getProperty( "path.separator" ); @@ -1029,6 +1042,71 @@ //============================================================== // utilities //============================================================== + + /** + * If the supplied loader is an engine, then create a depedency graph + * using the parent graph, otherwise return a root graph. + * @param loader the parent classloader + * @return a depedency graph + */ + private DependencyGraph getDependencyGraph( ClassLoader loader ) + { + if( loader instanceof EngineClassLoader ) + { + return new DependencyGraph( ((EngineClassLoader)loader).getDependencyGraph() ); + } + else + { + return new DependencyGraph(); + } + } + + /** + * If the parent classloader is not a engine, then we need to scan the parent classloaders + * jar files for component types. This method recursively steps through the parent heirachy + * looking for jar files and collapses these into URL array that can be scanned by the + * type repository. + * + * @return the URLs to scan for components + */ + private URL[] getParentURLs() + { + if( getParent() instanceof EngineClassLoader ) + { + // nothing to do + return new URL[0]; + } + else + { + List list = new ArrayList(); + getParentURLs( list, getParent() ); + return (URL[]) list.toArray( new URL[0] ); + } + } + + /** + * Check the supplied classloader for jar files that need to be scanned + * and add these to the supplied list. The method recursivly invokes the + * operation on the parent classloader. + * @param list the list to add urls to + * @param loader the classloader to check for URLs + */ + private void getParentURLs( List list, ClassLoader loader ) + { + if( loader instanceof URLClassLoader ) + { + URL[] urls = ((URLClassLoader)loader).getURLs(); + for( int i=0; i<urls.length; i++ ) + { + list.add( urls[i] ); + } + + if( loader.getParent() instanceof URLClassLoader ) + { + getParentURLs( list, loader.getParent() ); + } + } + } private void createRepositoryManager() throws Exception {
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>