From 2bf5154f1366fc21c4ecb02ef4ef71ca6fdc5a45 Mon Sep 17 00:00:00 2001 From: Martin Stockhammer Date: Thu, 4 May 2017 00:22:31 +0200 Subject: [PATCH] MRM-1933, MRM-1940: Fixing repository check Remove trailing slashes from the remote repositories Use special check paths for certain servers --- .../admin/model/beans/RemoteRepository.java | 6 ++- .../DefaultRemoteRepositoriesService.java | 42 ++++++++++++--- .../RemoteRepositoriesServiceTest.java | 52 +++++++++++++++++++ 3 files changed, 91 insertions(+), 9 deletions(-) diff --git a/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-api/src/main/java/org/apache/archiva/admin/model/beans/RemoteRepository.java b/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-api/src/main/java/org/apache/archiva/admin/model/beans/RemoteRepository.java index db8021d86..fdab2432e 100644 --- a/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-api/src/main/java/org/apache/archiva/admin/model/beans/RemoteRepository.java +++ b/archiva-modules/archiva-base/archiva-repository-admin/archiva-repository-admin-api/src/main/java/org/apache/archiva/admin/model/beans/RemoteRepository.java @@ -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() diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRemoteRepositoriesService.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRemoteRepositoriesService.java index 5a7948719..a6b341aa7 100644 --- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRemoteRepositoriesService.java +++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRemoteRepositoriesService.java @@ -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 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 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 getRemoteConnectivityCheckPaths() { + return remoteConnectivityCheckPaths; + } + + public void setRemoteConnectivityCheckPaths(Map remoteConnectivityCheckPaths) { + this.remoteConnectivityCheckPaths = remoteConnectivityCheckPaths; + } } diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/RemoteRepositoriesServiceTest.java b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/RemoteRepositoriesServiceTest.java index 3d284e452..d3d667283 100644 --- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/RemoteRepositoriesServiceTest.java +++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/test/java/org/apache/archiva/rest/services/RemoteRepositoriesServiceTest.java @@ -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" ); + } + } -- 2.39.5