You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by og...@apache.org on 2009/01/08 03:31:13 UTC

svn commit: r732592 [2/2] - in /maven/mercury/trunk: mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/ mercury-plexus/src/main/java/org/apache/maven/mercury/plexus/ mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/re...

Modified: maven/mercury/trunk/mercury-repo/mercury-repo-virtual/src/main/java/org/apache/maven/mercury/repository/virtual/VirtualRepositoryReader.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-virtual/src/main/java/org/apache/maven/mercury/repository/virtual/VirtualRepositoryReader.java?rev=732592&r1=732591&r2=732592&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-virtual/src/main/java/org/apache/maven/mercury/repository/virtual/VirtualRepositoryReader.java (original)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-virtual/src/main/java/org/apache/maven/mercury/repository/virtual/VirtualRepositoryReader.java Wed Jan  7 18:31:13 2009
@@ -61,721 +61,761 @@
 import org.codehaus.plexus.lang.Language;
 
 /**
- * this helper class hides the necessity to talk to localRepo and a bunch of remoteRepos.
- * It also adds discrete convenience methods, hiding batch nature of RepositoryReader
+ * this helper class hides the necessity to talk to localRepo and a bunch of remoteRepos. It also adds discrete
+ * convenience methods, hiding batch nature of RepositoryReader
  * 
  * @author Oleg Gusakov
  * @version $Id$
- *
  */
 public class VirtualRepositoryReader
-implements MetadataReader, EventGenerator
+    implements MetadataReader, EventGenerator
 {
-  public static final String EVENT_READ_ARTIFACTS = "read.artifacts";
-  public static final String EVENT_READ_ARTIFACTS_FROM_REPO = "read.artifacts.from.repo";
-  public static final String EVENT_READ_ARTIFACTS_FROM_REPO_QUALIFIED = "read.artifacts.from.repo.qualified";
-  public static final String EVENT_READ_ARTIFACTS_FROM_REPO_UNQUALIFIED = "read.artifacts.from.repo.unqualified";
-  
-  public static final String EVENT_READ_VERSIONS = "read.versions";
-  public static final String EVENT_READ_VERSIONS_FROM_REPO = "read.versions.from.repo";
-  
-  public static final String EVENT_READ_DEPENDENCIES = "read.dependencies";
-  public static final String EVENT_READ_DEPENDENCIES_FROM_REPO = "read.dependencies.from.repo";
-  
-  public static final String EVENT_READ_RAW = "vr.read.raw";
-  public static final String EVENT_READ_RAW_FROM_REPO = "read.raw.from.repo";
-  
-  /** file system cache subfolder */
-  public static final String METADATA_CACHE_DIR = ".cache";
-  
-  /** minimum # of queue elements to consider parallelization */
-  private static int MIN_PARALLEL = 5;
-  
-  private static final Language _lang = new DefaultLanguage( VirtualRepositoryReader.class );
-  private static final IMercuryLogger _log = MercuryLoggerManager.getLogger( VirtualRepositoryReader.class ); 
-
-  //----------------------------------------------------------------------------------------------------------------------------
-  private List<Repository>       _repositories = new ArrayList<Repository>(8);
-
-  private RepositoryReader[]     _repositoryReaders;
-
-  private LocalRepository       _localRepository;
-  
-  private RepositoryWriter      _localRepositoryWriter;
-  
-  RepositoryMetadataCache         _mdCache;
-
-  private Map<String,ArtifactListProcessor>   _processors;
-  
-  private boolean _initialized = false;
-  
-  private EventManager _eventManager;
-  //----------------------------------------------------------------------------------------------------------------------------
-  public VirtualRepositoryReader( Collection<Repository> repositories )
-  throws RepositoryException
-  {
-    if( ! Util.isEmpty( repositories ) )
-      this._repositories.addAll( repositories );
-  }
-  //----------------------------------------------------------------------------------------------------------------------------
-  private VirtualRepositoryReader(
-                  LocalRepository        localRepository
-                , Collection<RemoteRepository> remoteRepositories
-                          )
-  throws RepositoryException
-  {
-    if( _localRepository == null )
-      throw new RepositoryException( "null local repo" );
-    
-    this._localRepository = localRepository;
-
-    this._repositories.add( localRepository );
-    
-    if( remoteRepositories != null && remoteRepositories.size() > 0 )
-      this._repositories.addAll( remoteRepositories );
-  }
-  //----------------------------------------------------------------------------------------------------------------------------
-  private VirtualRepositoryReader( Repository... repositories )
-  throws RepositoryException
-  {
-    if( repositories != null && repositories.length > 0 )
-      for( Repository r : repositories )
-        this._repositories.add( r );
-  }
-  //----------------------------------------------------------------------------------------------------------------------------
-  public static final RepositoryMetadataCache getCache( File localRepositoryRoot )
-  throws IOException
-  {
-    // TODO: 2008-10-13 og: man - I miss plexus! Badly want an IOC container. This 
-    // should be configured, not hardcoded
-    return MetadataCacheFs.getCache( new File(localRepositoryRoot, METADATA_CACHE_DIR) );
-  }
-  //----------------------------------------------------------------------------------------------------------------------------
-  public void addRepository( Repository repo )
-  throws RepositoryException
-  {
-    if( _initialized )
-      throw new RepositoryException("cannot add repositories after VirtualReader has been initialized");
-    
-    _repositories.add( repo );
-  }
-  //----------------------------------------------------------------------------------------------------------------------------
-  public void setProcessors( Map<String, ArtifactListProcessor> processors )
-  {
-    _processors = processors; 
-  }
-  //----------------------------------------------------------------------------------------------------------------------------
-  /**
-   * very important call - makes VRR sort out all the information it collected so far 
-   */
-  public void init()
-  throws RepositoryException
-  {
-    if( _initialized )
-      return;
-    
-    _repositoryReaders = new RepositoryReader[ _repositories.size() ];
-    
-    // move local repo's upfront - they are faster!
-    int i = 0;
-    for( Repository r : _repositories )
-    {
-      if( ! r.isLocal() || ! r.isReadable() )
-        continue;
-      
-      RepositoryReader rr = r.getReader();
-      
-      rr.setMetadataReader( this );
-      
-      _repositoryReaders[ i++ ] = rr;
-      
-      if( r.isWriteable() )
-      {
-        // we select the first writable repo in the list
-        if( _localRepository != null )
-          continue;
-        
-        _localRepository = (LocalRepository)r.getReader().getRepository();
-        _localRepositoryWriter = _localRepository.getWriter();
-        
-        if( _mdCache == null )
-        {
-          try
-          {
-            _mdCache = getCache( _localRepository.getDirectory() );
-            
-            if( _eventManager != null )
-              _mdCache.setEventManager( _eventManager );
-          }
-          catch( IOException e )
-          {
-            throw new RepositoryException( e.getMessage() );
-          }
-        }
-      }
-    }
-    
-    // remote ones
-    for( Repository r : _repositories )
-    {
-      if( r.isLocal() || ! r.isReadable() )
-        continue;
-      
-      RepositoryReader rr = r.getReader();
-      
-      if( _mdCache != null )
-        rr.setMetadataCache( _mdCache );
-      
-      rr.setMetadataReader( this );
-
-      _repositoryReaders[ i++ ] = rr;
-    }
-    _initialized = true;
-  }
-  //----------------------------------------------------------------------------------------------------------------------------
-  public ArtifactBasicResults readVersions( Collection<ArtifactBasicMetadata> query )
-  throws IllegalArgumentException, RepositoryException
-  {
-    if( query == null )
-      throw new IllegalArgumentException("null bmd supplied");
-    
-    init();
-    
-    GenericEvent event = null;
-    
-    try
-    {
-      
-      if( _eventManager != null )
-        event = new GenericEvent( EventTypeEnum.virtualRepositoryReader, EVENT_READ_VERSIONS );
-      
-      ArtifactBasicResults res = null;
-      ArtifactListProcessor tp = _processors == null ? null : _processors.get( ArtifactListProcessor.FUNCTION_TP );
-      
-      GenericEvent eventRead = null;
-      
-      List<ArtifactBasicMetadata> qList = new ArrayList<ArtifactBasicMetadata>( query.size() );
-      qList.addAll( query );
-  
-      for( RepositoryReader rr : _repositoryReaders )
-      try 
-      {
-        // all found
-        if( qList.isEmpty() )
-          break;
-
-        if( _eventManager!= null )
-          eventRead = new GenericEvent( EventTypeEnum.virtualRepositoryReader, EVENT_READ_VERSIONS_FROM_REPO, rr.getRepository().getId() );
-          
-        ArtifactBasicResults repoRes = rr.readVersions( qList );
-        
-        if( repoRes != null && repoRes.hasResults() )
-        {
-          for( ArtifactBasicMetadata key : repoRes.getResults().keySet() )
-          {
-            List<ArtifactBasicMetadata> rorRes = repoRes.getResult(key);
-            
-            if( tp != null )
-            {
-              try
-              {
-                tp.configure( key );
-                rorRes = tp.process( rorRes );
-              }
-              catch( ArtifactListProcessorException e )
-              {
-                throw new RepositoryException(e);
-              }
-            }
-            
-            if( Util.isEmpty( rorRes ) )
-            {
-              eventRead.setResult( "none found" );
-              continue;
-            }
-            
-            for( ArtifactBasicMetadata bmd : rorRes )
-              bmd.setTracker(  rr );
-            
-            if( res == null )
-              res = new ArtifactBasicResults( key, rorRes );
-            else
-              res.add( key, rorRes );
-            
-            String keyVersion = key.getVersion();
-            VersionRange keyVersionRange = null;
-            try
+    public static final String EVENT_READ_ARTIFACTS = "read.artifacts";
+
+    public static final String EVENT_READ_ARTIFACTS_FROM_REPO = "read.artifacts.from.repo";
+
+    public static final String EVENT_READ_ARTIFACTS_FROM_REPO_QUALIFIED = "read.artifacts.from.repo.qualified";
+
+    public static final String EVENT_READ_ARTIFACTS_FROM_REPO_UNQUALIFIED = "read.artifacts.from.repo.unqualified";
+
+    public static final String EVENT_READ_VERSIONS = "read.versions";
+
+    public static final String EVENT_READ_VERSIONS_FROM_REPO = "read.versions.from.repo";
+
+    public static final String EVENT_READ_DEPENDENCIES = "read.dependencies";
+
+    public static final String EVENT_READ_DEPENDENCIES_FROM_REPO = "read.dependencies.from.repo";
+
+    public static final String EVENT_READ_RAW = "vr.read.raw";
+
+    public static final String EVENT_READ_RAW_FROM_REPO = "read.raw.from.repo";
+
+    /** file system cache subfolder */
+    public static final String METADATA_CACHE_DIR = ".cache";
+
+    /** minimum # of queue elements to consider parallelization */
+    private static int MIN_PARALLEL = 5;
+
+    private static final Language _lang = new DefaultLanguage( VirtualRepositoryReader.class );
+
+    private static final IMercuryLogger _log = MercuryLoggerManager.getLogger( VirtualRepositoryReader.class );
+
+    // ----------------------------------------------------------------------------------------------------------------------------
+    private List<Repository> _repositories = new ArrayList<Repository>( 8 );
+
+    private RepositoryReader[] _repositoryReaders;
+
+    private LocalRepository _localRepository;
+
+    private RepositoryWriter _localRepositoryWriter;
+
+    RepositoryMetadataCache _mdCache;
+
+    private Map<String, ArtifactListProcessor> _processors;
+
+    private boolean _initialized = false;
+
+    private EventManager _eventManager;
+
+    // ----------------------------------------------------------------------------------------------------------------------------
+    public VirtualRepositoryReader( Collection<Repository> repositories )
+        throws RepositoryException
+    {
+        if ( !Util.isEmpty( repositories ) )
+            this._repositories.addAll( repositories );
+    }
+
+    // ----------------------------------------------------------------------------------------------------------------------------
+    public VirtualRepositoryReader( LocalRepository localRepository, Collection<RemoteRepository> remoteRepositories )
+    throws RepositoryException
+    {
+        if ( _localRepository == null )
+            throw new RepositoryException( "null local repo" );
+
+        this._localRepository = localRepository;
+
+        this._repositories.add( localRepository );
+
+        if ( remoteRepositories != null && remoteRepositories.size() > 0 )
+            this._repositories.addAll( remoteRepositories );
+    }
+
+    // ----------------------------------------------------------------------------------------------------------------------------
+    public VirtualRepositoryReader( Repository... repositories )
+    throws RepositoryException
+    {
+        if ( repositories != null && repositories.length > 0 )
+            for ( Repository r : repositories )
+                this._repositories.add( r );
+    }
+
+    // ----------------------------------------------------------------------------------------------------------------------------
+    public static final RepositoryMetadataCache getCache( File localRepositoryRoot )
+        throws IOException
+    {
+        // TODO: 2008-10-13 og: man - I miss plexus! Badly want an IOC container. This
+        // should be configured, not hardcoded
+        return MetadataCacheFs.getCache( new File( localRepositoryRoot, METADATA_CACHE_DIR ) );
+    }
+
+    // ----------------------------------------------------------------------------------------------------------------------------
+    public void addRepository( Repository repo )
+        throws RepositoryException
+    {
+        if ( _initialized )
+            throw new RepositoryException( "cannot add repositories after VirtualReader has been initialized" );
+
+        _repositories.add( repo );
+    }
+
+    // ----------------------------------------------------------------------------------------------------------------------------
+    public void setProcessors( Map<String, ArtifactListProcessor> processors )
+    {
+        _processors = processors;
+    }
+
+    // ----------------------------------------------------------------------------------------------------------------------------
+    /**
+     * very important call - makes VRR sort out all the information it collected so far
+     */
+    public void init()
+        throws RepositoryException
+    {
+        if ( _initialized )
+            return;
+
+        _repositoryReaders = new RepositoryReader[_repositories.size()];
+
+        // move local repo's upfront - they are faster!
+        int i = 0;
+        for ( Repository r : _repositories )
+        {
+            if ( !r.isLocal() || !r.isReadable() )
+                continue;
+
+            RepositoryReader rr = r.getReader();
+
+            rr.setMetadataReader( this );
+
+            _repositoryReaders[i++] = rr;
+
+            if ( r.isWriteable() )
             {
-              keyVersionRange = VersionRangeFactory.create( key.getVersion() );
+                // we select the first writable repo in the list
+                if ( _localRepository != null )
+                    continue;
+
+                _localRepository = (LocalRepository) r.getReader().getRepository();
+                _localRepositoryWriter = _localRepository.getWriter();
+
+                if ( _mdCache == null )
+                {
+                    try
+                    {
+                        _mdCache = getCache( _localRepository.getDirectory() );
+
+                        if ( _eventManager != null )
+                            _mdCache.setEventManager( _eventManager );
+                    }
+                    catch ( IOException e )
+                    {
+                        throw new RepositoryException( e.getMessage() );
+                    }
+                }
             }
-            catch( VersionException e )
+        }
+
+        // remote ones
+        for ( Repository r : _repositories )
+        {
+            if ( r.isLocal() || !r.isReadable() )
+                continue;
+
+            RepositoryReader rr = r.getReader();
+
+            if ( _mdCache != null )
+                rr.setMetadataCache( _mdCache );
+
+            rr.setMetadataReader( this );
+
+            _repositoryReaders[i++] = rr;
+        }
+        _initialized = true;
+    }
+
+    // ----------------------------------------------------------------------------------------------------------------------------
+    public ArtifactBasicResults readVersions( Collection<ArtifactBasicMetadata> query )
+        throws IllegalArgumentException, RepositoryException
+    {
+        if ( query == null )
+            throw new IllegalArgumentException( "null bmd supplied" );
+
+        init();
+
+        GenericEvent event = null;
+
+        try
+        {
+
+            if ( _eventManager != null )
+                event = new GenericEvent( EventTypeEnum.virtualRepositoryReader, EVENT_READ_VERSIONS );
+
+            ArtifactBasicResults res = null;
+            ArtifactListProcessor tp = _processors == null ? null : _processors.get( ArtifactListProcessor.FUNCTION_TP );
+
+            GenericEvent eventRead = null;
+
+            List<ArtifactBasicMetadata> qList = new ArrayList<ArtifactBasicMetadata>( query.size() );
+            qList.addAll( query );
+
+            for ( RepositoryReader rr : _repositoryReaders )
+                try
+                {
+                    // all found
+                    if ( qList.isEmpty() )
+                        break;
+
+                    if ( _eventManager != null )
+                        eventRead =
+                            new GenericEvent( EventTypeEnum.virtualRepositoryReader, EVENT_READ_VERSIONS_FROM_REPO,
+                                              rr.getRepository().getId() );
+
+                    ArtifactBasicResults repoRes = rr.readVersions( qList );
+                    
+                    if( repoRes != null && repoRes.hasExceptions() )
+                    {
+                        if( _log.isWarnEnabled() )
+                            _log.warn( repoRes.getExceptions().toString() );
+                    }
+
+                    if ( repoRes != null && repoRes.hasResults() )
+                    {
+                        for ( ArtifactBasicMetadata key : repoRes.getResults().keySet() )
+                        {
+                            List<ArtifactBasicMetadata> rorRes = repoRes.getResult( key );
+
+                            if ( tp != null )
+                            {
+                                try
+                                {
+                                    tp.configure( key );
+                                    rorRes = tp.process( rorRes );
+                                }
+                                catch ( ArtifactListProcessorException e )
+                                {
+                                    throw new RepositoryException( e );
+                                }
+                            }
+
+                            if ( Util.isEmpty( rorRes ) )
+                            {
+                                eventRead.setResult( "none found" );
+                                continue;
+                            }
+
+                            for ( ArtifactBasicMetadata bmd : rorRes )
+                                bmd.setTracker( rr );
+
+                            if ( res == null )
+                                res = new ArtifactBasicResults( key, rorRes );
+                            else
+                                res.add( key, rorRes );
+
+                            String keyVersion = key.getVersion();
+                            VersionRange keyVersionRange = null;
+                            try
+                            {
+                                keyVersionRange = VersionRangeFactory.create( key.getVersion() );
+                            }
+                            catch ( VersionException e )
+                            {
+                                throw new RepositoryException( _lang.getMessage( "query.element.bad.version",
+                                                                                 key.toString(), e.getMessage() ) );
+                            }
+
+                            if ( keyVersionRange.isSingleton() )
+                            {
+                                Quality keyQuality = new Quality( keyVersion );
+                                if ( keyQuality.compareTo( Quality.RELEASE_QUALITY ) == 0 )
+                                    // fixed release is found - no more scanning
+                                    qList.remove( key );
+                            }
+                        }
+                    }
+
+                    if ( _eventManager != null )
+                        eventRead.setResult( "repo done" );
+                }
+                finally
+                {
+                    if ( _eventManager != null )
+                    {
+                        eventRead.stop();
+                        _eventManager.fireEvent( eventRead );
+                    }
+                }
+
+            return res;
+        }
+        finally
+        {
+            if ( _eventManager != null )
             {
-              throw new RepositoryException( _lang.getMessage( "query.element.bad.version", key.toString(), e.getMessage() ) );
+                event.stop();
+                _eventManager.fireEvent( event );
             }
-            
-            if( keyVersionRange.isSingleton() )
-            {
-              Quality keyQuality = new Quality(keyVersion);
-              if( keyQuality.compareTo( Quality.RELEASE_QUALITY ) == 0 )
-                // fixed release is found - no more scanning
-                qList.remove( key );
-            }
-          }
-        }
-        
-        if( _eventManager!= null )
-          eventRead.setResult( "repo done" );
-      }
-      finally
-      {
-        if( _eventManager != null )
-        {
-          eventRead.stop();
-          _eventManager.fireEvent( eventRead );
-        }
-      }
-      
-      return res;
-    }
-    finally
-    {
-      if( _eventManager != null )
-      {
-        event.stop();
-        _eventManager.fireEvent( event );
-      }
-    }
-  }
-  //----------------------------------------------------------------------------------------------------------------------------
-  public ArtifactMetadata readDependencies( ArtifactBasicMetadata bmd )
-  throws IllegalArgumentException, RepositoryException
-  {
-    if( bmd == null )
-      throw new IllegalArgumentException("null bmd supplied");
-    
-    GenericEvent event = null;
-    
-    try
-    {
-      
-      if( _eventManager != null )
-        event = new GenericEvent( EventTypeEnum.virtualRepositoryReader, EVENT_READ_DEPENDENCIES, bmd.toString() );
-      
-      init();
-      
-      List<ArtifactBasicMetadata> query = new ArrayList<ArtifactBasicMetadata>(1);
-      query.add( bmd );
-      
-      ArtifactMetadata md = new ArtifactMetadata( bmd );
-      
-      RepositoryReader [] repos = _repositoryReaders;
-      
-      Object tracker =  bmd.getTracker();
-      
-      // do we know where this metadata came from ?
-      if( tracker != null && RepositoryReader.class.isAssignableFrom( tracker.getClass() ) )
-      {
-        repos = new RepositoryReader [] { (RepositoryReader)tracker };
-      }
-      
-      GenericEvent eventRead = null;
-      
-      for( RepositoryReader rr : repos )
-      try 
-      {
-        
-        if( _eventManager != null )
-          eventRead = new GenericEvent( EventTypeEnum.virtualRepositoryReader, EVENT_READ_DEPENDENCIES_FROM_REPO, rr.getRepository().getId() );
-        
-        ArtifactBasicResults res = rr.readDependencies( query );
-        
-        if( res != null && res.hasResults( bmd ) )
-        {
-          md.setDependencies( res.getResult( bmd ) );
-          md.setTracker( rr );
-          
-          if( _eventManager != null )
-            eventRead.setInfo( eventRead.getInfo()+", found: "+md.getDependencies() );
-          
-          return md;
-        }
-      }
-      finally
-      {
-        if( _eventManager != null )
-        {
-          eventRead.stop();
-          _eventManager.fireEvent( eventRead );
-        }
-      }
-      
-      if( _eventManager != null )
-        event.setResult( "not found" );
-      
-      return md;
-    }
-    finally
-    {
-      if( _eventManager != null )
-      {
-        event.stop();
-        _eventManager.fireEvent( event );
-      }
-    }
-  }
-  //----------------------------------------------------------------------------------------------------------------------------
-  /**
-   * split query into repository buckets
-   */
-  private Map< RepositoryReader, List<ArtifactBasicMetadata> > sortByRepo( Collection<? extends ArtifactBasicMetadata> query )
-  {
-    HashMap< RepositoryReader, List<ArtifactBasicMetadata> > res = null;
-    
-    List<ArtifactBasicMetadata> rejects = null;
-
-    for( ArtifactBasicMetadata bmd : query )
-    {
-      Object tracker =  bmd.getTracker();
-      
-      // do we know where this metadata came from ?
-      if( tracker != null && RepositoryReader.class.isAssignableFrom( tracker.getClass() ) )
-      {
-        RepositoryReader rr = (RepositoryReader)tracker;
-        
-        if( res == null )
-        {
-          res = new HashMap< RepositoryReader, List<ArtifactBasicMetadata> >();
-        }
-        
-        List<ArtifactBasicMetadata> rl = res.get( rr );
-        
-        if( rl == null )
-        {
-          rl = new ArrayList<ArtifactBasicMetadata>();
-          res.put( rr, rl );
-        }
-        
-        rl.add( bmd );
-          
-      }
-      else
-      {
-        if( rejects == null )
-          rejects = new ArrayList<ArtifactBasicMetadata>();
-        
-        rejects.add( bmd );
-      }
-    }
-
-    if( rejects != null )
-    {
-      if( res == null )
-        res = new HashMap< RepositoryReader, List<ArtifactBasicMetadata> >();
-
-      res.put( RepositoryReader.NULL_READER, rejects );
-    }
-    
-    return res;
-  }
-  //----------------------------------------------------------------------------------------------------------------------------
-  public ArtifactResults readArtifacts( Collection<? extends ArtifactBasicMetadata> query )
-  throws RepositoryException
-  {
-    GenericEvent event = null;
-    
-    try
-    {
-      ArtifactResults res = null;
-
-      if( _eventManager != null )
-        event = new GenericEvent( EventTypeEnum.virtualRepositoryReader, EVENT_READ_ARTIFACTS, "" );
-      
-      if( Util.isEmpty( query ) )
-        return res;
-      
-      Map< RepositoryReader, List<ArtifactBasicMetadata> > buckets = sortByRepo( query );
-      
-      List<ArtifactBasicMetadata> rejects = buckets == null ? null : buckets.get( RepositoryReader.NULL_READER );
-  
-      if( buckets == null )
-        throw new RepositoryException( _lang.getMessage( "internal.error.sorting.query", query.toString() ) ); 
-        
-      init();
-      
-      // first read repository-qualified Artifacts
-      for( RepositoryReader rr : buckets.keySet() )
-      {
-        if( RepositoryReader.NULL_READER.equals( rr ) )
-          continue;
-        
-        String repoId = rr.getRepository().getId();
-        
-        GenericEvent eventRead = null;
-        
+        }
+    }
+
+    // ----------------------------------------------------------------------------------------------------------------------------
+    public ArtifactMetadata readDependencies( ArtifactBasicMetadata bmd )
+        throws IllegalArgumentException, RepositoryException
+    {
+        if ( bmd == null )
+            throw new IllegalArgumentException( "null bmd supplied" );
+
+        GenericEvent event = null;
+
         try
         {
-          if( _eventManager != null )
-            eventRead = new GenericEvent( EventTypeEnum.virtualRepositoryReader, EVENT_READ_ARTIFACTS_FROM_REPO_QUALIFIED, repoId );
-          
-          List<ArtifactBasicMetadata> rrQuery = buckets.get( rr );
-          
-          ArtifactResults rrRes = rr.readArtifacts( rrQuery );
-          
-          if( rrRes.hasExceptions() )
-            throw new RepositoryException( _lang.getMessage( "error.reading.existing.artifact", rrRes.getExceptions().toString(), rr.getRepository().getId() ) );
-          
-          if( rrRes.hasResults() )
-            for( ArtifactBasicMetadata bm : rrRes.getResults().keySet() )
-            {
-              List<Artifact> al = rrRes.getResults( bm ); 
-              
-              if( res == null )
-                res = new ArtifactResults();
-    
-              res.addAll( bm, al );
-              
-              // don't write local artifacts back to the same repo
-              if( _localRepository != null && repoId.equals( _localRepository.getId() ) )
-                continue;
-    
-              if( _localRepositoryWriter != null )
-                _localRepositoryWriter.writeArtifacts( al );
+
+            if ( _eventManager != null )
+                event =
+                    new GenericEvent( EventTypeEnum.virtualRepositoryReader, EVENT_READ_DEPENDENCIES, bmd.toString() );
+
+            init();
+
+            List<ArtifactBasicMetadata> query = new ArrayList<ArtifactBasicMetadata>( 1 );
+            query.add( bmd );
+
+            ArtifactMetadata md = new ArtifactMetadata( bmd );
+
+            RepositoryReader[] repos = _repositoryReaders;
+
+            Object tracker = bmd.getTracker();
+
+            // do we know where this metadata came from ?
+            if ( tracker != null && RepositoryReader.class.isAssignableFrom( tracker.getClass() ) )
+            {
+                repos = new RepositoryReader[] { (RepositoryReader) tracker };
             }
+
+            GenericEvent eventRead = null;
+
+            for ( RepositoryReader rr : repos )
+                try
+                {
+
+                    if ( _eventManager != null )
+                        eventRead =
+                            new GenericEvent( EventTypeEnum.virtualRepositoryReader, EVENT_READ_DEPENDENCIES_FROM_REPO,
+                                              rr.getRepository().getId() );
+
+                    ArtifactBasicResults res = rr.readDependencies( query );
+
+                    if ( res != null && res.hasResults( bmd ) )
+                    {
+                        md.setDependencies( res.getResult( bmd ) );
+                        md.setTracker( rr );
+
+                        if ( _eventManager != null )
+                            eventRead.setInfo( eventRead.getInfo() + ", found: " + md.getDependencies() );
+
+                        return md;
+                    }
+                }
+                finally
+                {
+                    if ( _eventManager != null )
+                    {
+                        eventRead.stop();
+                        _eventManager.fireEvent( eventRead );
+                    }
+                }
+
+            if ( _eventManager != null )
+                event.setResult( "not found" );
+
+            return md;
         }
         finally
         {
-          if( _eventManager != null )
-          {
-            eventRead.stop();
-            _eventManager.fireEvent( eventRead );
-          }
-        }
-      }
-      
-      // then search all repos for unqualified Artifacts
-      if( !Util.isEmpty( rejects ) )
-      {
-        for( RepositoryReader rr : _repositoryReaders )
-        {
-          if( rejects.isEmpty() )
-            break;
-          
-          String repoId = rr.getRepository().getId();
-          
-          GenericEvent eventRead = null;
-          
-          try
-          {
-            if( _eventManager != null )
-              eventRead = new GenericEvent( EventTypeEnum.virtualRepositoryReader, EVENT_READ_ARTIFACTS_FROM_REPO_UNQUALIFIED, repoId );
-            
-            ArtifactResults rrRes = rr.readArtifacts( rejects );
-            
-            if( rrRes.hasResults() )
-              for( ArtifactBasicMetadata bm : rrRes.getResults().keySet() )
-              {
-                List<Artifact> al = rrRes.getResults( bm ); 
-    
-                if( res == null )
-                  res = new ArtifactResults();
-                
-                res.addAll( bm, al );
-                
-                rejects.remove( bm );
-                
-                // don't write local artifacts back to the same repo
-                if( _localRepository != null && repoId.equals( _localRepository.getId() ) )
-                  continue;
-    
-                if( _localRepositoryWriter != null )
-                  _localRepositoryWriter.writeArtifacts( al );
-  
-            }
-          }
-          finally
-          {
-            if( _eventManager != null )
-            {
-              eventRead.stop();
-              _eventManager.fireEvent( eventRead );
-            }
-          }
-        }
-      }
-      
-      return res;
-    }
-    finally
-    {
-      if( _eventManager != null )
-      {
-        event.stop();
-        _eventManager.fireEvent( event );
-      }
-    }
-  }
-  //----------------------------------------------------------------------------------------------------------------------------
-  // MetadataReader implementation
-  //----------------------------------------------------------------------------------------------------------------------------
-  public byte[] readMetadata( ArtifactBasicMetadata bmd )
-  throws MetadataReaderException
-  {
-    if( _log.isDebugEnabled() )
-      _log.debug( "Asking for pom: "+bmd);
-
-    return readRawData( bmd, "", "pom" );
-  }
-  //----------------------------------------------------------------------------------------------------------------------------
-  // MetadataReader implementation
-  //----------------------------------------------------------------------------------------------------------------------------
-  public byte[] readRawData( ArtifactBasicMetadata bmd, String classifier, String type )
-  throws MetadataReaderException
-  {
-    
-    GenericEvent event = null;
-    String eventTag = null; 
-    
-    if( _log.isDebugEnabled() )
-      _log.debug( "request for "+bmd+", classifier="+classifier+", type="+type );
-    
-    if( bmd == null )
-      throw new IllegalArgumentException("null bmd supplied");
-    
-    try
-    {
-      if( _eventManager!= null )
-      {
-        eventTag = bmd.toString()
-                  + (Util.isEmpty( classifier )?"":", classifier="+classifier)
-                  + (Util.isEmpty( type )?"":", type="+type)
-                    ;
-        event = new GenericEvent( EventTypeEnum.virtualRepositoryReader, EVENT_READ_RAW, eventTag );
-      }
-      
-      ArtifactBasicMetadata bmdQuery = bmd;
-      
-      try
-      {
-        init();
-      }
-      catch( RepositoryException e )
-      {
-        throw new MetadataReaderException(e);
-      }
-      
-      byte [] res = null;
-      Quality vq = new Quality( bmd.getVersion() );
-      
-      if( _log.isDebugEnabled() )
-        _log.debug( "quality calculated as "+vq.getQuality() == null ? "null" :vq.getQuality().name() );
-      
-      if( Quality.SNAPSHOT_QUALITY.equals( vq ) )
-      {
-        List<ArtifactBasicMetadata> query = new ArrayList<ArtifactBasicMetadata>(1);
-        query.add( bmd );
-        
-        try
+            if ( _eventManager != null )
+            {
+                event.stop();
+                _eventManager.fireEvent( event );
+            }
+        }
+    }
+
+    // ----------------------------------------------------------------------------------------------------------------------------
+    /**
+     * split query into repository buckets
+     */
+    private Map<RepositoryReader, List<ArtifactBasicMetadata>> sortByRepo( Collection<? extends ArtifactBasicMetadata> query )
+    {
+        HashMap<RepositoryReader, List<ArtifactBasicMetadata>> res = null;
+
+        List<ArtifactBasicMetadata> rejects = null;
+
+        for ( ArtifactBasicMetadata bmd : query )
+        {
+            Object tracker = bmd.getTracker();
+
+            // do we know where this metadata came from ?
+            if ( tracker != null && RepositoryReader.class.isAssignableFrom( tracker.getClass() ) )
+            {
+                RepositoryReader rr = (RepositoryReader) tracker;
+
+                if ( res == null )
+                {
+                    res = new HashMap<RepositoryReader, List<ArtifactBasicMetadata>>();
+                }
+
+                List<ArtifactBasicMetadata> rl = res.get( rr );
+
+                if ( rl == null )
+                {
+                    rl = new ArrayList<ArtifactBasicMetadata>();
+                    res.put( rr, rl );
+                }
+
+                rl.add( bmd );
+
+            }
+            else
+            {
+                if ( rejects == null )
+                    rejects = new ArrayList<ArtifactBasicMetadata>();
+
+                rejects.add( bmd );
+            }
+        }
+
+        if ( rejects != null )
         {
-          ArtifactBasicResults vRes = readVersions( query );
-          if( Util.isEmpty( vRes ) )
-          {
-            if( _log.isDebugEnabled() )
-              _log.debug( "no snapshots found - throw exception" );
-            
-            throw new MetadataReaderException( _lang.getMessage( "no.snapshots", bmd.toString(), classifier, type ) );
-          }
-            
-            
-          if( vRes.hasResults( bmd ) )
-          {
-            List<ArtifactBasicMetadata> versions = vRes.getResult( bmd );
-            
-            TreeSet<ArtifactBasicMetadata> snapshots = new TreeSet<ArtifactBasicMetadata>( new MetadataVersionComparator() );
-            snapshots.addAll( versions );
-            
-            bmdQuery = snapshots.last();
-          }
-          else
-          {
-            if( _log.isDebugEnabled() )
-              _log.debug( "no snapshots found - throw exception" );
-            
-            throw new MetadataReaderException( _lang.getMessage( "no.snapshots", bmd.toString(), classifier, type ) );
-          }
-        }
-        catch( Exception e )
-        {
-          throw new MetadataReaderException(e);
-        }
-      }
-      
-      for( RepositoryReader rr : _repositoryReaders )
-      {
-        GenericEvent eventRead = null;
-        
+            if ( res == null )
+                res = new HashMap<RepositoryReader, List<ArtifactBasicMetadata>>();
+
+            res.put( RepositoryReader.NULL_READER, rejects );
+        }
+
+        return res;
+    }
+
+    // ----------------------------------------------------------------------------------------------------------------------------
+    public ArtifactResults readArtifacts( Collection<? extends ArtifactBasicMetadata> query )
+        throws RepositoryException
+    {
+        GenericEvent event = null;
+
         try
         {
-          if( _eventManager != null )
-            eventRead = new GenericEvent( EventTypeEnum.virtualRepositoryReader, EVENT_READ_RAW_FROM_REPO, rr.getRepository().getId()+": "+eventTag );
-          
-          res = rr.readRawData( bmdQuery, classifier, type );
-          if( res != null )
-          {
-            if( _log.isDebugEnabled() )
-              _log.debug( bmdQuery+" found in "+rr.getRepository().getServer() );
-
-            if( _eventManager != null )
-              eventRead.setInfo( eventRead.getInfo() );
-            
+            ArtifactResults res = null;
+
+            if ( _eventManager != null )
+                event = new GenericEvent( EventTypeEnum.virtualRepositoryReader, EVENT_READ_ARTIFACTS, "" );
+
+            if ( Util.isEmpty( query ) )
+                return res;
+
+            Map<RepositoryReader, List<ArtifactBasicMetadata>> buckets = sortByRepo( query );
+
+            List<ArtifactBasicMetadata> rejects = buckets == null ? null : buckets.get( RepositoryReader.NULL_READER );
+
+            if ( buckets == null )
+                throw new RepositoryException( _lang.getMessage( "internal.error.sorting.query", query.toString() ) );
+
+            init();
+
+            res = new ArtifactResults();
+                
+            // first read repository-qualified Artifacts
+            for ( RepositoryReader rr : buckets.keySet() )
+            {
+                if ( RepositoryReader.NULL_READER.equals( rr ) )
+                    continue;
+
+                String repoId = rr.getRepository().getId();
+
+                GenericEvent eventRead = null;
+
+                try
+                {
+                    if ( _eventManager != null )
+                        eventRead =
+                            new GenericEvent( EventTypeEnum.virtualRepositoryReader,
+                                              EVENT_READ_ARTIFACTS_FROM_REPO_QUALIFIED, repoId );
+
+                    List<ArtifactBasicMetadata> rrQuery = buckets.get( rr );
+
+                    ArtifactResults rrRes = rr.readArtifacts( rrQuery );
+
+                    if ( rrRes.hasExceptions() )
+                        throw new RepositoryException( _lang.getMessage( "error.reading.existing.artifact",
+                                                                         rrRes.getExceptions().toString(),
+                                                                         rr.getRepository().getId() ) );
+
+                    if ( rrRes.hasResults() )
+                        for ( ArtifactBasicMetadata bm : rrRes.getResults().keySet() )
+                        {
+                            List<Artifact> al = rrRes.getResults( bm );
+
+                            res.addAll( bm, al );
+
+                            // don't write local artifacts back to the same repo
+                            if ( _localRepository != null && repoId.equals( _localRepository.getId() ) )
+                                continue;
+
+                            if ( _localRepositoryWriter != null )
+                                _localRepositoryWriter.writeArtifacts( al );
+                        }
+                }
+                finally
+                {
+                    if ( _eventManager != null )
+                    {
+                        eventRead.stop();
+                        _eventManager.fireEvent( eventRead );
+                    }
+                }
+            }
+
+            // then search all repos for unqualified Artifacts
+            if ( !Util.isEmpty( rejects ) )
+            {
+                for ( RepositoryReader rr : _repositoryReaders )
+                {
+                    if ( rejects.isEmpty() )
+                        break;
+
+                    String repoId = rr.getRepository().getId();
+
+                    GenericEvent eventRead = null;
+
+                    try
+                    {
+                        if ( _eventManager != null )
+                            eventRead =
+                                new GenericEvent( EventTypeEnum.virtualRepositoryReader,
+                                                  EVENT_READ_ARTIFACTS_FROM_REPO_UNQUALIFIED, repoId );
+
+                        ArtifactResults rrRes = rr.readArtifacts( rejects );
+
+                        if ( rrRes.hasExceptions() )
+                        {
+                            res.addError( rrRes );
+                        }
+                        else if ( rrRes.hasResults() )
+                        {
+                            for ( ArtifactBasicMetadata bm : rrRes.getResults().keySet() )
+                            {
+                                List<Artifact> al = rrRes.getResults( bm );
+
+                                res.addAll( bm, al );
+
+                                rejects.remove( bm );
+
+                                // don't write local artifacts back to the same repo
+                                if ( _localRepository != null && repoId.equals( _localRepository.getId() ) )
+                                    continue;
+
+                                if ( _localRepositoryWriter != null )
+                                    _localRepositoryWriter.writeArtifacts( al );
+
+                            }
+                        }
+                    }
+                    finally
+                    {
+                        if ( _eventManager != null )
+                        {
+                            eventRead.stop();
+                            _eventManager.fireEvent( eventRead );
+                        }
+                    }
+                }
+            }
+
             return res;
-          }
-          
-          if( _eventManager != null )
-            eventRead.setResult( "not found" );
         }
         finally
         {
-          if( _eventManager != null )
-          {
-            eventRead.stop();
-            _eventManager.fireEvent( eventRead );
-          }
-        }
-      }
-      
-      if( _log.isDebugEnabled() )
-        _log.debug( "no data found, returning null" );
-      
-      return null;
-    }
-    finally
-    {
-      if( _eventManager != null )
-      {
-        event.stop();
-        _eventManager.fireEvent( event );
-      }
-    }
-  }
-  //----------------------------------------------------------------------------------------------------------------------------
-  public void register( MercuryEventListener listener )
-  {
-    if( _eventManager == null )
-      _eventManager = new EventManager();
-
-    _eventManager.register( listener );
-  }
-
-  public void setEventManager( EventManager eventManager )
-  {
-    _eventManager = eventManager;
-  }
-
-  public void unRegister( MercuryEventListener listener )
-  {
-    if( _eventManager != null )
-      _eventManager.unRegister( listener );
-  }
-  //----------------------------------------------------------------------------------------------------------------------------
-  //----------------------------------------------------------------------------------------------------------------------------
+            if ( _eventManager != null )
+            {
+                event.stop();
+                _eventManager.fireEvent( event );
+            }
+        }
+    }
+
+    // ----------------------------------------------------------------------------------------------------------------------------
+    // MetadataReader implementation
+    // ----------------------------------------------------------------------------------------------------------------------------
+    public byte[] readMetadata( ArtifactBasicMetadata bmd )
+        throws MetadataReaderException
+    {
+        if ( _log.isDebugEnabled() )
+            _log.debug( "Asking for pom: " + bmd );
+
+        return readRawData( bmd, "", "pom" );
+    }
+
+    // ----------------------------------------------------------------------------------------------------------------------------
+    // MetadataReader implementation
+    // ----------------------------------------------------------------------------------------------------------------------------
+    public byte[] readRawData( ArtifactBasicMetadata bmd, String classifier, String type )
+        throws MetadataReaderException
+    {
+
+        GenericEvent event = null;
+        String eventTag = null;
+
+        if ( _log.isDebugEnabled() )
+            _log.debug( "request for " + bmd + ", classifier=" + classifier + ", type=" + type );
+
+        if ( bmd == null )
+            throw new IllegalArgumentException( "null bmd supplied" );
+
+        try
+        {
+            if ( _eventManager != null )
+            {
+                eventTag =
+                    bmd.toString() + ( Util.isEmpty( classifier ) ? "" : ", classifier=" + classifier )
+                        + ( Util.isEmpty( type ) ? "" : ", type=" + type );
+                event = new GenericEvent( EventTypeEnum.virtualRepositoryReader, EVENT_READ_RAW, eventTag );
+            }
+
+            ArtifactBasicMetadata bmdQuery = bmd;
+
+            try
+            {
+                init();
+            }
+            catch ( RepositoryException e )
+            {
+                throw new MetadataReaderException( e );
+            }
+
+            byte[] res = null;
+            Quality vq = new Quality( bmd.getVersion() );
+
+            if ( _log.isDebugEnabled() )
+                _log.debug( "quality calculated as " + vq.getQuality() == null ? "null" : vq.getQuality().name() );
+
+            if ( Quality.SNAPSHOT_QUALITY.equals( vq ) )
+            {
+                List<ArtifactBasicMetadata> query = new ArrayList<ArtifactBasicMetadata>( 1 );
+                query.add( bmd );
+
+                try
+                {
+                    ArtifactBasicResults vRes = readVersions( query );
+                    if ( Util.isEmpty( vRes ) )
+                    {
+                        if ( _log.isDebugEnabled() )
+                            _log.debug( "no snapshots found - throw exception" );
+
+                        throw new MetadataReaderException( _lang.getMessage( "no.snapshots", bmd.toString(),
+                                                                             classifier, type ) );
+                    }
+
+                    if ( vRes.hasResults( bmd ) )
+                    {
+                        List<ArtifactBasicMetadata> versions = vRes.getResult( bmd );
+
+                        TreeSet<ArtifactBasicMetadata> snapshots =
+                            new TreeSet<ArtifactBasicMetadata>( new MetadataVersionComparator() );
+                        snapshots.addAll( versions );
+
+                        bmdQuery = snapshots.last();
+                    }
+                    else
+                    {
+                        if ( _log.isDebugEnabled() )
+                            _log.debug( "no snapshots found - throw exception" );
+
+                        throw new MetadataReaderException( _lang.getMessage( "no.snapshots", bmd.toString(),
+                                                                             classifier, type ) );
+                    }
+                }
+                catch ( Exception e )
+                {
+                    throw new MetadataReaderException( e );
+                }
+            }
+
+            for ( RepositoryReader rr : _repositoryReaders )
+            {
+                GenericEvent eventRead = null;
+
+                try
+                {
+                    if ( _eventManager != null )
+                        eventRead =
+                            new GenericEvent( EventTypeEnum.virtualRepositoryReader, EVENT_READ_RAW_FROM_REPO,
+                                              rr.getRepository().getId() + ": " + eventTag );
+
+                    res = rr.readRawData( bmdQuery, classifier, type );
+                    if ( res != null )
+                    {
+                        if ( _log.isDebugEnabled() )
+                            _log.debug( bmdQuery + " found in " + rr.getRepository().getServer() );
+
+                        if ( _eventManager != null )
+                            eventRead.setInfo( eventRead.getInfo() );
+
+                        return res;
+                    }
+
+                    if ( _eventManager != null )
+                        eventRead.setResult( "not found" );
+                }
+                finally
+                {
+                    if ( _eventManager != null )
+                    {
+                        eventRead.stop();
+                        _eventManager.fireEvent( eventRead );
+                    }
+                }
+            }
+
+            if ( _log.isDebugEnabled() )
+                _log.debug( "no data found, returning null" );
+
+            return null;
+        }
+        finally
+        {
+            if ( _eventManager != null )
+            {
+                event.stop();
+                _eventManager.fireEvent( event );
+            }
+        }
+    }
+
+    // ----------------------------------------------------------------------------------------------------------------------------
+    public void register( MercuryEventListener listener )
+    {
+        if ( _eventManager == null )
+            _eventManager = new EventManager();
+
+        _eventManager.register( listener );
+    }
+
+    public void setEventManager( EventManager eventManager )
+    {
+        _eventManager = eventManager;
+    }
+
+    public void unRegister( MercuryEventListener listener )
+    {
+        if ( _eventManager != null )
+            _eventManager.unRegister( listener );
+    }
+    // ----------------------------------------------------------------------------------------------------------------------------
+    // ----------------------------------------------------------------------------------------------------------------------------
 }

Modified: maven/mercury/trunk/mercury-util/src/main/java/org/apache/maven/mercury/util/FileUtil.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-util/src/main/java/org/apache/maven/mercury/util/FileUtil.java?rev=732592&r1=732591&r2=732592&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-util/src/main/java/org/apache/maven/mercury/util/FileUtil.java (original)
+++ maven/mercury/trunk/mercury-util/src/main/java/org/apache/maven/mercury/util/FileUtil.java Wed Jan  7 18:31:13 2009
@@ -18,11 +18,13 @@
  */
 package org.apache.maven.mercury.util;
 
+import java.io.BufferedOutputStream;
 import java.io.BufferedReader;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -39,6 +41,8 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
 
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.CommandLineParser;
@@ -984,6 +988,52 @@
 
     return new FileInputStream( new File(resource) );
   }
+  // -----------------------------------------------------
+    public static final void unZip( InputStream zipInputStream, File destDir )
+        throws FileNotFoundException, IOException
+    {
+        ZipInputStream zis = new ZipInputStream( zipInputStream );
+
+        BufferedOutputStream dest = null;
+        ZipEntry entry;
+        while ( ( entry = zis.getNextEntry() ) != null )
+        {
+            File fo = new File( destDir, entry.getName() );
+            
+            if( LOG.isDebugEnabled() )
+                LOG.debug( "Extracting: " + fo.getCanonicalPath() );
+
+            int count;
+            byte data[] = new byte[DEFAULT_BUFFER_SIZE];
+
+            // write the files to the disk
+            if ( entry.isDirectory() )
+            {
+                fo.mkdirs();
+                continue;
+            }
+            
+            fo.getParentFile().mkdirs();
+
+            FileOutputStream fos = new FileOutputStream( fo );
+            
+            dest = new BufferedOutputStream( fos, DEFAULT_BUFFER_SIZE );
+            
+            while ( ( count = zis.read( data, 0, DEFAULT_BUFFER_SIZE ) ) != -1 )
+            {
+                dest.write( data, 0, count );
+            }
+            
+            dest.flush();
+            
+            dest.close();
+        }
+        
+        zis.close();
+
+        if( LOG.isDebugEnabled() )
+            LOG.debug( destDir + " - done." );
+    }
   //---------------------------------------------------------------------------------------------------------------
   //---------------------------------------------------------------------------------------------------------------
 }

Modified: maven/mercury/trunk/mercury-util/src/main/java/org/apache/maven/mercury/util/Util.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-util/src/main/java/org/apache/maven/mercury/util/Util.java?rev=732592&r1=732591&r2=732592&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-util/src/main/java/org/apache/maven/mercury/util/Util.java (original)
+++ maven/mercury/trunk/mercury-util/src/main/java/org/apache/maven/mercury/util/Util.java Wed Jan  7 18:31:13 2009
@@ -18,6 +18,7 @@
  */
 package org.apache.maven.mercury.util;
 
+import java.io.File;
 import java.util.Collection;
 import java.util.Map;
 
@@ -40,6 +41,11 @@
    {
      return o == null || o.length() < 1;
    }
+   
+   public static final boolean isEmpty( File o )
+   {
+     return o == null || !o.exists() || o.length() < 1L;
+   }
 
    public static final boolean isEmpty( Object [] o )
    {