mcconnell    2003/02/27 15:08:57

  Modified:    assembly/src/java/org/apache/avalon/assembly/engine
                        EngineClassLoader.java
  Log:
  Improving the assesment of jar files relative to the supplied URL approach 
(jar: or file:).
  
  Revision  Changes    Path
  1.37      +130 -27   
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.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- EngineClassLoader.java    23 Feb 2003 14:08:43 -0000      1.36
  +++ EngineClassLoader.java    27 Feb 2003 23:08:57 -0000      1.37
  @@ -208,6 +208,11 @@
       */
       private File m_home;
   
  +   /**
  +    * The system root directory.
  +    */
  +    private File m_root;
  +
       /**
        * Description of the extension directories.
        */
  @@ -343,11 +348,17 @@
   
           if( context.hasEntry( "urn:assembly:engine.extensions" ) )
           {
  +            String scope = "home";
               m_descriptor = (LibraryDescriptor)context.get( 
"urn:assembly:engine.extensions" );
  -        }
  -        else
  -        {
  -            m_descriptor = new LibraryDescriptor();
  +            if( m_descriptor.isSystem() )
  +            {
  +                scope = "system";
  +            }
  +            final String message = 
  +              "registering " + scope + " extension descriptor (" 
  +              + m_descriptor.getIncludeDescriptors().length 
  +              + ")";
  +            getLogger().debug( message );
           }
   
           if( context.hasEntry( "urn:assembly:engine.classpath" ) )
  @@ -368,6 +379,11 @@
               m_home = new File( System.getProperty( "user.dir" ) );
           }
   
  +        if( context.hasEntry( "urn:assembly:system" ) )
  +        {
  +            m_root = (File)context.get( "urn:assembly:system" );
  +        }
  +
           if( context.hasEntry( "urn:assembly:engine.bootstrap" ) )
           {
               m_bootstrap = "true".equals( context.get( 
"urn:assembly:engine.bootstrap" ) );
  @@ -444,28 +460,58 @@
           //
   
           ArrayList list = new ArrayList();
  -        File anchor = new File( m_home, m_descriptor.getBaseDirectory() 
).getCanonicalFile();
  -        IncludeDescriptor[] includes = m_descriptor.getIncludeDescriptors();
  -        for( int j = 0; j < includes.length; j++ )
  +        File anchor = null;
  +
  +        if( m_descriptor != null )
           {
  -            File include = new File( anchor, includes[ j ].getFile() 
).getCanonicalFile();
  -            if( include.isDirectory() )
  +            if( m_descriptor.isSystem() )
               {
  -                list.add( include );
  -                getLogger().debug( REZ.getString( "kernel.extension", 
include ) );
  +                if( m_root != null )
  +                {
  +                    anchor = new File( m_root, 
m_descriptor.getBaseDirectory() ).getCanonicalFile();
  +                }
  +                else
  +                {
  +                    final String warning =
  +                      "Cannot process system extension descriptor in " 
  +                      + this + " due to undeclared system path.";
  +                    getLogger().warn( warning );
  +                }
               }
               else
               {
  -                final String error = REZ.getString( "error.include", include 
);
  -                throw new IllegalArgumentException( error );
  +                if( m_home != null )
  +                {
  +                    anchor = new File( m_home, 
m_descriptor.getBaseDirectory() ).getCanonicalFile();
  +                }
  +                else
  +                {
  +                    final String warning =
  +                      "Cannot process home extension descriptor in " 
  +                      + this + " due to undeclared home path.";
  +                    getLogger().warn( warning );
  +                }
  +            }
  +            if( anchor != null )
  +            {
  +                IncludeDescriptor[] includes = 
m_descriptor.getIncludeDescriptors();
  +                for( int j = 0; j < includes.length; j++ )
  +                {
  +                    File include = new File( anchor, includes[ j ].getFile() 
).getCanonicalFile();
  +                    if( include.isDirectory() )
  +                    {
  +                        list.add( include );
  +                        getLogger().debug( REZ.getString( 
"kernel.extension", include ) );
  +                    }
  +                    else
  +                    {
  +                        final String error = REZ.getString( "error.include", 
include );
  +                        throw new IllegalArgumentException( error );
  +                    }
  +                }
               }
           }
   
  -        for( int k=0; k<m_parsable.length; k++ )
  -        {
  -            m_repository.install( m_parsable[k] );
  -        }
  -
           if( m_bootstrap )
           {
               String sep = System.getProperty( "path.separator" );
  @@ -535,7 +581,7 @@
               }
   
               //
  -            // handle the classpath
  +            // handle the jre classpath
               //
   
               String sep = System.getProperty( "path.separator" );
  @@ -554,7 +600,16 @@
           }
   
           //
  -        // load the classpath
  +        // auto scan jars from parent classloaders 
  +        //
  +
  +        for( int k=0; k<m_parsable.length; k++ )
  +        {
  +            m_repository.install( m_parsable[k] );
  +        }
  +
  +        //
  +        // load the classpath descriptor
           //
   
           try
  @@ -567,6 +622,7 @@
               throw new EngineException( error, e );
           }
   
  +
           //
           // load the explicit URLs
           //
  @@ -691,9 +747,13 @@
               engine.enableLogging( getLogger() );
               DefaultLocator context = new DefaultLocator();
               context.put( "urn:assembly:home", m_home );
  +            context.put( "urn:assembly:system", m_root );
               context.put( "urn:assembly:engine.base", base );
               context.put( "urn:assembly:engine.bootstrap", "false" );
  -            context.put( "urn:assembly:engine.extensions", extensions );
  +            if( extensions != null )
  +            {
  +                context.put( "urn:assembly:engine.extensions", extensions );
  +            }
               context.put( "urn:assembly:engine.classpath", classpath );
               context.put( "urn:assembly:logging.manager", m_logging );
               context.put( "urn:assembly:threads.manager", m_pool );
  @@ -751,6 +811,36 @@
              getLogger().debug( REZ.getString( "add.classpath" ) );
           }
   
  +        //
  +        // expand the classpath relative to the home directory
  +        //
  +
  +        try
  +        {
  +            URL[] urls = ClasspathDescriptor.expand( m_home, classpath );
  +            for( int j = 0; j < urls.length; j++ )
  +            {
  +                URL inc = urls[ j ];
  +                try
  +                {
  +                    addURL( inc );
  +                }
  +                catch( Throwable e )
  +                {
  +                    throw new EngineRuntimeException( 
  +                      REZ.getString( "classpath.include.error", inc ) , e );
  +                }
  +            }
  +            return;
  +        }
  +        catch( Throwable e )
  +        {
  +            final String error = 
  +              "Unexpected exception while attampting to expand the supplied 
classpath.";
  +            throw new EngineRuntimeException( error, e );
  +        }
  +
  +        /*
           if( m_base != null )
           {
               URL[] urls = ClasspathDescriptor.expand( m_base, classpath );
  @@ -773,6 +863,7 @@
           {
              getLogger().debug( "expanding a classpath without a base" );
           }
  +        */
   
           //
           // #########################################################
  @@ -780,6 +871,7 @@
           // context value - or we construct a rationale default
           // ##########################################################
   
  +        /*
           List list = new ArrayList();
           FilesetDescriptor[] dirs = classpath.getFilesetDescriptors();
           if( getLogger().isDebugEnabled() )
  @@ -829,6 +921,7 @@
           {
              getLogger().debug( REZ.getString( "classpath.ok" ) );
           }
  +        */
       }
   
      /**
  @@ -904,7 +997,9 @@
           }
           catch( Throwable e )
           {
  -            // type already registered
  +            final String error = 
  +              "Unexpected error during type registration.";
  +            throw new EngineRuntimeException( error, e );
           }
       }
   
  @@ -1160,11 +1255,11 @@
           if(( parent != null ) && ( parent instanceof EngineClassLoader ))
           {
                manager = new DefaultRepositoryManager( 
  -               this, ((EngineClassLoader)parent).getRepository() );
  +               this, ((EngineClassLoader)parent).getRepository(), m_home );
           }
           else
           {
  -            manager = new DefaultRepositoryManager( this );
  +            manager = new DefaultRepositoryManager( this, m_home );
           }
           manager.enableLogging( getLogger() );
           manager.initialize();
  @@ -1297,11 +1392,19 @@
           {
               final String element = classPath[ i ];
   
  -            if( element.endsWith( ".jar" ) )
  +            if( element.endsWith( ".jar" ) || element.startsWith( "jar:" ) )
               {
                   try
                   {
  -                    final URL url = new URL( "jar:" + element + "!/" );
  +                    URL url = null;
  +                    if( element.startsWith("jar:") )
  +                    {
  +                        url = new URL( element );
  +                    }
  +                    else
  +                    {
  +                        url = new URL( "jar:" + element + "!/" );
  +                    }
                       final JarURLConnection connection =
                           (JarURLConnection)url.openConnection();
                       final Manifest manifest = connection.getManifest();
  
  
  

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

Reply via email to