2222import java .util .List ;
2323import java .util .Map ;
2424
25+ import org .apache .maven .model .Model ;
26+ import org .apache .maven .model .building .DefaultModelBuilder ;
27+ import org .apache .maven .model .building .DefaultModelBuilderFactory ;
28+ import org .apache .maven .model .building .DefaultModelBuildingRequest ;
29+ import org .apache .maven .model .building .ModelBuildingException ;
30+ import org .apache .maven .model .resolution .ModelResolver ;
31+ import org .apache .maven .project .ProjectBuildingRequest ;
32+ import org .apache .maven .project .ProjectModelResolver ;
2533import org .apache .maven .repository .internal .MavenRepositorySystemUtils ;
2634import org .eclipse .aether .DefaultRepositorySystemSession ;
2735import org .eclipse .aether .RepositorySystem ;
2836import org .eclipse .aether .RepositorySystemSession ;
37+ import org .eclipse .aether .RequestTrace ;
2938import org .eclipse .aether .artifact .DefaultArtifact ;
3039import org .eclipse .aether .connector .basic .BasicRepositoryConnectorFactory ;
3140import org .eclipse .aether .graph .Dependency ;
3241import org .eclipse .aether .impl .DefaultServiceLocator ;
42+ import org .eclipse .aether .impl .RemoteRepositoryManager ;
3343import org .eclipse .aether .internal .impl .DefaultRepositorySystem ;
3444import org .eclipse .aether .repository .LocalRepository ;
3545import org .eclipse .aether .repository .LocalRepositoryManager ;
3646import org .eclipse .aether .repository .RemoteRepository ;
3747import org .eclipse .aether .resolution .ArtifactDescriptorException ;
3848import org .eclipse .aether .resolution .ArtifactDescriptorRequest ;
3949import org .eclipse .aether .resolution .ArtifactDescriptorResult ;
50+ import org .eclipse .aether .resolution .ArtifactRequest ;
51+ import org .eclipse .aether .resolution .ArtifactResolutionException ;
52+ import org .eclipse .aether .resolution .ArtifactResult ;
4053import org .eclipse .aether .spi .connector .RepositoryConnectorFactory ;
4154import org .eclipse .aether .spi .connector .transport .TransporterFactory ;
4255import org .eclipse .aether .spi .locator .ServiceLocator ;
4356import org .eclipse .aether .transport .http .HttpTransporterFactory ;
4457import org .eclipse .aether .util .repository .SimpleArtifactDescriptorPolicy ;
4558
4659/**
47- * A {@link DependencyManagementVersionResolver } that resolves versions using Maven
48- * Resolver. Maven's default {@link LocalRepositoryManager} implementation is not
49- * thread-safe. To avoid corruption of the local repository, interaction with the
50- * {@link RepositorySystem} is single-threaded.
60+ * A {@link MavenVersionResolver } that resolves versions using Maven Resolver. Maven's
61+ * default {@link LocalRepositoryManager} implementation is not thread-safe. To avoid
62+ * corruption of the local repository, interaction with the {@link RepositorySystem} is
63+ * single-threaded.
5164 *
5265 * @author Andy Wilkinson
66+ * @author Stephane Nicoll
5367 */
54- class MavenResolverDependencyManagementVersionResolver implements DependencyManagementVersionResolver {
68+ @ SuppressWarnings ("removal" )
69+ class DefaultMavenVersionResolver implements MavenVersionResolver , DependencyManagementVersionResolver {
5570
5671 private static final RemoteRepository mavenCentral = new RemoteRepository .Builder ("central" , "default" ,
5772 "https://repo1.maven.org/maven2" )
@@ -72,9 +87,11 @@ class MavenResolverDependencyManagementVersionResolver implements DependencyMana
7287
7388 private final RepositorySystemSession repositorySystemSession ;
7489
90+ private final RemoteRepositoryManager remoteRepositoryManager ;
91+
7592 private final RepositorySystem repositorySystem ;
7693
77- MavenResolverDependencyManagementVersionResolver (Path cacheLocation ) {
94+ DefaultMavenVersionResolver (Path cacheLocation ) {
7895 ServiceLocator serviceLocator = createServiceLocator ();
7996 DefaultRepositorySystemSession session = MavenRepositorySystemUtils .newSession ();
8097 session .setArtifactDescriptorPolicy (new SimpleArtifactDescriptorPolicy (false , false ));
@@ -84,10 +101,16 @@ class MavenResolverDependencyManagementVersionResolver implements DependencyMana
84101 session .setUserProperties (System .getProperties ());
85102 session .setReadOnly ();
86103 this .repositorySystemSession = session ;
104+ this .remoteRepositoryManager = serviceLocator .getService (RemoteRepositoryManager .class );
87105 }
88106
89107 @ Override
90108 public Map <String , String > resolve (String groupId , String artifactId , String version ) {
109+ return resolveDependencies (groupId , artifactId , version );
110+ }
111+
112+ @ Override
113+ public Map <String , String > resolveDependencies (String groupId , String artifactId , String version ) {
91114 ArtifactDescriptorResult bom = resolveBom (groupId , artifactId , version );
92115 Map <String , String > managedVersions = new HashMap <>();
93116 bom .getManagedDependencies ()
@@ -98,6 +121,18 @@ public Map<String, String> resolve(String groupId, String artifactId, String ver
98121 return managedVersions ;
99122 }
100123
124+ @ Override
125+ public Map <String , String > resolvePlugins (String groupId , String artifactId , String version ) {
126+ Model model = buildEffectiveModel (groupId , artifactId , version );
127+ Map <String , String > managedPluginVersions = new HashMap <>();
128+ model .getBuild ()
129+ .getPluginManagement ()
130+ .getPlugins ()
131+ .forEach ((plugin ) -> managedPluginVersions .putIfAbsent (plugin .getGroupId () + ":" + plugin .getArtifactId (),
132+ plugin .getVersion ()));
133+ return managedPluginVersions ;
134+ }
135+
101136 private ArtifactDescriptorResult resolveBom (String groupId , String artifactId , String version ) {
102137 synchronized (this .monitor ) {
103138 try {
@@ -112,6 +147,40 @@ private ArtifactDescriptorResult resolveBom(String groupId, String artifactId, S
112147 }
113148 }
114149
150+ private Model buildEffectiveModel (String groupId , String artifactId , String version ) {
151+ try {
152+ ArtifactResult bom = resolvePom (groupId , artifactId , version );
153+ RequestTrace requestTrace = new RequestTrace (null );
154+
155+ ModelResolver modelResolver = new ProjectModelResolver (this .repositorySystemSession , requestTrace ,
156+ this .repositorySystem , this .remoteRepositoryManager , repositories ,
157+ ProjectBuildingRequest .RepositoryMerging .POM_DOMINANT , null );
158+ DefaultModelBuildingRequest modelBuildingRequest = new DefaultModelBuildingRequest ();
159+ modelBuildingRequest .setSystemProperties (System .getProperties ());
160+ modelBuildingRequest .setPomFile (bom .getArtifact ().getFile ());
161+ modelBuildingRequest .setModelResolver (modelResolver );
162+ DefaultModelBuilder modelBuilder = new DefaultModelBuilderFactory ().newInstance ();
163+ return modelBuilder .build (modelBuildingRequest ).getEffectiveModel ();
164+ }
165+ catch (ModelBuildingException ex ) {
166+ throw new IllegalStateException (
167+ "Model for '" + groupId + ":" + artifactId + ":" + version + "' could not be built" , ex );
168+ }
169+ }
170+
171+ private ArtifactResult resolvePom (String groupId , String artifactId , String version ) {
172+ synchronized (this .monitor ) {
173+ try {
174+ return this .repositorySystem .resolveArtifact (this .repositorySystemSession , new ArtifactRequest (
175+ new DefaultArtifact (groupId , artifactId , "pom" , version ), repositories , null ));
176+ }
177+ catch (ArtifactResolutionException ex ) {
178+ throw new IllegalStateException (
179+ "Pom '" + groupId + ":" + artifactId + ":" + version + "' could not be resolved" , ex );
180+ }
181+ }
182+ }
183+
115184 private static ServiceLocator createServiceLocator () {
116185 DefaultServiceLocator locator = MavenRepositorySystemUtils .newServiceLocator ();
117186 locator .addService (RepositorySystem .class , DefaultRepositorySystem .class );
0 commit comments