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.out, System.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}