1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.jline;
20
21 import java.io.IOException;
22 import java.io.InputStream;
23 import java.io.OutputStream;
24 import java.io.PrintWriter;
25 import java.nio.charset.Charset;
26 import java.util.concurrent.Callable;
27 import java.util.concurrent.CompletableFuture;
28 import java.util.function.Consumer;
29 import java.util.function.IntConsumer;
30 import java.util.function.IntSupplier;
31
32 import org.apache.maven.api.services.MavenException;
33 import org.jline.terminal.Attributes;
34 import org.jline.terminal.Cursor;
35 import org.jline.terminal.MouseEvent;
36 import org.jline.terminal.Size;
37 import org.jline.terminal.Terminal;
38 import org.jline.terminal.spi.SystemStream;
39 import org.jline.terminal.spi.TerminalExt;
40 import org.jline.terminal.spi.TerminalProvider;
41 import org.jline.utils.ColorPalette;
42 import org.jline.utils.InfoCmp;
43 import org.jline.utils.NonBlockingReader;
44
45 public class FastTerminal implements TerminalExt {
46
47 private final CompletableFuture<Terminal> terminal;
48
49 public FastTerminal(Callable<Terminal> builder, Consumer<Terminal> consumer) {
50 this.terminal = new CompletableFuture<>();
51 new Thread(
52 () -> {
53 try {
54 Terminal term = builder.call();
55 consumer.accept(term);
56 terminal.complete(term);
57 } catch (Exception e) {
58 terminal.completeExceptionally(new MavenException(e));
59 }
60 },
61 "fast-terminal-thread")
62 .start();
63 }
64
65 public TerminalExt getTerminal() {
66 try {
67 return (TerminalExt) terminal.get();
68 } catch (Exception e) {
69 throw new RuntimeException(e);
70 }
71 }
72
73 @Override
74 public String getName() {
75 return getTerminal().getName();
76 }
77
78 @Override
79 public SignalHandler handle(Signal signal, SignalHandler signalHandler) {
80 return getTerminal().handle(signal, signalHandler);
81 }
82
83 @Override
84 public void raise(Signal signal) {
85 getTerminal().raise(signal);
86 }
87
88 @Override
89 public NonBlockingReader reader() {
90 return getTerminal().reader();
91 }
92
93 @Override
94 public PrintWriter writer() {
95 return getTerminal().writer();
96 }
97
98 @Override
99 public Charset encoding() {
100 return getTerminal().encoding();
101 }
102
103 @Override
104 public InputStream input() {
105 return getTerminal().input();
106 }
107
108 @Override
109 public OutputStream output() {
110 return getTerminal().output();
111 }
112
113 @Override
114 public boolean canPauseResume() {
115 return getTerminal().canPauseResume();
116 }
117
118 @Override
119 public void pause() {
120 getTerminal().pause();
121 }
122
123 @Override
124 public void pause(boolean b) throws InterruptedException {
125 getTerminal().pause(b);
126 }
127
128 @Override
129 public void resume() {
130 getTerminal().resume();
131 }
132
133 @Override
134 public boolean paused() {
135 return getTerminal().paused();
136 }
137
138 @Override
139 public Attributes enterRawMode() {
140 return getTerminal().enterRawMode();
141 }
142
143 @Override
144 public boolean echo() {
145 return getTerminal().echo();
146 }
147
148 @Override
149 public boolean echo(boolean b) {
150 return getTerminal().echo(b);
151 }
152
153 @Override
154 public Attributes getAttributes() {
155 return getTerminal().getAttributes();
156 }
157
158 @Override
159 public void setAttributes(Attributes attributes) {
160 getTerminal().setAttributes(attributes);
161 }
162
163 @Override
164 public Size getSize() {
165 return getTerminal().getSize();
166 }
167
168 @Override
169 public void setSize(Size size) {
170 getTerminal().setSize(size);
171 }
172
173 @Override
174 public int getWidth() {
175 return getTerminal().getWidth();
176 }
177
178 @Override
179 public int getHeight() {
180 return getTerminal().getHeight();
181 }
182
183 @Override
184 public Size getBufferSize() {
185 return getTerminal().getBufferSize();
186 }
187
188 @Override
189 public void flush() {
190 getTerminal().flush();
191 }
192
193 @Override
194 public String getType() {
195 return getTerminal().getType();
196 }
197
198 @Override
199 public boolean puts(InfoCmp.Capability capability, Object... objects) {
200 return getTerminal().puts(capability, objects);
201 }
202
203 @Override
204 public boolean getBooleanCapability(InfoCmp.Capability capability) {
205 return getTerminal().getBooleanCapability(capability);
206 }
207
208 @Override
209 public Integer getNumericCapability(InfoCmp.Capability capability) {
210 return getTerminal().getNumericCapability(capability);
211 }
212
213 @Override
214 public String getStringCapability(InfoCmp.Capability capability) {
215 return getTerminal().getStringCapability(capability);
216 }
217
218 @Override
219 public Cursor getCursorPosition(IntConsumer intConsumer) {
220 return getTerminal().getCursorPosition(intConsumer);
221 }
222
223 @Override
224 public boolean hasMouseSupport() {
225 return getTerminal().hasMouseSupport();
226 }
227
228 @Override
229 public boolean trackMouse(MouseTracking mouseTracking) {
230 return getTerminal().trackMouse(mouseTracking);
231 }
232
233 @Override
234 public MouseEvent readMouseEvent() {
235 return getTerminal().readMouseEvent();
236 }
237
238 @Override
239 public MouseEvent readMouseEvent(IntSupplier intSupplier) {
240 return getTerminal().readMouseEvent(intSupplier);
241 }
242
243 @Override
244 public boolean hasFocusSupport() {
245 return getTerminal().hasFocusSupport();
246 }
247
248 @Override
249 public boolean trackFocus(boolean b) {
250 return getTerminal().trackFocus(b);
251 }
252
253 @Override
254 public ColorPalette getPalette() {
255 return getTerminal().getPalette();
256 }
257
258 @Override
259 public void close() throws IOException {
260 getTerminal().close();
261 }
262
263 @Override
264 public TerminalProvider getProvider() {
265 return getTerminal().getProvider();
266 }
267
268 @Override
269 public SystemStream getSystemStream() {
270 return getTerminal().getSystemStream();
271 }
272 }