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/07/24 07:40:00 UTC

svn commit: r679278 - /maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/

Author: ogusakov
Date: Wed Jul 23 22:39:59 2008
New Revision: 679278

URL: http://svn.apache.org/viewvc?rev=679278&view=rev
Log:
revamped the project to introduced all the new concepts: active Repository, Transport and all other good things.

Added:
    maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/NonExistentProtocolException.java
    maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/RepositoryCallback.java
    maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/RepositoryException.java
    maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/RepositoryOperationResult.java
    maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/RepositoryReader.java
    maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/RepositoryWriter.java
    maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/VirtualRepositoryReader.java

Added: maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/NonExistentProtocolException.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/NonExistentProtocolException.java?rev=679278&view=auto
==============================================================================
--- maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/NonExistentProtocolException.java (added)
+++ maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/NonExistentProtocolException.java Wed Jul 23 22:39:59 2008
@@ -0,0 +1,34 @@
+package org.apache.maven.mercury.repository.api;
+
+public class NonExistentProtocolException
+    extends RepositoryException
+{
+
+  public NonExistentProtocolException()
+  {
+    // TODO Auto-generated constructor stub
+  }
+
+  public NonExistentProtocolException(
+      String message )
+  {
+    super( message );
+    // TODO Auto-generated constructor stub
+  }
+
+  public NonExistentProtocolException(
+      Throwable cause )
+  {
+    super( cause );
+    // TODO Auto-generated constructor stub
+  }
+
+  public NonExistentProtocolException(
+      String message,
+      Throwable cause )
+  {
+    super( message, cause );
+    // TODO Auto-generated constructor stub
+  }
+
+}

Added: maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/RepositoryCallback.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/RepositoryCallback.java?rev=679278&view=auto
==============================================================================
--- maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/RepositoryCallback.java (added)
+++ maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/RepositoryCallback.java Wed Jul 23 22:39:59 2008
@@ -0,0 +1,17 @@
+package org.apache.maven.mercury.repository.api;
+
+import java.util.List;
+
+/**
+ * This is a generic repository event callback. Used by all repository operations
+ * to signal end of operation and represents a list of exceptions plus a list
+ * of ArtifactBasicMetadata derivatives
+ *
+ * @author Oleg Gusakov
+ * @version $Id$
+ *
+ */
+public interface RepositoryCallback
+{
+  public void done( RepositoryOperationResult<?> result );
+}

Added: maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/RepositoryException.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/RepositoryException.java?rev=679278&view=auto
==============================================================================
--- maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/RepositoryException.java (added)
+++ maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/RepositoryException.java Wed Jul 23 22:39:59 2008
@@ -0,0 +1,59 @@
+package org.apache.maven.mercury.repository.api;
+
+/**
+ *
+ *
+ * @author Oleg Gusakov
+ * @version $Id$
+ *
+ */
+public class RepositoryException
+    extends Exception
+{
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = -1193169088723411771L;
+
+  /**
+   * 
+   */
+  public RepositoryException()
+  {
+    // TODO Auto-generated constructor stub
+  }
+
+  /**
+   * @param message
+   */
+  public RepositoryException(
+      String message )
+  {
+    super( message );
+    // TODO Auto-generated constructor stub
+  }
+
+  /**
+   * @param cause
+   */
+  public RepositoryException(
+      Throwable cause )
+  {
+    super( cause );
+    // TODO Auto-generated constructor stub
+  }
+
+  /**
+   * @param message
+   * @param cause
+   */
+  public RepositoryException(
+      String message,
+      Throwable cause )
+  {
+    super( message, cause );
+    // TODO Auto-generated constructor stub
+  }
+
+}

Added: maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/RepositoryOperationResult.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/RepositoryOperationResult.java?rev=679278&view=auto
==============================================================================
--- maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/RepositoryOperationResult.java (added)
+++ maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/RepositoryOperationResult.java Wed Jul 23 22:39:59 2008
@@ -0,0 +1,69 @@
+package org.apache.maven.mercury.repository.api;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.maven.mercury.ArtifactBasicMetadata;
+/**
+ * generic repository operation result. Represents a List of <T extends ArtifactBasicMetadata> 
+ * objects and a set of exceptions thrown in the process 
+ *
+ * @author Oleg Gusakov
+ * @version $Id$
+ *
+ * @param <T>
+ */
+public class RepositoryOperationResult<T extends ArtifactBasicMetadata>
+{
+  private Set<RepositoryException> _exceptions = Collections.synchronizedSet( new HashSet<RepositoryException>() );
+  private List<T> _results = Collections.synchronizedList( new ArrayList<T>() );
+
+  public RepositoryOperationResult()
+  {
+  }
+
+  protected void add( RepositoryException exception )
+  {
+      _exceptions.add( exception );
+  }
+
+  public Set<RepositoryException> getExceptions()
+  {
+      return _exceptions;
+  }
+
+  public String toString()
+  {
+      return _exceptions.toString();
+  }
+  
+  public boolean hasExceptions()
+  {
+      return _exceptions.size() > 0;
+  }
+  
+  public void add( T result )
+  {
+    _results.add( result );
+  }
+  
+  public void add( Collection<T> resColl )
+  {
+    _results.addAll( resColl );
+  }
+  
+  public List<T> getResults()
+  {
+    return _results;
+  }
+  
+  public boolean hasResults()
+  {
+      return _results.size() > 0;
+  }
+  
+}

Added: maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/RepositoryReader.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/RepositoryReader.java?rev=679278&view=auto
==============================================================================
--- maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/RepositoryReader.java (added)
+++ maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/RepositoryReader.java Wed Jul 23 22:39:59 2008
@@ -0,0 +1,69 @@
+package org.apache.maven.mercury.repository.api;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.maven.mercury.Artifact;
+import org.apache.maven.mercury.ArtifactBasicMetadata;
+import org.apache.maven.mercury.ArtifactMetadata;
+import org.apache.maven.mercury.DefaultArtifact;
+
+/**
+ * Repository reader API to be implemented by any repo implementation that wishes 
+ * to serve artifacts to the build process
+ *
+ *
+ * @author Oleg Gusakov
+ * @version $Id$
+ *
+ */
+public interface RepositoryReader
+{
+  /**
+   * given basic coordinates query - instantiate all available matches as ArtifactBasicMetadata objects. 
+   * Analogous to reading maven-metadata.xml file from GA folder i.e. this transforms
+   * GA[Vrange] -> [GAV1, GAV2, ... GAVn]
+   * 
+   * @param query list of MD coordinate queries to find 
+   * @return map of results - lists of available matches.  
+   * <b>If no results are found, reader should return null<b> If there were exceptions, map element will indicate 
+   * it with hasExceptions() 
+   * @throws RepositoryException
+   */
+  public Map<ArtifactBasicMetadata, RepositoryOperationResult<ArtifactBasicMetadata>> findMetadata( List<? extends ArtifactBasicMetadata> query )
+  throws RepositoryException, IllegalArgumentException;
+  
+  /**
+   * given basic coordinates query read full ArtifactMetadata objects -
+   * with dependencies as queries i.e. each dependency at this stage is an ArtifactBasicMetadata
+   * Analogous to reading pom.xml file for given GAV
+   * 
+   * @param query list of MD coordinate queries to read. They are found by previous call to findMetadata 
+   * @return result as list of available MD objects with dependencies filled in. Order is the same 
+   * as in query list. null means not found or worse
+   * @throws RepositoryException
+   */
+  public RepositoryOperationResult<ArtifactMetadata> readMetadata( List<? extends ArtifactBasicMetadata> query )
+  throws RepositoryException, IllegalArgumentException;
+
+  /**
+   * Given basic coordinates query read Artifact objects
+   * Analogous to downloading artifact binary  file into local repo for given GAV
+   * 
+   * @param query list of MD coordinate queries to read. 
+   * @return array of results - lists of available matches. Order is the same as in query list. null means not found or worse
+   * @throws RepositoryException
+   */
+  public RepositoryOperationResult<DefaultArtifact> readArtifacts( List<? extends ArtifactBasicMetadata> query )
+  throws RepositoryException, IllegalArgumentException;
+
+  /**
+   * Indicates whether this reader is wrapping the localRepo. This flag defines the necessity to download
+   * the artifact, if it was cleared by the conflict resolver but not read from a localRepo.
+   * 
+   * @param query list of MD coordinate queries to read. 
+   * @return array of results - lists of available matches. Order is the same as in query list. null means not found or worse
+   * @throws RepositoryException
+   */
+  public boolean isLocal();
+}

Added: maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/RepositoryWriter.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/RepositoryWriter.java?rev=679278&view=auto
==============================================================================
--- maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/RepositoryWriter.java (added)
+++ maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/RepositoryWriter.java Wed Jul 23 22:39:59 2008
@@ -0,0 +1,26 @@
+package org.apache.maven.mercury.repository.api;
+
+import org.apache.maven.mercury.Artifact;
+
+
+/**
+ * Repository wruter API to be implemented by any repo implementation that wishes 
+ * to store artifacts for Maven. All operations are asynchronous and can generate
+ * callback events
+ *
+ *
+ * @author Oleg Gusakov
+ * @version $Id$
+ *
+ */
+public interface RepositoryWriter
+{
+  /**
+   * write (upload) given artifact to the repository
+   * 
+   * @param artifact to upload
+   * @throws RepositoryException
+   */
+  public void writeArtifact( Artifact artifact, RepositoryCallback callback )
+  throws RepositoryException;
+}

Added: maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/VirtualRepositoryReader.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/VirtualRepositoryReader.java?rev=679278&view=auto
==============================================================================
--- maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/VirtualRepositoryReader.java (added)
+++ maven/sandbox/trunk/mercury/src/main/java/org/apache/maven/mercury/repository/api/VirtualRepositoryReader.java Wed Jul 23 22:39:59 2008
@@ -0,0 +1,142 @@
+package org.apache.maven.mercury.repository.api;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.maven.mercury.ArtifactBasicMetadata;
+import org.apache.maven.mercury.ArtifactMetadata;
+import org.apache.maven.mercury.metadata.MetadataTreeException;
+import org.apache.maven.mercury.repository.LocalRepository;
+import org.apache.maven.mercury.repository.RemoteRepository;
+
+/**
+ * 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
+{
+  //----------------------------------------------------------------------------------------------------------------------------
+  private LocalRepository        _localRepository;
+  private List<RemoteRepository> _remoteRepositories;
+  
+  private int                    _repositoryCount = 1;
+  private RepositoryReader[]     _repositoryReaders;
+  //----------------------------------------------------------------------------------------------------------------------------
+  public VirtualRepositoryReader(
+                LocalRepository localRepository
+              , List<RemoteRepository> remoteRepositories
+                          )
+  throws RepositoryException
+  {
+    if( _localRepository == null )
+      throw new RepositoryException( "null local repo" );
+    
+    this._localRepository = localRepository;
+
+    this._remoteRepositories = remoteRepositories;
+    
+    if( _remoteRepositories != null && _remoteRepositories.size() > 0 )
+      _repositoryCount += _remoteRepositories.size();
+  }
+  //----------------------------------------------------------------------------------------------------------------------------
+  public void init()
+  {
+    if( _repositoryReaders != null )
+      return;
+    
+    _repositoryReaders = new RepositoryReader[ _repositoryCount ];
+    _repositoryReaders[0] = _localRepository.getReader();
+    
+    if( _repositoryCount > 1 )
+    {
+      int i = 1;
+      for( RemoteRepository rr : _remoteRepositories )
+        _repositoryReaders[ i++ ] = rr.getReader();
+    }
+  }
+  //----------------------------------------------------------------------------------------------------------------------------
+  public Map<ArtifactBasicMetadata, List<ArtifactBasicMetadata>> findMetadata( List<? extends ArtifactBasicMetadata> query )
+  throws IllegalArgumentException, RepositoryException
+  {
+    if( query == null )
+      throw new IllegalArgumentException("null bmd supplied");
+    
+    init();
+        
+    Map<ArtifactBasicMetadata, List<ArtifactBasicMetadata>> res = null;
+
+    for( RepositoryReader rr : _repositoryReaders )
+    {
+      Map<ArtifactBasicMetadata, RepositoryOperationResult<ArtifactBasicMetadata>> repoRes = rr.findMetadata( query );
+      
+      if( repoRes != null )
+        for( ArtifactBasicMetadata key : repoRes.keySet() )
+        {
+          RepositoryOperationResult<ArtifactBasicMetadata> ror = repoRes.get( key );
+          if( ror != null && !ror.hasExceptions() && ror.hasResults() )
+          {
+            List<ArtifactBasicMetadata> rorRes = ror.getResults();
+            for( ArtifactBasicMetadata bmd : rorRes )
+              bmd.setReader(  rr );
+            
+            if( res == null )
+              res = new HashMap<ArtifactBasicMetadata, List<ArtifactBasicMetadata>>( query.size() );
+            
+            if( res.containsKey( key ) )
+              res.get( key ).addAll( rorRes );
+            else
+              res.put( key, rorRes );
+          }
+        }
+    }
+    
+    return res;
+  }
+  //----------------------------------------------------------------------------------------------------------------------------
+  public ArtifactMetadata readMetadata( ArtifactBasicMetadata bmd )
+  throws IllegalArgumentException, RepositoryException
+  {
+    if( bmd == null )
+      throw new IllegalArgumentException("null bmd supplied");
+    
+    init();
+    
+    List<ArtifactBasicMetadata> query = new ArrayList<ArtifactBasicMetadata>(1);
+    query.add( bmd );
+    
+    List<ArtifactMetadata> resList = null;
+    for( RepositoryReader rr : _repositoryReaders )
+    {
+      resList = readMetadataFromRepository( query, rr );
+      if( resList != null )
+        return resList.get( 0 );
+    }
+    
+    return null;
+  }
+  //----------------------------------------------------------------------------------------------------------------------------
+  private List<ArtifactMetadata> readMetadataFromRepository( List<ArtifactBasicMetadata> query, RepositoryReader reader )
+  throws RepositoryException
+  {
+    RepositoryOperationResult<ArtifactMetadata> res = reader.readMetadata( query );
+    if( res != null && !res.hasExceptions() && res.hasResults() )
+    {
+      List<ArtifactMetadata> resList = res.getResults();
+      for( ArtifactBasicMetadata bmd : resList )
+        bmd.setReader( reader );
+      
+      return resList;
+    }
+    
+    return null;
+  }
+  //----------------------------------------------------------------------------------------------------------------------------
+  //----------------------------------------------------------------------------------------------------------------------------
+}