1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.graph;
20
21 import java.io.File;
22 import java.util.ArrayList;
23 import java.util.HashSet;
24 import java.util.LinkedHashSet;
25 import java.util.List;
26 import java.util.Optional;
27 import java.util.Set;
28
29 import org.apache.maven.MavenExecutionException;
30 import org.apache.maven.execution.MavenExecutionRequest;
31 import org.apache.maven.project.MavenProject;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34
35
36
37
38
39 public final class ProjectSelector {
40 private static final Logger LOGGER = LoggerFactory.getLogger(ProjectSelector.class);
41
42 public Set<MavenProject> getRequiredProjectsBySelectors(
43 MavenExecutionRequest request, List<MavenProject> projects, Set<String> projectSelectors)
44 throws MavenExecutionException {
45 Set<MavenProject> selectedProjects = new LinkedHashSet<>();
46 File baseDirectory = getBaseDirectoryFromRequest(request);
47 for (String selector : projectSelectors) {
48 Optional<MavenProject> optSelectedProject =
49 findOptionalProjectBySelector(projects, baseDirectory, selector);
50 if (!optSelectedProject.isPresent()) {
51 String message = "Could not find the selected project in the reactor: " + selector;
52 throw new MavenExecutionException(message, request.getPom());
53 }
54
55 MavenProject selectedProject = optSelectedProject.get();
56
57 selectedProjects.add(selectedProject);
58 selectedProjects.addAll(getChildProjects(selectedProject, request));
59 }
60
61 return selectedProjects;
62 }
63
64 public Set<MavenProject> getOptionalProjectsBySelectors(
65 MavenExecutionRequest request, List<MavenProject> projects, Set<String> projectSelectors) {
66 Set<MavenProject> resolvedOptionalProjects = new LinkedHashSet<>();
67 Set<String> unresolvedOptionalSelectors = new HashSet<>();
68 File baseDirectory = getBaseDirectoryFromRequest(request);
69 for (String selector : projectSelectors) {
70 Optional<MavenProject> optSelectedProject =
71 findOptionalProjectBySelector(projects, baseDirectory, selector);
72 if (optSelectedProject.isPresent()) {
73 resolvedOptionalProjects.add(optSelectedProject.get());
74 resolvedOptionalProjects.addAll(getChildProjects(optSelectedProject.get(), request));
75 } else {
76 unresolvedOptionalSelectors.add(selector);
77 }
78 }
79
80 if (!unresolvedOptionalSelectors.isEmpty()) {
81 LOGGER.info("The requested optional projects {} do not exist.", unresolvedOptionalSelectors);
82 }
83
84 return resolvedOptionalProjects;
85 }
86
87 private List<MavenProject> getChildProjects(MavenProject parent, MavenExecutionRequest request) {
88 final List<MavenProject> children = parent.getCollectedProjects();
89 if (children != null && request.isRecursive()) {
90 return children;
91 } else {
92 return new ArrayList<>();
93 }
94 }
95
96 private Optional<MavenProject> findOptionalProjectBySelector(
97 List<MavenProject> projects, File reactorDirectory, String selector) {
98 return projects.stream()
99 .filter(project -> isMatchingProject(project, selector, reactorDirectory))
100 .findFirst();
101 }
102
103 File getBaseDirectoryFromRequest(MavenExecutionRequest request) {
104 return request.getBaseDirectory() != null ? new File(request.getBaseDirectory()) : null;
105 }
106
107 boolean isMatchingProject(MavenProject project, String selector, File reactorDirectory) {
108
109 if (selector.contains(":")) {
110 String id = ':' + project.getArtifactId();
111
112 if (id.equals(selector)) {
113 return true;
114 }
115
116 id = project.getGroupId() + id;
117
118 return id.equals(selector);
119 }
120
121
122 else if (reactorDirectory != null) {
123 File selectedProject =
124 new File(new File(reactorDirectory, selector).toURI().normalize());
125
126 if (selectedProject.isFile()) {
127 return selectedProject.equals(project.getFile());
128 } else if (selectedProject.isDirectory()) {
129 return selectedProject.equals(project.getBasedir());
130 }
131 }
132
133 return false;
134 }
135 }