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 2008/10/14 03:46:47 UTC

svn commit: r704292 - in /maven/mercury/trunk: mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/ mercury-it/ mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/ mercury-md/mercury-md-sat/ mercury-md/mercury-md-sa...

Author: ogusakov
Date: Mon Oct 13 18:46:46 2008
New Revision: 704292

URL: http://svn.apache.org/viewvc?rev=704292&view=rev
Log:
fs cache works, remote repository reader uses it

Added:
    maven/mercury/trunk/mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/RemoteRepositoryCachingReaderM2Test.java
    maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/MetadataCacheException.java
    maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/Messages.properties   (contents, props changed)
      - copied, changed from r704227, maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/resources/org/apache/maven/mercury/repository/remote/m2/Messages.properties
Removed:
    maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/VirtualRepositoryReader.java
    maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/resources/org/apache/maven/mercury/repository/remote/m2/Messages.properties
Modified:
    maven/mercury/trunk/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/VersionRange.java
    maven/mercury/trunk/mercury-it/pom.xml
    maven/mercury/trunk/mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/AbstractRepositoryReaderM2Test.java
    maven/mercury/trunk/mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/RemoteRepositoryReaderM2Test.java
    maven/mercury/trunk/mercury-md/mercury-md-sat/pom.xml
    maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/DependencyTreeBuilder.java
    maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/Messages.properties
    maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RemoteRepository.java
    maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryGAMetadata.java
    maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryGAVMetadata.java
    maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryMetadataCache.java
    maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryUpdateIntervalPolicy.java
    maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryUpdatePolicy.java
    maven/mercury/trunk/mercury-repo/mercury-repo-api/src/test/java/org/apache/maven/mercury/repository/api/RepositoryUpdatePolicyIntervalTest.java
    maven/mercury/trunk/mercury-repo/mercury-repo-cache-fs/src/main/java/org/apache/maven/mercury/repository/cache/fs/CachedGAMetadata.java
    maven/mercury/trunk/mercury-repo/mercury-repo-cache-fs/src/main/java/org/apache/maven/mercury/repository/cache/fs/CachedGAVMetadata.java
    maven/mercury/trunk/mercury-repo/mercury-repo-cache-fs/src/main/java/org/apache/maven/mercury/repository/cache/fs/MetadataCacheFs.java
    maven/mercury/trunk/mercury-repo/mercury-repo-cache-fs/src/test/java/org/apache/maven/mercury/repository/cache/fs/CachedGATest.java
    maven/mercury/trunk/mercury-repo/mercury-repo-cache-fs/src/test/java/org/apache/maven/mercury/repository/cache/fs/CachedGAVTest.java
    maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/RemoteRepositoryM2.java
    maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/RemoteRepositoryReaderM2.java
    maven/mercury/trunk/mercury-repo/mercury-repo-virtual/pom.xml
    maven/mercury/trunk/mercury-repo/mercury-repo-virtual/src/main/java/org/apache/maven/mercury/repository/virtual/VirtualRepositoryReader.java
    maven/mercury/trunk/mercury-repo/pom.xml

Modified: maven/mercury/trunk/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/VersionRange.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/VersionRange.java?rev=704292&r1=704291&r2=704292&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/VersionRange.java (original)
+++ maven/mercury/trunk/mercury-artifact/src/main/java/org/apache/maven/mercury/artifact/version/VersionRange.java Mon Oct 13 18:46:46 2008
@@ -1,5 +1,6 @@
 package org.apache.maven.mercury.artifact.version;
 
+import java.util.Collection;
 import java.util.List;
 
 import org.apache.maven.mercury.artifact.Artifact;
@@ -186,7 +187,7 @@
    * @param noSnapshots
    * @return
    */
-  public static final String findLatest( final List<String> versions, final boolean noSnapshots )
+  public static final String findLatest( final Collection<String> versions, final boolean noSnapshots )
   {
     DefaultArtifactVersion tempDav = null;
     DefaultArtifactVersion tempDav2 = null;

Modified: maven/mercury/trunk/mercury-it/pom.xml
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-it/pom.xml?rev=704292&r1=704291&r2=704292&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-it/pom.xml (original)
+++ maven/mercury/trunk/mercury-it/pom.xml Mon Oct 13 18:46:46 2008
@@ -175,6 +175,12 @@
       <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.maven.mercury</groupId>
+      <artifactId>mercury-repo-virtual</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+
      <dependency>
       <groupId>org.apache.maven.mercury</groupId>
       <artifactId>mercury-transport-http</artifactId>

Modified: maven/mercury/trunk/mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/AbstractRepositoryReaderM2Test.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/AbstractRepositoryReaderM2Test.java?rev=704292&r1=704291&r2=704292&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/AbstractRepositoryReaderM2Test.java (original)
+++ maven/mercury/trunk/mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/AbstractRepositoryReaderM2Test.java Mon Oct 13 18:46:46 2008
@@ -2,6 +2,7 @@
 
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 
 import junit.framework.TestCase;
 
@@ -218,7 +219,15 @@
     assertNotNull( ror );
     
     if( ror.hasExceptions() )
-      System.out.println( ror.getExceptions() );
+    {
+      Map<ArtifactBasicMetadata, Exception> exs = ror.getExceptions();
+      
+      for( ArtifactBasicMetadata bmd : exs.keySet() )
+      {
+        System.out.println( "\n==========> "+bmd.toString());
+        exs.get( bmd ).printStackTrace();
+      }
+    }
     
     assertFalse( ror.hasExceptions() );
     assertTrue( ror.hasResults() );

Added: maven/mercury/trunk/mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/RemoteRepositoryCachingReaderM2Test.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/RemoteRepositoryCachingReaderM2Test.java?rev=704292&view=auto
==============================================================================
--- maven/mercury/trunk/mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/RemoteRepositoryCachingReaderM2Test.java (added)
+++ maven/mercury/trunk/mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/RemoteRepositoryCachingReaderM2Test.java Mon Oct 13 18:46:46 2008
@@ -0,0 +1,167 @@
+package org.apache.maven.mercury.repository.tests;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+
+import org.apache.maven.mercury.artifact.ArtifactBasicMetadata;
+import org.apache.maven.mercury.builder.api.MetadataReaderException;
+import org.apache.maven.mercury.repository.api.RemoteRepository;
+import org.apache.maven.mercury.repository.api.RepositoryException;
+import org.apache.maven.mercury.repository.api.RepositoryMetadataCache;
+import org.apache.maven.mercury.repository.api.RepositoryUpdateIntervalPolicy;
+import org.apache.maven.mercury.repository.api.RepositoryUpdatePolicy;
+import org.apache.maven.mercury.repository.local.m2.MetadataProcessorMock;
+import org.apache.maven.mercury.repository.metadata.Metadata;
+import org.apache.maven.mercury.repository.metadata.io.xpp3.MetadataXpp3Reader;
+import org.apache.maven.mercury.repository.remote.m2.RemoteRepositoryM2;
+import org.apache.maven.mercury.repository.virtual.VirtualRepositoryReader;
+import org.apache.maven.mercury.spi.http.client.retrieve.DefaultRetrievalRequest;
+import org.apache.maven.mercury.spi.http.client.retrieve.DefaultRetriever;
+import org.apache.maven.mercury.spi.http.client.retrieve.RetrievalResponse;
+import org.apache.maven.mercury.spi.http.server.HttpTestServer;
+import org.apache.maven.mercury.transport.api.Binding;
+import org.apache.maven.mercury.transport.api.Server;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+
+public class RemoteRepositoryCachingReaderM2Test
+extends AbstractRepositoryReaderM2Test
+{
+  MetadataXpp3Reader _reader;
+  File _testBase = new File("./target/test-classes/repo");
+  DefaultRetriever _retriever;
+  public String _port;
+  HttpTestServer _server;
+  DefaultRetrievalRequest _request;
+
+  RepositoryMetadataCache _mdCache;
+  File _cacheBase;
+
+  
+
+  //-------------------------------------------------------------------------
+  @Override
+  protected void setUp()
+  throws Exception
+  {
+    _retriever = new DefaultRetriever();
+    _server = new HttpTestServer( _testBase, "/repo" );
+    _server.start();
+    _port = String.valueOf( _server.getPort() );
+
+    _reader = new MetadataXpp3Reader();
+    _request = new DefaultRetrievalRequest();
+
+    mdProcessor = new MetadataProcessorMock();
+
+    query = new ArrayList<ArtifactBasicMetadata>();
+
+    server = new Server( "test", new URL("http://localhost:"+_port+"/repo") );
+    
+    RepositoryUpdatePolicy up = new RepositoryUpdateIntervalPolicy( RepositoryUpdateIntervalPolicy.UPDATE_POLICY_DAILY );
+    
+    repo = new RemoteRepositoryM2( "testRepo", server );
+    ((RemoteRepository)repo).setUpdatePolicy( up );
+    
+    
+    reader = repo.getReader( new MetadataProcessorMock() );
+
+    _cacheBase = new File( _testBase, VirtualRepositoryReader.METADATA_CACHE_DIR );
+    _cacheBase.delete();
+    _cacheBase.mkdirs();
+    
+    _mdCache = VirtualRepositoryReader.getCache( _testBase );
+    
+    reader.setMetadataCache( _mdCache );
+    
+  }
+  //-------------------------------------------------------------------------
+  @Override
+  protected void tearDown()
+  throws Exception
+  {
+      super.tearDown();
+      _server.stop();
+      _server.destroy();
+  }
+  //-------------------------------------------------------------------------
+  private void validateMmd( Metadata mmd )
+  {
+    assertNotNull( mmd );
+    assertEquals("a", mmd.getGroupId() );
+    assertEquals("a", mmd.getArtifactId() );
+
+    assertNotNull( mmd.getVersioning() );
+    
+    List<String> versions = mmd.getVersioning().getVersions();
+    
+    assertNotNull( versions );
+    assertTrue( versions.size() > 3 );
+  }
+  //-------------------------------------------------------------------------
+  public void testReadMd()
+  throws FileNotFoundException, IOException, XmlPullParserException
+  {
+      FileInputStream fis = new FileInputStream( new File( _testBase, "a/a/maven-metadata.xml") );
+     Metadata mmd = _reader.read( fis );
+     fis.close();
+     validateMmd( mmd );
+     
+     File cachedMd = new File( _cacheBase, "a/a/"+"meta-ga-"+repo.getId()+".xml" );
+     
+     assertTrue( cachedMd.exists() );
+  }
+  //-------------------------------------------------------------------------
+  public void testReadRemoteMdViaRepositoryReader()
+  throws FileNotFoundException, IOException, XmlPullParserException, RepositoryException, MetadataReaderException
+  {
+    
+    byte [] mmBuf = reader.readRawData( "a/a/maven-metadata.xml" );
+    
+    assertNotNull( mmBuf );
+    assertTrue( mmBuf.length > 1 );
+    
+    ByteArrayInputStream bais = new ByteArrayInputStream( mmBuf );
+    Metadata mmd = _reader.read( bais );
+    bais.close();
+    
+    validateMmd( mmd );
+    
+    File cachedMd = new File( _cacheBase, "a/a/"+"meta-ga-"+repo.getId()+".xml" );
+    
+    assertTrue( cachedMd.exists() );
+  }
+  //-------------------------------------------------------------------------
+  @Override
+  public void testReadLatest()
+      throws IllegalArgumentException,
+      RepositoryException
+  {
+    super.testReadLatest();
+
+    File cachedMd = new File( _cacheBase, "a/a/"+"meta-ga-"+repo.getId()+".xml" );
+    
+    assertTrue( cachedMd.exists() );
+
+    File cachedVMd = new File( _cacheBase, "a/a/a-5-SNAPSHOT/"+"meta-gav-"+repo.getId()+".xml" );
+    
+    assertTrue( cachedVMd.exists() );
+  }
+  //-------------------------------------------------------------------------
+  @Override
+  public void testReadRelease()
+      throws IllegalArgumentException,
+      RepositoryException
+  {
+    // TODO Auto-generated method stub
+    super.testReadRelease();
+  }
+  //-------------------------------------------------------------------------
+  //-------------------------------------------------------------------------
+}

Modified: maven/mercury/trunk/mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/RemoteRepositoryReaderM2Test.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/RemoteRepositoryReaderM2Test.java?rev=704292&r1=704291&r2=704292&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/RemoteRepositoryReaderM2Test.java (original)
+++ maven/mercury/trunk/mercury-it/src/test/java/org/apache/maven/mercury/repository/tests/RemoteRepositoryReaderM2Test.java Mon Oct 13 18:46:46 2008
@@ -13,10 +13,12 @@
 import org.apache.maven.mercury.artifact.ArtifactBasicMetadata;
 import org.apache.maven.mercury.builder.api.MetadataReaderException;
 import org.apache.maven.mercury.repository.api.RepositoryException;
+import org.apache.maven.mercury.repository.cache.fs.MetadataCacheFs;
 import org.apache.maven.mercury.repository.local.m2.MetadataProcessorMock;
 import org.apache.maven.mercury.repository.metadata.Metadata;
 import org.apache.maven.mercury.repository.metadata.io.xpp3.MetadataXpp3Reader;
 import org.apache.maven.mercury.repository.remote.m2.RemoteRepositoryM2;
+import org.apache.maven.mercury.repository.virtual.VirtualRepositoryReader;
 import org.apache.maven.mercury.spi.http.client.retrieve.DefaultRetrievalRequest;
 import org.apache.maven.mercury.spi.http.client.retrieve.DefaultRetriever;
 import org.apache.maven.mercury.spi.http.client.retrieve.RetrievalResponse;
@@ -34,7 +36,6 @@
   public String _port;
   HttpTestServer _server;
   DefaultRetrievalRequest _request;
-
   
 //  List<ArtifactBasicMetadata> query;
 //  MetadataProcessor mdProcessor;

Modified: maven/mercury/trunk/mercury-md/mercury-md-sat/pom.xml
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-md/mercury-md-sat/pom.xml?rev=704292&r1=704291&r2=704292&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-md/mercury-md-sat/pom.xml (original)
+++ maven/mercury/trunk/mercury-md/mercury-md-sat/pom.xml Mon Oct 13 18:46:46 2008
@@ -60,7 +60,7 @@
   	</dependency>
   	<dependency>
   		<groupId>org.apache.maven.mercury</groupId>
-  		<artifactId>mercury-repo-api</artifactId>
+  		<artifactId>mercury-repo-virtual</artifactId>
   		<version>${project.version}</version>
   	</dependency>
 	<!--  test deps -->

Modified: maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/DependencyTreeBuilder.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/DependencyTreeBuilder.java?rev=704292&r1=704291&r2=704292&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/DependencyTreeBuilder.java (original)
+++ maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/DependencyTreeBuilder.java Mon Oct 13 18:46:46 2008
@@ -17,7 +17,7 @@
 import org.apache.maven.mercury.repository.api.ArtifactBasicResults;
 import org.apache.maven.mercury.repository.api.Repository;
 import org.apache.maven.mercury.repository.api.RepositoryException;
-import org.apache.maven.mercury.repository.api.VirtualRepositoryReader;
+import org.apache.maven.mercury.repository.virtual.VirtualRepositoryReader;
 import org.codehaus.plexus.lang.DefaultLanguage;
 import org.codehaus.plexus.lang.Language;
 
@@ -78,7 +78,7 @@
     if( processors != null )
       _processors = processors;
     
-    this._reader = new VirtualRepositoryReader( repositories, processor, null );
+    this._reader = new VirtualRepositoryReader( repositories, processor );
   }
   //------------------------------------------------------------------------
   /**

Modified: maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/Messages.properties
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/Messages.properties?rev=704292&r1=704291&r2=704292&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/Messages.properties (original)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/Messages.properties Mon Oct 13 18:46:46 2008
@@ -11,4 +11,4 @@
 bad.policy=cannot parse repository update policy: {0}
 bad.interval.policy=cannot parse interval repository update policy: {0}
 
-empty.mdbytes=cannot initialize metadata object from empty byte array
\ No newline at end of file
+empty.md=cannot initialize metadata object from null 
\ No newline at end of file

Added: maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/MetadataCacheException.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/MetadataCacheException.java?rev=704292&view=auto
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/MetadataCacheException.java (added)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/MetadataCacheException.java Mon Oct 13 18:46:46 2008
@@ -0,0 +1,54 @@
+package org.apache.maven.mercury.repository.api;
+
+/**
+ *
+ *
+ * @author Oleg Gusakov
+ * @version $Id$
+ *
+ */
+public class MetadataCacheException
+extends Exception
+{
+
+  /**
+   * 
+   */
+  public MetadataCacheException()
+  {
+    // TODO Auto-generated constructor stub
+  }
+
+  /**
+   * @param message
+   */
+  public MetadataCacheException(
+      String message )
+  {
+    super( message );
+    // TODO Auto-generated constructor stub
+  }
+
+  /**
+   * @param cause
+   */
+  public MetadataCacheException(
+      Throwable cause )
+  {
+    super( cause );
+    // TODO Auto-generated constructor stub
+  }
+
+  /**
+   * @param message
+   * @param cause
+   */
+  public MetadataCacheException(
+      String message,
+      Throwable cause )
+  {
+    super( message, cause );
+    // TODO Auto-generated constructor stub
+  }
+
+}

Modified: maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RemoteRepository.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RemoteRepository.java?rev=704292&r1=704291&r2=704292&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RemoteRepository.java (original)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RemoteRepository.java Mon Oct 13 18:46:46 2008
@@ -31,4 +31,17 @@
    *  this is the Server with many useful fields to describe the home of this remote repo
    */
     Server getServer();
+    
+    /**
+     * get the update policy configured for this remote repository
+     * 
+     * @return the policy or null, if it does not exist
+     */
+    RepositoryUpdatePolicy getUpdatePolicy();
+
+    /**
+     * set the update policy configured for this remote repository
+     * 
+     */
+    void setUpdatePolicy( RepositoryUpdatePolicy updatePolicy );
 }

Modified: maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryGAMetadata.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryGAMetadata.java?rev=704292&r1=704291&r2=704292&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryGAMetadata.java (original)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryGAMetadata.java Mon Oct 13 18:46:46 2008
@@ -33,6 +33,9 @@
   
   /** GMT timestamp of the last metadata check */
   protected long lastCheck;
+  
+  /** is set true by cache implementation when determined that it's time to refresh */
+  protected transient boolean expired = false;
 
   protected RepositoryGAMetadata()
   {
@@ -53,17 +56,16 @@
   }
 
   /**
-   * @param versions
-   * @param lastCheck
+   * construct from maven 2.x maven-metadata.xml object
+   * 
+   * @param md
    * @throws MetadataException 
    */
-  public RepositoryGAMetadata( byte [] mdBytes )
+  public RepositoryGAMetadata( Metadata md )
   throws MetadataException
   {
-    if( Util.isEmpty( mdBytes ) )
-      throw new IllegalArgumentException( _lang.getMessage( "empty.mdbytes" ) );
-    
-    Metadata md = MetadataBuilder.getMetadata( mdBytes );
+    if( md == null )
+      throw new IllegalArgumentException( _lang.getMessage( "empty.md" ) );
     
     this.ga = new ArtifactCoordinates( md.getGroupId(), md.getArtifactId(), md.getVersion() );
 
@@ -74,10 +76,28 @@
       vers = md.getVersioning().getVersions();
       this.versions.addAll( vers );
     }
-      
     
     this.lastCheck = TimeUtil.getUTCTimestampAsLong();
   }
+  
+  /**
+   * copy constructor
+   * 
+   * @param md
+   * @throws MetadataException 
+   */
+  public RepositoryGAMetadata( RepositoryGAMetadata md )
+  throws MetadataException
+  {    
+    this.ga = md.getGA();
+
+    if( !Util.isEmpty( md.getVersions() ) )
+    {
+      this.versions.addAll( md.getVersions() );
+    }
+
+    this.lastCheck = TimeUtil.getUTCTimestampAsLong();
+  }
 
   public TreeSet<String> getVersions()
   {
@@ -100,4 +120,14 @@
     return ga;
   }
 
+  public boolean isExpired()
+  {
+    return expired;
+  }
+
+  public void setExpired( boolean expired )
+  {
+    this.expired = expired;
+  }
+
 }

Modified: maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryGAVMetadata.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryGAVMetadata.java?rev=704292&r1=704291&r2=704292&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryGAVMetadata.java (original)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryGAVMetadata.java Mon Oct 13 18:46:46 2008
@@ -37,6 +37,9 @@
   /** GMT timestamp of the last metadata check */
   protected long lastCheck;
   
+  /** is set true by cache implementation when determined that it's time to refresh */
+  protected transient boolean expired = false;
+  
   protected RepositoryGAVMetadata()
   {
   }
@@ -57,21 +60,19 @@
     this.classifiers = classifiers;
     this.lastCheck = TimeUtil.getUTCTimestampAsLong();
   }
+  
   /**
-   * initialization of md object from old metadata object bytes
+   * construct from maven 2.x maven-metadata.xml object
    * 
-   * @param versions
-   * @param lastCheck
+   * @param md
    * @throws MetadataException 
    */
-  public RepositoryGAVMetadata( byte [] mdBytes )
+  public RepositoryGAVMetadata( Metadata md )
   throws MetadataException
   {
-    if( Util.isEmpty( mdBytes ) )
+    if( md == null )
       throw new IllegalArgumentException( _lang.getMessage( "empty.mdbytes" ) );
     
-    Metadata md = MetadataBuilder.getMetadata( mdBytes );
-    
     this.gav = new ArtifactCoordinates( md.getGroupId(), md.getArtifactId(), md.getVersion() );
 
     List<String> versions = null;
@@ -79,12 +80,29 @@
     if( md.getVersioning() != null )
       versions = md.getVersioning().getVersions(); 
       
-    if( !Util.isEmpty( versions ) && md.getVersioning().getSnapshot() != null )
+    if( !Util.isEmpty( versions ) )
       this.snapshots.addAll( versions );
     
     this.lastCheck = TimeUtil.getUTCTimestampAsLong();
   }
 
+  /**
+   * copy constructor
+   * 
+   * @param md
+   * @throws MetadataException 
+   */
+  public RepositoryGAVMetadata( RepositoryGAVMetadata md )
+  throws MetadataException
+  {
+    this.gav = md.getGAV();
+
+    if( ! Util.isEmpty( md.getSnapshots() ) )
+      this.snapshots.addAll( md.getSnapshots() );
+    
+    this.lastCheck = TimeUtil.getUTCTimestampAsLong();
+  }
+  
   public TreeSet<String> getSnapshots()
   {
     return snapshots;
@@ -132,4 +150,14 @@
     return gav;
   }
 
+  public boolean isExpired()
+  {
+    return expired;
+  }
+
+  public void setExpired( boolean expired )
+  {
+    this.expired = expired;
+  }
+
 }

Modified: maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryMetadataCache.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryMetadataCache.java?rev=704292&r1=704291&r2=704292&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryMetadataCache.java (original)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryMetadataCache.java Mon Oct 13 18:46:46 2008
@@ -1,6 +1,7 @@
 package org.apache.maven.mercury.repository.api;
 
 import org.apache.maven.mercury.artifact.ArtifactBasicMetadata;
+import org.apache.maven.mercury.artifact.ArtifactCoordinates;
 
 /**
  * this object abstracts the existence of multiple repositories and repository
@@ -17,16 +18,66 @@
   /**
    * check if GA level metadata exists in this cache for the given repo. Read from repo, if does not exists
    * 
-   * @param bmd - bare GA coordinates of the requisted metadata
-   * @return 
+   * @param repoGuid repository GUID
+   * @param up repository update policy 
+   * @param coord bare GA coordinates of the requisted metadata
+   * @return  metadata object or null, if data does not exist or has been expired
    */
-  public RepositoryGAMetadata findGA( RemoteRepository repo, ArtifactBasicMetadata bmd );
+  public RepositoryGAMetadata findGA( String repoGuid, RepositoryUpdatePolicy up, ArtifactCoordinates coord )
+  throws MetadataCorruptionException;
   
   /**
    * check if GAV level metadata exists in this cache for the given repo. Read from repo, if does not exists
    * 
-   * @param bmd - bare GAV coordinates of the requisted metadata
+   * @param repoGuid repository GUID
+   * @param up repository update policy 
+   * @param coord bare GAV coordinates of the requisted metadata
    * @return 
    */
-  public RepositoryGAMetadata findGAV( RemoteRepository repo, ArtifactBasicMetadata bmd );
+  public RepositoryGAVMetadata findGAV( String repoGuid, RepositoryUpdatePolicy up, ArtifactCoordinates coord )
+  throws MetadataCorruptionException;
+
+  /**
+   * update stored GA metadata with a fresh copy
+   * 
+   * @param repoGuid
+   * @param gam
+   * @throws MetadataCacheException
+   */
+  public void updateGA( String repoGuid, RepositoryGAMetadata gam )
+  throws MetadataCacheException;
+
+  /**
+   * update stored GA metadata with a fresh copy
+   * 
+   * @param repoGuid
+   * @param gavm fresh metadata
+   * @throws MetadataCacheException
+   */
+  public void updateGAV( String repoGuid, RepositoryGAVMetadata gavm )
+  throws MetadataCacheException;
+
+  /**
+   * find cached raw data. Raw data is different from metadata in a sense
+   * that it does not expire does not expire, so it's either found or not.
+   * This call is crafted for caching POMs and thus ignores classifier
+   * 
+   * @param bmd
+   * @return found bytes or null, if no data was cached for this coordinates before
+   * @throws MetadataCacheException
+   */
+  public byte [] findRaw( ArtifactBasicMetadata bmd )
+  throws MetadataCacheException;
+
+  /**
+   * cache raw data. Raw data is different from metadata in a sense
+   * that it does not expire does not expire, so it's either found or not
+   * This call is crafted for caching POMs and thus ignores classifier
+   * 
+   * @param bmd
+   * @param rawBytes - bytes to cache
+   * @throws MetadataCacheException
+   */
+  public void saveRaw( ArtifactBasicMetadata bmd, byte [] rawBytes )
+  throws MetadataCacheException;
 }

Modified: maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryUpdateIntervalPolicy.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryUpdateIntervalPolicy.java?rev=704292&r1=704291&r2=704292&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryUpdateIntervalPolicy.java (original)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryUpdateIntervalPolicy.java Mon Oct 13 18:46:46 2008
@@ -26,6 +26,8 @@
   public static final String UPDATE_POLICY_INTERVAL = "interval";
   private static final int UPDATE_POLICY_INTERVAL_LENGTH = UPDATE_POLICY_INTERVAL.length();
   
+  public static final String DEFAULT_UPDATE_POLICY = UPDATE_POLICY_DAILY;
+
   private static final long NEVER = -1L;
   
   private static final long DAYLY = 3600000L*24L;
@@ -65,7 +67,7 @@
        throw new IllegalArgumentException( _lang.getMessage( "bad.policy", policy ));
   }
 
-  public boolean timeToUpdate( long lastUpdate )
+  public boolean timestampExpired( long lastUpdate )
   {
     long now =System.currentTimeMillis();
     

Modified: maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryUpdatePolicy.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryUpdatePolicy.java?rev=704292&r1=704291&r2=704292&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryUpdatePolicy.java (original)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryUpdatePolicy.java Mon Oct 13 18:46:46 2008
@@ -19,8 +19,8 @@
   /**
    * perform the calculation and decide if it's time to update
    * 
-   * @param lastUpdate
+   * @param timestamp - UTC-based timestamp
    * @return
    */
-  boolean timeToUpdate( long lastUpdate );
+  boolean timestampExpired( long timestamp );
 }

Modified: maven/mercury/trunk/mercury-repo/mercury-repo-api/src/test/java/org/apache/maven/mercury/repository/api/RepositoryUpdatePolicyIntervalTest.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-api/src/test/java/org/apache/maven/mercury/repository/api/RepositoryUpdatePolicyIntervalTest.java?rev=704292&r1=704291&r2=704292&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-api/src/test/java/org/apache/maven/mercury/repository/api/RepositoryUpdatePolicyIntervalTest.java (original)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-api/src/test/java/org/apache/maven/mercury/repository/api/RepositoryUpdatePolicyIntervalTest.java Mon Oct 13 18:46:46 2008
@@ -25,16 +25,16 @@
 
   public void testInterval()
   {
-    assertFalse( in.timeToUpdate( now ) );
-    assertTrue( in.timeToUpdate( now-80000L ) );
+    assertFalse( in.timestampExpired( now ) );
+    assertTrue( in.timestampExpired( now-80000L ) );
   }
 
   public void testDayly()
   {
     in = new RepositoryUpdateIntervalPolicy( RepositoryUpdateIntervalPolicy.UPDATE_POLICY_DAILY );
 
-    assertFalse( in.timeToUpdate( now ) );
-    assertFalse( in.timeToUpdate( now-80000L ) );
-    assertTrue( in.timeToUpdate( now - 24L*3600L*1000L - 80000L ) );
+    assertFalse( in.timestampExpired( now ) );
+    assertFalse( in.timestampExpired( now-80000L ) );
+    assertTrue( in.timestampExpired( now - 24L*3600L*1000L - 80000L ) );
   }
 }

Modified: maven/mercury/trunk/mercury-repo/mercury-repo-cache-fs/src/main/java/org/apache/maven/mercury/repository/cache/fs/CachedGAMetadata.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-cache-fs/src/main/java/org/apache/maven/mercury/repository/cache/fs/CachedGAMetadata.java?rev=704292&r1=704291&r2=704292&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-cache-fs/src/main/java/org/apache/maven/mercury/repository/cache/fs/CachedGAMetadata.java (original)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-cache-fs/src/main/java/org/apache/maven/mercury/repository/cache/fs/CachedGAMetadata.java Mon Oct 13 18:46:46 2008
@@ -8,6 +8,7 @@
 import org.apache.maven.mercury.artifact.ArtifactCoordinates;
 import org.apache.maven.mercury.repository.api.MetadataCorruptionException;
 import org.apache.maven.mercury.repository.api.RepositoryGAMetadata;
+import org.apache.maven.mercury.repository.metadata.Metadata;
 import org.apache.maven.mercury.repository.metadata.MetadataException;
 import org.apache.maven.mercury.util.Util;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
@@ -38,10 +39,10 @@
     fromXml();
   }
   
-  public CachedGAMetadata( byte [] mdBytes )
+  public CachedGAMetadata( RepositoryGAMetadata md )
   throws MetadataException
   {
-    super( mdBytes );
+    super( md );
     
     cm = new CachedMetadata();
     

Modified: maven/mercury/trunk/mercury-repo/mercury-repo-cache-fs/src/main/java/org/apache/maven/mercury/repository/cache/fs/CachedGAVMetadata.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-cache-fs/src/main/java/org/apache/maven/mercury/repository/cache/fs/CachedGAVMetadata.java?rev=704292&r1=704291&r2=704292&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-cache-fs/src/main/java/org/apache/maven/mercury/repository/cache/fs/CachedGAVMetadata.java (original)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-cache-fs/src/main/java/org/apache/maven/mercury/repository/cache/fs/CachedGAVMetadata.java Mon Oct 13 18:46:46 2008
@@ -39,10 +39,10 @@
     fromXml();
   }
   
-  public CachedGAVMetadata( byte [] mdBytes )
+  public CachedGAVMetadata( RepositoryGAVMetadata gavm )
   throws MetadataException
   {
-    super( mdBytes );
+    super( gavm );
     
     cm = new CachedMetadata();
     

Modified: maven/mercury/trunk/mercury-repo/mercury-repo-cache-fs/src/main/java/org/apache/maven/mercury/repository/cache/fs/MetadataCacheFs.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-cache-fs/src/main/java/org/apache/maven/mercury/repository/cache/fs/MetadataCacheFs.java?rev=704292&r1=704291&r2=704292&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-cache-fs/src/main/java/org/apache/maven/mercury/repository/cache/fs/MetadataCacheFs.java (original)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-cache-fs/src/main/java/org/apache/maven/mercury/repository/cache/fs/MetadataCacheFs.java Mon Oct 13 18:46:46 2008
@@ -1,6 +1,7 @@
 package org.apache.maven.mercury.repository.cache.fs;
 
 import java.io.File;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.Collections;
 import java.util.HashMap;
@@ -8,14 +9,21 @@
 
 import org.apache.maven.mercury.artifact.Artifact;
 import org.apache.maven.mercury.artifact.ArtifactBasicMetadata;
+import org.apache.maven.mercury.artifact.ArtifactCoordinates;
 import org.apache.maven.mercury.artifact.Quality;
+import org.apache.maven.mercury.artifact.version.DefaultArtifactVersion;
+import org.apache.maven.mercury.repository.api.MetadataCacheException;
+import org.apache.maven.mercury.repository.api.MetadataCorruptionException;
 import org.apache.maven.mercury.repository.api.RemoteRepository;
 import org.apache.maven.mercury.repository.api.RepositoryGAMetadata;
 import org.apache.maven.mercury.repository.api.RepositoryGAVMetadata;
 import org.apache.maven.mercury.repository.api.RepositoryMetadataCache;
+import org.apache.maven.mercury.repository.api.RepositoryUpdatePolicy;
+import org.apache.maven.mercury.util.FileLockBundle;
 import org.apache.maven.mercury.util.FileUtil;
 import org.codehaus.plexus.lang.DefaultLanguage;
 import org.codehaus.plexus.lang.Language;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 
 /**
  *
@@ -65,28 +73,164 @@
   }
 
   /**
-   * 
+   * private as it should be obtained via a call to <code>getCache()</code>
    */
   private MetadataCacheFs( File root )
   {
     this.root = root;
   }
 
-  public RepositoryGAMetadata findGA( RemoteRepository repo, ArtifactBasicMetadata bmd )
+  public RepositoryGAMetadata findGA( String repoGuid, RepositoryUpdatePolicy up, ArtifactCoordinates coord )
+  throws MetadataCorruptionException
   {
-    File gam = getGADir( bmd );
-    
-    return null;
+    try
+    {
+      File gaDir = getGADir(coord);
+      
+      File gamF = getGAFile( gaDir, repoGuid );
+      
+      CachedGAMetadata md = null;
+      
+      if( gamF.exists() )
+      {
+          md = new CachedGAMetadata( gamF );
+          
+          if( up != null && up.timestampExpired( md.getLastCheck() ) )
+            md.setExpired( true );
+      }
+      
+      return md;
+    }
+    catch( Exception e )
+    {
+      throw new MetadataCorruptionException( e.getMessage() );
+    }
   }
 
-  public RepositoryGAMetadata findGAV( RemoteRepository repo, ArtifactBasicMetadata bmd )
+  public RepositoryGAVMetadata findGAV( String repoGuid, RepositoryUpdatePolicy up, ArtifactCoordinates coord )
+  throws MetadataCorruptionException
   {
-    return null;
+    FileLockBundle lock = null;
+    try
+    {
+      File gavDir = getGAVDir( coord );
+
+      lock = FileUtil.lockDir( gavDir.getCanonicalPath(), 500L, 5L );
+      
+      File gavmF = getGAVFile( gavDir, repoGuid );
+      
+      CachedGAVMetadata md = null;
+      
+      if( gavmF.exists() )
+      {
+          md = new CachedGAVMetadata( gavmF );
+          
+          if( up != null && up.timestampExpired( md.getLastCheck() ) )
+            md.setExpired( true );
+      }
+      
+      return md;
+    }
+    catch( Exception e )
+    {
+      throw new MetadataCorruptionException( e.getMessage() );
+    }
+    finally
+    {
+      if( lock != null ) lock.release();
+    }
   }
   
-  private File getGADir( ArtifactBasicMetadata bmd )
+  public void updateGA( String repoGuid, RepositoryGAMetadata gam )
+  throws MetadataCacheException
+  {
+    FileLockBundle lock = null;
+    try
+    {
+      File gaDir = getGADir( gam.getGA() );
+      
+      lock = FileUtil.lockDir( gaDir.getCanonicalPath(), 500L, 5L );
+      
+      File gamF = getGAFile( gaDir, repoGuid );
+      
+      CachedGAMetadata md = new CachedGAMetadata( gam );
+      
+      md.cm.save( gamF );
+    }
+    catch( Exception e )
+    {
+      throw new MetadataCacheException( e.getMessage() );
+    }
+    finally
+    {
+      if( lock != null ) lock.release();
+    }
+  }
+
+  /* (non-Javadoc)
+   * @see org.apache.maven.mercury.repository.api.RepositoryMetadataCache#updateGAV(java.lang.String, org.apache.maven.mercury.repository.api.RepositoryGAVMetadata)
+   */
+  public void updateGAV( String repoGuid, RepositoryGAVMetadata gavm )
+  throws MetadataCacheException
   {
-    File dir = new File( root, bmd.getGroupId()+FileUtil.SEP+bmd.getArtifactId() );
+    try
+    {
+      File gavDir = getGAVDir( gavm.getGAV() );
+      
+      File gavmF = getGAVFile( gavDir, repoGuid );
+      
+      CachedGAVMetadata md = new CachedGAVMetadata( gavm );
+      
+      md.cm.save( gavmF );
+    }
+    catch( Exception e )
+    {
+      throw new MetadataCacheException( e.getMessage() );
+    }
+  }
+
+  public byte[] findRaw( ArtifactBasicMetadata bmd )
+  throws MetadataCacheException
+  {
+    try
+    {
+      // locking is provided by underlying OS, don't waste the effort
+      File f = new File( getGAVDir( bmd.getEffectiveCoordinates() )
+          , bmd.getArtifactId()+FileUtil.DASH+bmd.getVersion()+"."+bmd.getType()
+          );
+      
+      if( ! f.exists() )
+        return null;
+      
+      return FileUtil.readRawData( f );
+    }
+    catch( IOException e )
+    {
+      throw new MetadataCacheException( e.getMessage() );
+    }
+  }
+
+  public void saveRaw( ArtifactBasicMetadata bmd, byte[] rawBytes )
+  throws MetadataCacheException
+  {
+    // locking is provided by underlying OS, don't waste the effort
+    try
+    {
+      File f = new File( getGAVDir( bmd.getEffectiveCoordinates() )
+          , bmd.getArtifactId()+FileUtil.DASH+bmd.getVersion()+"."+bmd.getType()
+          );
+      
+      FileUtil.writeRawData( f, rawBytes );
+    }
+    catch( IOException e )
+    {
+      throw new MetadataCacheException( e.getMessage() );
+    }
+  }
+
+  private File getGADir( ArtifactCoordinates coord )
+  {
+    File dir = new File( root, coord.getGroupId()+FileUtil.SEP+coord.getArtifactId() );
     
     if( ! dir.exists() )
       dir.mkdirs();
@@ -94,23 +238,24 @@
     return dir;
   }
   
-  private String getGAFileName( RemoteRepository repo )
+  private File getGAFile( File gaDir, String repoGuid )
   {
-    return "";
+    return new File( gaDir, "meta-ga-"+repoGuid+".xml" );
   }
 
-  private File getGAVDir( ArtifactBasicMetadata bmd )
+  private File getGAVDir( ArtifactCoordinates coord )
   {
-    String version = bmd.getVersion();
+    String version = coord.getVersion();
     
     Quality q = new Quality( version );
     
     if( q.compareTo( Quality.SNAPSHOT_TS_QUALITY ) == 0 )
     {
-      version = Artifact.SNAPSHOT_VERSION;
+      DefaultArtifactVersion dav = new DefaultArtifactVersion(version);
+      version = dav.getBase()+"-"+ Artifact.SNAPSHOT_VERSION;
     }
     
-    File dir = new File( getGADir( bmd ), bmd.getArtifactId()+FileUtil.DASH+version );
+    File dir = new File( getGADir( coord ), coord.getArtifactId()+FileUtil.DASH+version );
     
     if( ! dir.exists() )
       dir.mkdirs();
@@ -118,4 +263,9 @@
     return dir;
   }
   
+  private File getGAVFile( File gavDir, String repoGuid )
+  {
+    return new File( gavDir, "meta-gav-"+repoGuid+".xml" );
+  }
+
 }

Modified: maven/mercury/trunk/mercury-repo/mercury-repo-cache-fs/src/test/java/org/apache/maven/mercury/repository/cache/fs/CachedGATest.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-cache-fs/src/test/java/org/apache/maven/mercury/repository/cache/fs/CachedGATest.java?rev=704292&r1=704291&r2=704292&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-cache-fs/src/test/java/org/apache/maven/mercury/repository/cache/fs/CachedGATest.java (original)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-cache-fs/src/test/java/org/apache/maven/mercury/repository/cache/fs/CachedGATest.java Mon Oct 13 18:46:46 2008
@@ -41,7 +41,7 @@
     
     omd = MetadataBuilder.getMetadata( mdBytes );
     
-    gam = new CachedGAMetadata( mdBytes );
+    gam = new CachedGAMetadata( new RepositoryGAMetadata(omd) );
   }
   
   public void testData()

Modified: maven/mercury/trunk/mercury-repo/mercury-repo-cache-fs/src/test/java/org/apache/maven/mercury/repository/cache/fs/CachedGAVTest.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-cache-fs/src/test/java/org/apache/maven/mercury/repository/cache/fs/CachedGAVTest.java?rev=704292&r1=704291&r2=704292&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-cache-fs/src/test/java/org/apache/maven/mercury/repository/cache/fs/CachedGAVTest.java (original)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-cache-fs/src/test/java/org/apache/maven/mercury/repository/cache/fs/CachedGAVTest.java Mon Oct 13 18:46:46 2008
@@ -8,6 +8,7 @@
 
 import org.apache.maven.mercury.artifact.ArtifactCoordinates;
 import org.apache.maven.mercury.repository.api.RepositoryGAMetadata;
+import org.apache.maven.mercury.repository.api.RepositoryGAVMetadata;
 import org.apache.maven.mercury.repository.metadata.Metadata;
 import org.apache.maven.mercury.repository.metadata.MetadataBuilder;
 import org.apache.maven.mercury.util.FileUtil;
@@ -41,7 +42,7 @@
     
     omd = MetadataBuilder.getMetadata( mdBytes );
     
-    gam = new CachedGAVMetadata( mdBytes );
+    gam = new CachedGAVMetadata( new RepositoryGAVMetadata(omd) );
   }
   
   public void testData()

Copied: maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/Messages.properties (from r704227, maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/resources/org/apache/maven/mercury/repository/remote/m2/Messages.properties)
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/Messages.properties?p2=maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/Messages.properties&p1=maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/resources/org/apache/maven/mercury/repository/remote/m2/Messages.properties&r1=704227&r2=704292&rev=704292&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/resources/org/apache/maven/mercury/repository/remote/m2/Messages.properties (original)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/Messages.properties Mon Oct 13 18:46:46 2008
@@ -21,4 +21,7 @@
 read.raw.exceptions=Ignoring exceptions reading {0}. Exceptions: {1}
 
 null.artifact=artifact cannot be null
-bad.artifact.file=artifact {0} file {1} does not exist
\ No newline at end of file
+bad.artifact.file=artifact {0} file {1} does not exist
+
+cached.data.problem=problem {0} reading cached data for {1}. Moving on ..
+cached.metadata.reading.exception=problem {0} reading cached data for {1}, server {2}
\ No newline at end of file

Propchange: maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/Messages.properties
------------------------------------------------------------------------------
    svn:mergeinfo = 

Modified: maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/RemoteRepositoryM2.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/RemoteRepositoryM2.java?rev=704292&r1=704291&r2=704292&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/RemoteRepositoryM2.java (original)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/RemoteRepositoryM2.java Mon Oct 13 18:46:46 2008
@@ -7,6 +7,8 @@
 import org.apache.maven.mercury.repository.api.RemoteRepository;
 import org.apache.maven.mercury.repository.api.RepositoryException;
 import org.apache.maven.mercury.repository.api.RepositoryReader;
+import org.apache.maven.mercury.repository.api.RepositoryUpdateIntervalPolicy;
+import org.apache.maven.mercury.repository.api.RepositoryUpdatePolicy;
 import org.apache.maven.mercury.repository.api.RepositoryWriter;
 import org.apache.maven.mercury.transport.api.Server;
 
@@ -16,6 +18,10 @@
 implements RemoteRepository
 {
     private Server _server;
+    
+    /** default update policy */
+    private RepositoryUpdatePolicy _updatePolicy = new RepositoryUpdateIntervalPolicy( RepositoryUpdateIntervalPolicy.DEFAULT_UPDATE_POLICY );
+    
     //----------------------------------------------------------------------------------
     public RemoteRepositoryM2( String id, Server server  )
     {
@@ -68,6 +74,17 @@
       return DEFAULT_REPOSITORY_TYPE;
     }
     //----------------------------------------------------------------------------------
+
+    public RepositoryUpdatePolicy getUpdatePolicy()
+    {
+      return _updatePolicy;
+    }
+
+    public void setUpdatePolicy( RepositoryUpdatePolicy updatePolicy )
+    {
+      this._updatePolicy = updatePolicy;
+    }
+    
     //----------------------------------------------------------------------------------
     /* (non-Javadoc)
      * @see org.apache.maven.mercury.repository.api.RemoteRepository#addLocalRepository(org.apache.maven.mercury.repository.api.LocalRepository)

Modified: maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/RemoteRepositoryReaderM2.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/RemoteRepositoryReaderM2.java?rev=704292&r1=704291&r2=704292&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/RemoteRepositoryReaderM2.java (original)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/RemoteRepositoryReaderM2.java Mon Oct 13 18:46:46 2008
@@ -7,11 +7,13 @@
 import java.io.IOException;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 
 import org.apache.maven.mercury.artifact.Artifact;
 import org.apache.maven.mercury.artifact.ArtifactBasicMetadata;
+import org.apache.maven.mercury.artifact.ArtifactCoordinates;
 import org.apache.maven.mercury.artifact.DefaultArtifact;
 import org.apache.maven.mercury.artifact.Quality;
 import org.apache.maven.mercury.artifact.version.DefaultArtifactVersion;
@@ -26,9 +28,13 @@
 import org.apache.maven.mercury.repository.api.ArtifactBasicResults;
 import org.apache.maven.mercury.repository.api.ArtifactResults;
 import org.apache.maven.mercury.repository.api.LocalRepository;
+import org.apache.maven.mercury.repository.api.MetadataCacheException;
+import org.apache.maven.mercury.repository.api.MetadataCorruptionException;
 import org.apache.maven.mercury.repository.api.RemoteRepository;
 import org.apache.maven.mercury.repository.api.Repository;
 import org.apache.maven.mercury.repository.api.RepositoryException;
+import org.apache.maven.mercury.repository.api.RepositoryGAMetadata;
+import org.apache.maven.mercury.repository.api.RepositoryGAVMetadata;
 import org.apache.maven.mercury.repository.api.RepositoryReader;
 import org.apache.maven.mercury.repository.local.m2.ArtifactLocation;
 import org.apache.maven.mercury.repository.local.m2.LocalRepositoryM2;
@@ -42,6 +48,7 @@
 import org.apache.maven.mercury.transport.api.Binding;
 import org.apache.maven.mercury.transport.api.Server;
 import org.apache.maven.mercury.util.FileUtil;
+import org.apache.maven.mercury.util.Util;
 import org.codehaus.plexus.lang.DefaultLanguage;
 import org.codehaus.plexus.lang.Language;
 /**
@@ -138,20 +145,22 @@
     return _repo;
   }
   //---------------------------------------------------------------------------------------------------------------
-  private final ArtifactLocation calculateLocation( String root, ArtifactBasicMetadata bmd, AbstractRepOpResult res ) throws RepositoryException, MetadataReaderException, MetadataException
+  private final ArtifactLocation calculateLocation( String root, ArtifactBasicMetadata bmd, AbstractRepOpResult res )
+  throws RepositoryException, MetadataReaderException, MetadataException
   {
     ArtifactLocation loc = new ArtifactLocation( root, bmd );
+    
+    Collection<String> versions = null;
+    try
+    {
+      versions = getCachedVersions( loc, bmd );
+    }
+    catch( MetadataCacheException e )
+    {
+      throw new MetadataException( e );
+    }
 
-    byte [] mdBytes = readRawData( loc.getGaPath()+FileUtil.SEP+ _repo.getMetadataName() );
-    if( mdBytes == null )
-      throw new RepositoryException( _lang.getMessage( "no.group.md", _repo.getServer().getURL().toString(), loc.getGaPath() ) );
-      
-    Metadata groupMd = MetadataBuilder.read( new ByteArrayInputStream(mdBytes) );
-    if( groupMd == null || groupMd.getVersioning() == null )
-      throw new RepositoryException( _lang.getMessage( "group.md.no.versions", _repo.getServer().getURL().toString(), loc.getGaPath() ) );
-      
-    List<String> versions = groupMd.getVersioning().getVersions();
-    if( versions == null || versions.size() < 1 )
+    if( Util.isEmpty( versions ) )
       throw new RepositoryException( _lang.getMessage( "group.md.no.versions", _repo.getServer().getURL().toString(), loc.getGaPath() ) );
 
     Quality vq = new Quality( loc.getVersion() );
@@ -199,32 +208,75 @@
     return loc;
   }
   //---------------------------------------------------------------------------------------------------------------
-  private boolean findLatestSnapshot( ArtifactBasicMetadata bmd, ArtifactLocation loc, AbstractRepOpResult res )
-  throws MetadataReaderException, MetadataException, RemoteRepositoryM2OperationException
-  {
-    DefaultArtifactVersion dav = new DefaultArtifactVersion( loc.getVersion() );
+  private Collection<String> getCachedSnapshots( ArtifactBasicMetadata bmd, ArtifactLocation loc ) 
+  throws MetadataCacheException, RepositoryException, MetadataReaderException, MetadataException
+  {  
+    RepositoryGAVMetadata gavm = null;
+    ArtifactCoordinates coord = null;
     
-    String mdPath = loc.getGavPath()+'/'+_repo.getMetadataName();
+    if( _mdCache != null )
+    {
+      try
+      {
+        coord = bmd.getEffectiveCoordinates();
+        coord.setVersion( loc.getVersion() );
 
+        gavm = _mdCache.findGAV( _repo.getId(), _repo.getUpdatePolicy(), coord );
+        if( gavm != null )
+          return gavm.getSnapshots();
+      }
+      catch( MetadataCorruptionException e )
+      {
+        // bad cached data - let's overwrite it
+        _log.error( _lang.getMessage( "cached.data.problem", e.getMessage(), bmd.toString() ) );
+      }
+    }
     
+    String mdPath = loc.getGavPath()+'/'+_repo.getMetadataName();
+
     byte [] mdBytes = readRawData( mdPath );
     if( mdBytes == null )
     {
-      res.addError( bmd, new RepositoryException( _lang.getMessage( "no.gav.md", _repo.getServer().getURL().toString(), mdPath ) ) );
-      return false;
+      throw new RepositoryException( _lang.getMessage( "no.gav.md", _repo.getServer().getURL().toString(), mdPath ) ) ;
     }
-      
+    
     Metadata gavMd = MetadataBuilder.read( new ByteArrayInputStream(mdBytes) );
-    if( gavMd == null || gavMd.getVersioning() == null )
+    if( gavMd == null )
     {
-      res.addError( bmd, new RepositoryException( _lang.getMessage( "gav.md.no.versions", _repo.getServer().getURL().toString(), mdPath ) ) );
-      return false;
+      throw new RepositoryException( _lang.getMessage( "gav.md.no.versions", _repo.getServer().getURL().toString(), mdPath ) );
     }
+    
+    gavm = new RepositoryGAVMetadata( gavMd );
+
+    if( _mdCache != null )
+    {
+      _mdCache.updateGAV( _repo.getId(), gavm );
+    }
+    
+    if( Util.isEmpty( gavm.getSnapshots() ) )
+    {
+      throw new RepositoryException( _lang.getMessage( "gav.md.no.versions", _repo.getServer().getURL().toString(), mdPath ) );
+    }
+    
+    return gavm.getSnapshots();
       
-    List<String> versions = gavMd.getVersioning().getVersions();
-    if( versions == null || versions.size() < 1 )
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  private boolean findLatestSnapshot( ArtifactBasicMetadata bmd, ArtifactLocation loc, AbstractRepOpResult res )
+  throws MetadataReaderException, MetadataException, RemoteRepositoryM2OperationException
+  {
+    DefaultArtifactVersion dav = new DefaultArtifactVersion( loc.getVersion() );
+    
+    
+    Collection<String> versions = null;
+    
+    try
+    {
+      versions = getCachedSnapshots( bmd, loc );
+    }
+    catch( Exception e )
     {
-      res.addError( bmd, new RepositoryException( _lang.getMessage( "gav.md.no.versions", _repo.getServer().getURL().toString(), mdPath ) ) );
+      res.addError( bmd, new RepositoryException( _lang.getMessage( "cached.metadata.reading.exception", e.getMessage(), bmd.toString(), _repo.getServer().getURL().toString() ) ) );
       return false;
     }
 
@@ -239,7 +291,7 @@
 
     if( ver == null )
     {
-      res.addError( bmd, new RepositoryException( _lang.getMessage( "snapshot.not.found", _repo.getServer().getURL().toString(), mdPath ) ) );
+      res.addError( bmd, new RepositoryException( _lang.getMessage( "snapshot.not.found", _repo.getServer().getURL().toString(), bmd.toString() ) ) );
       return false;
     }
     
@@ -359,6 +411,62 @@
     return ror;
   }
   //---------------------------------------------------------------------------------------------------------------
+  private Collection<String> getCachedVersions( ArtifactLocation loc, ArtifactBasicMetadata bmd )
+  throws MetadataException, MetadataReaderException, MetadataCacheException
+  {
+    RepositoryGAMetadata gam = null;
+    ArtifactCoordinates coord = null;
+    
+    // check the cache first
+    if( _mdCache != null )
+    {
+      try
+      {
+        coord = bmd.getEffectiveCoordinates();
+        coord.setVersion( loc.getVersion() );
+
+        gam = _mdCache.findGA( _repo.getId(), _repo.getUpdatePolicy(), coord );
+        if( gam != null && !gam.isExpired() )
+          return gam.getVersions();
+      }
+      catch( MetadataCorruptionException e )
+      {
+        // bad cached data - let's overwrite it
+        _log.error( _lang.getMessage( "cached.data.problem", e.getMessage(), bmd.toString() ) );
+      }
+    }
+
+    // no cached data, or it expired - move on
+    byte[] mavenMetadata = readRawData( loc.getGaPath()+FileUtil.SEP+_repo.getMetadataName() );
+    
+    if( mavenMetadata == null )
+      throw new MetadataReaderException();
+    
+    Metadata mmd = MetadataBuilder.getMetadata( mavenMetadata );
+
+    if( mmd == null || mmd.getVersioning() == null )
+    {
+      _log.warn( _lang.getMessage( "maven.bad.metadata", loc.getGaPath()+FileUtil.SEP+_repo.getMetadataName(), _repo.getId() ) );
+      return null;
+    }
+    
+    gam = new RepositoryGAMetadata( mmd );
+    
+    if( gam == null || Util.isEmpty( gam.getVersions() ) )
+    {
+      _log.warn( _lang.getMessage( "maven.metadata.no.versions", loc.getGaPath()+FileUtil.SEP+_repo.getMetadataName(), _repo.getId() ) );
+      return null;
+    }
+    
+    // cache it
+    if( _mdCache != null )
+    {
+      _mdCache.updateGA( _repo.getId(), gam );
+    }
+    
+    return gam.getVersions();
+  }
+  //---------------------------------------------------------------------------------------------------------------
   /**
    * direct disk search, no redirects, first attempt
    */
@@ -377,41 +485,18 @@
     {
       ArtifactLocation loc = new ArtifactLocation( root, bmd );
       
-      byte[] mavenMetadata;
-      try
-      {
-        mavenMetadata = readRawData( loc.getGaPath()+FileUtil.SEP+_repo.getMetadataName() );
-      }
-      catch( MetadataReaderException e )
-      {
-        continue;
-      }
-      
-      if( mavenMetadata == null )
-        continue;
+      Collection<String> versions = null;
       
-      Metadata mmd;
       try
       {
-        mmd = MetadataBuilder.getMetadata( mavenMetadata );
-      }
-      catch( MetadataException e1 )
-      {
-        res.addError( bmd, e1 );
-        continue;
-      }
-
-      if( mmd == null || mmd.getVersioning() == null )
-      {
-        _log.warn( _lang.getMessage( "maven.bad.metadata", loc.getGaPath()+FileUtil.SEP+_repo.getMetadataName(), _repo.getId() ) );
-        continue;
+        versions = getCachedVersions( loc, bmd );
+        
+        if( Util.isEmpty( versions ) )
+          continue;
       }
-      
-      List<String> versions = mmd.getVersioning().getVersions(); 
-
-      if( mmd == null || mmd.getVersioning() == null )
+      catch( Exception e )
       {
-        _log.warn( _lang.getMessage( "maven.metadata.no.versions", loc.getGaPath()+FileUtil.SEP+_repo.getMetadataName(), _repo.getId() ) );
+        res.addError( bmd, e );
         continue;
       }
 
@@ -487,6 +572,32 @@
   public byte[] readRawData( ArtifactBasicMetadata bmd, String classifier, String type )
   throws MetadataReaderException
   {
+    byte [] res = null;
+    ArtifactBasicMetadata mod = null;
+    
+    // only cache poms at the moment
+    if( _mdCache != null && "pom".equals( type ) )
+    {
+      mod = new ArtifactBasicMetadata();
+      mod.setGroupId( bmd.getGroupId() );
+      mod.setArtifactId( bmd.getArtifactId() );
+      mod.setVersion( bmd.getVersion() );
+      mod.setClassifier( classifier );
+      mod.setType( type );
+
+      try
+      {
+        res = _mdCache.findRaw( mod );
+        if( res != null )
+          return res;
+      }
+      catch( MetadataCacheException e )
+      {
+        // problems with the cache - move on
+        _log.error( _lang.getMessage( "cached.data.problem", e.getMessage(), bmd.toString() ) );
+      }
+    }
+    
     String bmdPath = bmd.getGroupId().replace( '.', '/' )
                     + '/'+bmd.getArtifactId()
                     + '/'+bmd.getVersion()
@@ -494,7 +605,21 @@
                     + '.' + (type == null ? bmd.getType() : type )
                     ;
     
-    return readRawData( bmdPath );
+    res = readRawData( bmdPath );
+    
+    if( _mdCache != null && res != null && mod != null )
+    {
+      try
+      {
+        _mdCache.saveRaw( mod, res );
+      }
+      catch( MetadataCacheException e )
+      {
+        throw new MetadataReaderException(e);
+      }
+    }
+    
+    return res; 
   }
   //---------------------------------------------------------------------------------------------------------------
   public byte[] readRawData( String path )

Modified: maven/mercury/trunk/mercury-repo/mercury-repo-virtual/pom.xml
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-virtual/pom.xml?rev=704292&r1=704291&r2=704292&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-virtual/pom.xml (original)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-virtual/pom.xml Mon Oct 13 18:46:46 2008
@@ -12,7 +12,7 @@
   <dependencies>
   	<dependency>
   		<groupId>org.apache.maven.mercury</groupId>
-  		<artifactId>mercury-repo-api</artifactId>
+  		<artifactId>mercury-repo-cache-fs</artifactId>
   		<version>${project.version}</version>
   	</dependency>
   </dependencies>

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=704292&r1=704291&r2=704292&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 Mon Oct 13 18:46:46 2008
@@ -1,5 +1,7 @@
 package org.apache.maven.mercury.repository.virtual;
 
+import java.io.File;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -19,6 +21,7 @@
 import org.apache.maven.mercury.repository.api.RepositoryException;
 import org.apache.maven.mercury.repository.api.RepositoryMetadataCache;
 import org.apache.maven.mercury.repository.api.RepositoryReader;
+import org.apache.maven.mercury.repository.cache.fs.MetadataCacheFs;
 
 /**
  * this helper class hides the necessity to talk to localRepo and a bunch of remoteRepos.
@@ -31,6 +34,8 @@
 public class VirtualRepositoryReader
 implements MetadataReader
 {
+  public static final String METADATA_CACHE_DIR = ".cache";
+
   //----------------------------------------------------------------------------------------------------------------------------
   private List<Repository>       _repositories = new ArrayList<Repository>(8);
 
@@ -47,10 +52,9 @@
   private boolean _initialized = false;
   //----------------------------------------------------------------------------------------------------------------------------
   public VirtualRepositoryReader(
-                  LocalRepository localRepository
+                  LocalRepository        localRepository
                 , List<RemoteRepository> remoteRepositories
-                , DependencyProcessor processor
-                , RepositoryMetadataCache mdCache
+                , DependencyProcessor    processor
                           )
   throws RepositoryException
   {
@@ -59,6 +63,7 @@
     
     if( processor == null )
       throw new RepositoryException( "null metadata processor" );
+
     this._processor = processor;
     
     this._localRepository = localRepository;
@@ -67,11 +72,9 @@
     
     if( remoteRepositories != null && remoteRepositories.size() > 0 )
       this._repositories.addAll( remoteRepositories );
-    
-    this._mdCache = mdCache;
   }
   //----------------------------------------------------------------------------------------------------------------------------
-  public VirtualRepositoryReader( List<Repository> repositories, DependencyProcessor processor, RepositoryMetadataCache mdCache  )
+  public VirtualRepositoryReader( List<Repository> repositories, DependencyProcessor processor  )
   throws RepositoryException
   {
     if( processor == null )
@@ -80,8 +83,6 @@
 
     if( repositories != null && repositories.size() > 0 )
       this._repositories.addAll( repositories );
-    
-    this._mdCache = mdCache;
   }
   //----------------------------------------------------------------------------------------------------------------------------
   public VirtualRepositoryReader( Repository... repositories )
@@ -92,6 +93,14 @@
         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
   {
@@ -106,15 +115,16 @@
     _processors = processors; 
   }
   //----------------------------------------------------------------------------------------------------------------------------
+  /**
+   * very important call - makes VRR sort out all the information it collected so far 
+   */
   public void init()
   throws RepositoryException
   {
     if( _initialized )
       return;
     
-    int repositoryCount = _repositories.size();
-    
-    _repositoryReaders = new RepositoryReader[ repositoryCount ];
+    _repositoryReaders = new RepositoryReader[ _repositories.size() ];
     
     // move local repo's upfront - they are faster!
     int i = 0;
@@ -125,38 +135,38 @@
       
       _repositoryReaders[ i++ ] = r.getReader(_processor);
       if( ! r.isReadOnly() )
+      {
         _localRepository = (LocalRepository)r.getReader(_processor).getRepository();
+        if( _mdCache == null )
+        {
+          try
+          {
+            _mdCache = getCache( _localRepository.getDirectory() );
+          }
+          catch( IOException e )
+          {
+            throw new RepositoryException( e.getMessage() );
+          }
+        }
+      }
     }
     
-    // the rest
+    // remote ones
     for( Repository r : _repositories )
     {
       if( r.isLocal() )
         continue;
+      
+      RepositoryReader rr = r.getReader(_processor);
+      
+      if( _mdCache != null )
+        rr.setMetadataCache( _mdCache );
 
-      _repositoryReaders[ i++ ] = r.getReader(_processor);
+      _repositoryReaders[ i++ ] = rr;
     }
     _initialized = true;
   }
   //----------------------------------------------------------------------------------------------------------------------------
-  /**
-   * 
-   * 
-   * @param query
-   * @param reader
-   * @param res
-   * @return
-   */
-  private List<ArtifactBasicMetadata> applyScanPolicy(
-                                          List<ArtifactBasicMetadata> query
-                                        , RepositoryReader reader
-                                        , AbstractRepOpResult res 
-                                                    )
-  {
-    // TODO 2008-08-26 og: implement real policy
-    return query;
-  }
-  //----------------------------------------------------------------------------------------------------------------------------
   public ArtifactBasicResults readVersions( List<ArtifactBasicMetadata> query )
   throws IllegalArgumentException, RepositoryException
   {
@@ -170,9 +180,7 @@
 
     for( RepositoryReader rr : _repositoryReaders )
     {
-      List<ArtifactBasicMetadata> leftOvers = applyScanPolicy( query, rr, res );
-
-      ArtifactBasicResults repoRes = rr.readVersions( leftOvers );
+      ArtifactBasicResults repoRes = rr.readVersions( query );
       
       if( repoRes != null && repoRes.hasResults() )
         for( ArtifactBasicMetadata key : repoRes.getResults().keySet() )

Modified: maven/mercury/trunk/mercury-repo/pom.xml
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/pom.xml?rev=704292&r1=704291&r2=704292&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-repo/pom.xml (original)
+++ maven/mercury/trunk/mercury-repo/pom.xml Mon Oct 13 18:46:46 2008
@@ -16,6 +16,7 @@
     <module>mercury-repo-local-m2</module>
     <module>mercury-repo-remote-m2</module>
     <module>mercury-repo-cache-fs</module>
+    <module>mercury-repo-virtual</module>
   </modules>
 
 </project>
\ No newline at end of file