mirror of https://github.com/apache/archiva.git
[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:
parent
4580974158
commit
626279bf89
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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 );
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -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>
|
|
@ -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>
|
Loading…
Reference in New Issue