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>