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/11/01 00:58:49 UTC

svn commit: r709607 - in /maven/mercury/trunk: mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/ mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/sat/ mercury-md/mercury-md-sat/src/test/java/org/apache/...

Author: ogusakov
Date: Fri Oct 31 16:58:48 2008
New Revision: 709607

URL: http://svn.apache.org/viewvc?rev=709607&view=rev
Log:
fixed a dedupe bug

Added:
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/pom.xml
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/ArtifactLocation.java
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryM2.java
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryReaderM2.java
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryReaderM2Factory.java
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryWriterM2.java
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryWriterM2Factory.java
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/Messages.properties
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/resources/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/java/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/java/org/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/java/org/apache/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/java/org/apache/maven/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/java/org/apache/maven/mercury/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/java/org/apache/maven/mercury/repository/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/java/org/apache/maven/mercury/repository/local/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/java/org/apache/maven/mercury/repository/local/m2/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/java/org/apache/maven/mercury/repository/local/m2/MetadataProcessorMock.java
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/pgp/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/pgp/pubring.gpg   (with props)
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/pgp/secring.gpg   (with props)
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/1/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/1/a-1.pom
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/2/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/2/a-2.jar   (with props)
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/2/a-2.jar.asc
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/2/a-2.pom
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/3/
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/3/a-3.jar   (with props)
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/3/a-3.pom
    maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/maven-metadata.xml
Modified:
    maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/MetadataTreeArtifactFilter.java
    maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/sat/DefaultSatSolver.java
    maven/mercury/trunk/mercury-md/mercury-md-sat/src/test/java/org/apache/maven/mercury/metadata/sat/DefaultSatSolverTest.java

Modified: maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/MetadataTreeArtifactFilter.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/MetadataTreeArtifactFilter.java?rev=709607&r1=709606&r2=709607&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/MetadataTreeArtifactFilter.java (original)
+++ maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/MetadataTreeArtifactFilter.java Fri Oct 31 16:58:48 2008
@@ -10,6 +10,5 @@
  */
 public interface MetadataTreeArtifactFilter
 {
-  public boolean veto( ArtifactBasicMetadata md )
-  ;
+  public boolean veto( ArtifactBasicMetadata md );
 }

Modified: maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/sat/DefaultSatSolver.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/sat/DefaultSatSolver.java?rev=709607&r1=709606&r2=709607&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/sat/DefaultSatSolver.java (original)
+++ maven/mercury/trunk/mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/sat/DefaultSatSolver.java Fri Oct 31 16:58:48 2008
@@ -8,6 +8,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.TreeSet;
 
 import org.apache.maven.mercury.artifact.ArtifactBasicMetadata;
 import org.apache.maven.mercury.artifact.ArtifactMetadata;
@@ -134,13 +135,14 @@
       // as the best fit is now last
       Collections.reverse( bucket );
 
-      // we don't need duplicate GAVs
+      // the best fit now first, and we don't need duplicate GAVs
       removeDuplicateGAVs( bucket );
- 
     }
   }
   //-----------------------------------------------------------------------
-  private static final void removeDuplicateGAVs(List<MetadataTreeNode> bucket)
+  // remove duplicates, preserving the order. The first one is the most fit,
+  // so need to delete from tail
+  protected static final void removeDuplicateGAVs( List<MetadataTreeNode> bucket )
   {
     if( bucket == null || bucket.size() < 2 )
       return;
@@ -152,9 +154,16 @@
     int cnt = 0;
     
     for( int i=1; i<len; i++ )
+    {
+      MetadataTreeNode ti = bucket.get(i);
+      
       for( int j=0; j<i; j++ )
-        if( gav.compare( bucket.get(i), bucket.get(j) ) == 0 )
+        if( gav.compare( ti, bucket.get(j) ) == 0 )
+        {
           dups[cnt++] = i;
+          break;
+        }
+    }
     
     if( cnt > 0 )
       for( int i=0; i<cnt; i++ )

Modified: maven/mercury/trunk/mercury-md/mercury-md-sat/src/test/java/org/apache/maven/mercury/metadata/sat/DefaultSatSolverTest.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-md/mercury-md-sat/src/test/java/org/apache/maven/mercury/metadata/sat/DefaultSatSolverTest.java?rev=709607&r1=709606&r2=709607&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-md/mercury-md-sat/src/test/java/org/apache/maven/mercury/metadata/sat/DefaultSatSolverTest.java (original)
+++ maven/mercury/trunk/mercury-md/mercury-md-sat/src/test/java/org/apache/maven/mercury/metadata/sat/DefaultSatSolverTest.java Fri Oct 31 16:58:48 2008
@@ -192,12 +192,25 @@
     assert res.contains(a1) : "result does not contain "+a1;
   }
   //----------------------------------------------------------------------
-  public void ntestT()
+  public void testDedupe()
   {
-   for( int i=0; i<2; i++)
-     for( int j=0; j<2; j++)
-       System.out.println(i+", "+j+" -> "+f(i,j));
+    List<MetadataTreeNode> list = new ArrayList<MetadataTreeNode>();
+    
+    list.add(  new MetadataTreeNode( new ArtifactMetadata("a:a:1"), null, null ) );
+    list.add(  new MetadataTreeNode( new ArtifactMetadata("a:a:1"), null, null ) );
+    list.add(  new MetadataTreeNode( new ArtifactMetadata("a:a:1"), null, null ) );
+    list.add(  new MetadataTreeNode( new ArtifactMetadata("b:b:1"), null, null ) );
+    list.add(  new MetadataTreeNode( new ArtifactMetadata("b:b:1"), null, null ) );
+    list.add(  new MetadataTreeNode( new ArtifactMetadata("a:a:1"), null, null ) );
+    
+    DefaultSatSolver.removeDuplicateGAVs( list );
+    
+    System.out.println(list);
+    
+    assertEquals( 2, list.size() );
   }
+  
+  
   private int f( int a, int b )
   {
     return -a + b;

Added: maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/pom.xml
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/pom.xml?rev=709607&view=auto
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/pom.xml (added)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/pom.xml Fri Oct 31 16:58:48 2008
@@ -0,0 +1,41 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.maven.mercury</groupId>
+  <artifactId>mercury-repo-local-flat</artifactId>
+  <name>Mercury Local Flat Repository:  ${project.version}</name>
+  <description />
+  <parent>
+  	<groupId>org.apache.maven.mercury</groupId>
+  	<artifactId>mercury-repo</artifactId>
+  	<version>1.0.0-alpha-2-SNAPSHOT</version>
+  </parent>
+  <dependencies>
+  	<dependency>
+  		<groupId>org.apache.maven.mercury</groupId>
+  		<artifactId>mercury-repo-api</artifactId>
+  		<version>${project.version}</version>
+  	</dependency>
+  	<dependency>
+  		<groupId>commons-digester</groupId>
+  		<artifactId>commons-digester</artifactId>
+  		<version>1.8</version>
+  		<scope>test</scope>
+  	</dependency>
+  	<dependency>
+  		<groupId>org.apache.maven.mercury</groupId>
+  		<artifactId>mercury-md-shared</artifactId>
+  		<version>${project.version}</version>
+  	</dependency>
+  	<dependency>
+  		<groupId>org.apache.maven.mercury</groupId>
+  		<artifactId>mercury-util</artifactId>
+  		<version>${project.version}</version>
+  	</dependency>
+  	<dependency>
+  		<groupId>org.apache.maven.mercury</groupId>
+  		<artifactId>mercury-crypto-basic</artifactId>
+  		<version>${project.version}</version>
+      <scope>test</scope>
+  	</dependency>
+  </dependencies>
+</project>
\ No newline at end of file

Added: maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/ArtifactLocation.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/ArtifactLocation.java?rev=709607&view=auto
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/ArtifactLocation.java (added)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/ArtifactLocation.java Fri Oct 31 16:58:48 2008
@@ -0,0 +1,161 @@
+package org.apache.maven.mercury.repository.local.m2;
+
+import org.apache.maven.mercury.artifact.ArtifactBasicMetadata;
+import org.apache.maven.mercury.artifact.version.DefaultArtifactVersion;
+import org.apache.maven.mercury.util.FileUtil;
+
+/**
+ * artifact relative location data object - used by repositories to hold on to intermediate path calculations 
+ *
+ *
+ * @author Oleg Gusakov
+ * @version $Id$
+ *
+ */
+public class ArtifactLocation
+{
+  public static final String POM_EXT = ".pom";
+
+  private String prefix;
+  
+  private String gaPath;
+  private String versionDir;
+  private String baseName;
+  private String version;
+  private String classifier;
+  private String type;
+  
+  private ArtifactBasicMetadata bmd;
+  
+  public ArtifactLocation( String prefix, ArtifactBasicMetadata bmd )
+  {
+    if( prefix == null || bmd == null || bmd.getGroupId() == null || bmd.getArtifactId() == null || bmd.getVersion() == null )
+      return;
+    
+    this.bmd = bmd;
+
+    this.prefix     = prefix;
+    this.gaPath     = bmd.getGroupId().replace( '.', FileUtil.SEP_CHAR ) + FileUtil.SEP + bmd.getArtifactId();
+    this.version    = bmd.getVersion();
+    this.baseName   = bmd.getArtifactId();
+    this.versionDir = this.version;
+    this.classifier = bmd.getClassifier();
+    this.type       = bmd.getType();
+  }
+  
+  public String getRelPath()
+  {
+    return gaPath+FileUtil.SEP+versionDir+FileUtil.SEP+baseName+FileUtil.DASH+version+getDashedClassifier()+'.'+type;
+  }
+  
+  public String getRelPomPath()
+  {
+    return gaPath+FileUtil.SEP+versionDir+FileUtil.SEP+baseName+FileUtil.DASH+version+POM_EXT;
+  }
+  
+  public String getAbsPath()
+  {
+    if( prefix == null )
+      return null;
+
+    return getSeparatedPrefix() + getRelPath();
+  }
+  
+  public String getAbsPomPath()
+  {
+    if( prefix == null )
+      return null;
+
+    return getSeparatedPrefix() + getRelPomPath();
+  }
+  
+  public String getGavPath()
+  {
+    return getGaPath()+FileUtil.SEP+versionDir;
+  }
+  
+  public String getBaseVersion()
+  {
+    if( version == null )
+      return null;
+    
+    DefaultArtifactVersion dav = new DefaultArtifactVersion( version );
+    return dav.getBase();
+  }
+  
+  //---------------------------------------------------------
+  public String getGaPath()
+  {
+    return gaPath;
+  }
+  public void setGaPath( String gaPath )
+  {
+    this.gaPath = gaPath;
+  }
+  public String getVersionDir()
+  {
+    return versionDir;
+  }
+  public void setVersionDir( String versionDir )
+  {
+    this.versionDir = versionDir;
+  }
+  public String getBaseName()
+  {
+    return baseName;
+  }
+  public void setBaseName( String baseName )
+  {
+    this.baseName = baseName;
+  }
+  public String getVersion()
+  {
+    return version;
+  }
+  public void setVersion( String version )
+  {
+    this.version = version;
+  }
+  public String getClassifier()
+  {
+    return classifier;
+  }
+  public String getDashedClassifier()
+  {
+    return (classifier == null||classifier.length()<1) ? "" : FileUtil.DASH+classifier;
+  }
+  public void setClassifier( String classifier )
+  {
+    this.classifier = classifier;
+  }
+  public String getType()
+  {
+    return type;
+  }
+  public void setType( String type )
+  {
+    this.type = type;
+  }
+  public String getPrefix()
+  {
+    return prefix;
+  }
+  public String getSeparatedPrefix()
+  {
+    if( prefix == null )
+      return null;
+
+    return prefix+(prefix.endsWith( FileUtil.SEP ) ? "" : FileUtil.SEP);
+  }
+  public void setPrefix( String prefix )
+  {
+    this.prefix = prefix;
+  }
+
+  @Override
+  public String toString()
+  {
+    return bmd == null ? "no ArtifactBasicMetadata" : bmd.toString();
+  }
+  
+}
\ No newline at end of file

Added: maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryM2.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryM2.java?rev=709607&view=auto
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryM2.java (added)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryM2.java Fri Oct 31 16:58:48 2008
@@ -0,0 +1,94 @@
+package org.apache.maven.mercury.repository.local.m2;
+
+import java.io.File;
+
+import org.apache.maven.mercury.builder.api.DependencyProcessor;
+import org.apache.maven.mercury.repository.api.AbstractRepository;
+import org.apache.maven.mercury.repository.api.LocalRepository;
+import org.apache.maven.mercury.repository.api.NonExistentProtocolException;
+import org.apache.maven.mercury.repository.api.RepositoryReader;
+import org.apache.maven.mercury.repository.api.RepositoryWriter;
+import org.apache.maven.mercury.transport.api.Server;
+
+public class LocalRepositoryM2
+extends AbstractRepository
+implements LocalRepository
+{
+    private File directory;
+    
+    private static final String METADATA_NAME = "maven-metadata-local.xml";
+
+    //----------------------------------------------------------------------------------
+    public LocalRepositoryM2( Server server )
+    {
+        super( server.getId(), DEFAULT_REPOSITORY_TYPE );
+        this.directory = new File( server.getURL().getFile() );
+        this.server = server;
+        this.metadataName = METADATA_NAME;
+    }
+    //----------------------------------------------------------------------------------
+    public LocalRepositoryM2( String id, File directory )
+    {
+        super( id, DEFAULT_REPOSITORY_TYPE );
+        this.directory = directory;
+        this.metadataName = METADATA_NAME;
+    }
+    //----------------------------------------------------------------------------------
+    public LocalRepositoryM2( String id, File directory, String type )
+    {
+        super( id, type );
+        this.directory = directory;
+        this.metadataName = METADATA_NAME;
+    }
+    //----------------------------------------------------------------------------------
+    public File getDirectory()
+    {
+        return directory;
+    }
+    //----------------------------------------------------------------------------------
+    public RepositoryReader getReader( DependencyProcessor processor ) 
+    {
+      if( reader == null )
+        reader = new LocalRepositoryReaderM2( this, processor );
+
+      return reader;
+    }
+    //----------------------------------------------------------------------------------
+    // TODO oleg: what happens in multi-threaded execution?? 
+    public RepositoryReader getReader( DependencyProcessor processor, String protocol )
+    {
+       return getReader(processor);
+    }
+    //----------------------------------------------------------------------------------
+    // TODO oleg: what happens in multi-threaded execution?? 
+    public RepositoryWriter getWriter()
+    {
+      if( writer == null )
+        writer = new LocalRepositoryWriterM2(this);
+      
+      return writer;
+    }
+    //----------------------------------------------------------------------------------
+    public RepositoryWriter getWriter( String protocol )
+        throws NonExistentProtocolException
+    {
+      return getWriter();
+    }
+    //----------------------------------------------------------------------------------
+    public boolean isLocal()
+    {
+      return true;
+    }
+    //----------------------------------------------------------------------------------
+    public boolean isReadOnly()
+    {
+      return false;
+    }
+    //----------------------------------------------------------------------------------
+    public String getType()
+    {
+      return DEFAULT_REPOSITORY_TYPE;
+    }
+    //----------------------------------------------------------------------------------
+    //----------------------------------------------------------------------------------
+}

Added: maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryReaderM2.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryReaderM2.java?rev=709607&view=auto
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryReaderM2.java (added)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryReaderM2.java Fri Oct 31 16:58:48 2008
@@ -0,0 +1,576 @@
+package org.apache.maven.mercury.repository.local.m2;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.maven.mercury.artifact.Artifact;
+import org.apache.maven.mercury.artifact.ArtifactBasicMetadata;
+import org.apache.maven.mercury.artifact.DefaultArtifact;
+import org.apache.maven.mercury.artifact.Quality;
+import org.apache.maven.mercury.artifact.version.DefaultArtifactVersion;
+import org.apache.maven.mercury.artifact.version.VersionException;
+import org.apache.maven.mercury.artifact.version.VersionRange;
+import org.apache.maven.mercury.artifact.version.VersionRangeFactory;
+import org.apache.maven.mercury.builder.api.DependencyProcessor;
+import org.apache.maven.mercury.builder.api.MetadataReader;
+import org.apache.maven.mercury.builder.api.MetadataReaderException;
+import org.apache.maven.mercury.crypto.api.StreamObserverException;
+import org.apache.maven.mercury.crypto.api.StreamVerifier;
+import org.apache.maven.mercury.crypto.api.StreamVerifierException;
+import org.apache.maven.mercury.crypto.api.StreamVerifierFactory;
+import org.apache.maven.mercury.repository.api.AbstracRepositoryReader;
+import org.apache.maven.mercury.repository.api.AbstractRepOpResult;
+import org.apache.maven.mercury.repository.api.AbstractRepository;
+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.Repository;
+import org.apache.maven.mercury.repository.api.RepositoryException;
+import org.apache.maven.mercury.repository.api.RepositoryReader;
+import org.apache.maven.mercury.util.FileUtil;
+import org.codehaus.plexus.lang.DefaultLanguage;
+import org.codehaus.plexus.lang.Language;
+
+public class LocalRepositoryReaderM2
+extends AbstracRepositoryReader
+implements RepositoryReader, MetadataReader
+{
+  private static final org.slf4j.Logger _log = org.slf4j.LoggerFactory.getLogger( LocalRepositoryReaderM2.class ); 
+  private static final Language _lang = new DefaultLanguage( LocalRepositoryReaderM2.class );
+  //---------------------------------------------------------------------------------------------------------------
+  private static final String [] _protocols = new String [] { "file" };
+  
+  LocalRepository _repo;
+  File _repoDir;
+  //---------------------------------------------------------------------------------------------------------------
+  public LocalRepositoryReaderM2( LocalRepository repo, DependencyProcessor mdProcessor )
+  {
+    if( repo == null )
+      throw new IllegalArgumentException("localRepo cannot be null");
+    
+    _repoDir = repo.getDirectory();
+    if( _repoDir == null )
+      throw new IllegalArgumentException("localRepo directory cannot be null");
+    
+    if( !_repoDir.exists() )
+      throw new IllegalArgumentException("localRepo directory \""+_repoDir.getAbsolutePath()+"\" should exist");
+
+    _repo = repo;
+    
+    if( mdProcessor == null )
+      throw new IllegalArgumentException("MetadataProcessor cannot be null ");
+    
+    setDependencyProcessor(  mdProcessor );
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  public Repository getRepository()
+  {
+    return _repo;
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  private static ArtifactLocation calculateLocation( String root, ArtifactBasicMetadata bmd, AbstractRepOpResult res )
+  {
+    ArtifactLocation loc = new ArtifactLocation( root, bmd );
+
+    File   gaDir = new File( root, loc.getGaPath() );
+    
+    if( !gaDir.exists() )
+    {
+      res.addError( bmd, new RepositoryException( _lang.getMessage( "ga.not.found", bmd.toString(), loc.getGaPath() ) ) );
+      return null;
+    }
+    
+    Quality vq = new Quality( loc.getVersion() );
+    
+    // RELEASE = LATEST - SNAPSHOTs
+    if( Artifact.RELEASE_VERSION.equals( loc.getVersion() )
+        ||
+        Artifact.LATEST_VERSION.equals( loc.getVersion() ) 
+      )
+    {
+      boolean noSnapshots = Artifact.RELEASE_VERSION.equals( loc.getVersion() );
+      loc.setVersion( null );
+      DefaultArtifactVersion tempDav = null;
+      DefaultArtifactVersion tempDav2 = null;
+
+      File [] files = gaDir.listFiles();
+
+      // find latest
+      for( File vf : files )
+      {
+        if( vf.isFile() )
+          continue;
+        
+        String vn = vf.getName();
+        
+        // RELEASE?
+        if( noSnapshots && vn.endsWith( Artifact.SNAPSHOT_VERSION ))
+          continue;
+        
+        if( loc.getVersion() == null )
+        {
+          loc.setVersion( vn );
+          tempDav = new DefaultArtifactVersion( vn );
+          continue;
+        }
+        
+        tempDav2 = new DefaultArtifactVersion( vn );
+        if( tempDav2.compareTo( tempDav ) > 0 )
+        {
+          loc.setVersion( vn );
+          tempDav = tempDav2;
+        }
+        
+      }
+
+      if( loc.getVersion() == null )
+      {
+        res.addError( bmd, new RepositoryException( _lang.getMessage( "gav.not.found", bmd.toString(), loc.getGaPath() ) ) );
+        return null;
+      }
+      
+      // LATEST is a SNAPSHOT :(
+      if( loc.getVersion().endsWith( Artifact.SNAPSHOT_VERSION ) )
+      {
+        loc.setVersionDir( loc.getVersion() );
+
+        if( !findLatestSnapshot( bmd, loc, res ) )
+          return null;
+      }
+      else
+        // R or L found and actual captured in loc.version
+        loc.setVersionDir( loc.getVersion() );
+    }
+    // regular snapshot requested
+    else if( loc.getVersion().endsWith( Artifact.SNAPSHOT_VERSION ) )
+    {
+      File gavDir = new File( gaDir, loc.getVersion() );
+      if( !gavDir.exists() )
+      {
+        res.addError( bmd, new RepositoryException( _lang.getMessage( "gavdir.not.found", bmd.toString(), gavDir.getAbsolutePath() ) ) );
+        return null;
+      }
+      
+      if( !findLatestSnapshot( bmd, loc, res ) )
+        return null;
+        
+    }
+    // time stamped snapshot requested
+    else if( vq.equals( Quality.SNAPSHOT_TS_QUALITY ))
+    {
+      loc.setVersionDir( loc.getBaseVersion()+FileUtil.DASH+Artifact.SNAPSHOT_VERSION );
+    }
+    
+    return loc;
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  public ArtifactResults readArtifacts( Collection<ArtifactBasicMetadata> query )
+      throws RepositoryException,
+      IllegalArgumentException
+  {
+    if( query == null || query.isEmpty() )
+      throw new IllegalArgumentException( _lang.getMessage( "empty.query", query==null?"null":"empty" ) );
+    
+    ArtifactResults res = new ArtifactResults();
+    
+    Set<StreamVerifierFactory> vFacs = null;
+    
+    if( _repo.hasServer() && _repo.getServer().hasReaderStreamVerifierFactories() )
+      vFacs = _repo.getServer().getReaderStreamVerifierFactories();
+    
+    for( ArtifactBasicMetadata bmd : query )
+    {
+      DefaultArtifact da = bmd instanceof DefaultArtifact ? (DefaultArtifact)bmd : new DefaultArtifact( bmd );
+      
+      ArtifactLocation loc = calculateLocation( _repoDir.getAbsolutePath(), bmd, res );
+      
+      if( loc == null )
+        continue;
+      
+      File binary = new File( loc.getAbsPath() );
+      
+      // binary calculated 
+      if( ! binary.exists() )
+      {
+        res.addError( bmd, new RepositoryException( _lang.getMessage( "binary.not.found", bmd.toString(), binary.getAbsolutePath() ) ) );
+        continue;
+      }
+
+      try // reading pom if one exists
+      {
+        if( checkFile( binary, vFacs ) )
+          da.setFile( binary );
+
+        if( "pom".equals( bmd.getType() ) ) 
+        {
+            da.setPomBlob( FileUtil.readRawData( binary ) );
+        }
+        else
+        {
+          File pomFile = new File( loc.getAbsPomPath() );
+          if( pomFile.exists() )
+          {
+            if( checkFile( pomFile, vFacs ) )
+              da.setPomBlob( FileUtil.readRawData( pomFile ) );
+          }
+          else
+            _log.warn( _lang.getMessage( "pom.not.found", bmd.toString()) );
+        }
+
+        da.setVersion( loc.getVersion() );
+        res.add( bmd, da );
+      }
+      catch( Exception e )
+      {
+        throw new RepositoryException( e );
+      }
+    }
+    return res;
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  private static boolean checkFile( File f, Set<StreamVerifierFactory> vFacs )
+  throws RepositoryException, StreamVerifierException
+  {
+    if( vFacs != null )
+    {
+      String fileName = f.getAbsolutePath();
+      
+      HashSet<StreamVerifier> vs = new HashSet<StreamVerifier>( vFacs.size() );
+      
+      for( StreamVerifierFactory svf : vFacs )
+      {
+        StreamVerifier sv = svf.newInstance();
+        String ext = sv.getAttributes().getExtension();
+        String sigFileName = fileName+(ext.startsWith( "." )?"":".")+ext;
+        File sigFile = new File( sigFileName );
+        if( sigFile.exists() )
+        {
+          try
+          {
+            sv.initSignature( FileUtil.readRawDataAsString( sigFile ) );
+          }
+          catch( IOException e )
+          {
+            throw new RepositoryException( _lang.getMessage( "cannot.read.signature.file", sigFileName, e.getMessage() ) );
+          }
+          vs.add( sv );
+        }
+        else if( ! sv.getAttributes().isLenient() )
+        {
+          throw new RepositoryException( _lang.getMessage( "no.signature.file", ext, sigFileName ) );
+        }
+        // otherwise ignore absence of signature file, if verifier is lenient
+      }
+
+      FileInputStream fin = null;
+      try
+      {
+        fin = new FileInputStream( f );
+        byte [] buf = new byte[ 1024 ];
+        int n = -1;
+        while( (n = fin.read( buf )) != -1 )
+        {
+          for( StreamVerifier sv : vs )
+            try
+            {
+              sv.bytesReady( buf, 0, n );
+            }
+            catch( StreamObserverException e )
+            {
+              if( ! sv.getAttributes().isLenient() )
+                throw new RepositoryException(e);
+            }
+        }
+        
+        for( StreamVerifier sv : vs )
+        {
+          if( sv.verifySignature() )
+          {
+            if( sv.getAttributes().isSufficient() )
+              break;
+          }
+          else
+          {
+            if( !sv.getAttributes().isLenient() )
+              throw new RepositoryException( _lang.getMessage( "signature.failed", sv.getAttributes().getExtension(), fileName ) );
+          }
+        }
+      }
+      catch( IOException e )
+      {
+        throw new RepositoryException(e);
+      }
+      finally
+      {
+        if( fin != null ) try { fin.close(); } catch( Exception any ) {}
+      }
+    }
+    return true;
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  /**
+   * 
+   */
+  public ArtifactBasicResults readDependencies( Collection<ArtifactBasicMetadata> query )
+      throws RepositoryException,
+      IllegalArgumentException
+  {
+    if( query == null || query.size() < 1 )
+      return null;
+
+    ArtifactBasicResults ror = null;
+    
+    File pomFile = null;
+    for( ArtifactBasicMetadata bmd : query )
+    {
+      String pomPath = bmd.getGroupId().replace( '.', '/' )
+                      + "/" + bmd.getArtifactId()
+                      + "/" + bmd.getVersion()
+                      + "/" + bmd.getArtifactId()+'-'+bmd.getVersion()
+                      + ".pom"
+                      ;
+      
+      pomFile = new File( _repoDir, pomPath );
+      if( ! pomFile.exists() )
+      {
+        _log.warn( "file \""+pomPath+"\" does not exist in local repo" );
+        continue;
+      }
+      
+      // TODO HIGH og: delegate POM processing to maven-project
+      // for testing purpose - I plug in my test processor
+      try
+      {
+        List<ArtifactBasicMetadata> deps = _mdProcessor.getDependencies( bmd, _mdReader == null ? this : _mdReader
+                                                                       , System.getenv()
+                                                                       , System.getProperties()
+                                                                       );
+        ror = ArtifactBasicResults.add( ror, bmd, deps );
+      }
+      catch( MetadataReaderException e )
+      {
+        _log.warn( "error reading "+bmd.toString()+" dependencies", e );
+        continue;
+      }
+      
+    }
+    
+    return ror;
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  private static boolean findLatestSnapshot( ArtifactBasicMetadata bmd, ArtifactLocation loc, AbstractRepOpResult res )
+  {
+    File binary = new File( loc.getAbsPath() );
+    
+    if( binary.exists() )
+      return true;
+
+    // no real SNAPSHOT file, let's try to find one
+    File gavDir = new File( loc.getGavPath() );
+    File [] files = gavDir.listFiles();
+    loc.setVersion( null );
+    DefaultArtifactVersion tempDav = null;
+    DefaultArtifactVersion tempDav2 = null;
+    
+    int aLen = loc.getBaseName().length();
+    
+    // find latest
+    for( File vf : files )
+    {
+      if( vf.isFile() )
+        continue;
+      
+      String vn = vf.getName().substring( aLen+1 );
+      
+      // no snapshots
+      if( vn.endsWith( Artifact.SNAPSHOT_VERSION ))
+        continue;
+
+      if( loc.getVersion() == null )
+      {
+        loc.setVersion( vn );
+        tempDav = new DefaultArtifactVersion( vn );
+        continue;
+      }
+      
+      tempDav2 = new DefaultArtifactVersion( vn );
+      if( tempDav2.compareTo( tempDav ) > 0 )
+      {
+        loc.setVersion( vn );
+        tempDav = tempDav2;
+      }
+    
+    }
+
+    if( loc.getVersion() == null )
+    {
+      res.addError( bmd, new RepositoryException( _lang.getMessage( "snapshot.not.found", bmd.toString(), gavDir.getAbsolutePath() ) ) );
+      return false;
+    }
+    
+    return true;
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  /**
+   * direct disk search, no redirects - I cannot process pom files :(
+   */
+  public ArtifactBasicResults readVersions( Collection<ArtifactBasicMetadata> query )
+  throws RepositoryException, IllegalArgumentException
+  {
+    if( query == null || query.size() < 1 )
+      return null;
+    
+    ArtifactBasicResults res = new ArtifactBasicResults( query.size() );
+    
+    File gaDir = null;
+    for( ArtifactBasicMetadata bmd : query )
+    {
+      gaDir = new File( _repoDir, bmd.getGroupId().replace( '.', '/' )+"/"+bmd.getArtifactId() );
+      if( ! gaDir.exists() )
+        continue;
+      
+      File [] versionFiles = gaDir.listFiles();
+      
+      VersionRange versionQuery;
+      try
+      {
+        versionQuery = VersionRangeFactory.create( bmd.getVersion(), _repo.getVersionRangeQualityRange() );
+      }
+      catch( VersionException e )
+      {
+        res = ArtifactBasicResults.add( res, bmd, new RepositoryException(e) );
+        continue;
+      }
+      
+      Quality vq = new Quality( bmd.getVersion() );
+      
+      if(    vq.equals( Quality.FIXED_RELEASE_QUALITY ) 
+          || vq.equals( Quality.FIXED_LATEST_QUALITY )
+          || vq.equals( Quality.SNAPSHOT_QUALITY     )
+      )
+      {
+        ArtifactLocation loc = calculateLocation( _repoDir.getAbsolutePath(), bmd, res );
+        
+        if( loc == null )
+          continue;
+          
+        ArtifactBasicMetadata vmd = new ArtifactBasicMetadata();
+        vmd.setGroupId( bmd.getGroupId() );
+        vmd.setArtifactId(  bmd.getArtifactId() );
+        vmd.setClassifier( bmd.getClassifier() );
+        vmd.setType( bmd.getType() );
+        vmd.setVersion( loc.getVersion() );
+          
+        res = ArtifactBasicResults.add( res, bmd, vmd );
+        
+        continue;
+
+      }
+      
+      for( File vf : versionFiles )
+      {
+        if( !vf.isDirectory() )
+          continue;
+        
+        String version = vf.getName();
+        
+        Quality q = new Quality( version );
+        if( ! _repo.isAcceptedQuality( q ) )
+          continue;
+        
+        if( !versionQuery.includes(  vf.getName() )  )
+          continue;
+        
+        ArtifactBasicMetadata vmd = new ArtifactBasicMetadata();
+        vmd.setGroupId( bmd.getGroupId() );
+        vmd.setArtifactId(  bmd.getArtifactId() );
+        vmd.setClassifier( bmd.getClassifier() );
+        vmd.setType( bmd.getType() );
+        vmd.setVersion( vf.getName() );
+        
+        res = ArtifactBasicResults.add( res, bmd, vmd );
+      }
+    }
+    return res;
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  public byte[] readRawData( ArtifactBasicMetadata bmd, String classifier, String type )
+  throws MetadataReaderException
+  {
+    return readRawData( relPathOf(bmd, classifier, type, null ) );
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  private static String relPathOf( ArtifactBasicMetadata bmd, String classifier, String type, DefaultArtifactVersion inDav )
+  {
+    DefaultArtifactVersion dav = inDav;
+    if( inDav == null )
+      dav = new DefaultArtifactVersion( bmd.getVersion() );
+    Quality aq = dav.getQuality();
+    boolean isSnapshot = aq.equals( Quality.SNAPSHOT_QUALITY ) || aq.equals( Quality.SNAPSHOT_TS_QUALITY );
+    
+    String bmdPath = bmd.getGroupId().replace( '.', '/' )+'/'+bmd.getArtifactId()
+                +'/' + ( isSnapshot ? dav.getBase()+'-'+Artifact.SNAPSHOT_VERSION : bmd.getVersion() );
+    
+    String path = bmdPath+'/'+bmd.getBaseName(classifier)+'.' + (type == null ? bmd.getType() : type );
+    
+    return path ;
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  public byte[] readRawData( String path )
+  throws MetadataReaderException
+  {
+    File file = new File( _repoDir, path );
+    
+    if( ! file.exists() )
+      return null;
+    
+    FileInputStream fis = null;
+    
+    try
+    {
+      fis = new FileInputStream( file );
+      int len = (int)file.length();
+      byte [] pom = new byte [ len ];
+      fis.read( pom );
+      return pom;
+    }
+    catch( IOException e )
+    {
+      throw new MetadataReaderException(e);
+    }
+    finally
+    {
+      if( fis != null ) try { fis.close(); } catch( Exception any ) {}
+    }
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  public String readStringData( String path )
+  throws MetadataReaderException
+  {
+    byte [] data = readRawData( path );
+    if( data == null )
+      return null;
+
+    return new String( data );
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  public boolean canHandle( String protocol )
+  {
+    return AbstractRepository.DEFAULT_LOCAL_READ_PROTOCOL.equals( protocol );
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  public String[] getProtocols()
+  {
+    return _protocols;
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  public void close()
+  {
+  }
+  //---------------------------------------------------------------------------------------------------------------
+}

Added: maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryReaderM2Factory.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryReaderM2Factory.java?rev=709607&view=auto
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryReaderM2Factory.java (added)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryReaderM2Factory.java Fri Oct 31 16:58:48 2008
@@ -0,0 +1,33 @@
+package org.apache.maven.mercury.repository.local.m2;
+
+import org.apache.maven.mercury.builder.api.DependencyProcessor;
+import org.apache.maven.mercury.repository.api.AbstractRepository;
+import org.apache.maven.mercury.repository.api.LocalRepository;
+import org.apache.maven.mercury.repository.api.Repository;
+import org.apache.maven.mercury.repository.api.RepositoryException;
+import org.apache.maven.mercury.repository.api.RepositoryReader;
+import org.apache.maven.mercury.repository.api.RepositoryReaderFactory;
+import org.codehaus.plexus.lang.DefaultLanguage;
+import org.codehaus.plexus.lang.Language;
+
+public class LocalRepositoryReaderM2Factory
+implements RepositoryReaderFactory
+{
+  private static final Language lang = new DefaultLanguage( LocalRepositoryReaderM2Factory.class );
+  private static final LocalRepositoryReaderM2Factory factory = new LocalRepositoryReaderM2Factory();
+  
+  static 
+  {
+    AbstractRepository.register( AbstractRepository.DEFAULT_REPOSITORY_TYPE, factory  );
+  }
+  
+  public RepositoryReader getReader( Repository repo, DependencyProcessor mdProcessor)
+  throws RepositoryException
+  {
+    if( repo == null || !(repo instanceof LocalRepository) )
+      throw new RepositoryException( lang.getMessage( "bad.repository.type", repo == null ? "null" : repo.getClass().getName() ) );
+    
+    return new LocalRepositoryReaderM2( (LocalRepository)repo, mdProcessor );
+  }
+
+}

Added: maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryWriterM2.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryWriterM2.java?rev=709607&view=auto
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryWriterM2.java (added)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryWriterM2.java Fri Oct 31 16:58:48 2008
@@ -0,0 +1,415 @@
+package org.apache.maven.mercury.repository.local.m2;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.maven.mercury.artifact.Artifact;
+import org.apache.maven.mercury.artifact.Quality;
+import org.apache.maven.mercury.artifact.version.DefaultArtifactVersion;
+import org.apache.maven.mercury.crypto.api.StreamObserverException;
+import org.apache.maven.mercury.crypto.api.StreamVerifierFactory;
+import org.apache.maven.mercury.repository.api.AbstractRepository;
+import org.apache.maven.mercury.repository.api.AbstractRepositoryWriter;
+import org.apache.maven.mercury.repository.api.LocalRepository;
+import org.apache.maven.mercury.repository.api.Repository;
+import org.apache.maven.mercury.repository.api.RepositoryException;
+import org.apache.maven.mercury.repository.api.RepositoryWriter;
+import org.apache.maven.mercury.repository.metadata.AddVersionOperation;
+import org.apache.maven.mercury.repository.metadata.Metadata;
+import org.apache.maven.mercury.repository.metadata.MetadataBuilder;
+import org.apache.maven.mercury.repository.metadata.MetadataException;
+import org.apache.maven.mercury.repository.metadata.MetadataOperation;
+import org.apache.maven.mercury.repository.metadata.SetSnapshotOperation;
+import org.apache.maven.mercury.repository.metadata.Snapshot;
+import org.apache.maven.mercury.repository.metadata.SnapshotOperand;
+import org.apache.maven.mercury.repository.metadata.StringOperand;
+import org.apache.maven.mercury.transport.api.Server;
+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;
+
+public class LocalRepositoryWriterM2
+extends AbstractRepositoryWriter
+implements RepositoryWriter
+{
+  public static final String SYSTEM_PROPERTY_PARALLEL_WORKERS = "mercury.local.repo.workers";
+  public static final int  PARALLEL_WORKERS = Integer.parseInt( System.getProperty( SYSTEM_PROPERTY_PARALLEL_WORKERS, "4" ) );
+  
+  public static final long SLEEP_FOR_WORKERS_TICK = 20l;
+
+  public static final String SYSTEM_PROPERTY_SLEEP_FOR_LOCK = "mercury.local.lock.wait.millis";
+  public static final long SLEEP_FOR_LOCK = Long.parseLong(  System.getProperty( SYSTEM_PROPERTY_SLEEP_FOR_LOCK, "5000" ) );
+  
+  public static final long SLEEP_FOR_LOCK_TICK = 5l;
+
+  private static final org.slf4j.Logger _log = org.slf4j.LoggerFactory.getLogger( LocalRepositoryWriterM2.class ); 
+  private static final Language _lang = new DefaultLanguage( LocalRepositoryWriterM2.class );
+  //---------------------------------------------------------------------------------------------------------------
+  private static final String [] _protocols = new String [] { "file" };
+  
+  private final LocalRepository _repo;
+  private final File _repoDir;
+  private final ArtifactQueue _aq;
+
+  private static final ArifactWriteData LAST_ARTIFACT = new ArifactWriteData( null, null );
+  //---------------------------------------------------------------------------------------------------------------
+  public LocalRepositoryWriterM2( LocalRepository repo )
+  {
+    if( repo == null )
+      throw new IllegalArgumentException("localRepo cannot be null");
+    
+    _repoDir = repo.getDirectory();
+    if( _repoDir == null )
+      throw new IllegalArgumentException("localRepo directory cannot be null");
+    
+    if( !_repoDir.exists() )
+      throw new IllegalArgumentException("localRepo directory \""+_repoDir.getAbsolutePath()+"\" should exist");
+
+    _repo = repo;
+    _aq = null;
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  private LocalRepositoryWriterM2( LocalRepository repo, File repoDir, ArtifactQueue aq )
+  {
+    _repo = repo;
+    _repoDir = repoDir;
+    _aq = aq;
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  public Repository getRepository()
+  {
+    return _repo;
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  public boolean canHandle( String protocol )
+  {
+    return AbstractRepository.DEFAULT_LOCAL_READ_PROTOCOL.equals( protocol );
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  public String[] getProtocols()
+  {
+    return _protocols;
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  public void close()
+  {
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  public void writeArtifacts( Collection<Artifact> artifacts )
+      throws RepositoryException
+  {
+    if( artifacts == null || artifacts.size() < 1 )
+      return;
+    
+    int nWorkers = PARALLEL_WORKERS;
+    if( artifacts.size() < nWorkers )
+      nWorkers = artifacts.size();
+    
+    ArtifactQueue aq = new ArtifactQueue();
+    LocalRepositoryWriterM2 [] workers = new LocalRepositoryWriterM2[ nWorkers ];
+    
+    for( int i=0; i<nWorkers; i++ )
+    {
+      workers[ i ] = new LocalRepositoryWriterM2( _repo, _repoDir, aq );
+      workers[ i ].start();
+    }
+    
+    for( Artifact artifact : artifacts )
+    {
+      Set<StreamVerifierFactory> vFacs = null;
+      Server server = _repo.getServer();
+      if( server != null && server.hasWriterStreamVerifierFactories() )
+        vFacs = server.getWriterStreamVerifierFactories();
+      
+      if( vFacs == null ) // let it be empty, but not null
+        vFacs = new HashSet<StreamVerifierFactory>(1);
+
+      aq.addArtifact( new ArifactWriteData( artifact, vFacs ) );
+    }
+    aq.addArtifact( LAST_ARTIFACT );
+    
+    boolean alive = true;
+    while( alive )
+    {
+      alive = false;
+      for( int i=0; i<nWorkers; i++ )
+        if( workers[ i ].isAlive() )
+        {
+          alive = true;
+          try { sleep( SLEEP_FOR_WORKERS_TICK ); } catch( InterruptedException ie ) {}
+        }
+    }
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  /* (non-Javadoc)
+   * @see java.lang.Thread#run()
+   */
+  @Override
+  public void run()
+  {
+    try
+    {
+      for(;;)
+      {
+        ArifactWriteData awd = _aq.getArtifact();
+
+        if( awd == null || awd.artifact == null )
+            break;
+        
+        writeArtifact( awd.artifact, awd.vFacs );
+      }
+    }
+    catch (InterruptedException e)
+    {
+    }
+    catch( RepositoryException e )
+    {
+      throw new RuntimeException(e);
+    }
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  public void writeArtifact( final Artifact artifact, final Set<StreamVerifierFactory> vFacs )
+      throws RepositoryException
+  {
+    if( artifact == null )
+      return;
+    
+    boolean isPom = "pom".equals( artifact.getType() );
+    
+    byte [] pomBlob = artifact.getPomBlob();
+    boolean hasPomBlob = pomBlob != null && pomBlob.length > 0;
+    
+    InputStream in = artifact.getStream();
+    if( in == null )
+    {
+      File aFile = artifact.getFile();
+      if( aFile == null && !isPom )
+      {
+        throw new RepositoryException( _lang.getMessage( "artifact.no.stream", artifact.toString() ) );
+      }
+
+      try
+      {
+        in = new FileInputStream( aFile );
+      }
+      catch( FileNotFoundException e )
+      {
+        if( !isPom )
+          throw new RepositoryException( e );
+      }
+    }
+    DefaultArtifactVersion dav = new DefaultArtifactVersion( artifact.getVersion() );
+    Quality aq = dav.getQuality();
+    boolean isSnapshot = aq.equals( Quality.SNAPSHOT_QUALITY ) || aq.equals( Quality.SNAPSHOT_TS_QUALITY );
+
+    String relGroupPath = artifact.getGroupId().replace( '.', '/' )+"/"+artifact.getArtifactId();
+    String versionDirName = isSnapshot ? (dav.getBase()+'-'+Artifact.SNAPSHOT_VERSION) : artifact.getVersion();
+    String relVersionPath = relGroupPath + '/' + versionDirName;
+    
+    String lockDir = null;
+    FileLockBundle fLock = null;
+
+    try
+    {
+      
+      if( isPom )
+      {
+        if( in == null && !hasPomBlob )
+          throw new RepositoryException( _lang.getMessage( "pom.artifact.no.stream", artifact.toString() ) );
+        
+        if( in != null )
+        {
+          byte [] pomBlobBytes = FileUtil.readRawData( in );
+          hasPomBlob = pomBlobBytes != null && pomBlobBytes.length > 0;
+          if( hasPomBlob )
+            pomBlob = pomBlobBytes;
+        }
+      }
+
+      // create folders
+      lockDir = _repoDir.getAbsolutePath()+'/'+relGroupPath;
+
+      File gav = new File( lockDir );
+      gav.mkdirs();
+
+//    haveLock = FileUtil.lockDir( lockDir, SLEEP_FOR_LOCK, SLEEP_FOR_LOCK_TICK );
+//    if( !haveLock )
+//      throw new RepositoryException( _lang.getMessage( "cannot.lock.gav", lockDir, ""+SLEEP_FOR_LOCK ) );
+      fLock = FileUtil.lockDir( lockDir, SLEEP_FOR_LOCK, SLEEP_FOR_LOCK_TICK );
+      if( fLock == null )
+        throw new RepositoryException( _lang.getMessage( "cannot.lock.gav", lockDir, ""+SLEEP_FOR_LOCK ) );
+
+      String fName = _repoDir.getAbsolutePath()+'/'+relVersionPath+'/'+artifact.getBaseName()+'.'+artifact.getType();
+      
+      if( !isPom ) // first - take care of the binary
+        FileUtil.writeAndSign( fName, in, vFacs );
+
+      // GA metadata
+      File mdFile = new File( _repoDir, relGroupPath+'/'+_repo.getMetadataName() );
+      updateGAMetadata( mdFile, artifact, versionDirName, aq, vFacs );
+
+      // now - GAV metadata
+      mdFile = new File( _repoDir, relVersionPath+'/'+_repo.getMetadataName() );
+      updateGAVMetadata( mdFile, artifact, aq, vFacs );
+
+      // if classier - nothing else to do :)
+      if( artifact.hasClassifier() )
+        return;
+      
+      if( hasPomBlob )
+      {
+        FileUtil.writeAndSign( _repoDir.getAbsolutePath()+'/'+relVersionPath
+                              +'/'+artifact.getArtifactId()+'-'+artifact.getVersion()+".pom", pomBlob, vFacs
+                              );
+      }
+        
+    }
+    catch( Exception e )
+    {
+      throw new RepositoryException( e );
+    }
+    finally
+    {
+      if( fLock != null )
+        fLock.release();
+    }
+    
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  private void updateGAMetadata(  final File mdFile
+                                , final Artifact artifact
+                                , final String version
+                                , final Quality aq
+                                , final Set<StreamVerifierFactory> vFacs
+                              )
+  throws MetadataException, IOException, StreamObserverException
+  {
+    Metadata md = null;
+    
+    if( mdFile.exists() )
+    {
+      try
+      {
+        byte [] mdBytes = FileUtil.readRawData( mdFile );
+        
+        if( mdBytes == null )
+          throw new MetadataException( _lang.getMessage( "file.is.empty", mdFile.getAbsolutePath() ));
+        
+        md = MetadataBuilder.read( new ByteArrayInputStream(mdBytes) );
+      }
+      catch( MetadataException e )
+      {
+        throw e;
+      }
+    }
+    else
+    {
+      md = new Metadata();
+      md.setGroupId( artifact.getGroupId() );
+      md.setArtifactId( artifact.getArtifactId() );
+    }
+    
+    MetadataOperation mdOp = new AddVersionOperation( new StringOperand( version ) ); 
+    
+    byte [] resBytes = MetadataBuilder.changeMetadata( md, mdOp );
+
+    FileUtil.writeAndSign( mdFile.getAbsolutePath(), resBytes, vFacs );
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  private void updateGAVMetadata( final File mdFile
+                                , final Artifact artifact
+                                , final Quality aq
+                                , final Set<StreamVerifierFactory> vFacs
+                              )
+  throws MetadataException, IOException, StreamObserverException
+  {
+    Metadata md = null;
+    
+    if( mdFile.exists() )
+    {
+      byte [] mdBytes = FileUtil.readRawData( mdFile );
+      md = MetadataBuilder.read( new ByteArrayInputStream(mdBytes) );
+    }
+    else
+    {
+      md = new Metadata();
+      md.setGroupId( artifact.getGroupId() );
+      md.setArtifactId( artifact.getArtifactId() );
+      md.setVersion( artifact.getVersion() );
+    }
+    List<MetadataOperation> mdOps = new ArrayList<MetadataOperation>(2);
+    
+    if( aq.equals( Quality.SNAPSHOT_TS_QUALITY ) )
+    {
+      Snapshot sn = MetadataBuilder.createSnapshot( artifact.getVersion() );
+      sn.setLocalCopy( true );
+      mdOps.add( new SetSnapshotOperation( new SnapshotOperand(sn) ) );
+    }
+    
+    mdOps.add( new AddVersionOperation( new StringOperand(artifact.getVersion()) ) ); 
+ 
+//System.out.println("added "+artifact.getVersion());
+//System.out.flush();
+    byte [] resBytes = MetadataBuilder.changeMetadata( md, mdOps );
+    FileUtil.writeAndSign( mdFile.getAbsolutePath(), resBytes, vFacs );
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  //---------------------------------------------------------------------------------------------------------------
+}
+//=================================================================================================================
+class ArifactWriteData
+{
+  Artifact artifact;
+  Set<StreamVerifierFactory> vFacs;
+  
+  public ArifactWriteData(Artifact artifact, Set<StreamVerifierFactory> vFacs)
+  {
+    this.artifact = artifact;
+    this.vFacs = vFacs;
+  }
+}
+//=================================================================================================================
+class ArtifactQueue
+{
+  LinkedList<ArifactWriteData> queue = new LinkedList<ArifactWriteData>();
+  boolean empty = false;
+  
+  public synchronized void addArtifact( ArifactWriteData awd )
+  {
+    queue.addLast( awd );
+    empty = false;
+    notify();
+  }
+
+  public synchronized ArifactWriteData getArtifact()
+  throws InterruptedException
+  {
+    if( empty )
+      return null;
+
+    while( queue.isEmpty() )
+      wait();
+    
+    ArifactWriteData res = queue.removeFirst();
+    
+    if( res.artifact == null )
+    {
+      empty = true;
+      return null;
+    }
+
+    return res;
+  }
+}
+//=================================================================================================================

Added: maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryWriterM2Factory.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryWriterM2Factory.java?rev=709607&view=auto
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryWriterM2Factory.java (added)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryWriterM2Factory.java Fri Oct 31 16:58:48 2008
@@ -0,0 +1,32 @@
+package org.apache.maven.mercury.repository.local.m2;
+
+import org.apache.maven.mercury.repository.api.AbstractRepository;
+import org.apache.maven.mercury.repository.api.LocalRepository;
+import org.apache.maven.mercury.repository.api.Repository;
+import org.apache.maven.mercury.repository.api.RepositoryException;
+import org.apache.maven.mercury.repository.api.RepositoryWriter;
+import org.apache.maven.mercury.repository.api.RepositoryWriterFactory;
+import org.codehaus.plexus.lang.DefaultLanguage;
+import org.codehaus.plexus.lang.Language;
+
+public class LocalRepositoryWriterM2Factory
+implements RepositoryWriterFactory
+{
+  private static final Language lang = new DefaultLanguage( LocalRepositoryWriterM2Factory.class );
+  private static final LocalRepositoryWriterM2Factory factory = new LocalRepositoryWriterM2Factory();
+  
+  static 
+  {
+    AbstractRepository.register( AbstractRepository.DEFAULT_REPOSITORY_TYPE, factory  );
+  }
+  
+  public RepositoryWriter getWriter( Repository repo )
+  throws RepositoryException
+  {
+    if( repo == null || !(repo instanceof LocalRepository) )
+      throw new RepositoryException( lang.getMessage( "bad.repository.type", repo == null ? "null" : repo.getClass().getName() ) );
+    
+    return new LocalRepositoryWriterM2( (LocalRepository)repo );
+  }
+
+}

Added: maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/Messages.properties
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/Messages.properties?rev=709607&view=auto
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/Messages.properties (added)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/Messages.properties Fri Oct 31 16:58:48 2008
@@ -0,0 +1,15 @@
+bad.repository.type=repository should implement LocalRepository, instead got {0}
+empty.query=received empty query - {0}
+binary.not.found=Artifact {0} binary at not found {1} 
+ga.not.found=Artifact {0} version group not found at {1} 
+gav.not.found=No artifact version for {0} found in {1}
+snapshot.not.found=No snapshot version for {0} found in {1}
+gavdir.not.found=No directory {1} for artifact {0} 
+pom.not.found=Artifact {0} - binary exists, but POM not found in the repository 
+artifact.no.stream=Cannot find either input stream or file, associated with artifact {0}
+pom.artifact.no.stream=Cannot find either pom blob, input stream or file, associated with artifact {0}
+no.signature.file=Verifier for {0} is mandatory, but file {1} does not exist
+signature.failed=Signature "{0}": verification failed for file {1}
+cannot.read.signature.file=Cannot read signature file {0}, error: {1}
+cannot.lock.gav=Cannot lock GAV folder {0} in {1} millis
+file.is.empty=File {0} exists, but is empty. Data corruption somewhere - please repair metadata.
\ No newline at end of file

Added: maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/java/org/apache/maven/mercury/repository/local/m2/MetadataProcessorMock.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/java/org/apache/maven/mercury/repository/local/m2/MetadataProcessorMock.java?rev=709607&view=auto
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/java/org/apache/maven/mercury/repository/local/m2/MetadataProcessorMock.java (added)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/java/org/apache/maven/mercury/repository/local/m2/MetadataProcessorMock.java Fri Oct 31 16:58:48 2008
@@ -0,0 +1,92 @@
+package org.apache.maven.mercury.repository.local.m2;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.digester.Digester;
+import org.apache.maven.mercury.artifact.ArtifactBasicMetadata;
+import org.apache.maven.mercury.builder.api.DependencyProcessor;
+import org.apache.maven.mercury.builder.api.MetadataReader;
+import org.apache.maven.mercury.builder.api.MetadataReaderException;
+import org.xml.sax.SAXException;
+
+/**
+ * 
+ * a temporary thing to be replaced with real projectBuilder implementation
+ *
+ * @author Oleg Gusakov
+ * @version $Id$
+ *
+ */
+public class MetadataProcessorMock
+implements DependencyProcessor
+{
+
+  public List<ArtifactBasicMetadata> getDependencies( ArtifactBasicMetadata bmd, MetadataReader mdReader, Map env, Map sysProps )
+  throws MetadataReaderException
+  {
+    List<ArtifactBasicMetadata> deps = null;
+    
+    try
+    {
+      byte [] pomBytes = mdReader.readMetadata( bmd );
+      if( pomBytes == null )
+      {
+        throw new MetadataReaderException("no metadata found for "+bmd);
+      }
+      deps = getDeps(  pomBytes );
+      
+      return deps;
+    }
+    catch( Exception e )
+    {
+      throw new MetadataReaderException( e );
+    }
+  }
+  
+  private static final List<ArtifactBasicMetadata> getDeps( byte [] pom )
+  throws IOException, SAXException
+  {
+    if( pom == null )
+      return null;
+    
+    DependencyCreator dc = new DependencyCreator();
+    Digester digester = new Digester();
+    digester.push( dc );
+    
+    digester.addCallMethod("project/dependencies/dependency", "addMD", 6 );
+    digester.addCallParam("project/dependencies/dependency/groupId",0);
+    digester.addCallParam("project/dependencies/dependency/artifactId",1);
+    digester.addCallParam("project/dependencies/dependency/version",2);
+    digester.addCallParam("project/dependencies/dependency/type",3);
+    digester.addCallParam("project/dependencies/dependency/scope",4);
+    digester.addCallParam("project/dependencies/dependency/optional",5);
+    
+    digester.parse( new ByteArrayInputStream(pom) );
+    
+    return dc.mds;
+  }
+
+}
+//==============================================================================================
+class DependencyCreator
+{
+  List<ArtifactBasicMetadata> mds = new ArrayList<ArtifactBasicMetadata>(8);
+  
+  public void addMD( String g, String a, String v, String t, String s, String o)
+  {
+    ArtifactBasicMetadata md = new ArtifactBasicMetadata();
+    md.setGroupId(g);
+    md.setArtifactId(a);
+    md.setVersion(v);
+    md.setType(t);
+    md.setScope(s);
+    md.setOptional(o);
+
+    mds.add(md);
+  }
+}
+//==============================================================================================

Added: maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/pgp/pubring.gpg
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/pgp/pubring.gpg?rev=709607&view=auto
==============================================================================
Binary file - no diff available.

Propchange: maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/pgp/pubring.gpg
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/pgp/secring.gpg
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/pgp/secring.gpg?rev=709607&view=auto
==============================================================================
Binary file - no diff available.

Propchange: maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/pgp/secring.gpg
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/1/a-1.pom
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/1/a-1.pom?rev=709607&view=auto
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/1/a-1.pom (added)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/1/a-1.pom Fri Oct 31 16:58:48 2008
@@ -0,0 +1,19 @@
+<project>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>a</groupId>
+  <artifactId>a</artifactId>
+  <version>1</version>
+
+  <dependencies>
+    <dependency>
+      <groupId>b</groupId>
+      <artifactId>b</artifactId>
+      <version>1</version>
+    </dependency>
+    <dependency>
+      <groupId>c</groupId>
+      <artifactId>c</artifactId>
+      <version>1</version>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file

Added: maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/2/a-2.jar
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/2/a-2.jar?rev=709607&view=auto
==============================================================================
Binary file - no diff available.

Propchange: maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/2/a-2.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/2/a-2.jar.asc
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/2/a-2.jar.asc?rev=709607&view=auto
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/2/a-2.jar.asc (added)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/2/a-2.jar.asc Fri Oct 31 16:58:48 2008
@@ -0,0 +1,7 @@
+-----BEGIN PGP SIGNATURE-----
+Version: BCPG v1.40
+
+iEYEABECAAYFAkitxHsACgkQDttdkRQbxPI7ywCdHDfUKblJaNRHID0S4yuhXCGO
+oi8An2QRvn7A3KnrUq1v92t6bM4IKkMl
+=khMy
+-----END PGP SIGNATURE-----

Added: maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/2/a-2.pom
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/2/a-2.pom?rev=709607&view=auto
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/2/a-2.pom (added)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/2/a-2.pom Fri Oct 31 16:58:48 2008
@@ -0,0 +1,23 @@
+<project>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>a</groupId>
+  <artifactId>a</artifactId>
+  <version>2</version>
+
+  <dependencies>
+
+    <dependency>
+      <groupId>b</groupId>
+      <artifactId>b</artifactId>
+      <version>[1,2]</version>
+    </dependency>
+
+    <dependency>
+      <groupId>c</groupId>
+      <artifactId>c</artifactId>
+      <version>[2,3)</version>
+    </dependency>
+  </dependencies>
+
+
+</project>
\ No newline at end of file

Added: maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/3/a-3.jar
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/3/a-3.jar?rev=709607&view=auto
==============================================================================
Binary file - no diff available.

Propchange: maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/3/a-3.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/3/a-3.pom
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/3/a-3.pom?rev=709607&view=auto
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/3/a-3.pom (added)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/3/a-3.pom Fri Oct 31 16:58:48 2008
@@ -0,0 +1,19 @@
+<project>
+	<modelVersion>4.0.0</modelVersion>
+  <groupId>a</groupId>
+  <artifactId>a</artifactId>
+  <version>3</version>
+
+  <dependencies>
+    <dependency>
+      <groupId>b</groupId>
+      <artifactId>b</artifactId>
+      <version>2</version>
+    </dependency>
+    <dependency>
+      <groupId>c</groupId>
+      <artifactId>c</artifactId>
+      <version>(1,)</version>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file

Added: maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/maven-metadata.xml
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/maven-metadata.xml?rev=709607&view=auto
==============================================================================
--- maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/maven-metadata.xml (added)
+++ maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/test/resources/repo/a/a/maven-metadata.xml Fri Oct 31 16:58:48 2008
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?><metadata>
+  <groupId>a</groupId>
+  <artifactId>a</artifactId>
+  <version>4</version>
+  <versioning>
+    <release>4</release>
+    <versions>
+      <version>1</version>
+      <version>2</version>
+      <version>3</version>
+      <version>4</version>
+      <version>5-SNAPSHOT</version>
+     </versions>
+    <lastUpdated>20080424212921</lastUpdated>
+  </versioning>
+</metadata>
\ No newline at end of file



Re: svn commit: r709607 - in /maven/mercury/trunk: mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/ mercury-md/mercury-md-sat/src/main/java/org/apache/maven/mercury/metadata/sat/ mercury-md/mercury-md-sat/src/test/java/org/apache/...

Posted by Benjamin Bentmann <be...@udo.edu>.
Hi Oleg,

> Author: ogusakov
> Date: Fri Oct 31 16:58:48 2008
> New Revision: 709607
> 
> URL: http://svn.apache.org/viewvc?rev=709607&view=rev
> Log:
> fixed a dedupe bug
> 
> [...]
> Added: maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/ArtifactLocation.java
> URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/ArtifactLocation.java?rev=709607&view=auto
> ==============================================================================
> --- maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/ArtifactLocation.java (added)
> +++ maven/mercury/trunk/mercury-repo/mercury-repo-local-flat/src/main/java/org/apache/maven/mercury/repository/local/m2/ArtifactLocation.java Fri Oct 31 16:58:48 2008
> @@ -0,0 +1,161 @@
> +package org.apache.maven.mercury.repository.local.m2;
> +
> +import org.apache.maven.mercury.artifact.ArtifactBasicMetadata;
> +import org.apache.maven.mercury.artifact.version.DefaultArtifactVersion;
> +import org.apache.maven.mercury.util.FileUtil;
> +
> +/**
> + * artifact relative location data object - used by repositories to hold on to intermediate path calculations 
> + *
> + *
> + * @author Oleg Gusakov
> + * @version $Id$
> + *
> + */
> +public class ArtifactLocation
> +{
> +  public static final String POM_EXT = ".pom";
> +
> +  private String prefix;
> +  
> +  private String gaPath;
> +  private String versionDir;
> +  private String baseName;
> +  private String version;
> +  private String classifier;
> +  private String type;
> +  
> +  private ArtifactBasicMetadata bmd;
> +  
> +  public ArtifactLocation( String prefix, ArtifactBasicMetadata bmd )
> +  {
> +    if( prefix == null || bmd == null || bmd.getGroupId() == null || bmd.getArtifactId() == null || bmd.getVersion() == null )
> +      return;
> +    
> +    this.bmd = bmd;
> +
> +    this.prefix     = prefix;
> +    this.gaPath     = bmd.getGroupId().replace( '.', FileUtil.SEP_CHAR ) + FileUtil.SEP + bmd.getArtifactId();
> +    this.version    = bmd.getVersion();
> +    this.baseName   = bmd.getArtifactId();
> +    this.versionDir = this.version;
> +    this.classifier = bmd.getClassifier();
> +    this.type       = bmd.getType();
> +  }
> +  
> +  public String getRelPath()
> +  {
> +    return gaPath+FileUtil.SEP+versionDir+FileUtil.SEP+baseName+FileUtil.DASH+version+getDashedClassifier()+'.'+type;
> +  }
> +  
> +  public String getRelPomPath()
> +  {
> +    return gaPath+FileUtil.SEP+versionDir+FileUtil.SEP+baseName+FileUtil.DASH+version+POM_EXT;
> +  }
> +  
> +  public String getAbsPath()
> +  {
> +    if( prefix == null )
> +      return null;
> +
> +    return getSeparatedPrefix() + getRelPath();
> +  }
> +  
> +  public String getAbsPomPath()
> +  {
> +    if( prefix == null )
> +      return null;
> +
> +    return getSeparatedPrefix() + getRelPomPath();
> +  }
> +  
> +  public String getGavPath()
> +  {
> +    return getGaPath()+FileUtil.SEP+versionDir;
> +  }
> +  
> +  public String getBaseVersion()
> +  {
> +    if( version == null )
> +      return null;
> +    
> +    DefaultArtifactVersion dav = new DefaultArtifactVersion( version );
> +    return dav.getBase();
> +  }
> +  
> +  //---------------------------------------------------------
> +  public String getGaPath()
> +  {
> +    return gaPath;
> +  }
> +  public void setGaPath( String gaPath )
> +  {
> +    this.gaPath = gaPath;
> +  }
> +  public String getVersionDir()
> +  {
> +    return versionDir;
> +  }
> +  public void setVersionDir( String versionDir )
> +  {
> +    this.versionDir = versionDir;
> +  }
> +  public String getBaseName()
> +  {
> +    return baseName;
> +  }
> +  public void setBaseName( String baseName )
> +  {
> +    this.baseName = baseName;
> +  }
> +  public String getVersion()
> +  {
> +    return version;
> +  }
> +  public void setVersion( String version )
> +  {
> +    this.version = version;
> +  }
> +  public String getClassifier()
> +  {
> +    return classifier;
> +  }
> +  public String getDashedClassifier()
> +  {
> +    return (classifier == null||classifier.length()<1) ? "" : FileUtil.DASH+classifier;
> +  }
> +  public void setClassifier( String classifier )
> +  {
> +    this.classifier = classifier;
> +  }
> +  public String getType()
> +  {
> +    return type;
> +  }
> +  public void setType( String type )
> +  {
> +    this.type = type;
> +  }
> +  public String getPrefix()
> +  {
> +    return prefix;
> +  }
> +  public String getSeparatedPrefix()
> +  {
> +    if( prefix == null )
> +      return null;
> +
> +    return prefix+(prefix.endsWith( FileUtil.SEP ) ? "" : FileUtil.SEP);
> +  }
> +  public void setPrefix( String prefix )
> +  {
> +    this.prefix = prefix;
> +  }
> +
> +  @Override
> +  public String toString()
> +  {
> +    return bmd == null ? "no ArtifactBasicMetadata" : bmd.toString();
> +  }
> +  
> +}
> \ No newline at end of file

The recommended indentation for Java sources is 4 spaces per level [0]. 
The mentioned page also provides ready-made code styles for IDEA and 
Eclipse that might be useful. Not sure whether Milos has some code style 
for NetBeans around ;-)


Benjamin


[0] http://maven.apache.org/developers/conventions/code.html

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org