Lines 19-24
Link Here
|
19 |
import java.lang.reflect.Method; |
19 |
import java.lang.reflect.Method; |
20 |
import java.io.*; |
20 |
import java.io.*; |
21 |
import java.util.*; |
21 |
import java.util.*; |
|
|
22 |
import java.util.logging.FileHandler; |
23 |
import java.util.logging.Level; |
24 |
import java.util.logging.Logger; |
25 |
import java.util.logging.SimpleFormatter; |
26 |
import java.util.logging.StreamHandler; |
22 |
|
27 |
|
23 |
import org.xml.sax.SAXParseException; |
28 |
import org.xml.sax.SAXParseException; |
24 |
|
29 |
|
Lines 30-38
Link Here
|
30 |
* @author Jaroslav Tulach, Jesse Glick |
35 |
* @author Jaroslav Tulach, Jesse Glick |
31 |
*/ |
36 |
*/ |
32 |
public final class NbErrorManager extends ErrorManager { |
37 |
public final class NbErrorManager extends ErrorManager { |
|
|
38 |
/** Where to log the file */ |
39 |
private Logger logger; |
33 |
|
40 |
|
34 |
public NbErrorManager() { |
41 |
public NbErrorManager() { |
35 |
this(null, defaultSeverity(), null); |
42 |
this(null, null); |
36 |
} |
43 |
} |
37 |
|
44 |
|
38 |
/** |
45 |
/** |
Lines 40-78
Link Here
|
40 |
* @see "#18141" |
47 |
* @see "#18141" |
41 |
*/ |
48 |
*/ |
42 |
NbErrorManager(PrintStream pw) { |
49 |
NbErrorManager(PrintStream pw) { |
43 |
this(null, defaultSeverity(), pw); |
50 |
this(null, streamLogger (pw)); |
44 |
} |
51 |
} |
45 |
|
52 |
|
46 |
private static int defaultSeverity() { |
53 |
private NbErrorManager(String pfx, Logger logger) { |
47 |
String dsev = System.getProperty("ErrorManager.minimum"); |
54 |
if (logger == null) { |
48 |
// use e.g. 17 to avoid logging WARNING messages. |
55 |
if (pfx == null) { |
49 |
if (dsev != null) { |
56 |
pfx = ""; // NOI18N |
50 |
try { |
|
|
51 |
return Integer.parseInt(dsev); |
52 |
} catch (NumberFormatException nfe) { |
53 |
nfe.printStackTrace(); |
54 |
} |
55 |
} |
56 |
// I.e. 2: avoid logging INFORMATIONAL messages. |
57 |
return ErrorManager.INFORMATIONAL + 1; |
58 |
} |
59 |
|
60 |
private NbErrorManager(String pfx, int sev, PrintStream pw) { |
61 |
prefix = pfx; |
62 |
minLogSeverity = sev; |
63 |
logWriter = pw; |
64 |
synchronized (uniquifiedIds) { |
65 |
Integer i = (Integer)uniquifiedIds.get(pfx); |
66 |
if (i == null) { |
67 |
uniquifier = 1; |
68 |
} else { |
69 |
uniquifier = i.intValue() + 1; |
70 |
} |
57 |
} |
71 |
uniquifiedIds.put(pfx, new Integer(uniquifier)); |
58 |
logger = createLogger (pfx); |
72 |
} |
59 |
} |
73 |
//System.err.println("NbErrorManager[" + pfx + " #" + uniquifier + "]: minLogSeverity=" + sev); |
60 |
this.logger = logger; |
74 |
} |
61 |
} |
75 |
|
62 |
|
|
|
63 |
public void flush () { |
64 |
java.util.logging.Handler[] arr = logger.getHandlers(); |
65 |
for (int i = 0; i < arr.length; i++) { |
66 |
arr[i].flush(); |
67 |
} |
68 |
} |
69 |
|
70 |
private static Logger streamLogger (PrintStream pw) { |
71 |
Logger log = Logger.getAnonymousLogger(); |
72 |
StreamHandler s = new StreamHandler ( |
73 |
pw, NbFormater.FORMATTER |
74 |
); |
75 |
log.setLevel(Level.ALL); |
76 |
s.setLevel(Level.ALL); |
77 |
log.addHandler(s); |
78 |
return log; |
79 |
} |
80 |
|
81 |
private static java.util.logging.Handler streamHandler; |
82 |
private static synchronized java.util.logging.Handler streamHandler () { |
83 |
if (streamHandler == null) { |
84 |
streamHandler = new StreamHandler (System.err, NbFormater.FORMATTER); |
85 |
} |
86 |
return streamHandler; |
87 |
} |
88 |
|
89 |
private static java.util.logging.Handler defaultHandler; |
90 |
private static synchronized java.util.logging.Handler defaultHandler () { |
91 |
if (defaultHandler != null) return defaultHandler; |
92 |
|
93 |
String home = System.getProperty("netbeans.user"); |
94 |
if (home != null && org.netbeans.core.startup.CLIOptions.isLogging()) { |
95 |
try { |
96 |
File f = new File (home + "/var/log"); |
97 |
f.mkdirs (); |
98 |
|
99 |
defaultHandler = new FileHandler (home + "/var/log/messages.log", 1000000, 1, true); |
100 |
defaultHandler.setFormatter(NbFormater.FORMATTER); |
101 |
} catch (IOException ex) { |
102 |
ex.printStackTrace(); |
103 |
} |
104 |
} |
105 |
|
106 |
if (defaultHandler == null) { |
107 |
defaultHandler = streamHandler(); |
108 |
} |
109 |
return defaultHandler; |
110 |
} |
111 |
|
112 |
private static Logger createLogger (String pfx) { |
113 |
Logger logger = Logger.getLogger (pfx); |
114 |
logger.addHandler(defaultHandler ()); |
115 |
if (Boolean.getBoolean("netbeans.logger.console")) { // NOI18N |
116 |
if (defaultHandler () instanceof FileHandler) { |
117 |
logger.addHandler (streamHandler ()); |
118 |
} |
119 |
} |
120 |
return logger; |
121 |
} |
122 |
|
76 |
/** maps Throwables to java.util.List (Ann) */ |
123 |
/** maps Throwables to java.util.List (Ann) */ |
77 |
private static final Map map = new WeakHashMap (11); |
124 |
private static final Map map = new WeakHashMap (11); |
78 |
|
125 |
|
Lines 81-126
Link Here
|
81 |
"{0}*********** Exception occurred ************ at {1,time,short} on {1,date,medium}", // NOI18N |
128 |
"{0}*********** Exception occurred ************ at {1,time,short} on {1,date,medium}", // NOI18N |
82 |
java.util.Locale.ENGLISH |
129 |
java.util.Locale.ENGLISH |
83 |
); |
130 |
); |
84 |
|
|
|
85 |
/** The writer to the log file*/ |
86 |
private PrintStream logWriter; |
87 |
|
131 |
|
88 |
/** assciates each thread with the lastly notified throwable |
132 |
/** assciates each thread with the lastly notified throwable |
89 |
* (Thread, Reference (Throwable)) |
133 |
* (Thread, Reference (Throwable)) |
90 |
*/ |
134 |
*/ |
91 |
private static final Map lastException = new WeakHashMap (27); |
135 |
private static final Map lastException = new WeakHashMap (27); |
92 |
|
136 |
|
93 |
/** Minimum value of severity to write message to the log file*/ |
|
|
94 |
private final int minLogSeverity; |
95 |
|
96 |
/** Prefix preprended to customized loggers, if any. */ |
97 |
private final String prefix; |
98 |
|
99 |
// Make sure two distinct EM impls log differently even with the same name. |
100 |
private final int uniquifier; // 0 for root EM (prefix == null), else >= 1 |
101 |
private static final Map uniquifiedIds = new HashMap(20); // Map<String,Integer> |
102 |
|
103 |
static { |
137 |
static { |
104 |
System.setProperty("sun.awt.exception.handler", "org.netbeans.core.NbErrorManager$AWTHandler"); // NOI18N |
138 |
System.setProperty("sun.awt.exception.handler", "org.netbeans.core.NbErrorManager$AWTHandler"); // NOI18N |
105 |
} |
139 |
} |
106 |
|
140 |
|
107 |
/** Initializes the log stream. |
|
|
108 |
*/ |
109 |
private PrintStream getLogWriter () { |
110 |
synchronized (this) { |
111 |
if (logWriter != null) return logWriter; |
112 |
// to prevent further initializations during TopLogging.getLogOutputStream method |
113 |
logWriter = System.err; |
114 |
} |
115 |
|
116 |
PrintStream pw = org.netbeans.core.startup.TopLogging.getLogOutputStream(); |
117 |
|
118 |
synchronized (this) { |
119 |
logWriter = pw; |
120 |
return logWriter; |
121 |
} |
122 |
} |
123 |
|
124 |
public synchronized Throwable annotate ( |
141 |
public synchronized Throwable annotate ( |
125 |
Throwable t, |
142 |
Throwable t, |
126 |
int severity, String message, String localizedMessage, |
143 |
int severity, String message, String localizedMessage, |
Lines 177-182
Link Here
|
177 |
public boolean isNotifiable(int severity) { |
194 |
public boolean isNotifiable(int severity) { |
178 |
return isLoggable(severity + 1); |
195 |
return isLoggable(severity + 1); |
179 |
} |
196 |
} |
|
|
197 |
|
198 |
private static java.util.logging.Level mapSeverity (int severity) { |
199 |
if (severity == ErrorManager.UNKNOWN) { |
200 |
return Level.FINEST; |
201 |
} |
202 |
|
203 |
if (severity == ErrorManager.INFORMATIONAL) { |
204 |
return Level.FINE; |
205 |
} |
206 |
|
207 |
if (severity <= ErrorManager.WARNING) { |
208 |
return Level.WARNING; |
209 |
} |
210 |
|
211 |
if (severity <= ErrorManager.USER) { |
212 |
return Level.INFO; |
213 |
} |
214 |
|
215 |
if (severity <= ErrorManager.EXCEPTION) { |
216 |
return Level.INFO; |
217 |
} |
218 |
return Level.SEVERE; |
219 |
} |
180 |
|
220 |
|
181 |
/** Notifies all the exceptions associated with |
221 |
/** Notifies all the exceptions associated with |
182 |
* this thread. |
222 |
* this thread. |
Lines 215-228
Link Here
|
215 |
} |
255 |
} |
216 |
} |
256 |
} |
217 |
if (wantStackTrace) { |
257 |
if (wantStackTrace) { |
218 |
PrintStream log = getLogWriter(); |
258 |
Level level = mapSeverity(ex.getSeverity ()); |
219 |
if (prefix != null) |
259 |
if (logger.isLoggable(level)) { |
220 |
log.print ("[" + prefix + "] "); // NOI18N |
260 |
String l = ex.getSeverity() == INFORMATIONAL ? "INFORMATIONAL " : "";// NOI18N |
221 |
String level = ex.getSeverity() == INFORMATIONAL ? "INFORMATIONAL " : "";// NOI18N |
261 |
String msg = EXC_HEADER.format (new Object[] { l, ex.getDate() }); |
222 |
|
262 |
logger.log (level, msg); |
223 |
|
263 |
StringWriter w = new StringWriter (); |
224 |
log.println (EXC_HEADER.format (new Object[] { level, ex.getDate() })); |
264 |
ex.printStackTrace (new PrintWriter (w)); |
225 |
ex.printStackTrace(log); |
265 |
msg = w.toString (); |
|
|
266 |
logger.log (level, msg); |
267 |
} |
226 |
} |
268 |
} |
227 |
|
269 |
|
228 |
if (ex.getSeverity () > INFORMATIONAL) { |
270 |
if (ex.getSeverity () > INFORMATIONAL) { |
Lines 255-298
Link Here
|
255 |
} |
297 |
} |
256 |
|
298 |
|
257 |
public void log(int severity, String s) { |
299 |
public void log(int severity, String s) { |
258 |
if (isLoggable (severity)) { |
300 |
logger.log (mapSeverity(severity), s); |
259 |
//System.err.println(toString() + " logging '" + s + "' at " + severity); |
|
|
260 |
PrintStream log = getLogWriter (); |
261 |
|
262 |
if (prefix != null) { |
263 |
boolean showUniquifier; |
264 |
// Print a unique EM sequence # if there is more than one |
265 |
// with this name. Shortcut: if the # > 1, clearly there are. |
266 |
if (uniquifier > 1) { |
267 |
showUniquifier = true; |
268 |
} else if (uniquifier == 1) { |
269 |
synchronized (uniquifiedIds) { |
270 |
int count = ((Integer)uniquifiedIds.get(prefix)).intValue(); |
271 |
showUniquifier = count > 1; |
272 |
} |
273 |
} else { |
274 |
throw new IllegalStateException("prefix != null yet uniquifier == 0"); |
275 |
} |
276 |
if (showUniquifier) { |
277 |
log.print ("[" + prefix + " #" + uniquifier + "] "); // NOI18N |
278 |
} else { |
279 |
log.print ("[" + prefix + "] "); // NOI18N |
280 |
} |
281 |
} |
282 |
log.println(s); |
283 |
} |
284 |
} |
301 |
} |
285 |
|
302 |
|
286 |
/** Allows to test whether messages with given severity will be logged |
|
|
287 |
* or not prior to constraction of complicated and time expensive |
288 |
* logging messages. |
289 |
* |
290 |
* @param severity the severity to check |
291 |
* @return false if the next call to log method with the same severity will |
292 |
* discard the message |
293 |
*/ |
294 |
public boolean isLoggable (int severity) { |
303 |
public boolean isLoggable (int severity) { |
295 |
return severity >= minLogSeverity; |
304 |
return logger.isLoggable (mapSeverity(severity)); |
296 |
} |
305 |
} |
297 |
|
306 |
|
298 |
|
307 |
|
Lines 301-329
Link Here
|
301 |
* a hierarchy. |
310 |
* a hierarchy. |
302 |
*/ |
311 |
*/ |
303 |
public final ErrorManager getInstance(String name) { |
312 |
public final ErrorManager getInstance(String name) { |
304 |
String pfx = (prefix == null) ? name : prefix + '.' + name; |
313 |
String pfx = logger.getName() + '.' + name; |
305 |
int sev = minLogSeverity; |
314 |
return new NbErrorManager(pfx, null); |
306 |
String prop = pfx; |
|
|
307 |
while (prop != null) { |
308 |
String value = System.getProperty (prop); |
309 |
//System.err.println ("Trying; prop=" + prop + " value=" + value); |
310 |
if (value != null) { |
311 |
try { |
312 |
sev = Integer.parseInt (value); |
313 |
} catch (NumberFormatException nfe) { |
314 |
notify (WARNING, nfe); |
315 |
} |
316 |
break; |
317 |
} else { |
318 |
int idx = prop.lastIndexOf ('.'); |
319 |
if (idx == -1) |
320 |
prop = null; |
321 |
else |
322 |
prop = prop.substring (0, idx); |
323 |
} |
324 |
} |
325 |
//System.err.println ("getInstance: prefix=" + prefix + " mls=" + minLogSeverity + " name=" + name + " prefix2=" + newEM.prefix + " mls2=" + newEM.minLogSeverity); |
326 |
return new NbErrorManager(pfx, sev, logWriter); |
327 |
} |
315 |
} |
328 |
|
316 |
|
329 |
/** Method (or field) names in various exception classes which give |
317 |
/** Method (or field) names in various exception classes which give |
Lines 474-480
Link Here
|
474 |
} |
462 |
} |
475 |
|
463 |
|
476 |
public String toString() { |
464 |
public String toString() { |
477 |
return super.toString() + "<" + prefix + "," + minLogSeverity + ">"; // NOI18N |
465 |
return super.toString() + "<" + logger + ">"; // NOI18N |
478 |
} |
466 |
} |
479 |
|
467 |
|
480 |
/** Implementation of annotation interface. |
468 |
/** Implementation of annotation interface. |
Lines 849-852
Link Here
|
849 |
ErrorManager.getDefault().notify((ERROR << 1), t); |
837 |
ErrorManager.getDefault().notify((ERROR << 1), t); |
850 |
} |
838 |
} |
851 |
} |
839 |
} |
|
|
840 |
|
841 |
/** Modified formater for use in NetBeans. |
842 |
*/ |
843 |
private static final class NbFormater extends java.util.logging.Formatter { |
844 |
private static String lineSeparator = System.getProperty ("line.separator"); // NOI18N |
845 |
static java.util.logging.Formatter FORMATTER = new NbFormater (); |
846 |
|
847 |
|
848 |
public String format(java.util.logging.LogRecord record) { |
849 |
StringBuffer sb = new StringBuffer(); |
850 |
sb.append(record.getLevel().getName()); |
851 |
addLoggerName (sb, record); |
852 |
sb.append(": "); |
853 |
String message = formatMessage(record); |
854 |
sb.append(message); |
855 |
sb.append(lineSeparator); |
856 |
if (record.getThrown() != null) { |
857 |
try { |
858 |
StringWriter sw = new StringWriter(); |
859 |
PrintWriter pw = new PrintWriter(sw); |
860 |
record.getThrown().printStackTrace(pw); |
861 |
pw.close(); |
862 |
sb.append(sw.toString()); |
863 |
} catch (Exception ex) { |
864 |
} |
865 |
} |
866 |
return sb.toString(); |
867 |
} |
868 |
|
869 |
private static void addLoggerName (StringBuffer sb, java.util.logging.LogRecord record) { |
870 |
String name = record.getLoggerName (); |
871 |
if (!"".equals (name)) { |
872 |
if (record.getSourceClassName() != null) { |
873 |
sb.append(record.getSourceClassName()); |
874 |
} else { |
875 |
sb.append(record.getLoggerName()); |
876 |
} |
877 |
} |
878 |
} |
879 |
} |
852 |
} |
880 |
} |