2121import java .io .IOException ;
2222import java .util .ArrayList ;
2323import java .util .Collections ;
24+ import java .util .HashSet ;
25+ import java .util .LinkedHashMap ;
2426import java .util .List ;
2527import java .util .Map ;
28+ import java .util .Set ;
2629
2730import org .apache .maven .artifact .repository .metadata .Metadata ;
2831import org .apache .maven .artifact .repository .metadata .io .MetadataReader ;
29- import org .apache .maven .model .Build ;
30- import org .apache .maven .model .Plugin ;
31- import org .apache .maven .plugin .BuildPluginManager ;
32- import org .apache .maven .plugin .descriptor .PluginDescriptor ;
3332import org .apache .maven .plugin .prefix .NoPluginFoundForPrefixException ;
3433import org .apache .maven .plugin .prefix .PluginPrefixRequest ;
3534import org .apache .maven .plugin .prefix .PluginPrefixResolver ;
@@ -65,9 +64,6 @@ public class DefaultPluginPrefixResolver implements PluginPrefixResolver {
6564 @ Requirement
6665 private Logger logger ;
6766
68- @ Requirement
69- private BuildPluginManager pluginManager ;
70-
7167 @ Requirement
7268 private RepositorySystem repositorySystem ;
7369
@@ -77,76 +73,55 @@ public class DefaultPluginPrefixResolver implements PluginPrefixResolver {
7773 public PluginPrefixResult resolve (PluginPrefixRequest request ) throws NoPluginFoundForPrefixException {
7874 logger .debug ("Resolving plugin prefix " + request .getPrefix () + " from " + request .getPluginGroups ());
7975
80- PluginPrefixResult result = resolveFromProject (request );
81-
82- if (result == null ) {
83- result = resolveFromRepository (request );
84-
85- if (result == null ) {
86- throw new NoPluginFoundForPrefixException (
87- request .getPrefix (),
88- request .getPluginGroups (),
89- request .getRepositorySession ().getLocalRepository (),
90- request .getRepositories ());
91- } else if (logger .isDebugEnabled ()) {
92- logger .debug ("Resolved plugin prefix " + request .getPrefix () + " to " + result .getGroupId () + ":"
93- + result .getArtifactId () + " from repository "
94- + (result .getRepository () != null
95- ? result .getRepository ().getId ()
96- : "null" ));
76+ // map of groupId -> Set(artifactId) plugin candidates:
77+ // if value is null, keys are coming from settings, and no artifactId filtering is applied
78+ // if value is non-null: we allow only plugins that have enlisted artifactId only
79+ // ---
80+ // end game is: settings enlisted groupIds are obeying order and are "free for all" (artifactId)
81+ // while POM enlisted plugins coming from non-enlisted settings groupIds (ie conflict of prefixes)
82+ // will prevail/win.
83+ LinkedHashMap <String , Set <String >> candidates = new LinkedHashMap <>();
84+ if (request .getPom () != null ) {
85+ if (request .getPom ().getBuild () != null ) {
86+ request .getPom ().getBuild ().getPlugins ().stream ()
87+ .filter (p -> !request .getPluginGroups ().contains (p .getGroupId ()))
88+ .forEach (p -> candidates
89+ .computeIfAbsent (p .getGroupId (), g -> new HashSet <>())
90+ .add (p .getArtifactId ()));
91+ if (request .getPom ().getBuild ().getPluginManagement () != null ) {
92+ request .getPom ().getBuild ().getPluginManagement ().getPlugins ().stream ()
93+ .filter (p -> !request .getPluginGroups ().contains (p .getGroupId ()))
94+ .forEach (p -> candidates
95+ .computeIfAbsent (p .getGroupId (), g -> new HashSet <>())
96+ .add (p .getArtifactId ()));
97+ }
9798 }
98- } else if (logger .isDebugEnabled ()) {
99- logger .debug ("Resolved plugin prefix " + request .getPrefix () + " to " + result .getGroupId () + ":"
100- + result .getArtifactId () + " from POM " + request .getPom ());
10199 }
100+ request .getPluginGroups ().forEach (g -> candidates .put (g , null ));
101+ PluginPrefixResult result = resolveFromRepository (request , candidates );
102102
103- return result ;
104- }
105-
106- private PluginPrefixResult resolveFromProject (PluginPrefixRequest request ) {
107- PluginPrefixResult result = null ;
108-
109- if (request .getPom () != null && request .getPom ().getBuild () != null ) {
110- Build build = request .getPom ().getBuild ();
111-
112- result = resolveFromProject (request , build .getPlugins ());
113-
114- if (result == null && build .getPluginManagement () != null ) {
115- result = resolveFromProject (request , build .getPluginManagement ().getPlugins ());
116- }
103+ if (result == null ) {
104+ throw new NoPluginFoundForPrefixException (
105+ request .getPrefix (),
106+ new ArrayList <>(candidates .keySet ()),
107+ request .getRepositorySession ().getLocalRepository (),
108+ request .getRepositories ());
109+ } else {
110+ logger .debug (
111+ "Resolved plugin prefix " + request .getPrefix ()+ " to " + result .getGroupId () + ":" + result .getArtifactId () + " from repository " +
112+ (result .getRepository () != null ? result .getRepository ().getId () : "null" ));
117113 }
118114
119115 return result ;
120116 }
121117
122- private PluginPrefixResult resolveFromProject (PluginPrefixRequest request , List <Plugin > plugins ) {
123- for (Plugin plugin : plugins ) {
124- try {
125- PluginDescriptor pluginDescriptor =
126- pluginManager .loadPlugin (plugin , request .getRepositories (), request .getRepositorySession ());
127-
128- if (request .getPrefix ().equals (pluginDescriptor .getGoalPrefix ())) {
129- return new DefaultPluginPrefixResult (plugin );
130- }
131- } catch (Exception e ) {
132- if (logger .isDebugEnabled ()) {
133- logger .warn (
134- "Failed to retrieve plugin descriptor for " + plugin .getId () + ": " + e .getMessage (), e );
135- } else {
136- logger .warn ("Failed to retrieve plugin descriptor for " + plugin .getId () + ": " + e .getMessage ());
137- }
138- }
139- }
140-
141- return null ;
142- }
143-
144- private PluginPrefixResult resolveFromRepository (PluginPrefixRequest request ) {
118+ private PluginPrefixResult resolveFromRepository (
119+ PluginPrefixRequest request , LinkedHashMap <String , Set <String >> candidates ) {
145120 RequestTrace trace = RequestTrace .newChild (null , request );
146121
147122 List <MetadataRequest > requests = new ArrayList <>();
148123
149- for (String pluginGroup : request . getPluginGroups ()) {
124+ for (String pluginGroup : candidates . keySet ()) {
150125 org .eclipse .aether .metadata .Metadata metadata =
151126 new DefaultMetadata (pluginGroup , "maven-metadata.xml" , DefaultMetadata .Nature .RELEASE_OR_SNAPSHOT );
152127
@@ -162,7 +137,7 @@ private PluginPrefixResult resolveFromRepository(PluginPrefixRequest request) {
162137 List <MetadataResult > results = repositorySystem .resolveMetadata (request .getRepositorySession (), requests );
163138 requests .clear ();
164139
165- PluginPrefixResult result = processResults (request , trace , results , requests );
140+ PluginPrefixResult result = processResults (request , trace , results , requests , candidates );
166141
167142 if (result != null ) {
168143 return result ;
@@ -176,7 +151,7 @@ private PluginPrefixResult resolveFromRepository(PluginPrefixRequest request) {
176151
177152 results = repositorySystem .resolveMetadata (session , requests );
178153
179- return processResults (request , trace , results , null );
154+ return processResults (request , trace , results , null , candidates );
180155 }
181156
182157 return null ;
@@ -186,7 +161,8 @@ private PluginPrefixResult processResults(
186161 PluginPrefixRequest request ,
187162 RequestTrace trace ,
188163 List <MetadataResult > results ,
189- List <MetadataRequest > requests ) {
164+ List <MetadataRequest > requests ,
165+ LinkedHashMap <String , Set <String >> candidates ) {
190166 for (MetadataResult res : results ) {
191167 org .eclipse .aether .metadata .Metadata metadata = res .getMetadata ();
192168
@@ -197,7 +173,7 @@ private PluginPrefixResult processResults(
197173 }
198174
199175 PluginPrefixResult result =
200- resolveFromRepository (request , trace , metadata .getGroupId (), metadata , repository );
176+ resolveFromRepository (request , trace , metadata .getGroupId (), metadata , repository , candidates );
201177
202178 if (result != null ) {
203179 return result ;
@@ -217,18 +193,22 @@ private PluginPrefixResult resolveFromRepository(
217193 RequestTrace trace ,
218194 String pluginGroup ,
219195 org .eclipse .aether .metadata .Metadata metadata ,
220- ArtifactRepository repository ) {
196+ ArtifactRepository repository ,
197+ LinkedHashMap <String , Set <String >> candidates ) {
221198 if (metadata != null && metadata .getFile () != null && metadata .getFile ().isFile ()) {
222199 try {
223200 Map <String , ?> options = Collections .singletonMap (MetadataReader .IS_STRICT , Boolean .FALSE );
224201
225- Metadata pluginGroupMetadata = metadataReader .read (metadata .getFile (), options );
202+ Metadata pluginGroupMetadata =
203+ metadataReader .read (metadata .getFile (), options );
226204
227205 List <org .apache .maven .artifact .repository .metadata .Plugin > plugins = pluginGroupMetadata .getPlugins ();
228206
229207 if (plugins != null ) {
230208 for (org .apache .maven .artifact .repository .metadata .Plugin plugin : plugins ) {
231- if (request .getPrefix ().equals (plugin .getPrefix ())) {
209+ if (request .getPrefix ().equals (plugin .getPrefix ())
210+ && (candidates .get (pluginGroup ) == null
211+ || candidates .get (pluginGroup ).contains (plugin .getArtifactId ()))) {
232212 return new DefaultPluginPrefixResult (pluginGroup , plugin .getArtifactId (), repository );
233213 }
234214 }
0 commit comments