[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
This commit is contained in:
Maria Odea B. Ching 2007-09-16 05:18:18 +00:00
parent 5531453210
commit 954be952d0
1 changed files with 85 additions and 9 deletions

View File

@ -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.layout.LayoutException;
import org.apache.maven.archiva.repository.metadata.MetadataTools; import org.apache.maven.archiva.repository.metadata.MetadataTools;
import org.apache.maven.archiva.repository.metadata.RepositoryMetadataException; 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.AbstractDavServerComponent;
import org.codehaus.plexus.webdav.DavServerComponent; import org.codehaus.plexus.webdav.DavServerComponent;
import org.codehaus.plexus.webdav.DavServerException; import org.codehaus.plexus.webdav.DavServerException;
@ -44,6 +49,8 @@ import javax.servlet.ServletConfig;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException; import java.io.IOException;
/** /**
@ -52,8 +59,7 @@ import java.io.IOException;
* @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a> * @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
* @version $Id$ * @version $Id$
* @plexus.component role="org.codehaus.plexus.webdav.DavServerComponent" * @plexus.component role="org.codehaus.plexus.webdav.DavServerComponent"
* role-hint="proxied" * role-hint="proxied" instantiation-strategy="per-lookup"
* instantiation-strategy="per-lookup"
*/ */
public class ProxiedDavServer public class ProxiedDavServer
extends AbstractDavServerComponent extends AbstractDavServerComponent
@ -118,7 +124,8 @@ public class ProxiedDavServer
repositoryConfiguration = config.findManagedRepositoryById( getPrefix() ); repositoryConfiguration = config.findManagedRepositoryById( getPrefix() );
managedRepository = ArchivaConfigurationAdaptor.toArchivaRepository( repositoryConfiguration ); managedRepository =
ArchivaConfigurationAdaptor.toArchivaRepository( repositoryConfiguration );
try try
{ {
@ -135,16 +142,18 @@ public class ProxiedDavServer
{ {
if ( WebdavMethodUtil.isReadMethod( request.getRequest().getMethod() ) ) if ( WebdavMethodUtil.isReadMethod( request.getRequest().getMethod() ) )
{ {
if ( !hasResource( request.getLogicalResource() ) ) // if ( !hasResource( request.getLogicalResource() ) )
{ // {
fetchContentFromProxies( request ); fetchContentFromProxies( request );
} // }
} }
else else
{ {
// Create parent directories that don't exist when writing a file // 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 // This actually makes this implementation not compliant to the
// about how the collection is being used to do this reasonably and some versions of Maven's WebDAV don't // 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. // correctly create the collections themselves.
File rootDirectory = getRootDirectory(); File rootDirectory = getRootDirectory();
if ( rootDirectory != null ) if ( rootDirectory != null )
@ -231,6 +240,8 @@ public class ProxiedDavServer
artifact = resourceLayout.toArtifactReference( resource ); artifact = resourceLayout.toArtifactReference( resource );
if ( artifact != null ) if ( artifact != null )
{ {
applyServerSideRelocation( artifact );
connectors.fetchFromProxies( managedRepository, artifact ); connectors.fetchFromProxies( managedRepository, artifact );
request.getRequest().setPathInfo( layout.toPath( artifact ) ); request.getRequest().setPathInfo( layout.toPath( artifact ) );
return; 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.
* <p>
* For such clients, archiva does server-side relocation by reading itself
* the &lt;relocation&gt; 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() public ManagedRepositoryConfiguration getRepositoryConfiguration()
{ {
return repositoryConfiguration; return repositoryConfiguration;