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 {@link Extension}.
+ * The specified {@link 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]>