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