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