Skip to content

Commit c53d5a0

Browse files
cstamasslawekjaranowski
authored andcommitted
Simplify prefix resolution
Simplify prefix resolution and drop use of BuildPluginManager (as descriptor will be re-resolved again later) and focus only on prefix to GA resolution, using a map of rules: * collect POM enlisted plugin groupId:artifactId pairs that come from non-settings-enlisted groupIDs (and allow only enlisted artifactIDs) * add settings enlisted plugin groupIds (keep their order) but "allow any" artifactId Using this map, figure out plugin GA from prefix using Maven metadata only. Fixes #11067 Backport of 2b7bb9c
1 parent 726de53 commit c53d5a0

File tree

1 file changed

+52
-72
lines changed

1 file changed

+52
-72
lines changed

maven-core/src/main/java/org/apache/maven/plugin/prefix/internal/DefaultPluginPrefixResolver.java

Lines changed: 52 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,14 @@
2121
import java.io.IOException;
2222
import java.util.ArrayList;
2323
import java.util.Collections;
24+
import java.util.HashSet;
25+
import java.util.LinkedHashMap;
2426
import java.util.List;
2527
import java.util.Map;
28+
import java.util.Set;
2629

2730
import org.apache.maven.artifact.repository.metadata.Metadata;
2831
import 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;
3332
import org.apache.maven.plugin.prefix.NoPluginFoundForPrefixException;
3433
import org.apache.maven.plugin.prefix.PluginPrefixRequest;
3534
import 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

Comments
 (0)