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

Reply via email to