You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by br...@apache.org on 2008/04/18 05:06:06 UTC

svn commit: r649352 [1/2] - in /archiva/trunk: ./ archiva-jetty/ archiva-modules/archiva-web/archiva-security/src/main/java/org/apache/maven/archiva/security/ archiva-modules/archiva-web/archiva-webapp/ archiva-modules/archiva-web/archiva-webapp/src/ma...

Author: brett
Date: Thu Apr 17 20:05:18 2008
New Revision: 649352

URL: http://svn.apache.org/viewvc?rev=649352&view=rev
Log:
[MRM-781] Removal of Archiva-Webdav implementation in favor of Jackrabbit-webdav
Submitted by: James William Dumay

Added:
    archiva/trunk/archiva-modules/archiva-web/archiva-security/src/main/java/org/apache/maven/archiva/security/ArchivaXworkUser.java
      - copied, changed from r649123, archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/util/ArchivaXworkUser.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/repository/MimeTypesLoaderTest.java
      - copied, changed from r649123, archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/repository/ArchivaMimeTypeLoaderTest.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/repository/UnauthenticatedDavSessionProvider.java   (with props)
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavLocatorFactory.java   (with props)
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResource.java   (with props)
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResourceFactory.java   (with props)
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResourceLocator.java   (with props)
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavSession.java   (with props)
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavSessionProvider.java   (with props)
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/LogicalResource.java   (with props)
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/UnauthorizedDavException.java   (with props)
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/util/IndexWriter.java   (with props)
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/util/RepositoryPathUtil.java   (with props)
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/resources/org/apache/maven/archiva/webdav/util/mime.types
      - copied, changed from r649123, archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/resources/org/apache/maven/archiva/webdav/util/mime-types.txt
Removed:
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/repository/ProxiedDavServer.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/util/ArchivaXworkUser.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/repository/ArchivaMimeTypeLoaderTest.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/util/StreamTools.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/util/StringTools.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/util/encoding/Encodable.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/util/encoding/EncodingAware.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/util/encoding/EncodingTools.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/util/encoding/package.html
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/util/http/HttpClient.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/util/http/WebDavClient.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/util/http/package.html
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/util/location/Location.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/util/location/Parameters.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/util/location/Path.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/util/location/package.html
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/util/package.html
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/DAVException.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/DAVInputStream.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/DAVListener.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/DAVLogger.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/DAVMethod.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/DAVMultiStatus.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/DAVNotModified.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/DAVOutputStream.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/DAVProcessor.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/DAVRepository.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/DAVResource.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/DAVServlet.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/DAVTransaction.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/DAVUtilities.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/XMLRepository.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/methods/COPY.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/methods/DELETE.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/methods/GET.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/methods/HEAD.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/methods/MKCOL.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/methods/MOVE.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/methods/OPTIONS.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/methods/PROPFIND.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/methods/PROPPATCH.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/methods/PUT.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/methods/package.html
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/package.html
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/replication/DAVReplica.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/replication/DAVReplicator.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/it/could/webdav/replication/package.html
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/AbstractDavServerComponent.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/DavServerComponent.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/DavServerException.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/DavServerListener.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/DavServerManager.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/DefaultDavServerManager.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/servlet/AbstractWebDavServlet.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/servlet/DavServerRequest.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/servlet/basic/BasicDavServerRequest.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/servlet/basic/BasicWebDavServlet.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/servlet/multiplexed/MultiplexedDavServerRequest.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/servlet/multiplexed/MultiplexedWebDavServlet.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/simple/HackedMoveMethod.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/simple/ReplacementGetMethod.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/simple/SimpleDavServerComponent.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/util/WrappedRepositoryRequest.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/betaversion/webdav/DAVServlet.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/betaversion/webdav/package.html
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/resources/org/apache/maven/archiva/webdav/util/mime-types.txt
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/resources/plexus-webdav/mime.types
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/resources/plexus-webdav/webdav.props
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/TestableHttpServletRequest.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/servlet/multiplexed/MultiplexedDavServerRequestTest.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/simple/SimpleDavServerComponentBasicTest.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/simple/SimpleDavServerComponentIndexHtmlTest.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/simple/SimpleDavServerComponentMultiTest.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/simple/SimpleWebdavServer.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/test/AbstractBasicWebdavProviderTestCase.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/test/AbstractMultiWebdavProviderTestCase.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/test/AbstractWebdavIndexHtmlTestCase.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/test/AbstractWebdavProviderTestCase.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/test/AbstractWebdavServer.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/test/TestMultiWebDavServlet.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/maven/archiva/webdav/util/WrappedRepositoryRequestTest.java
Modified:
    archiva/trunk/archiva-jetty/pom.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/pom.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/BrowseAction.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/SearchAction.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/UploadAction.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/repository/RepositoryServlet.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/resources/META-INF/plexus/application.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/repository/UnauthenticatedRepositoryServlet.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/pom.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/util/MimeTypes.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/util/WebdavMethodUtil.java
    archiva/trunk/pom.xml

Modified: archiva/trunk/archiva-jetty/pom.xml
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-jetty/pom.xml?rev=649352&r1=649351&r2=649352&view=diff
==============================================================================
--- archiva/trunk/archiva-jetty/pom.xml (original)
+++ archiva/trunk/archiva-jetty/pom.xml Thu Apr 17 20:05:18 2008
@@ -255,7 +255,7 @@
   </build>
   <pluginRepositories>
     <pluginRepository>
-      <id>codehaus.org</id>
+      <id>codehaus.snapshots</id>
       <url>http://snapshots.repository.codehaus.org/</url>
     </pluginRepository>
   </pluginRepositories>

Copied: archiva/trunk/archiva-modules/archiva-web/archiva-security/src/main/java/org/apache/maven/archiva/security/ArchivaXworkUser.java (from r649123, archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/util/ArchivaXworkUser.java)
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-security/src/main/java/org/apache/maven/archiva/security/ArchivaXworkUser.java?p2=archiva/trunk/archiva-modules/archiva-web/archiva-security/src/main/java/org/apache/maven/archiva/security/ArchivaXworkUser.java&p1=archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/util/ArchivaXworkUser.java&r1=649123&r2=649352&rev=649352&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/util/ArchivaXworkUser.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-security/src/main/java/org/apache/maven/archiva/security/ArchivaXworkUser.java Thu Apr 17 20:05:18 2008
@@ -1,4 +1,4 @@
-package org.apache.maven.archiva.web.util;
+package org.apache.maven.archiva.security;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -27,8 +27,6 @@
 import org.codehaus.plexus.redback.system.SecuritySystemConstants;
 import org.codehaus.plexus.redback.users.User;
 
-import com.opensymphony.xwork.ActionContext;
-
 /**
  * ArchivaXworkUser 
  *
@@ -37,35 +35,21 @@
  */
 public class ArchivaXworkUser
 {
-    private static Map<String, Object> getContextSession()
+    public static String getActivePrincipal( Map<String, Object> sessionMap )
     {
-        ActionContext context = ActionContext.getContext();
-        Map<String, Object> sessionMap = context.getSession();
         if ( sessionMap == null )
         {
-            sessionMap = new HashMap<String, Object>();
+            return ArchivaRoleConstants.PRINCIPAL_GUEST;
         }
 
-        return sessionMap;
-    }
-
-    private static SecuritySession getSecuritySession()
-    {
     	SecuritySession securitySession =
-            (SecuritySession) getContextSession().get( SecuritySystemConstants.SECURITY_SESSION_KEY );
+            (SecuritySession) sessionMap.get( SecuritySystemConstants.SECURITY_SESSION_KEY );
 
         if ( securitySession == null )
         {
-            securitySession = (SecuritySession) getContextSession().get( SecuritySession.ROLE );
+            securitySession = (SecuritySession) sessionMap.get( SecuritySession.ROLE );
         }
 
-        return securitySession;        
-    }
-
-    public static String getActivePrincipal()
-    {
-        SecuritySession securitySession = getSecuritySession();        
-        
         if ( securitySession == null )
         {
             return ArchivaRoleConstants.PRINCIPAL_GUEST;

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/pom.xml
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/pom.xml?rev=649352&r1=649351&r2=649352&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/pom.xml (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/pom.xml Thu Apr 17 20:05:18 2008
@@ -137,16 +137,6 @@
       <artifactId>commons-lang</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.apache.maven.wagon</groupId>
-      <artifactId>wagon-http</artifactId>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.maven.wagon</groupId>
-      <artifactId>wagon-file</artifactId>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
       <groupId>com.opensymphony</groupId>
       <artifactId>webwork</artifactId>
     </dependency>

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/BrowseAction.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/BrowseAction.java?rev=649352&r1=649351&r2=649352&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/BrowseAction.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/BrowseAction.java Thu Apr 17 20:05:18 2008
@@ -22,15 +22,13 @@
 import java.util.Collections;
 import java.util.List;
 
+import com.opensymphony.xwork.ActionContext;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.maven.archiva.database.browsing.BrowsingResults;
 import org.apache.maven.archiva.database.browsing.RepositoryBrowsing;
-import org.apache.maven.archiva.security.AccessDeniedException;
-import org.apache.maven.archiva.security.ArchivaSecurityException;
-import org.apache.maven.archiva.security.PrincipalNotFoundException;
-import org.apache.maven.archiva.security.UserRepositories;
-import org.apache.maven.archiva.web.util.ArchivaXworkUser;
+import org.apache.maven.archiva.security.*;
+import org.apache.maven.archiva.security.ArchivaXworkUser;
 import org.codehaus.plexus.xwork.action.PlexusActionSupport;
 
 /**
@@ -121,7 +119,7 @@
     
     private String getPrincipal()
     {
-        return ArchivaXworkUser.getActivePrincipal();
+        return ArchivaXworkUser.getActivePrincipal( ActionContext.getContext().getSession() );
     }
     
     private List<String> getObservableRepos()

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/SearchAction.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/SearchAction.java?rev=649352&r1=649351&r2=649352&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/SearchAction.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/SearchAction.java Thu Apr 17 20:05:18 2008
@@ -23,6 +23,7 @@
 import java.util.Collections;
 import java.util.List;
 
+import com.opensymphony.xwork.ActionContext;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.maven.archiva.database.ArchivaDAO;
@@ -33,11 +34,8 @@
 import org.apache.maven.archiva.indexer.search.CrossRepositorySearch;
 import org.apache.maven.archiva.indexer.search.SearchResultLimits;
 import org.apache.maven.archiva.indexer.search.SearchResults;
-import org.apache.maven.archiva.security.AccessDeniedException;
-import org.apache.maven.archiva.security.ArchivaSecurityException;
-import org.apache.maven.archiva.security.PrincipalNotFoundException;
-import org.apache.maven.archiva.security.UserRepositories;
-import org.apache.maven.archiva.web.util.ArchivaXworkUser;
+import org.apache.maven.archiva.security.*;
+import org.apache.maven.archiva.security.ArchivaXworkUser;
 import org.codehaus.plexus.xwork.action.PlexusActionSupport;
 
 /**
@@ -155,7 +153,7 @@
     
     private String getPrincipal()
     {
-        return ArchivaXworkUser.getActivePrincipal();
+        return ArchivaXworkUser.getActivePrincipal( ActionContext.getContext().getSession() );
     }
     
     private List<String> getObservableRepos()

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java?rev=649352&r1=649351&r2=649352&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java Thu Apr 17 20:05:18 2008
@@ -31,9 +31,10 @@
 import org.apache.maven.archiva.security.ArchivaSecurityException;
 import org.apache.maven.archiva.security.PrincipalNotFoundException;
 import org.apache.maven.archiva.security.UserRepositories;
-import org.apache.maven.archiva.web.util.ArchivaXworkUser;
+import org.apache.maven.archiva.security.ArchivaXworkUser;
 import org.codehaus.plexus.xwork.action.PlexusActionSupport;
 
+import com.opensymphony.xwork.ActionContext;
 import com.opensymphony.xwork.Validateable;
 
 /**
@@ -173,7 +174,7 @@
     
     private String getPrincipal()
     {
-        return ArchivaXworkUser.getActivePrincipal();
+        return ArchivaXworkUser.getActivePrincipal( ActionContext.getContext().getSession() );
     }
     
     private List<String> getObservableRepos()

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/UploadAction.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/UploadAction.java?rev=649352&r1=649351&r2=649352&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/UploadAction.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/UploadAction.java Thu Apr 17 20:05:18 2008
@@ -51,9 +51,10 @@
 import org.apache.maven.archiva.security.ArchivaSecurityException;
 import org.apache.maven.archiva.security.PrincipalNotFoundException;
 import org.apache.maven.archiva.security.UserRepositories;
-import org.apache.maven.archiva.web.util.ArchivaXworkUser;
+import org.apache.maven.archiva.security.ArchivaXworkUser;
 import org.codehaus.plexus.xwork.action.PlexusActionSupport;
 
+import com.opensymphony.xwork.ActionContext;
 import com.opensymphony.xwork.Preparable;
 import com.opensymphony.xwork.Validateable;
 
@@ -325,7 +326,7 @@
 
     private String getPrincipal()
     {
-        return ArchivaXworkUser.getActivePrincipal();
+        return ArchivaXworkUser.getActivePrincipal( ActionContext.getContext().getSession() );
     }
 
     private void copyFile( File targetPath, String artifactFilename )

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/repository/RepositoryServlet.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/repository/RepositoryServlet.java?rev=649352&r1=649351&r2=649352&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/repository/RepositoryServlet.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/repository/RepositoryServlet.java Thu Apr 17 20:05:18 2008
@@ -23,29 +23,24 @@
 import org.apache.maven.archiva.configuration.ConfigurationEvent;
 import org.apache.maven.archiva.configuration.ConfigurationListener;
 import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
-import org.apache.maven.archiva.security.ArchivaRoleConstants;
-import org.apache.maven.archiva.webdav.DavServerComponent;
-import org.apache.maven.archiva.webdav.DavServerException;
-import org.apache.maven.archiva.webdav.servlet.DavServerRequest;
-import org.apache.maven.archiva.webdav.servlet.multiplexed.MultiplexedWebDavServlet;
-import org.apache.maven.archiva.webdav.util.WebdavMethodUtil;
-import org.codehaus.plexus.redback.authentication.AuthenticationException;
-import org.codehaus.plexus.redback.authentication.AuthenticationResult;
-import org.codehaus.plexus.redback.authorization.AuthorizationException;
-import org.codehaus.plexus.redback.authorization.AuthorizationResult;
-import org.codehaus.plexus.redback.policy.AccountLockedException;
-import org.codehaus.plexus.redback.policy.MustChangePasswordException;
-import org.codehaus.plexus.redback.system.SecuritySession;
+import org.apache.maven.archiva.webdav.ArchivaDavLocatorFactory;
+import org.apache.maven.archiva.webdav.ArchivaDavResourceFactory;
+import org.apache.maven.archiva.webdav.ArchivaDavSessionProvider;
+import org.apache.maven.archiva.webdav.UnauthorizedDavException;
+import org.apache.jackrabbit.webdav.server.AbstractWebdavServlet;
+import org.apache.jackrabbit.webdav.*;
 import org.codehaus.plexus.redback.system.SecuritySystem;
 import org.codehaus.plexus.redback.xwork.filter.authentication.HttpAuthenticator;
 import org.codehaus.plexus.spring.PlexusToSpringUtils;
 import org.springframework.web.context.WebApplicationContext;
 import org.springframework.web.context.support.WebApplicationContextUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpServletRequest;
 import java.io.File;
 import java.io.IOException;
 import java.util.Map;
@@ -57,9 +52,11 @@
  * @version $Id$
  */
 public class RepositoryServlet
-    extends MultiplexedWebDavServlet
+    extends AbstractWebdavServlet
     implements ConfigurationListener
 {
+    private Logger log = LoggerFactory.getLogger(RepositoryServlet.class);
+
     private SecuritySystem securitySystem;
 
     private HttpAuthenticator httpAuth;
@@ -67,17 +64,76 @@
     private ArchivaConfiguration configuration;
 
     private Map<String, ManagedRepositoryConfiguration> repositoryMap;
-    
-    private ArchivaMimeTypeLoader mimeTypeLoader;
+
+    private DavLocatorFactory locatorFactory;
+
+    private DavResourceFactory resourceFactory;
+
+    private DavSessionProvider sessionProvider;
+
+    private final Object reloadLock = new Object();
+
+    public void init(javax.servlet.ServletConfig servletConfig)
+        throws ServletException
+    {
+        super.init(servletConfig);
+        initServers(servletConfig);
+    }
+
+    /**
+     * Service the given request.
+     *
+     * @param request
+     * @param response
+     * @throws ServletException
+     * @throws java.io.IOException
+     */
+    @Override
+    protected void service(HttpServletRequest request, HttpServletResponse response)
+            throws ServletException, IOException
+    {
+        WebdavRequest webdavRequest = new WebdavRequestImpl(request, getLocatorFactory());
+        // DeltaV requires 'Cache-Control' header for all methods except 'VERSION-CONTROL' and 'REPORT'.
+        int methodCode = DavMethods.getMethodCode(request.getMethod());
+        boolean noCache = DavMethods.isDeltaVMethod(webdavRequest) && !(DavMethods.DAV_VERSION_CONTROL == methodCode || DavMethods.DAV_REPORT == methodCode);
+        WebdavResponse webdavResponse = new WebdavResponseImpl(response, noCache);
+        try {
+            // make sure there is a authenticated user
+            if (!getDavSessionProvider().attachSession(webdavRequest)) {
+                return;
+            }
+
+            // check matching if=header for lock-token relevant operations
+            DavResource resource = getResourceFactory().createResource(webdavRequest.getRequestLocator(), webdavRequest, webdavResponse);
+            if (!isPreconditionValid(webdavRequest, resource)) {
+                webdavResponse.sendError(DavServletResponse.SC_PRECONDITION_FAILED);
+                return;
+            }
+            if (!execute(webdavRequest, webdavResponse, methodCode, resource)) {
+                super.service(request, response);
+            }
+
+        }
+        catch (UnauthorizedDavException e)
+        {
+            webdavResponse.setHeader("WWW-Authenticate", getAuthenticateHeaderValue(e.getRepositoryName()));
+            webdavResponse.sendError(e.getErrorCode(), e.getStatusPhrase());
+        }
+        catch (DavException e) {
+            if (e.getErrorCode() == HttpServletResponse.SC_UNAUTHORIZED) {
+                log.error("Should throw UnauthorizedDavException");
+            } else {
+                webdavResponse.sendError(e);
+            }
+        } finally {
+            getDavSessionProvider().releaseSession(webdavRequest);
+        }
+    }
 
     public synchronized void initServers( ServletConfig servletConfig )
-        throws DavServerException
     {
         WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext( servletConfig.getServletContext() );
 
-        mimeTypeLoader = (ArchivaMimeTypeLoader) wac.getBean(
-            PlexusToSpringUtils.buildSpringId( ArchivaMimeTypeLoader.class.getName() ) );
-
         securitySystem = (SecuritySystem) wac.getBean( PlexusToSpringUtils.buildSpringId( SecuritySystem.ROLE ) );
         httpAuth =
             (HttpAuthenticator) wac.getBean( PlexusToSpringUtils.buildSpringId( HttpAuthenticator.ROLE, "basic" ) );
@@ -101,157 +157,91 @@
                     continue;
                 }
             }
-
-            DavServerComponent server = createServer( repo.getId(), repoDir, servletConfig );
-
-            server.setUseIndexHtml( true );
         }
+
+        resourceFactory = (DavResourceFactory)wac.getBean(PlexusToSpringUtils.buildSpringId(ArchivaDavResourceFactory.class));
+        locatorFactory = new ArchivaDavLocatorFactory();
+        sessionProvider = new ArchivaDavSessionProvider(wac);
     }
     
-    @Override
-    protected void service( HttpServletRequest httpRequest, HttpServletResponse httpResponse )
-        throws ServletException, IOException
+    public void configurationEvent( ConfigurationEvent event )
     {
-        // Wrap the incoming request to adjust paths and whatnot.
-        super.service( new PolicingServletRequest( httpRequest ), httpResponse );
+        if( event.getType() == ConfigurationEvent.SAVED )
+        {
+            initRepositories();
+        }
     }
 
-    public synchronized ManagedRepositoryConfiguration getRepository( String prefix )
+    private void initRepositories()
     {
-        if ( repositoryMap.isEmpty() )
+        synchronized ( repositoryMap )
         {
+            repositoryMap.clear();
             repositoryMap.putAll( configuration.getConfiguration().getManagedRepositoriesAsMap() );
         }
-        return repositoryMap.get( prefix );
-    }
 
-    private String getRepositoryName( DavServerRequest request )
-    {
-        ManagedRepositoryConfiguration repoConfig = getRepository( request.getPrefix() );
-        if ( repoConfig == null )
+        synchronized ( reloadLock )
         {
-            return "Unknown";
+            initServers( getServletConfig() );
         }
-
-        return repoConfig.getName();
     }
 
-    public boolean isAuthenticated( DavServerRequest davRequest, HttpServletResponse response )
-        throws ServletException, IOException
+    public synchronized ManagedRepositoryConfiguration getRepository( String prefix )
     {
-        HttpServletRequest request = davRequest.getRequest();
-
-        // Authentication Tests.
-        try
-        {
-            AuthenticationResult result = httpAuth.getAuthenticationResult( request, response );
-
-            if ( result != null && !result.isAuthenticated() )
-            {
-                // Must Authenticate.
-                httpAuth.challenge( request, response, "Repository " + getRepositoryName( davRequest ),
-                                    new AuthenticationException( "User Credentials Invalid" ) );
-                return false;
-            }
-        }
-        catch ( AuthenticationException e )
-        {
-            log( "Fatal Http Authentication Error.", e );
-            throw new ServletException( "Fatal Http Authentication Error.", e );
-        }
-        catch ( AccountLockedException e )
-        {
-            httpAuth.challenge( request, response, "Repository " + getRepositoryName( davRequest ),
-                                new AuthenticationException( "User account is locked" ) );
-        }
-        catch ( MustChangePasswordException e )
+        if ( repositoryMap.isEmpty() )
         {
-            httpAuth.challenge( request, response, "Repository " + getRepositoryName( davRequest ),
-                                new AuthenticationException( "You must change your password." ) );
+            repositoryMap.putAll( configuration.getConfiguration().getManagedRepositoriesAsMap() );
         }
-
-        return true;
+        return repositoryMap.get( prefix );
     }
 
-    public boolean isAuthorized( DavServerRequest davRequest, HttpServletResponse response )
-        throws ServletException, IOException
+    ArchivaConfiguration getConfiguration()
     {
-        // Authorization Tests.
-        HttpServletRequest request = davRequest.getRequest();
-
-        boolean isWriteRequest = WebdavMethodUtil.isWriteMethod( request.getMethod() );
-
-        SecuritySession securitySession = httpAuth.getSecuritySession();
-        try
-        {
-            String permission = ArchivaRoleConstants.OPERATION_REPOSITORY_ACCESS;
-
-            if ( isWriteRequest )
-            {
-                permission = ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD;
-            }
+        return configuration;
+    }
 
-            AuthorizationResult authzResult =
-                securitySystem.authorize( securitySession, permission, davRequest.getPrefix() );
+    protected boolean isPreconditionValid(final WebdavRequest request, final DavResource davResource)
+    {
+        return true;
+    }
 
-            if ( !authzResult.isAuthorized() )
-            {
-                if ( authzResult.getException() != null )
-                {
-                    log( "Authorization Denied [ip=" + request.getRemoteAddr() + ",isWriteRequest=" + isWriteRequest +
-                        ",permission=" + permission + ",repo=" + davRequest.getPrefix() + "] : " +
-                        authzResult.getException().getMessage() );
-                }
+    public DavSessionProvider getDavSessionProvider()
+    {
+        return sessionProvider;
+    }
 
-                // Issue HTTP Challenge.
-                httpAuth.challenge( request, response, "Repository " + getRepositoryName( davRequest ),
-                                    new AuthenticationException( "Authorization Denied." ) );
-                return false;
-            }
-        }
-        catch ( AuthorizationException e )
-        {
-            throw new ServletException( "Fatal Authorization Subsystem Error." );
-        }
+    public void setDavSessionProvider(final DavSessionProvider davSessionProvider)
+    {
+        this.sessionProvider = davSessionProvider;
+    }
 
-        return true;
+    public DavLocatorFactory getLocatorFactory()
+    {
+        return locatorFactory;
     }
-    
-    public void configurationEvent( ConfigurationEvent event )
+
+    public void setLocatorFactory(final DavLocatorFactory davLocatorFactory)
     {
-        if( event.getType() == ConfigurationEvent.SAVED )
-        {
-            initRepositories();
-        }
+        locatorFactory = davLocatorFactory;
     }
 
-    private void initRepositories()
+    public DavResourceFactory getResourceFactory()
     {
-        synchronized ( repositoryMap )
-        {
-            repositoryMap.clear();
-            repositoryMap.putAll( configuration.getConfiguration().getManagedRepositoriesAsMap() );
-        }
+        return resourceFactory;
+    }
 
-        synchronized ( davManager )
-        {
-            // Clear out the old servers.
-            davManager.removeAllServers();
+    public void setResourceFactory(final DavResourceFactory davResourceFactory)
+    {
+        resourceFactory = davResourceFactory;
+    }
 
-            // Create new servers.
-            try
-            {
-                initServers( getServletConfig() );
-            }
-            catch ( DavServerException e )
-            {
-                log( "Unable to init servers: " + e.getMessage(), e );
-            }
-        }
+    public String getAuthenticateHeaderValue()
+    {
+        throw new UnsupportedOperationException("");
     }
 
-    ArchivaConfiguration getConfiguration()
+    public String getAuthenticateHeaderValue(String repository)
     {
-        return configuration;
+        return "Basic realm=\"Repository Archiva Managed " + repository + " Repository\"";
     }
 }

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/resources/META-INF/plexus/application.xml
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/resources/META-INF/plexus/application.xml?rev=649352&r1=649351&r2=649352&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/resources/META-INF/plexus/application.xml (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/resources/META-INF/plexus/application.xml Thu Apr 17 20:05:18 2008
@@ -67,19 +67,6 @@
     </component>
 
     <component>
-      <role>org.apache.maven.archiva.webdav.DavServerManager</role>
-      <role-hint>default</role-hint>
-      <implementation>org.apache.maven.archiva.webdav.DefaultDavServerManager</implementation>
-      <description>DefaultDavServerManager</description>
-      <requirements>
-        <requirement>
-          <role>org.apache.maven.archiva.webdav.DavServerComponent</role>
-          <role-hint>proxied</role-hint>
-        </requirement>
-      </requirements>
-    </component>
-
-    <component>
       <role>org.codehaus.plexus.jdo.JdoFactory</role>
       <role-hint>archiva</role-hint>
       <implementation>org.codehaus.plexus.jdo.DataSourceConfigurableJdoFactory</implementation>
@@ -187,14 +174,14 @@
       </configuration>
     </component>
     
-    <component>
+    <!-- <component>
       <role>org.apache.maven.archiva.webdav.util.MimeTypes</role>
       <implementation>org.apache.maven.archiva.webdav.util.MimeTypes</implementation>
       <description>MimeTypes</description>
       <configuration>
         <resource>archiva-mime-types.txt</resource>
       </configuration>
-    </component>
+    </component> -->
 
     <!--
      | Logger manager

Copied: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/repository/MimeTypesLoaderTest.java (from r649123, archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/repository/ArchivaMimeTypeLoaderTest.java)
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/repository/MimeTypesLoaderTest.java?p2=archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/repository/MimeTypesLoaderTest.java&p1=archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/repository/ArchivaMimeTypeLoaderTest.java&r1=649123&r2=649352&rev=649352&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/repository/ArchivaMimeTypeLoaderTest.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/repository/MimeTypesLoaderTest.java Thu Apr 17 20:05:18 2008
@@ -28,13 +28,13 @@
  * @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
  * @version $Id$
  */
-public class ArchivaMimeTypeLoaderTest
+public class MimeTypesLoaderTest
     extends PlexusInSpringTestCase
 {
     public void testArchivaTypes()
         throws Exception
     {
-        lookup( ArchivaMimeTypeLoader.class );
+        lookup( MimeTypes.class );
         MimeTypes mimeTypes = (MimeTypes) lookup( MimeTypes.class );
         assertNotNull( mimeTypes );
 
@@ -43,5 +43,6 @@
         assertEquals( "md5", "text/plain", mimeTypes.getMimeType( "foo.md5" ) );
         assertEquals( "pgp", "application/pgp-encrypted", mimeTypes.getMimeType( "foo.pgp" ) );
         assertEquals( "jar", "application/java-archive", mimeTypes.getMimeType( "foo.jar" ) );
+        assertEquals( "Default", "application/octet-stream", mimeTypes.getMimeType(".SomeUnknownExtension"));
     }
 }

Added: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/repository/UnauthenticatedDavSessionProvider.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/repository/UnauthenticatedDavSessionProvider.java?rev=649352&view=auto
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/repository/UnauthenticatedDavSessionProvider.java (added)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/repository/UnauthenticatedDavSessionProvider.java Thu Apr 17 20:05:18 2008
@@ -0,0 +1,50 @@
+package org.apache.maven.archiva.web.repository;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.archiva.webdav.ArchivaDavSessionProvider;
+import org.apache.jackrabbit.webdav.WebdavRequest;
+import org.apache.jackrabbit.webdav.DavException;
+import org.springframework.web.context.WebApplicationContext;
+
+/**
+ * @author <a href="mailto:james@atlassian.com">James William Dumay</a>
+ */
+public class UnauthenticatedDavSessionProvider extends ArchivaDavSessionProvider
+{
+    public UnauthenticatedDavSessionProvider(WebApplicationContext applicationContext)
+    {
+        super(applicationContext);
+    }
+
+    @Override
+    protected boolean isAuthorized( WebdavRequest request, String repositoryId )
+        throws DavException
+    {
+        return true;    
+    }
+
+    @Override
+    protected boolean isAuthenticated( WebdavRequest request, String repositoryId )
+        throws DavException
+    {
+        return true;
+    }
+}

Propchange: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/repository/UnauthenticatedDavSessionProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/repository/UnauthenticatedRepositoryServlet.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/repository/UnauthenticatedRepositoryServlet.java?rev=649352&r1=649351&r2=649352&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/repository/UnauthenticatedRepositoryServlet.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/repository/UnauthenticatedRepositoryServlet.java Thu Apr 17 20:05:18 2008
@@ -19,11 +19,10 @@
  * under the License.
  */
 
-import org.apache.maven.archiva.webdav.servlet.DavServerRequest;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.context.support.WebApplicationContextUtils;
 
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
+import javax.servlet.ServletConfig;
 
 /**
  * UnauthenticatedRepositoryServlet 
@@ -34,16 +33,14 @@
 public class UnauthenticatedRepositoryServlet
     extends RepositoryServlet
 {
-    public boolean isAuthorized( DavServerRequest davRequest, HttpServletResponse response )
-        throws ServletException, IOException
-    {
-        return true;
-    }
-    
     @Override
-    public boolean isAuthenticated( DavServerRequest davRequest, HttpServletResponse response )
-        throws ServletException, IOException
+    public synchronized void initServers( ServletConfig servletConfig )
     {
-        return true;
+        super.initServers(servletConfig);
+
+        WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext( servletConfig.getServletContext() );
+
+        UnauthenticatedDavSessionProvider sessionProvider = new UnauthenticatedDavSessionProvider(wac);
+        setDavSessionProvider(sessionProvider);
     }
 }

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webdav/pom.xml
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webdav/pom.xml?rev=649352&r1=649351&r2=649352&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webdav/pom.xml (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webdav/pom.xml Thu Apr 17 20:05:18 2008
@@ -27,9 +27,45 @@
   </parent>
 
   <artifactId>archiva-webdav</artifactId>
-  <name>Archiva WebDAV Provider</name>
+  <name>Archiva Web :: WebDAV</name>
 
   <dependencies>
+    <!-- Archiva Modules -->
+    <dependency>
+      <groupId>org.apache.archiva</groupId>
+      <artifactId>archiva-repository-layer</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.archiva</groupId>
+      <artifactId>archiva-proxy</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.archiva</groupId>
+      <artifactId>archiva-security</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.archiva</groupId>                          
+      <artifactId>archiva-configuration</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.plexus.redback</groupId>
+      <artifactId>redback-xwork-integration</artifactId>
+      <exclusions>
+        <exclusion>
+          <groupId>org.codehaus.plexus</groupId>
+          <artifactId>plexus-container-default</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <!-- end Archiva Modules -->
+    <dependency>
+      <groupId>org.apache.maven.wagon</groupId>
+      <artifactId>wagon-http</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.wagon</groupId>
+      <artifactId>wagon-file</artifactId>
+    </dependency>
     <dependency>
       <groupId>commons-lang</groupId>
       <artifactId>commons-lang</artifactId>
@@ -37,14 +73,17 @@
     <dependency>
       <groupId>org.codehaus.plexus</groupId>
       <artifactId>plexus-component-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.codehaus.plexus</groupId>
-      <artifactId>plexus-utils</artifactId>
+      <exclusions>
+        <exclusion>
+          <groupId>org.codehaus.plexus</groupId>
+          <artifactId>plexus-container-default</artifactId>
+        </exclusion>
+      </exclusions>
     </dependency>
     <dependency>
       <groupId>org.codehaus.plexus</groupId>
       <artifactId>plexus-spring</artifactId>
+      <version>1.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.springframework</groupId>
@@ -52,35 +91,21 @@
       <version>2.5.1</version>
     </dependency>
     <dependency>
+      <groupId>org.apache.jackrabbit</groupId>
+      <artifactId>jackrabbit-webdav</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-model</artifactId>
+    </dependency>
+    <dependency>
       <groupId>commons-io</groupId>
       <artifactId>commons-io</artifactId>
     </dependency>
-<!-- We import these classes directly to be able to patch them, since this library hasn't been released in some time
-    <dependency>
-      <groupId>it.could</groupId>
-      <artifactId>webdav</artifactId>
-      <version>0.4</version>
-    </dependency>
--->
-  
-    <!-- Required by it.could classes -->
     <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>servlet-api</artifactId>
-      <version>2.3</version>
       <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>slide</groupId>
-      <artifactId>slide-webdavlib</artifactId>
-      <version>2.1</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jetty</artifactId>
-      <version>6.0.2</version>
-      <scope>test</scope>
     </dependency>
   </dependencies>
 

Added: archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavLocatorFactory.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavLocatorFactory.java?rev=649352&view=auto
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavLocatorFactory.java (added)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavLocatorFactory.java Thu Apr 17 20:05:18 2008
@@ -0,0 +1,72 @@
+package org.apache.maven.archiva.webdav;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.jackrabbit.webdav.DavLocatorFactory;
+import org.apache.jackrabbit.webdav.DavResourceLocator;
+import org.apache.jackrabbit.util.Text;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.ArrayUtils;
+import org.apache.maven.archiva.webdav.util.RepositoryPathUtil;
+
+/**
+ * @author <a href="mailto:james@atlassian.com">James William Dumay</a>
+ */
+public class ArchivaDavLocatorFactory implements DavLocatorFactory
+{
+    public DavResourceLocator createResourceLocator(String prefix, String href)
+    {
+        // build prefix string and remove all prefixes from the given href.
+        StringBuilder b = new StringBuilder();
+        if (prefix != null && prefix.length() > 0) {
+            b.append(prefix);
+            if (!prefix.endsWith("/"))
+            {
+                b.append('/');
+            }
+            if (href.startsWith(prefix)) {
+                href = href.substring(prefix.length());
+            }
+        }
+
+        // special treatment for root item, that has no name but '/' path.
+        if (href == null || "".equals(href)) {
+            href = "/";
+        }
+
+        final String workspaceName = RepositoryPathUtil.getRepositoryName(href);
+
+        return new ArchivaDavResourceLocator(b.toString(), Text.unescape(href), workspaceName,  this);
+    }
+
+    public DavResourceLocator createResourceLocator(String prefix, String workspacePath, String resourcePath)
+    {
+        return createResourceLocator(prefix, workspacePath, resourcePath, true);
+    }
+
+    public DavResourceLocator createResourceLocator(String prefix, String workspacePath,
+                                                    String path, boolean isResourcePath)
+    {
+        final String repository = RepositoryPathUtil.getRepositoryName(path);
+        return new ArchivaDavResourceLocator(prefix, path, repository, this);
+    }
+
+
+}

Propchange: archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavLocatorFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResource.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResource.java?rev=649352&view=auto
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResource.java (added)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResource.java Thu Apr 17 20:05:18 2008
@@ -0,0 +1,301 @@
+package org.apache.maven.archiva.webdav;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.jackrabbit.webdav.*;
+import org.apache.jackrabbit.webdav.property.DavPropertySet;
+import org.apache.jackrabbit.webdav.property.DavPropertyNameSet;
+import org.apache.jackrabbit.webdav.property.DavProperty;
+import org.apache.jackrabbit.webdav.property.DavPropertyName;
+import org.apache.jackrabbit.webdav.io.InputContext;
+import org.apache.jackrabbit.webdav.io.OutputContext;
+import org.apache.jackrabbit.webdav.lock.*;
+import org.apache.jackrabbit.util.Text;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.io.FileUtils;
+import org.apache.maven.archiva.webdav.util.MimeTypes;
+import org.apache.maven.archiva.webdav.util.IndexWriter;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Date;
+import java.io.*;
+
+/**
+ * @author <a href="mailto:james@atlassian.com">James William Dumay</a>
+ */
+public class ArchivaDavResource implements DavResource
+{
+    private final MimeTypes mimeTypes;
+
+    private final DavResourceLocator locator;
+
+    private final DavResourceFactory factory;
+
+    private final DavSession session;
+
+    private final File localResource;
+
+    private final String logicalResource;
+
+    private static final String METHODS = "OPTIONS, GET, HEAD, POST, TRACE, PROPFIND, PROPPATCH, MKCOL, COPY, PUT, DELETE, MOVE";
+
+    private static final String COMPLIANCE_CLASS = "1";
+
+    private DavPropertySet properties;
+
+    public ArchivaDavResource(String localResource, String logicalResource, MimeTypes mimeTypes, DavResourceLocator locator, DavResourceFactory factory, DavSession session)
+    {
+        this.mimeTypes = mimeTypes;
+        this.localResource = new File(localResource);
+        this.logicalResource = logicalResource;
+        this.locator = locator;
+        this.factory = factory;
+        this.session = session;
+        this.properties = new DavPropertySet();
+    }
+
+    public String getContentType()
+    {
+        return mimeTypes.getMimeType(localResource.getName());
+    }
+
+    public String getComplianceClass()
+    {
+        return COMPLIANCE_CLASS;
+    }
+
+    public String getSupportedMethods()
+    {
+        return METHODS;
+    }
+
+    public boolean exists()
+    {
+        return localResource.exists();
+    }
+
+    public boolean isCollection()
+    {
+        return localResource.isDirectory();
+    }
+
+    public String getDisplayName()
+    {
+        String resPath = getResourcePath();
+        return (resPath != null) ? Text.getName(resPath) : resPath;
+    }
+
+    public DavResourceLocator getLocator()
+    {
+        return locator;
+    }
+
+    public String getResourcePath()
+    {
+        return locator.getResourcePath();
+    }
+
+    public String getHref()
+    {
+        return locator.getHref(isCollection());
+    }
+
+    public long getModificationTime()
+    {
+        return localResource.lastModified();
+    }
+
+    public long getContentLength()
+    {
+        return localResource.length();
+    }
+
+    public void spool(OutputContext outputContext) throws IOException
+    {
+        if (!isCollection())
+        {
+            IOUtils.copy(new FileInputStream(localResource), outputContext.getOutputStream());
+        }
+        else
+        {
+            IndexWriter writer = new IndexWriter(this, localResource, logicalResource);
+            writer.write(outputContext);
+        }
+    }
+
+    public DavPropertyName[] getPropertyNames()
+    {
+        return new DavPropertyName[0];
+    }
+
+    public DavProperty getProperty(DavPropertyName name)
+    {
+        return null;
+    }
+
+    public DavPropertySet getProperties()
+    {
+        return properties;
+    }
+
+    public void setProperty(DavProperty property) throws DavException
+    {
+    }
+
+    public void removeProperty(DavPropertyName propertyName) throws DavException
+    {
+    }
+
+    public MultiStatusResponse alterProperties(DavPropertySet setProperties, DavPropertyNameSet removePropertyNames) throws DavException
+    {
+        return null;
+    }
+
+    public MultiStatusResponse alterProperties(List changeList) throws DavException
+    {
+        return null;
+    }
+
+    public DavResource getCollection()
+    {
+        DavResource parent = null;
+        if (getResourcePath() != null && !getResourcePath().equals("/")) {
+            String parentPath = Text.getRelativeParent(getResourcePath(), 1);
+            if (parentPath.equals("")) {
+                parentPath = "/";
+            }
+            DavResourceLocator parentloc = locator.getFactory().createResourceLocator(locator.getPrefix(), locator.getWorkspacePath(), parentPath);
+            try {
+                parent = factory.createResource(parentloc, session);
+            } catch (DavException e) {
+                // should not occur
+            }
+        }
+        return parent;
+    }
+
+    public void addMember(DavResource resource, InputContext inputContext) throws DavException
+    {
+        File localFile = new File(localResource, resource.getDisplayName());
+        if (!resource.isCollection() && isCollection() && inputContext.hasStream()) //New File
+        {
+            boolean deleteFile = false;
+            FileOutputStream stream = null;
+            try
+            {
+                stream = new FileOutputStream(localFile);
+                IOUtils.copy(inputContext.getInputStream(), stream);
+                if (inputContext.getContentLength() != localFile.length())
+                {
+                    deleteFile = true;
+                    throw new DavException(HttpServletResponse.SC_BAD_REQUEST, "Content Header length was "
+                            + inputContext.getContentLength() + " but was " + localFile.length());
+                }
+            }
+            catch (IOException e)
+            {
+                throw new DavException(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e);
+            }
+            finally
+            {
+                IOUtils.closeQuietly(stream);
+                if (deleteFile)
+                {
+                    FileUtils.deleteQuietly(localFile);
+                }
+            }
+        }
+        else if (resource.isCollection() && isCollection()) //New directory
+        {
+            localFile.mkdir();
+        }
+        else
+        {
+            throw new DavException(HttpServletResponse.SC_BAD_REQUEST, "Could not write member "
+                    + resource.getResourcePath() + " at " + getResourcePath());
+        }
+    }
+
+    public DavResourceIterator getMembers()
+    {
+        return null;
+    }
+
+    public void removeMember(DavResource member) throws DavException
+    {
+    }
+
+    public void move(DavResource destination) throws DavException
+    {
+    }
+
+    public void copy(DavResource destination, boolean shallow) throws DavException
+    {
+    }
+
+    public boolean isLockable(Type type, Scope scope)
+    {
+        return false;
+    }
+
+    public boolean hasLock(Type type, Scope scope)
+    {
+        return false;
+    }
+
+    public ActiveLock getLock(Type type, Scope scope)
+    {
+        return null;
+    }
+
+    public ActiveLock[] getLocks()
+    {
+        return new ActiveLock[0];
+    }
+
+    public ActiveLock lock(LockInfo reqLockInfo) throws DavException
+    {
+        return null;
+    }
+
+    public ActiveLock refreshLock(LockInfo reqLockInfo, String lockToken) throws DavException
+    {
+        return null;
+    }
+
+    public void unlock(String lockToken) throws DavException
+    {
+    }
+
+    public void addLockManager(LockManager lockmgr)
+    {
+    }
+
+    public DavResourceFactory getFactory()
+    {
+        return factory;
+    }
+
+    public DavSession getSession()
+    {
+        return session;
+    }
+}

Propchange: archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResource.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResourceFactory.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResourceFactory.java?rev=649352&view=auto
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResourceFactory.java (added)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResourceFactory.java Thu Apr 17 20:05:18 2008
@@ -0,0 +1,497 @@
+package org.apache.maven.archiva.webdav;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import com.opensymphony.xwork.ActionContext;
+import org.apache.jackrabbit.webdav.*;
+import org.apache.maven.archiva.repository.ManagedRepositoryContent;
+import org.apache.maven.archiva.repository.RepositoryNotFoundException;
+import org.apache.maven.archiva.repository.RepositoryException;
+import org.apache.maven.archiva.repository.RepositoryContentFactory;
+import org.apache.maven.archiva.repository.layout.LayoutException;
+import org.apache.maven.archiva.repository.content.RepositoryRequest;
+import org.apache.maven.archiva.repository.audit.AuditListener;
+import org.apache.maven.archiva.repository.audit.Auditable;
+import org.apache.maven.archiva.repository.audit.AuditEvent;
+import org.apache.maven.archiva.repository.metadata.MetadataTools;
+import org.apache.maven.archiva.repository.metadata.RepositoryMetadataException;
+import org.apache.maven.archiva.webdav.util.WebdavMethodUtil;
+import org.apache.maven.archiva.webdav.util.MimeTypes;
+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.model.ArtifactReference;
+import org.apache.maven.archiva.model.ProjectReference;
+import org.apache.maven.archiva.model.VersionedReference;
+import org.apache.maven.archiva.policies.ProxyDownloadException;
+import org.apache.maven.archiva.security.ArchivaXworkUser;
+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.codehaus.plexus.util.xml.pull.XmlPullParserException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.ServletException;
+import java.util.ArrayList;
+import java.util.List;
+import java.io.*;
+
+/**
+ * @author <a href="mailto:james@atlassian.com">James William Dumay</a>
+ * @plexus.component role="org.apache.maven.archiva.webdav.ArchivaDavResourceFactory"
+ */
+public class ArchivaDavResourceFactory implements DavResourceFactory, Auditable
+{
+    private Logger log = LoggerFactory.getLogger(ArchivaDavResourceFactory.class);
+
+    /**
+     * @plexus.requirement role="org.apache.maven.archiva.repository.audit.AuditListener"
+     */
+    private List<AuditListener> auditListeners = new ArrayList<AuditListener>();
+
+    /**
+     * @plexus.requirement
+     */
+    private RepositoryContentFactory repositoryFactory;
+
+    /**
+     * @plexus.requirement
+     */
+    private RepositoryRequest repositoryRequest;
+
+    /**
+     * @plexus.requirement role-hint="default"
+     */
+    private RepositoryProxyConnectors connectors;
+
+    /**
+     * @plexus.requirement
+     */
+    private MetadataTools metadataTools;
+
+    /**
+     * @plexus.requirement
+     */
+    private MimeTypes mimeTypes;
+
+    public DavResource createResource(final DavResourceLocator locator, final DavServletRequest request, final DavServletResponse response) throws DavException
+    {
+        final ManagedRepositoryContent managedRepository = getManagedRepository(locator.getWorkspaceName());
+        final LogicalResource logicalResource = new LogicalResource(RepositoryPathUtil.getLogicalResource(locator.getResourcePath()));
+
+        DavResource resource = null;
+
+        if (managedRepository != null)
+        {
+            final boolean isGet = WebdavMethodUtil.isReadMethod( request.getMethod() );
+            final 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;
+        }
+
+        throw new DavException(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Could not get resource for method " + request.getMethod());
+    }
+
+    public DavResource createResource(final DavResourceLocator locator, final DavSession davSession) throws DavException
+    {
+        final ManagedRepositoryContent managedRepository = getManagedRepository(locator.getWorkspaceName());
+        final String logicalResource = RepositoryPathUtil.getLogicalResource(locator.getResourcePath());
+        final File resourceFile = new File ( managedRepository.getRepoRoot(), logicalResource);
+        
+        return new ArchivaDavResource(resourceFile.getAbsolutePath(), logicalResource, mimeTypes, locator, this, null);
+    }
+
+    private DavResource doGet(ManagedRepositoryContent managedRepository, DavServletRequest request, DavResourceLocator locator, LogicalResource logicalResource) throws DavException
+    {
+        File resourceFile = new File ( managedRepository.getRepoRoot(), logicalResource.getPath());
+        ArchivaDavResource resource = new ArchivaDavResource(resourceFile.getAbsolutePath(), logicalResource.getPath(), mimeTypes, locator, this, null);
+
+        if ( !resource.isCollection() )
+        {
+            // At this point the incoming request can either be in default or
+            // legacy layout format.
+            try
+            {
+                boolean fromProxy = fetchContentFromProxies(managedRepository, request, logicalResource );
+
+                // Perform an adjustment of the resource to the managed
+                // repository expected path.
+                String localResourcePath = repositoryRequest.toNativePath( logicalResource.getPath(), managedRepository );
+                resourceFile = new File( managedRepository.getRepoRoot(), localResourcePath );
+
+                boolean previouslyExisted = resourceFile.exists();
+
+                // Attempt to fetch the resource from any defined proxy.
+                if ( fromProxy )
+                {
+                    processAuditEvents(request, locator.getWorkspaceName(), logicalResource.getPath(), previouslyExisted, resourceFile, " (proxied)");
+                }
+                resource = new ArchivaDavResource(resourceFile.getAbsolutePath(), logicalResource.getPath(), mimeTypes, locator, this, null);
+
+            }
+            catch ( LayoutException e )
+            {
+                throw new DavException(HttpServletResponse.SC_NOT_FOUND, e);
+            }
+        }
+        return resource;
+    }
+
+    private DavResource doPut(ManagedRepositoryContent managedRepository, DavServletRequest request, DavResourceLocator locator, LogicalResource logicalResource) throws DavException
+    {
+        /*
+         * 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 correctly create the collections
+         * themselves.
+         */
+
+        File rootDirectory = new File(managedRepository.getRepoRoot());
+        File destDir = new File( rootDirectory, logicalResource.getPath() ).getParentFile();
+        if ( !destDir.exists() )
+        {
+            destDir.mkdirs();
+            String relPath =
+                PathUtil.getRelative( rootDirectory.getAbsolutePath(), destDir );
+            triggerAuditEvent(request, logicalResource.getPath(), relPath, AuditEvent.CREATE_DIR );
+        }
+
+        File resourceFile = new File( managedRepository.getRepoRoot(), logicalResource.getPath() );
+
+        boolean previouslyExisted = resourceFile.exists();
+
+        processAuditEvents(request, locator.getWorkspaceName(), logicalResource.getPath(), previouslyExisted, resourceFile, null );
+
+        return new ArchivaDavResource(resourceFile.getAbsolutePath(), logicalResource.getPath(), mimeTypes, locator, this, null);
+    }
+
+    private boolean fetchContentFromProxies( ManagedRepositoryContent managedRepository, DavServletRequest request, LogicalResource resource )
+        throws DavException
+    {
+        if ( repositoryRequest.isSupportFile( resource.getPath() ) )
+        {
+            // Checksums are fetched with artifact / metadata.
+
+            // Need to adjust the path for the checksum resource.
+            return false;
+        }
+
+        // Is it a Metadata resource?
+        if ( repositoryRequest.isDefault( resource.getPath() ) && repositoryRequest.isMetadata( resource.getPath() ) )
+        {
+            return fetchMetadataFromProxies(managedRepository, request, resource );
+        }
+
+        // Not any of the above? Then it's gotta be an artifact reference.
+        try
+        {
+            // Get the artifact reference in a layout neutral way.
+            ArtifactReference artifact = repositoryRequest.toArtifactReference( resource.getPath() );
+
+            if ( artifact != null )
+            {
+                applyServerSideRelocation(managedRepository, artifact );
+
+                File proxiedFile = connectors.fetchFromProxies( managedRepository, artifact );
+
+                resource.setPath( managedRepository.toPath( artifact ) );
+
+                return ( proxiedFile != null );
+            }
+        }
+        catch ( LayoutException e )
+        {
+            /* eat it */
+        }
+        catch ( ProxyDownloadException e )
+        {
+            log.error(e.getMessage(), e);
+            throw new DavException(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Unable to fetch artifact resource.");
+        }
+        return false;
+    }
+
+    private boolean fetchMetadataFromProxies(ManagedRepositoryContent managedRepository, DavServletRequest request, LogicalResource resource )
+        throws DavException
+    {
+        ProjectReference project;
+        VersionedReference versioned;
+
+        try
+        {
+
+            versioned = metadataTools.toVersionedReference( resource.getPath() );
+            if ( versioned != null )
+            {
+                connectors.fetchFromProxies( managedRepository, versioned );
+                return true;
+            }
+        }
+        catch ( RepositoryMetadataException e )
+        {
+            log.error(e.getMessage(), e);
+        }
+
+        try
+        {
+            project = metadataTools.toProjectReference( resource.getPath() );
+            if ( project != null )
+            {
+                connectors.fetchFromProxies( managedRepository, project );
+                return true;
+            }
+        }
+        catch ( RepositoryMetadataException e )
+        {
+            log.error(e.getMessage(), e);
+        }
+
+        return false;
+    }
+
+    /**
+     * 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( ManagedRepositoryContent managedRepository, ArtifactReference artifact )
+        throws ProxyDownloadException
+    {
+        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 = managedRepository.toFile( pomReference );
+
+        if ( !pom.exists() )
+        {
+            return;
+        }
+
+        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 ( IOException e )
+        {
+            // Unable to read POM : ignore.
+        }
+        catch ( XmlPullParserException e )
+        {
+            // Invalid POM : ignore
+        }
+    }
+
+    private void processAuditEvents( DavServletRequest request, String repositoryId, String resource,
+                                     boolean previouslyExisted, File resourceFile, String suffix )
+    {
+        if ( suffix == null )
+        {
+            suffix = "";
+        }
+
+        // Process Create Audit Events.
+        if ( !previouslyExisted && resourceFile.exists() )
+        {
+            if ( resourceFile.isFile() )
+            {
+                triggerAuditEvent( request, repositoryId, resource, AuditEvent.CREATE_FILE + suffix );
+            }
+            else if ( resourceFile.isDirectory() )
+            {
+                triggerAuditEvent( request, repositoryId, resource, AuditEvent.CREATE_DIR + suffix );
+            }
+        }
+        // Process Remove Audit Events.
+        else if ( previouslyExisted && !resourceFile.exists() )
+        {
+            if ( resourceFile.isFile() )
+            {
+                triggerAuditEvent( request, repositoryId, resource, AuditEvent.REMOVE_FILE + suffix );
+            }
+            else if ( resourceFile.isDirectory() )
+            {
+                triggerAuditEvent( request, repositoryId, resource, AuditEvent.REMOVE_DIR + suffix );
+            }
+        }
+        // Process modify events.
+        else
+        {
+            if ( resourceFile.isFile() )
+            {
+                triggerAuditEvent( request, repositoryId, resource, AuditEvent.MODIFY_FILE + suffix );
+            }
+        }
+    }
+
+    private void triggerAuditEvent( String user, String remoteIP, String repositoryId, String resource, String action )
+    {
+        AuditEvent event = new AuditEvent( repositoryId, user, resource, action );
+        event.setRemoteIP( remoteIP );
+
+        for ( AuditListener listener : auditListeners )
+        {
+            listener.auditEvent( event );
+        }
+    }
+
+    private void triggerAuditEvent( DavServletRequest request, String repositoryId, String resource, String action )
+    {
+        triggerAuditEvent( ArchivaXworkUser.getActivePrincipal( ActionContext.getContext().getSession() ), getRemoteIP( request ), repositoryId, resource, action );
+    }
+
+    private String getRemoteIP( DavServletRequest request )
+    {
+        return request.getRemoteAddr();
+    }
+
+    public void addAuditListener( AuditListener listener )
+    {
+        this.auditListeners.add( listener );
+    }
+
+    public void clearAuditListeners()
+    {
+        this.auditListeners.clear();
+    }
+
+    public void removeAuditListener( AuditListener listener )
+    {
+        this.auditListeners.remove( listener );
+    }
+
+    private void setHeaders(DavResourceLocator locator, DavServletResponse response)
+    {
+        // [MRM-503] - Metadata file need Pragma:no-cache response
+        // header.
+        if ( locator.getResourcePath().endsWith( "/maven-metadata.xml" ) )
+        {
+            response.addHeader( "Pragma", "no-cache" );
+            response.addHeader( "Cache-Control", "no-cache" );
+        }
+
+        // TODO: [MRM-524] determine http caching options for other types of files (artifacts, sha1, md5, snapshots)
+    }
+
+    private ManagedRepositoryContent getManagedRepository(String respositoryId) throws DavException
+    {
+        if (respositoryId != null)
+        {
+            try
+            {
+                return repositoryFactory.getManagedRepositoryContent(respositoryId);
+            }
+            catch (RepositoryNotFoundException e)
+            {
+                throw new DavException(HttpServletResponse.SC_NOT_FOUND, e);
+            }
+            catch (RepositoryException e)
+            {
+                throw new DavException(HttpServletResponse.SC_NOT_FOUND, e);
+            }
+        }
+        return null;
+    }
+
+    class LogicalResource
+    {
+        private String path;
+
+        public LogicalResource(String path)
+        {
+            this.path = path;
+        }
+
+        public String getPath()
+        {
+            return path;
+        }
+
+        public void setPath(String path)
+        {
+            this.path = path;
+        }
+    }
+}

Propchange: archiva/trunk/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResourceFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native