1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.cling;
20
21 import java.io.IOException;
22 import java.io.InputStream;
23 import java.io.OutputStream;
24
25 import org.apache.maven.api.annotations.Nullable;
26 import org.apache.maven.api.cli.Invoker;
27 import org.apache.maven.api.cli.InvokerException;
28 import org.apache.maven.api.cli.Parser;
29 import org.apache.maven.api.cli.ParserRequest;
30 import org.apache.maven.api.services.MessageBuilderFactory;
31 import org.apache.maven.cling.invoker.logging.SystemLogger;
32 import org.apache.maven.jline.JLineMessageBuilderFactory;
33 import org.codehaus.plexus.classworlds.ClassWorld;
34
35 import static java.util.Objects.requireNonNull;
36
37
38
39
40 public abstract class ClingSupport {
41 static final String CORE_CLASS_REALM_ID = "plexus.core";
42
43 protected final ClassWorld classWorld;
44 protected final boolean classWorldManaged;
45
46
47
48
49 public ClingSupport() {
50 this(new ClassWorld(CORE_CLASS_REALM_ID, Thread.currentThread().getContextClassLoader()), true);
51 }
52
53
54
55
56 public ClingSupport(ClassWorld classWorld) {
57 this(classWorld, false);
58 }
59
60 private ClingSupport(ClassWorld classWorld, boolean classWorldManaged) {
61 this.classWorld = requireNonNull(classWorld);
62 this.classWorldManaged = classWorldManaged;
63 }
64
65
66
67
68 public int run(
69 String[] args,
70 @Nullable InputStream stdIn,
71 @Nullable OutputStream stdOut,
72 @Nullable OutputStream stdErr,
73 boolean embedded)
74 throws IOException {
75 try (Invoker invoker = createInvoker()) {
76 return invoker.invoke(createParser()
77 .parseInvocation(createParserRequestBuilder(args)
78 .stdIn(stdIn)
79 .stdOut(stdOut)
80 .stdErr(stdErr)
81 .embedded(embedded)
82 .build()));
83 } catch (InvokerException.ExitException e) {
84 return e.getExitCode();
85 } catch (Exception e) {
86
87 new SystemLogger(stdErr).error(e.getMessage(), e);
88 return 1;
89 } finally {
90 if (classWorldManaged) {
91 classWorld.close();
92 }
93 }
94 }
95
96 protected MessageBuilderFactory createMessageBuilderFactory() {
97 return new JLineMessageBuilderFactory();
98 }
99
100 protected abstract Invoker createInvoker();
101
102 protected abstract Parser createParser();
103
104 protected abstract ParserRequest.Builder createParserRequestBuilder(String[] args);
105 }