From 5f9fddd44aa9e5620334c1de0d911138cb9c4bb3 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Tue, 19 Aug 2014 16:27:21 +0100 Subject: [PATCH] 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 --- .../cli/compiler/grape/AetherGrapeEngine.java | 31 ++++++- ...ositorySystemSessionAutoConfiguration.java | 4 +- .../grape/AetherGrapeEngineTests.java | 91 +++++++++++++++++-- 3 files changed, 113 insertions(+), 13 deletions(-) diff --git a/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/grape/AetherGrapeEngine.java b/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/grape/AetherGrapeEngine.java index ed13cd15cea..df69020077f 100644 --- a/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/grape/AetherGrapeEngine.java +++ b/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/grape/AetherGrapeEngine.java @@ -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 diff --git a/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/grape/SettingsXmlRepositorySystemSessionAutoConfiguration.java b/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/grape/SettingsXmlRepositorySystemSessionAutoConfiguration.java index c66670aad95..8d6f95603d7 100644 --- a/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/grape/SettingsXmlRepositorySystemSessionAutoConfiguration.java +++ b/spring-boot-cli/src/main/java/org/springframework/boot/cli/compiler/grape/SettingsXmlRepositorySystemSessionAutoConfiguration.java @@ -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) { diff --git a/spring-boot-cli/src/test/java/org/springframework/boot/cli/compiler/grape/AetherGrapeEngineTests.java b/spring-boot-cli/src/test/java/org/springframework/boot/cli/compiler/grape/AetherGrapeEngineTests.java index caa5deba672..deca0e325e1 100644 --- a/spring-boot-cli/src/test/java/org/springframework/boot/cli/compiler/grape/AetherGrapeEngineTests.java +++ b/spring-boot-cli/src/test/java/org/springframework/boot/cli/compiler/grape/AetherGrapeEngineTests.java @@ -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 repositories = (List) 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 repositories = (List) 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); + } }