Skip to content

Commit deca9de

Browse files
committed
Use records
1 parent 01a6383 commit deca9de

File tree

5 files changed

+223
-253
lines changed

5 files changed

+223
-253
lines changed

api/maven-api-core/src/main/java/org/apache/maven/api/Lifecycle.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,9 @@ interface Phase {
172172
* @return a stream of all phases
173173
*/
174174
@Nonnull
175-
Stream<Phase> allPhases();
175+
default Stream<Phase> allPhases() {
176+
return Stream.concat(Stream.of(this), phases().stream().flatMap(Lifecycle.Phase::allPhases));
177+
}
176178
}
177179

178180
/**

impl/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultLifecycleRegistry.java

Lines changed: 79 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import java.util.Collections;
2929
import java.util.HashSet;
3030
import java.util.Iterator;
31-
import java.util.LinkedHashMap;
3231
import java.util.List;
3332
import java.util.Map;
3433
import java.util.Objects;
@@ -213,100 +212,95 @@ public Collection<Lifecycle> provides() {
213212
.filter(id -> !Lifecycle.CLEAN.equals(id)
214213
&& !Lifecycle.DEFAULT.equals(id)
215214
&& !Lifecycle.SITE.equals(id))
216-
.map(id -> wrap(all.get(id)))
215+
.map(id -> (Lifecycle) new WrappedLifecycle(all.get(id)))
217216
.toList();
218217
} catch (ComponentLookupException e) {
219218
throw new LookupException(e);
220219
}
221220
}
221+
}
222222

223-
private Lifecycle wrap(org.apache.maven.lifecycle.Lifecycle lifecycle) {
224-
return new Lifecycle() {
225-
@Override
226-
public String id() {
227-
return lifecycle.getId();
228-
}
223+
/**
224+
* Record implementation of Lifecycle.Phase for wrapped phases.
225+
*
226+
* @param name The name of the phase
227+
* @param prev The name of the previous phase (may be null)
228+
* @param lifecycle The original Maven 3 lifecycle
229+
*/
230+
record WrappedPhase(String name, String prev, org.apache.maven.lifecycle.Lifecycle lifecycle)
231+
implements Lifecycle.Phase {
232+
/**
233+
* Compact constructor with null validation.
234+
*/
235+
WrappedPhase {
236+
Objects.requireNonNull(name, "name cannot be null");
237+
Objects.requireNonNull(lifecycle, "lifecycle cannot be null");
238+
// prev can be null for the first phase
239+
}
229240

230-
@Override
231-
public Collection<Phase> phases() {
232-
List<String> names = lifecycle.getPhases();
233-
List<Phase> phases = new ArrayList<>();
234-
for (int i = 0; i < names.size(); i++) {
235-
String name = names.get(i);
236-
String prev = i > 0 ? names.get(i - 1) : null;
237-
phases.add(new Phase() {
238-
@Override
239-
public String name() {
240-
return name;
241-
}
242-
243-
@Override
244-
public List<Phase> phases() {
245-
return List.of();
246-
}
247-
248-
@Override
249-
public Stream<Phase> allPhases() {
250-
return Stream.concat(
251-
Stream.of(this), phases().stream().flatMap(Lifecycle.Phase::allPhases));
252-
}
253-
254-
@Override
255-
public List<Plugin> plugins() {
256-
Map<String, LifecyclePhase> lfPhases = lifecycle.getDefaultLifecyclePhases();
257-
LifecyclePhase phase = lfPhases != null ? lfPhases.get(name) : null;
258-
if (phase != null) {
259-
Map<String, Plugin> plugins = new LinkedHashMap<>();
260-
DefaultPackagingRegistry.parseLifecyclePhaseDefinitions(plugins, name, phase);
261-
return plugins.values().stream().toList();
262-
}
263-
return List.of();
264-
}
265-
266-
@Override
267-
public Collection<Link> links() {
268-
if (prev == null) {
269-
return List.of();
270-
} else {
271-
return List.of(new Link() {
272-
@Override
273-
public Kind kind() {
274-
return Kind.AFTER;
275-
}
276-
277-
@Override
278-
public Pointer pointer() {
279-
return new Pointer() {
280-
@Override
281-
public String phase() {
282-
return prev;
283-
}
284-
285-
@Override
286-
public Type type() {
287-
return Type.PROJECT;
288-
}
289-
};
290-
}
291-
});
292-
}
293-
}
294-
});
295-
}
296-
return phases;
297-
}
241+
@Override
242+
@Nonnull
243+
public List<Lifecycle.Phase> phases() {
244+
return List.of();
245+
}
298246

299-
@Override
300-
public Collection<Alias> aliases() {
301-
return Collections.emptyList();
302-
}
303-
};
247+
@Override
248+
@Nonnull
249+
public List<Plugin> plugins() {
250+
Map<String, LifecyclePhase> lfPhases = lifecycle.getDefaultLifecyclePhases();
251+
return lfPhases != null
252+
? List.copyOf(DefaultPackagingRegistry.parseLifecyclePhaseDefinitions(lfPhases))
253+
: List.of();
254+
}
255+
256+
@Override
257+
@Nonnull
258+
public Collection<Lifecycle.Link> links() {
259+
if (prev == null) {
260+
return List.of();
261+
} else {
262+
return List.of(new Lifecycles.DefaultLink(
263+
Lifecycle.Link.Kind.AFTER, new Lifecycles.DefaultPhasePointer(prev)));
264+
}
304265
}
305266
}
306267

307-
static class WrappedLifecycle extends org.apache.maven.lifecycle.Lifecycle {
308-
WrappedLifecycle(LifecycleRegistry registry, Lifecycle lifecycle) {
309-
super(registry, lifecycle);
268+
/**
269+
* Record implementation of Lifecycle for wrapped lifecycles.
270+
*
271+
* @param lifecycle The original Maven 3 lifecycle
272+
*/
273+
record WrappedLifecycle(org.apache.maven.lifecycle.Lifecycle lifecycle) implements Lifecycle {
274+
/**
275+
* Compact constructor with null validation.
276+
*/
277+
WrappedLifecycle {
278+
Objects.requireNonNull(lifecycle, "lifecycle cannot be null");
279+
}
280+
281+
@Override
282+
@Nonnull
283+
public String id() {
284+
return lifecycle.getId();
285+
}
286+
287+
@Override
288+
@Nonnull
289+
public Collection<Phase> phases() {
290+
List<String> names = lifecycle.getPhases();
291+
List<Phase> phases = new ArrayList<>();
292+
for (int i = 0; i < names.size(); i++) {
293+
String name = names.get(i);
294+
String prev = i > 0 ? names.get(i - 1) : null;
295+
phases.add(new WrappedPhase(name, prev, lifecycle));
296+
}
297+
return phases;
298+
}
299+
300+
@Override
301+
@Nonnull
302+
public Collection<Alias> aliases() {
303+
return List.of();
310304
}
311305
}
312306

@@ -324,7 +318,7 @@ abstract static class BaseLifecycleProvider implements Provider<org.apache.maven
324318
public org.apache.maven.lifecycle.Lifecycle get() {
325319
try {
326320
LifecycleRegistry registry = lookup.lookup(LifecycleRegistry.class);
327-
return new WrappedLifecycle(registry, registry.require(name));
321+
return new org.apache.maven.lifecycle.Lifecycle(registry, registry.require(name));
328322
} catch (ComponentLookupException e) {
329323
throw new LookupException(e);
330324
}

impl/maven-core/src/main/java/org/apache/maven/internal/impl/DefaultPackagingRegistry.java

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@
2323
import javax.inject.Singleton;
2424

2525
import java.util.ArrayList;
26-
import java.util.HashMap;
26+
import java.util.Collection;
27+
import java.util.LinkedHashMap;
2728
import java.util.List;
2829
import java.util.Locale;
2930
import java.util.Map;
@@ -73,41 +74,34 @@ public DefaultPackagingRegistry(Lookup lookup, TypeRegistry typeRegistry, List<P
7374

7475
@Override
7576
public Optional<Packaging> lookup(String id) {
76-
id = id.toLowerCase(Locale.ROOT);
77+
String lid = id.toLowerCase(Locale.ROOT);
7778
// TODO: we should be able to inject a Map<String, LifecycleMapping> directly,
7879
// however, SISU visibility filtering can only happen when an explicit
7980
// lookup is performed. The whole problem here is caused by "project extensions"
8081
// which are bound to a project's classloader, without any clear definition
8182
// of a "project scope"
82-
LifecycleMapping lifecycleMapping =
83-
lookup.lookupOptional(LifecycleMapping.class, id).orElse(null);
84-
if (lifecycleMapping == null) {
85-
return Optional.empty();
86-
}
87-
Type type = typeRegistry.lookup(id).orElse(null);
88-
if (type == null) {
89-
return Optional.empty();
90-
}
91-
return Optional.of(new DefaultPackaging(id, type, getPlugins(lifecycleMapping)));
83+
return lookup.lookupOptional(LifecycleMapping.class, lid).flatMap(lifecycleMapping -> typeRegistry
84+
.lookup(lid)
85+
.map(type -> new DefaultPackaging(lid, type, getPlugins(lifecycleMapping))));
9286
}
9387

9488
private Map<String, PluginContainer> getPlugins(LifecycleMapping lifecycleMapping) {
95-
Map<String, PluginContainer> lfs = new HashMap<>();
96-
lifecycleMapping.getLifecycles().forEach((id, lifecycle) -> {
97-
Map<String, Plugin> plugins = new HashMap<>();
98-
lifecycle
99-
.getLifecyclePhases()
100-
.forEach((phase, lifecyclePhase) -> parseLifecyclePhaseDefinitions(plugins, phase, lifecyclePhase));
101-
lfs.put(id, PluginContainer.newBuilder().plugins(plugins.values()).build());
102-
});
103-
return lfs;
89+
return lifecycleMapping.getLifecycles().entrySet().stream()
90+
.collect(Collectors.toMap(Map.Entry::getKey, e -> PluginContainer.newBuilder()
91+
.plugins(parseLifecyclePhaseDefinitions(e.getValue().getLifecyclePhases()))
92+
.build()));
10493
}
10594

106-
static void parseLifecyclePhaseDefinitions(Map<String, Plugin> plugins, String phase, LifecyclePhase goals) {
95+
static Collection<Plugin> parseLifecyclePhaseDefinitions(Map<String, LifecyclePhase> phases) {
10796
InputLocation location = DefaultLifecycleRegistry.DEFAULT_LIFECYCLE_INPUT_LOCATION;
97+
Map<String, Plugin> plugins = new LinkedHashMap<>();
98+
99+
phases.forEach((phase, goals) -> {
100+
List<LifecycleMojo> mojos = goals.getMojos();
101+
if (mojos == null) {
102+
return;
103+
}
108104

109-
List<LifecycleMojo> mojos = goals.getMojos();
110-
if (mojos != null) {
111105
for (int i = 0; i < mojos.size(); i++) {
112106
LifecycleMojo mojo = mojos.get(i);
113107

@@ -181,7 +175,9 @@ static void parseLifecyclePhaseDefinitions(Map<String, Plugin> plugins, String p
181175

182176
plugins.put(key, plugin);
183177
}
184-
}
178+
});
179+
180+
return plugins.values();
185181
}
186182

187183
private static String getExecutionId(Plugin plugin, String goal) {

0 commit comments

Comments
 (0)