mirror of https://github.com/apache/archiva.git
[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:
parent
5531453210
commit
954be952d0
|
@ -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 <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()
|
public ManagedRepositoryConfiguration getRepositoryConfiguration()
|
||||||
{
|
{
|
||||||
return repositoryConfiguration;
|
return repositoryConfiguration;
|
||||||
|
|
Loading…
Reference in New Issue