]> source.dussan.org Git - archiva.git/commitdiff
MRM-1933, MRM-1940: Fixing repository check
authorMartin Stockhammer <martin_s@apache.org>
Wed, 3 May 2017 22:22:31 +0000 (00:22 +0200)
committerMartin Stockhammer <martin_s@apache.org>
Wed, 3 May 2017 22:22:31 +0000 (00:22 +0200)
Remove trailing slashes from the remote repositories
Use special check paths for certain servers

archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-api/src/main/java/org/apache/archiva/admin/model/beans/RemoteRepository.java
archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRemoteRepositoriesService.java
archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/RemoteRepositoriesServiceTest.java

index db8021d868aacdfb4392c19cce5f51e345698d54..fdab2432e3d17702d9b91611af9d32fb4e1dcb46 100644 (file)
@@ -19,6 +19,8 @@ package org.apache.archiva.admin.model.beans;
  * under the License.
  */
 
+import org.apache.commons.lang.StringUtils;
+
 import javax.xml.bind.annotation.XmlRootElement;
 import java.io.Serializable;
 import java.util.ArrayList;
@@ -112,7 +114,7 @@ public class RemoteRepository
                              int timeout )
     {
         super( id, name, layout );
-        this.url = url;
+        this.url = StringUtils.stripEnd(url,"/");
         this.userName = userName;
         this.password = password;
         this.timeout = timeout;
@@ -135,7 +137,7 @@ public class RemoteRepository
 
     public void setUrl( String url )
     {
-        this.url = url;
+        this.url = StringUtils.stripEnd(url,"/");
     }
 
     public String getUserName()
index 5a7948719e184f0d5e9df53eb1af5ed45b3b0b90..a6b341aa7ef62d8fb4b6f235a348cf8e71d08964 100644 (file)
@@ -38,11 +38,14 @@ import org.apache.maven.wagon.proxy.ProxyInfo;
 import org.apache.maven.wagon.repository.Repository;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.ws.rs.core.Response;
 import java.net.URL;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author Olivier Lamy
@@ -67,6 +70,16 @@ public class DefaultRemoteRepositoriesService
     int checkReadTimeout = 10000;
     int checkTimeout = 9000;
 
+    // TODO: make this configurable
+    private Map<String,String> remoteConnectivityCheckPaths = new HashMap<>();
+
+    @PostConstruct
+    private void init() {
+        // default initialization for known servers
+        remoteConnectivityCheckPaths.put("http://download.oracle.com/maven","com/sleepycat/je/license.txt");
+        remoteConnectivityCheckPaths.put("https://download.oracle.com/maven","com/sleepycat/je/license.txt");
+    }
+
     @Override
     public List<RemoteRepository> getRemoteRepositories()
         throws ArchivaRestServiceException
@@ -197,12 +210,17 @@ public class DefaultRemoteRepositoriesService
                 proxyInfo.setUserName( networkProxy.getUsername() );
                 proxyInfo.setPassword( networkProxy.getPassword() );
             }            
+            String url = StringUtils.stripEnd(remoteRepository.getUrl(),"/");
+            wagon.connect( new Repository( remoteRepository.getId(), url ), proxyInfo );
 
-            wagon.connect( new Repository( remoteRepository.getId(), remoteRepository.getUrl() ), proxyInfo );
-
-            // we only check connectivity as remote repo can be empty
-            // MRM-1909: Wagon implementation appends a slash already
-            wagon.getFileList( "" );
+            // MRM-1933, there are certain servers that do not allow browsing
+            if (remoteConnectivityCheckPaths.containsKey(url)) {
+                return wagon.resourceExists(remoteConnectivityCheckPaths.get(url));
+            } else {
+                // we only check connectivity as remote repo can be empty
+                // MRM-1909: Wagon implementation appends a slash already
+                wagon.getFileList("");
+            }
 
             return Boolean.TRUE;
         }
@@ -213,8 +231,10 @@ public class DefaultRemoteRepositoriesService
         }
         catch ( Exception e )
         {
-            throw new ArchivaRestServiceException( e.getMessage(),
-                                                   Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), e );
+            // This service returns either true or false, Exception cannot be handled by the clients
+            log.debug("Exception occured on connectivity test.", e);
+            log.info("Connection exception: {}", e.getMessage());
+            return Boolean.FALSE;
         }
 
     }
@@ -234,4 +254,12 @@ public class DefaultRemoteRepositoriesService
     public void setCheckTimeout(int checkTimeout) {
         this.checkTimeout = checkTimeout;
     }
+
+    public Map<String, String> getRemoteConnectivityCheckPaths() {
+        return remoteConnectivityCheckPaths;
+    }
+
+    public void setRemoteConnectivityCheckPaths(Map<String, String> remoteConnectivityCheckPaths) {
+        this.remoteConnectivityCheckPaths = remoteConnectivityCheckPaths;
+    }
 }
index 3d284e452697ded0e6f9b9e67debc3b7d77948ec..d3d66728338ee3228078f562decfc47828a9e21c 100644 (file)
@@ -161,10 +161,62 @@ public class RemoteRepositoriesServiceTest
 
     }
 
+    /*
+     * Check maven repository
+     */
+    @Test
+    public void checkRemoteConnectivity2()
+            throws Exception {
+        RemoteRepositoriesService service = getRemoteRepositoriesService();
+
+        WebClient.client(service).header("Authorization", authorizationHeader);
+
+        int initialSize = service.getRemoteRepositories().size();
+
+        service.addRemoteRepository(getRemoteMavenRepository());
+
+        assertTrue(service.checkRemoteConnectivity("id-maven1"));
+
+    }
+
+
+    /*
+     *  Check oracle repository that allows not browsing (MRM-1933)
+     */
+    @Test
+    public void checkRemoteConnectivity3()
+            throws Exception {
+        RemoteRepositoriesService service = getRemoteRepositoriesService();
+
+        WebClient.client(service).header("Authorization", authorizationHeader);
+        WebClient.client(service).accept("application/json");
+
+        int initialSize = service.getRemoteRepositories().size();
+
+        service.addRemoteRepository(getRemoteOracleRepository());
+
+        assertTrue(service.checkRemoteConnectivity("id-oracle"));
+
+    }
+
     RemoteRepository getRemoteRepository()
     {
         return new RemoteRepository( "id-new", "new one", "http://foo.com", "default", "foo", "foopassword", 120,
                                      "cool repo" );
     }
 
+
+    RemoteRepository getRemoteMavenRepository()
+    {
+        return new RemoteRepository( "id-maven1", "Maven1", "http://repo.maven.apache.org/maven2", "default", "foo", "foopassword", 120,
+                "cool repo3" );
+    }
+
+
+    RemoteRepository getRemoteOracleRepository()
+    {
+        return new RemoteRepository( "id-oracle", "Oracle", "http://download.oracle.com/maven", "default", "foo", "foopassword", 120,
+                "cool repo4" );
+    }
+
 }