001package Torello.JavaDoc.Messager;
002
003import Torello.Java.StrIndent;
004import Torello.JavaDoc.Declaration;
005import Torello.JavaDoc.ReflHTML;
006import Torello.Java.C;
007
008import static Torello.Java.C.RESET;
009import static Torello.Java.C.BWHITE;
010import static Torello.Java.C.RED_BKGND;
011
012
013import java.util.Vector;
014
015// A replacement for <CODE>System&#46;out, System&#46;err</CODE> and even the StorageWriter
016// class used to send error messages to the terminal about upgrade progress.
017
018public class Messager
019{
020    // ********************************************************************************************
021    // ********************************************************************************************
022    // Scoped-Values / ThreadLocal-Instance & Constructor
023    // ********************************************************************************************
024    // ********************************************************************************************
025
026
027    private static final java.lang.ThreadLocal<Messager> tlInstance =
028        new java.lang.ThreadLocal<>();
029
030    public static void initializeThreadLocalInstance
031        (final int verbosityLevel, final Appendable logAppendable)
032    {
033        if (tlInstance.get() != null) throw new InternalError(
034            "The Messager's `java.lang.ThreadLocal' instance has already been initialized for " +
035            "this thread."
036        );
037
038        if ((verbosityLevel < 0) || (verbosityLevel > 3)) throw new InternalError(
039            "verbosityLevel=" + verbosityLevel + ", " +
040            "but it must be between 0 and 3."
041        );
042
043        final PrintRecord   printRecord     = new PrintRecord(verbosityLevel, logAppendable);
044        final PrintHeading  printHeading    = new PrintHeading(printRecord);
045        final PrintMessage  printMessage    = new PrintMessage(printRecord, printHeading);
046        final Messager      messager        = new Messager(printRecord, printMessage);
047
048        tlInstance.set(messager);
049    }
050
051
052    // ********************************************************************************************
053    // ********************************************************************************************
054    // Constructor & Fields
055    // ********************************************************************************************
056    // ********************************************************************************************
057
058
059    private final PrintRecord   printRecord;
060    private final PrintMessage  printMessage;
061
062
063    private Messager(final PrintRecord printRecord, final PrintMessage printMessage)
064    {
065        this.printRecord    = printRecord;
066        this.printMessage   = printMessage;
067    }
068
069
070    // ********************************************************************************************
071    // ********************************************************************************************
072    // Simple print / println ... and one "warning" Printer-Method
073    // ********************************************************************************************
074    // ********************************************************************************************
075
076
077    public static void print(final String s)
078    {
079        final Messager m = tlInstance.get();
080        if (m.printRecord.verbosityLevel >= 2) m.printRecord.screenWriterSW.print(s);
081    }
082
083    public static void println(final String s)
084    {
085        final Messager m = tlInstance.get();
086        if (m.printRecord.verbosityLevel >= 2) m.printRecord.screenWriterSW.println(s);
087    }
088
089    public static void println()
090    {
091        final Messager m = tlInstance.get();
092        if (m.printRecord.verbosityLevel >= 2) m.printRecord.screenWriterSW.println();
093    }
094
095    public static void printQuiet(final String s)
096    {
097        final Messager m = tlInstance.get();
098        if (m.printRecord.verbosityLevel == 1) m.printRecord.screenWriterSW.print(s);
099    }
100
101    public static void printSilent(final boolean dotOrNewLine)
102    {
103        final Messager m = tlInstance.get();
104
105        if (m.printRecord.verbosityLevel == 0)
106            m.printRecord.screenWriterSW.print(dotOrNewLine ? '.' : '\n');
107    }
108
109    public static void ifVerboseAppendVerbose()
110    {
111        final Messager m = tlInstance.get();
112
113        if (m.printRecord.verbosityLevel == 3)
114            m.printRecord.screenWriterSW.print(MsgVerbose.getAndClear());
115    }
116
117    public static void warning(final String message, final Where_Am_I WHERE_AM_I)
118    {
119        final Messager m = tlInstance.get();
120
121        m.printMessage.WARNING(message, WHERE_AM_I);
122        m.printRecord.writeSBToScreen();
123    }
124
125
126    // ********************************************************************************************
127    // ********************************************************************************************
128    // Fatal-Assert: Throws to Stop Program-Execution Immediatley
129    // ********************************************************************************************
130    // ********************************************************************************************
131
132
133    public static Error assertFail(final String message, final Where_Am_I WHERE_AM_I)
134    {
135        final Messager m = tlInstance.get();
136
137        m.printMessage.ERROR(
138            message,
139            null,   // signature
140            true,   // FATAL
141            WHERE_AM_I
142        );
143
144        m.printRecord.writeSBToScreen();
145        throw new AssertFail();
146    }
147
148    public static Error assertFail
149        (final String message, final String signature, final Where_Am_I WHERE_AM_I)
150    {
151        final Messager m = tlInstance.get();
152
153        m.printMessage.ERROR(
154            message,
155            signature,
156            true, // FATAL
157            WHERE_AM_I
158        );
159
160        m.printRecord.writeSBToScreen();
161        throw new AssertFail();
162    }
163
164    public static Error assertFail
165        (final Throwable t, final String message, final Where_Am_I WHERE_AM_I)
166    {
167        final Messager m = tlInstance.get();
168
169        m.printMessage.ERROR(
170            message,
171            null,   // signature
172            true,   // FATAL
173            WHERE_AM_I
174        );
175
176        m.printRecord.writeSBToScreen();
177        throw new AssertFail();
178    }
179
180    public static Error assertFail
181        (final Throwable t, final String message, final String signature, final Where_Am_I WHERE_AM_I)
182    {
183        final Messager m = tlInstance.get();
184
185        m.printMessage.ERROR(
186            message,
187            signature,
188            true,   // FATAL
189            WHERE_AM_I
190        );
191
192        m.printRecord.writeSBToScreen();
193        throw new AssertFail();
194    }
195
196
197    // ********************************************************************************************
198    // ********************************************************************************************
199    // Non-Fatal Assert: Error, but it doesn't need to stop immediately
200    // ********************************************************************************************
201    // ********************************************************************************************
202
203
204    public static void assertFailContinue(final String message, final Where_Am_I WHERE_AM_I)
205    {
206        final Messager m = tlInstance.get();
207
208        m.printMessage.ERROR(
209            message,
210            null,   // signature
211            false,  // NON-FATAL
212            WHERE_AM_I
213        );
214
215        m.printRecord.writeSBToScreen();
216    }
217
218    public static void assertFailContinue
219        (final Throwable t, final String message, final Where_Am_I WHERE_AM_I)
220    {
221        final Messager m = tlInstance.get();
222
223        m.printMessage.ERROR(
224            t,
225            message,
226            null,   // signature
227            false,  // NON-FATAL
228            false,  // Don't Show Stack-Trace
229            WHERE_AM_I
230        );
231
232        m.printRecord.writeSBToScreen();
233    }
234
235
236    // ********************************************************************************************
237    // ********************************************************************************************
238    // Fatal-User-Error: Throws to Stop Program-Execution Immediatley
239    // ********************************************************************************************
240    // ********************************************************************************************
241
242
243    public static Error userErrorHalt(final String message, final Where_Am_I WHERE_AM_I)
244    {
245        final Messager m = tlInstance.get();
246
247        m.printMessage.ERROR(
248            message,
249            null,       // signature    
250            true,       // FATAL
251            WHERE_AM_I
252        );
253
254        m.printRecord.writeSBToScreen();
255        throw new MessagerGeneratedError();
256    }
257
258    public static Error userErrorHalt
259        (final Throwable t, final String message, final Where_Am_I WHERE_AM_I)
260    {
261        final Messager m = tlInstance.get();
262
263        m.printMessage.ERROR(
264            t,          // Exception that was thrown
265            message,    // THE MESSAGE
266            null,       // signature    
267            true,       // FATAL
268            true,       // Show Stack-Trace
269            WHERE_AM_I
270        );
271
272        m.printRecord.writeSBToScreen();
273        throw new MessagerGeneratedError();
274    }
275
276
277    // ********************************************************************************************
278    // ********************************************************************************************
279    // User-Error: Program-Flow Execution Continues
280    // ********************************************************************************************
281    // ********************************************************************************************
282
283
284    public static void userErrorContinue(final String message, final Where_Am_I WHERE_AM_I)
285    {
286        final Messager m = tlInstance.get();
287
288        m.printMessage.ERROR(
289            message,
290            null,   // signature
291            false,  // NON-FATAL
292            WHERE_AM_I
293        );
294
295        m.printRecord.writeSBToScreen();
296    }
297
298    public static void userErrorContinue
299        (final String message, final String signature, final Where_Am_I WHERE_AM_I)
300    {
301        final Messager m = tlInstance.get();
302
303        m.printMessage.ERROR(
304            message,
305            signature,
306            false, // NON-FATAL
307            WHERE_AM_I
308        );
309
310        m.printRecord.writeSBToScreen();
311    }
312
313    public static void userErrorContinue
314        (final Throwable t, final String message, final Where_Am_I WHERE_AM_I)
315    {
316        final Messager m = tlInstance.get();
317
318        m.printMessage.ERROR(
319            t,
320            message,
321            null,   // signature
322            false,  // NON-FATAL
323            false,  // Don't Show Stack-Trace
324            WHERE_AM_I
325        );
326
327        m.printRecord.writeSBToScreen();
328    }
329
330    public static void userErrorContinueST
331        (final Throwable t, final String message, final Where_Am_I WHERE_AM_I)
332    {
333        final Messager m = tlInstance.get();
334
335        m.printMessage.ERROR(
336            t,
337            message,
338            null,   // signature
339            false,  // NON-FATAL
340            true,   // SHOW STACK TRACE
341            WHERE_AM_I
342        );
343
344        m.printRecord.writeSBToScreen();
345    }
346
347
348    // ********************************************************************************************
349    // ********************************************************************************************
350    // The Old Class "MsgControl"
351    // ********************************************************************************************
352    // ********************************************************************************************
353
354
355    public static void setCurrentFileName(final String fName, final String fNameKind)
356    {
357        final Messager m = tlInstance.get();
358        m.printRecord.setCurrentFileName(fName, fNameKind);
359    }
360
361    public static void setTopDescriptionSection()
362    {
363        final Messager m = tlInstance.get();
364        m.printRecord.setTopDescriptionSection();
365    }
366
367    public static void setDeclaration(final Declaration declaration)
368    {
369        final Messager m = tlInstance.get();
370        m.printRecord.setDeclaration(declaration);
371    }
372
373    public static boolean hadErrors()
374    {
375        final Messager m = tlInstance.get();
376        return m.printRecord.hadErrors();
377    }
378
379    public static void ifLogCheckPointLog()
380    {
381        final Messager m = tlInstance.get();
382        if (! m.printRecord.hasLogAppendable) return;
383        m.printRecord.checkPointLog();
384    }
385
386}