You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by ma...@apache.org on 2016/10/21 18:13:27 UTC

[1/6] archiva git commit: simplify section null checking, and guard against NPEs

Repository: archiva
Updated Branches:
  refs/heads/jpa e7143b5e7 -> 2164ef75c


simplify section null checking, and guard against NPEs


Project: http://git-wip-us.apache.org/repos/asf/archiva/repo
Commit: http://git-wip-us.apache.org/repos/asf/archiva/commit/723cf8b2
Tree: http://git-wip-us.apache.org/repos/asf/archiva/tree/723cf8b2
Diff: http://git-wip-us.apache.org/repos/asf/archiva/diff/723cf8b2

Branch: refs/heads/jpa
Commit: 723cf8b2ee8302edc28e2ee8b5eead4750fd50e3
Parents: 5bc8ad7
Author: Dave Brosius <db...@mebigfatguy.com>
Authored: Sat Sep 17 18:48:47 2016 -0400
Committer: Dave Brosius <db...@mebigfatguy.com>
Committed: Sat Sep 17 18:48:47 2016 -0400

----------------------------------------------------------------------
 .../DefaultArchivaConfiguration.java            | 67 +++++++++++---------
 1 file changed, 36 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/archiva/blob/723cf8b2/archiva-modules/archiva-base/archiva-configuration/src/main/java/org/apache/archiva/configuration/DefaultArchivaConfiguration.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-configuration/src/main/java/org/apache/archiva/configuration/DefaultArchivaConfiguration.java b/archiva-modules/archiva-base/archiva-configuration/src/main/java/org/apache/archiva/configuration/DefaultArchivaConfiguration.java
index 665c80a..f37171a 100644
--- a/archiva-modules/archiva-base/archiva-configuration/src/main/java/org/apache/archiva/configuration/DefaultArchivaConfiguration.java
+++ b/archiva-modules/archiva-base/archiva-configuration/src/main/java/org/apache/archiva/configuration/DefaultArchivaConfiguration.java
@@ -489,45 +489,50 @@ public class DefaultArchivaConfiguration
         escapeCronExpressions( configuration );
 
         // [MRM-661] Due to a bug in the modello registry writer, we need to take these out by hand. They'll be put back by the writer.
-        if ( configuration.getManagedRepositories().isEmpty() && section != null )
-        {
-            section.removeSubset( "managedRepositories" );
-        }
-        if ( configuration.getRemoteRepositories().isEmpty() && section != null )
+        if ( section != null )
         {
-            section.removeSubset( "remoteRepositories" );
+            if ( configuration.getManagedRepositories().isEmpty() )
+            {
+                section.removeSubset( "managedRepositories" );
+            }
+            if ( configuration.getRemoteRepositories().isEmpty() )
+            {
+                section.removeSubset( "remoteRepositories" );
 
-        }
-        if ( configuration.getProxyConnectors().isEmpty() && section != null )
-        {
-            section.removeSubset( "proxyConnectors" );
-        }
-        if ( configuration.getNetworkProxies().isEmpty() && section != null )
-        {
-            section.removeSubset( "networkProxies" );
-        }
-        if ( configuration.getLegacyArtifactPaths().isEmpty() && section != null )
-        {
-            section.removeSubset( "legacyArtifactPaths" );
-        }
-        if ( configuration.getRepositoryGroups().isEmpty() && section != null )
-        {
-            section.removeSubset( "repositoryGroups" );
-        }
-        if ( configuration.getRepositoryScanning() != null )
-        {
-            if ( configuration.getRepositoryScanning().getKnownContentConsumers().isEmpty() && section != null )
+            }
+            if ( configuration.getProxyConnectors().isEmpty() )
+            {
+                section.removeSubset( "proxyConnectors" );
+            }
+            if ( configuration.getNetworkProxies().isEmpty() )
+            {
+                section.removeSubset( "networkProxies" );
+            }
+            if ( configuration.getLegacyArtifactPaths().isEmpty() )
+            {
+                section.removeSubset( "legacyArtifactPaths" );
+            }
+            if ( configuration.getRepositoryGroups().isEmpty() )
             {
-                section.removeSubset( "repositoryScanning.knownContentConsumers" );
+                section.removeSubset( "repositoryGroups" );
             }
-            if ( configuration.getRepositoryScanning().getInvalidContentConsumers().isEmpty() && section != null )
+            if ( configuration.getRepositoryScanning() != null )
             {
-                section.removeSubset( "repositoryScanning.invalidContentConsumers" );
+                if ( configuration.getRepositoryScanning().getKnownContentConsumers().isEmpty() )
+                {
+                    section.removeSubset( "repositoryScanning.knownContentConsumers" );
+                }
+                if ( configuration.getRepositoryScanning().getInvalidContentConsumers().isEmpty() )
+                {
+                    section.removeSubset( "repositoryScanning.invalidContentConsumers" );
+                }
             }
+
+            new ConfigurationRegistryWriter().write( configuration, section );
+            section.save();
         }
 
-        new ConfigurationRegistryWriter().write( configuration, section );
-        section.save();
+
 
         this.configuration = unescapeExpressions( configuration );
 


[5/6] archiva git commit: Adding isValid() method to authentication classes

Posted by ma...@apache.org.
Adding isValid() method to authentication classes


Project: http://git-wip-us.apache.org/repos/asf/archiva/repo
Commit: http://git-wip-us.apache.org/repos/asf/archiva/commit/3fe10008
Tree: http://git-wip-us.apache.org/repos/asf/archiva/tree/3fe10008
Diff: http://git-wip-us.apache.org/repos/asf/archiva/diff/3fe10008

Branch: refs/heads/jpa
Commit: 3fe1000865bcab2e210b8482fa9f79ce5fd24782
Parents: c4596cb
Author: Martin Stockhammer <ma...@apache.org>
Authored: Tue Oct 4 20:52:25 2016 +0200
Committer: Martin Stockhammer <ma...@apache.org>
Committed: Sun Oct 16 17:18:23 2016 +0200

----------------------------------------------------------------------
 .../DefaultRedbackRuntimeConfigurationService.java   |  7 ++++++-
 .../runtime/ldap/ArchivaLdapConnectionFactory.java   | 15 ++++++++++++++-
 .../security/ArchivaUserManagerAuthenticator.java    | 10 +++++++++-
 3 files changed, 29 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/archiva/blob/3fe10008/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRedbackRuntimeConfigurationService.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRedbackRuntimeConfigurationService.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRedbackRuntimeConfigurationService.java
index e319c36..0284bb8 100644
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRedbackRuntimeConfigurationService.java
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRedbackRuntimeConfigurationService.java
@@ -192,7 +192,12 @@ public class DefaultRedbackRuntimeConfigurationService
 
             for ( Authenticator authenticator : authenticators )
             {
-                authenticator.initialize();
+                try {
+                    log.debug("Initializing authenticatior "+authenticator.getId());
+                    authenticator.initialize();
+                } catch (Exception e) {
+                    log.error("Initialization of authenticator failed "+authenticator.getId(),e);
+                }
             }
 
             // users cache

http://git-wip-us.apache.org/repos/asf/archiva/blob/3fe10008/archiva-modules/archiva-web/archiva-web-common/src/main/java/org/apache/archiva/web/runtime/ldap/ArchivaLdapConnectionFactory.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-web-common/src/main/java/org/apache/archiva/web/runtime/ldap/ArchivaLdapConnectionFactory.java b/archiva-modules/archiva-web/archiva-web-common/src/main/java/org/apache/archiva/web/runtime/ldap/ArchivaLdapConnectionFactory.java
index cd15b1e..45945f1 100644
--- a/archiva-modules/archiva-web/archiva-web-common/src/main/java/org/apache/archiva/web/runtime/ldap/ArchivaLdapConnectionFactory.java
+++ b/archiva-modules/archiva-web/archiva-web-common/src/main/java/org/apache/archiva/web/runtime/ldap/ArchivaLdapConnectionFactory.java
@@ -23,6 +23,8 @@ import org.apache.archiva.admin.model.beans.LdapConfiguration;
 import org.apache.archiva.admin.model.runtime.RedbackRuntimeConfigurationAdmin;
 import org.apache.archiva.redback.common.ldap.connection.ConfigurableLdapConnectionFactory;
 import org.apache.archiva.redback.common.ldap.connection.LdapConnectionConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.PostConstruct;
@@ -40,6 +42,10 @@ public class ArchivaLdapConnectionFactory
     extends ConfigurableLdapConnectionFactory
 {
 
+    private final Logger log = LoggerFactory.getLogger(ArchivaLdapConnectionFactory.class);
+
+    private boolean valid = false;
+
     @Inject
     private RedbackRuntimeConfigurationAdmin redbackRuntimeConfigurationAdmin;
 
@@ -63,10 +69,12 @@ public class ArchivaLdapConnectionFactory
             ldapConnectionConfiguration.setPassword( ldapConfiguration.getPassword() );
             ldapConnectionConfiguration.setAuthenticationMethod( ldapConfiguration.getAuthenticationMethod() );
             ldapConnectionConfiguration.setExtraProperties( toProperties( ldapConfiguration.getExtraProperties() ) );
+            valid=true;
         }
         catch ( InvalidNameException e )
         {
-            throw new RuntimeException( "Error while initializing connection factory.", e );
+            log.error("Error during initialization of LdapConnectionFactory "+e.getMessage(),e);
+            // throw new RuntimeException( "Error while initializing connection factory.", e );
         }
         catch ( RepositoryAdminException e )
         {
@@ -99,4 +107,9 @@ public class ArchivaLdapConnectionFactory
     {
         this.ldapConnectionConfiguration = ldapConnectionConfiguration;
     }
+
+    @Override
+    public boolean isValid() {
+        return valid;
+    }
 }

http://git-wip-us.apache.org/repos/asf/archiva/blob/3fe10008/archiva-modules/archiva-web/archiva-web-common/src/main/java/org/apache/archiva/web/security/ArchivaUserManagerAuthenticator.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-web-common/src/main/java/org/apache/archiva/web/security/ArchivaUserManagerAuthenticator.java b/archiva-modules/archiva-web/archiva-web-common/src/main/java/org/apache/archiva/web/security/ArchivaUserManagerAuthenticator.java
index 4d93253..0a74e39 100644
--- a/archiva-modules/archiva-web/archiva-web-common/src/main/java/org/apache/archiva/web/security/ArchivaUserManagerAuthenticator.java
+++ b/archiva-modules/archiva-web/archiva-web-common/src/main/java/org/apache/archiva/web/security/ArchivaUserManagerAuthenticator.java
@@ -67,6 +67,8 @@ public class ArchivaUserManagerAuthenticator
 
     private List<UserManager> userManagers;
 
+    private boolean valid = false;
+
     @PostConstruct
     @Override
     public void initialize()
@@ -83,10 +85,12 @@ public class ArchivaUserManagerAuthenticator
             {
                 userManagers.add( applicationContext.getBean( "userManager#" + beanId, UserManager.class ) );
             }
+            valid=true;
         }
         catch ( RepositoryAdminException e )
         {
-            throw new AuthenticationException( e.getMessage(), e );
+            log.error("Error during repository initialization "+e.getMessage(),e);
+            // throw new AuthenticationException( e.getMessage(), e );
         }
     }
 
@@ -225,4 +229,8 @@ public class ArchivaUserManagerAuthenticator
     {
         return "ArchivaUserManagerAuthenticator";
     }
+
+    public boolean isValid() {
+        return valid;
+    }
 }


[4/6] archiva git commit: Merge branch 'pr/28'

Posted by ma...@apache.org.
Merge branch 'pr/28'


Project: http://git-wip-us.apache.org/repos/asf/archiva/repo
Commit: http://git-wip-us.apache.org/repos/asf/archiva/commit/c4596cb5
Tree: http://git-wip-us.apache.org/repos/asf/archiva/tree/c4596cb5
Diff: http://git-wip-us.apache.org/repos/asf/archiva/diff/c4596cb5

Branch: refs/heads/jpa
Commit: c4596cb59135d4d1f284f98e9bd1ca267bee289f
Parents: 70323bb ef0f292
Author: olivier lamy <ol...@apache.org>
Authored: Wed Oct 5 14:31:48 2016 +1100
Committer: olivier lamy <ol...@apache.org>
Committed: Wed Oct 5 14:31:48 2016 +1100

----------------------------------------------------------------------
 .../webdav/ArchivaDavResourceFactory.java       | 14 +++++--
 ...epositoryServletProxiedMetadataTestCase.java | 40 --------------------
 .../AbstractRepositoryServletTestCase.java      | 31 +++++++++++++++
 .../webdav/RepositoryServletNoProxyTest.java    | 40 ++++++++++++++++++++
 4 files changed, 82 insertions(+), 43 deletions(-)
----------------------------------------------------------------------



[3/6] archiva git commit: Merge branch 'pr/27'

Posted by ma...@apache.org.
Merge branch 'pr/27'


Project: http://git-wip-us.apache.org/repos/asf/archiva/repo
Commit: http://git-wip-us.apache.org/repos/asf/archiva/commit/70323bbe
Tree: http://git-wip-us.apache.org/repos/asf/archiva/tree/70323bbe
Diff: http://git-wip-us.apache.org/repos/asf/archiva/diff/70323bbe

Branch: refs/heads/jpa
Commit: 70323bbefbc70103cfe58deeb0816c2e961d2d78
Parents: 1fd9c95 723cf8b
Author: olivier lamy <ol...@apache.org>
Authored: Wed Oct 5 14:30:52 2016 +1100
Committer: olivier lamy <ol...@apache.org>
Committed: Wed Oct 5 14:30:52 2016 +1100

----------------------------------------------------------------------
 .../DefaultArchivaConfiguration.java            | 67 +++++++++++---------
 1 file changed, 36 insertions(+), 31 deletions(-)
----------------------------------------------------------------------



[6/6] archiva git commit: Merge branch 'master' into jpa

Posted by ma...@apache.org.
Merge branch 'master' into jpa


Project: http://git-wip-us.apache.org/repos/asf/archiva/repo
Commit: http://git-wip-us.apache.org/repos/asf/archiva/commit/2164ef75
Tree: http://git-wip-us.apache.org/repos/asf/archiva/tree/2164ef75
Diff: http://git-wip-us.apache.org/repos/asf/archiva/diff/2164ef75

Branch: refs/heads/jpa
Commit: 2164ef75ca57b91c3c12a6043649dcce142b5836
Parents: e7143b5 3fe1000
Author: Martin Stockhammer <ma...@apache.org>
Authored: Sun Oct 16 20:10:06 2016 +0200
Committer: Martin Stockhammer <ma...@apache.org>
Committed: Sun Oct 16 20:10:06 2016 +0200

----------------------------------------------------------------------
 .../DefaultArchivaConfiguration.java            | 67 +++++++++++---------
 .../webdav/ArchivaDavResourceFactory.java       | 14 +++-
 ...epositoryServletProxiedMetadataTestCase.java | 40 ------------
 .../AbstractRepositoryServletTestCase.java      | 31 +++++++++
 .../webdav/RepositoryServletNoProxyTest.java    | 40 ++++++++++++
 5 files changed, 118 insertions(+), 74 deletions(-)
----------------------------------------------------------------------



[2/6] archiva git commit: [MRM-1928] Use applicationUrl setting in HTTP redirects

Posted by ma...@apache.org.
[MRM-1928] Use applicationUrl setting in HTTP redirects

Make use of webapp application URL setting when constructing the HTTP
Location header within redirect responses, which allows clients to
follow them when Archiva runs behind HTTP reverse proxies.


Project: http://git-wip-us.apache.org/repos/asf/archiva/repo
Commit: http://git-wip-us.apache.org/repos/asf/archiva/commit/ef0f2923
Tree: http://git-wip-us.apache.org/repos/asf/archiva/tree/ef0f2923
Diff: http://git-wip-us.apache.org/repos/asf/archiva/diff/ef0f2923

Branch: refs/heads/jpa
Commit: ef0f29235d7d5ebecf3f60accf2c76bcb7c8230b
Parents: 1fd9c95
Author: Ciprian Ciubotariu <ch...@gmx.net>
Authored: Tue Oct 4 17:16:50 2016 +0300
Committer: Ciprian Ciubotariu <ch...@gmx.net>
Committed: Tue Oct 4 18:12:05 2016 +0300

----------------------------------------------------------------------
 .../webdav/ArchivaDavResourceFactory.java       | 14 +++++--
 ...epositoryServletProxiedMetadataTestCase.java | 40 --------------------
 .../AbstractRepositoryServletTestCase.java      | 31 +++++++++++++++
 .../webdav/RepositoryServletNoProxyTest.java    | 40 ++++++++++++++++++++
 4 files changed, 82 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/archiva/blob/ef0f2923/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResourceFactory.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResourceFactory.java b/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResourceFactory.java
index 93547c0..d4958b1 100644
--- a/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResourceFactory.java
+++ b/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResourceFactory.java
@@ -47,7 +47,6 @@ import org.apache.archiva.model.ArchivaRepositoryMetadata;
 import org.apache.archiva.model.ArtifactReference;
 import org.apache.archiva.policies.ProxyDownloadException;
 import org.apache.archiva.proxy.model.RepositoryProxyConnectors;
-import org.apache.archiva.proxy.model.ProxyFetchResult;
 import org.apache.archiva.redback.authentication.AuthenticationException;
 import org.apache.archiva.redback.authentication.AuthenticationResult;
 import org.apache.archiva.redback.authorization.AuthorizationException;
@@ -577,8 +576,7 @@ public class ArchivaDavResourceFactory
             String path = e.getPath();
             log.debug( "Relocation to {}", path );
 
-            throw new BrowserRedirectException( contextPath + ( StringUtils.startsWith( path, "/" ) ? "" : "/" ) + path,
-                                                e.getRelocationType() );
+            throw new BrowserRedirectException( addHrefPrefix( contextPath, path ), e.getRelocationType() );
         }
         catch ( XMLException e )
         {
@@ -935,6 +933,16 @@ public class ArchivaDavResourceFactory
         return archivaLocator;
     }
 
+    private String addHrefPrefix( String contextPath, String path ) {
+        String prefix = archivaConfiguration.getConfiguration().getWebapp().getUi().getApplicationUrl();
+        if (prefix == null || prefix.isEmpty()) {
+            prefix = contextPath;
+        }
+        return prefix + ( StringUtils.startsWith( path, "/" ) ? "" :
+                        ( StringUtils.endsWith( prefix, "/" ) ? "" : "/" ) )
+                      + path;
+    }
+
     private static class LogicalResource
     {
         private String path;

http://git-wip-us.apache.org/repos/asf/archiva/blob/ef0f2923/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletProxiedMetadataTestCase.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletProxiedMetadataTestCase.java b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletProxiedMetadataTestCase.java
index 58ce852..eb7bd36 100644
--- a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletProxiedMetadataTestCase.java
+++ b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletProxiedMetadataTestCase.java
@@ -62,46 +62,6 @@ public abstract class AbstractRepositoryServletProxiedMetadataTestCase
         return response.getContentAsString();
     }
 
-    protected String createVersionMetadata( String groupId, String artifactId, String version )
-    {
-        return createVersionMetadata( groupId, artifactId, version, null, null, null );
-    }
-
-    protected String createVersionMetadata( String groupId, String artifactId, String version, String timestamp,
-                                          String buildNumber, String lastUpdated )
-    {
-        StringBuilder buf = new StringBuilder();
-
-        buf.append( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n" );
-        buf.append( "<metadata>\n" );
-        buf.append( "  <groupId>" ).append( groupId ).append( "</groupId>\n" );
-        buf.append( "  <artifactId>" ).append( artifactId ).append( "</artifactId>\n" );
-        buf.append( "  <version>" ).append( version ).append( "</version>\n" );
-
-        boolean hasSnapshot = StringUtils.isNotBlank( timestamp ) || StringUtils.isNotBlank( buildNumber );
-        boolean hasLastUpdated = StringUtils.isNotBlank( lastUpdated );
-
-        if ( hasSnapshot || hasLastUpdated )
-        {
-            buf.append( "  <versioning>\n" );
-            if ( hasSnapshot )
-            {
-                buf.append( "    <snapshot>\n" );
-                buf.append( "      <buildNumber>" ).append( buildNumber ).append( "</buildNumber>\n" );
-                buf.append( "      <timestamp>" ).append( timestamp ).append( "</timestamp>\n" );
-                buf.append( "    </snapshot>\n" );
-            }
-            if ( hasLastUpdated )
-            {
-                buf.append( "    <lastUpdated>" ).append( lastUpdated ).append( "</lastUpdated>\n" );
-            }
-            buf.append( "  </versioning>\n" );
-        }
-        buf.append( "</metadata>" );
-
-        return buf.toString();
-    }
-
     protected String createProjectMetadata( String groupId, String artifactId, String latest, String release,
                                           String[] versions )
     {

http://git-wip-us.apache.org/repos/asf/archiva/blob/ef0f2923/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletTestCase.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletTestCase.java b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletTestCase.java
index 68b0535..6c87d82 100644
--- a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletTestCase.java
+++ b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/AbstractRepositoryServletTestCase.java
@@ -75,6 +75,7 @@ import java.net.URL;
 import java.nio.charset.Charset;
 import java.util.Locale;
 import java.util.Map;
+import org.apache.commons.lang.StringUtils;
 
 /**
  * AbstractRepositoryServletTestCase
@@ -180,6 +181,36 @@ public abstract class AbstractRepositoryServletTestCase
 
     }
 
+    protected String createVersionMetadata(String groupId, String artifactId, String version) {
+        return createVersionMetadata(groupId, artifactId, version, null, null, null);
+    }
+
+    protected String createVersionMetadata(String groupId, String artifactId, String version, String timestamp, String buildNumber, String lastUpdated) {
+        StringBuilder buf = new StringBuilder();
+        buf.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n");
+        buf.append("<metadata>\n");
+        buf.append("  <groupId>").append(groupId).append("</groupId>\n");
+        buf.append("  <artifactId>").append(artifactId).append("</artifactId>\n");
+        buf.append("  <version>").append(version).append("</version>\n");
+        boolean hasSnapshot = StringUtils.isNotBlank(timestamp) || StringUtils.isNotBlank(buildNumber);
+        boolean hasLastUpdated = StringUtils.isNotBlank(lastUpdated);
+        if (hasSnapshot || hasLastUpdated) {
+            buf.append("  <versioning>\n");
+            if (hasSnapshot) {
+                buf.append("    <snapshot>\n");
+                buf.append("      <buildNumber>").append(buildNumber).append("</buildNumber>\n");
+                buf.append("      <timestamp>").append(timestamp).append("</timestamp>\n");
+                buf.append("    </snapshot>\n");
+            }
+            if (hasLastUpdated) {
+                buf.append("    <lastUpdated>").append(lastUpdated).append("</lastUpdated>\n");
+            }
+            buf.append("  </versioning>\n");
+        }
+        buf.append("</metadata>");
+        return buf.toString();
+    }
+
 
     public static class TestWebapplicationContext
         implements WebApplicationContext

http://git-wip-us.apache.org/repos/asf/archiva/blob/ef0f2923/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/RepositoryServletNoProxyTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/RepositoryServletNoProxyTest.java b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/RepositoryServletNoProxyTest.java
index 004d16d..cb86267 100644
--- a/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/RepositoryServletNoProxyTest.java
+++ b/archiva-modules/archiva-web/archiva-webdav/src/test/java/org/apache/archiva/webdav/RepositoryServletNoProxyTest.java
@@ -30,6 +30,9 @@ import org.junit.Test;
 import java.io.File;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
 
 /**
  * RepositoryServletTest
@@ -534,4 +537,41 @@ public class RepositoryServletNoProxyTest
         assertResponseNotFound( response );
     }
 
+    @Test
+    public void testGetNoProxySnapshotRedirectToTimestampedSnapshot()
+        throws Exception
+    {
+        String commonsLangQuery = "commons-lang/commons-lang/2.1-SNAPSHOT/commons-lang-2.1-SNAPSHOT.jar";
+        String commonsLangMetadata = "commons-lang/commons-lang/2.1-SNAPSHOT/maven-metadata.xml";
+        String commonsLangJar = "commons-lang/commons-lang/2.1-SNAPSHOT/commons-lang-2.1-20050821.023400-1.jar";
+        String expectedArtifactContents = "dummy-commons-lang-snapshot-artifact";
+
+        archivaConfiguration.getConfiguration().getWebapp().getUi().setApplicationUrl("http://localhost");
+
+        File artifactFile = new File( repoRootInternal, commonsLangJar );
+        artifactFile.getParentFile().mkdirs();
+        FileUtils.writeStringToFile( artifactFile, expectedArtifactContents, Charset.defaultCharset() );
+
+        File metadataFile = new File( repoRootInternal, commonsLangMetadata );
+        metadataFile.getParentFile().mkdirs();
+        FileUtils.writeStringToFile( metadataFile, createVersionMetadata("commons-lang", "commons-lang",
+                "2.1-SNAPSHOT", "20050821.023400", "1", "20050821.023400"));
+
+        WebRequest webRequest = new GetMethodWebRequest(
+                "http://localhost/repository/internal/" + commonsLangQuery );
+
+        MockHttpServletRequest request = new MockHttpServletRequest();
+        request.setRequestURI( webRequest.getUrl().getPath() );
+        request.addHeader( "User-Agent", "Apache Archiva unit test" );
+        request.setMethod( webRequest.getHttpMethod().name() );
+
+        final MockHttpServletResponse response = execute( request );
+
+        assertEquals( HttpServletResponse.SC_MOVED_TEMPORARILY,
+                      response.getStatus() );
+
+        assertEquals( "http://localhost/repository/internal/" + commonsLangJar,
+                      response.getHeader("Location") );
+    }
+
 }