From 5d6774f5f2560c02911c6e9846eccd08a12b86a8 Mon Sep 17 00:00:00 2001 From: Olivier Lamy Date: Sat, 4 Feb 2012 22:08:28 +0000 Subject: [PATCH] [MRM-1599] NTLM proxy no longer works use a new wagon with spring bean http-ntlm if proxy use ntlm git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1240623 13f79535-47bb-0310-9956-ffa450edef68 --- .../archiva-base/archiva-proxy-common/pom.xml | 5 + .../proxy/common/DefaultWagonFactory.java | 11 +- .../archiva/proxy/common/WagonFactory.java | 2 +- .../resources/META-INF/spring-context.xml | 4 + .../DefaultRepositoryProxyConnectors.java | 42 +++++- .../indexing/DownloadRemoteIndexTask.java | 6 +- .../metadata/metadata-repository-api/pom.xml | 4 + .../repository/DefaultMetadataResolver.java | 19 +-- .../repository/storage/RepositoryStorage.java | 22 +++- .../maven2/DefaultDependencyTreeBuilder.java | 122 +++++++++++------- .../maven2/Maven2RepositoryStorage.java | 103 ++++++++------- .../maven2/RepositoryModelResolver.java | 55 +++++--- pom.xml | 5 + 13 files changed, 253 insertions(+), 147 deletions(-) diff --git a/archiva-modules/archiva-base/archiva-proxy-common/pom.xml b/archiva-modules/archiva-base/archiva-proxy-common/pom.xml index c8f296f4e..454b3be1c 100644 --- a/archiva-modules/archiva-base/archiva-proxy-common/pom.xml +++ b/archiva-modules/archiva-base/archiva-proxy-common/pom.xml @@ -41,6 +41,11 @@ wagon-file test + + org.apache.maven.wagon + wagon-http-lightweight + test + org.apache.maven.wagon wagon-http diff --git a/archiva-modules/archiva-base/archiva-proxy-common/src/main/java/org/apache/archiva/proxy/common/DefaultWagonFactory.java b/archiva-modules/archiva-base/archiva-proxy-common/src/main/java/org/apache/archiva/proxy/common/DefaultWagonFactory.java index bf9d7e9c2..8bf469a7a 100755 --- a/archiva-modules/archiva-base/archiva-proxy-common/src/main/java/org/apache/archiva/proxy/common/DefaultWagonFactory.java +++ b/archiva-modules/archiva-base/archiva-proxy-common/src/main/java/org/apache/archiva/proxy/common/DefaultWagonFactory.java @@ -37,16 +37,13 @@ public class DefaultWagonFactory implements WagonFactory { - private PlexusSisuBridge plexusSisuBridge; - private ApplicationContext applicationContext; private DebugTransferListener debugTransferListener = new DebugTransferListener(); @Inject - public DefaultWagonFactory( PlexusSisuBridge plexusSisuBridge, ApplicationContext applicationContext ) + public DefaultWagonFactory( ApplicationContext applicationContext ) { - this.plexusSisuBridge = plexusSisuBridge; this.applicationContext = applicationContext; } @@ -55,18 +52,12 @@ public class DefaultWagonFactory { try { - // with sisu inject bridge hint is file or http - // so remove wagon# - //protocol = StringUtils.remove( protocol, "wagon#" ); - // spring beans will be named wagon#protocol (http, https, file ) protocol = StringUtils.startsWith( protocol, "wagon#" ) ? protocol : "wagon#" + protocol; - //Wagon wagon = plexusSisuBridge.lookup( Wagon.class, protocol ); Wagon wagon = applicationContext.getBean( protocol, Wagon.class ); wagon.addTransferListener( debugTransferListener ); return wagon; } - //catch ( PlexusSisuBridgeException e ) catch ( BeansException e ) { throw new WagonFactoryException( e.getMessage(), e ); diff --git a/archiva-modules/archiva-base/archiva-proxy-common/src/main/java/org/apache/archiva/proxy/common/WagonFactory.java b/archiva-modules/archiva-base/archiva-proxy-common/src/main/java/org/apache/archiva/proxy/common/WagonFactory.java index 3768f8e3b..98eb427c2 100644 --- a/archiva-modules/archiva-base/archiva-proxy-common/src/main/java/org/apache/archiva/proxy/common/WagonFactory.java +++ b/archiva-modules/archiva-base/archiva-proxy-common/src/main/java/org/apache/archiva/proxy/common/WagonFactory.java @@ -30,7 +30,7 @@ public interface WagonFactory * Create a new Wagon instance for the given protocol. * * @param protocol the protocol to find the Wagon for, which must be prefixed with wagon#, for example - * wagon#http. + * wagon#http. to have a wagon supporting ntlm add -ntlm * @return the Wagon instance */ Wagon getWagon( String protocol ) diff --git a/archiva-modules/archiva-base/archiva-proxy-common/src/main/resources/META-INF/spring-context.xml b/archiva-modules/archiva-base/archiva-proxy-common/src/main/resources/META-INF/spring-context.xml index ef68e5561..217a33d3b 100644 --- a/archiva-modules/archiva-base/archiva-proxy-common/src/main/resources/META-INF/spring-context.xml +++ b/archiva-modules/archiva-base/archiva-proxy-common/src/main/resources/META-INF/spring-context.xml @@ -34,4 +34,8 @@ + + + + \ No newline at end of file diff --git a/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/DefaultRepositoryProxyConnectors.java b/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/DefaultRepositoryProxyConnectors.java index 055d103b7..cbdd6948c 100644 --- a/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/DefaultRepositoryProxyConnectors.java +++ b/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/DefaultRepositoryProxyConnectors.java @@ -20,6 +20,9 @@ package org.apache.archiva.proxy; */ import com.google.common.collect.Lists; +import org.apache.archiva.admin.model.RepositoryAdminException; +import org.apache.archiva.admin.model.beans.NetworkProxy; +import org.apache.archiva.admin.model.networkproxy.NetworkProxyAdmin; import org.apache.archiva.configuration.ArchivaConfiguration; import org.apache.archiva.configuration.ConfigurationNames; import org.apache.archiva.configuration.NetworkProxyConfiguration; @@ -156,14 +159,15 @@ public class DefaultRepositoryProxyConnectors @Named( value = "archivaTaskScheduler#repository" ) private ArchivaTaskScheduler scheduler; + @Inject + private NetworkProxyAdmin networkProxyAdmin; + @PostConstruct public void initialize() { initConnectorsAndNetworkProxies(); archivaConfiguration.addChangeListener( this ); - //this.postDownloadPolicies = applicationContext.getBeansOfType( PostDownloadPolicy.class ); - //his.preDownloadPolicies = applicationContext.getBeansOfType( PreDownloadPolicy.class ); - //this.downloadErrorPolicies = applicationContext.getBeansOfType( DownloadErrorPolicy.class ); + } @SuppressWarnings( "unchecked" ) @@ -309,6 +313,11 @@ public class DefaultRepositoryProxyConnectors validatePolicies( this.downloadErrorPolicies, connector.getPolicies(), requestProperties, artifact, targetRepository, localFile, e, previousExceptions ); } + catch ( RepositoryAdminException e ) + { + validatePolicies( this.downloadErrorPolicies, connector.getPolicies(), requestProperties, artifact, + targetRepository, localFile, e, previousExceptions ); + } } if ( !previousExceptions.isEmpty() ) @@ -378,6 +387,13 @@ public class DefaultRepositoryProxyConnectors + path + ", continuing to next repository. Error message: " + e.getMessage() ); log.debug( "Full stack trace", e ); } + catch ( RepositoryAdminException e ) + { + log.warn( + "Transfer error from repository \"" + targetRepository.getRepository().getId() + "\" for resource " + + path + ", continuing to next repository. Error message: " + e.getMessage() ); + log.debug( "Full stack trace", e ); + } } log.debug( "Exhausted all target repositories, resource {} not found.", path ); @@ -440,6 +456,13 @@ public class DefaultRepositoryProxyConnectors + ", continuing to next repository. Error message: " + e.getMessage() ); log.debug( "Full stack trace", e ); } + catch ( RepositoryAdminException e ) + { + log.warn( "Transfer error from repository \"" + targetRepository.getRepository().getId() + + "\" for versioned Metadata " + logicalPath + + ", continuing to next repository. Error message: " + e.getMessage() ); + log.debug( "Full stack trace", e ); + } } if ( hasBeenUpdated( localFile, originalTimestamp ) ) @@ -556,7 +579,7 @@ public class DefaultRepositoryProxyConnectors private File transferFile( ProxyConnector connector, RemoteRepositoryContent remoteRepository, String remotePath, ManagedRepositoryContent repository, File resource, Properties requestProperties, boolean executeConsumers ) - throws ProxyException, NotModifiedException + throws ProxyException, NotModifiedException, RepositoryAdminException { String url = remoteRepository.getURL().getUrl(); if ( !url.endsWith( "/" ) ) @@ -616,7 +639,14 @@ public class DefaultRepositoryProxyConnectors { RepositoryURL repoUrl = remoteRepository.getURL(); String protocol = repoUrl.getProtocol(); - wagon = wagonFactory.getWagon( "wagon#" + protocol ); + NetworkProxy networkProxy = null; + if ( StringUtils.isNotBlank( connector.getProxyId() ) ) + { + networkProxy = networkProxyAdmin.getNetworkProxy( connector.getProxyId() ); + } + + wagon = ( networkProxy != null && networkProxy.isUseNtlm() ) ? wagonFactory.getWagon( + "wagon#" + protocol + "-ntlm" ) : wagonFactory.getWagon( "wagon#" + protocol ); if ( wagon == null ) { throw new ProxyException( "Unsupported target repository protocol: " + protocol ); @@ -909,7 +939,7 @@ public class DefaultRepositoryProxyConnectors private void validatePolicies( Map policies, Map settings, Properties request, ArtifactReference artifact, RemoteRepositoryContent content, - File localFile, ProxyException exception, Map previousExceptions ) + File localFile, Exception exception, Map previousExceptions ) throws ProxyDownloadException { boolean process = true; diff --git a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/DownloadRemoteIndexTask.java b/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/DownloadRemoteIndexTask.java index 83eeb01c5..c9553082d 100644 --- a/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/DownloadRemoteIndexTask.java +++ b/archiva-modules/archiva-scheduler/archiva-scheduler-indexing/src/main/java/org/apache/archiva/scheduler/indexing/DownloadRemoteIndexTask.java @@ -127,7 +127,11 @@ public class DownloadRemoteIndexTask tempIndexDirectory.deleteOnExit(); String baseIndexUrl = indexingContext.getIndexUpdateUrl(); - final Wagon wagon = wagonFactory.getWagon( new URL( this.remoteRepository.getUrl() ).getProtocol() ); + String wagonProtocol = + new URL( this.remoteRepository.getUrl() ).getProtocol() + ( ( this.networkProxy != null + && this.networkProxy.isUseNtlm() ) ? "-ntlm" : "" ); + + final Wagon wagon = wagonFactory.getWagon( wagonProtocol ); setupWagonReadTimeout( wagon ); wagon.addTransferListener( new DownloadListener() ); diff --git a/archiva-modules/metadata/metadata-repository-api/pom.xml b/archiva-modules/metadata/metadata-repository-api/pom.xml index b9c997704..d1847ce83 100644 --- a/archiva-modules/metadata/metadata-repository-api/pom.xml +++ b/archiva-modules/metadata/metadata-repository-api/pom.xml @@ -44,6 +44,10 @@ org.apache.archiva metadata-model + + org.apache.archiva + archiva-repository-admin-api + org.springframework spring-test diff --git a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java index 36fd5dc3d..f56d72c16 100644 --- a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java +++ b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java @@ -19,6 +19,7 @@ package org.apache.archiva.metadata.repository; * under the License. */ +import org.apache.archiva.admin.model.RepositoryAdminException; import org.apache.archiva.metadata.model.ArtifactMetadata; import org.apache.archiva.metadata.model.ProjectMetadata; import org.apache.archiva.metadata.model.ProjectVersionMetadata; @@ -30,10 +31,8 @@ import org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataN import org.apache.archiva.repository.events.RepositoryListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; -import javax.annotation.PostConstruct; import javax.inject.Inject; import javax.inject.Named; import java.util.ArrayList; @@ -71,8 +70,6 @@ public class DefaultMetadataResolver * TODO: Also need to accommodate availability of proxy module * ... could be a different type since we need methods to modify the storage metadata, which would also allow more * appropriate methods to pass in the already determined repository configuration, for example, instead of the ID - * - * */ @Inject @Named( value = "repositoryStorage#maven2" ) @@ -103,10 +100,8 @@ public class DefaultMetadataResolver { metadata = repositoryStorage.readProjectVersionMetadata( repoId, namespace, projectId, projectVersion ); - if ( log.isDebugEnabled() ) - { - log.debug( "Resolved project version metadata from storage: " + metadata ); - } + log.debug( "Resolved project version metadata from storage: {}", metadata ); + // FIXME: make this a more generic post-processing that plugins can take advantage of // eg. maven projects should be able to process parent here if ( !metadata.getDependencies().isEmpty() ) @@ -140,6 +135,14 @@ public class DefaultMetadataResolver } throw new MetadataResolutionException( e.getMessage(), e ); } + catch ( RepositoryAdminException e ) + { + for ( RepositoryListener listener : listeners ) + { + listener.addArtifactProblem( session, repoId, namespace, projectId, projectVersion, e ); + } + throw new MetadataResolutionException( e.getMessage(), e ); + } catch ( RepositoryStorageMetadataNotFoundException e ) { for ( RepositoryListener listener : listeners ) diff --git a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorage.java b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorage.java index 1c894816b..f31f14aaf 100644 --- a/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorage.java +++ b/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/storage/RepositoryStorage.java @@ -19,6 +19,7 @@ package org.apache.archiva.metadata.repository.storage; * under the License. */ +import org.apache.archiva.admin.model.RepositoryAdminException; import org.apache.archiva.metadata.model.ArtifactMetadata; import org.apache.archiva.metadata.model.ProjectMetadata; import org.apache.archiva.metadata.model.ProjectVersionMetadata; @@ -33,19 +34,26 @@ public interface RepositoryStorage ProjectVersionMetadata readProjectVersionMetadata( String repoId, String namespace, String projectId, String projectVersion ) - throws RepositoryStorageMetadataInvalidException, RepositoryStorageMetadataNotFoundException; + throws RepositoryStorageMetadataInvalidException, RepositoryStorageMetadataNotFoundException, + RepositoryAdminException; - Collection listRootNamespaces( String repoId, Filter filter ); + Collection listRootNamespaces( String repoId, Filter filter ) + throws RepositoryAdminException; - Collection listNamespaces( String repoId, String namespace, Filter filter ); + Collection listNamespaces( String repoId, String namespace, Filter filter ) + throws RepositoryAdminException; - Collection listProjects( String repoId, String namespace, Filter filter ); + Collection listProjects( String repoId, String namespace, Filter filter ) + throws RepositoryAdminException; - Collection listProjectVersions( String repoId, String namespace, String projectId, Filter filter ); + Collection listProjectVersions( String repoId, String namespace, String projectId, Filter filter ) + throws RepositoryAdminException; Collection readArtifactsMetadata( String repoId, String namespace, String projectId, - String projectVersion, Filter filter ); + String projectVersion, Filter filter ) + throws RepositoryAdminException; // FIXME: reconsider this API, do we want to expose storage format in the form of a path? - ArtifactMetadata readArtifactMetadataFromPath( String repoId, String path ); + ArtifactMetadata readArtifactMetadataFromPath( String repoId, String path ) + throws RepositoryAdminException; } diff --git a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/dependency/tree/maven2/DefaultDependencyTreeBuilder.java b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/dependency/tree/maven2/DefaultDependencyTreeBuilder.java index 09c8aaff4..1ba491b4e 100644 --- a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/dependency/tree/maven2/DefaultDependencyTreeBuilder.java +++ b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/dependency/tree/maven2/DefaultDependencyTreeBuilder.java @@ -19,8 +19,18 @@ package org.apache.archiva.dependency.tree.maven2; * under the License. */ +import org.apache.archiva.admin.model.RepositoryAdminException; +import org.apache.archiva.admin.model.beans.ManagedRepository; +import org.apache.archiva.admin.model.beans.NetworkProxy; +import org.apache.archiva.admin.model.beans.ProxyConnector; +import org.apache.archiva.admin.model.beans.RemoteRepository; +import org.apache.archiva.admin.model.managed.ManagedRepositoryAdmin; +import org.apache.archiva.admin.model.networkproxy.NetworkProxyAdmin; +import org.apache.archiva.admin.model.proxyconnector.ProxyConnectorAdmin; +import org.apache.archiva.admin.model.remote.RemoteRepositoryAdmin; import org.apache.archiva.common.plexusbridge.PlexusSisuBridge; import org.apache.archiva.common.plexusbridge.PlexusSisuBridgeException; +import org.apache.archiva.common.utils.Slf4JPlexusLogger; import org.apache.archiva.metadata.repository.MetadataResolutionException; import org.apache.archiva.metadata.repository.MetadataResolver; import org.apache.archiva.metadata.repository.RepositorySession; @@ -29,12 +39,6 @@ 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.archiva.common.utils.Slf4JPlexusLogger; -import org.apache.archiva.configuration.ArchivaConfiguration; -import org.apache.archiva.configuration.ManagedRepositoryConfiguration; -import org.apache.archiva.configuration.NetworkProxyConfiguration; -import org.apache.archiva.configuration.ProxyConnectorConfiguration; -import org.apache.archiva.configuration.RemoteRepositoryConfiguration; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException; @@ -71,11 +75,13 @@ 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; +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import javax.inject.Named; import java.io.File; import java.util.ArrayList; import java.util.Collection; @@ -86,9 +92,6 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; -import javax.annotation.PostConstruct; -import javax.inject.Inject; -import javax.inject.Named; /** * Default implementation of DependencyTreeBuilder. Customized wrapper for maven-dependency-tree to use @@ -119,7 +122,6 @@ public class DefaultDependencyTreeBuilder /** * TODO: can have other types, and this might eventually come through from the main request - * */ @Inject private RepositorySessionFactory repositorySessionFactory; @@ -131,12 +133,17 @@ public class DefaultDependencyTreeBuilder @Named( value = "repositoryPathTranslator#maven2" ) private RepositoryPathTranslator pathTranslator; - /** - * - */ @Inject - @Named( value = "archivaConfiguration#default" ) - private ArchivaConfiguration archivaConfiguration; + private ProxyConnectorAdmin proxyConnectorAdmin; + + @Inject + private NetworkProxyAdmin networkProxyAdmin; + + @Inject + private RemoteRepositoryAdmin remoteRepositoryAdmin; + + @Inject + private ManagedRepositoryAdmin managedRepositoryAdmin; @Inject private PlexusSisuBridge plexusSisuBridge; @@ -148,9 +155,8 @@ public class DefaultDependencyTreeBuilder public void initialize() throws PlexusSisuBridgeException { - factory = plexusSisuBridge.lookup( ArtifactFactory.class , "default" ); - collector = plexusSisuBridge.lookup( ArtifactCollector.class , "default" ); - + factory = plexusSisuBridge.lookup( ArtifactFactory.class, "default" ); + collector = plexusSisuBridge.lookup( ArtifactCollector.class, "default" ); DefaultModelBuilderFactory defaultModelBuilderFactory = new DefaultModelBuilderFactory(); builder = defaultModelBuilderFactory.newInstance(); @@ -164,7 +170,15 @@ public class DefaultDependencyTreeBuilder new DependencyTreeResolutionListener( new Slf4JPlexusLogger( getClass() ) ); Artifact projectArtifact = factory.createProjectArtifact( groupId, artifactId, version ); - ManagedRepositoryConfiguration repository = findArtifactInRepositories( repositoryIds, projectArtifact ); + ManagedRepository repository = null; + try + { + repository = findArtifactInRepositories( repositoryIds, projectArtifact ); + } + catch ( RepositoryAdminException e ) + { + throw new DependencyTreeBuilderException( "Cannot build project dependency tree " + e.getMessage(), e ); + } if ( repository == null ) { @@ -179,37 +193,31 @@ public class DefaultDependencyTreeBuilder // MRM-1411 // TODO: this is a workaround for a lack of proxy capability in the resolvers - replace when it can all be // handled there. It doesn't cache anything locally! - List< RemoteRepositoryConfiguration > remoteRepositories = new ArrayList(); - Map networkProxies = new HashMap(); + List remoteRepositories = new ArrayList(); + Map networkProxies = new HashMap(); - Map> proxyConnectorsMap = archivaConfiguration.getConfiguration().getProxyConnectorAsMap(); - List proxyConnectors = proxyConnectorsMap.get( repository.getId() ); - if( proxyConnectors != null ) + Map> proxyConnectorsMap = proxyConnectorAdmin.getProxyConnectorAsMap(); + List proxyConnectors = proxyConnectorsMap.get( repository.getId() ); + if ( proxyConnectors != null ) { - for( ProxyConnectorConfiguration proxyConnector : proxyConnectors ) + for ( ProxyConnector proxyConnector : proxyConnectors ) { - remoteRepositories.add( archivaConfiguration.getConfiguration().findRemoteRepositoryById( proxyConnector.getTargetRepoId() ) ); + remoteRepositories.add( + remoteRepositoryAdmin.getRemoteRepository( proxyConnector.getTargetRepoId() ) ); - NetworkProxyConfiguration networkProxyConfig = archivaConfiguration.getConfiguration().getNetworkProxiesAsMap().get( - proxyConnector.getProxyId() ); + NetworkProxy networkProxyConfig = networkProxyAdmin.getNetworkProxy( proxyConnector.getProxyId() ); - if( networkProxyConfig != null ) + 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 ); + networkProxies.put( proxyConnector.getTargetRepoId(), networkProxyConfig ); } } } - Model model = buildProject( new RepositoryModelResolver( basedir, pathTranslator, wagonFactory, remoteRepositories, - networkProxies, repository ), groupId, artifactId, version ); + Model model = buildProject( + new RepositoryModelResolver( basedir, pathTranslator, wagonFactory, remoteRepositories, networkProxies, + repository ), groupId, artifactId, version ); Map managedVersions = createManagedVersionMap( model ); @@ -273,16 +281,20 @@ public class DefaultDependencyTreeBuilder { throw new DependencyTreeBuilderException( "Cannot build project dependency tree " + e.getMessage(), e ); } + catch ( RepositoryAdminException e ) + { + throw new DependencyTreeBuilderException( "Cannot build project dependency tree " + e.getMessage(), e ); + } } - private ManagedRepositoryConfiguration findArtifactInRepositories( List repositoryIds, Artifact projectArtifact ) + private ManagedRepository findArtifactInRepositories( List repositoryIds, Artifact projectArtifact ) + throws RepositoryAdminException { for ( String repoId : repositoryIds ) { - ManagedRepositoryConfiguration repositoryConfiguration = - archivaConfiguration.getConfiguration().findManagedRepositoryById( repoId ); + ManagedRepository managedRepository = managedRepositoryAdmin.getManagedRepository( repoId ); - File repoDir = new File( repositoryConfiguration.getLocation() ); + File repoDir = new File( managedRepository.getLocation() ); File file = pathTranslator.toFile( repoDir, projectArtifact.getGroupId(), projectArtifact.getArtifactId(), projectArtifact.getBaseVersion(), projectArtifact.getArtifactId() + "-" + projectArtifact.getVersion() @@ -290,7 +302,7 @@ public class DefaultDependencyTreeBuilder if ( file.exists() ) { - return repositoryConfiguration; + return managedRepository; } } return null; @@ -464,15 +476,23 @@ public class DefaultDependencyTreeBuilder factory.createProjectArtifact( artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), artifact.getScope() ); - ManagedRepositoryConfiguration repository = findArtifactInRepositories( repositoryIds, pomArtifact ); - + ManagedRepository repository = null; + try + { + repository = findArtifactInRepositories( repositoryIds, pomArtifact ); + } + catch ( RepositoryAdminException e ) + { + throw new ArtifactMetadataRetrievalException( e.getMessage(), e, artifact ); + } Model project = null; if ( !Artifact.SCOPE_SYSTEM.equals( artifact.getScope() ) && repository != null ) { - File basedir = new File( repository.getLocation() ); try { + + File basedir = new File( repository.getLocation() ); project = buildProject( new RepositoryModelResolver( basedir, pathTranslator ), artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion() ); @@ -485,6 +505,7 @@ public class DefaultDependencyTreeBuilder { throw new ArtifactMetadataRetrievalException( e.getMessage(), e, artifact ); } + } ResolutionGroup result; @@ -496,7 +517,8 @@ public class DefaultDependencyTreeBuilder // if the project is null, we encountered an invalid model (read: m1 POM) // we'll just return an empty resolution group. // or used the inherited scope (should that be passed to the buildFromRepository method above?) - result = new ResolutionGroup( pomArtifact, Collections.emptySet(), Collections.emptyList() ); + result = new ResolutionGroup( pomArtifact, Collections.emptySet(), + Collections.emptyList() ); } else { @@ -560,4 +582,4 @@ public class DefaultDependencyTreeBuilder { return factory; } -} +} \ No newline at end of file diff --git a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryStorage.java b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryStorage.java index fdf57b9cc..d84b6eec5 100644 --- a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryStorage.java +++ b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryStorage.java @@ -19,8 +19,18 @@ package org.apache.archiva.metadata.repository.storage.maven2; * under the License. */ +import org.apache.archiva.admin.model.RepositoryAdminException; +import org.apache.archiva.admin.model.beans.ManagedRepository; +import org.apache.archiva.admin.model.beans.NetworkProxy; +import org.apache.archiva.admin.model.beans.ProxyConnector; +import org.apache.archiva.admin.model.beans.RemoteRepository; +import org.apache.archiva.admin.model.managed.ManagedRepositoryAdmin; +import org.apache.archiva.admin.model.networkproxy.NetworkProxyAdmin; +import org.apache.archiva.admin.model.proxyconnector.ProxyConnectorAdmin; +import org.apache.archiva.admin.model.remote.RemoteRepositoryAdmin; import org.apache.archiva.checksum.ChecksumAlgorithm; import org.apache.archiva.checksum.ChecksummedFile; +import org.apache.archiva.common.utils.VersionUtil; import org.apache.archiva.metadata.model.ArtifactMetadata; import org.apache.archiva.metadata.model.ProjectMetadata; import org.apache.archiva.metadata.model.ProjectVersionMetadata; @@ -31,12 +41,6 @@ import org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataI import org.apache.archiva.metadata.repository.storage.RepositoryStorageMetadataNotFoundException; import org.apache.archiva.proxy.common.WagonFactory; import org.apache.archiva.reports.RepositoryProblemFacet; -import org.apache.archiva.common.utils.VersionUtil; -import org.apache.archiva.configuration.ArchivaConfiguration; -import org.apache.archiva.configuration.ManagedRepositoryConfiguration; -import org.apache.archiva.configuration.NetworkProxyConfiguration; -import org.apache.archiva.configuration.ProxyConnectorConfiguration; -import org.apache.archiva.configuration.RemoteRepositoryConfiguration; import org.apache.archiva.xml.XMLException; import org.apache.maven.model.CiManagement; import org.apache.maven.model.Dependency; @@ -52,11 +56,13 @@ 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; +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import javax.inject.Named; import java.io.File; import java.io.FileNotFoundException; import java.io.FilenameFilter; @@ -69,9 +75,6 @@ import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; -import javax.annotation.PostConstruct; -import javax.inject.Inject; -import javax.inject.Named; /** * Maven 2 repository format storage implementation. This class currently takes parameters to indicate the repository to @@ -96,8 +99,16 @@ public class Maven2RepositoryStorage * */ @Inject - @Named( value = "archivaConfiguration#default" ) - private ArchivaConfiguration archivaConfiguration; + private RemoteRepositoryAdmin remoteRepositoryAdmin; + + @Inject + private ManagedRepositoryAdmin managedRepositoryAdmin; + + @Inject + private ProxyConnectorAdmin proxyConnectorAdmin; + + @Inject + private NetworkProxyAdmin networkProxyAdmin; /** * @@ -129,10 +140,11 @@ public class Maven2RepositoryStorage public ProjectVersionMetadata readProjectVersionMetadata( String repoId, String namespace, String projectId, String projectVersion ) - throws RepositoryStorageMetadataNotFoundException, RepositoryStorageMetadataInvalidException + throws RepositoryStorageMetadataNotFoundException, RepositoryStorageMetadataInvalidException, + RepositoryAdminException { - ManagedRepositoryConfiguration repositoryConfiguration = - archivaConfiguration.getConfiguration().findManagedRepositoryById( repoId ); + + ManagedRepository repositoryConfiguration = managedRepositoryAdmin.getManagedRepository( repoId ); String artifactVersion = projectVersion; @@ -175,36 +187,28 @@ public class Maven2RepositoryStorage // TODO: this is a workaround until we can properly resolve using proxies as well - this doesn't cache // anything locally! - List remoteRepositories = new ArrayList(); - Map networkProxies = new HashMap(); + List remoteRepositories = new ArrayList(); + Map networkProxies = new HashMap(); - Map> proxyConnectorsMap = archivaConfiguration.getConfiguration().getProxyConnectorAsMap(); - List proxyConnectors = proxyConnectorsMap.get( repoId ); - if( proxyConnectors != null ) + Map> proxyConnectorsMap = proxyConnectorAdmin.getProxyConnectorAsMap(); + List proxyConnectors = proxyConnectorsMap.get( repoId ); + if ( proxyConnectors != null ) { - for( ProxyConnectorConfiguration proxyConnector : proxyConnectors ) + for ( ProxyConnector proxyConnector : proxyConnectors ) { - RemoteRepositoryConfiguration remoteRepoConfig = archivaConfiguration.getConfiguration().findRemoteRepositoryById( - proxyConnector.getTargetRepoId() ); + RemoteRepository remoteRepoConfig = + remoteRepositoryAdmin.getRemoteRepository( proxyConnector.getTargetRepoId() ); - if( remoteRepoConfig != null ) + if ( remoteRepoConfig != null ) { remoteRepositories.add( remoteRepoConfig ); - NetworkProxyConfiguration networkProxyConfig = archivaConfiguration.getConfiguration().getNetworkProxiesAsMap().get( - proxyConnector.getProxyId() ); + NetworkProxy networkProxyConfig = networkProxyAdmin.getNetworkProxy( proxyConnector.getProxyId() ); - if( networkProxyConfig != null ) + 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 ); + networkProxies.put( proxyConnector.getTargetRepoId(), networkProxyConfig ); } } } @@ -215,8 +219,9 @@ public class Maven2RepositoryStorage req.setPomFile( file ); // MRM-1411 - req.setModelResolver( new RepositoryModelResolver( basedir, pathTranslator, wagonFactory, remoteRepositories, - networkProxies, repositoryConfiguration ) ); + req.setModelResolver( + new RepositoryModelResolver( basedir, pathTranslator, wagonFactory, remoteRepositories, networkProxies, + repositoryConfiguration ) ); req.setValidationLevel( ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL ); Model model; @@ -229,15 +234,15 @@ public class Maven2RepositoryStorage String msg = "The artifact's POM file '" + file + "' was invalid: " + e.getMessage(); List modelProblems = e.getProblems(); - for( ModelProblem problem : modelProblems ) + 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 && + 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.." ); + "Using defaults for project version metadata.." ); ProjectVersionMetadata metadata = new ProjectVersionMetadata(); metadata.setId( projectVersion ); @@ -248,7 +253,8 @@ public class Maven2RepositoryStorage facet.setPackaging( "jar" ); metadata.addFacet( facet ); - String errMsg = "Error in resolving artifact's parent POM file. " + problem.getException().getMessage(); + String errMsg = + "Error in resolving artifact's parent POM file. " + problem.getException().getMessage(); RepositoryProblemFacet repoProblemFacet = new RepositoryProblemFacet(); repoProblemFacet.setRepositoryId( repoId ); repoProblemFacet.setId( repoId ); @@ -257,9 +263,9 @@ public class Maven2RepositoryStorage repoProblemFacet.setProject( projectId ); repoProblemFacet.setVersion( projectVersion ); repoProblemFacet.setNamespace( namespace ); - + metadata.addFacet( repoProblemFacet ); - + return metadata; } } @@ -318,6 +324,7 @@ public class Maven2RepositoryStorage metadata.addFacet( facet ); return metadata; + } public void setWagonFactory( WagonFactory wagonFactory ) @@ -428,6 +435,7 @@ public class Maven2RepositoryStorage } public Collection listRootNamespaces( String repoId, Filter filter ) + throws RepositoryAdminException { File dir = getRepositoryBasedir( repoId ); @@ -451,14 +459,15 @@ public class Maven2RepositoryStorage } private File getRepositoryBasedir( String repoId ) + throws RepositoryAdminException { - ManagedRepositoryConfiguration repositoryConfiguration = - archivaConfiguration.getConfiguration().findManagedRepositoryById( repoId ); + ManagedRepository repositoryConfiguration = managedRepositoryAdmin.getManagedRepository( repoId ); return new File( repositoryConfiguration.getLocation() ); } public Collection listNamespaces( String repoId, String namespace, Filter filter ) + throws RepositoryAdminException { File dir = pathTranslator.toFile( getRepositoryBasedir( repoId ), namespace ); @@ -480,6 +489,7 @@ public class Maven2RepositoryStorage } public Collection listProjects( String repoId, String namespace, Filter filter ) + throws RepositoryAdminException { File dir = pathTranslator.toFile( getRepositoryBasedir( repoId ), namespace ); @@ -502,6 +512,7 @@ public class Maven2RepositoryStorage public Collection listProjectVersions( String repoId, String namespace, String projectId, Filter filter ) + throws RepositoryAdminException { File dir = pathTranslator.toFile( getRepositoryBasedir( repoId ), namespace, projectId ); @@ -511,6 +522,7 @@ public class Maven2RepositoryStorage public Collection readArtifactsMetadata( String repoId, String namespace, String projectId, String projectVersion, Filter filter ) + throws RepositoryAdminException { File dir = pathTranslator.toFile( getRepositoryBasedir( repoId ), namespace, projectId, projectVersion ); @@ -530,6 +542,7 @@ public class Maven2RepositoryStorage } public ArtifactMetadata readArtifactMetadataFromPath( String repoId, String path ) + throws RepositoryAdminException { ArtifactMetadata metadata = pathTranslator.getArtifactForPath( repoId, path ); diff --git a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/RepositoryModelResolver.java b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/RepositoryModelResolver.java index f2138237f..e1057bfb8 100644 --- a/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/RepositoryModelResolver.java +++ b/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/RepositoryModelResolver.java @@ -19,8 +19,10 @@ package org.apache.archiva.metadata.repository.storage.maven2; * under the License. */ +import org.apache.archiva.admin.model.beans.ManagedRepository; +import org.apache.archiva.admin.model.beans.NetworkProxy; +import org.apache.archiva.admin.model.beans.RemoteRepository; import org.apache.archiva.common.utils.VersionUtil; -import org.apache.archiva.configuration.ManagedRepositoryConfiguration; import org.apache.archiva.configuration.RemoteRepositoryConfiguration; import org.apache.archiva.metadata.repository.storage.RepositoryPathTranslator; import org.apache.archiva.proxy.common.WagonFactory; @@ -59,16 +61,16 @@ public class RepositoryModelResolver private WagonFactory wagonFactory; - private List remoteRepositories; + private List remoteRepositories; - private ManagedRepositoryConfiguration targetRepository; + private ManagedRepository targetRepository; private static final Logger log = LoggerFactory.getLogger( RepositoryModelResolver.class ); private static final String METADATA_FILENAME = "maven-metadata.xml"; // key/value: remote repo ID/network proxy - Map networkProxyMap; + Map networkProxyMap; public RepositoryModelResolver( File basedir, RepositoryPathTranslator pathTranslator ) { @@ -78,9 +80,8 @@ public class RepositoryModelResolver } public RepositoryModelResolver( File basedir, RepositoryPathTranslator pathTranslator, WagonFactory wagonFactory, - List remoteRepositories, - Map networkProxiesMap, - ManagedRepositoryConfiguration targetRepository ) + List remoteRepositories, + Map networkProxiesMap, ManagedRepository targetRepository ) { this( basedir, pathTranslator ); @@ -103,7 +104,7 @@ public class RepositoryModelResolver if ( !model.exists() ) { - for ( RemoteRepositoryConfiguration remoteRepository : remoteRepositories ) + for ( RemoteRepository remoteRepository : remoteRepositories ) { try { @@ -143,8 +144,8 @@ public class RepositoryModelResolver // FIXME: 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 ) + private boolean getModelFromProxy( RemoteRepository remoteRepository, String groupId, String artifactId, + String version, String filename ) throws AuthorizationException, TransferFailedException, ResourceDoesNotExistException, WagonFactoryException, XMLException { @@ -162,7 +163,10 @@ public class RepositoryModelResolver try { String protocol = getProtocol( remoteRepository.getUrl() ); + final NetworkProxy networkProxy = this.networkProxyMap.get( remoteRepository.getId() ); + wagon = ( networkProxy != null && networkProxy.isUseNtlm() ) ? wagonFactory.getWagon( + "wagon#" + protocol + "-ntlm" ) : wagonFactory.getWagon( "wagon#" + protocol ); wagon = wagonFactory.getWagon( "wagon#" + protocol ); if ( wagon == null ) { @@ -261,15 +265,21 @@ public class RepositoryModelResolver * @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 ) + private boolean connectToRepository( Wagon wagon, RemoteRepository remoteRepository ) { boolean connected; - final ProxyInfo networkProxy; - networkProxy = this.networkProxyMap.get( remoteRepository.getId() ); - - if ( networkProxy != null ) + final NetworkProxy proxyConnector = this.networkProxyMap.get( remoteRepository.getId() ); + ProxyInfo networkProxy = null; + if ( proxyConnector != null ) { + networkProxy = new ProxyInfo(); + networkProxy.setType( proxyConnector.getProtocol() ); + networkProxy.setHost( proxyConnector.getHost() ); + networkProxy.setPort( proxyConnector.getPort() ); + networkProxy.setUserName( proxyConnector.getUsername() ); + networkProxy.setPassword( proxyConnector.getPassword() ); + String msg = "Using network proxy " + networkProxy.getHost() + ":" + networkProxy.getPort() + " to connect to remote repository " + remoteRepository.getUrl(); if ( networkProxy.getNonProxyHosts() != null ) @@ -286,7 +296,7 @@ public class RepositoryModelResolver } AuthenticationInfo authInfo = null; - String username = remoteRepository.getUsername(); + String username = remoteRepository.getUserName(); String password = remoteRepository.getPassword(); if ( StringUtils.isNotBlank( username ) && StringUtils.isNotBlank( password ) ) @@ -307,7 +317,14 @@ public class RepositoryModelResolver { org.apache.maven.wagon.repository.Repository wagonRepository = new org.apache.maven.wagon.repository.Repository( remoteRepository.getId(), remoteRepository.getUrl() ); - wagon.connect( wagonRepository, authInfo, networkProxy ); + if ( networkProxy != null ) + { + wagon.connect( wagonRepository, authInfo, networkProxy ); + } + else + { + wagon.connect( wagonRepository, authInfo ); + } connected = true; } catch ( ConnectionException e ) @@ -324,8 +341,8 @@ public class RepositoryModelResolver return connected; } - private File transferChecksum( Wagon wagon, RemoteRepositoryConfiguration remoteRepository, String remotePath, - File resource, File tmpDirectory, String ext ) + private File transferChecksum( Wagon wagon, RemoteRepository remoteRepository, String remotePath, File resource, + File tmpDirectory, String ext ) throws AuthorizationException, TransferFailedException, ResourceDoesNotExistException { File destFile = new File( tmpDirectory, resource.getName() + ext ); diff --git a/pom.xml b/pom.xml index 352ebaef5..1e99f7fbe 100644 --- a/pom.xml +++ b/pom.xml @@ -1109,6 +1109,11 @@ wagon-file ${wagon.version} + + org.apache.maven.wagon + wagon-http-lightweight + ${wagon.version} + org.apache.maven.wagon wagon-http -- 2.39.5