o proxy parent POM if not found in the repo when building the effective POM when creating metadata (also applied the same in dependency tree builder) o added unit tests o moved out wagonfactory classes into separate module so it can be used by maven2-repository w/o depending on archiva-proxy module (as it inroduces cyclic dependency) git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1135978 13f79535-47bb-0310-9956-ffa450edef68tags/archiva-1.4-M1
@@ -56,12 +56,6 @@ | |||
<artifactId>sisu-inject-plexus</artifactId> | |||
<scope>compile</scope> | |||
</dependency> | |||
<dependency> | |||
<groupId>dom4j</groupId> | |||
<artifactId>dom4j</artifactId> | |||
<version>1.6.1</version> | |||
<scope>test</scope> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.sonatype.nexus</groupId> | |||
<artifactId>nexus-indexer</artifactId> | |||
@@ -70,5 +64,11 @@ | |||
<groupId>javax.inject</groupId> | |||
<artifactId>javax.inject</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>dom4j</groupId> | |||
<artifactId>dom4j</artifactId> | |||
<version>1.6.1</version> | |||
<scope>test</scope> | |||
</dependency> | |||
</dependencies> | |||
</project> |
@@ -0,0 +1,36 @@ | |||
package org.apache.maven.archiva.common.utils; | |||
/* | |||
* 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 java.io.File; | |||
public class FileUtil | |||
{ | |||
public static String getBasedir() | |||
{ | |||
String basedir = System.getProperty( "basedir" ); | |||
if ( basedir == null ) | |||
{ | |||
basedir = new File( "" ).getAbsolutePath(); | |||
} | |||
return basedir; | |||
} | |||
} |
@@ -282,22 +282,25 @@ | |||
java.util.Map<String, java.util.List<ProxyConnectorConfiguration>> proxyConnectorMap = | |||
new java.util.HashMap<String, java.util.List<ProxyConnectorConfiguration>>(); | |||
java.util.Iterator<ProxyConnectorConfiguration> it = proxyConnectors.iterator(); | |||
while ( it.hasNext() ) | |||
if( proxyConnectors != null ) | |||
{ | |||
ProxyConnectorConfiguration proxyConfig = it.next(); | |||
String key = proxyConfig.getSourceRepoId(); | |||
java.util.List<ProxyConnectorConfiguration> connectors = proxyConnectorMap.get( key ); | |||
if ( connectors == null ) | |||
java.util.Iterator<ProxyConnectorConfiguration> it = proxyConnectors.iterator(); | |||
while ( it.hasNext() ) | |||
{ | |||
connectors = new java.util.ArrayList<ProxyConnectorConfiguration>(); | |||
proxyConnectorMap.put( key, connectors ); | |||
} | |||
ProxyConnectorConfiguration proxyConfig = it.next(); | |||
String key = proxyConfig.getSourceRepoId(); | |||
java.util.List<ProxyConnectorConfiguration> connectors = proxyConnectorMap.get( key ); | |||
if ( connectors == null ) | |||
{ | |||
connectors = new java.util.ArrayList<ProxyConnectorConfiguration>(); | |||
proxyConnectorMap.put( key, connectors ); | |||
} | |||
connectors.add( proxyConfig ); | |||
java.util.Collections.sort( connectors, | |||
org.apache.maven.archiva.configuration.functors.ProxyConnectorConfigurationOrderComparator.getInstance() ); | |||
connectors.add( proxyConfig ); | |||
java.util.Collections.sort( connectors, | |||
org.apache.maven.archiva.configuration.functors.ProxyConnectorConfigurationOrderComparator.getInstance() ); | |||
} | |||
} | |||
return proxyConnectorMap; |
@@ -0,0 +1,44 @@ | |||
<?xml version="1.0"?> | |||
<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>archiva-base</artifactId> | |||
<groupId>org.apache.archiva</groupId> | |||
<version>1.4-SNAPSHOT</version> | |||
</parent> | |||
<artifactId>archiva-proxy-common</artifactId> | |||
<name>Archiva Base :: Proxy Common</name> | |||
<properties> | |||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | |||
</properties> | |||
<dependencies> | |||
<dependency> | |||
<groupId>org.apache.archiva</groupId> | |||
<artifactId>archiva-plexus-bridge</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.apache.maven.wagon</groupId> | |||
<artifactId>wagon-provider-api</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.apache.maven.wagon</groupId> | |||
<artifactId>wagon-file</artifactId> | |||
<scope>test</scope> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.apache.maven.wagon</groupId> | |||
<artifactId>wagon-http-lightweight</artifactId> | |||
<scope>test</scope> | |||
</dependency> | |||
<dependency> | |||
<groupId>commons-logging</groupId> | |||
<artifactId>commons-logging-api</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.springframework</groupId> | |||
<artifactId>spring-test</artifactId> | |||
<scope>test</scope> | |||
</dependency> | |||
</dependencies> | |||
</project> |
@@ -1,4 +1,4 @@ | |||
package org.apache.maven.archiva.proxy; | |||
package org.apache.archiva.proxy.common; | |||
/* | |||
* Licensed to the Apache Software Foundation (ASF) under one |
@@ -1,4 +1,4 @@ | |||
package org.apache.maven.archiva.proxy; | |||
package org.apache.archiva.proxy.common; | |||
/* | |||
* Licensed to the Apache Software Foundation (ASF) under one |
@@ -1,4 +1,4 @@ | |||
package org.apache.maven.archiva.proxy; | |||
package org.apache.archiva.proxy.common; | |||
/* | |||
* Licensed to the Apache Software Foundation (ASF) under one |
@@ -0,0 +1,34 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<!-- | |||
~ 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. | |||
--> | |||
<beans xmlns="http://www.springframework.org/schema/beans" | |||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||
xmlns:context="http://www.springframework.org/schema/context" | |||
xsi:schemaLocation="http://www.springframework.org/schema/beans | |||
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd | |||
http://www.springframework.org/schema/context | |||
http://www.springframework.org/schema/context/spring-context-3.0.xsd" | |||
default-lazy-init="true"> | |||
<context:annotation-config/> | |||
<context:component-scan base-package="org.apache.archiva.proxy.common"/> | |||
</beans> |
@@ -1,4 +1,4 @@ | |||
package org.apache.maven.archiva.proxy; | |||
package org.apache.archiva.proxy.common; | |||
/* | |||
* Licensed to the Apache Software Foundation (ASF) under one | |||
@@ -20,7 +20,6 @@ package org.apache.maven.archiva.proxy; | |||
*/ | |||
import junit.framework.TestCase; | |||
import org.apache.archiva.common.plexusbridge.PlexusSisuBridge; | |||
import org.apache.maven.wagon.Wagon; | |||
import org.junit.Test; | |||
import org.junit.runner.RunWith; | |||
@@ -34,7 +33,7 @@ import javax.inject.Inject; | |||
* | |||
*/ | |||
@RunWith( SpringJUnit4ClassRunner.class ) | |||
@ContextConfiguration( locations = {"classpath*:/META-INF/spring-context.xml","classpath:/spring-context.xml"} ) | |||
@ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml" } ) | |||
public class WagonFactoryTest | |||
extends TestCase | |||
{ |
@@ -0,0 +1,30 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<!-- | |||
~ 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. | |||
--> | |||
<beans xmlns="http://www.springframework.org/schema/beans" | |||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||
xmlns:context="http://www.springframework.org/schema/context" | |||
xsi:schemaLocation="http://www.springframework.org/schema/beans | |||
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd | |||
http://www.springframework.org/schema/context | |||
http://www.springframework.org/schema/context/spring-context-3.0.xsd" | |||
default-lazy-init="true"> | |||
</beans> |
@@ -44,6 +44,10 @@ | |||
<groupId>org.apache.archiva</groupId> | |||
<artifactId>archiva-scheduler-repository</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.apache.archiva</groupId> | |||
<artifactId>archiva-proxy-common</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>commons-io</groupId> | |||
<artifactId>commons-io</artifactId> |
@@ -20,6 +20,8 @@ package org.apache.maven.archiva.proxy; | |||
*/ | |||
import com.google.common.collect.Lists; | |||
import org.apache.archiva.proxy.common.WagonFactory; | |||
import org.apache.archiva.proxy.common.WagonFactoryException; | |||
import org.apache.archiva.scheduler.ArchivaTaskScheduler; | |||
import org.apache.archiva.scheduler.repository.RepositoryTask; | |||
import org.apache.commons.collections.CollectionUtils; |
@@ -54,7 +54,7 @@ | |||
<field-name>archivaConfiguration</field-name> | |||
</requirement> | |||
<requirement> | |||
<role>org.apache.maven.archiva.proxy.WagonFactory</role> | |||
<role>org.apache.archiva.proxy.common.WagonFactory</role> | |||
</requirement> | |||
<requirement> | |||
<role>org.apache.maven.archiva.repository.RepositoryContentFactory</role> |
@@ -54,7 +54,7 @@ | |||
<field-name>archivaConfiguration</field-name> | |||
</requirement> | |||
<requirement> | |||
<role>org.apache.maven.archiva.proxy.WagonFactory</role> | |||
<role>org.apache.archiva.proxy.common.WagonFactory</role> | |||
</requirement> | |||
<requirement> | |||
<role>org.apache.maven.archiva.repository.RepositoryContentFactory</role> |
@@ -54,7 +54,7 @@ | |||
<field-name>archivaConfiguration</field-name> | |||
</requirement> | |||
<requirement> | |||
<role>org.apache.maven.archiva.proxy.WagonFactory</role> | |||
<role>org.apache.archiva.proxy.common.WagonFactory</role> | |||
</requirement> | |||
<requirement> | |||
<role>org.apache.maven.archiva.repository.RepositoryContentFactory</role> |
@@ -68,7 +68,7 @@ | |||
<field-name>urlFailureCache</field-name> | |||
</requirement> | |||
<requirement> | |||
<role>org.apache.maven.archiva.proxy.WagonFactory</role> | |||
<role>org.apache.archiva.proxy.common.WagonFactory</role> | |||
<role-hint>default</role-hint> | |||
</requirement> | |||
<requirement> |
@@ -54,7 +54,7 @@ | |||
<field-name>archivaConfiguration</field-name> | |||
</requirement> | |||
<requirement> | |||
<role>org.apache.maven.archiva.proxy.WagonFactory</role> | |||
<role>org.apache.archiva.proxy.common.WagonFactory</role> | |||
</requirement> | |||
<requirement> | |||
<role>org.apache.maven.archiva.repository.RepositoryContentFactory</role> |
@@ -54,7 +54,7 @@ | |||
<field-name>archivaConfiguration</field-name> | |||
</requirement> | |||
<requirement> | |||
<role>org.apache.maven.archiva.proxy.WagonFactory</role> | |||
<role>org.apache.archiva.proxy.common.WagonFactory</role> | |||
</requirement> | |||
<requirement> | |||
<role>org.apache.maven.archiva.repository.RepositoryContentFactory</role> |
@@ -74,7 +74,7 @@ | |||
<field-name>archivaConfiguration</field-name> | |||
</requirement> | |||
<requirement> | |||
<role>org.apache.maven.archiva.proxy.WagonFactory</role> | |||
<role>org.apache.archiva.proxy.common.WagonFactory</role> | |||
</requirement> | |||
<requirement> | |||
<role>org.apache.maven.archiva.repository.RepositoryContentFactory</role> |
@@ -54,7 +54,7 @@ | |||
<field-name>archivaConfiguration</field-name> | |||
</requirement> | |||
<requirement> | |||
<role>org.apache.maven.archiva.proxy.WagonFactory</role> | |||
<role>org.apache.archiva.proxy.common.WagonFactory</role> | |||
</requirement> | |||
<requirement> | |||
<role>org.apache.maven.archiva.repository.RepositoryContentFactory</role> |
@@ -54,7 +54,7 @@ | |||
<field-name>archivaConfiguration</field-name> | |||
</requirement> | |||
<requirement> | |||
<role>org.apache.maven.archiva.proxy.WagonFactory</role> | |||
<role>org.apache.archiva.proxy.common.WagonFactory</role> | |||
</requirement> | |||
<requirement> | |||
<role>org.apache.maven.archiva.repository.RepositoryContentFactory</role> |
@@ -17,7 +17,6 @@ | |||
~ specific language governing permissions and limitations | |||
~ under the License. | |||
--> | |||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> | |||
<modelVersion>4.0.0</modelVersion> | |||
<parent> | |||
@@ -46,5 +45,6 @@ | |||
<module>archiva-artifact-converter</module> | |||
<module>archiva-converter</module> | |||
<module>archiva-repository-scanner</module> | |||
<module>archiva-proxy-common</module> | |||
</modules> | |||
</project> | |||
</project> |
@@ -0,0 +1,20 @@ | |||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> | |||
<modelVersion>4.0.0</modelVersion> | |||
<parent> | |||
<groupId>com.example.test</groupId> | |||
<artifactId>missing-parent-pom</artifactId> | |||
<version>1</version> | |||
</parent> | |||
<artifactId>missing-parent</artifactId> | |||
<packaging>jar</packaging> | |||
<version>1.1</version> | |||
<name>Test Artifact :: Missing Parent POM</name> | |||
<dependencies> | |||
<dependency> | |||
<groupId>junit</groupId> | |||
<artifactId>junit</artifactId> | |||
<scope>test</scope> | |||
</dependency> | |||
</dependencies> | |||
</project> |
@@ -37,6 +37,10 @@ | |||
<groupId>org.apache.archiva</groupId> | |||
<artifactId>metadata-repository-api</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.apache.archiva</groupId> | |||
<artifactId>archiva-proxy-common</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.sonatype.sisu</groupId> | |||
<artifactId>sisu-inject-plexus</artifactId> | |||
@@ -88,6 +92,10 @@ | |||
<groupId>org.apache.archiva</groupId> | |||
<artifactId>archiva-configuration</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.apache.maven.wagon</groupId> | |||
<artifactId>wagon-provider-api</artifactId> | |||
</dependency> | |||
<!-- TODO: aim to remove this dependency --> | |||
<dependency> | |||
<groupId>org.apache.archiva</groupId> | |||
@@ -103,6 +111,11 @@ | |||
<artifactId>slf4j-simple</artifactId> | |||
<scope>test</scope> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.mockito</groupId> | |||
<artifactId>mockito-all</artifactId> | |||
<scope>test</scope> | |||
</dependency> | |||
</dependencies> | |||
<build> | |||
<plugins> |
@@ -27,10 +27,14 @@ import org.apache.archiva.metadata.repository.RepositorySession; | |||
import org.apache.archiva.metadata.repository.RepositorySessionFactory; | |||
import org.apache.archiva.metadata.repository.storage.RepositoryPathTranslator; | |||
import org.apache.archiva.metadata.repository.storage.maven2.RepositoryModelResolver; | |||
import org.apache.archiva.proxy.common.WagonFactory; | |||
import org.apache.commons.lang.StringUtils; | |||
import org.apache.maven.archiva.common.utils.Slf4JPlexusLogger; | |||
import org.apache.maven.archiva.configuration.ArchivaConfiguration; | |||
import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; | |||
import org.apache.maven.archiva.configuration.NetworkProxyConfiguration; | |||
import org.apache.maven.archiva.configuration.ProxyConnectorConfiguration; | |||
import org.apache.maven.archiva.configuration.RemoteRepositoryConfiguration; | |||
import org.apache.maven.artifact.Artifact; | |||
import org.apache.maven.artifact.factory.ArtifactFactory; | |||
import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException; | |||
@@ -69,6 +73,7 @@ import org.apache.maven.shared.dependency.tree.traversal.BuildingDependencyNodeV | |||
import org.apache.maven.shared.dependency.tree.traversal.CollectingDependencyNodeVisitor; | |||
import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor; | |||
import org.apache.maven.shared.dependency.tree.traversal.FilteringDependencyNodeVisitor; | |||
import org.apache.maven.wagon.proxy.ProxyInfo; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import org.springframework.stereotype.Service; | |||
@@ -80,6 +85,7 @@ import java.io.File; | |||
import java.util.ArrayList; | |||
import java.util.Collection; | |||
import java.util.Collections; | |||
import java.util.HashMap; | |||
import java.util.HashSet; | |||
import java.util.LinkedHashSet; | |||
import java.util.List; | |||
@@ -140,6 +146,9 @@ public class DefaultDependencyTreeBuilder | |||
@Inject | |||
private PlexusSisuBridge plexusSisuBridge; | |||
@Inject | |||
private WagonFactory wagonFactory; | |||
@PostConstruct | |||
public void initialize() | |||
throws PlexusSisuBridgeException | |||
@@ -160,18 +169,50 @@ public class DefaultDependencyTreeBuilder | |||
new DependencyTreeResolutionListener( new Slf4JPlexusLogger( getClass() ) ); | |||
Artifact projectArtifact = factory.createProjectArtifact( groupId, artifactId, version ); | |||
File basedir = findArtifactInRepositories( repositoryIds, projectArtifact ); | |||
ManagedRepositoryConfiguration repository = findArtifactInRepositories( repositoryIds, projectArtifact ); | |||
if ( basedir == null ) | |||
if ( repository == null ) | |||
{ | |||
// metadata could not be resolved | |||
return; | |||
} | |||
File basedir = new File( repository.getLocation() ); | |||
try | |||
{ | |||
Model model = | |||
buildProject( new RepositoryModelResolver( basedir, pathTranslator ), groupId, artifactId, version ); | |||
// MRM-1411 | |||
List< RemoteRepositoryConfiguration > remoteRepositories = new ArrayList<RemoteRepositoryConfiguration>(); | |||
Map<String, ProxyInfo > networkProxies = new HashMap<String, ProxyInfo>(); | |||
Map<String, List< ProxyConnectorConfiguration >> proxyConnectorsMap = archivaConfiguration.getConfiguration().getProxyConnectorAsMap(); | |||
List<ProxyConnectorConfiguration> proxyConnectors = proxyConnectorsMap.get( repository.getId() ); | |||
if( proxyConnectors != null ) | |||
{ | |||
for( ProxyConnectorConfiguration proxyConnector : proxyConnectors ) | |||
{ | |||
remoteRepositories.add( archivaConfiguration.getConfiguration().findRemoteRepositoryById( proxyConnector.getTargetRepoId() ) ); | |||
NetworkProxyConfiguration networkProxyConfig = archivaConfiguration.getConfiguration().getNetworkProxiesAsMap().get( | |||
proxyConnector.getProxyId() ); | |||
if( networkProxyConfig != null ) | |||
{ | |||
ProxyInfo proxy = new ProxyInfo(); | |||
proxy.setType( networkProxyConfig.getProtocol() ); | |||
proxy.setHost( networkProxyConfig.getHost() ); | |||
proxy.setPort( networkProxyConfig.getPort() ); | |||
proxy.setUserName( networkProxyConfig.getUsername() ); | |||
proxy.setPassword( networkProxyConfig.getPassword() ); | |||
// key/value: remote repo ID/proxy info | |||
networkProxies.put( proxyConnector.getTargetRepoId(), proxy ); | |||
} | |||
} | |||
} | |||
Model model = buildProject( new RepositoryModelResolver( basedir, pathTranslator, wagonFactory, remoteRepositories, | |||
networkProxies, repository ), groupId, artifactId, version ); | |||
Map managedVersions = createManagedVersionMap( model ); | |||
@@ -237,7 +278,7 @@ public class DefaultDependencyTreeBuilder | |||
} | |||
} | |||
private File findArtifactInRepositories( List<String> repositoryIds, Artifact projectArtifact ) | |||
private ManagedRepositoryConfiguration findArtifactInRepositories( List<String> repositoryIds, Artifact projectArtifact ) | |||
{ | |||
for ( String repoId : repositoryIds ) | |||
{ | |||
@@ -252,7 +293,7 @@ public class DefaultDependencyTreeBuilder | |||
if ( file.exists() ) | |||
{ | |||
return repoDir; | |||
return repositoryConfiguration; | |||
} | |||
} | |||
return null; | |||
@@ -426,11 +467,13 @@ public class DefaultDependencyTreeBuilder | |||
factory.createProjectArtifact( artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), | |||
artifact.getScope() ); | |||
File basedir = findArtifactInRepositories( repositoryIds, pomArtifact ); | |||
ManagedRepositoryConfiguration repository = findArtifactInRepositories( repositoryIds, pomArtifact ); | |||
Model project = null; | |||
if ( !Artifact.SCOPE_SYSTEM.equals( artifact.getScope() ) && basedir != null ) | |||
if ( !Artifact.SCOPE_SYSTEM.equals( artifact.getScope() ) && repository != null ) | |||
{ | |||
File basedir = new File( repository.getLocation() ); | |||
try | |||
{ | |||
project = |
@@ -29,9 +29,13 @@ import org.apache.archiva.metadata.repository.storage.RepositoryPathTranslator; | |||
import org.apache.archiva.metadata.repository.storage.RepositoryStorage; | |||
import org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataInvalidException; | |||
import org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataNotFoundException; | |||
import org.apache.archiva.proxy.common.WagonFactory; | |||
import org.apache.maven.archiva.common.utils.VersionUtil; | |||
import org.apache.maven.archiva.configuration.ArchivaConfiguration; | |||
import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; | |||
import org.apache.maven.archiva.configuration.NetworkProxyConfiguration; | |||
import org.apache.maven.archiva.configuration.ProxyConnectorConfiguration; | |||
import org.apache.maven.archiva.configuration.RemoteRepositoryConfiguration; | |||
import org.apache.maven.archiva.xml.XMLException; | |||
import org.apache.maven.model.CiManagement; | |||
import org.apache.maven.model.Dependency; | |||
@@ -46,6 +50,8 @@ import org.apache.maven.model.building.DefaultModelBuildingRequest; | |||
import org.apache.maven.model.building.ModelBuilder; | |||
import org.apache.maven.model.building.ModelBuildingException; | |||
import org.apache.maven.model.building.ModelBuildingRequest; | |||
import org.apache.maven.model.building.ModelProblem; | |||
import org.apache.maven.wagon.proxy.ProxyInfo; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
import org.springframework.stereotype.Service; | |||
@@ -54,6 +60,7 @@ import javax.annotation.PostConstruct; | |||
import javax.inject.Inject; | |||
import javax.inject.Named; | |||
import java.io.File; | |||
import java.io.FileNotFoundException; | |||
import java.io.FilenameFilter; | |||
import java.io.IOException; | |||
import java.util.ArrayList; | |||
@@ -61,7 +68,9 @@ import java.util.Arrays; | |||
import java.util.Collection; | |||
import java.util.Collections; | |||
import java.util.Date; | |||
import java.util.HashMap; | |||
import java.util.List; | |||
import java.util.Map; | |||
/** | |||
* Maven 2 repository format storage implementation. This class currently takes parameters to indicate the repository to | |||
@@ -97,6 +106,9 @@ public class Maven2RepositoryStorage | |||
@Named( value = "repositoryPathTranslator#maven2" ) | |||
private RepositoryPathTranslator pathTranslator; | |||
@Inject | |||
private WagonFactory wagonFactory; | |||
private final static Logger log = LoggerFactory.getLogger( Maven2RepositoryStorage.class ); | |||
private static final String METADATA_FILENAME = "maven-metadata.xml"; | |||
@@ -161,10 +173,48 @@ public class Maven2RepositoryStorage | |||
"The artifact's POM file '" + file.getAbsolutePath() + "' was missing" ); | |||
} | |||
List<RemoteRepositoryConfiguration> remoteRepositories = new ArrayList<RemoteRepositoryConfiguration>(); | |||
Map<String, ProxyInfo> networkProxies = new HashMap<String, ProxyInfo>(); | |||
Map<String, List<ProxyConnectorConfiguration>> proxyConnectorsMap = archivaConfiguration.getConfiguration().getProxyConnectorAsMap(); | |||
List<ProxyConnectorConfiguration> proxyConnectors = proxyConnectorsMap.get( repoId ); | |||
if( proxyConnectors != null ) | |||
{ | |||
for( ProxyConnectorConfiguration proxyConnector : proxyConnectors ) | |||
{ | |||
RemoteRepositoryConfiguration remoteRepoConfig = archivaConfiguration.getConfiguration().findRemoteRepositoryById( | |||
proxyConnector.getTargetRepoId() ); | |||
if( remoteRepoConfig != null ) | |||
{ | |||
remoteRepositories.add( remoteRepoConfig ); | |||
NetworkProxyConfiguration networkProxyConfig = archivaConfiguration.getConfiguration().getNetworkProxiesAsMap().get( | |||
proxyConnector.getProxyId() ); | |||
if( networkProxyConfig != null ) | |||
{ | |||
ProxyInfo proxy = new ProxyInfo(); | |||
proxy.setType( networkProxyConfig.getProtocol() ); | |||
proxy.setHost( networkProxyConfig.getHost() ); | |||
proxy.setPort( networkProxyConfig.getPort() ); | |||
proxy.setUserName( networkProxyConfig.getUsername() ); | |||
proxy.setPassword( networkProxyConfig.getPassword() ); | |||
// key/value: remote repo ID/proxy info | |||
networkProxies.put( proxyConnector.getTargetRepoId(), proxy ); | |||
} | |||
} | |||
} | |||
} | |||
ModelBuildingRequest req = new DefaultModelBuildingRequest(); | |||
req.setProcessPlugins( false ); | |||
req.setPomFile( file ); | |||
req.setModelResolver( new RepositoryModelResolver( basedir, pathTranslator ) ); | |||
// MRM-1411 | |||
req.setModelResolver( new RepositoryModelResolver( basedir, pathTranslator, wagonFactory, remoteRepositories, | |||
networkProxies, repositoryConfiguration ) ); | |||
req.setValidationLevel( ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL ); | |||
Model model; | |||
@@ -176,6 +226,30 @@ public class Maven2RepositoryStorage | |||
{ | |||
String msg = "The artifact's POM file '" + file + "' was invalid: " + e.getMessage(); | |||
List<ModelProblem> modelProblems = e.getProblems(); | |||
for( ModelProblem problem : modelProblems ) | |||
{ | |||
// MRM-1411, related to MRM-1335 | |||
// this means that the problem was that the parent wasn't resolved! | |||
if( problem.getException() instanceof FileNotFoundException && e.getModelId() != null && | |||
!e.getModelId().equals( problem.getModelId() ) ) | |||
{ | |||
log.warn( "The artifact's parent POM file '" + file + "' cannot be resolved. " + | |||
"Using defaults for project version metadata.." ); | |||
ProjectVersionMetadata metadata = new ProjectVersionMetadata(); | |||
metadata.setId( projectVersion ); | |||
MavenProjectFacet facet = new MavenProjectFacet(); | |||
facet.setGroupId( namespace ); | |||
facet.setArtifactId( projectId ); | |||
facet.setPackaging( "jar" ); | |||
metadata.addFacet( facet ); | |||
return metadata; | |||
} | |||
} | |||
throw new RepositoryStorageMetadataInvalidException( "invalid-pom", msg, e ); | |||
} | |||
@@ -232,6 +306,11 @@ public class Maven2RepositoryStorage | |||
return metadata; | |||
} | |||
public void setWagonFactory( WagonFactory wagonFactory ) | |||
{ | |||
this.wagonFactory = wagonFactory; | |||
} | |||
private List<org.apache.archiva.metadata.model.Dependency> convertDependencies( List<Dependency> dependencies ) | |||
{ | |||
List<org.apache.archiva.metadata.model.Dependency> l = |
@@ -20,14 +20,33 @@ package org.apache.archiva.metadata.repository.storage.maven2; | |||
*/ | |||
import java.io.File; | |||
import java.io.IOException; | |||
import java.util.List; | |||
import java.util.Map; | |||
import org.apache.archiva.metadata.repository.storage.RepositoryPathTranslator; | |||
import org.apache.archiva.proxy.common.WagonFactory; | |||
import org.apache.archiva.proxy.common.WagonFactoryException; | |||
import org.apache.commons.io.FileUtils; | |||
import org.apache.commons.lang.StringUtils; | |||
import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; | |||
import org.apache.maven.archiva.configuration.RemoteRepositoryConfiguration; | |||
import org.apache.maven.model.Repository; | |||
import org.apache.maven.model.building.FileModelSource; | |||
import org.apache.maven.model.building.ModelSource; | |||
import org.apache.maven.model.resolution.InvalidRepositoryException; | |||
import org.apache.maven.model.resolution.ModelResolver; | |||
import org.apache.maven.model.resolution.UnresolvableModelException; | |||
import org.apache.maven.wagon.ConnectionException; | |||
import org.apache.maven.wagon.ResourceDoesNotExistException; | |||
import org.apache.maven.wagon.TransferFailedException; | |||
import org.apache.maven.wagon.Wagon; | |||
import org.apache.maven.wagon.authentication.AuthenticationException; | |||
import org.apache.maven.wagon.authentication.AuthenticationInfo; | |||
import org.apache.maven.wagon.authorization.AuthorizationException; | |||
import org.apache.maven.wagon.proxy.ProxyInfo; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
public class RepositoryModelResolver | |||
implements ModelResolver | |||
@@ -36,6 +55,17 @@ public class RepositoryModelResolver | |||
private RepositoryPathTranslator pathTranslator; | |||
private WagonFactory wagonFactory; | |||
private List<RemoteRepositoryConfiguration> remoteRepositories; | |||
private ManagedRepositoryConfiguration targetRepository; | |||
private static final Logger log = LoggerFactory.getLogger( RepositoryModelResolver.class ); | |||
// key/value: remote repo ID/network proxy | |||
Map<String, ProxyInfo> networkProxyMap; | |||
public RepositoryModelResolver( File basedir, RepositoryPathTranslator pathTranslator ) | |||
{ | |||
this.basedir = basedir; | |||
@@ -43,12 +73,53 @@ public class RepositoryModelResolver | |||
this.pathTranslator = pathTranslator; | |||
} | |||
public RepositoryModelResolver( File basedir, RepositoryPathTranslator pathTranslator, | |||
WagonFactory wagonFactory, List<RemoteRepositoryConfiguration> remoteRepositories, | |||
Map<String, ProxyInfo> networkProxiesMap, ManagedRepositoryConfiguration targetRepository ) | |||
{ | |||
this( basedir, pathTranslator ); | |||
this.wagonFactory = wagonFactory; | |||
this.remoteRepositories = remoteRepositories; | |||
this.networkProxyMap = networkProxiesMap; | |||
this.targetRepository = targetRepository; | |||
} | |||
public ModelSource resolveModel( String groupId, String artifactId, String version ) | |||
throws UnresolvableModelException | |||
{ | |||
String filename = artifactId + "-" + version + ".pom"; | |||
// TODO: we need to convert 1.0-20091120.112233-1 type paths to baseVersion for the below call - add a test | |||
return new FileModelSource( pathTranslator.toFile( basedir, groupId, artifactId, version, filename ) ); | |||
File model = pathTranslator.toFile( basedir, groupId, artifactId, version, filename ); | |||
if( !model.exists() ) | |||
{ | |||
for( RemoteRepositoryConfiguration remoteRepository : remoteRepositories ) | |||
{ | |||
try | |||
{ | |||
boolean success = getModelFromProxy( remoteRepository, groupId, artifactId, version, filename ); | |||
if( success && model.exists() ) | |||
{ | |||
log.info( "Model '" + model.getAbsolutePath() + "' successfully retrieved from remote repository '" | |||
+ remoteRepository.getId() + "'" ); | |||
break; | |||
} | |||
} | |||
catch( Exception e ) | |||
{ | |||
log.warn( "An exception was caught while attempting to retrieve model '" + model.getAbsolutePath() | |||
+ "' from remote repository '" + remoteRepository.getId() + "'.", e ); | |||
continue; | |||
} | |||
} | |||
} | |||
return new FileModelSource( model ); | |||
} | |||
public void addRepository( Repository repository ) | |||
@@ -63,4 +134,232 @@ public class RepositoryModelResolver | |||
{ | |||
return new RepositoryModelResolver( basedir, pathTranslator ); | |||
} | |||
} | |||
// TODO: we need to do some refactoring, we cannot re-use the proxy components of archiva-proxy in maven2-repository | |||
// because it's causing a cyclic dependency | |||
private boolean getModelFromProxy( RemoteRepositoryConfiguration remoteRepository, String groupId, | |||
String artifactId, String version, String filename ) | |||
throws AuthorizationException, TransferFailedException, ResourceDoesNotExistException, WagonFactoryException | |||
{ | |||
boolean success = false; | |||
File tmpMd5 = null; | |||
File tmpSha1 = null; | |||
File tmpResource = null; | |||
String artifactPath = pathTranslator.toPath( groupId, artifactId, version, filename ); | |||
File resource = new File( targetRepository.getLocation(), artifactPath ); | |||
File workingDirectory = createWorkingDirectory( targetRepository.getLocation() ); | |||
try | |||
{ | |||
Wagon wagon = null; | |||
try | |||
{ | |||
String protocol = getProtocol( remoteRepository.getUrl() ); | |||
wagon = wagonFactory.getWagon( "wagon#" + protocol ); | |||
if ( wagon == null ) | |||
{ | |||
throw new RuntimeException( "Unsupported remote repository protocol: " + protocol ); | |||
} | |||
boolean connected = connectToRepository( wagon, remoteRepository ); | |||
if ( connected ) | |||
{ | |||
tmpResource = new File( workingDirectory, filename ); | |||
log.info( "Retrieving " + artifactPath + " from " + remoteRepository.getName() ); | |||
wagon.get( artifactPath, tmpResource ); | |||
log.debug( "Downloaded successfully." ); | |||
tmpSha1 = | |||
transferChecksum( wagon, remoteRepository, artifactPath, tmpResource, workingDirectory, ".sha1" ); | |||
tmpMd5 = | |||
transferChecksum( wagon, remoteRepository, artifactPath, tmpResource, workingDirectory, ".md5" ); | |||
} | |||
} | |||
finally | |||
{ | |||
if ( wagon != null ) | |||
{ | |||
try | |||
{ | |||
wagon.disconnect(); | |||
} | |||
catch ( ConnectionException e ) | |||
{ | |||
log.warn( "Unable to disconnect wagon.", e ); | |||
} | |||
} | |||
} | |||
if ( resource != null ) | |||
{ | |||
synchronized ( resource.getAbsolutePath().intern() ) | |||
{ | |||
File directory = resource.getParentFile(); | |||
moveFileIfExists( tmpMd5, directory ); | |||
moveFileIfExists( tmpSha1, directory ); | |||
moveFileIfExists( tmpResource, directory ); | |||
success = true; | |||
} | |||
} | |||
} | |||
finally | |||
{ | |||
FileUtils.deleteQuietly( workingDirectory ); | |||
} | |||
// do we still need to execute the consumers? | |||
return success; | |||
} | |||
/** | |||
* Using wagon, connect to the remote repository. | |||
* | |||
* @param wagon the wagon instance to establish the connection on. | |||
* @return true if the connection was successful. false if not connected. | |||
*/ | |||
private boolean connectToRepository( Wagon wagon, RemoteRepositoryConfiguration remoteRepository ) | |||
{ | |||
boolean connected; | |||
final ProxyInfo networkProxy; | |||
networkProxy = this.networkProxyMap.get( remoteRepository.getId() ); | |||
if ( networkProxy != null ) | |||
{ | |||
String msg = | |||
"Using network proxy " + networkProxy.getHost() + ":" + networkProxy.getPort() | |||
+ " to connect to remote repository " + remoteRepository.getUrl(); | |||
if ( networkProxy.getNonProxyHosts() != null ) | |||
{ | |||
msg += "; excluding hosts: " + networkProxy.getNonProxyHosts(); | |||
} | |||
if ( StringUtils.isNotBlank( networkProxy.getUserName() ) ) | |||
{ | |||
msg += "; as user: " + networkProxy.getUserName(); | |||
} | |||
log.debug( msg ); | |||
} | |||
AuthenticationInfo authInfo = null; | |||
String username = remoteRepository.getUsername(); | |||
String password = remoteRepository.getPassword(); | |||
if ( StringUtils.isNotBlank( username ) && StringUtils.isNotBlank( password ) ) | |||
{ | |||
log.debug( "Using username " + username + " to connect to remote repository " + remoteRepository.getUrl() ); | |||
authInfo = new AuthenticationInfo(); | |||
authInfo.setUserName( username ); | |||
authInfo.setPassword( password ); | |||
} | |||
// Convert seconds to milliseconds | |||
int timeoutInMilliseconds = remoteRepository.getTimeout() * 1000; | |||
// Set timeout | |||
wagon.setTimeout( timeoutInMilliseconds ); | |||
try | |||
{ | |||
org.apache.maven.wagon.repository.Repository wagonRepository = | |||
new org.apache.maven.wagon.repository.Repository( remoteRepository.getId(), remoteRepository.getUrl() ); | |||
wagon.connect( wagonRepository, authInfo, networkProxy ); | |||
connected = true; | |||
} | |||
catch ( ConnectionException e ) | |||
{ | |||
log.error( "Could not connect to " + remoteRepository.getName() + ": " + e.getMessage() ); | |||
connected = false; | |||
} | |||
catch ( AuthenticationException e ) | |||
{ | |||
log.error( "Could not connect to " + remoteRepository.getName() + ": " + e.getMessage() ); | |||
connected = false; | |||
} | |||
return connected; | |||
} | |||
private File transferChecksum( Wagon wagon, RemoteRepositoryConfiguration remoteRepository, String remotePath, | |||
File resource, File tmpDirectory, String ext ) | |||
throws AuthorizationException, TransferFailedException, ResourceDoesNotExistException | |||
{ | |||
File destFile = new File( tmpDirectory, resource.getName() + ext ); | |||
log.info( "Retrieving " + remotePath + " from " + remoteRepository.getName() ); | |||
wagon.get( remotePath, destFile ); | |||
log.debug( "Downloaded successfully." ); | |||
return destFile; | |||
} | |||
private String getProtocol( String url ) | |||
{ | |||
String protocol = StringUtils.substringBefore( url, ":" ); | |||
return protocol; | |||
} | |||
private File createWorkingDirectory( String targetRepository ) | |||
{ | |||
try | |||
{ | |||
File tmpDir = File.createTempFile( ".workingdirectory", null, new File( targetRepository ) ); | |||
tmpDir.delete(); | |||
tmpDir.mkdirs(); | |||
return tmpDir; | |||
} | |||
catch ( IOException e ) | |||
{ | |||
throw new RuntimeException( "Could not create working directory for this request", e ); | |||
} | |||
} | |||
private void moveFileIfExists( File fileToMove, File directory ) | |||
{ | |||
if ( fileToMove != null && fileToMove.exists() ) | |||
{ | |||
File newLocation = new File( directory, fileToMove.getName() ); | |||
if ( newLocation.exists() && !newLocation.delete() ) | |||
{ | |||
throw new RuntimeException( "Unable to overwrite existing target file: " + newLocation.getAbsolutePath() ); | |||
} | |||
newLocation.getParentFile().mkdirs(); | |||
if ( !fileToMove.renameTo( newLocation ) ) | |||
{ | |||
log.warn( "Unable to rename tmp file to its final name... resorting to copy command." ); | |||
try | |||
{ | |||
FileUtils.copyFile( fileToMove, newLocation ); | |||
} | |||
catch ( IOException e ) | |||
{ | |||
if ( newLocation.exists() ) | |||
{ | |||
log.error( "Tried to copy file " + fileToMove.getName() + " to " + newLocation.getAbsolutePath() | |||
+ " but file with this name already exists." ); | |||
} | |||
else | |||
{ | |||
throw new RuntimeException( "Cannot copy tmp file " + fileToMove.getAbsolutePath() | |||
+ " to its final location", e ); | |||
} | |||
} | |||
finally | |||
{ | |||
FileUtils.deleteQuietly( fileToMove ); | |||
} | |||
} | |||
} | |||
} | |||
} |
@@ -30,18 +30,28 @@ import org.apache.archiva.metadata.repository.filter.ExcludesFilter; | |||
import org.apache.archiva.metadata.repository.filter.Filter; | |||
import org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataInvalidException; | |||
import org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataNotFoundException; | |||
import org.apache.archiva.proxy.common.WagonFactory; | |||
import org.apache.commons.io.FileUtils; | |||
import org.apache.maven.archiva.common.utils.FileUtil; | |||
import org.apache.maven.archiva.configuration.ArchivaConfiguration; | |||
import org.apache.maven.archiva.configuration.Configuration; | |||
import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; | |||
import org.apache.maven.archiva.configuration.ProxyConnectorConfiguration; | |||
import org.apache.maven.archiva.configuration.RemoteRepositoryConfiguration; | |||
import org.apache.maven.wagon.Wagon; | |||
import org.junit.Before; | |||
import org.junit.Test; | |||
import org.junit.runner.RunWith; | |||
import org.springframework.test.context.ContextConfiguration; | |||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; | |||
import static org.mockito.Mockito.mock; | |||
import static org.mockito.Mockito.when; | |||
import javax.inject.Inject; | |||
import javax.inject.Named; | |||
import java.io.File; | |||
import java.io.IOException; | |||
import java.util.ArrayList; | |||
import java.util.Arrays; | |||
import java.util.Collection; | |||
@@ -62,12 +72,20 @@ public class Maven2RepositoryMetadataResolverTest | |||
private static final String TEST_REPO_ID = "test"; | |||
private static final String TEST_REMOTE_REPO_ID = "central"; | |||
private static final String ASF_SCM_CONN_BASE = "scm:svn:http://svn.apache.org/repos/asf/"; | |||
private static final String ASF_SCM_DEV_CONN_BASE = "scm:svn:https://svn.apache.org/repos/asf/"; | |||
private static final String ASF_SCM_VIEWVC_BASE = "http://svn.apache.org/viewvc/"; | |||
private static final String TEST_SCM_CONN_BASE = "scm:svn:http://svn.example.com/repos/"; | |||
private static final String TEST_SCM_DEV_CONN_BASE = "scm:svn:https://svn.example.com/repos/"; | |||
private static final String TEST_SCM_URL_BASE = "http://svn.example.com/repos/"; | |||
private static final String EMPTY_MD5 = "d41d8cd98f00b204e9800998ecf8427e"; | |||
private static final String EMPTY_SHA1 = "da39a3ee5e6b4b0d3255bfef95601890afd80709"; | |||
@@ -75,6 +93,8 @@ public class Maven2RepositoryMetadataResolverTest | |||
@Inject | |||
private ArchivaConfiguration configuration; | |||
private WagonFactory wagonFactory; | |||
@Before | |||
public void setUp() | |||
throws Exception | |||
@@ -87,8 +107,29 @@ public class Maven2RepositoryMetadataResolverTest | |||
testRepo.setId( TEST_REPO_ID ); | |||
testRepo.setLocation( new File( "target/test-repository" ).getAbsolutePath() ); | |||
c.addManagedRepository( testRepo ); | |||
RemoteRepositoryConfiguration testRemoteRepo = new RemoteRepositoryConfiguration(); | |||
testRemoteRepo.setId( TEST_REMOTE_REPO_ID ); | |||
testRemoteRepo.setLayout( "default" ); | |||
testRemoteRepo.setName( "Central Repository" ); | |||
testRemoteRepo.setUrl( "http://central.repo.com/maven2" ); | |||
testRemoteRepo.setTimeout( 10 ); | |||
c.addRemoteRepository( testRemoteRepo ); | |||
ProxyConnectorConfiguration proxyConnector = new ProxyConnectorConfiguration(); | |||
proxyConnector.setSourceRepoId( TEST_REPO_ID ); | |||
proxyConnector.setTargetRepoId( TEST_REMOTE_REPO_ID ); | |||
proxyConnector.setDisabled( false ); | |||
c.addProxyConnector( proxyConnector ); | |||
configuration.save( c ); | |||
wagonFactory = mock( WagonFactory.class ); | |||
storage.setWagonFactory( wagonFactory ); | |||
Wagon wagon = new MockWagon(); | |||
when( wagonFactory.getWagon( "wagon#http" ) ).thenReturn( wagon ); | |||
//storage = (Maven2RepositoryStorage) lookup( RepositoryStorage.class, "maven2" ); | |||
} | |||
@@ -404,6 +445,91 @@ public class Maven2RepositoryMetadataResolverTest | |||
} | |||
} | |||
// Tests for MRM-1411 - START | |||
@Test | |||
public void testGetProjectVersionMetadataWithParentSuccessful() | |||
throws Exception | |||
{ | |||
copyTestArtifactWithParent(); | |||
ProjectVersionMetadata metadata = storage.readProjectVersionMetadata( TEST_REPO_ID, "com.example.test", | |||
"test-artifact-module-a", "1.0" ); | |||
MavenProjectFacet facet = (MavenProjectFacet) metadata.getFacet( MavenProjectFacet.FACET_ID ); | |||
assertEquals( "jar", facet.getPackaging() ); | |||
assertEquals( "http://maven.apache.org", metadata.getUrl() ); | |||
assertEquals( "com.example.test", facet.getParent().getGroupId() ); | |||
assertEquals( "test-artifact-root", facet.getParent().getArtifactId() ); | |||
assertEquals( "1.0", facet.getParent().getVersion() ); | |||
assertEquals( "test-artifact-module-a", facet.getArtifactId() ); | |||
assertEquals( "com.example.test", facet.getGroupId() ); | |||
assertNull( metadata.getCiManagement() ); | |||
assertNotNull( metadata.getDescription() ); | |||
checkApacheLicense( metadata ); | |||
assertEquals( "1.0", metadata.getId() ); | |||
assertEquals( "Test Artifact :: Module A", metadata.getName() ); | |||
String path = "test-artifact/trunk/test-artifact-module-a"; | |||
assertEquals( TEST_SCM_CONN_BASE + path, metadata.getScm().getConnection() ); | |||
assertEquals( TEST_SCM_DEV_CONN_BASE + path, metadata.getScm().getDeveloperConnection() ); | |||
assertEquals( TEST_SCM_URL_BASE + path, metadata.getScm().getUrl() ); | |||
List<Dependency> dependencies = metadata.getDependencies(); | |||
assertEquals( 2, dependencies.size() ); | |||
assertDependency( dependencies.get( 0 ), "commons-io", "commons-io", "1.4" ); | |||
assertDependency( dependencies.get( 1 ), "junit", "junit", "3.8.1", "test" ); | |||
deleteTestArtifactWithParent(); | |||
} | |||
@Test | |||
public void testGetProjectVersionMetadataWithParentNoRemoteReposConfigured() | |||
throws Exception | |||
{ | |||
// remove configuration | |||
Configuration config = configuration.getConfiguration(); | |||
RemoteRepositoryConfiguration remoteRepo = config.findRemoteRepositoryById( TEST_REMOTE_REPO_ID ); | |||
config.removeRemoteRepository( remoteRepo ); | |||
configuration.save( config ); | |||
copyTestArtifactWithParent(); | |||
ProjectVersionMetadata metadata = storage.readProjectVersionMetadata( TEST_REPO_ID, "com.example.test", | |||
"test-artifact-module-a", "1.0" ); | |||
assertEquals( "1.0", metadata.getId() ); | |||
MavenProjectFacet facet = ( MavenProjectFacet ) metadata.getFacet( MavenProjectFacet.FACET_ID ); | |||
assertNotNull( facet ); | |||
assertEquals( "com.example.test", facet.getGroupId() ); | |||
assertEquals( "test-artifact-module-a", facet.getArtifactId() ); | |||
assertEquals( "jar", facet.getPackaging() ); | |||
deleteTestArtifactWithParent(); | |||
} | |||
@Test | |||
public void testGetProjectVersionMetadataWithParentNotInAnyRemoteRepo() | |||
throws Exception | |||
{ | |||
copyTestArtifactWithParent(); | |||
ProjectVersionMetadata metadata = storage.readProjectVersionMetadata( TEST_REPO_ID, "com.example.test", "missing-parent", "1.1" ); | |||
assertEquals( "1.1", metadata.getId() ); | |||
MavenProjectFacet facet = ( MavenProjectFacet ) metadata.getFacet( MavenProjectFacet.FACET_ID ); | |||
assertNotNull( facet ); | |||
assertEquals( "com.example.test", facet.getGroupId() ); | |||
assertEquals( "missing-parent", facet.getArtifactId() ); | |||
assertEquals( "jar", facet.getPackaging() ); | |||
deleteTestArtifactWithParent(); | |||
} | |||
// Tests for MRM-1411 - END | |||
@Test | |||
public void testGetRootNamespaces() | |||
{ | |||
@@ -440,7 +566,7 @@ public class Maven2RepositoryMetadataResolverTest | |||
assertEquals( Collections.<String>emptyList(), storage.listProjects( TEST_REPO_ID, "com", ALL ) ); | |||
assertEquals( Collections.<String>emptyList(), storage.listProjects( TEST_REPO_ID, "com.example", ALL ) ); | |||
assertEquals( Arrays.asList( "incomplete-metadata", "invalid-pom", "malformed-metadata", "mislocated-pom", | |||
"missing-metadata", "test-artifact" ), storage.listProjects( TEST_REPO_ID, | |||
"missing-metadata", "missing-parent", "test-artifact" ), storage.listProjects( TEST_REPO_ID, | |||
"com.example.test", | |||
ALL ) ); | |||
@@ -608,4 +734,32 @@ public class Maven2RepositoryMetadataResolverTest | |||
assertEquals( "The Apache Software Foundation", metadata.getOrganization().getName() ); | |||
assertEquals( "http://www.apache.org/", metadata.getOrganization().getUrl() ); | |||
} | |||
private void deleteTestArtifactWithParent() | |||
throws IOException | |||
{ | |||
File dest = new File( FileUtil.getBasedir(), "target/test-repository/com/example/test/test-artifact-module-a" ); | |||
File parentPom = new File( FileUtil.getBasedir(), "target/test-repository/com/example/test/test-artifact-parent" ); | |||
File rootPom = new File( FileUtil.getBasedir(), "target/test-repository/com/example/test/test-artifact-root" ); | |||
FileUtils.deleteDirectory( dest ); | |||
FileUtils.deleteDirectory( parentPom ); | |||
FileUtils.deleteDirectory( rootPom ); | |||
assertFalse( dest.exists() ); | |||
assertFalse( parentPom.exists() ); | |||
assertFalse( rootPom.exists() ); | |||
} | |||
private File copyTestArtifactWithParent() | |||
throws IOException | |||
{ | |||
File src = new File( FileUtil.getBasedir(), "target/test-classes/com/example/test/test-artifact-module-a" ); | |||
File dest = new File( FileUtil.getBasedir(), "target/test-repository/com/example/test/test-artifact-module-a" ); | |||
FileUtils.copyDirectory( src, dest ); | |||
assertTrue( dest.exists() ); | |||
return dest; | |||
} | |||
} |
@@ -0,0 +1,190 @@ | |||
package org.apache.archiva.metadata.repository.storage.maven2; | |||
import org.apache.commons.io.FileUtils; | |||
import org.apache.maven.wagon.ConnectionException; | |||
import org.apache.maven.wagon.ResourceDoesNotExistException; | |||
import org.apache.maven.wagon.TransferFailedException; | |||
import org.apache.maven.wagon.Wagon; | |||
import org.apache.maven.wagon.authentication.AuthenticationException; | |||
import org.apache.maven.wagon.authentication.AuthenticationInfo; | |||
import org.apache.maven.wagon.authorization.AuthorizationException; | |||
import org.apache.maven.wagon.events.SessionListener; | |||
import org.apache.maven.wagon.events.TransferListener; | |||
import org.apache.maven.wagon.proxy.ProxyInfo; | |||
import org.apache.maven.wagon.proxy.ProxyInfoProvider; | |||
import org.apache.maven.wagon.repository.Repository; | |||
import java.io.File; | |||
import java.io.IOException; | |||
import java.util.List; | |||
public class MockWagon | |||
implements Wagon | |||
{ | |||
public void get( String s, File file ) | |||
throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException | |||
{ | |||
String sourceFile = getBasedir() + "/target/test-classes/" + s; | |||
try | |||
{ | |||
FileUtils.copyFile( new File( sourceFile ), file ); | |||
assert( file.exists() ); | |||
} | |||
catch( IOException e ) | |||
{ | |||
throw new ResourceDoesNotExistException( e.getMessage() ); | |||
} | |||
} | |||
public boolean getIfNewer( String s, File file, long l ) | |||
throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException | |||
{ | |||
return false; | |||
} | |||
public void put( File file, String s ) | |||
throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException | |||
{ | |||
} | |||
public void putDirectory( File file, String s ) | |||
throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException | |||
{ | |||
} | |||
public boolean resourceExists( String s ) | |||
throws TransferFailedException, AuthorizationException | |||
{ | |||
return false; | |||
} | |||
public List getFileList( String s ) | |||
throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException | |||
{ | |||
return null; | |||
} | |||
public boolean supportsDirectoryCopy() | |||
{ | |||
return false; | |||
} | |||
public Repository getRepository() | |||
{ | |||
return null; | |||
} | |||
public void connect( Repository repository ) | |||
throws ConnectionException, AuthenticationException | |||
{ | |||
} | |||
public void connect( Repository repository, ProxyInfo proxyInfo ) | |||
throws ConnectionException, AuthenticationException | |||
{ | |||
} | |||
public void connect( Repository repository, ProxyInfoProvider proxyInfoProvider ) | |||
throws ConnectionException, AuthenticationException | |||
{ | |||
} | |||
public void connect( Repository repository, AuthenticationInfo authenticationInfo ) | |||
throws ConnectionException, AuthenticationException | |||
{ | |||
} | |||
public void connect( Repository repository, AuthenticationInfo authenticationInfo, ProxyInfo proxyInfo ) | |||
throws ConnectionException, AuthenticationException | |||
{ | |||
} | |||
public void connect( Repository repository, AuthenticationInfo authenticationInfo, | |||
ProxyInfoProvider proxyInfoProvider ) | |||
throws ConnectionException, AuthenticationException | |||
{ | |||
} | |||
public void openConnection() | |||
throws ConnectionException, AuthenticationException | |||
{ | |||
} | |||
public void disconnect() | |||
throws ConnectionException | |||
{ | |||
} | |||
public void setTimeout( int i ) | |||
{ | |||
} | |||
public int getTimeout() | |||
{ | |||
return 0; | |||
} | |||
public void addSessionListener( SessionListener sessionListener ) | |||
{ | |||
} | |||
public void removeSessionListener( SessionListener sessionListener ) | |||
{ | |||
} | |||
public boolean hasSessionListener( SessionListener sessionListener ) | |||
{ | |||
return false; | |||
} | |||
public void addTransferListener( TransferListener transferListener ) | |||
{ | |||
} | |||
public void removeTransferListener( TransferListener transferListener ) | |||
{ | |||
} | |||
public boolean hasTransferListener( TransferListener transferListener ) | |||
{ | |||
return false; | |||
} | |||
public boolean isInteractive() | |||
{ | |||
return false; | |||
} | |||
public void setInteractive( boolean b ) | |||
{ | |||
} | |||
public String getBasedir() | |||
{ | |||
String basedir = System.getProperty( "basedir" ); | |||
if ( basedir == null ) | |||
{ | |||
basedir = new File( "" ).getAbsolutePath(); | |||
} | |||
return basedir; | |||
} | |||
} |
@@ -0,0 +1 @@ | |||
37786de9e272ed6db8541855e0e2d5dc |
@@ -0,0 +1 @@ | |||
bb1ca7834422926d0cb79ef303b715bc17f41661 |
@@ -0,0 +1,19 @@ | |||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> | |||
<modelVersion>4.0.0</modelVersion> | |||
<parent> | |||
<groupId>com.example.test</groupId> | |||
<artifactId>test-artifact-root</artifactId> | |||
<version>1.0</version> | |||
</parent> | |||
<artifactId>test-artifact-module-a</artifactId> | |||
<packaging>jar</packaging> | |||
<name>Test Artifact :: Module A</name> | |||
<url>http://maven.apache.org</url> | |||
<dependencies> | |||
<dependency> | |||
<groupId>commons-io</groupId> | |||
<artifactId>commons-io</artifactId> | |||
</dependency> | |||
</dependencies> | |||
</project> |
@@ -0,0 +1 @@ | |||
61a4d030260fc6bee0681cf99ba54674 |
@@ -0,0 +1 @@ | |||
6f54bc4223bc39d7880420f66baa3a24d7f9c181 |
@@ -0,0 +1,41 @@ | |||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> | |||
<modelVersion>4.0.0</modelVersion> | |||
<groupId>com.example.test</groupId> | |||
<artifactId>test-artifact-parent</artifactId> | |||
<version>1</version> | |||
<packaging>pom</packaging> | |||
<name>Test Artifact :: Parent</name> | |||
<description>This is the uber parent POM.</description> | |||
<url>http://test.com</url> | |||
<scm> | |||
<connection>scm:svn:http://svn.example.com/repos/test-artifact-parent/trunk</connection> | |||
<developerConnection>scm:svn:https://svn.example.com/repos/test-artifact-parent/trunk</developerConnection> | |||
<url>http://svn.example.com/repos/test-artifact-parent/trunk</url> | |||
</scm> | |||
<distributionManagement> | |||
<repository> | |||
<id>releases</id> | |||
<name>Releases Repository</name> | |||
<url>http://repo.test.com/archiva/repository/releases</url> | |||
</repository> | |||
<snapshotRepository> | |||
<id>snapshots</id> | |||
<name>Snapshots Repository</name> | |||
<url>http://repo.test.com/archiva/repository/snapshots</url> | |||
</snapshotRepository> | |||
</distributionManagement> | |||
<developers> | |||
<developer> | |||
<id>jsmith</id> | |||
<name>John Smith</name> | |||
<email>jsmith@mail.com</email> | |||
</developer> | |||
</developers> | |||
<licenses> | |||
<license> | |||
<name>The Apache Software License, Version 2.0</name> | |||
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url> | |||
</license> | |||
</licenses> | |||
</project> |
@@ -0,0 +1 @@ | |||
92c60efe85e23fe5afd8a854cea87209 |
@@ -0,0 +1 @@ | |||
6eca3509acf66023c29e2bc17f73e79d1d1a341a |
@@ -0,0 +1,40 @@ | |||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> | |||
<modelVersion>4.0.0</modelVersion> | |||
<parent> | |||
<groupId>com.example.test</groupId> | |||
<artifactId>test-artifact-parent</artifactId> | |||
<version>1</version> | |||
</parent> | |||
<artifactId>test-artifact-root</artifactId> | |||
<version>1.0</version> | |||
<packaging>pom</packaging> | |||
<name>Test Artifact :: Root</name> | |||
<description>This is the Test project.</description> | |||
<modules> | |||
<module>test-artifact-module-a</module> | |||
<module>test-artifact-module-b</module> | |||
</modules> | |||
<scm> | |||
<connection>scm:svn:http://svn.example.com/repos/test-artifact/trunk</connection> | |||
<developerConnection>scm:svn:https://svn.example.com/repos/test-artifact/trunk</developerConnection> | |||
<url>http://svn.example.com/repos/test-artifact/trunk</url> | |||
</scm> | |||
<dependencyManagement> | |||
<dependencies> | |||
<dependency> | |||
<groupId>commons-io</groupId> | |||
<artifactId>commons-io</artifactId> | |||
<version>1.4</version> | |||
</dependency> | |||
</dependencies> | |||
</dependencyManagement> | |||
<dependencies> | |||
<dependency> | |||
<groupId>junit</groupId> | |||
<artifactId>junit</artifactId> | |||
<version>3.8.1</version> | |||
<scope>test</scope> | |||
</dependency> | |||
</dependencies> | |||
</project> |
@@ -0,0 +1 @@ | |||
034449f8696981edce2485b841a02a47 |
@@ -0,0 +1 @@ | |||
bef26aec1a0714cec7fa56cdbb7ebcdb452295eb |
@@ -274,7 +274,7 @@ | |||
<dependency> | |||
<groupId>org.apache.archiva</groupId> | |||
<artifactId>archiva-plexus-bridge</artifactId> | |||
<version>${project.version}</version> | |||
<version>1.4-SNAPSHOT</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.apache.archiva</groupId> | |||
@@ -291,6 +291,11 @@ | |||
<artifactId>archiva-proxy</artifactId> | |||
<version>1.4-SNAPSHOT</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.apache.archiva</groupId> | |||
<artifactId>archiva-proxy-common</artifactId> | |||
<version>1.4-SNAPSHOT</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.apache.archiva</groupId> | |||
<artifactId>archiva-repository-layer</artifactId> |