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 ed13cd15ce..df69020077 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 c66670aad9..8d6f95603d 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 caa5deba67..deca0e325e 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); + } }