import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.factory.ArtifactFactory;
+import org.apache.maven.artifact.metadata.ArtifactMetadata;
import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata;
+import org.apache.maven.artifact.repository.metadata.Metadata;
+import org.apache.maven.artifact.repository.metadata.Snapshot;
+import org.apache.maven.artifact.repository.metadata.SnapshotArtifactRepositoryMetadata;
+import org.apache.maven.artifact.repository.metadata.Versioning;
+import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader;
+import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Writer;
import org.apache.maven.model.converter.ArtifactPomRewriter;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.IOUtil;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import java.io.File;
+import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
import java.io.Writer;
import java.util.Iterator;
import java.util.List;
+import java.util.regex.Matcher;
/**
* Implementation of repository conversion class.
copyArtifact( artifact, targetRepository );
copyPom( artifact, targetRepository );
+
+ Metadata metadata = createBaseMetadata( artifact );
+ Versioning versioning = new Versioning();
+ versioning.addVersion( artifact.getBaseVersion() );
+ metadata.setVersioning( versioning );
+ updateMetadata( new ArtifactRepositoryMetadata( artifact ), targetRepository, metadata );
+
+ metadata = createBaseMetadata( artifact );
+ metadata.setVersion( artifact.getBaseVersion() );
+ versioning = new Versioning();
+
+ Matcher matcher = Artifact.VERSION_FILE_PATTERN.matcher( artifact.getVersion() );
+ if ( matcher.matches() )
+ {
+ Snapshot snapshot = new Snapshot();
+ snapshot.setBuildNumber( Integer.valueOf( matcher.group( 3 ) ).intValue() );
+ snapshot.setTimestamp( matcher.group( 2 ) );
+ versioning.setSnapshot( snapshot );
+ }
+
+ // TODO: merge latest/release/snapshot from source instead
+ metadata.setVersioning( versioning );
+ updateMetadata( new SnapshotArtifactRepositoryMetadata( artifact ), targetRepository, metadata );
+ }
+
+ private static Metadata createBaseMetadata( Artifact artifact )
+ {
+ Metadata metadata = new Metadata();
+ metadata.setArtifactId( artifact.getArtifactId() );
+ metadata.setGroupId( artifact.getGroupId() );
+ return metadata;
+ }
+
+ private void updateMetadata( ArtifactMetadata artifactMetadata, ArtifactRepository targetRepository,
+ Metadata newMetadata )
+ throws RepositoryConversionException
+ {
+ File file = new File( targetRepository.getBasedir(),
+ targetRepository.pathOfRemoteRepositoryMetadata( artifactMetadata ) );
+
+ Metadata metadata;
+ boolean changed;
+
+ if ( file.exists() )
+ {
+ MetadataXpp3Reader reader = new MetadataXpp3Reader();
+ FileReader fileReader = null;
+ try
+ {
+ fileReader = new FileReader( file );
+ metadata = reader.read( fileReader );
+ }
+ catch ( IOException e )
+ {
+ throw new RepositoryConversionException( "Error reading target metadata", e );
+ }
+ catch ( XmlPullParserException e )
+ {
+ throw new RepositoryConversionException( "Error reading target metadata", e );
+ }
+ finally
+ {
+ IOUtil.close( fileReader );
+ }
+ changed = metadata.merge( newMetadata );
+ }
+ else
+ {
+ changed = true;
+ metadata = newMetadata;
+ }
+
+ if ( changed )
+ {
+ Writer writer = null;
+ try
+ {
+ file.getParentFile().mkdirs();
+ writer = new FileWriter( file );
+
+ MetadataXpp3Writer mappingWriter = new MetadataXpp3Writer();
+
+ mappingWriter.write( writer, metadata );
+ }
+ catch ( IOException e )
+ {
+ throw new RepositoryConversionException( "Error writing target metadata", e );
+ }
+ finally
+ {
+ IOUtil.close( writer );
+ }
+ }
}
private void copyPom( Artifact artifact, ArtifactRepository targetRepository )
{
Artifact pom = artifactFactory.createProjectArtifact( artifact.getGroupId(), artifact.getArtifactId(),
artifact.getVersion() );
+ pom.setBaseVersion( artifact.getBaseVersion() );
ArtifactRepository repository = artifact.getRepository();
File file = new File( repository.getBasedir(), repository.pathOf( pom ) );
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.factory.ArtifactFactory;
+import org.apache.maven.artifact.metadata.ArtifactMetadata;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
+import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata;
+import org.apache.maven.artifact.repository.metadata.SnapshotArtifactRepositoryMetadata;
import org.codehaus.plexus.PlexusTestCase;
import org.codehaus.plexus.util.FileUtils;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import java.util.regex.Matcher;
/**
* Test the repository converter.
* @todo what about deletions from the source repository?
* @todo use artifact-test instead
* @todo should reject if dependencies are missing - rely on reporting?
+ * @todo group metadata
+ * @todo write timestamp into the metadata
*/
public class RepositoryConverterTest
extends PlexusTestCase
File sourcePomFile = new File( sourceRepository.getBasedir(), sourceRepository.pathOf( artifact ) );
assertTrue( "Check POM created", pomFile.exists() );
- String sourceContent = FileUtils.fileRead( sourcePomFile ).trim();
- String targetContent = FileUtils.fileRead( pomFile ).trim();
- assertEquals( "Check POM matches", sourceContent, targetContent );
+ compareFiles( sourcePomFile, pomFile );
+
+ // TODO: metadata
}
public void testV3PomConvert()
compareFiles( expectedPomFile, pomFile );
- // TODO: test warnings (separate test?)
+ // TODO: metadata
}
- private static void compareFiles( File expectedPomFile, File pomFile )
- throws IOException
+ public void testV3PomWarningsOnConvert()
{
- String expectedContent = normalizeString( FileUtils.fileRead( expectedPomFile ) );
- String targetContent = normalizeString( FileUtils.fileRead( pomFile ) );
- assertEquals( "Check POM was converted", expectedContent, targetContent );
+ // test that the pom is converted but that warnings are reported
+
+ // TODO
}
- private static String normalizeString( String path )
+ public void testV4SnapshotPomConvert()
+ throws IOException, RepositoryConversionException
{
- return path.trim().replace( "\r\n", "\n" ).replace( '\r', '\n' );
+ // test that it is copied as is
+
+ Artifact artifact = createArtifact( "test", "v4artifact", "1.0.0-SNAPSHOT" );
+ ArtifactMetadata artifactMetadata = new ArtifactRepositoryMetadata( artifact );
+ File artifactMetadataFile = new File( targetRepository.getBasedir(),
+ targetRepository.pathOfRemoteRepositoryMetadata( artifactMetadata ) );
+ artifactMetadataFile.delete();
+
+ ArtifactMetadata snapshotMetadata = new SnapshotArtifactRepositoryMetadata( artifact );
+ File snapshotMetadataFile = new File( targetRepository.getBasedir(),
+ targetRepository.pathOfRemoteRepositoryMetadata( snapshotMetadata ) );
+ snapshotMetadataFile.delete();
+
+ repositoryConverter.convert( artifact, targetRepository );
+
+ File artifactFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) );
+ assertTrue( "Check artifact created", artifactFile.exists() );
+ assertTrue( "Check artifact matches", FileUtils.contentEquals( artifactFile, artifact.getFile() ) );
+
+ artifact = createPomArtifact( artifact );
+ File pomFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) );
+ File sourcePomFile = new File( sourceRepository.getBasedir(), sourceRepository.pathOf( artifact ) );
+ assertTrue( "Check POM created", pomFile.exists() );
+
+ compareFiles( sourcePomFile, pomFile );
+
+ assertTrue( "Check artifact metadata created", artifactMetadataFile.exists() );
+
+ File expectedMetadataFile = getTestFile( "src/test/expected-files/v4-artifact-metadata.xml" );
+
+ compareFiles( expectedMetadataFile, artifactMetadataFile );
+
+ assertTrue( "Check snapshot metadata created", snapshotMetadataFile.exists() );
+
+ expectedMetadataFile = getTestFile( "src/test/expected-files/v4-snapshot-metadata.xml" );
+
+ compareFiles( expectedMetadataFile, snapshotMetadataFile );
+ }
+
+ public void testV3SnapshotPomConvert()
+ throws IOException, RepositoryConversionException
+ {
+ // test that the pom is coverted
+
+ Artifact artifact = createArtifact( "test", "v3artifact", "1.0.0-SNAPSHOT" );
+ ArtifactMetadata artifactMetadata = new ArtifactRepositoryMetadata( artifact );
+ File artifactMetadataFile = new File( targetRepository.getBasedir(),
+ targetRepository.pathOfRemoteRepositoryMetadata( artifactMetadata ) );
+ artifactMetadataFile.delete();
+
+ ArtifactMetadata snapshotMetadata = new SnapshotArtifactRepositoryMetadata( artifact );
+ File snapshotMetadataFile = new File( targetRepository.getBasedir(),
+ targetRepository.pathOfRemoteRepositoryMetadata( snapshotMetadata ) );
+ snapshotMetadataFile.delete();
+
+ repositoryConverter.convert( artifact, targetRepository );
+
+ File artifactFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) );
+ assertTrue( "Check artifact created", artifactFile.exists() );
+ assertTrue( "Check artifact matches", FileUtils.contentEquals( artifactFile, artifact.getFile() ) );
+
+ artifact = createPomArtifact( artifact );
+ File pomFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) );
+ File expectedPomFile = getTestFile( "src/test/expected-files/converted-v3-snapshot.pom" );
+ assertTrue( "Check POM created", pomFile.exists() );
+
+ compareFiles( expectedPomFile, pomFile );
+
+ assertTrue( "Check artifact metadata created", artifactMetadataFile.exists() );
+
+ File expectedMetadataFile = getTestFile( "src/test/expected-files/v3-artifact-metadata.xml" );
+
+ compareFiles( expectedMetadataFile, artifactMetadataFile );
+
+ assertTrue( "Check snapshot metadata created", snapshotMetadataFile.exists() );
+
+ expectedMetadataFile = getTestFile( "src/test/expected-files/v3-snapshot-metadata.xml" );
+
+ compareFiles( expectedMetadataFile, snapshotMetadataFile );
+ }
+
+ public void testV4TimestampedSnapshotPomConvert()
+ throws IOException, RepositoryConversionException
+ {
+ // test that it is copied as is
+
+ Artifact artifact = createArtifact( "test", "v4artifact", "1.0.0-20060111.120115-1" );
+ ArtifactMetadata artifactMetadata = new ArtifactRepositoryMetadata( artifact );
+ File artifactMetadataFile = new File( targetRepository.getBasedir(),
+ targetRepository.pathOfRemoteRepositoryMetadata( artifactMetadata ) );
+ artifactMetadataFile.delete();
+
+ ArtifactMetadata snapshotMetadata = new SnapshotArtifactRepositoryMetadata( artifact );
+ File snapshotMetadataFile = new File( targetRepository.getBasedir(),
+ targetRepository.pathOfRemoteRepositoryMetadata( snapshotMetadata ) );
+ snapshotMetadataFile.delete();
+
+ repositoryConverter.convert( artifact, targetRepository );
+
+ File artifactFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) );
+ assertTrue( "Check artifact created", artifactFile.exists() );
+ assertTrue( "Check artifact matches", FileUtils.contentEquals( artifactFile, artifact.getFile() ) );
+
+ artifact = createPomArtifact( artifact );
+ File pomFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) );
+ File sourcePomFile = new File( sourceRepository.getBasedir(), sourceRepository.pathOf( artifact ) );
+ assertTrue( "Check POM created", pomFile.exists() );
+
+ compareFiles( sourcePomFile, pomFile );
+
+ assertTrue( "Check artifact metadata created", artifactMetadataFile.exists() );
+
+ File expectedMetadataFile = getTestFile( "src/test/expected-files/v4-artifact-metadata.xml" );
+
+ compareFiles( expectedMetadataFile, artifactMetadataFile );
+
+ assertTrue( "Check snapshot metadata created", snapshotMetadataFile.exists() );
+
+ expectedMetadataFile = getTestFile( "src/test/expected-files/v4-timestamped-snapshot-metadata.xml" );
+
+ compareFiles( expectedMetadataFile, snapshotMetadataFile );
+ }
+
+ public void testV3TimestampedSnapshotPomConvert()
+ throws IOException, RepositoryConversionException
+ {
+ // test that the pom is coverted
+
+ Artifact artifact = createArtifact( "test", "v3artifact", "1.0.0-20060105.130101-3" );
+ ArtifactMetadata artifactMetadata = new ArtifactRepositoryMetadata( artifact );
+ File artifactMetadataFile = new File( targetRepository.getBasedir(),
+ targetRepository.pathOfRemoteRepositoryMetadata( artifactMetadata ) );
+ artifactMetadataFile.delete();
+
+ ArtifactMetadata snapshotMetadata = new SnapshotArtifactRepositoryMetadata( artifact );
+ File snapshotMetadataFile = new File( targetRepository.getBasedir(),
+ targetRepository.pathOfRemoteRepositoryMetadata( snapshotMetadata ) );
+ snapshotMetadataFile.delete();
+
+ repositoryConverter.convert( artifact, targetRepository );
+
+ File artifactFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) );
+ assertTrue( "Check artifact created", artifactFile.exists() );
+ assertTrue( "Check artifact matches", FileUtils.contentEquals( artifactFile, artifact.getFile() ) );
+
+ artifact = createPomArtifact( artifact );
+ File pomFile = new File( targetRepository.getBasedir(), targetRepository.pathOf( artifact ) );
+ File expectedPomFile = getTestFile( "src/test/expected-files/converted-v3-timestamped-snapshot.pom" );
+ assertTrue( "Check POM created", pomFile.exists() );
+
+ compareFiles( expectedPomFile, pomFile );
+
+ assertTrue( "Check artifact snapshotMetadata created", artifactMetadataFile.exists() );
+
+ File expectedMetadataFile = getTestFile( "src/test/expected-files/v3-artifact-metadata.xml" );
+
+ compareFiles( expectedMetadataFile, artifactMetadataFile );
+
+ assertTrue( "Check snapshot snapshotMetadata created", snapshotMetadataFile.exists() );
+
+ expectedMetadataFile = getTestFile( "src/test/expected-files/v3-timestamped-snapshot-metadata.xml" );
+
+ compareFiles( expectedMetadataFile, snapshotMetadataFile );
}
public void testNoPomConvert()
repositoryConverter.convert( artifact, targetRepository );
- String expectedContent = FileUtils.fileRead( sourceFile ).trim();
- String targetContent = FileUtils.fileRead( targetFile ).trim();
- assertEquals( "Check file matches", expectedContent, targetContent );
-
- expectedContent = FileUtils.fileRead( sourcePomFile ).trim();
- targetContent = FileUtils.fileRead( targetPomFile ).trim();
- assertEquals( "Check POM matches", expectedContent, targetContent );
+ compareFiles( sourceFile, targetFile );
+ compareFiles( sourcePomFile, targetPomFile );
assertEquals( "Check unmodified", origTime, targetFile.lastModified() );
assertEquals( "Check unmodified", origPomTime, targetPomFile.lastModified() );
repositoryConverter.convert( artifact, targetRepository );
- String expectedContent = FileUtils.fileRead( sourceFile ).trim();
- String targetContent = FileUtils.fileRead( targetFile ).trim();
- assertEquals( "Check file matches", expectedContent, targetContent );
-
- expectedContent = FileUtils.fileRead( sourcePomFile ).trim();
- targetContent = FileUtils.fileRead( targetPomFile ).trim();
- assertEquals( "Check POM matches", expectedContent, targetContent );
+ compareFiles( sourceFile, targetFile );
+ compareFiles( sourcePomFile, targetPomFile );
assertFalse( "Check modified", origTime == targetFile.lastModified() );
assertFalse( "Check modified", origPomTime == targetPomFile.lastModified() );
// TODO
}
- public void testSnapshotArtifact()
- {
- // test snapshot artifact is converted
-
- // TODO
- }
-
public void testInvalidSourceSnapshotMetadata()
{
// test artifact is not converted when source snapshot metadata is invalid and returns failure
// TODO
}
- public void testCreateArtifactMetadata()
- {
- // test artifact level metadata is created when it doesn't exist on successful conversion
-
- // TODO
- }
-
- public void testCreateSnapshotMetadata()
- {
- // test snapshot metadata is created when it doesn't exist on successful conversion
-
- // TODO
- }
-
public void testMergeArtifactMetadata()
{
// test artifact level metadata is merged when it already exists on successful conversion
private Artifact createArtifact( String groupId, String artifactId, String version )
{
- return createArtifact( groupId, artifactId, version, "jar" );
+ Matcher matcher = Artifact.VERSION_FILE_PATTERN.matcher( version );
+ String baseVersion;
+ if ( matcher.matches() )
+ {
+ baseVersion = matcher.group( 1 ) + "-SNAPSHOT";
+ }
+ else
+ {
+ baseVersion = version;
+ }
+ return createArtifact( groupId, artifactId, baseVersion, version, "jar" );
}
- private Artifact createArtifact( String groupId, String artifactId, String version, String type )
+ private Artifact createArtifact( String groupId, String artifactId, String baseVersion, String version,
+ String type )
{
Artifact artifact = artifactFactory.createArtifact( groupId, artifactId, version, null, type );
+ artifact.setBaseVersion( baseVersion );
artifact.setRepository( sourceRepository );
artifact.setFile( new File( sourceRepository.getBasedir(), sourceRepository.pathOf( artifact ) ) );
return artifact;
private Artifact createPomArtifact( Artifact artifact )
{
- return createArtifact( artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), "pom" );
+ return createArtifact( artifact.getGroupId(), artifact.getArtifactId(), artifact.getBaseVersion(),
+ artifact.getVersion(), "pom" );
+ }
+
+ private static void compareFiles( File expectedPomFile, File pomFile )
+ throws IOException
+ {
+ String expectedContent = normalizeString( FileUtils.fileRead( expectedPomFile ) );
+ String targetContent = normalizeString( FileUtils.fileRead( pomFile ) );
+ assertEquals( "Check file match", expectedContent, targetContent );
+ }
+
+ private static String normalizeString( String path )
+ {
+ return path.trim().replace( "\r\n", "\n" ).replace( '\r', '\n' );
}
}