diff --git a/p2-maven-plugin/src/main/java/org/eclipse/tycho/p2maven/repository/DefaultMavenRepositorySettings.java b/p2-maven-plugin/src/main/java/org/eclipse/tycho/p2maven/repository/DefaultMavenRepositorySettings.java index 891205eeaa..5bd6a5c047 100644 --- a/p2-maven-plugin/src/main/java/org/eclipse/tycho/p2maven/repository/DefaultMavenRepositorySettings.java +++ b/p2-maven-plugin/src/main/java/org/eclipse/tycho/p2maven/repository/DefaultMavenRepositorySettings.java @@ -18,14 +18,16 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.stream.Stream; +import org.apache.maven.RepositoryUtils; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy; +import org.apache.maven.artifact.repository.MavenArtifactRepository; import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout; import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.LegacySupport; -import org.apache.maven.repository.RepositorySystem; import org.apache.maven.settings.Mirror; import org.apache.maven.settings.Server; import org.apache.maven.settings.Settings; @@ -36,6 +38,8 @@ import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable; import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException; import org.codehaus.plexus.util.StringUtils; +import org.eclipse.aether.RepositorySystemSession; +import org.eclipse.aether.repository.RemoteRepository; import org.eclipse.tycho.MavenRepositoryLocation; import org.eclipse.tycho.MavenRepositorySettings; import org.eclipse.tycho.p2maven.helper.SettingsDecrypterHelper; @@ -54,8 +58,6 @@ public class DefaultMavenRepositorySettings implements MavenRepositorySettings, @Requirement private SettingsDecrypterHelper decrypter; - @Requirement - private RepositorySystem repositorySystem; @Requirement(hint = "p2") private ArtifactRepositoryLayout p2layout; @@ -65,13 +67,15 @@ public class DefaultMavenRepositorySettings implements MavenRepositorySettings, private List mirrors; + private RepositorySystemSession repositorySession; + public DefaultMavenRepositorySettings() { // for plexus } - public DefaultMavenRepositorySettings(RepositorySystem repositorySystem) { - // for test - this.repositorySystem = repositorySystem; + public DefaultMavenRepositorySettings(RepositorySystemSession repositorySystemSession) { + // for test + repositorySession = repositorySystemSession; } @Override @@ -82,7 +86,7 @@ public MavenRepositoryLocation getMirror(MavenRepositoryLocation location) { if (idToMirrorMap.containsKey(location.getId())) { return new MavenRepositoryLocation(location.getId(), idToMirrorMap.get(location.getId())); } - ArtifactRepository locationAsMavenRepository = repositorySystem.createArtifactRepository(location.getId(), + ArtifactRepository locationAsMavenRepository = new MavenArtifactRepository(location.getId(), location.getURL().toString(), p2layout, P2_REPOSITORY_POLICY, P2_REPOSITORY_POLICY); Mirror mirror = getTychoMirror(locationAsMavenRepository, mirrors); if (mirror != null) { @@ -109,7 +113,7 @@ public MavenRepositorySettings.Credentials getCredentials(MavenRepositoryLocatio public Mirror getTychoMirror(ArtifactRepository repository, List mirrors) { // if we find a mirror the default way (the maven way) we will use that mirror - Mirror mavenMirror = repositorySystem.getMirror(repository, mirrors); + Mirror mavenMirror = getMirror(repositorySession, RepositoryUtils.toRepo(repository)).orElse(null); if (mavenMirror != null || mirrors == null) { return mavenMirror; } @@ -154,6 +158,7 @@ public void initialize() throws InitializationException { if (session != null) { settings = session.getSettings(); mirrors = session.getRequest().getMirrors(); + repositorySession = session.getRepositorySession(); } else { settings = new Settings(); mirrors = Collections.emptyList(); @@ -164,4 +169,22 @@ public void initialize() throws InitializationException { public Stream getMirrors() { return mirrors.stream().map(m -> new MavenRepositoryLocation(m.getId(), URI.create(m.getUrl()))); } + + private static Optional getMirror(RepositorySystemSession session, RemoteRepository remoteRepository) { + if (session != null) { + org.eclipse.aether.repository.MirrorSelector selector = session.getMirrorSelector(); + if (selector != null) { + RemoteRepository repo = selector.getMirror(remoteRepository); + if (repo != null) { + Mirror mirror = new Mirror(); + mirror.setId(repo.getId()); + mirror.setUrl(repo.getUrl()); + mirror.setLayout(repo.getContentType()); + mirror.setBlocked(repo.isBlocked()); + return Optional.of(mirror); + } + } + } + return Optional.empty(); + } } diff --git a/tycho-core/src/test/java/org/eclipse/tycho/core/resolver/TychoMirrorSelectorTest.java b/tycho-core/src/test/java/org/eclipse/tycho/core/resolver/TychoMirrorSelectorTest.java index 2629a22151..d2d20a2533 100644 --- a/tycho-core/src/test/java/org/eclipse/tycho/core/resolver/TychoMirrorSelectorTest.java +++ b/tycho-core/src/test/java/org/eclipse/tycho/core/resolver/TychoMirrorSelectorTest.java @@ -15,22 +15,21 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import java.util.Arrays; -import java.util.List; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.repository.MavenArtifactRepository; -import org.apache.maven.repository.DefaultMirrorSelector; -import org.apache.maven.repository.RepositorySystem; import org.apache.maven.settings.Mirror; +import org.eclipse.aether.RepositorySystemSession; +import org.eclipse.aether.repository.MirrorSelector; +import org.eclipse.aether.repository.RemoteRepository; import org.eclipse.tycho.p2maven.repository.DefaultMavenRepositorySettings; import org.eclipse.tycho.p2maven.repository.P2ArtifactRepositoryLayout; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; public class TychoMirrorSelectorTest { @@ -38,17 +37,17 @@ public class TychoMirrorSelectorTest { @Before public void setup() { - RepositorySystem repo = mock(RepositorySystem.class); - doAnswer(new Answer() { + MirrorSelector ms = mock(MirrorSelector.class); + RepositorySystemSession repo = mock(RepositorySystemSession.class); + when(repo.getMirrorSelector()).thenReturn(ms); + doAnswer(invocation -> { - @SuppressWarnings("unchecked") - @Override - public Mirror answer(InvocationOnMock invocation) throws Throwable { - - final Object[] args = invocation.getArguments(); - return new DefaultMirrorSelector().getMirror((ArtifactRepository) args[0], (List) args[1]); + final Object[] args = invocation.getArguments(); + if (args[0] instanceof RemoteRepository rr && rr.getId().equals("neon-repo")) { + return new RemoteRepository.Builder("myId", rr.getContentType(), "http://foo.bar").build(); } - }).when(repo).getMirror(any(), any()); + return null; + }).when(ms).getMirror(any()); selector = new DefaultMavenRepositorySettings(repo); } @@ -59,7 +58,8 @@ public void testWithMatchingMirrorOfIds() { "https://download.eclipse.org/eclipse/update/4.6"); Mirror mirrorWithMatchingMirrorOfIds = createMirror("myId", "http://foo.bar", "neon-repo"); Mirror selectedMirror = selector.getTychoMirror(repository, Arrays.asList(mirrorWithMatchingMirrorOfIds)); - Assert.assertEquals(mirrorWithMatchingMirrorOfIds, selectedMirror); + Assert.assertEquals(mirrorWithMatchingMirrorOfIds.getId(), selectedMirror.getId()); + Assert.assertEquals(mirrorWithMatchingMirrorOfIds.getUrl(), selectedMirror.getUrl()); } @Test