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/08/23 03:07:50 UTC

svn commit: r688235 - in /maven/sandbox/trunk/mercury: mercury-it/ mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/ mercury-md/mercury-md-shared/src/test/java/org/apache/maven/mercury/repository/metadata/ mercury...

Author: ogusakov
Date: Fri Aug 22 18:07:49 2008
New Revision: 688235

URL: http://svn.apache.org/viewvc?rev=688235&view=rev
Log:
joint local/remote tests for repository reader and writer in it project, metadata is now fully included into signature generation. Added standalone utility for signing file hierarchies

Added:
    maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/FileUtilException.java
    maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/Messages.properties
    maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/TimeUtil.java
Removed:
    maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-local-m2/src/test/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryReaderM2Test.java
    maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-local-m2/src/test/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryWriterM2Test.java
Modified:
    maven/sandbox/trunk/mercury/mercury-it/pom.xml
    maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/AddVersionOperation.java
    maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/MetadataBuilder.java
    maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/RemoveVersionOperation.java
    maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/SetSnapshotOperation.java
    maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/test/java/org/apache/maven/mercury/repository/metadata/MetadataBuilderTest.java
    maven/sandbox/trunk/mercury/mercury-pom/pom.xml
    maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/AbstractRepository.java
    maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/Repository.java
    maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryWriterFactory.java
    maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-local-m2/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryM2.java
    maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-local-m2/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryWriterM2.java
    maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-local-m2/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryWriterM2Factory.java
    maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/Messages.properties
    maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/RemoteRepositoryReaderM2.java
    maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-api/src/main/java/org/apache/maven/mercury/transport/api/Binding.java
    maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DefaultDeployResponse.java
    maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DefaultDeployer.java
    maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DeployResponse.java
    maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/DefaultRetriever.java
    maven/sandbox/trunk/mercury/mercury-util/pom.xml
    maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/FileUtil.java

Modified: maven/sandbox/trunk/mercury/mercury-it/pom.xml
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-it/pom.xml?rev=688235&r1=688234&r2=688235&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-it/pom.xml (original)
+++ maven/sandbox/trunk/mercury/mercury-it/pom.xml Fri Aug 22 18:07:49 2008
@@ -10,4 +10,69 @@
   <name>Mercury Integration Tests:      ${project.version}</name>
   <description>Mercury Integration Tests</description>
 
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.mercury</groupId>
+      <artifactId>mercury-repo-api</artifactId>
+      <version>1.0.0-alpha-1-SNAPSHOT</version>
+      <scope>test</scope>
+    </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>1.0.0-alpha-1-SNAPSHOT</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.mercury</groupId>
+      <artifactId>mercury-util</artifactId>
+      <version>1.0.0-alpha-1-SNAPSHOT</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.mercury</groupId>
+      <artifactId>mercury-crypto-basic</artifactId>
+      <version>1.0.0-alpha-1-SNAPSHOT</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.mercury</groupId>
+      <artifactId>mercury-repo-local-m2</artifactId>
+      <version>1.0.0-alpha-1-SNAPSHOT</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.mercury</groupId>
+      <artifactId>mercury-repo-local-m2</artifactId>
+      <version>1.0.0-alpha-1-SNAPSHOT</version>
+      <classifier>tests</classifier>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.mercury</groupId>
+      <artifactId>mercury-repo-remote-m2</artifactId>
+      <version>1.0.0-alpha-1-SNAPSHOT</version>
+      <scope>test</scope>
+    </dependency>
+     <dependency>
+      <groupId>org.apache.maven.mercury</groupId>
+      <artifactId>mercury-transport-http</artifactId>
+      <version>1.0.0-alpha-1-SNAPSHOT</version>
+      <classifier>tests</classifier>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>commons-digester</groupId>
+      <artifactId>commons-digester</artifactId>
+      <version>1.8</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
 </project>
\ No newline at end of file

Modified: maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/AddVersionOperation.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/AddVersionOperation.java?rev=688235&r1=688234&r2=688235&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/AddVersionOperation.java (original)
+++ maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/AddVersionOperation.java Fri Aug 22 18:07:49 2008
@@ -2,6 +2,7 @@
 
 import java.util.List;
 
+import org.apache.maven.mercury.util.TimeUtil;
 import org.codehaus.plexus.i18n.DefaultLanguage;
 import org.codehaus.plexus.i18n.Language;
 
@@ -68,7 +69,7 @@
     }
     
     vs.addVersion( version );
-    vs.setLastUpdated( MetadataBuilder.getUTCTimestamp() );
+    vs.setLastUpdated( TimeUtil.getUTCTimestamp() );
     
     return true;
   }

Modified: maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/MetadataBuilder.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/MetadataBuilder.java?rev=688235&r1=688234&r2=688235&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/MetadataBuilder.java (original)
+++ maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/MetadataBuilder.java Fri Aug 22 18:07:49 2008
@@ -6,12 +6,12 @@
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 
 import org.apache.maven.mercury.artifact.Artifact;
 import org.apache.maven.mercury.repository.metadata.io.xpp3.MetadataXpp3Reader;
 import org.apache.maven.mercury.repository.metadata.io.xpp3.MetadataXpp3Writer;
+import org.apache.maven.mercury.util.TimeUtil;
 
 /**
  * utility class to help with de/serializing metadata from/to XML
@@ -44,6 +44,29 @@
   }
   
   /**
+   * instantiate Metadata from a byte array
+   * 
+   * @param in
+   * @return
+   * @throws MetadataException
+   */
+  public static Metadata getMetadata( byte [] in )
+  throws MetadataException
+  {
+    if( in == null || in.length < 10 )
+      return null;
+
+    try
+    {
+      return new MetadataXpp3Reader().read( new ByteArrayInputStream(in) );
+    }
+    catch( Exception e )
+    {
+      throw new MetadataException(e);
+    }
+  }
+  
+  /**
    * serialize metadata into xml
    * 
    * @param metadata to serialize
@@ -84,6 +107,8 @@
       return metadataBytes;
     
     Metadata metadata;
+    boolean changed = false;
+    
     if( metadataBytes == null || metadataBytes.length < 10 )
     {
       metadata = new Metadata();
@@ -96,9 +121,25 @@
     
     for( MetadataOperation op : mutators )
     {
-      boolean changed = op.perform( metadata );
+      changed = changed || op.perform( metadata );
     }
     
+    if( !changed )
+      return metadataBytes;
+    
+    return getBytes( metadata ); 
+  }
+
+  /**
+   * marshall metadata into a byte array 
+   * 
+   * @param metadata
+   * @return
+   * @throws MetadataException
+   */
+  public static byte [] getBytes( Metadata metadata )
+  throws MetadataException
+  {
     ByteArrayOutputStream out = new ByteArrayOutputStream();
     write( metadata, out );
     
@@ -118,6 +159,8 @@
   throws MetadataException
   {
     
+    boolean changed = false;
+
     if( metadata == null )
     {
       metadata = new Metadata();
@@ -126,7 +169,7 @@
     if( mutators != null && mutators.size() > 0 )
       for( MetadataOperation op : mutators )
       {
-        boolean changed = op.perform( metadata );
+        changed = changed || op.perform( metadata );
       }
     
     ByteArrayOutputStream out = new ByteArrayOutputStream();
@@ -162,7 +205,7 @@
    */
   public static void updateTimestamp( Snapshot target )
   {
-      target.setTimestamp( getUTCTimestamp() );
+      target.setTimestamp( TimeUtil.getUTCTimestamp() );
   }
   
   /**
@@ -172,29 +215,7 @@
    */
   public static void updateTimestamp( Versioning target )
   {
-      target.setLastUpdated( getUTCTimestamp() );
-  }
-  
-  /**
-   * 
-   * @return current UTC timestamp by yyyyMMddHHmmss mask
-   */
-  public static String getUTCTimestamp( )
-  {
-    return getUTCTimestamp( new Date() );
-  }
-
-  /**
-   * 
-   * @param date
-   * @return current date converted to UTC timestamp by yyyyMMddHHmmss mask
-   */
-  public static String getUTCTimestamp( Date date )
-  {
-      java.util.TimeZone timezone = java.util.TimeZone.getTimeZone( "UTC" );
-      java.text.DateFormat fmt = new java.text.SimpleDateFormat( "yyyyMMddHHmmss" );
-      fmt.setTimeZone( timezone );
-      return fmt.format( date );
+      target.setLastUpdated( TimeUtil.getUTCTimestamp() );
   }
   
   public static Snapshot createSnapshot( String version )
@@ -204,7 +225,7 @@
     if( version == null || version.length() < 3 )
       return sn;
     
-    String utc = MetadataBuilder.getUTCTimestamp();
+    String utc = TimeUtil.getUTCTimestamp();
     sn.setTimestamp( utc );
     
     if( version.endsWith( Artifact.SNAPSHOT_VERSION ))

Modified: maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/RemoveVersionOperation.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/RemoveVersionOperation.java?rev=688235&r1=688234&r2=688235&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/RemoveVersionOperation.java (original)
+++ maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/RemoveVersionOperation.java Fri Aug 22 18:07:49 2008
@@ -2,6 +2,7 @@
 
 import java.util.List;
 
+import org.apache.maven.mercury.util.TimeUtil;
 import org.codehaus.plexus.i18n.DefaultLanguage;
 import org.codehaus.plexus.i18n.Language;
 
@@ -66,7 +67,7 @@
     }
     
     vs.removeVersion( version );
-    vs.setLastUpdated( MetadataBuilder.getUTCTimestamp() );
+    vs.setLastUpdated( TimeUtil.getUTCTimestamp() );
     
     return true;
   }

Modified: maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/SetSnapshotOperation.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/SetSnapshotOperation.java?rev=688235&r1=688234&r2=688235&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/SetSnapshotOperation.java (original)
+++ maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/SetSnapshotOperation.java Fri Aug 22 18:07:49 2008
@@ -1,5 +1,6 @@
 package org.apache.maven.mercury.repository.metadata;
 
+import org.apache.maven.mercury.util.TimeUtil;
 import org.codehaus.plexus.i18n.DefaultLanguage;
 import org.codehaus.plexus.i18n.Language;
 
@@ -58,7 +59,7 @@
     }
     
     vs.setSnapshot( snapshot );
-    vs.setLastUpdated( MetadataBuilder.getUTCTimestamp() );
+    vs.setLastUpdated( TimeUtil.getUTCTimestamp() );
     
     return true;
   }

Modified: maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/test/java/org/apache/maven/mercury/repository/metadata/MetadataBuilderTest.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/test/java/org/apache/maven/mercury/repository/metadata/MetadataBuilderTest.java?rev=688235&r1=688234&r2=688235&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/test/java/org/apache/maven/mercury/repository/metadata/MetadataBuilderTest.java (original)
+++ maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/test/java/org/apache/maven/mercury/repository/metadata/MetadataBuilderTest.java Fri Aug 22 18:07:49 2008
@@ -12,6 +12,7 @@
 import junit.framework.TestCase;
 
 import org.apache.maven.mercury.util.FileUtil;
+import org.apache.maven.mercury.util.TimeUtil;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 
 /**
@@ -203,7 +204,7 @@
     Snapshot sn = new Snapshot();
     sn.setLocalCopy( false );
     sn.setBuildNumber( 35 );
-    String ts = MetadataBuilder.getUTCTimestamp();
+    String ts = TimeUtil.getUTCTimestamp();
     sn.setTimestamp( ts );
 
     byte [] resBytes = MetadataBuilder.changeMetadata( targetBytes, new SetSnapshotOperation( new SnapshotOperand(sn) ) );

Modified: maven/sandbox/trunk/mercury/mercury-pom/pom.xml
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-pom/pom.xml?rev=688235&r1=688234&r2=688235&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-pom/pom.xml (original)
+++ maven/sandbox/trunk/mercury/mercury-pom/pom.xml Fri Aug 22 18:07:49 2008
@@ -6,6 +6,7 @@
   <version>1-alpha-1-SNAPSHOT</version>
   <packaging>pom</packaging>
   <name>Mercury parent POM:                 ${project.version}</name>
+  
   <developers>
     <developer>
       <name>Jan Bartel</name>
@@ -34,6 +35,7 @@
     <mercuryVersionMd>1.0.0.-alpha-1-SNAPSHOT</mercuryVersionMd>
     <mercuryVersionRepo>1.0.0.-alpha-1-SNAPSHOT</mercuryVersionRepo>
     <mercuryVersionTransport>1.0.0.-alpha-1-SNAPSHOT</mercuryVersionTransport>
+
   </properties>
   
   <distributionManagement>
@@ -275,8 +277,7 @@
     	<artifactId>plexus-i18n</artifactId>
     	<version>1.0-beta-10</version>
     </dependency>
+    
   </dependencies>
 
-
-
 </project>

Modified: maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/AbstractRepository.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/AbstractRepository.java?rev=688235&r1=688234&r2=688235&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/AbstractRepository.java (original)
+++ maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/AbstractRepository.java Fri Aug 22 18:07:49 2008
@@ -66,6 +66,8 @@
   protected RepositoryWriter   writer;
   
   protected Server server;
+  
+  protected String metadataName = "maven-metadata.xml";
   //---------------------------------------------------------------------------
   public AbstractRepository( String id, String type )
   {
@@ -178,7 +180,7 @@
     return rf.getReader( repo, mdProcessor );
   }
   //---------------------------------------------------------------------------
-  public static RepositoryWriter getWriter( String type, Repository repo, MetadataProcessor mdProcessor )
+  public static RepositoryWriter getWriter( String type, Repository repo )
   throws IllegalArgumentException, RepositoryException
   {
     if( type == null || type.length() < 1 )
@@ -192,7 +194,7 @@
     if( wf == null )
       throw new RepositoryException( lang.getMessage( "null.writer.factory.found" ) );
     
-    return wf.getWriter( repo, mdProcessor );
+    return wf.getWriter( repo );
   }
   //---------------------------------------------------------------------------
   public boolean isSnapshots()
@@ -220,5 +222,10 @@
     return server;
   }
   //---------------------------------------------------------------------------
+  public String getMetadataName()
+  {
+    return metadataName;
+  }
+  //---------------------------------------------------------------------------
   //---------------------------------------------------------------------------
 }

Modified: maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/Repository.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/Repository.java?rev=688235&r1=688234&r2=688235&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/Repository.java (original)
+++ maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/Repository.java Fri Aug 22 18:07:49 2008
@@ -117,4 +117,18 @@
      */
     boolean hasServer();
     Server getServer();
+
+    /**
+     * maven-metadata.xml file name for this repository. This is internal to repository and should never be used 
+     * outside of readers and wrters
+     * 
+     * @return server
+     */
+    String getMetadataName();
+
+
+    /**
+     * @param releasesOnly
+     */
+    void setRepositoryQualityRange( QualityRange releasesOnly );
 }

Modified: maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryWriterFactory.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryWriterFactory.java?rev=688235&r1=688234&r2=688235&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryWriterFactory.java (original)
+++ maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-api/src/main/java/org/apache/maven/mercury/repository/api/RepositoryWriterFactory.java Fri Aug 22 18:07:49 2008
@@ -1,9 +1,16 @@
 package org.apache.maven.mercury.repository.api;
 
-import org.apache.maven.mercury.builder.api.MetadataProcessor;
+/**
+ * 
+ *
+ *
+ * @author Oleg Gusakov
+ * @version $Id$
+ *
+ */
 
 public interface RepositoryWriterFactory
 {
-  public RepositoryWriter getWriter( Repository repo, MetadataProcessor mdProcessor )
+  public RepositoryWriter getWriter( Repository repo )
   throws RepositoryException;
 }

Modified: maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-local-m2/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryM2.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-local-m2/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryM2.java?rev=688235&r1=688234&r2=688235&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-local-m2/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryM2.java (original)
+++ maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-local-m2/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryM2.java Fri Aug 22 18:07:49 2008
@@ -16,24 +16,30 @@
 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()

Modified: maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-local-m2/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryWriterM2.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-local-m2/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryWriterM2.java?rev=688235&r1=688234&r2=688235&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-local-m2/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryWriterM2.java (original)
+++ maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-local-m2/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryWriterM2.java Fri Aug 22 18:07:49 2008
@@ -168,14 +168,14 @@
       if( !isPom )
       {
         // first - take care of the binary
-        writeFile( in, vFacs , fName );
+        FileUtil.writeAndSign( fName, in, vFacs );
         
         // if classier - nothing else to do :)
         if( artifact.hasClassifier() )
           return;
         
         // GA metadata
-        File mdFile = new File( _repoDir, relGroupPath+'/'+"maven-metadata-local.xml");
+        File mdFile = new File( _repoDir, relGroupPath+'/'+_repo.getMetadataName() );
         Metadata localMd = null;
         
         if( mdFile.exists() )
@@ -200,10 +200,10 @@
         
         byte [] resBytes = MetadataBuilder.changeMetadata( localMd, mdOp );
 
-        FileUtil.writeRawData( mdFile, resBytes );
+        FileUtil.writeAndSign( mdFile.getAbsolutePath(), resBytes, vFacs );
 
         // now - GAV metadata
-        mdFile = new File( _repoDir, relVersionPath+'/'+"maven-metadata-local.xml");
+        mdFile = new File( _repoDir, relVersionPath+'/'+_repo.getMetadataName() );
         localMd = null;
         
         if( mdFile.exists() )
@@ -217,13 +217,14 @@
         }
         
         resBytes = MetadataBuilder.changeMetadata( localMd, mdOp );
-
-        FileUtil.writeRawData( mdFile, resBytes );
+        FileUtil.writeAndSign( mdFile.getAbsolutePath(), resBytes, vFacs );
       }
       
       if( hasPomBlob )
       {
-        writeFile( pomBlob, vFacs , _repoDir.getAbsolutePath()+'/'+relVersionPath+'/'+artifact.getBaseName()+".pom" );
+        FileUtil.writeAndSign( _repoDir.getAbsolutePath()+'/'+relVersionPath
+                              +'/'+artifact.getArtifactId()+'-'+artifact.getVersion()+".pom", pomBlob, vFacs
+                              );
       }
         
     }
@@ -234,53 +235,5 @@
     
   }
   //---------------------------------------------------------------------------------------------------------------
-  private static void writeFile( byte [] bytes, Set<StreamVerifierFactory> vFacs, String fName )
-  throws IOException, StreamObserverException
-  {
-    ByteArrayInputStream bais = new ByteArrayInputStream( bytes );
-    writeFile( bais, vFacs, fName );
-  }
-  //---------------------------------------------------------------------------------------------------------------
-  private static void writeFile( InputStream in, Set<StreamVerifierFactory> vFacs, String fName )
-  throws IOException, StreamObserverException
-  {
-    byte [] buf = new byte[ 10240 ];
-    int n = -1;
-    HashSet<StreamVerifier> vSet = new HashSet<StreamVerifier>( vFacs.size() );
-    
-    for( StreamVerifierFactory vf : vFacs )
-      vSet.add( vf.newInstance() );
-    
-    FileOutputStream fout = null;
-    
-    try
-    {
-      File f = new File( fName );
-      f.getParentFile().mkdirs();
-      
-      fout = new FileOutputStream( f );
-      
-      while( (n = in.read( buf )) != -1 )
-      {
-        for( StreamVerifier sv : vSet )
-          sv.bytesReady( buf, 0, n );
-        
-        fout.write( buf, 0, n );
-      }
-      
-      for( StreamVerifier sv : vSet )
-      {
-        String sig = sv.getSignature();
-        FileUtil.writeRawData( new File( fName+sv.getAttributes().getExtension() ), sig );
-      }
-      
-    }
-    finally
-    {
-      if( fout != null ) try { fout.close(); } catch( Exception any ) {}
-    }
-    
-  }
-  //---------------------------------------------------------------------------------------------------------------
   //---------------------------------------------------------------------------------------------------------------
 }

Modified: maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-local-m2/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryWriterM2Factory.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-local-m2/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryWriterM2Factory.java?rev=688235&r1=688234&r2=688235&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-local-m2/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryWriterM2Factory.java (original)
+++ maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-local-m2/src/main/java/org/apache/maven/mercury/repository/local/m2/LocalRepositoryWriterM2Factory.java Fri Aug 22 18:07:49 2008
@@ -1,17 +1,16 @@
 package org.apache.maven.mercury.repository.local.m2;
 
-import org.apache.maven.mercury.builder.api.MetadataProcessor;
 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.apache.maven.mercury.repository.api.RepositoryWriter;
+import org.apache.maven.mercury.repository.api.RepositoryWriterFactory;
 import org.codehaus.plexus.i18n.DefaultLanguage;
 import org.codehaus.plexus.i18n.Language;
 
 public class LocalRepositoryWriterM2Factory
-implements RepositoryReaderFactory
+implements RepositoryWriterFactory
 {
   private static final Language lang = new DefaultLanguage( LocalRepositoryWriterM2Factory.class );
   private static final LocalRepositoryWriterM2Factory factory = new LocalRepositoryWriterM2Factory();
@@ -21,13 +20,13 @@
     AbstractRepository.register( AbstractRepository.DEFAULT_REPOSITORY_TYPE, factory  );
   }
   
-  public RepositoryReader getReader( Repository repo, MetadataProcessor mdProcessor)
+  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 LocalRepositoryReaderM2( (LocalRepository)repo, mdProcessor );
+    return new LocalRepositoryWriterM2( (LocalRepository)repo );
   }
 
 }

Modified: maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/Messages.properties
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/Messages.properties?rev=688235&r1=688234&r2=688235&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/Messages.properties (original)
+++ maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/Messages.properties Fri Aug 22 18:07:49 2008
@@ -1,6 +1,17 @@
-bad.repository.type=repository should implement LocalRepository, instead got {0}
+bad.repository.type=repository should implement RemoteRepository, instead got {0}
 bad.repository.null=repository cannot be null
 bad.repository.server.null=remote repository server cannot be null
 bad.repository.server.url.null=remote repository server URL cannot be null
 
 maven.metadata.xml.exception=Exception {0} during processing maven-metadata.xml from {1} in repository {2}
+no.group.md=No group metadata found at {0}/{1}
+group.md.no.versions=Group level metadata {0}/{1} at does not have any versions
+
+no.gav.md=No artifact metadata found at {0}/{1}
+gav.md.no.versions=Artifact level metadata {0}/{1} at does not have any versions
+
+snapshot.not.found=No snapshot found in artifact-level metadata at {0}/{1}
+
+no.pom.in.primary.artifact=Primary artifact {0} does not have a POM blob set, something is wrong with the client program.
+artifact.no.stream=non-POM artifact {0} does not have neither file nor stream associated with it. Nothing to upload.
+artifact.no.file=Artifact {0} - cannot open file {1} for reading, error: {2}
\ No newline at end of file

Modified: maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/RemoteRepositoryReaderM2.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/RemoteRepositoryReaderM2.java?rev=688235&r1=688234&r2=688235&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/RemoteRepositoryReaderM2.java (original)
+++ maven/sandbox/trunk/mercury/mercury-repo/mercury-repo-remote-m2/src/main/java/org/apache/maven/mercury/repository/remote/m2/RemoteRepositoryReaderM2.java Fri Aug 22 18:07:49 2008
@@ -1,17 +1,23 @@
 package org.apache.maven.mercury.repository.remote.m2;
 
 import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.net.URL;
+import java.security.acl.Group;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.maven.mercury.artifact.Artifact;
 import org.apache.maven.mercury.artifact.ArtifactBasicMetadata;
 import org.apache.maven.mercury.artifact.ArtifactMetadata;
 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.builder.api.MetadataProcessingException;
@@ -25,12 +31,17 @@
 import org.apache.maven.mercury.repository.api.RepositoryOperationResult;
 import org.apache.maven.mercury.repository.api.RepositoryReader;
 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.io.xpp3.MetadataXpp3Reader;
 import org.apache.maven.mercury.spi.http.client.HttpClientException;
 import org.apache.maven.mercury.spi.http.client.retrieve.DefaultRetrievalRequest;
 import org.apache.maven.mercury.spi.http.client.retrieve.DefaultRetriever;
 import org.apache.maven.mercury.spi.http.client.retrieve.RetrievalResponse;
 import org.apache.maven.mercury.transport.api.Binding;
+import org.apache.maven.mercury.transport.api.Server;
+import org.apache.maven.mercury.transport.api.TransportTransaction;
+import org.apache.maven.mercury.util.FileUtil;
 import org.codehaus.plexus.i18n.DefaultLanguage;
 import org.codehaus.plexus.i18n.Language;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
@@ -84,6 +95,9 @@
       // TODO 2008-07-29 og: here I should analyze Server protocol
       //                     and come with appropriate Transport implementation 
       _transport = new DefaultRetriever();
+      HashSet<Server> servers = new HashSet<Server>(1);
+      servers.add( repo.getServer() );
+      _transport.setServers( servers );
     }
     catch( HttpClientException e )
     {
@@ -100,8 +114,243 @@
       throws RepositoryException,
       IllegalArgumentException
   {
-    // TODO Auto-generated method stub
-    return null;
+    if( query == null || query.size() < 1 )
+      return null;
+    
+    RepositoryOperationResult<DefaultArtifact> res = new RepositoryOperationResult<DefaultArtifact>();
+    
+    for( ArtifactBasicMetadata bmd : query )
+    {
+      try
+      {
+        DefaultArtifact da = readArtifact( bmd );
+        res.add( da );
+      }
+      catch( Exception e )
+      {
+        res.add( e );
+      }
+    }
+
+    return res;
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  private String findLatestSnapshot( String gavPath, String version, DefaultArtifact da )
+  throws RepositoryException, MetadataProcessingException, MetadataException
+  {
+    String ver = version;
+    DefaultArtifactVersion dav = new DefaultArtifactVersion( ver );
+
+    byte [] mdBytes = readRawData( gavPath+'/'+ver+'/'+_repo.getMetadataName() );
+    if( mdBytes == null )
+      throw new RepositoryException( _lang.getMessage( "no.gav.md", _repo.getServer().getURL().toString(), gavPath+'/'+ver+'/'+_repo.getMetadataName() ) );
+      
+    Metadata gavMd = MetadataBuilder.read( new ByteArrayInputStream(mdBytes) );
+    if( gavMd == null || gavMd.getVersioning() == null )
+      throw new RepositoryException( _lang.getMessage( "gav.md.no.versions", _repo.getServer().getURL().toString(), gavPath+'/'+ver+'/'+_repo.getMetadataName() ) );
+      
+    
+    List<String> versions = gavMd.getVersioning().getVersions();
+    if( versions == null || versions.size() < 1 )
+      throw new RepositoryException( _lang.getMessage( "gav.md.no.versions", _repo.getServer().getURL().toString(), gavPath+'/'+ver+'/'+_repo.getMetadataName() ) );
+
+    if( versions.contains( ver ) )
+    {
+      da.setVersion( ver );
+      
+      return gavPath+'/'+ dav.getBase()+'-'+Artifact.SNAPSHOT_VERSION
+              + '/'+da.getArtifactId()+'-'+dav.getBase()+'-'+Artifact.SNAPSHOT_VERSION
+              + ( da.hasClassifier() ? '-'+da.getClassifier() : "" )
+              + '.'+da.getType()
+      ;
+    }
+    
+    ver = null;
+    DefaultArtifactVersion tempDav = null;
+    DefaultArtifactVersion tempDav2 = null;
+    
+    // find latest
+    for( String vn : versions )
+    {
+      // no snapshots any more
+      if( vn.endsWith( Artifact.SNAPSHOT_VERSION ))
+        continue;
+
+      if( ver == null )
+      {
+        ver = vn;
+        tempDav = new DefaultArtifactVersion( vn );
+        continue;
+      }
+      
+      tempDav2 = new DefaultArtifactVersion( vn );
+      if( tempDav2.compareTo( tempDav ) > 0 )
+      {
+        ver = vn;
+        tempDav = tempDav2;
+      }
+    
+    }
+
+    if( ver == null )
+    {
+      throw new RepositoryException( _lang.getMessage( "snapshot.not.found", _repo.getServer().getURL().toString(), gavPath+'/'+ver+'/'+_repo.getMetadataName() ) );
+    }
+    
+    da.setVersion( ver );
+    
+    return gavPath + '/' + dav.getBase()+'-'+Artifact.SNAPSHOT_VERSION
+    + '/'+da.getArtifactId()+'-'+ver
+    + ( da.hasClassifier() ? '-'+da.getClassifier() : "" )
+    + '.'+da.getType()
+;
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  public DefaultArtifact readArtifact( ArtifactBasicMetadata bmd )
+  throws IOException, RepositoryException, MetadataProcessingException, MetadataException
+  {
+    DefaultArtifact da = bmd instanceof DefaultArtifact ? (DefaultArtifact)bmd : new DefaultArtifact( bmd );
+    
+    String version = bmd.getVersion();
+    DefaultArtifactVersion dav = new DefaultArtifactVersion( version );
+    Quality vq = dav.getQuality();
+    
+    String relGaPath = bmd.getGroupId().replace( '.', '/' ) + '/' + bmd.getArtifactId();
+
+    byte [] mdBytes = readRawData( relGaPath+'/'+_repo.getMetadataName() );
+    if( mdBytes == null )
+      throw new RepositoryException( _lang.getMessage( "no.group.md", _repo.getServer().getURL().toString(), relGaPath ) );
+      
+    Metadata groupMd = MetadataBuilder.read( new ByteArrayInputStream(mdBytes) );
+    if( groupMd == null || groupMd.getVersioning() == null )
+      throw new RepositoryException( _lang.getMessage( "group.md.no.versions", _repo.getServer().getURL().toString(), relGaPath ) );
+      
+    List<String> versions = groupMd.getVersioning().getVersions();
+    if( versions == null || versions.size() < 1 )
+      throw new RepositoryException( _lang.getMessage( "group.md.no.versions", _repo.getServer().getURL().toString(), relGaPath ) );
+    
+    String relBinaryPath = null;
+    
+    // merge RELEASE and LATEST, should be no difference
+    if( Artifact.RELEASE_VERSION.equals( version )
+        ||
+        Artifact.LATEST_VERSION.equals( version ) 
+      )
+    {
+      boolean noSnapshots = Artifact.RELEASE_VERSION.equals( version );
+      version = null;
+      DefaultArtifactVersion tempDav = null;
+      DefaultArtifactVersion tempDav2 = null;
+
+      // find latest
+      for( String vn : versions )
+      {
+        // RELEASE?
+        if( noSnapshots && vn.endsWith( Artifact.SNAPSHOT_VERSION ))
+          continue;
+        
+        if( version == null )
+        {
+          version = vn;
+          tempDav = new DefaultArtifactVersion( vn );
+          continue;
+        }
+        
+        tempDav2 = new DefaultArtifactVersion( vn );
+        if( tempDav2.compareTo( tempDav ) > 0 )
+        {
+          version = vn;
+          tempDav = tempDav2;
+        }
+        
+      }
+
+      if( version == null )
+        throw new RepositoryException( _lang.getMessage( "gav.not.found", bmd.toString(), relGaPath ) );
+      
+      // LATEST is a SNAPSHOT :(
+      if( version.endsWith( Artifact.SNAPSHOT_VERSION ) )
+      {
+        relBinaryPath = findLatestSnapshot( relGaPath, version, da );
+
+        if( relBinaryPath == null )
+          throw new RepositoryException( _lang.getMessage( "gav.not.found", bmd.toString(), relGaPath ) );
+      }
+      else
+      {
+        relBinaryPath = relGaPath+'/'+version+'/'+bmd.getArtifactId()+'-'+version
+            + ( bmd.hasClassifier() ? '-'+bmd.getClassifier() : "" )+'.'+bmd.getType()
+        ;
+        da.setVersion( version );
+      }
+    }
+    // regular snapshot requested
+    else if( version.endsWith( Artifact.SNAPSHOT_VERSION ) )
+    {
+      relBinaryPath = findLatestSnapshot( relGaPath, version, da );
+
+      if( relBinaryPath == null )
+        throw new RepositoryException( _lang.getMessage( "gav.not.found", bmd.toString(), relGaPath ) );
+    }
+    // time stamped snapshot requested
+    else if( vq.equals( Quality.SNAPSHOT_TS_QUALITY ))
+    {
+      relBinaryPath = relGaPath
+          + '/'+dav.getBase()+'-'+Artifact.SNAPSHOT_VERSION 
+          + '/' + bmd.getArtifactId() + '-' + bmd.getVersion() + ( bmd.hasClassifier() ? '-'+bmd.getClassifier() : "" ) 
+          + '.' + bmd.getType()
+      ;
+    }
+    else
+    {
+      relBinaryPath = relGaPath + '/'+version
+                      + '/'+bmd.getArtifactId()+'-'+version
+                      + ( bmd.hasClassifier() ? '-'+bmd.getClassifier() : "" )
+                      + '.'+bmd.getType()
+      ;
+    }
+    
+    // binary calculated 
+    
+    File binFile = File.createTempFile( "remote-repo-", bmd.getArtifactId()+bmd.getVersion()+'.'+bmd.getType() );
+    File pomFile = null;
+
+    Binding binBinding = new Binding( new URL(_repo.getServer().getURL().toString() + '/'+ relBinaryPath) , binFile );
+
+    DefaultRetrievalRequest request = new DefaultRetrievalRequest();
+    request.addBinding( binBinding );
+    
+    if( !"pom".equals( bmd.getType() ) ) 
+    {
+      String relPomPath = relGaPath + '/'+version
+                          + '/'+bmd.getArtifactId()+'-'+version
+                          + ".pom"
+      ;
+
+      pomFile = File.createTempFile( "remote-repo-", bmd.getArtifactId()+bmd.getVersion()+'.'+bmd.getType() );
+      Binding pomBinding = new Binding( new URL(_repo.getServer().getURL().toString() + '/'+ relPomPath) , pomFile );
+      request.addBinding( binBinding );
+    }
+    
+    RetrievalResponse response = _transport.retrieve( request );
+    
+    if( response.hasExceptions() )
+    {
+      throw new RepositoryException( response.getExceptions().toString() );
+    }
+    
+    da.setFile( binFile );
+
+    if( pomFile != null ) 
+    {
+      da.setPomBlob( FileUtil.readRawData( pomFile ) );
+    }
+    else
+    {
+      da.setPomBlob( FileUtil.readRawData( binFile ) );
+    }
+
+    return da;
   }
   //---------------------------------------------------------------------------------------------------------------
   /**
@@ -152,7 +401,7 @@
     String gaPath = null;
     for( ArtifactBasicMetadata bmd : query )
     {
-      gaPath = bmd.getGroupId().replace( '.', '/' )+'/'+bmd.getArtifactId()+"/maven-metadata.xml";
+      gaPath = bmd.getGroupId().replace( '.', '/' )+'/'+bmd.getArtifactId()+'/'+_repo.getMetadataName();
       
       byte[] mavenMetadata;
       try
@@ -188,7 +437,7 @@
       VersionRange versionQuery;
       try
       {
-        versionQuery = new VersionRange( bmd.getVersion() );
+        versionQuery = new VersionRange( bmd.getVersion(), _repo.getVersionRangeQualityRange() );
       }
       catch( VersionException e )
       {
@@ -203,6 +452,10 @@
         
         String v = (String)vo;
         
+        Quality q = new Quality( v );
+        if( ! _repo.isAcceptedQuality( q ) )
+          continue;
+        
         if( !versionQuery.includes(  v )  )
           continue;
         
@@ -242,32 +495,24 @@
       return null;
     
     FileInputStream fis = null;
-    File tempFile = null;
     try
     {
-      // transport workaround - until it can do in-memory Bindings
-      tempFile = File.createTempFile( "mercury", "readraw" );
+      ByteArrayOutputStream baos = new ByteArrayOutputStream(10240);
       
       String separator = "/";
       if( path.startsWith( separator ))
         separator = "";
       
-      Binding binding = new Binding( new URL(_repo.getServer().getURL().toString() + separator + path) , tempFile );
+      Binding binding = new Binding( new URL(_repo.getServer().getURL().toString() + separator + path) , baos );
       DefaultRetrievalRequest request = new DefaultRetrievalRequest();
       request.addBinding( binding );
       
       RetrievalResponse response = _transport.retrieve( request );
       
       if( response.hasExceptions() )
-      {
         throw new MetadataProcessingException( response.getExceptions().toString() );
-      }
-    
-      fis = new FileInputStream( tempFile );
-      int len = (int)tempFile.length();
-      byte [] pom = new byte [ len ];
-      fis.read( pom );
-      return pom;
+      
+      return baos.toByteArray();
     }
     catch( IOException e )
     {
@@ -276,7 +521,6 @@
     finally
     {
       if( fis != null ) try { fis.close(); } catch( Exception any ) {}
-      if( tempFile != null ) try { if(tempFile.exists()) tempFile.delete(); } catch( Exception any ) {}
     }
   }
   //---------------------------------------------------------------------------------------------------------------

Modified: maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-api/src/main/java/org/apache/maven/mercury/transport/api/Binding.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-api/src/main/java/org/apache/maven/mercury/transport/api/Binding.java?rev=688235&r1=688234&r2=688235&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-api/src/main/java/org/apache/maven/mercury/transport/api/Binding.java (original)
+++ maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-api/src/main/java/org/apache/maven/mercury/transport/api/Binding.java Fri Aug 22 18:07:49 2008
@@ -86,6 +86,18 @@
     this.localIS = is;
   }
 
+  /**
+   * inbound constructor - read contents of the remoteUrl to the stream
+   * 
+   * @param remoteUrl
+   * @param is
+   */
+  public Binding( URL remoteUrl, ByteArrayOutputStream os )
+  {
+    this.remoteResource = remoteUrl;
+    this.localOS = os;
+  }
+
   public URL getRemoteResource()
   {
     return remoteResource;
@@ -139,4 +151,16 @@
       return localFile;
   }
 
+  @Override
+  public String toString()
+  {
+    return '['
+            + (remoteResource == null ? "null URL" : remoteResource.toString() )+" <=> "
+            + (localFile == null ?  ( localIS == null ? (localOS == null ? "null local Res" : localOS) : "localIS" ) : localFile.getAbsolutePath() )
+            +']'
+    ;
+  }
+  
+  
+
 }

Modified: maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DefaultDeployResponse.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DefaultDeployResponse.java?rev=688235&r1=688234&r2=688235&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DefaultDeployResponse.java (original)
+++ maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DefaultDeployResponse.java Fri Aug 22 18:07:49 2008
@@ -25,7 +25,8 @@
 
 import org.apache.maven.mercury.spi.http.client.HttpClientException;
 
-public class DefaultDeployResponse implements DeployResponse
+public class DefaultDeployResponse
+implements DeployResponse
 {
     private Set<HttpClientException> _exceptions = Collections.synchronizedSet( new HashSet<HttpClientException>() );
 
@@ -48,4 +49,9 @@
         return _exceptions.toString();
     }
 
+    public boolean hasExceptions()
+    {
+      return _exceptions != null && _exceptions.size() > 0;
+    }
+
 }

Modified: maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DefaultDeployer.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DefaultDeployer.java?rev=688235&r1=688234&r2=688235&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DefaultDeployer.java (original)
+++ maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DefaultDeployer.java Fri Aug 22 18:07:49 2008
@@ -328,14 +328,17 @@
         return server;
     }
     
-    private Set<StreamObserver> createStreamObservers (Server server)
+    private Set<StreamObserver> createStreamObservers( Server server )
     throws StreamVerifierException
     {
         HashSet<StreamObserver> observers = new HashSet<StreamObserver>();
-        Set<StreamVerifierFactory> factories = server.getWriterStreamVerifierFactories();
-        for (StreamVerifierFactory f:factories)
+        if( server != null && server.hasWriterStreamVerifierFactories() )
         {
-            observers.add( f.newInstance() );
+          Set<StreamVerifierFactory> factories = server.getWriterStreamVerifierFactories();
+          for (StreamVerifierFactory f:factories)
+          {
+              observers.add( f.newInstance() );
+          }
         }
         return observers;
     }

Modified: maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DeployResponse.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DeployResponse.java?rev=688235&r1=688234&r2=688235&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DeployResponse.java (original)
+++ maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/deploy/DeployResponse.java Fri Aug 22 18:07:49 2008
@@ -39,4 +39,6 @@
      * @return
      */
     public Set<HttpClientException> getExceptions();
+    
+    public boolean hasExceptions();
 }

Modified: maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/DefaultRetriever.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/DefaultRetriever.java?rev=688235&r1=688234&r2=688235&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/DefaultRetriever.java (original)
+++ maven/sandbox/trunk/mercury/mercury-transport/mercury-transport-http/src/main/java/org/apache/maven/mercury/spi/http/client/retrieve/DefaultRetriever.java Fri Aug 22 18:07:49 2008
@@ -312,7 +312,7 @@
     throws StreamVerifierException
     {
         HashSet<StreamObserver> observers = new HashSet<StreamObserver>();
-        if (server != null)
+        if (server != null && server.hasReaderStreamVerifierFactories() )
         {
             Set<StreamVerifierFactory> factories = server.getReaderStreamVerifierFactories();
             for( StreamVerifierFactory f:factories )

Modified: maven/sandbox/trunk/mercury/mercury-util/pom.xml
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-util/pom.xml?rev=688235&r1=688234&r2=688235&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-util/pom.xml (original)
+++ maven/sandbox/trunk/mercury/mercury-util/pom.xml Fri Aug 22 18:07:49 2008
@@ -9,4 +9,77 @@
   <version>1.0.0-alpha-1-SNAPSHOT</version>
   <name>Mercury Shared Utilities:       ${project.version}</name>
 
+  <build>
+    <plugins>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <configuration>
+          <archive>
+            <manifest>
+              <addClasspath>true</addClasspath>
+              <classpathPrefix>lib/</classpathPrefix>
+              <mainClass>org.apache.maven.mercury.util.FileUtil</mainClass>
+            </manifest>
+          </archive>
+        </configuration>
+      </plugin>
+ 
+      <plugin>
+        <artifactId>maven-shade-plugin</artifactId>
+        <version>1.1</version>
+        <executions>
+          <execution>
+            <phase>package</phase>
+            <goals>
+              <goal>shade</goal>
+            </goals>
+            <configuration>
+              <finalName>${project.artifactId}-all</finalName>
+              <keepDependenciesWithProvidedScope>true</keepDependenciesWithProvidedScope>
+              <createDependencyReducedPom>true</createDependencyReducedPom>
+              <artifactSet>
+                <excludes>
+                  <exclude>org.codehaus.plexus:plexus-component-api</exclude>
+                  <exclude>bouncycastle:bcprov-jdk15</exclude>
+                  <exclude>obouncycastle:bcpg-jdk15</exclude>
+                </excludes>
+              </artifactSet>
+              <filters>
+                <filter>
+                  <excludes>
+                    <exclude>/META-INF/BCKEY.DSA</exclude> 
+                    <exclude>/META-INF/BCKEY.SF</exclude> 
+                  </excludes>
+                </filter>
+              </filters>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+
+    </plugins>
+  </build>
+
+  <dependencies>
+
+    <dependency>
+      <groupId>org.apache.maven.mercury</groupId>
+      <artifactId>mercury-crypto-api</artifactId>
+      <version>1.0.0-alpha-1-SNAPSHOT</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.maven.mercury</groupId>
+      <artifactId>mercury-crypto-basic</artifactId>
+      <version>1.0.0-alpha-1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+    	<groupId>commons-cli</groupId>
+    	<artifactId>commons-cli</artifactId>
+    	<version>1.1</version>
+    </dependency>
+  </dependencies>
+
 </project>
\ No newline at end of file

Modified: maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/FileUtil.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/FileUtil.java?rev=688235&r1=688234&r2=688235&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/FileUtil.java (original)
+++ maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/FileUtil.java Fri Aug 22 18:07:49 2008
@@ -1,13 +1,37 @@
 package org.apache.maven.mercury.util;
 
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.io.OutputStream;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.GnuParser;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.OptionBuilder;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+import org.apache.maven.mercury.crypto.api.StreamObserverException;
+import org.apache.maven.mercury.crypto.api.StreamVerifier;
+import org.apache.maven.mercury.crypto.api.StreamVerifierAttributes;
+import org.apache.maven.mercury.crypto.api.StreamVerifierException;
+import org.apache.maven.mercury.crypto.api.StreamVerifierFactory;
+import org.apache.maven.mercury.crypto.pgp.PgpStreamVerifierFactory;
+import org.apache.maven.mercury.crypto.sha.SHA1VerifierFactory;
+import org.codehaus.plexus.i18n.DefaultLanguage;
+import org.codehaus.plexus.i18n.Language;
 
 /**
  *
@@ -19,6 +43,11 @@
 public class FileUtil
 {
   public static final String DEFAULT_CHARSET = "utf-8";
+  public static final int    K = 1024;
+  public static final int    DEFAULT_BUFFER_SIZE = 10 * K;
+  //---------------------------------------------------------------------------------------------------------------
+  private static final org.slf4j.Logger _log = org.slf4j.LoggerFactory.getLogger( FileUtil.class ); 
+  private static final Language _lang = new DefaultLanguage( FileUtil.class );
   //---------------------------------------------------------------------------------------------------------------
   public static void delete( File f )
   {
@@ -103,10 +132,103 @@
     }
   }
   //---------------------------------------------------------------------------------------------------------------
+  public static byte[] readRawData( File file, Collection<StreamVerifierFactory> vFacs  )
+  throws IOException, FileUtilException, StreamVerifierException
+  {
+    if( file == null || ! file.exists() )
+      return null;
+    
+    boolean verify = vFacs != null && vFacs.size() > 0;
+    
+    String fileName = file.getAbsolutePath();
+    
+    HashSet<StreamVerifier> vs = new HashSet<StreamVerifier>( verify ? vFacs.size() : 1 );
+    
+    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 FileUtilException( _lang.getMessage( "cannot.read.signature.file", sigFileName, e.getMessage() ) );
+        }
+        vs.add( sv );
+      }
+      else if( ! sv.getAttributes().isLenient() )
+      {
+        throw new FileUtilException( _lang.getMessage( "no.signature.file", ext, sigFileName ) );
+      }
+      // otherwise ignore absence of signature file, if verifier is lenient
+    }
+    
+    ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+    FileInputStream fin = null;
+    try
+    {
+      fin = new FileInputStream( file );
+      byte [] buf = new byte[ DEFAULT_BUFFER_SIZE ];
+      int n = -1;
+      while( (n = fin.read( buf )) != -1 )
+      {
+        if( verify )
+        {
+          for( StreamVerifier sv : vs )
+            try
+            {
+              sv.bytesReady( buf, 0, n );
+            }
+            catch( StreamObserverException e )
+            {
+              if( ! sv.getAttributes().isLenient() )
+                throw new FileUtilException(e);
+            }
+        }
+          
+        baos.write( buf, 0, n );
+      }
+      
+      if( verify )
+      {
+        for( StreamVerifier sv : vs )
+        {
+          if( sv.verifySignature() )
+          {
+            if( sv.getAttributes().isSufficient() )
+              break;
+          }
+          else
+          {
+            if( !sv.getAttributes().isLenient() )
+              throw new StreamVerifierException( _lang.getMessage( "signature.failed", sv.getAttributes().getExtension(), fileName ) );
+          }
+        }
+      }
+      
+      return baos.toByteArray();
+    }
+    catch( IOException e )
+    {
+      throw new FileUtilException(e);
+    }
+    finally
+    {
+      if( fin != null ) try { fin.close(); } catch( Exception any ) {}
+    }
+  }
+  //---------------------------------------------------------------------------------------------------------------
   public static byte[] readRawData( InputStream in )
   throws IOException
   {
-    byte [] bytes = new byte [ 10240 ];
+    byte [] bytes = new byte [ DEFAULT_BUFFER_SIZE ];
     int n = -1;
     ByteArrayOutputStream baos = new ByteArrayOutputStream();
     
@@ -127,7 +249,7 @@
   {
     OutputStream out = new FileOutputStream( f );
 
-    byte [] buf = new byte[ 10240 ];
+    byte [] buf = new byte[ DEFAULT_BUFFER_SIZE ];
     int n;
 
     while( (n = in.read(buf)) > 0 )
@@ -161,5 +283,236 @@
     }
   }
   //---------------------------------------------------------------------------------------------------------------
+  public static void writeAndSign( String fName, byte [] bytes, Set<StreamVerifierFactory> vFacs )
+  throws IOException, StreamObserverException
+  {
+    ByteArrayInputStream bais = new ByteArrayInputStream( bytes );
+    writeAndSign( fName, bais, vFacs );
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  public static void writeAndSign( String fName, InputStream in, Set<StreamVerifierFactory> vFacs )
+  throws IOException, StreamObserverException
+  {
+    byte [] buf = new byte[ DEFAULT_BUFFER_SIZE ];
+    int n = -1;
+    HashSet<StreamVerifier> vSet = new HashSet<StreamVerifier>( vFacs.size() );
+    
+    for( StreamVerifierFactory vf : vFacs )
+      vSet.add( vf.newInstance() );
+    
+    FileOutputStream fout = null;
+    
+    try
+    {
+      File f = new File( fName );
+      f.getParentFile().mkdirs();
+      
+      fout = new FileOutputStream( f );
+      
+      while( (n = in.read( buf )) != -1 )
+      {
+        for( StreamVerifier sv : vSet )
+          sv.bytesReady( buf, 0, n );
+        
+        fout.write( buf, 0, n );
+      }
+      
+      for( StreamVerifier sv : vSet )
+      {
+        String sig = sv.getSignature();
+        FileUtil.writeRawData( new File( fName+sv.getAttributes().getExtension() ), sig );
+      }
+      
+    }
+    finally
+    {
+      if( fout != null ) try { fout.close(); } catch( Exception any ) {}
+    }
+    
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  public static void sign( File f, Set<StreamVerifierFactory> vFacs, boolean force )
+  throws IOException, StreamObserverException
+  {
+    if( vFacs == null || vFacs.size() < 1 )
+      return;
+
+    if( f.isDirectory() )
+    {
+      File [] kids = f.listFiles();
+      for( File kid : kids )
+        sign( kid, vFacs, force );
+      return;
+    }
+    
+    String fName = f.getAbsolutePath();
+    
+    HashSet<StreamVerifier> vs = new HashSet<StreamVerifier>( vFacs.size() );
+    for( StreamVerifierFactory vf : vFacs )
+    {
+      StreamVerifier sv = vf.newInstance();
+      String ext = sv.getAttributes().getExtension();
+      
+      // don't sign signature files
+      if( fName.endsWith( ext ) )
+        return;
+
+      File sf = new File( fName+ext );
+      if( sf.exists() )
+      {
+        if( force )
+          sf.delete();
+        else
+          continue;
+      }
+      vs.add( sv );
+    }
+    
+    byte [] buf = new byte[ DEFAULT_BUFFER_SIZE ];
+    FileInputStream fis = null;
+    try
+    {
+      fis = new FileInputStream( f );
+      int n = -1;
+      
+      while( (n=fis.read( buf )) != -1 )
+      {
+        for( StreamVerifier sv : vs )
+        {
+          sv.bytesReady( buf, 0, n );
+        }
+      }
+      
+      for( StreamVerifier sv : vs )
+      {
+        String sig = sv.getSignature();
+        String ext = sv.getAttributes().getExtension();
+        File sf = new File( fName+ext );
+        writeRawData( sf, sig );
+      }
+    }
+    finally
+    {
+      if( fis != null ) try { fis.close(); } catch( Exception any ) {}
+    }
+    
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  @SuppressWarnings("static-access")
+  public static void main( String[] args )
+  throws IOException, StreamObserverException
+  {
+    Option recurce   = new Option( "r", _lang.getMessage( "option.r" ) );
+    Option force     = new Option( "force", _lang.getMessage( "option.force" ) );
+    Option sha1      = new Option( "sha1", _lang.getMessage( "option.sha1" ) );
+    Option pgp       = new Option( "pgp", _lang.getMessage( "option.pgp" ) );
+    Option keyring   = OptionBuilder.withArgName( "file" )
+                                    .hasArg()
+                                    .withType( java.io.File.class )
+                                    .withDescription( _lang.getMessage( "option.keyring" ) )
+                                    .create( "keyring" )
+                                    ;
+    Option keyid     = OptionBuilder.withArgName( "hexstring" )
+                                    .hasArg()
+                                    .withDescription( _lang.getMessage( "option.keyid" ) )
+                                    .create( "keyid" )
+                                    ;
+    Option keypass   = OptionBuilder.withArgName( "string" )
+                                    .hasArg()
+                                    .withDescription( _lang.getMessage( "option.keypass" ) )
+                                    .create( "keypass" )
+                                    ;
+
+    Options options = new Options();
+    options.addOption( recurce );
+    options.addOption( force );
+    options.addOption( sha1 );
+    options.addOption( pgp );
+    options.addOption( keyring );
+    options.addOption( keyid );
+    options.addOption( keypass );
+
+    CommandLine commandLine = null;
+    CommandLineParser parser = new GnuParser();
+    
+    if( args == null || args.length < 2 )
+    {
+      HelpFormatter formatter = new HelpFormatter();
+      formatter.printHelp( "mercury-util", options );
+      return;
+    }
+    
+    try
+    {
+        commandLine = parser.parse( options, args );
+    }
+    catch( ParseException e )
+    {
+        System.err.println( "Command line parsing eror: " + e.getMessage() );
+        return;
+    }
+    
+    Set<StreamVerifierFactory> vFacs = new HashSet<StreamVerifierFactory>(4);
+    
+    if( commandLine.hasOption("pgp") )
+    {
+      if( commandLine.hasOption("keyring") && commandLine.hasOption("keyid") )
+      {
+        BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
+        String pass = commandLine.hasOption( "keypass" ) ? commandLine.getOptionValue( "keypass" ) : r.readLine();
+        
+        vFacs.add( 
+            new PgpStreamVerifierFactory(
+                    new StreamVerifierAttributes( PgpStreamVerifierFactory.DEFAULT_EXTENSION, false, true )
+                    , new FileInputStream( commandLine.getOptionValue( "keyring" ) )
+                    , commandLine.getOptionValue( "keyid" )
+                    , pass
+                                        )
+                    );
+      }
+      else
+      {
+        System.err.println( _lang.getMessage( "bad.pgp.args" ) );
+        return;
+      }
+    }
+
+    if( commandLine.hasOption("sha1") )
+    {
+      vFacs.add( new SHA1VerifierFactory(true,false) );
+    }
+    
+    signAll( commandLine.getArgList(), vFacs, commandLine.hasOption( "r" ), commandLine.hasOption( "force" ) );
+ 
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  private static void signAll( List<String> fileNames, Set<StreamVerifierFactory> vFacs, boolean recurse, boolean force )
+  throws IOException, StreamObserverException
+  {
+    if( vFacs == null || vFacs.size() < 1 )
+    {
+      System.err.println("no.verifiers");
+      return;
+    }
+
+    File f = null;
+    
+    for( String fName : fileNames )
+    {
+      f = new File( fName );
+      if( ! f.exists() )
+      {
+        System.out.println( _lang.getMessage( "file.not.exists", fName ));
+        continue;
+      }
+      if( f.isDirectory() && ! recurse )
+      {
+        System.out.println( _lang.getMessage( "file.is.directory", fName ));
+        continue;
+      }
+      sign( f, vFacs, force );
+    }
+  }
+  //---------------------------------------------------------------------------------------------------------------
   //---------------------------------------------------------------------------------------------------------------
 }

Added: maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/FileUtilException.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/FileUtilException.java?rev=688235&view=auto
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/FileUtilException.java (added)
+++ maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/FileUtilException.java Fri Aug 22 18:07:49 2008
@@ -0,0 +1,54 @@
+package org.apache.maven.mercury.util;
+
+/**
+ *
+ *
+ * @author Oleg Gusakov
+ * @version $Id$
+ *
+ */
+public class FileUtilException
+    extends Exception
+{
+
+  /**
+   * 
+   */
+  public FileUtilException()
+  {
+    // TODO Auto-generated constructor stub
+  }
+
+  /**
+   * @param message
+   */
+  public FileUtilException(
+      String message )
+  {
+    super( message );
+    // TODO Auto-generated constructor stub
+  }
+
+  /**
+   * @param cause
+   */
+  public FileUtilException(
+      Throwable cause )
+  {
+    super( cause );
+    // TODO Auto-generated constructor stub
+  }
+
+  /**
+   * @param message
+   * @param cause
+   */
+  public FileUtilException(
+      String message,
+      Throwable cause )
+  {
+    super( message, cause );
+    // TODO Auto-generated constructor stub
+  }
+
+}

Added: maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/Messages.properties
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/Messages.properties?rev=688235&view=auto
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/Messages.properties (added)
+++ maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/Messages.properties Fri Aug 22 18:07:49 2008
@@ -0,0 +1,14 @@
+signature.failed=Signature "{0}": verification failed for file {1}
+no.signature.file=Verifier for {0} is mandatory, but file {1} does not exist
+cannot.read.signature.file=Cannot read signature file {0}, error: {1}
+option.sha1=produce SHA1 signatures 
+option.pgp=produce PGP signatures, requires -keyring and -keyid options 
+option.keyring=full path of the secret keyring file
+option.keyid=id of the key in the secret keyring file to be used in the signature
+option.keypass=key password
+option.r=recursevly sign all unsigned files
+option.force=overwrite existing signatures
+bad.pgp.args=pgp option requires both -keyring and -keyid to be specified
+no.verifiers=No signature generators requested - exiting
+file.not.exists=File "{0}" does not exist. Skipping ..
+file.is.directory=File "{0}" is a folder and no recursive option is specified. Skipping ..
\ No newline at end of file

Added: maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/TimeUtil.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/TimeUtil.java?rev=688235&view=auto
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/TimeUtil.java (added)
+++ maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/TimeUtil.java Fri Aug 22 18:07:49 2008
@@ -0,0 +1,37 @@
+package org.apache.maven.mercury.util;
+
+import java.util.Date;
+
+/**
+ *
+ *
+ * @author Oleg Gusakov
+ * @version $Id$
+ *
+ */
+public class TimeUtil
+{
+
+  /**
+   * 
+   * @return current UTC timestamp by yyyyMMddHHmmss mask
+   */
+  public static String getUTCTimestamp( )
+  {
+    return getUTCTimestamp( new Date() );
+  }
+
+  /**
+   * 
+   * @param date
+   * @return current date converted to UTC timestamp by yyyyMMddHHmmss mask
+   */
+  public static String getUTCTimestamp( Date date )
+  {
+      java.util.TimeZone timezone = java.util.TimeZone.getTimeZone( "UTC" );
+      java.text.DateFormat fmt = new java.text.SimpleDateFormat( "yyyyMMddHHmmss" );
+      fmt.setTimeZone( timezone );
+      return fmt.format( date );
+  }
+
+}