Index: src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResourceFactory.java =================================================================== --- src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResourceFactory.java (revision 650781) +++ src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResourceFactory.java (working copy) @@ -19,6 +19,7 @@ * under the License. */ +import com.opensymphony.webwork.RequestUtils; import com.opensymphony.xwork.ActionContext; import org.apache.jackrabbit.webdav.*; import org.apache.maven.archiva.repository.ManagedRepositoryContent; @@ -37,6 +38,8 @@ import org.apache.maven.archiva.webdav.util.RepositoryPathUtil; import org.apache.maven.archiva.proxy.RepositoryProxyConnectors; import org.apache.maven.archiva.common.utils.PathUtil; +import org.apache.maven.archiva.configuration.ArchivaConfiguration; +import org.apache.maven.archiva.configuration.RepositoryGroupConfiguration; import org.apache.maven.archiva.model.ArtifactReference; import org.apache.maven.archiva.model.ProjectReference; import org.apache.maven.archiva.model.VersionedReference; @@ -51,8 +54,8 @@ import org.slf4j.LoggerFactory; import javax.servlet.http.HttpServletResponse; -import javax.servlet.ServletException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.io.*; @@ -93,41 +96,88 @@ * @plexus.requirement */ private MimeTypes mimeTypes; + + /** + * @plexus.requirement + */ + private ArchivaConfiguration archivaConfiguration; - public DavResource createResource(final DavResourceLocator locator, final DavServletRequest request, final DavServletResponse response) throws DavException + public DavResource createResource( DavResourceLocator locator, DavServletRequest request, + DavServletResponse response ) + throws DavException { - final ManagedRepositoryContent managedRepository = getManagedRepository(locator.getWorkspaceName()); - final LogicalResource logicalResource = new LogicalResource(RepositoryPathUtil.getLogicalResource(locator.getResourcePath())); + RepositoryGroupConfiguration repoGroupConfig = archivaConfiguration.getConfiguration() + .getRepositoryGroupsAsMap().get( locator.getWorkspaceName() ); + + List repositories = new ArrayList(); - DavResource resource = null; + if ( repoGroupConfig != null ) + { + if ( RepositoryPathUtil.getLogicalResource( locator.getResourcePath() ).equals( "/" ) + || WebdavMethodUtil.isWriteMethod( request.getMethod() ) ) + { + throw new DavException( HttpServletResponse.SC_BAD_REQUEST, "Bad request to repository group <" + + repoGroupConfig.getId() + ">" ); + } + repositories.addAll( repoGroupConfig.getRepositories() ); + } + else + { + repositories.add( locator.getWorkspaceName() ); + } - if (managedRepository != null) + DavException e = null; + + for ( Iterator i = repositories.iterator(); i.hasNext(); ) { - final boolean isGet = WebdavMethodUtil.isReadMethod( request.getMethod() ); - final boolean isPut = WebdavMethodUtil.isWriteMethod( request.getMethod() ); + String repositoryId = i.next(); - if (isGet) + ManagedRepositoryContent managedRepository = null; + try { - resource = doGet(managedRepository, request, locator, logicalResource); + managedRepository = getManagedRepository( repositoryId ); } + catch ( DavException de ) + { + throw new DavException( HttpServletResponse.SC_NOT_FOUND, "Invalid managed repository <" + repositoryId + + ">" ); + } + + LogicalResource logicalResource = new LogicalResource( RepositoryPathUtil.getLogicalResource( locator + .getResourcePath() ) ); - if (isPut) + DavResource resource = null; + + if ( managedRepository != null ) { - resource = doPut(managedRepository, request, locator, logicalResource); + boolean isGet = WebdavMethodUtil.isReadMethod( request.getMethod() ); + boolean isPut = WebdavMethodUtil.isWriteMethod( request.getMethod() ); + + if ( isGet ) + { + resource = doGet( managedRepository, request, locator, logicalResource ); + } + + if ( isPut ) + { + resource = doPut( managedRepository, request, locator, logicalResource ); + } } - } - else - { - throw new DavException(HttpServletResponse.SC_NOT_FOUND, "Repository does not exist"); - } - if (resource != null) - { - setHeaders(locator, response); - return resource; + if ( resource != null ) + { + setHeaders( locator, response ); + return resource; + } + else + { + e = new DavException( HttpServletResponse.SC_NOT_FOUND, logicalResource.getPath() + + " not found in any of the managed repositories." ); + } + } - throw new DavException(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Could not get resource for method " + request.getMethod()); + throw e; } public DavResource createResource(final DavResourceLocator locator, final DavSession davSession) throws DavException @@ -174,6 +224,11 @@ processAuditEvents(request, locator.getWorkspaceName(), logicalResource.getPath(), previouslyExisted, resourceFile, " (proxied)"); } resource = new ArchivaDavResource(resourceFile.getAbsolutePath(), logicalResource.getPath(), mimeTypes, locator, this, null); + + if ( !resourceFile.exists() ) + { + resource = null; + } } return resource; }