Explicitly apply mirror and auth settings to remote repos in the CLI

Previously, the CLI relied on Aether using the session's mirror
selector and authentication selector to customize the configured
repositories. These selectors are only used to configure what Aether
calls recessive repositories (repositories discovered when resolving
an artifact), rather than the explicitly configured repositories that
are typically used.

This commit updates AetherGrapeEngine to apply mirror and
authentication configuration to every added repository, bringing its
behaviour for these two settings into line with what it already does
for proxy configuration.

Fixes #1354
pull/1487/merge
Andy Wilkinson 10 years ago
parent 8e84151f8f
commit 5f9fddd44a

@ -263,12 +263,41 @@ public class AetherGrapeEngine implements GrapeEngine {
if (this.repositories.contains(repository)) {
return;
}
repository = getPossibleMirror(repository);
repository = applyProxy(repository);
repository = applyAuthentication(repository);
this.repositories.add(0, repository);
}
private RemoteRepository getPossibleMirror(RemoteRepository remoteRepository) {
RemoteRepository mirror = this.session.getMirrorSelector().getMirror(
remoteRepository);
if (mirror != null) {
return mirror;
}
return remoteRepository;
}
private RemoteRepository applyProxy(RemoteRepository repository) {
if (repository.getProxy() == null) {
RemoteRepository.Builder builder = new RemoteRepository.Builder(repository);
builder.setProxy(this.session.getProxySelector().getProxy(repository));
repository = builder.build();
}
this.repositories.add(0, repository);
return repository;
}
private RemoteRepository applyAuthentication(RemoteRepository repository) {
if (repository.getAuthentication() == null) {
RemoteRepository.Builder builder = new RemoteRepository.Builder(repository);
builder.setAuthentication(this.session.getAuthenticationSelector()
.getAuthentication(repository));
repository = builder.build();
}
return repository;
}
@Override

@ -58,12 +58,10 @@ import org.springframework.boot.cli.util.Log;
public class SettingsXmlRepositorySystemSessionAutoConfiguration implements
RepositorySystemSessionAutoConfiguration {
private static final String DEFAULT_HOME_DIR = System.getProperty("user.home");
private final String homeDir;
public SettingsXmlRepositorySystemSessionAutoConfiguration() {
this(DEFAULT_HOME_DIR);
this(System.getProperty("user.home"));
}
SettingsXmlRepositorySystemSessionAutoConfiguration(String homeDir) {

@ -18,19 +18,23 @@ package org.springframework.boot.cli.compiler.grape;
import groovy.lang.GroovyClassLoader;
import java.io.File;
import java.net.URI;
import java.net.URL;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.util.repository.JreProxySelector;
import org.eclipse.aether.repository.Authentication;
import org.eclipse.aether.repository.RemoteRepository;
import org.junit.Test;
import org.springframework.test.util.ReflectionTestUtils;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
/**
@ -42,10 +46,14 @@ public class AetherGrapeEngineTests {
private final GroovyClassLoader groovyClassLoader = new GroovyClassLoader();
private final AetherGrapeEngine grapeEngine = AetherGrapeEngineFactory.create(
this.groovyClassLoader, Arrays.asList(new RepositoryConfiguration("central",
URI.create("http://repo1.maven.org/maven2"), false)),
new DependencyResolutionContext());
private final AetherGrapeEngine grapeEngine = createGrapeEngine();
private AetherGrapeEngine createGrapeEngine() {
return AetherGrapeEngineFactory.create(this.groovyClassLoader, Arrays
.asList(new RepositoryConfiguration("central", URI
.create("http://repo1.maven.org/maven2"), false)),
new DependencyResolutionContext());
}
@Test
public void dependencyResolution() {
@ -59,10 +67,53 @@ public class AetherGrapeEngineTests {
@Test
public void proxySelector() {
DefaultRepositorySystemSession session = (DefaultRepositorySystemSession) ReflectionTestUtils
.getField(this.grapeEngine, "session");
assertTrue((session.getProxySelector() instanceof CompositeProxySelector)
|| (session.getProxySelector() instanceof JreProxySelector));
doWithCustomUserHome(new Runnable() {
@Override
public void run() {
AetherGrapeEngine grapeEngine = createGrapeEngine();
DefaultRepositorySystemSession session = (DefaultRepositorySystemSession) ReflectionTestUtils
.getField(grapeEngine, "session");
assertTrue(session.getProxySelector() instanceof CompositeProxySelector);
}
});
}
@Test
public void repositoryMirrors() {
doWithCustomUserHome(new Runnable() {
@SuppressWarnings("unchecked")
@Override
public void run() {
AetherGrapeEngine grapeEngine = createGrapeEngine();
List<RemoteRepository> repositories = (List<RemoteRepository>) ReflectionTestUtils
.getField(grapeEngine, "repositories");
assertEquals(1, repositories.size());
assertEquals("central-mirror", repositories.get(0).getId());
}
});
}
@Test
public void repositoryAuthentication() {
doWithCustomUserHome(new Runnable() {
@SuppressWarnings("unchecked")
@Override
public void run() {
AetherGrapeEngine grapeEngine = createGrapeEngine();
List<RemoteRepository> repositories = (List<RemoteRepository>) ReflectionTestUtils
.getField(grapeEngine, "repositories");
assertEquals(1, repositories.size());
Authentication authentication = repositories.get(0).getAuthentication();
assertNotNull(authentication);
}
});
}
@SuppressWarnings("unchecked")
@ -190,4 +241,26 @@ public class AetherGrapeEngineTests {
exclusion.put("module", module);
return exclusion;
}
private void doWithCustomUserHome(Runnable action) {
doWithSystemProperty("user.home",
new File("src/test/resources").getAbsolutePath(), action);
}
private void doWithSystemProperty(String key, String value, Runnable action) {
String previousValue = setOrClearSystemProperty(key, value);
try {
action.run();
}
finally {
setOrClearSystemProperty(key, previousValue);
}
}
private String setOrClearSystemProperty(String key, String value) {
if (value != null) {
return System.setProperty(key, value);
}
return System.clearProperty(key);
}
}

Loading…
Cancel
Save