Lines 19-24
import java.lang.reflect.Field;
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 32-38
import org.openide.util.NbBundle;
Link Here
|
32 |
public final class NbErrorManager extends ErrorManager { |
37 |
public final class NbErrorManager extends ErrorManager { |
33 |
|
38 |
|
34 |
public NbErrorManager() { |
39 |
public NbErrorManager() { |
35 |
this(null, defaultSeverity(), null); |
40 |
this(null, null); |
36 |
} |
41 |
} |
37 |
|
42 |
|
38 |
/** |
43 |
/** |
Lines 40-78
public final class NbErrorManager extend
Link Here
|
40 |
* @see "#18141" |
45 |
* @see "#18141" |
41 |
*/ |
46 |
*/ |
42 |
NbErrorManager(PrintStream pw) { |
47 |
NbErrorManager(PrintStream pw) { |
43 |
this(null, defaultSeverity(), pw); |
48 |
this(null, streamLogger (pw)); |
44 |
} |
49 |
} |
45 |
|
50 |
|
46 |
private static int defaultSeverity() { |
51 |
private NbErrorManager(String pfx, Logger logger) { |
47 |
String dsev = System.getProperty("ErrorManager.minimum"); |
52 |
if (logger == null) { |
48 |
// use e.g. 17 to avoid logging WARNING messages. |
53 |
if (pfx == null) { |
49 |
if (dsev != null) { |
54 |
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 |
} |
55 |
} |
71 |
uniquifiedIds.put(pfx, new Integer(uniquifier)); |
56 |
logger = createLogger (pfx); |
72 |
} |
57 |
} |
73 |
//System.err.println("NbErrorManager[" + pfx + " #" + uniquifier + "]: minLogSeverity=" + sev); |
58 |
this.logger = logger; |
74 |
} |
59 |
} |
75 |
|
60 |
|
|
|
61 |
public void flush () { |
62 |
java.util.logging.Handler[] arr = logger.getHandlers(); |
63 |
for (int i = 0; i < arr.length; i++) { |
64 |
arr[i].flush(); |
65 |
} |
66 |
} |
67 |
|
68 |
private static Logger streamLogger (PrintStream pw) { |
69 |
Logger log = Logger.getAnonymousLogger(); |
70 |
StreamHandler s = new StreamHandler ( |
71 |
pw, NbFormater.FORMATTER |
72 |
); |
73 |
log.setLevel(Level.ALL); |
74 |
s.setLevel(Level.ALL); |
75 |
log.addHandler(s); |
76 |
return log; |
77 |
} |
78 |
|
79 |
private static java.util.logging.Handler streamHandler; |
80 |
private static synchronized java.util.logging.Handler streamHandler () { |
81 |
if (streamHandler == null) { |
82 |
streamHandler = new StreamHandler (System.err, NbFormater.FORMATTER); |
83 |
} |
84 |
return streamHandler; |
85 |
} |
86 |
|
87 |
private static java.util.logging.Handler defaultHandler; |
88 |
private static synchronized java.util.logging.Handler defaultHandler () { |
89 |
if (defaultHandler != null) return defaultHandler; |
90 |
|
91 |
String home = System.getProperty("netbeans.user"); |
92 |
if (home != null && !NonGui.noLogging) { |
93 |
try { |
94 |
File f = new File (home + "/var/log"); |
95 |
f.mkdirs (); |
96 |
|
97 |
defaultHandler = new FileHandler (home + "/var/log/messages.log", 1000000, 1, true); |
98 |
defaultHandler.setFormatter(NbFormater.FORMATTER); |
99 |
} catch (IOException ex) { |
100 |
ex.printStackTrace(); |
101 |
} |
102 |
} |
103 |
|
104 |
if (defaultHandler == null) { |
105 |
defaultHandler = streamHandler(); |
106 |
} |
107 |
return defaultHandler; |
108 |
} |
109 |
|
110 |
private static Logger createLogger (String pfx) { |
111 |
Logger logger = Logger.getLogger (pfx); |
112 |
logger.addHandler(defaultHandler ()); |
113 |
if (Boolean.getBoolean("netbeans.logger.console")) { // NOI18N |
114 |
if (defaultHandler () instanceof FileHandler) { |
115 |
logger.addHandler (streamHandler ()); |
116 |
} |
117 |
} |
118 |
return logger; |
119 |
} |
120 |
|
76 |
/** maps Throwables to java.util.List (Ann) */ |
121 |
/** maps Throwables to java.util.List (Ann) */ |
77 |
private static final Map map = new WeakHashMap (11); |
122 |
private static final Map map = new WeakHashMap (11); |
78 |
|
123 |
|
Lines 82-126
public final class NbErrorManager extend
Link Here
|
82 |
java.util.Locale.ENGLISH |
127 |
java.util.Locale.ENGLISH |
83 |
); |
128 |
); |
84 |
|
129 |
|
85 |
/** The writer to the log file*/ |
130 |
/** Where to log the file */ |
86 |
private PrintStream logWriter; |
131 |
private Logger logger; |
87 |
|
132 |
|
88 |
/** assciates each thread with the lastly notified throwable |
133 |
/** assciates each thread with the lastly notified throwable |
89 |
* (Thread, Reference (Throwable)) |
134 |
* (Thread, Reference (Throwable)) |
90 |
*/ |
135 |
*/ |
91 |
private static final Map lastException = new WeakHashMap (27); |
136 |
private static final Map lastException = new WeakHashMap (27); |
92 |
|
137 |
|
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 { |
138 |
static { |
104 |
System.setProperty("sun.awt.exception.handler", "org.netbeans.core.NbErrorManager$AWTHandler"); // NOI18N |
139 |
System.setProperty("sun.awt.exception.handler", "org.netbeans.core.NbErrorManager$AWTHandler"); // NOI18N |
105 |
} |
140 |
} |
106 |
|
141 |
|
107 |
/** Initializes the log stream. |
|
|
108 |
*/ |
109 |
private PrintStream getLogWriter () { |
110 |
synchronized (this) { |
111 |
if (logWriter != null) return logWriter; |
112 |
} |
113 |
|
114 |
PrintStream pw = TopLogging.getLogOutputStream(); |
115 |
|
116 |
synchronized (this) { |
117 |
if (logWriter == null) { |
118 |
logWriter = pw; |
119 |
} |
120 |
return logWriter; |
121 |
} |
122 |
} |
123 |
|
124 |
public synchronized Throwable annotate ( |
142 |
public synchronized Throwable annotate ( |
125 |
Throwable t, |
143 |
Throwable t, |
126 |
int severity, String message, String localizedMessage, |
144 |
int severity, String message, String localizedMessage, |
Lines 177-182
public final class NbErrorManager extend
Link Here
|
177 |
public boolean isNotifiable(int severity) { |
195 |
public boolean isNotifiable(int severity) { |
178 |
return isLoggable(severity + 1); |
196 |
return isLoggable(severity + 1); |
179 |
} |
197 |
} |
|
|
198 |
|
199 |
private static java.util.logging.Level mapSeverity (int severity) { |
200 |
if (severity == ErrorManager.UNKNOWN) { |
201 |
return Level.FINEST; |
202 |
} |
203 |
|
204 |
if (severity == ErrorManager.INFORMATIONAL) { |
205 |
return Level.FINE; |
206 |
} |
207 |
|
208 |
if (severity <= ErrorManager.WARNING) { |
209 |
return Level.WARNING; |
210 |
} |
211 |
|
212 |
if (severity <= ErrorManager.USER) { |
213 |
return Level.INFO; |
214 |
} |
215 |
|
216 |
if (severity <= ErrorManager.EXCEPTION) { |
217 |
return Level.INFO; |
218 |
} |
219 |
return Level.SEVERE; |
220 |
} |
180 |
|
221 |
|
181 |
/** Notifies all the exceptions associated with |
222 |
/** Notifies all the exceptions associated with |
182 |
* this thread. |
223 |
* this thread. |
Lines 215-228
public final class NbErrorManager extend
Link Here
|
215 |
} |
256 |
} |
216 |
} |
257 |
} |
217 |
if (wantStackTrace) { |
258 |
if (wantStackTrace) { |
218 |
PrintStream log = getLogWriter(); |
259 |
Level level = mapSeverity(ex.getSeverity ()); |
219 |
if (prefix != null) |
260 |
if (logger.isLoggable(level)) { |
220 |
log.print ("[" + prefix + "] "); // NOI18N |
261 |
String l = ex.getSeverity() == INFORMATIONAL ? "INFORMATIONAL " : "";// NOI18N |
221 |
String level = ex.getSeverity() == INFORMATIONAL ? "INFORMATIONAL " : "";// NOI18N |
262 |
String msg = EXC_HEADER.format (new Object[] { l, ex.getDate() }); |
222 |
|
263 |
logger.log (level, msg); |
223 |
|
264 |
StringWriter w = new StringWriter (); |
224 |
log.println (EXC_HEADER.format (new Object[] { level, ex.getDate() })); |
265 |
ex.printStackTrace (new PrintWriter (w)); |
225 |
ex.printStackTrace(log); |
266 |
msg = w.toString (); |
|
|
267 |
logger.log (level, msg); |
268 |
} |
226 |
} |
269 |
} |
227 |
|
270 |
|
228 |
if (ex.getSeverity () > INFORMATIONAL) { |
271 |
if (ex.getSeverity () > INFORMATIONAL) { |
Lines 255-298
public final class NbErrorManager extend
Link Here
|
255 |
} |
298 |
} |
256 |
|
299 |
|
257 |
public void log(int severity, String s) { |
300 |
public void log(int severity, String s) { |
258 |
if (isLoggable (severity)) { |
301 |
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 |
} |
302 |
} |
285 |
|
303 |
|
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) { |
304 |
public boolean isLoggable (int severity) { |
295 |
return severity >= minLogSeverity; |
305 |
return logger.isLoggable (mapSeverity(severity)); |
296 |
} |
306 |
} |
297 |
|
307 |
|
298 |
|
308 |
|
Lines 301-329
public final class NbErrorManager extend
Link Here
|
301 |
* a hierarchy. |
311 |
* a hierarchy. |
302 |
*/ |
312 |
*/ |
303 |
public final ErrorManager getInstance(String name) { |
313 |
public final ErrorManager getInstance(String name) { |
304 |
String pfx = (prefix == null) ? name : prefix + '.' + name; |
314 |
String pfx = logger.getName() + '.' + name; |
305 |
int sev = minLogSeverity; |
315 |
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 |
} |
316 |
} |
328 |
|
317 |
|
329 |
/** Method (or field) names in various exception classes which give |
318 |
/** Method (or field) names in various exception classes which give |
Lines 474-480
public final class NbErrorManager extend
Link Here
|
474 |
} |
463 |
} |
475 |
|
464 |
|
476 |
public String toString() { |
465 |
public String toString() { |
477 |
return super.toString() + "<" + prefix + "," + minLogSeverity + ">"; // NOI18N |
466 |
return super.toString() + "<" + logger + ">"; // NOI18N |
478 |
} |
467 |
} |
479 |
|
468 |
|
480 |
/** Implementation of annotation interface. |
469 |
/** Implementation of annotation interface. |
Lines 849-852
public final class NbErrorManager extend
Link Here
|
849 |
ErrorManager.getDefault().notify((ERROR << 1), t); |
838 |
ErrorManager.getDefault().notify((ERROR << 1), t); |
850 |
} |
839 |
} |
851 |
} |
840 |
} |
|
|
841 |
|
842 |
/** Modified formater for use in NetBeans. |
843 |
*/ |
844 |
private static final class NbFormater extends java.util.logging.Formatter { |
845 |
private static String lineSeparator = System.getProperty ("line.separator"); // NOI18N |
846 |
static java.util.logging.Formatter FORMATTER = new NbFormater (); |
847 |
|
848 |
|
849 |
public String format(java.util.logging.LogRecord record) { |
850 |
StringBuffer sb = new StringBuffer(); |
851 |
sb.append(record.getLevel().getLocalizedName()); |
852 |
addLoggerName (sb, record); |
853 |
sb.append(": "); |
854 |
String message = formatMessage(record); |
855 |
sb.append(message); |
856 |
sb.append(lineSeparator); |
857 |
if (record.getThrown() != null) { |
858 |
try { |
859 |
StringWriter sw = new StringWriter(); |
860 |
PrintWriter pw = new PrintWriter(sw); |
861 |
record.getThrown().printStackTrace(pw); |
862 |
pw.close(); |
863 |
sb.append(sw.toString()); |
864 |
} catch (Exception ex) { |
865 |
} |
866 |
} |
867 |
return sb.toString(); |
868 |
} |
869 |
|
870 |
private static void addLoggerName (StringBuffer sb, java.util.logging.LogRecord record) { |
871 |
String name = record.getLoggerName (); |
872 |
if (!"".equals (name)) { |
873 |
if (record.getSourceClassName() != null) { |
874 |
sb.append(record.getSourceClassName()); |
875 |
} else { |
876 |
sb.append(record.getLoggerName()); |
877 |
} |
878 |
} |
879 |
} |
880 |
} |
852 |
} |
881 |
} |