1010
1111import java .io .PrintStream ;
1212import java .nio .charset .StandardCharsets ;
13- import java .util .ServiceLoader ;
13+ import java .util .Arrays ;
1414import java .util .concurrent .ForkJoinPool ;
1515import java .util .concurrent .ForkJoinTask ;
1616import java .util .concurrent .TimeUnit ;
2424public 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