1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.cling.invoker.mvn.resident;
20
21 import java.util.ArrayList;
22 import java.util.concurrent.ConcurrentHashMap;
23
24 import org.apache.maven.api.cli.InvokerException;
25 import org.apache.maven.api.cli.InvokerRequest;
26 import org.apache.maven.api.services.Lookup;
27 import org.apache.maven.cling.invoker.mvn.MavenContext;
28 import org.apache.maven.cling.invoker.mvn.MavenInvoker;
29
30
31
32
33
34
35
36
37 public class ResidentMavenInvoker extends MavenInvoker {
38
39 private final ConcurrentHashMap<String, MavenContext> residentContext;
40
41 public ResidentMavenInvoker(Lookup protoLookup) {
42 super(protoLookup, null);
43 this.residentContext = new ConcurrentHashMap<>();
44 }
45
46 @Override
47 public void close() throws InvokerException {
48 ArrayList<Exception> exceptions = new ArrayList<>();
49 for (MavenContext context : residentContext.values()) {
50 try {
51 context.doCloseContainer();
52 } catch (Exception e) {
53 exceptions.add(e);
54 }
55 }
56 if (!exceptions.isEmpty()) {
57 InvokerException exception = new InvokerException("Could not cleanly shut down context pool");
58 exceptions.forEach(exception::addSuppressed);
59 throw exception;
60 }
61 }
62
63 @Override
64 protected MavenContext createContext(InvokerRequest invokerRequest) {
65
66
67 MavenContext result = residentContext.computeIfAbsent("resident", k -> new MavenContext(invokerRequest, false));
68 return copyIfDifferent(result, invokerRequest);
69 }
70
71 protected MavenContext copyIfDifferent(MavenContext mavenContext, InvokerRequest invokerRequest) {
72 if (invokerRequest == mavenContext.invokerRequest) {
73 return mavenContext;
74 }
75 MavenContext shadow = new MavenContext(invokerRequest, false);
76
77
78 shadow.containerCapsule = mavenContext.containerCapsule;
79 shadow.lookup = mavenContext.lookup;
80 shadow.eventSpyDispatcher = mavenContext.eventSpyDispatcher;
81 shadow.maven = mavenContext.maven;
82
83 return shadow;
84 }
85 }