Skip to content

Commit 9489e1b

Browse files
authored
The Diag tool should display the full stack trace (fixes #1020) (#1024)
1 parent 43c5426 commit 9489e1b

File tree

1 file changed

+57
-28
lines changed
  • terminal/src/main/java/org/jline/terminal/impl

1 file changed

+57
-28
lines changed

terminal/src/main/java/org/jline/terminal/impl/Diag.java

Lines changed: 57 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
import java.io.PrintStream;
1212
import java.nio.charset.StandardCharsets;
13-
import java.util.ServiceLoader;
13+
import java.util.Arrays;
1414
import java.util.concurrent.ForkJoinPool;
1515
import java.util.concurrent.ForkJoinTask;
1616
import java.util.concurrent.TimeUnit;
@@ -24,10 +24,26 @@
2424
public class Diag {
2525

2626
public static void main(String[] args) {
27-
diag(System.out);
27+
diag(System.out, Arrays.asList(args).contains("--verbose"));
2828
}
2929

3030
public static void diag(PrintStream out) {
31+
diag(out, true);
32+
}
33+
34+
public static void diag(PrintStream out, boolean verbose) {
35+
new Diag(out, verbose).run();
36+
}
37+
38+
private final PrintStream out;
39+
private final boolean verbose;
40+
41+
public Diag(PrintStream out, boolean verbose) {
42+
this.out = out;
43+
this.verbose = verbose;
44+
}
45+
46+
public void run() {
3147
out.println("System properties");
3248
out.println("=================");
3349
out.println("os.name = " + System.getProperty("os.name"));
@@ -56,39 +72,39 @@ public static void diag(PrintStream out) {
5672
out.println("=================");
5773
try {
5874
TerminalProvider provider = TerminalProvider.load("ffm");
59-
testProvider(out, provider);
75+
testProvider(provider);
6076
} catch (Throwable t) {
61-
out.println("FFM support not available: " + t);
77+
error("FFM support not available", t);
6278
}
6379
out.println();
6480

6581
out.println("JnaSupport");
6682
out.println("=================");
6783
try {
6884
TerminalProvider provider = TerminalProvider.load("jna");
69-
testProvider(out, provider);
85+
testProvider(provider);
7086
} catch (Throwable t) {
71-
out.println("JNA support not available: " + t);
87+
error("JNA support not available", t);
7288
}
7389
out.println();
7490

7591
out.println("Jansi2Support");
7692
out.println("=================");
7793
try {
7894
TerminalProvider provider = TerminalProvider.load("jansi");
79-
testProvider(out, provider);
95+
testProvider(provider);
8096
} catch (Throwable t) {
81-
out.println("Jansi 2 support not available: " + t);
97+
error("Jansi 2 support not available", t);
8298
}
8399
out.println();
84100

85101
out.println("JniSupport");
86102
out.println("=================");
87103
try {
88104
TerminalProvider provider = TerminalProvider.load("jni");
89-
testProvider(out, provider);
105+
testProvider(provider);
90106
} catch (Throwable t) {
91-
out.println("JNI support not available: " + t);
107+
error("JNI support not available", t);
92108
}
93109
out.println();
94110

@@ -97,26 +113,31 @@ public static void diag(PrintStream out) {
97113
out.println("=================");
98114
try {
99115
TerminalProvider provider = TerminalProvider.load("exec");
100-
testProvider(out, provider);
116+
testProvider(provider);
101117
} catch (Throwable t) {
102-
out.println("Exec support not available: " + t);
118+
error("Exec support not available", t);
119+
}
120+
121+
if (!verbose) {
122+
out.println();
123+
out.println("Run with --verbose argument to print stack traces");
103124
}
104125
}
105126

106-
private static void testProvider(PrintStream out, TerminalProvider provider) {
127+
private void testProvider(TerminalProvider provider) {
107128
try {
108129
out.println("StdIn stream = " + provider.isSystemStream(SystemStream.Input));
109130
out.println("StdOut stream = " + provider.isSystemStream(SystemStream.Output));
110131
out.println("StdErr stream = " + provider.isSystemStream(SystemStream.Error));
111-
} catch (Throwable t2) {
112-
out.println("Unable to check stream: " + t2);
132+
} catch (Throwable t) {
133+
error("Unable to check stream", t);
113134
}
114135
try {
115136
out.println("StdIn stream name = " + provider.systemStreamName(SystemStream.Input));
116137
out.println("StdOut stream name = " + provider.systemStreamName(SystemStream.Output));
117138
out.println("StdErr stream name = " + provider.systemStreamName(SystemStream.Error));
118-
} catch (Throwable t2) {
119-
out.println("Unable to check stream names: " + t2);
139+
} catch (Throwable t) {
140+
error("Unable to check stream names", t);
120141
}
121142
try (Terminal terminal = provider.sysTerminal(
122143
"diag",
@@ -131,9 +152,14 @@ private static void testProvider(PrintStream out, TerminalProvider provider) {
131152
Attributes attr = terminal.enterRawMode();
132153
try {
133154
out.println("Terminal size: " + terminal.getSize());
134-
ForkJoinTask<Integer> t =
135-
new ForkJoinPool(1).submit(() -> terminal.reader().read(1));
136-
int r = t.get(1000, TimeUnit.MILLISECONDS);
155+
ForkJoinPool forkJoinPool = new ForkJoinPool(1);
156+
try {
157+
ForkJoinTask<Integer> t =
158+
forkJoinPool.submit(() -> terminal.reader().read(1));
159+
t.get(1000, TimeUnit.MILLISECONDS);
160+
} finally {
161+
forkJoinPool.shutdown();
162+
}
137163
StringBuilder sb = new StringBuilder();
138164
sb.append("The terminal seems to work: ");
139165
sb.append("terminal ").append(terminal.getClass().getName());
@@ -145,22 +171,25 @@ private static void testProvider(PrintStream out, TerminalProvider provider) {
145171
.getName());
146172
}
147173
out.println(sb);
148-
} catch (Throwable t3) {
149-
out.println("Unable to read from terminal: " + t3);
150-
t3.printStackTrace();
174+
} catch (Throwable t2) {
175+
error("Unable to read from terminal", t2);
151176
} finally {
152177
terminal.setAttributes(attr);
153178
}
154179
} else {
155180
out.println("Not supported by provider");
156181
}
157-
} catch (Throwable t2) {
158-
out.println("Unable to open terminal: " + t2);
159-
t2.printStackTrace();
182+
} catch (Throwable t) {
183+
error("Unable to open terminal", t);
160184
}
161185
}
162186

163-
static <S> S load(Class<S> clazz) {
164-
return ServiceLoader.load(clazz, clazz.getClassLoader()).iterator().next();
187+
private void error(String message, Throwable cause) {
188+
if (verbose) {
189+
out.println(message);
190+
cause.printStackTrace(out);
191+
} else {
192+
out.println(message + ": " + cause);
193+
}
165194
}
166195
}

0 commit comments

Comments
 (0)