From 954be952d0ab8e1ec5ef5f7b07f382866b2a42b4 Mon Sep 17 00:00:00 2001 From: "Maria Odea B. Ching" Date: Sun, 16 Sep 2007 05:18:18 +0000 Subject: [PATCH] [MRM-153] Submitted by: nicolas de loof - Added method in ProxiedDavServer that allows to get a relocated artifact (either client-side relocation or server-side relocation) git-svn-id: https://svn.apache.org/repos/asf/maven/archiva/trunk@576032 13f79535-47bb-0310-9956-ffa450edef68 --- .../web/repository/ProxiedDavServer.java | 94 +++++++++++++++++-- 1 file changed, 85 insertions(+), 9 deletions(-) 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 d2314411c..b0ad729c7 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 @@ -34,6 +34,11 @@ import org.apache.maven.archiva.repository.layout.BidirectionalRepositoryLayoutF import org.apache.maven.archiva.repository.layout.LayoutException; import org.apache.maven.archiva.repository.metadata.MetadataTools; import org.apache.maven.archiva.repository.metadata.RepositoryMetadataException; +import org.apache.maven.model.DistributionManagement; +import org.apache.maven.model.Model; +import org.apache.maven.model.Relocation; +import org.apache.maven.model.io.xpp3.MavenXpp3Reader; +import org.apache.maven.wagon.ResourceDoesNotExistException; import org.codehaus.plexus.webdav.AbstractDavServerComponent; import org.codehaus.plexus.webdav.DavServerComponent; import org.codehaus.plexus.webdav.DavServerException; @@ -44,6 +49,8 @@ import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServletResponse; import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; import java.io.IOException; /** @@ -52,8 +59,7 @@ import java.io.IOException; * @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 @@ -118,7 +124,8 @@ public class ProxiedDavServer repositoryConfiguration = config.findManagedRepositoryById( getPrefix() ); - managedRepository = ArchivaConfigurationAdaptor.toArchivaRepository( repositoryConfiguration ); + managedRepository = + ArchivaConfigurationAdaptor.toArchivaRepository( repositoryConfiguration ); try { @@ -135,16 +142,18 @@ public class ProxiedDavServer { if ( WebdavMethodUtil.isReadMethod( request.getRequest().getMethod() ) ) { - if ( !hasResource( request.getLogicalResource() ) ) - { - fetchContentFromProxies( request ); - } + // if ( !hasResource( request.getLogicalResource() ) ) + // { + fetchContentFromProxies( request ); + // } } else { // Create parent directories that don't exist when writing a file - // This actually makes this implementation not compliant to the WebDAV RFC - but we have enough knowledge - // about how the collection is being used to do this reasonably and some versions of Maven's WebDAV don't + // This actually makes this implementation not compliant to the + // WebDAV RFC - but we have enough knowledge + // about how the collection is being used to do this reasonably and + // some versions of Maven's WebDAV don't // correctly create the collections themselves. File rootDirectory = getRootDirectory(); if ( rootDirectory != null ) @@ -231,6 +240,8 @@ public class ProxiedDavServer artifact = resourceLayout.toArtifactReference( resource ); if ( artifact != null ) { + applyServerSideRelocation( artifact ); + connectors.fetchFromProxies( managedRepository, artifact ); request.getRequest().setPathInfo( layout.toPath( artifact ) ); return; @@ -246,6 +257,71 @@ public class ProxiedDavServer } } + /** + * A relocation capable client will request the POM prior to the artifact, + * and will then read meta-data and do client side relocation. A simplier + * client (like maven 1) will only request the artifact and not use the + * metadatas. + *

+ * For such clients, archiva does server-side relocation by reading itself + * the <relocation> element in metadatas and serving the expected + * artifact. + */ + protected void applyServerSideRelocation( ArtifactReference artifact ) + throws ProxyException + { + if ( "pom".equals( artifact.getType() ) ) + { + return; + } + + // Build the artifact POM reference + ArtifactReference pomReference = new ArtifactReference(); + pomReference.setGroupId( artifact.getGroupId() ); + pomReference.setArtifactId( artifact.getArtifactId() ); + pomReference.setVersion( artifact.getVersion() ); + pomReference.setType( "pom" ); + + // Get the artifact POM from proxied repositories if needed + connectors.fetchFromProxies( managedRepository, pomReference ); + + // Open and read the POM from the managed repo + File pom = new File( getRootDirectory(), layout.toPath( pomReference ) ); + try + { + Model model = new MavenXpp3Reader().read( new FileReader( pom ) ); + DistributionManagement dist = model.getDistributionManagement(); + if ( dist != null ) + { + Relocation relocation = dist.getRelocation(); + if ( relocation != null ) + { + // artifact is relocated : update the repositoryPath + if ( relocation.getGroupId() != null ) + { + artifact.setGroupId( relocation.getGroupId() ); + } + if ( relocation.getArtifactId() != null ) + { + artifact.setArtifactId( relocation.getArtifactId() ); + } + if ( relocation.getVersion() != null ) + { + artifact.setVersion( relocation.getVersion() ); + } + } + } + } + catch ( FileNotFoundException e ) + { + // Artifact has no POM in repo : ignore + } + catch ( Exception e ) + { + // invalid POM : ignore + } + } + public ManagedRepositoryConfiguration getRepositoryConfiguration() { return repositoryConfiguration;