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]>