From d9e4b87d608b07d5f74b58f19cc74d8540a5e2af Mon Sep 17 00:00:00 2001 From: Joakim Erdfelt Date: Fri, 20 Apr 2007 20:55:14 +0000 Subject: [PATCH] Adding VersionedReference metadata to .fetchFromProxies() git-svn-id: https://svn.apache.org/repos/asf/maven/archiva/branches/archiva-jpox-database-refactor@530916 13f79535-47bb-0310-9956-ffa450edef68 --- .../DefaultRepositoryProxyConnectors.java | 60 +++++++++++++- .../proxy/RepositoryProxyConnectors.java | 16 ++++ .../web/repository/ProxiedDavServer.java | 81 ++++++++++--------- 3 files changed, 113 insertions(+), 44 deletions(-) diff --git a/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java b/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java index ed85005a8..a2521ef37 100644 --- a/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java +++ b/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java @@ -27,6 +27,7 @@ import org.apache.maven.archiva.configuration.RepositoryConfiguration; import org.apache.maven.archiva.model.ArchivaRepository; import org.apache.maven.archiva.model.ArtifactReference; import org.apache.maven.archiva.model.ProjectReference; +import org.apache.maven.archiva.model.VersionedReference; import org.apache.maven.archiva.policies.DownloadPolicy; import org.apache.maven.archiva.policies.urlcache.UrlFailureCache; import org.apache.maven.archiva.repository.layout.BidirectionalRepositoryLayout; @@ -70,8 +71,6 @@ public class DefaultRepositoryProxyConnectors extends AbstractLogEnabled implements RepositoryProxyConnectors, RegistryListener, Initializable { - private static final String FILENAME_MAVEN_METADATA = "maven-metadata.xml"; - /** * @plexus.requirement */ @@ -166,6 +165,59 @@ public class DefaultRepositoryProxyConnectors return null; } + + public File fetchFromProxies( ArchivaRepository repository, VersionedReference metadata ) + throws ProxyException + { + if ( !repository.isManaged() ) + { + throw new ProxyException( "Can only proxy managed repositories." ); + } + + File localFile; + try + { + BidirectionalRepositoryLayout sourceLayout = layoutFactory.getLayout( repository.getLayoutType() ); + String sourcePath = sourceLayout.toPath( metadata ); + localFile = new File( repository.getUrl().getPath(), sourcePath ); + } + catch ( LayoutException e ) + { + throw new ProxyException( "Unable to proxy due to bad source repository layout definition: " + + e.getMessage(), e ); + } + + Properties requestProperties = new Properties(); + + List connectors = getProxyConnectors( repository ); + Iterator it = connectors.iterator(); + while ( it.hasNext() ) + { + ProxyConnector connector = (ProxyConnector) it.next(); + ArchivaRepository targetRepository = connector.getTargetRepository(); + try + { + BidirectionalRepositoryLayout targetLayout = layoutFactory.getLayout( targetRepository.getLayoutType() ); + String targetPath = targetLayout.toPath( metadata ); + + File downloadedFile = transferFile( connector, targetRepository, targetPath, localFile, + requestProperties ); + + if ( fileExists( downloadedFile ) ) + { + getLogger().info( "Successfully transfered: " + downloadedFile.getAbsolutePath() ); + return downloadedFile; + } + } + catch ( LayoutException e ) + { + getLogger().error( "Unable to proxy due to bad layout definition: " + e.getMessage(), e ); + return null; + } + } + + return null; + } public File fetchFromProxies( ArchivaRepository repository, ProjectReference metadata ) throws ProxyException @@ -179,7 +231,7 @@ public class DefaultRepositoryProxyConnectors try { BidirectionalRepositoryLayout sourceLayout = layoutFactory.getLayout( repository.getLayoutType() ); - String sourcePath = sourceLayout.toPath( metadata ) + FILENAME_MAVEN_METADATA; + String sourcePath = sourceLayout.toPath( metadata ); localFile = new File( repository.getUrl().getPath(), sourcePath ); } catch ( LayoutException e ) @@ -199,7 +251,7 @@ public class DefaultRepositoryProxyConnectors try { BidirectionalRepositoryLayout targetLayout = layoutFactory.getLayout( targetRepository.getLayoutType() ); - String targetPath = targetLayout.toPath( metadata ) + FILENAME_MAVEN_METADATA; + String targetPath = targetLayout.toPath( metadata ); File downloadedFile = transferFile( connector, targetRepository, targetPath, localFile, requestProperties ); diff --git a/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/RepositoryProxyConnectors.java b/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/RepositoryProxyConnectors.java index 622360754..182b219ed 100644 --- a/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/RepositoryProxyConnectors.java +++ b/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/RepositoryProxyConnectors.java @@ -22,6 +22,7 @@ package org.apache.maven.archiva.proxy; import org.apache.maven.archiva.model.ArchivaRepository; import org.apache.maven.archiva.model.ArtifactReference; import org.apache.maven.archiva.model.ProjectReference; +import org.apache.maven.archiva.model.VersionedReference; import java.io.File; import java.util.List; @@ -49,6 +50,21 @@ public interface RepositoryProxyConnectors public File fetchFromProxies( ArchivaRepository repository, ArtifactReference artifact ) throws ProxyException; + /** + * Performs the metadata fetch operation against the target repositories + * of the provided source repository. + * + * If the metadata is found, it is downloaded and placed into the source repository + * filesystem. + * + * @param repository the source repository to use. (must be a managed repository) + * @param metadata the metadata to fetch. + * @return true if the fetch operation succeeded in obtaining content, false if no content was obtained. + * @throws ProxyException if there was a problem fetching the content from the target repositories. + */ + public File fetchFromProxies( ArchivaRepository repository, VersionedReference metadata ) + throws ProxyException; + /** * Performs the metadata fetch operation against the target repositories * of the provided source repository. diff --git a/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/repository/ProxiedDavServer.java b/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/repository/ProxiedDavServer.java index c3e4bfc32..b25daef6a 100644 --- a/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/repository/ProxiedDavServer.java +++ b/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/repository/ProxiedDavServer.java @@ -19,25 +19,19 @@ package org.apache.maven.archiva.web.repository; * under the License. */ -import org.apache.commons.lang.StringUtils; import org.apache.maven.archiva.configuration.ArchivaConfiguration; import org.apache.maven.archiva.configuration.Configuration; import org.apache.maven.archiva.configuration.RepositoryConfiguration; -import org.apache.maven.archiva.model.ArchivaArtifact; import org.apache.maven.archiva.model.ArchivaRepository; -import org.apache.maven.archiva.model.ArchivaRepositoryMetadata; import org.apache.maven.archiva.model.ArtifactReference; import org.apache.maven.archiva.model.ProjectReference; import org.apache.maven.archiva.model.VersionedReference; -import org.apache.maven.archiva.proxy.ProxyConnector; import org.apache.maven.archiva.proxy.ProxyException; import org.apache.maven.archiva.proxy.RepositoryProxyConnectors; import org.apache.maven.archiva.repository.ArchivaConfigurationAdaptor; import org.apache.maven.archiva.repository.layout.BidirectionalRepositoryLayout; import org.apache.maven.archiva.repository.layout.BidirectionalRepositoryLayoutFactory; import org.apache.maven.archiva.repository.layout.LayoutException; -import org.apache.maven.wagon.ResourceDoesNotExistException; -import org.apache.maven.wagon.proxy.ProxyInfo; import org.codehaus.plexus.webdav.AbstractDavServerComponent; import org.codehaus.plexus.webdav.DavServerComponent; import org.codehaus.plexus.webdav.DavServerException; @@ -46,10 +40,6 @@ import org.codehaus.plexus.webdav.util.WebdavMethodUtil; import java.io.File; import java.io.IOException; -import java.lang.reflect.Proxy; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; import javax.servlet.ServletConfig; import javax.servlet.ServletException; @@ -61,8 +51,8 @@ import javax.servlet.http.HttpServletResponse; * @author Joakim Erdfelt * @version $Id$ * @plexus.component role="org.codehaus.plexus.webdav.DavServerComponent" - * role-hint="proxied" - * instantiation-strategy="per-lookup" + * role-hint="proxied" + * instantiation-strategy="per-lookup" */ public class ProxiedDavServer extends AbstractDavServerComponent @@ -93,8 +83,6 @@ public class ProxiedDavServer private ArchivaRepository managedRepository; - private List/**/proxiedRepositories; - public String getPrefix() { return davServer.getPrefix(); @@ -120,8 +108,6 @@ public class ProxiedDavServer { davServer.init( servletConfig ); - proxiedRepositories = new ArrayList(); - Configuration config = archivaConfiguration.getConfiguration(); repositoryConfiguration = config.findRepositoryById( getPrefix() ); @@ -156,45 +142,60 @@ public class ProxiedDavServer throws ServletException { String resource = request.getLogicalResource(); - - if( resource.endsWith( ".sha1" ) || - resource.endsWith( ".md5") ) + + if ( resource.endsWith( ".sha1" ) || resource.endsWith( ".md5" ) ) { // Checksums are fetched with artifact / metadata. return; } - + try { ProjectReference project; VersionedReference versioned; ArtifactReference artifact; - - artifact = layout.toArtifactReference( resource ); - if( artifact != null ) + + try { - connectors.fetchFromProxies( managedRepository, artifact ); - return; + artifact = layout.toArtifactReference( resource ); + if ( artifact != null ) + { + connectors.fetchFromProxies( managedRepository, artifact ); + return; + } } - - versioned = layout.toVersionedReference( resource ); - if( versioned != null ) + catch ( LayoutException e ) { - connectors.fetchFromProxies( managedRepository, versioned ); - return; + /* eat it */ } - - project = layout.toProjectReference( resource ); - if( project != null ) + + try { - connectors.fetchFromProxies( managedRepository, project ); - return; + versioned = layout.toVersionedReference( resource ); + if ( versioned != null ) + { + connectors.fetchFromProxies( managedRepository, versioned ); + return; + } + } + catch ( LayoutException e ) + { + /* eat it */ + } + + try + { + project = layout.toProjectReference( resource ); + if ( project != null ) + { + connectors.fetchFromProxies( managedRepository, project ); + return; + } + } + catch ( LayoutException e ) + { + /* eat it */ } - } - catch ( ResourceDoesNotExistException e ) - { - // return an HTTP 404 instead of HTTP 500 error. - return; } catch ( ProxyException e ) { -- 2.39.5