[MRM-980] ability to merge repositories

submitted by Patti Arachchige Eshan Sudharaka (for GSoC)

o added new plugin module for repository merge


git-svn-id: https://svn.apache.org/repos/asf/archiva/branches/archiva-MRM-980@959880 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Maria Odea B. Ching 2010-07-02 07:18:44 +00:00
parent 4580974158
commit 626279bf89
11 changed files with 2252 additions and 1 deletions

View File

@ -35,6 +35,7 @@
<!-- TODO: eventually not a core plugin, needs to be moved to a separate tree, with it's own Selenium tests -->
<module>npanday-support</module>
<module>maven1-repository</module>
<module>stage-repository-merge</module>
<module>generic-metadata-support</module>
</modules>
</project>
</project>

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>stage-repository-merge</name>
<comment>Archiva is an application for managing one or more remote
repositories, including administration, artifact handling,
browsing and searching. NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse.</comment>
<projects>
<project>archiva-checksum</project>
<project>archiva-common</project>
<project>archiva-configuration</project>
<project>archiva-consumer-api</project>
<project>archiva-model</project>
<project>archiva-policies</project>
<project>archiva-repository-layer</project>
<project>archiva-xml-tools</project>
<project>maven2-repository</project>
<project>metadata-model</project>
<project>metadata-repository-api</project>
<project>problem-reports</project>
<project>test-repository</project>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@ -0,0 +1,112 @@
<?xml version="1.0" encoding="UTF-8"?>
<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>plugins</artifactId>
<groupId>org.apache.archiva</groupId>
<version>1.4-SNAPSHOT</version>
</parent>
<groupId>org.apache.archiva</groupId>
<artifactId>stage-repository-merge</artifactId>
<name>stage-repository-merge</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-spring</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.archiva</groupId>
<artifactId>metadata-repository-api</artifactId>
<version>1.4-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.archiva</groupId>
<artifactId>archiva-repository-layer</artifactId>
<version>1.4-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.archiva</groupId>
<artifactId>maven2-repository</artifactId>
<version>1.4-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.archiva</groupId>
<artifactId>archiva-model</artifactId>
<version>1.4-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.archiva</groupId>
<artifactId>test-repository</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>test-repository</id>
<phase>generate-test-resources</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
<configuration>
<includeArtifactIds>test-repository</includeArtifactIds>
<outputDirectory>target/test-repository</outputDirectory>
<excludes>META-INF/**</excludes>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-component-metadata</artifactId>
<version>1.0-beta-3.0.5</version>
<executions>
<execution>
<id>process-classes</id>
<goals>
<goal>generate-metadata</goal>
</goals>
</execution>
<execution>
<id>process-test-classes</id>
<goals>
<goal>generate-test-metadata</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

View File

@ -0,0 +1,161 @@
package org.apache.archiva.stagerepository.merge.repodetails;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import org.apache.archiva.metadata.repository.MetadataResolver;
import org.apache.archiva.metadata.repository.storage.maven2.MavenArtifactFacet;
import org.apache.maven.archiva.model.ArchivaArtifact;
import org.apache.archiva.metadata.model.ArtifactMetadata;
import java.util.List;
import java.util.Collection;
import java.util.ArrayList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @plexus.component role="org.apache.archiva.stagerepository.merge.repodetails.SourceAritfacts"
*/
public class SourceAritfacts
{
/**
* @plexus.requirement
*/
private MetadataResolver metadataResolver;
private ArrayList<String> rootNameSpacesList;
private ArrayList<String> gruopIdList;
private ArrayList<String> artifactsList;
private ArrayList<String> artifactsVersionsList;
private List<ArchivaArtifact> artifactsListWithDetails;
private String repoId;
private static final Logger log = LoggerFactory.getLogger( SourceAritfacts.class );
public String getRepoId()
{
return repoId;
}
public void setRepoId( String repoId )
{
this.repoId = repoId;
}
// this methos returns a ArtifactMetaData List.(i guess no harm due to hardcoding the Artifact type and version)
public Collection<ArtifactMetadata> getSourceArtifactsMetaData( ArchivaArtifact artifact )
{
return metadataResolver.getArtifacts( artifact.getRepositoryId(), artifact.getGroupId(),
artifact.getArtifactId(), artifact.getVersion() );
}
public Collection<ArchivaArtifact> getSourceArtifactList()
{
artifactsListWithDetails = new ArrayList<ArchivaArtifact>();
process();
return artifactsListWithDetails;
}
public void setMetadataResolver( MetadataResolver metadataResolver )
{
this.metadataResolver = metadataResolver;
}
private void process()
{
// this will get the root name spaces eg : org, com
rootNameSpacesList = (ArrayList<String>) metadataResolver.getRootNamespaces( repoId );
gruopIdList = new ArrayList<String>();
artifactsList = new ArrayList<String>();
// following iterates through the root name spaces list and get the gruo id of relavet root name spaces.
for ( String namespace : rootNameSpacesList )
{
// this will get the gruop id list of relavant name space . eg : org > archiva(gruop id)
gruopIdList = (ArrayList<String>) metadataResolver.getNamespaces( repoId, namespace );
// following will iterates through the particular gruop id 's
for ( String gruopId : gruopIdList )
{
// parse the parameters "repoId" and "namespace + gruop id "to artifacts list. eg : params = ("internal"
// , "org.archiva")
artifactsList = (ArrayList<String>) metadataResolver.getNamespaces( repoId, namespace + "." + gruopId );
for ( String artifact : artifactsList )
{
// iterates through the artifacts and get the available versions of a particular artifact
artifactsVersionsList =
(ArrayList<String>) metadataResolver.getProjectVersions( repoId, namespace + "." + gruopId,
artifact );
for ( String version : artifactsVersionsList )
{
// assign gathered attributes Artifact object and add it in to the list
artifactsListWithDetails.addAll( getArtifactMetadata( repoId, gruopId, artifact, version ) );
}
}
}
}
}
private Collection<ArchivaArtifact> getArtifactMetadata( String repoId, String gruopId, String artifactId,
String version )
{
MavenArtifactFacet facet = null;
List<ArchivaArtifact> artifactList = new ArrayList<ArchivaArtifact>();
ArrayList<ArtifactMetadata> artifactMetaDataList =
(ArrayList<ArtifactMetadata>) metadataResolver.getArtifacts( repoId, gruopId, artifactId, version );
for ( ArtifactMetadata artifactMetadata : artifactMetaDataList )
{
facet = (MavenArtifactFacet) artifactMetadata.getFacet( MavenArtifactFacet.FACET_ID );
if ( facet != null )
{
artifactList.add( new ArchivaArtifact( gruopId, artifactId, version, facet.getClassifier(),
facet.getType(), repoId ) );
}
else
{
artifactList.add( new ArchivaArtifact( gruopId, artifactId, version, "", "jar", repoId ) );
}
}
return artifactList;
}
}

View File

@ -0,0 +1,407 @@
package org.apache.archiva.stagerepository.merge.repomerge;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import org.apache.archiva.stagerepository.merge.repodetails.SourceAritfacts;
import org.apache.archiva.metadata.repository.MetadataResolver;
import org.apache.archiva.metadata.model.ArtifactMetadata;
import org.apache.maven.archiva.model.ArchivaArtifact;
import org.apache.maven.archiva.model.ArchivaRepositoryMetadata;
import org.apache.maven.archiva.configuration.Configuration;
import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
import org.apache.maven.archiva.configuration.ArchivaConfiguration;
import org.apache.maven.archiva.repository.ManagedRepositoryContent;
import org.apache.maven.archiva.repository.RepositoryContentFactory;
import org.apache.maven.archiva.repository.RepositoryNotFoundException;
import org.apache.maven.archiva.repository.RepositoryException;
import org.apache.maven.archiva.repository.metadata.MetadataTools;
import org.apache.maven.archiva.repository.metadata.RepositoryMetadataException;
import org.apache.maven.archiva.repository.metadata.RepositoryMetadataReader;
import org.apache.maven.archiva.repository.metadata.RepositoryMetadataWriter;
import org.apache.maven.archiva.common.utils.VersionComparator;
import org.apache.maven.archiva.common.utils.VersionUtil;
import java.util.*;
import java.io.File;
import java.io.IOException;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
/**
* @plexus.component role="org.apache.archiva.stagerepository.merge.repomerge.ArtifactsMerger"
*/
public class ArtifactsMerger
{
/**
* @plexus.requirement
*/
private MetadataResolver metadataResolver;
/**
* @plexus.requirement
*/
private RepositoryContentFactory repositoryFactory;
/**
* @plexus.requirement role-hint="default"
*/
private ArchivaConfiguration configuration;
private SourceAritfacts sourceArtifacts;
private String targetRepo;
private String sourceRepo;
private ArrayList<ArchivaArtifact> sourceArtifactsList;
private Configuration config;
private ManagedRepositoryConfiguration targetRepoConfig;
private ManagedRepositoryConfiguration sourceRepoConfig;
private ManagedRepositoryContent targetRepository;
private ManagedRepositoryContent sourceRepository;
private final static String PATH_SEPERATOR = "/";
public void setMetadataResolver( MetadataResolver metadataResolver )
{
this.metadataResolver = metadataResolver;
}
public void setSourceArtifacts( SourceAritfacts sourceArtifacts )
{
this.sourceArtifacts = sourceArtifacts;
setSourceArtifactsList();
}
public void setConfiguration( ArchivaConfiguration configuration )
{
this.configuration = configuration;
}
public void setRepositoryFactory( RepositoryContentFactory repositoryFactory )
{
this.repositoryFactory = repositoryFactory;
}
public ArtifactsMerger( String targetRepo, String sourceRepo )
{
this.targetRepo = targetRepo;
this.sourceRepo = sourceRepo;
}
private void setSourceArtifactsList()
{
sourceArtifacts.setRepoId( sourceRepo );
sourceArtifactsList = (ArrayList) sourceArtifacts.getSourceArtifactList();
}
private boolean isArtifactAvailableIntagerRepo( ArchivaArtifact artifact )
{
boolean isAvailable = false;
Collection<ArtifactMetadata> list =
metadataResolver.getArtifacts( targetRepo, artifact.getGroupId(), artifact.getArtifactId(),
artifact.getVersion() );
if ( list.isEmpty() )
{
isAvailable = false;
}
else
{
isAvailable = true;
}
return isAvailable;
}
public void doMerge()
throws Exception
{
try
{
config = configuration.getConfiguration();
targetRepoConfig = config.findManagedRepositoryById( targetRepo );
targetRepository = repositoryFactory.getManagedRepositoryContent( targetRepo );
sourceRepoConfig = config.findManagedRepositoryById( sourceRepo );
sourceRepository = repositoryFactory.getManagedRepositoryContent( sourceRepo );
// iterates through available arfifacts list
for ( ArchivaArtifact sourceArtifact : sourceArtifactsList )
{
if ( isArtifactAvailableIntagerRepo( sourceArtifact ) )
{
// TODO here we need to implement replacing the exixting one
}
else
{
// when the artifact does not exist in the repo folder structure creation is done
createFolderStructure( sourceArtifact );
}
}
}
catch ( RepositoryNotFoundException re )
{
throw re;
}
catch ( RepositoryException rep )
{
throw rep;
}
}
private void createFolderStructure( ArchivaArtifact artifact )
throws IOException, RepositoryMetadataException
{
Date lastUpdatedTimestamp = Calendar.getInstance().getTime();
TimeZone timezone = TimeZone.getTimeZone( "UTC" );
DateFormat fmt = new SimpleDateFormat( "yyyyMMdd.HHmmss" );
fmt.setTimeZone( timezone );
String timestamp = fmt.format( lastUpdatedTimestamp );
String targetRepoPath = targetRepoConfig.getLocation();
String sourceRepoPath = sourceRepoConfig.getLocation();
String artifactPath = sourceRepository.toPath( artifact );
File sourceArtifactFile = new File( sourceRepoPath, artifactPath );
File targetArtifactFile = new File( targetRepoPath, artifactPath );
int lastIndex = artifactPath.lastIndexOf( '/' );
// create a file object to the artifact version directory eg
// :/boot/gsoc/apps/apache-archiva-1.4-SNAPSHOT/data/repositories/internal/ant/ant/1.5.1
File targetFile = new File( targetRepoPath, artifactPath.substring( 0, lastIndex ) );
if ( !targetFile.exists() )
{
// create the folder structure when it does not exist
targetFile.mkdirs();
}
// artifact copying
copyFile( sourceArtifactFile, targetArtifactFile );
// pom file copying
String index = artifactPath.substring( lastIndex + 1 );
int last = index.lastIndexOf( '.' );
File sourcePomFile =
new File( sourceRepoPath, artifactPath.substring( 0, lastIndex ) + "/"
+ artifactPath.substring( lastIndex + 1 ).substring( 0, last ) + ".pom" );
File targetPomFile =
new File( targetRepoPath, artifactPath.substring( 0, lastIndex ) + "/"
+ artifactPath.substring( lastIndex + 1 ).substring( 0, last ) + ".pom" );
if ( !targetPomFile.exists() )
{
copyFile( sourcePomFile, targetPomFile );
}
// explicitly update only if metadata-updater consumer is not enabled!
if ( !config.getRepositoryScanning().getKnownContentConsumers().contains( "metadata-updater" ) )
{
// maven version meta data file copying
File versionMetadataFileInSourceArtifact =
new File( sourceRepoPath, artifactPath.substring( 0, lastIndex ) + "/" + MetadataTools.MAVEN_METADATA );
File versionMetadataFileInTargetArtifact = null;
// check metadata xml is available in source repo. if there is a metadata xml we are going to merge is as
// well
if ( versionMetadataFileInSourceArtifact.exists() )
{
versionMetadataFileInTargetArtifact =
new File( targetRepoPath, artifactPath.substring( 0, lastIndex ) + "/"
+ MetadataTools.MAVEN_METADATA );
// check metadata xml is available in target repo. if it is not available copy it from the source
// artifact
if ( !versionMetadataFileInTargetArtifact.exists() )
{
copyFile( versionMetadataFileInSourceArtifact, versionMetadataFileInTargetArtifact );
}
else
{
// if version metadata file exists then update it.
updateVersionMetadata( versionMetadataFileInTargetArtifact, artifact, lastUpdatedTimestamp,
timestamp );
}
}
// project level maven meta data xml copying
String projectDirectoryInSourceRepo =
new File( versionMetadataFileInSourceArtifact.getParent() ).getParent();
File projectMetadataFileInSourceArtifact =
new File( projectDirectoryInSourceRepo, MetadataTools.MAVEN_METADATA );
// check metadata xml is available in source repo. if there is a metadata xml we are going to merge is as
// well
if ( projectMetadataFileInSourceArtifact.exists() )
{
String projectDirectoryInTargetRepo =
new File( versionMetadataFileInTargetArtifact.getParent() ).getParent();
File projectMetadataFileInTargetArtifact =
new File( projectDirectoryInTargetRepo, MetadataTools.MAVEN_METADATA );
// check metadata xml is available in target repo.if it is not available copy it from the source
// artifact
if ( !projectMetadataFileInTargetArtifact.exists() )
{
copyFile( projectMetadataFileInSourceArtifact, projectMetadataFileInTargetArtifact );
}
else
{
// // if project metadata file exists then update it.
updateProjectMetadata( projectMetadataFileInTargetArtifact, artifact, lastUpdatedTimestamp,
timestamp );
}
}
}
}
private void copyFile( File sourceFile, File targetFile )
throws IOException
{
FileOutputStream out = new FileOutputStream( targetFile );
FileInputStream input = new FileInputStream( sourceFile );
try
{
int i;
while ( ( i = input.read() ) != -1 )
{
out.write( i );
}
out.flush();
}
finally
{
out.close();
input.close();
}
}
/**
* Update artifact level metadata.
*/
private void updateProjectMetadata( File projectMetaDataFileIntargetRepo, ArchivaArtifact artifact,
Date lastUpdatedTimestamp, String timestamp )
throws RepositoryMetadataException
{
ArrayList<String> availableVersions = new ArrayList<String>();
String latestVersion = "";
ArchivaRepositoryMetadata projectMetadata = getMetadata( projectMetaDataFileIntargetRepo );
if ( projectMetaDataFileIntargetRepo.exists() )
{
availableVersions = (ArrayList<String>) projectMetadata.getAvailableVersions();
Collections.sort( availableVersions, VersionComparator.getInstance() );
if ( !availableVersions.contains( artifact.getVersion() ) )
{
availableVersions.add( artifact.getVersion() );
}
latestVersion = availableVersions.get( availableVersions.size() - 1 );
}
else
{
availableVersions.add( artifact.getVersion() );
projectMetadata.setGroupId( artifact.getGroupId() );
projectMetadata.setArtifactId( artifact.getArtifactId() );
}
if ( projectMetadata.getGroupId() == null )
{
projectMetadata.setGroupId( artifact.getGroupId() );
}
if ( projectMetadata.getArtifactId() == null )
{
projectMetadata.setArtifactId( artifact.getArtifactId() );
}
projectMetadata.setLatestVersion( latestVersion );
projectMetadata.setAvailableVersions( availableVersions );
projectMetadata.setLastUpdated( timestamp );
projectMetadata.setLastUpdatedTimestamp( lastUpdatedTimestamp );
if ( !VersionUtil.isSnapshot( artifact.getVersion() ) )
{
projectMetadata.setReleasedVersion( latestVersion );
}
RepositoryMetadataWriter.write( projectMetadata, projectMetaDataFileIntargetRepo );
}
private void updateVersionMetadata( File versionMetaDataFileInTargetRepo, ArchivaArtifact artifact,
Date lastUpdatedTimestamp, String timestamp )
throws RepositoryMetadataException
{
ArchivaRepositoryMetadata versionMetadata = getMetadata( versionMetaDataFileInTargetRepo );
if ( !versionMetaDataFileInTargetRepo.exists() )
{
versionMetadata.setGroupId( artifact.getGroupId() );
versionMetadata.setArtifactId( artifact.getArtifactId() );
versionMetadata.setVersion( artifact.getVersion() );
}
// versionMetadata.getSnapshotVersion().setTimestamp(timestamp);
versionMetadata.setLastUpdatedTimestamp( lastUpdatedTimestamp );
RepositoryMetadataWriter.write( versionMetadata, versionMetaDataFileInTargetRepo );
}
private ArchivaRepositoryMetadata getMetadata( File metadataFile )
throws RepositoryMetadataException
{
ArchivaRepositoryMetadata metadata = new ArchivaRepositoryMetadata();
if ( metadataFile.exists() )
{
metadata = RepositoryMetadataReader.read( metadataFile );
}
return metadata;
}
}

View File

@ -0,0 +1,134 @@
package org.apache.archiva.stagerepository.merge.repodetails;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.junit.Test;
import org.apache.archiva.metadata.repository.MetadataResolver;
import org.apache.archiva.metadata.model.ArtifactMetadata;
import org.apache.maven.archiva.model.ArchivaArtifact;
import org.easymock.MockControl;
import org.codehaus.plexus.spring.PlexusInSpringTestCase;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class SourceArtifactsTest
extends PlexusInSpringTestCase
{
private Logger log = LoggerFactory.getLogger( SourceArtifactsTest.class );
private MockControl metadataResolverControl;
private MetadataResolver metadataResolver;
private static final String TEST_REPO_ID = "internal";
private SourceAritfacts sourceArtifacts;
@Override
protected void setUp()
throws Exception
{
super.setUp();
sourceArtifacts = new SourceAritfacts();
sourceArtifacts.setRepoId( TEST_REPO_ID );
metadataResolverControl = MockControl.createControl( MetadataResolver.class );
metadataResolver = (MetadataResolver) metadataResolverControl.getMock();
sourceArtifacts.setMetadataResolver( metadataResolver );
}
@Test
public void testSourceArtifacts()
{
metadataResolverControl.expectAndReturn( metadataResolver.getRootNamespaces( TEST_REPO_ID ), getRootNameSpace() );
metadataResolverControl.expectAndReturn( metadataResolver.getNamespaces( TEST_REPO_ID, "org" ), getNameSpace() );
metadataResolverControl.expectAndReturn( metadataResolver.getNamespaces( TEST_REPO_ID, "org" + "." + "apache" ),
getProject() );
metadataResolverControl.expectAndReturn( metadataResolver.getProjectVersions( TEST_REPO_ID, "org" + "."
+ "apache", "archiva" ), getProjectVersions() );
metadataResolverControl.expectAndReturn( metadataResolver.getArtifacts( TEST_REPO_ID, "apache", "archiva",
"1.6" ), getArtiFactMetaData() );
metadataResolverControl.expectAndReturn( metadataResolver.getArtifacts( TEST_REPO_ID, "apache", "archiva",
"1.6" ), getArtiFactMetaData() );
metadataResolverControl.replay();
Collection<ArchivaArtifact> list = sourceArtifacts.getSourceArtifactList();
assertEquals( false, list.isEmpty() );
ArrayList<ArtifactMetadata> metadataList =
(ArrayList) sourceArtifacts.getSourceArtifactsMetaData( list.iterator().next() );
assertEquals( 2, metadataList.size() );
metadataResolverControl.verify();
}
private Collection<String> getRootNameSpace()
{
List<String> artifactList = new ArrayList<String>();
artifactList.add( "org" );
return artifactList;
}
private Collection<String> getNameSpace()
{
List<String> namespace = new ArrayList<String>();
namespace.add( "apache" );
return namespace;
}
private Collection<String> getProject()
{
List<String> namespace = new ArrayList<String>();
namespace.add( "archiva" );
return namespace;
}
private Collection<String> getProjectVersions()
{
List<String> versionList = new ArrayList<String>();
versionList.add( "1.6" );
return versionList;
}
private Collection<ArtifactMetadata> getArtiFactMetaData()
{
List<ArtifactMetadata> metaDataList = new ArrayList<ArtifactMetadata>();
ArtifactMetadata metaDataOne = new ArtifactMetadata();
ArtifactMetadata metaDataTwo = new ArtifactMetadata();
metaDataList.add( metaDataOne );
metaDataList.add( metaDataTwo );
return metaDataList;
}
}

View File

@ -0,0 +1,181 @@
package org.apache.archiva.stagerepository.merge.repomerge;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import static org.junit.Assert.assertNotNull;
import org.junit.Before;
import org.junit.Test;
import static org.mockito.Mockito.stub;
import static org.mockito.Mockito.verify;
import org.mockito.MockitoAnnotations;
import static org.mockito.Mockito.*;
import org.codehaus.plexus.spring.PlexusInSpringTestCase;
import org.apache.maven.archiva.repository.RepositoryContentFactory;
import org.apache.maven.archiva.repository.ManagedRepositoryContent;
import org.apache.maven.archiva.repository.content.ManagedDefaultRepositoryContent;
import org.apache.maven.archiva.configuration.ArchivaConfiguration;
import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
import org.apache.maven.archiva.configuration.Configuration;
import org.apache.maven.archiva.configuration.RepositoryScanningConfiguration;
import org.apache.maven.archiva.model.ArchivaArtifact;
import org.apache.archiva.stagerepository.merge.repodetails.SourceAritfacts;
import org.apache.archiva.metadata.model.ArtifactMetadata;
import org.apache.archiva.metadata.repository.MetadataResolver;
//import com.sun.xml.internal.ws.api.wsdl.parser.MetaDataResolver;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.io.File;
public class ArtifactsMergerTest
extends PlexusInSpringTestCase
{
private static final String SOURCE_REPOSITORY_ID = "test-repository";
private static final String TARGET_REPOSITORY_ID = "target-repo";
// private static final String TARGET_REPOSITORY_ID = "target-repo";
private Configuration config;
@MockitoAnnotations.Mock
private MetadataResolver metadataResolver;
private RepositoryContentFactory repositoryFactory;
private ArchivaConfiguration configuration;
private SourceAritfacts sourceArtifacts;
private ArtifactsMerger merger;
@Before
public void setUp()
{
MockitoAnnotations.initMocks( this );
metadataResolver = mock( MetadataResolver.class );
repositoryFactory = mock( RepositoryContentFactory.class );
configuration = mock( ArchivaConfiguration.class );
sourceArtifacts = mock( SourceAritfacts.class );
sourceArtifacts.setRepoId( SOURCE_REPOSITORY_ID );
sourceArtifacts.setMetadataResolver( metadataResolver );
setRepositoryConfigurations();
merger = new ArtifactsMerger( TARGET_REPOSITORY_ID, SOURCE_REPOSITORY_ID );
merger.setConfiguration( configuration );
merger.setRepositoryFactory( repositoryFactory );
merger.setMetadataResolver( metadataResolver );
setSourceArtifacts();
}
@Test
public void setSourceArtifacts()
{
when( sourceArtifacts.getSourceArtifactList() ).thenReturn( getArtifacts() );
merger.setSourceArtifacts( sourceArtifacts );
verify( sourceArtifacts ).getSourceArtifactList();
}
@Test
public void testDomerge()
throws Exception
{
ManagedRepositoryContent sourceRepoContent = new ManagedDefaultRepositoryContent();
sourceRepoContent.setRepository( config.findManagedRepositoryById( SOURCE_REPOSITORY_ID ) );
ManagedRepositoryContent targetRepoContent = new ManagedDefaultRepositoryContent();
sourceRepoContent.setRepository( config.findManagedRepositoryById( TARGET_REPOSITORY_ID ) );
when( configuration.getConfiguration() ).thenReturn( config );
when( repositoryFactory.getManagedRepositoryContent( SOURCE_REPOSITORY_ID ) ).thenReturn( sourceRepoContent );
when( repositoryFactory.getManagedRepositoryContent( TARGET_REPOSITORY_ID ) ).thenReturn( targetRepoContent );
when( sourceArtifacts.getSourceArtifactList() ).thenReturn( getArtifacts() );
when( metadataResolver.getArtifacts( TARGET_REPOSITORY_ID, "archiva", "archiva", "1.2.1" ) ).thenReturn( getMetaDataList() );
merger.doMerge();
// verify(configuration);
// verify(repositoryFactory);
// verify(repositoryFactory);
// verify(sourceArtifacts);
verify( configuration ).getConfiguration();
verify( repositoryFactory ).getManagedRepositoryContent( SOURCE_REPOSITORY_ID );
verify( repositoryFactory ).getManagedRepositoryContent( TARGET_REPOSITORY_ID );
verify( sourceArtifacts ).getSourceArtifactList();
verify( metadataResolver ).getArtifacts( TARGET_REPOSITORY_ID, "org.apache.archiva", "archiva", "1.2.1" );
}
public Collection<ArchivaArtifact> getArtifacts()
{
ArchivaArtifact a1 =
new ArchivaArtifact( "org.apache.archiva", "archiva", "1.2.1", "", "jar", SOURCE_REPOSITORY_ID );
ArchivaArtifact a2 =
new ArchivaArtifact( "org.apache.archiva", "archiva", "1.5", "", "jar", SOURCE_REPOSITORY_ID );
ArrayList<ArchivaArtifact> list = new ArrayList<ArchivaArtifact>();
list.add( a1 );
// list.add(a2) ;
return list;
}
public Collection<ArtifactMetadata> getMetaDataList()
{
ArtifactMetadata m1 = new ArtifactMetadata();
m1.setNamespace( "org.apache.archiva" );
m1.setProject( "archiva" );
m1.setVersion( "1.2.1" );
ArrayList<ArtifactMetadata> list = new ArrayList<ArtifactMetadata>();
list.add( m1 );
return list;
}
public void setRepositoryConfigurations()
{
File sourceRepoFile = new File( getBasedir(), "src/test/resources/test-repository" );
File targetRepoFile = new File( getBasedir(), "src/test/resources/target-repo" );
// sourceRepoFile.mkdirs();
// targetRepoFile.mkdirs();
assertTrue( sourceRepoFile.exists() );
this.config = new Configuration();
RepositoryScanningConfiguration repoScanConfig = new RepositoryScanningConfiguration();
List<String> knownContentConsumers = new ArrayList<String>();
knownContentConsumers.add( "metadata-updater12" );
repoScanConfig.setKnownContentConsumers( knownContentConsumers );
config.setRepositoryScanning( repoScanConfig );
// config.setManagedRepositories();
ManagedRepositoryConfiguration sourceRepoConfig = new ManagedRepositoryConfiguration();
sourceRepoConfig.setId( SOURCE_REPOSITORY_ID );
sourceRepoConfig.setLayout( "default" );
sourceRepoConfig.setLocation( sourceRepoFile.getPath() );
sourceRepoConfig.setName( SOURCE_REPOSITORY_ID );
sourceRepoConfig.setBlockRedeployments( true );
ManagedRepositoryConfiguration targetRepoConfig = new ManagedRepositoryConfiguration();
targetRepoConfig.setId( TARGET_REPOSITORY_ID );
targetRepoConfig.setLayout( "default" );
targetRepoConfig.setLocation( targetRepoFile.getPath() );
targetRepoConfig.setName( TARGET_REPOSITORY_ID );
targetRepoConfig.setBlockRedeployments( true );
this.config.addManagedRepository( sourceRepoConfig );
this.config.addManagedRepository( targetRepoConfig );
}
}

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>org.apache.archiva</groupId>
<artifactId>archiva</artifactId>
<version>1.2.1</version>
<versioning>
<lastUpdated>20100702064543</lastUpdated>
</versioning>
</metadata>

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>org.apache.archiva</groupId>
<artifactId>archiva</artifactId>
<versioning>
<latest>1.2.1</latest>
<release>1.2.1</release>
<versions>
<version>1.2.1</version>
</versions>
<lastUpdated>20100702064543</lastUpdated>
</versioning>
</metadata>