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 Wagon getWagon( String protocol ) { 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 @@ */ 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 File fetchFromProxies( ManagedRepositoryContent repository, ArtifactRefer 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 File fetchFromProxies( ManagedRepositoryContent repository, String path ) + 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 File fetchMetatadaFromProxies( ManagedRepositoryContent repository, Strin + ", 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 @@ private boolean fileExists( File file ) 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 @@ private File transferFile( ProxyConnector connector, RemoteRepositoryContent rem { 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 @@ private void validatePolicies( Map policies, M 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 void run() 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 @@ * 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.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 ProjectVersionMetadata resolveProjectVersion( RepositorySession session, { 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 ProjectVersionMetadata resolveProjectVersion( RepositorySession session, } 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 @@ * 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 @@ * 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.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.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.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 void buildDependencyTree( List repositoryIds, String groupId, Str 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 void buildDependencyTree( List repositoryIds, String groupId, Str // 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 void buildDependencyTree( List repositoryIds, String groupId, Str { 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 @@ private ManagedRepositoryConfiguration findArtifactInRepositories( List if ( file.exists() ) { - return repositoryConfiguration; + return managedRepository; } } return null; @@ -464,15 +476,23 @@ public ResolutionGroup retrieve( Artifact artifact, ArtifactRepository localRepo 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 ResolutionGroup retrieve( Artifact artifact, ArtifactRepository localRepo { throw new ArtifactMetadataRetrievalException( e.getMessage(), e, artifact ); } + } ResolutionGroup result; @@ -496,7 +517,8 @@ public ResolutionGroup retrieve( Artifact artifact, ArtifactRepository localRepo // 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 ArtifactFactory getFactory() { 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 @@ * 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.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.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.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 ProjectMetadata readProjectMetadata( String repoId, String namespace, Str 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 ProjectVersionMetadata readProjectVersionMetadata( String repoId, String // 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 ProjectVersionMetadata readProjectVersionMetadata( String repoId, String 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 ProjectVersionMetadata readProjectVersionMetadata( String repoId, String 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 ProjectVersionMetadata readProjectVersionMetadata( String repoId, String 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 ProjectVersionMetadata readProjectVersionMetadata( String repoId, String repoProblemFacet.setProject( projectId ); repoProblemFacet.setVersion( projectVersion ); repoProblemFacet.setNamespace( namespace ); - + metadata.addFacet( repoProblemFacet ); - + return metadata; } } @@ -318,6 +324,7 @@ public ProjectVersionMetadata readProjectVersionMetadata( String repoId, String metadata.addFacet( facet ); return metadata; + } public void setWagonFactory( WagonFactory wagonFactory ) @@ -428,6 +435,7 @@ private org.apache.archiva.metadata.model.CiManagement convertCiManagement( CiMa } public Collection listRootNamespaces( String repoId, Filter filter ) + throws RepositoryAdminException { File dir = getRepositoryBasedir( repoId ); @@ -451,14 +459,15 @@ private static Collection getSortedFiles( File dir, Filter filte } 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 Collection listNamespaces( String repoId, String namespace, Filte } public Collection listProjects( String repoId, String namespace, Filter filter ) + throws RepositoryAdminException { File dir = pathTranslator.toFile( getRepositoryBasedir( repoId ), namespace ); @@ -502,6 +512,7 @@ public Collection listProjects( String repoId, String namespace, Filter< 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 Collection listProjectVersions( String repoId, String namespace, 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 Collection readArtifactsMetadata( String repoId, String } 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 @@ * 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 RepositoryModelResolver( File basedir, RepositoryPathTranslator pathTrans } 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 ModelSource resolveModel( String groupId, String artifactId, String versi if ( !model.exists() ) { - for ( RemoteRepositoryConfiguration remoteRepository : remoteRepositories ) + for ( RemoteRepository remoteRepository : remoteRepositories ) { try { @@ -143,8 +144,8 @@ public ModelResolver newCopy() // 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 @@ private boolean getModelFromProxy( RemoteRepositoryConfiguration remoteRepositor 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 @@ private boolean getModelFromProxy( RemoteRepositoryConfiguration remoteRepositor * @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 @@ private boolean connectToRepository( Wagon wagon, RemoteRepositoryConfiguration } 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 @@ private boolean connectToRepository( Wagon wagon, RemoteRepositoryConfiguration { 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 @@ private boolean connectToRepository( Wagon wagon, RemoteRepositoryConfiguration 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