View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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 }