blob: f32ddde32e8f5841c70a93d2e8c6936b1236de2e [file] [log] [blame]
package org.apache.archiva.rest.services;
/*
* 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.archiva.admin.model.RepositoryAdminException;
import org.apache.archiva.admin.model.beans.RemoteRepository;
import org.apache.archiva.admin.model.remote.RemoteRepositoryAdmin;
import org.apache.archiva.proxy.ProxyRegistry;
import org.apache.archiva.proxy.maven.WagonFactory;
import org.apache.archiva.proxy.maven.WagonFactoryRequest;
import org.apache.archiva.proxy.model.NetworkProxy;
import org.apache.archiva.rest.api.services.ArchivaRestServiceException;
import org.apache.archiva.rest.api.services.RemoteRepositoriesService;
import org.apache.commons.lang3.StringUtils;
import org.apache.maven.wagon.TransferFailedException;
import org.apache.maven.wagon.Wagon;
import org.apache.maven.wagon.proxy.ProxyInfo;
import org.apache.maven.wagon.repository.Repository;
import org.apache.maven.wagon.shared.http.AbstractHttpClientWagon;
import org.apache.maven.wagon.shared.http.HttpConfiguration;
import org.apache.maven.wagon.shared.http.HttpMethodConfiguration;
import org.springframework.stereotype.Service;
import javax.inject.Inject;
import java.net.URL;
import java.util.Collections;
import java.util.List;
/**
* @author Olivier Lamy
* @since 1.4-M1
*/
@Service( "remoteRepositoriesService#rest" )
public class DefaultRemoteRepositoriesService
extends AbstractRestService
implements RemoteRepositoriesService {
@Inject
private RemoteRepositoryAdmin remoteRepositoryAdmin;
@Inject
private WagonFactory wagonFactory;
@Inject
private ProxyRegistry proxyRegistry;
int checkReadTimeout = 10000;
int checkTimeout = 9000;
@Override
public List<RemoteRepository> getRemoteRepositories()
throws ArchivaRestServiceException {
try {
List<RemoteRepository> remoteRepositories = remoteRepositoryAdmin.getRemoteRepositories();
return remoteRepositories == null ? Collections.<RemoteRepository>emptyList() : remoteRepositories;
} catch (RepositoryAdminException e) {
log.error(e.getMessage(), e);
throw new ArchivaRestServiceException(e.getMessage(), e.getFieldName(), e);
}
}
@Override
public RemoteRepository getRemoteRepository(String repositoryId)
throws ArchivaRestServiceException {
List<RemoteRepository> remoteRepositories = getRemoteRepositories();
for (RemoteRepository repository : remoteRepositories) {
if (StringUtils.equals(repositoryId, repository.getId())) {
return repository;
}
}
return null;
}
@Override
public Boolean deleteRemoteRepository(String repositoryId)
throws ArchivaRestServiceException {
try {
return remoteRepositoryAdmin.deleteRemoteRepository(repositoryId, getAuditInformation());
} catch (RepositoryAdminException e) {
log.error(e.getMessage(), e);
throw new ArchivaRestServiceException(e.getMessage(), e.getFieldName(), e);
}
}
@Override
public Boolean addRemoteRepository(RemoteRepository remoteRepository)
throws ArchivaRestServiceException {
try {
return remoteRepositoryAdmin.addRemoteRepository(remoteRepository, getAuditInformation());
} catch (RepositoryAdminException e) {
log.error(e.getMessage(), e);
throw new ArchivaRestServiceException(e.getMessage(), e.getFieldName(), e);
}
}
@Override
public Boolean updateRemoteRepository(RemoteRepository remoteRepository)
throws ArchivaRestServiceException {
try {
return remoteRepositoryAdmin.updateRemoteRepository(remoteRepository, getAuditInformation());
} catch (RepositoryAdminException e) {
log.error(e.getMessage(), e);
throw new ArchivaRestServiceException(e.getMessage(), e.getFieldName(), e);
}
}
@Override
public Boolean checkRemoteConnectivity(String repositoryId)
throws ArchivaRestServiceException {
try {
RemoteRepository remoteRepository = remoteRepositoryAdmin.getRemoteRepository(repositoryId);
if (remoteRepository == null) {
log.warn("Remote repository {} does not exist. Connectivity check returns false.", repositoryId);
return Boolean.FALSE;
}
NetworkProxy networkProxy = null;
if (StringUtils.isNotBlank(remoteRepository.getRemoteDownloadNetworkProxyId())) {
networkProxy = proxyRegistry.getNetworkProxy(remoteRepository.getRemoteDownloadNetworkProxyId());
if (networkProxy == null) {
log.warn(
"A network proxy {} was configured for repository {}. But the proxy with the given id does not exist.",
remoteRepository.getRemoteDownloadNetworkProxyId(), repositoryId);
}
}
String wagonProtocol = new URL(remoteRepository.getUrl()).getProtocol();
final Wagon wagon =
wagonFactory.getWagon(new WagonFactoryRequest(wagonProtocol, remoteRepository.getExtraHeaders()) //
.networkProxy(networkProxy));
// hardcoded value as it's a check of the remote repo connectivity
wagon.setReadTimeout(checkReadTimeout);
wagon.setTimeout(checkTimeout);
if (wagon instanceof AbstractHttpClientWagon ) {
HttpMethodConfiguration httpMethodConfiguration = new HttpMethodConfiguration() //
.setUsePreemptive(true) //
.setReadTimeout(checkReadTimeout);
HttpConfiguration httpConfiguration = new HttpConfiguration().setGet( httpMethodConfiguration);
AbstractHttpClientWagon.class.cast(wagon).setHttpConfiguration(httpConfiguration);
}
ProxyInfo proxyInfo = null;
if (networkProxy != null) {
proxyInfo = new ProxyInfo();
proxyInfo.setType(networkProxy.getProtocol());
proxyInfo.setHost(networkProxy.getHost());
proxyInfo.setPort(networkProxy.getPort());
proxyInfo.setUserName(networkProxy.getUsername());
proxyInfo.setPassword(new String(networkProxy.getPassword()));
}
String url = StringUtils.stripEnd(remoteRepository.getUrl(), "/");
wagon.connect(new Repository(remoteRepository.getId(), url), proxyInfo);
// MRM-1933, there are certain servers that do not allow browsing
if (!(StringUtils.isEmpty(remoteRepository.getCheckPath()) ||
"/".equals(remoteRepository.getCheckPath()))) {
return wagon.resourceExists(remoteRepository.getCheckPath());
} else {
// we only check connectivity as remote repo can be empty
// MRM-1909: Wagon implementation appends a slash already
wagon.getFileList("");
}
return Boolean.TRUE;
} catch (TransferFailedException e) {
log.info("TransferFailedException :{}", e.getMessage());
return Boolean.FALSE;
} catch (Exception 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;
}
}
public int getCheckReadTimeout() {
return checkReadTimeout;
}
public void setCheckReadTimeout(int checkReadTimeout) {
this.checkReadTimeout = checkReadTimeout;
}
public int getCheckTimeout() {
return checkTimeout;
}
public void setCheckTimeout(int checkTimeout) {
this.checkTimeout = checkTimeout;
}
}