diff options
author | Olivier Lamy <olamy@apache.org> | 2012-02-04 22:08:28 +0000 |
---|---|---|
committer | Olivier Lamy <olamy@apache.org> | 2012-02-04 22:08:28 +0000 |
commit | 5d6774f5f2560c02911c6e9846eccd08a12b86a8 (patch) | |
tree | 37f8fddca14439a8eba47861d6d5b65e32779ff6 /archiva-modules | |
parent | e258bfb349b02210a7de84821c798fa1fb75c5d8 (diff) | |
download | archiva-5d6774f5f2560c02911c6e9846eccd08a12b86a8.tar.gz archiva-5d6774f5f2560c02911c6e9846eccd08a12b86a8.zip |
[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
Diffstat (limited to 'archiva-modules')
12 files changed, 248 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 @@ -43,6 +43,11 @@ </dependency> <dependency> <groupId>org.apache.maven.wagon</groupId> + <artifactId>wagon-http-lightweight</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.apache.maven.wagon</groupId> <artifactId>wagon-http</artifactId> <scope>test</scope> <exclusions> 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 <code>wagon#</code>, for example - * <code>wagon#http</code>. + * <code>wagon#http</code>. <b>to have a wagon supporting ntlm add -ntlm</b> * @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 @@ <bean name="wagon#https" scope="prototype" class="org.apache.maven.wagon.providers.http.HttpWagon"/> + <bean name="wagon#http-ntlm" scope="prototype" class="org.apache.maven.wagon.providers.http.LightweightHttpWagon"/> + + <bean name="wagon#https-ntlm" scope="prototype" class="org.apache.maven.wagon.providers.http.LightweightHttpsWagon"/> + </beans>
\ 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<String, DownloadErrorPolicy> policies, Map<String, String> settings, Properties request, ArtifactReference artifact, RemoteRepositoryContent content, - File localFile, ProxyException exception, Map<String, Exception> previousExceptions ) + File localFile, Exception exception, Map<String, Exception> 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 @@ -45,6 +45,10 @@ <artifactId>metadata-model</artifactId> </dependency> <dependency> + <groupId>org.apache.archiva</groupId> + <artifactId>archiva-repository-admin-api</artifactId> + </dependency> + <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <scope>test</scope> 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<String> listRootNamespaces( String repoId, Filter<String> filter ); + Collection<String> listRootNamespaces( String repoId, Filter<String> filter ) + throws RepositoryAdminException; - Collection<String> listNamespaces( String repoId, String namespace, Filter<String> filter ); + Collection<String> listNamespaces( String repoId, String namespace, Filter<String> filter ) + throws RepositoryAdminException; - Collection<String> listProjects( String repoId, String namespace, Filter<String> filter ); + Collection<String> listProjects( String repoId, String namespace, Filter<String> filter ) + throws RepositoryAdminException; - Collection<String> listProjectVersions( String repoId, String namespace, String projectId, Filter<String> filter ); + Collection<String> listProjectVersions( String repoId, String namespace, String projectId, Filter<String> filter ) + throws RepositoryAdminException; Collection<ArtifactMetadata> readArtifactsMetadata( String repoId, String namespace, String projectId, - String projectVersion, Filter<String> filter ); + String projectVersion, Filter<String> 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 <code>DependencyTreeBuilder</code>. 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<RemoteRepositoryConfiguration>(); - Map<String, ProxyInfo > networkProxies = new HashMap<String, ProxyInfo>(); + List<RemoteRepository> remoteRepositories = new ArrayList<RemoteRepository>(); + Map<String, NetworkProxy> networkProxies = new HashMap<String, NetworkProxy>(); - Map<String, List< ProxyConnectorConfiguration >> proxyConnectorsMap = archivaConfiguration.getConfiguration().getProxyConnectorAsMap(); - List<ProxyConnectorConfiguration> proxyConnectors = proxyConnectorsMap.get( repository.getId() ); - if( proxyConnectors != null ) + Map<String, List<ProxyConnector>> proxyConnectorsMap = proxyConnectorAdmin.getProxyConnectorAsMap(); + List<ProxyConnector> 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<String> repositoryIds, Artifact projectArtifact ) + private ManagedRepository findArtifactInRepositories( List<String> 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.<Artifact>emptySet(), Collections.<ArtifactRepository>emptyList() ); + result = new ResolutionGroup( pomArtifact, Collections.<Artifact>emptySet(), + Collections.<ArtifactRepository>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<RemoteRepositoryConfiguration> remoteRepositories = new ArrayList<RemoteRepositoryConfiguration>(); - Map<String, ProxyInfo> networkProxies = new HashMap<String, ProxyInfo>(); + List<RemoteRepository> remoteRepositories = new ArrayList<RemoteRepository>(); + Map<String, NetworkProxy> networkProxies = new HashMap<String, NetworkProxy>(); - Map<String, List<ProxyConnectorConfiguration>> proxyConnectorsMap = archivaConfiguration.getConfiguration().getProxyConnectorAsMap(); - List<ProxyConnectorConfiguration> proxyConnectors = proxyConnectorsMap.get( repoId ); - if( proxyConnectors != null ) + Map<String, List<ProxyConnector>> proxyConnectorsMap = proxyConnectorAdmin.getProxyConnectorAsMap(); + List<ProxyConnector> 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<ModelProblem> 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<String> listRootNamespaces( String repoId, Filter<String> 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<String> listNamespaces( String repoId, String namespace, Filter<String> filter ) + throws RepositoryAdminException { File dir = pathTranslator.toFile( getRepositoryBasedir( repoId ), namespace ); @@ -480,6 +489,7 @@ public class Maven2RepositoryStorage } public Collection<String> listProjects( String repoId, String namespace, Filter<String> filter ) + throws RepositoryAdminException { File dir = pathTranslator.toFile( getRepositoryBasedir( repoId ), namespace ); @@ -502,6 +512,7 @@ public class Maven2RepositoryStorage public Collection<String> listProjectVersions( String repoId, String namespace, String projectId, Filter<String> filter ) + throws RepositoryAdminException { File dir = pathTranslator.toFile( getRepositoryBasedir( repoId ), namespace, projectId ); @@ -511,6 +522,7 @@ public class Maven2RepositoryStorage public Collection<ArtifactMetadata> readArtifactsMetadata( String repoId, String namespace, String projectId, String projectVersion, Filter<String> 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<RemoteRepositoryConfiguration> remoteRepositories; + private List<RemoteRepository> 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<String, ProxyInfo> networkProxyMap; + Map<String, NetworkProxy> networkProxyMap; public RepositoryModelResolver( File basedir, RepositoryPathTranslator pathTranslator ) { @@ -78,9 +80,8 @@ public class RepositoryModelResolver } public RepositoryModelResolver( File basedir, RepositoryPathTranslator pathTranslator, WagonFactory wagonFactory, - List<RemoteRepositoryConfiguration> remoteRepositories, - Map<String, ProxyInfo> networkProxiesMap, - ManagedRepositoryConfiguration targetRepository ) + List<RemoteRepository> remoteRepositories, + Map<String, NetworkProxy> 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 ); |