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/06 06:48:39 UTC

svn commit: r683105 - in /maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src: main/java/org/apache/maven/mercury/repository/metadata/ test/java/org/apache/maven/mercury/repository/metadata/ test/resources/controlledRepo/

Author: ogusakov
Date: Tue Aug  5 21:48:39 2008
New Revision: 683105

URL: http://svn.apache.org/viewvc?rev=683105&view=rev
Log:
added metadata operations framework. 

Added:
    maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/AbstractOperand.java
    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/MergeOperation.java
    maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/Messages.properties
    maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/MetadataOperand.java
    maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/MetadataOperation.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/StringOperand.java
Modified:
    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/test/java/org/apache/maven/mercury/repository/metadata/MetadataBuilderTest.java
    maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/test/resources/controlledRepo/group-maven-metadata.xml

Added: maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/AbstractOperand.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/AbstractOperand.java?rev=683105&view=auto
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/AbstractOperand.java (added)
+++ maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/AbstractOperand.java Tue Aug  5 21:48:39 2008
@@ -0,0 +1,13 @@
+package org.apache.maven.mercury.repository.metadata;
+
+/**
+ *
+ *
+ * @author Oleg Gusakov
+ * @version $Id$
+ *
+ */
+public abstract class AbstractOperand
+{
+
+}

Added: 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=683105&view=auto
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/AddVersionOperation.java (added)
+++ maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/AddVersionOperation.java Tue Aug  5 21:48:39 2008
@@ -0,0 +1,76 @@
+package org.apache.maven.mercury.repository.metadata;
+
+import java.util.List;
+
+import org.codehaus.plexus.i18n.DefaultLanguage;
+import org.codehaus.plexus.i18n.Language;
+
+/**
+ * adds new version to metadata
+ *
+ * @author Oleg Gusakov
+ * @version $Id$
+ *
+ */
+public class AddVersionOperation
+    implements MetadataOperation
+{
+  private static final Language lang = new DefaultLanguage( AddVersionOperation.class );
+  
+  private String version;
+  
+  /**
+   * @throws MetadataException 
+   * 
+   */
+  public AddVersionOperation(  Object data  )
+  throws MetadataException
+  {
+    setOperand( data );
+  }
+  
+  public void setOperand( Object data )
+  throws MetadataException
+  {
+    if( data == null || !(data instanceof StringOperand) )
+      throw new MetadataException( lang.getMessage( "bad.operand", "StringOperand", data == null ? "null" : data.getClass().getName() ) );
+    
+    version = ((StringOperand)data).getOperand();
+  }
+
+  /**
+   * add version to the in-memory metadata instance
+   * 
+   * @param metadata
+   * @param version
+   * @return
+   * @throws MetadataException 
+   */
+  public boolean perform( Metadata metadata )
+  throws MetadataException
+  {
+    if( metadata == null )
+      return false;
+   
+    Versioning vs = metadata.getVersioning(); 
+    
+    if( vs == null )
+    {
+      vs = new Versioning();
+      metadata.setVersioning( vs );
+    }
+    
+    if( vs.getVersions() != null && vs.getVersions().size() > 0 )
+    {
+      List<String> vl = vs.getVersions();
+      if( vl.contains( version ) )
+        return false;
+    }
+    
+    vs.addVersion( version );
+    vs.setLastUpdated( MetadataBuilder.getUTCTimestamp() );
+    
+    return true;
+  }
+
+}

Added: maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/MergeOperation.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/MergeOperation.java?rev=683105&view=auto
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/MergeOperation.java (added)
+++ maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/MergeOperation.java Tue Aug  5 21:48:39 2008
@@ -0,0 +1,169 @@
+package org.apache.maven.mercury.repository.metadata;
+
+import org.codehaus.plexus.i18n.DefaultLanguage;
+import org.codehaus.plexus.i18n.Language;
+
+/**
+ *
+ *
+ * @author Oleg Gusakov
+ * @version $Id$
+ *
+ */
+public class MergeOperation
+    implements MetadataOperation
+{
+  private static final Language lang = new DefaultLanguage( MergeOperation.class );
+  
+  Metadata sourceMetadata;
+  
+  /**
+   * @throws MetadataException 
+   * 
+   */
+  public MergeOperation( Object data )
+  throws MetadataException
+  {
+    setOperand( data );
+  }
+
+  /**
+   * merge the supplied operand Metadata into this metadata
+   */
+  public boolean perform( Metadata targetMetadata )
+      throws MetadataException
+  {
+    boolean changed = false;
+    
+    if( sourceMetadata == null || targetMetadata == null )
+      return false;
+
+    for ( java.util.Iterator i = sourceMetadata.getPlugins().iterator(); i.hasNext(); )
+    {
+        Plugin plugin = (Plugin) i.next();
+        boolean found = false;
+
+        for ( java.util.Iterator it = targetMetadata.getPlugins().iterator(); it.hasNext() && !found; )
+        {
+            Plugin preExisting = (Plugin) it.next();
+
+            if ( preExisting.getPrefix().equals( plugin.getPrefix() ) )
+            {
+                found = true;
+            }
+        }
+
+        if ( !found )
+        {
+            Plugin mappedPlugin = new Plugin();
+
+            mappedPlugin.setArtifactId( plugin.getArtifactId() );
+
+            mappedPlugin.setPrefix( plugin.getPrefix() );
+
+            mappedPlugin.setName( plugin.getName() );
+
+            targetMetadata.addPlugin( mappedPlugin );
+
+            changed = true;
+        }
+    }
+
+    Versioning sourceVersioning = sourceMetadata.getVersioning();
+    if ( sourceVersioning != null )
+    {
+        Versioning targetVersioning = targetMetadata.getVersioning();
+        if ( targetVersioning == null )
+        {
+            targetVersioning = new Versioning();
+            targetMetadata.setVersioning( targetVersioning );
+            changed = true;
+        }
+
+        for ( java.util.Iterator i = sourceVersioning.getVersions().iterator(); i.hasNext(); )
+        {
+            String version = (String) i.next();
+            if ( !targetVersioning.getVersions().contains( version ) )
+            {
+                changed = true;
+                targetVersioning.getVersions().add( version );
+            }
+        }
+      
+        if ( "null".equals( sourceVersioning.getLastUpdated() ) )
+        {
+            sourceVersioning.setLastUpdated( null );
+        }
+
+        if ( "null".equals( targetVersioning.getLastUpdated() ) )
+        {
+            targetVersioning.setLastUpdated( null );
+        }
+
+        if ( sourceVersioning.getLastUpdated() == null || sourceVersioning.getLastUpdated().length() == 0 )
+        {
+            // this should only be for historical reasons - we assume local is newer
+            sourceVersioning.setLastUpdated( targetVersioning.getLastUpdated() );
+        }
+
+        if ( targetVersioning.getLastUpdated() == null || targetVersioning.getLastUpdated().length() == 0 ||
+             sourceVersioning.getLastUpdated().compareTo( targetVersioning.getLastUpdated() ) >= 0 )
+        {
+            changed = true;
+            targetVersioning.setLastUpdated( sourceVersioning.getLastUpdated() );
+
+            if ( sourceVersioning.getRelease() != null )
+            {
+                changed = true;
+                targetVersioning.setRelease( sourceVersioning.getRelease() );
+            }
+            if ( sourceVersioning.getLatest() != null )
+            {
+                changed = true;
+                targetVersioning.setLatest( sourceVersioning.getLatest() );
+            }
+
+            Snapshot s = targetVersioning.getSnapshot();
+            Snapshot snapshot = sourceVersioning.getSnapshot();
+            if ( snapshot != null )
+            {
+                if ( s == null )
+                {
+                    s = new Snapshot();
+                    targetVersioning.setSnapshot( s );
+                    changed = true;
+                }
+
+                // overwrite
+                if ( s.getTimestamp() == null ? snapshot.getTimestamp() != null
+                    : !s.getTimestamp().equals( snapshot.getTimestamp() ) )
+                {
+                    s.setTimestamp( snapshot.getTimestamp() );
+                    changed = true;
+                }
+                if ( s.getBuildNumber() != snapshot.getBuildNumber() )
+                {
+                    s.setBuildNumber( snapshot.getBuildNumber() );
+                    changed = true;
+                }
+                if ( s.isLocalCopy() != snapshot.isLocalCopy() )
+                {
+                    s.setLocalCopy( snapshot.isLocalCopy() );
+                    changed = true;
+                }
+            }
+        }
+    }
+    return changed;
+  }
+
+  public void setOperand( Object data )
+      throws MetadataException
+  {
+        if( data == null || !(data instanceof MetadataOperand) )
+          throw new MetadataException( lang.getMessage( "bad.operand", "MetadataOperand", data == null ? "null" : data.getClass().getName() ) );
+        
+        sourceMetadata = ((MetadataOperand)data).getOperand();
+  }
+
+}

Added: maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/Messages.properties
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/Messages.properties?rev=683105&view=auto
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/Messages.properties (added)
+++ maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/Messages.properties Tue Aug  5 21:48:39 2008
@@ -0,0 +1,3 @@
+bad.operand=Operand is not correct: expected {0}, bit got {1}
+empty.operand=Operand cannot be null or empty: {0}
+bad.string.data=cannot initialize from an empty string: {0}
\ 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/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=683105&r1=683104&r2=683105&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 Tue Aug  5 21:48:39 2008
@@ -1,10 +1,14 @@
 package org.apache.maven.mercury.repository.metadata;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 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.repository.metadata.io.xpp3.MetadataXpp3Reader;
 import org.apache.maven.mercury.repository.metadata.io.xpp3.MetadataXpp3Writer;
@@ -19,6 +23,7 @@
  */
 public class MetadataBuilder
 {
+  
   /**
    * instantiate Metadata from a stream
    * 
@@ -39,6 +44,14 @@
     }
   }
   
+  /**
+   * serialize metadata into xml
+   * 
+   * @param metadata to serialize
+   * @param out output to this stream
+   * @return same metadata as was passed in
+   * @throws MetadataException if any problems occured
+   */
   public static Metadata write( Metadata metadata, OutputStream out )
   throws MetadataException
   {
@@ -56,131 +69,61 @@
       throw new MetadataException(e);
     }
   }
-  
-  public static boolean merge( Metadata sourceMetadata, Metadata targetMetadata )
+
+  /**
+   * apply a list of operators to the specified serialized Metadata object
+   * 
+   * @param metadataBytes - serialized Metadata object
+   * @param mutators - operators
+   * @return changed serialized object
+   * @throws MetadataException
+   */
+  public static byte [] changeMetadata( byte [] metadataBytes, List<MetadataOperation> mutators )
+  throws MetadataException
   {
-      boolean changed = false;
-      
-      if( sourceMetadata == null || targetMetadata == null )
-        return false;
+    if( mutators == null || mutators.size() < 1 )
+      return metadataBytes;
+    
+    Metadata metadata;
+    if( metadataBytes == null || metadataBytes.length < 10 )
+    {
+      metadata = new Metadata();
+    }
+    else
+    {
+      ByteArrayInputStream in = new ByteArrayInputStream( metadataBytes );
+      metadata = read( in );
+    }
+    
+    for( MetadataOperation op : mutators )
+    {
+      boolean changed = op.perform( metadata );
+    }
+    
+    ByteArrayOutputStream out = new ByteArrayOutputStream();
+    write( metadata, out );
+    
+    byte [] res = out.toByteArray(); 
+    
+    return res; 
+  }
+
 
-      for ( java.util.Iterator i = sourceMetadata.getPlugins().iterator(); i.hasNext(); )
-      {
-          Plugin plugin = (Plugin) i.next();
-          boolean found = false;
-
-          for ( java.util.Iterator it = targetMetadata.getPlugins().iterator(); it.hasNext() && !found; )
-          {
-              Plugin preExisting = (Plugin) it.next();
-
-              if ( preExisting.getPrefix().equals( plugin.getPrefix() ) )
-              {
-                  found = true;
-              }
-          }
-
-          if ( !found )
-          {
-              Plugin mappedPlugin = new Plugin();
-
-              mappedPlugin.setArtifactId( plugin.getArtifactId() );
-
-              mappedPlugin.setPrefix( plugin.getPrefix() );
-
-              mappedPlugin.setName( plugin.getName() );
-
-              targetMetadata.addPlugin( mappedPlugin );
-
-              changed = true;
-          }
-      }
-
-      Versioning versioning = sourceMetadata.getVersioning();
-      if ( versioning != null )
-      {
-          Versioning v = targetMetadata.getVersioning();
-          if ( v == null )
-          {
-              v = new Versioning();
-              targetMetadata.setVersioning( v );
-              changed = true;
-          }
-
-          for ( java.util.Iterator i = versioning.getVersions().iterator(); i.hasNext(); )
-          {
-              String version = (String) i.next();
-              if ( !v.getVersions().contains( version ) )
-              {
-                  changed = true;
-                  v.getVersions().add( version );
-              }
-          }
-        
-          if ( "null".equals( versioning.getLastUpdated() ) )
-          {
-              versioning.setLastUpdated( null );
-          }
-
-          if ( "null".equals( v.getLastUpdated() ) )
-          {
-              v.setLastUpdated( null );
-          }
-
-          if ( versioning.getLastUpdated() == null || versioning.getLastUpdated().length() == 0 )
-          {
-              // this should only be for historical reasons - we assume local is newer
-              versioning.setLastUpdated( v.getLastUpdated() );
-          }
-
-          if ( v.getLastUpdated() == null || v.getLastUpdated().length() == 0 ||
-               versioning.getLastUpdated().compareTo( v.getLastUpdated() ) >= 0 )
-          {
-              changed = true;
-              v.setLastUpdated( versioning.getLastUpdated() );
-
-              if ( versioning.getRelease() != null )
-              {
-                  changed = true;
-                  v.setRelease( versioning.getRelease() );
-              }
-              if ( versioning.getLatest() != null )
-              {
-                  changed = true;
-                  v.setLatest( versioning.getLatest() );
-              }
-
-              Snapshot s = v.getSnapshot();
-              Snapshot snapshot = versioning.getSnapshot();
-              if ( snapshot != null )
-              {
-                  if ( s == null )
-                  {
-                      s = new Snapshot();
-                      v.setSnapshot( s );
-                      changed = true;
-                  }
-
-                  // overwrite
-                  if ( s.getTimestamp() == null ? snapshot.getTimestamp() != null
-                      : !s.getTimestamp().equals( snapshot.getTimestamp() ) )
-                  {
-                      s.setTimestamp( snapshot.getTimestamp() );
-                      changed = true;
-                  }
-                  if ( s.getBuildNumber() != snapshot.getBuildNumber() )
-                  {
-                      s.setBuildNumber( snapshot.getBuildNumber() );
-                      changed = true;
-                  }
-                  if ( s.isLocalCopy() != snapshot.isLocalCopy() )
-                  {
-                      s.setLocalCopy( snapshot.isLocalCopy() );
-                      changed = true;
-                  }
-              }
-          }
-      }
-      return changed;
+  /**
+   * apply an of operation to the specified serialized Metadata object
+   * 
+   * @param metadataBytes - serialized Metadata object
+   * @param op - operation
+   * @return changed serialized object
+   * @throws MetadataException
+   */
+  public static byte [] changeMetadata( byte [] metadataBytes, MetadataOperation op )
+  throws MetadataException
+  {
+    ArrayList<MetadataOperation> ops = new ArrayList<MetadataOperation>(1);
+    ops.add( op );
+    
+    return changeMetadata( metadataBytes, ops );
   }
   
   /**

Added: maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/MetadataOperand.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/MetadataOperand.java?rev=683105&view=auto
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/MetadataOperand.java (added)
+++ maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/MetadataOperand.java Tue Aug  5 21:48:39 2008
@@ -0,0 +1,31 @@
+package org.apache.maven.mercury.repository.metadata;
+
+import org.codehaus.plexus.i18n.DefaultLanguage;
+import org.codehaus.plexus.i18n.Language;
+
+/**
+ *
+ *
+ * @author Oleg Gusakov
+ * @version $Id$
+ *
+ */
+public class MetadataOperand
+    extends AbstractOperand
+{
+  private static final Language lang = new DefaultLanguage( MetadataOperand.class );
+  Metadata metadata;
+  
+  public MetadataOperand( Metadata data )
+  {
+    if( data == null  )
+      this.metadata = new Metadata();
+    else
+      this.metadata = data;
+  }
+  
+  public Metadata getOperand()
+  {
+    return metadata;
+  }
+}

Added: maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/MetadataOperation.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/MetadataOperation.java?rev=683105&view=auto
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/MetadataOperation.java (added)
+++ maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/MetadataOperation.java Tue Aug  5 21:48:39 2008
@@ -0,0 +1,24 @@
+package org.apache.maven.mercury.repository.metadata;
+
+/**
+ * change of a Metadata object
+ *
+ * @author Oleg Gusakov
+ * @version $Id$
+ *
+ */
+public interface MetadataOperation
+{
+  /** sets the operation's data */
+  public void setOperand( Object data )
+  throws MetadataException;
+  
+  /**
+   * performs the operation
+   *
+   * @param metadata to perform on
+   * @return true if operation changed the data
+   */
+  public boolean perform( Metadata metadata )
+  throws MetadataException;
+}

Added: 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=683105&view=auto
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/RemoveVersionOperation.java (added)
+++ maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/RemoveVersionOperation.java Tue Aug  5 21:48:39 2008
@@ -0,0 +1,74 @@
+package org.apache.maven.mercury.repository.metadata;
+
+import java.util.List;
+
+import org.codehaus.plexus.i18n.DefaultLanguage;
+import org.codehaus.plexus.i18n.Language;
+
+/**
+ * removes a version from Metadata
+ *
+ * @author Oleg Gusakov
+ * @version $Id$
+ *
+ */
+public class RemoveVersionOperation
+implements MetadataOperation
+{
+  private static final Language lang = new DefaultLanguage( RemoveVersionOperation.class );
+  
+  private String version;
+  
+  /**
+   * @throws MetadataException 
+   * 
+   */
+  public RemoveVersionOperation(  Object data  )
+  throws MetadataException
+  {
+    setOperand( data );
+  }
+  
+  public void setOperand( Object data )
+  throws MetadataException
+  {
+    if( data == null || !(data instanceof StringOperand) )
+      throw new MetadataException( lang.getMessage( "bad.operand", "StringOperand", data == null ? "null" : data.getClass().getName() ) );
+    
+    version = ((StringOperand)data).getOperand();
+  }
+
+  /**
+   * remove version to the in-memory metadata instance
+   * 
+   * @param metadata
+   * @param version
+   * @return
+   */
+  public boolean perform( Metadata metadata )
+  throws MetadataException
+  {
+    if( metadata == null )
+      return false;
+    
+    Versioning vs = metadata.getVersioning(); 
+    
+    if( vs == null )
+    {
+      return false;
+    }
+    
+    if( vs.getVersions() != null && vs.getVersions().size() > 0 )
+    {
+      List<String> vl = vs.getVersions();
+      if( ! vl.contains( version ) )
+        return false;
+    }
+    
+    vs.removeVersion( version );
+    vs.setLastUpdated( MetadataBuilder.getUTCTimestamp() );
+    
+    return true;
+  }
+
+}

Added: maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/StringOperand.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/StringOperand.java?rev=683105&view=auto
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/StringOperand.java (added)
+++ maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/main/java/org/apache/maven/mercury/repository/metadata/StringOperand.java Tue Aug  5 21:48:39 2008
@@ -0,0 +1,30 @@
+package org.apache.maven.mercury.repository.metadata;
+
+import org.codehaus.plexus.i18n.DefaultLanguage;
+import org.codehaus.plexus.i18n.Language;
+
+/**
+ * String storage
+ *
+ * @author Oleg Gusakov
+ * @version $Id$
+ *
+ */
+public class StringOperand
+    extends AbstractOperand
+{
+  private static final Language lang = new DefaultLanguage( StringOperand.class );
+  String str;
+  
+  public StringOperand( String data )
+  {
+    if( data == null || data.length() < 1 )
+      throw new IllegalArgumentException( lang.getMessage( "bad.string.data", data ) );
+    this.str = data;
+  }
+  
+  public String getOperand()
+  {
+    return str;
+  }
+}

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=683105&r1=683104&r2=683105&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 Tue Aug  5 21:48:39 2008
@@ -5,6 +5,7 @@
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.List;
 
 import junit.framework.TestCase;
@@ -33,7 +34,7 @@
     if( temp.exists() )
       temp.delete();
   }
-
+  //-------------------------------------------------------------------------
   protected void tearDown()
   throws Exception
   {
@@ -86,5 +87,195 @@
      assertEquals( 2, versions.size() );
   }
   //-------------------------------------------------------------------------
+  public void testMergeOperation()
+  throws FileNotFoundException, IOException, XmlPullParserException, MetadataException
+  {
+    File groupMd = new File( testBase, "group-maven-metadata.xml");
+    byte [] targetBytes = readRawData( groupMd );
+
+    Metadata source = new Metadata();
+    source.setGroupId( "a" );
+    source.setArtifactId( "a" );
+    source.setVersion( "1.0.0" );
+    Versioning v = new Versioning();
+    v.addVersion( "1.0.0" );
+    v.addVersion( "2.0.0" );
+    source.setVersioning( v );
+    
+    byte [] resBytes = MetadataBuilder.changeMetadata( targetBytes, new MergeOperation( new MetadataOperand(source) ) );
+    
+    File resFile = new File( testBase, "group-maven-metadata-write.xml");
+
+    writeRawData( resFile, resBytes );
+    
+     Metadata mmd = MetadataBuilder.read( new FileInputStream(resFile) );
+
+     assertNotNull( mmd );
+     assertEquals("a", mmd.getGroupId() );
+     assertEquals("a", mmd.getArtifactId() );
+     assertEquals("4", mmd.getVersion() );
+
+     assertNotNull( mmd.getVersioning() );
+    
+     List<String> versions = mmd.getVersioning().getVersions();
+    
+     assertNotNull( versions );
+     assertEquals( 6, versions.size() );
+     assertTrue( versions.contains("1") );
+     assertTrue( versions.contains("2") );
+     assertTrue( versions.contains("3") );
+     assertTrue( versions.contains("4") );
+     assertTrue( versions.contains("1.0.0") );
+     assertTrue( versions.contains("2.0.0") );
+  }
+  //-------------------------------------------------------------------------
+  public void testAddVersionOperation()
+  throws FileNotFoundException, IOException, XmlPullParserException, MetadataException
+  {
+    File groupMd = new File( testBase, "group-maven-metadata.xml");
+    byte [] targetBytes = readRawData( groupMd );
+
+    byte [] resBytes = MetadataBuilder.changeMetadata( targetBytes, new AddVersionOperation( new StringOperand("5") ) );
+    
+    File resFile = new File( testBase, "group-maven-metadata-write.xml");
+
+    writeRawData( resFile, resBytes );
+    
+     Metadata mmd = MetadataBuilder.read( new FileInputStream(resFile) );
+
+     assertNotNull( mmd );
+     assertEquals("a", mmd.getGroupId() );
+     assertEquals("a", mmd.getArtifactId() );
+     assertEquals("4", mmd.getVersion() );
+
+     assertNotNull( mmd.getVersioning() );
+    
+     List<String> versions = mmd.getVersioning().getVersions();
+    
+     assertNotNull( versions );
+     assertEquals( 5, versions.size() );
+     assertTrue( versions.contains("1") );
+     assertTrue( versions.contains("2") );
+     assertTrue( versions.contains("3") );
+     assertTrue( versions.contains("4") );
+     assertTrue( versions.contains("5") );
+  }
+  //-------------------------------------------------------------------------
+  public void testRemoveVersionOperation()
+  throws FileNotFoundException, IOException, XmlPullParserException, MetadataException
+  {
+    File groupMd = new File( testBase, "group-maven-metadata.xml");
+    byte [] targetBytes = readRawData( groupMd );
+
+    byte [] resBytes = MetadataBuilder.changeMetadata( targetBytes, new RemoveVersionOperation( new StringOperand("1") ) );
+    
+    File resFile = new File( testBase, "group-maven-metadata-write.xml");
+
+    writeRawData( resFile, resBytes );
+    
+     Metadata mmd = MetadataBuilder.read( new FileInputStream(resFile) );
+
+     assertNotNull( mmd );
+     assertEquals("a", mmd.getGroupId() );
+     assertEquals("a", mmd.getArtifactId() );
+     assertEquals("4", mmd.getVersion() );
+
+     assertNotNull( mmd.getVersioning() );
+    
+     List<String> versions = mmd.getVersioning().getVersions();
+    
+     assertNotNull( versions );
+     assertEquals( 3, versions.size() );
+     assertTrue( !versions.contains("1") );
+     assertTrue( versions.contains("2") );
+     assertTrue( versions.contains("3") );
+     assertTrue( versions.contains("4") );
+  }
+  //-------------------------------------------------------------------------
+  public void testMultipleOperations()
+  throws FileNotFoundException, IOException, XmlPullParserException, MetadataException
+  {
+    File groupMd = new File( testBase, "group-maven-metadata.xml");
+    byte [] targetBytes = readRawData( groupMd );
+
+    ArrayList<MetadataOperation> ops = new ArrayList<MetadataOperation>(2);
+    ops.add( new RemoveVersionOperation( new StringOperand("1") ) );
+    ops.add( new AddVersionOperation( new StringOperand("8") ) );
+    
+    byte [] resBytes = MetadataBuilder.changeMetadata( targetBytes, ops  );
+    
+    File resFile = new File( testBase, "group-maven-metadata-write.xml");
+
+    writeRawData( resFile, resBytes );
+    
+     Metadata mmd = MetadataBuilder.read( new FileInputStream(resFile) );
+
+     assertNotNull( mmd );
+     assertEquals("a", mmd.getGroupId() );
+     assertEquals("a", mmd.getArtifactId() );
+     assertEquals("4", mmd.getVersion() );
+
+     assertNotNull( mmd.getVersioning() );
+    
+     List<String> versions = mmd.getVersioning().getVersions();
+    
+     assertNotNull( versions );
+     assertEquals( 4, versions.size() );
+     assertTrue( !versions.contains("1") );
+     assertTrue( versions.contains("2") );
+     assertTrue( versions.contains("3") );
+     assertTrue( versions.contains("4") );
+     assertTrue( versions.contains("8") );
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  private byte[] readRawData( File file )
+  throws IOException
+  {
+    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  e;
+    }
+    finally
+    {
+      if( fis != null ) try { fis.close(); } catch( Exception any ) {}
+    }
+  }
+  //---------------------------------------------------------------------------------------------------------------
+  private void writeRawData( File file, byte [] bytes )
+  throws IOException
+  {
+    if( file.exists() )
+      file.delete();
+    
+    FileOutputStream fos = null;
+    
+    try
+    {
+      fos = new FileOutputStream( file );
+      fos.write( bytes );
+    }
+    catch( IOException e )
+    {
+      throw  e;
+    }
+    finally
+    {
+      if( fos != null ) try { fos.close(); } catch( Exception any ) {}
+    }
+  }
+  //-------------------------------------------------------------------------
   //-------------------------------------------------------------------------
 }

Modified: maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/test/resources/controlledRepo/group-maven-metadata.xml
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/test/resources/controlledRepo/group-maven-metadata.xml?rev=683105&r1=683104&r2=683105&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/test/resources/controlledRepo/group-maven-metadata.xml (original)
+++ maven/sandbox/trunk/mercury/mercury-md/mercury-md-shared/src/test/resources/controlledRepo/group-maven-metadata.xml Tue Aug  5 21:48:39 2008
@@ -1,4 +1,5 @@
-<?xml version="1.0" encoding="UTF-8"?><metadata>
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata>
   <groupId>a</groupId>
   <artifactId>a</artifactId>
   <version>4</version>