/** * Copyright (c) 2010, 2014 Darmstadt University of Technology. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Andreas Sewe - initial API and implementation */ package org.eclipse.recommenders.internal.coordinates.rcp.maven; import static org.eclipse.recommenders.coordinates.maven.MavenCentralFingerprintSearchAdvisor.SEARCH_MAVEN_ORG; import java.net.URI; import javax.inject.Inject; import org.apache.commons.lang3.StringUtils; import org.eclipse.core.net.proxy.IProxyData; import org.eclipse.core.net.proxy.IProxyService; import org.eclipse.recommenders.coordinates.DependencyInfo; import org.eclipse.recommenders.coordinates.IProjectCoordinateAdvisor; import org.eclipse.recommenders.coordinates.ProjectCoordinate; import org.eclipse.recommenders.coordinates.maven.MavenCentralFingerprintSearchAdvisor; import org.eclipse.recommenders.utils.Urls; import com.google.common.base.Optional; public class EclipseMavenCentralFingerprintSearchAdvisor implements IProjectCoordinateAdvisor { private static final URI SEARCH_MAVEN_ORG_URI = Urls.toUri(SEARCH_MAVEN_ORG); private static final int DEFAULT_PROXY_PORT = 80; private final MavenCentralFingerprintSearchAdvisor delegate; private final IProxyService proxy; private ProxyConfig proxyConfig; @Inject public EclipseMavenCentralFingerprintSearchAdvisor(IProxyService proxy) { this.proxy = proxy; ProxyConfig newProxyConfig = updateProxyConfig(); delegate = new MavenCentralFingerprintSearchAdvisor(newProxyConfig.host, newProxyConfig.port, newProxyConfig.user, newProxyConfig.password); } @Override public Optional<ProjectCoordinate> suggest(DependencyInfo dependencyInfo) { ProxyConfig updatedProxyConfig = updateProxyConfig(); if (updatedProxyConfig != null) { delegate.setProxy(updatedProxyConfig.host, updatedProxyConfig.port, updatedProxyConfig.user, updatedProxyConfig.password); } return delegate.suggest(dependencyInfo); } private ProxyConfig updateProxyConfig() { final String currentProxyHost; final int currentProxyPort; final String currentProxyUser; final String currentProxyPassword; synchronized (proxy) { if (!proxy.isProxiesEnabled()) { currentProxyHost = null; currentProxyPort = -1; currentProxyUser = currentProxyPassword = null; } else { IProxyData[] entries = proxy.select(SEARCH_MAVEN_ORG_URI); if (entries.length == 0) { currentProxyHost = null; currentProxyPort = -1; currentProxyUser = currentProxyPassword = null; } else { IProxyData proxyData = entries[0]; currentProxyHost = proxyData.getHost(); currentProxyPort = proxyData.getPort() != -1 ? proxyData.getPort() : DEFAULT_PROXY_PORT; currentProxyUser = proxyData.getUserId(); currentProxyPassword = proxyData.getPassword(); } } } if (proxyConfig == null || !proxyConfig.isEqualTo(currentProxyHost, currentProxyPort, currentProxyUser, currentProxyPassword)) { proxyConfig = new ProxyConfig(currentProxyHost, currentProxyPort, currentProxyUser, currentProxyPassword); return proxyConfig; } else { return null; } } /** * Encapsulating the four-element proxy configuration in a value object ensures that any concurrent updates to it * are atomic. */ private static class ProxyConfig { private final String host; private final int port; private final String user; private final String password; public ProxyConfig(String host, int port, String user, String password) { this.host = host; this.port = port; this.user = user; this.password = password; } public boolean isEqualTo(String proxyHost, int proxyPort, String proxyUser, String proxyPassword) { return StringUtils.equals(host, proxyHost) && port == proxyPort && StringUtils.equals(user, proxyUser) && StringUtils.equals(password, proxyPassword); } } }