mcconnell    2002/12/11 00:11:04

  Modified:    assembly/src/java/org/apache/avalon/assembly/engine
                        EngineClassLoader.java
               assembly/src/java/org/apache/avalon/assembly/engine/model
                        EngineConfigurationHelper.java
  Log:
  Updates to the classloader to support cascading extension management.
  
  Revision  Changes    Path
  1.5       +72 -24    
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.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- EngineClassLoader.java    9 Dec 2002 12:10:42 -0000       1.4
  +++ EngineClassLoader.java    11 Dec 2002 08:11:04 -0000      1.5
  @@ -68,7 +68,9 @@
   import org.apache.avalon.excalibur.i18n.Resources;
   import org.apache.avalon.excalibur.packagemanager.OptionalPackage;
   import org.apache.avalon.excalibur.packagemanager.PackageManager;
  +import org.apache.avalon.excalibur.packagemanager.ExtensionManager;
   import 
org.apache.avalon.excalibur.packagemanager.impl.DefaultExtensionManager;
  +import 
org.apache.avalon.excalibur.packagemanager.impl.DelegatingExtensionManager;
   import org.apache.avalon.framework.Version;
   import org.apache.avalon.framework.activity.Initializable;
   import org.apache.avalon.framework.logger.Logger;
  @@ -232,7 +234,7 @@
       /**
        * Utility class to manage extension paths.
        */
  -    private DefaultExtensionManager m_extensions;
  +    private ExtensionManager m_extensions;
   
       /**
        * Flag indicating if system classpath based bootstrapping should take 
place.
  @@ -261,11 +263,6 @@
           m_graph = new DependencyGraph( parent.getDependencyGraph() );
       }
   
  -    protected DependencyGraph getDependencyGraph()
  -    {
  -        return m_graph;
  -    }
  -
       //=======================================================================
       // LogEnabled
       //=======================================================================
  @@ -410,7 +407,7 @@
   
           if( m_logging == null )
           {
  -            throw new IllegalStateException("service");
  +            getLoggingManager();
           }
   
           if( getLogger().isDebugEnabled() )
  @@ -489,7 +486,18 @@
           }
   
           File[] files = (File[])list.toArray( new File[ 0 ] );
  -        m_extensions = new DefaultExtensionManager( files );
  +        if( getParent() instanceof EngineClassLoader )
  +        {
  +            EngineClassLoader parent = (EngineClassLoader) getParent();
  +            ExtensionManager local = new DefaultExtensionManager( files );
  +            ExtensionManager root = parent.getExtensionManager(); 
  +            m_extensions = new DelegatingExtensionManager( 
  +              new ExtensionManager[]{ local, root } );
  +        }
  +        else
  +        {
  +            m_extensions = new DefaultExtensionManager( files );
  +        }
           m_packages = new PackageManager( m_extensions );
   
           //
  @@ -544,6 +552,60 @@
           }
       }
   
  +    protected LoggingManager getLoggingManager()
  +    {
  +        if( m_logging == null )
  +        { 
  +            if( getParent() instanceof EngineClassLoader )
  +            {
  +                m_logging = (( EngineClassLoader )getParent() 
).getLoggingManager();
  +            }
  +            else
  +            {
  +                throw new IllegalStateException("logging");
  +            }
  +        }
  +        return m_logging;
  +    }
  +
  +    protected DependencyGraph getDependencyGraph()
  +    {
  +        return m_graph;
  +    }
  +
  +    protected ExtensionManager getExtensionManager()
  +    {
  +        return m_extensions;
  +    }
  +
  +    /**
  +     * Build a list of dependencies based on specified [EMAIL PROTECTED] 
Extension}.
  +     * The specified [EMAIL PROTECTED] Extension} is expected to be a 
required extension
  +     * of another "Optional Package".  If the extension cannot be reolved 
relative
  +     * to packages declared locally, the request will be forwarded to the 
parent
  +     * classloader.
  +     *
  +     * @param required the required Extension.
  +     * @param available the array of Extensions already available to caller.
  +     * @param dependencies the list of OptionalPackages required to satisfy 
extension.
  +     * @param unsatisfied the list of unsatisfied dependencies.
  +     * @see #scanDependencies
  +     */
  +    protected void scanDependencies( final Extension[] required,
  +                                  final Extension[] available,
  +                                  final List dependencies,
  +                                  final List unsatisfied )
  +    {
  +        final ArrayList localunsatisfied = new ArrayList();
  +        m_packages.scanDependencies( required, available, dependencies, 
localunsatisfied );
  +        if(( 0 != localunsatisfied.size() ) && ( getParent() instanceof 
EngineClassLoader ))
  +        {
  +            final ArrayList superunsatisfied = new ArrayList();
  +            EngineClassLoader parent = (EngineClassLoader)getParent();
  +            parent.scanDependencies( required, available, dependencies, 
unsatisfied );
  +        }
  +    }
  +
       //==============================================================
       // URLClassLoader
       //==============================================================
  @@ -1083,19 +1145,6 @@
       protected File[] getOptionalPackagesFor( final String[] classPath )
           throws Exception
       {
  -        if( m_packages == null )
  -        {
  -            ClassLoader parent = getParent();
  -            if( parent != null )
  -            {
  -                if( parent instanceof EngineClassLoader )
  -                {
  -                    return 
((EngineClassLoader)parent).getOptionalPackagesFor( classPath );
  -                }
  -            }
  -            return new File[ 0 ];
  -        }
  -
           final Manifest[] manifests = getManifests( classPath );
           final Extension[] available = Extension.getAvailable( manifests );
           final Extension[] required = Extension.getRequired( manifests );
  @@ -1103,8 +1152,7 @@
           final ArrayList dependencies = new ArrayList();
           final ArrayList unsatisfied = new ArrayList();
   
  -        m_packages.scanDependencies( required, available, dependencies, 
unsatisfied );
  -
  +        scanDependencies( required, available, dependencies, unsatisfied );
           if(( 0 != unsatisfied.size() ) && ( getLogger().isWarnEnabled() ))
           {
               final int size = unsatisfied.size();
  
  
  
  1.2       +3 -3      
avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/engine/model/EngineConfigurationHelper.java
  
  Index: EngineConfigurationHelper.java
  ===================================================================
  RCS file: 
/home/cvs/avalon-sandbox/assembly/src/java/org/apache/avalon/assembly/engine/model/EngineConfigurationHelper.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- EngineConfigurationHelper.java    7 Dec 2002 09:34:28 -0000       1.1
  +++ EngineConfigurationHelper.java    11 Dec 2002 08:11:04 -0000      1.2
  @@ -122,7 +122,7 @@
       public static FilesetDescriptor createFilesetDescriptor( Configuration 
config )
           throws ConfigurationException
       {
  -        String base = config.getAttribute( "dir" );
  +        String base = config.getAttribute( "dir", "." );
           ArrayList list = new ArrayList();
           Configuration[] includeConfigs = config.getChildren( "include" );
           for( int i = 0; i < includeConfigs.length; i++ )
  @@ -167,7 +167,7 @@
               return new LibraryDescriptor();
           }
   
  -        String base = config.getAttribute( "dir" );
  +        String base = config.getAttribute( "dir", "." );
   
           ArrayList list = new ArrayList();
           Configuration[] configs = config.getChildren( "include" );
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to