From: Dave B. <bla...@us...> - 2012-02-20 17:47:58
|
Update of /cvsroot/sblim/jsr48-client/src/org/sblim/cimclient/internal/logging In directory vz-cvs-3.sog:/tmp/cvs-serv30389/src/org/sblim/cimclient/internal/logging Modified Files: LogAndTraceBroker.java Log Message: 3484014 - Add LogAndTraceBroker.isLoggable for message/trace Index: LogAndTraceBroker.java =================================================================== RCS file: /cvsroot/sblim/jsr48-client/src/org/sblim/cimclient/internal/logging/LogAndTraceBroker.java,v retrieving revision 1.23 retrieving revision 1.24 diff -u -d -r1.23 -r1.24 --- LogAndTraceBroker.java 17 Jan 2012 14:11:11 -0000 1.23 +++ LogAndTraceBroker.java 20 Feb 2012 17:47:56 -0000 1.24 @@ -26,6 +26,7 @@ * 3252669 2011-03-28 blaschke-oss setXmlTraceStream blindly closes previous stream * 3400209 2011-08-31 blaschke-oss Highlighted Static Analysis (PMD) issues * 3469018 2012-01-03 blaschke-oss Properties not passed to CIMIndicationHandler + * 3484014 2012-02-03 blaschke-oss Add LogAndTraceBroker.isLoggable for message/trace */ package org.sblim.cimclient.internal.logging; @@ -111,6 +112,28 @@ private final String iTHROWABLE = Throwable.class.getName(); + private int iInternalLevelConsole = Level.OFF.intValue(); + + private int iInternalLevelLogFile = Level.OFF.intValue(); + + private int iInternalLevelTraceFile = Level.OFF.intValue(); + + private LogListener iInternalListenerLogConsole = null; + + private LogListener iInternalListenerLogFile = null; + + private TraceListener iInternalListenerTraceConsole = null; + + private TraceListener iInternalListenerTraceFile = null; + + private int iNumInternalLogListeners = 0; + + private int iNumExternalLogListeners = 0; + + private int iNumInternalTraceListeners = 0; + + private int iNumExternalTraceListeners = 0; + private LogAndTraceBroker() { this.iLogListeners = new ArrayList<LogListener>(); this.iTraceListeners = new ArrayList<TraceListener>(); @@ -133,7 +156,9 @@ logger.addHandler(handler); logger.setLevel(level); logger.setUseParentHandlers(false); - addLogListener(new LogListener() { + this.iInternalLevelConsole = level.intValue(); + if (this.iInternalListenerLogConsole != null) removeLogListener(this.iInternalListenerLogConsole); + this.iInternalListenerLogConsole = new LogListener() { public void log(Level pLevel, String pMessageKey, String pMessage, Object[] pParameters) { @@ -141,7 +166,8 @@ record.setParameters(pParameters); logger.log(record); } - }); + }; + addLogListener(this.iInternalListenerLogConsole); } } catch (Exception e) { // Don't crash for logging @@ -159,7 +185,9 @@ logger.addHandler(handler); logger.setLevel(level); logger.setUseParentHandlers(false); - addLogListener(new LogListener() { + this.iInternalLevelLogFile = level.intValue(); + if (this.iInternalListenerLogFile != null) removeLogListener(this.iInternalListenerLogFile); + this.iInternalListenerLogFile = new LogListener() { public void log(Level pLevel, String pMessageKey, String pMessage, Object[] pParameters) { @@ -167,7 +195,8 @@ record.setParameters(pParameters); logger.log(record); } - }); + }; + addLogListener(this.iInternalListenerLogFile); } } catch (Exception e) { // Don't crash for logging @@ -183,7 +212,9 @@ logger.addHandler(handler); logger.setLevel(level); logger.setUseParentHandlers(false); - addTraceListener(new TraceListener() { + this.iInternalLevelConsole = level.intValue(); + if (this.iInternalListenerTraceConsole != null) removeTraceListener(this.iInternalListenerTraceConsole); + this.iInternalListenerTraceConsole = new TraceListener() { public void trace(Level pLevel, StackTraceElement pOrigin, String pMessage) { LogRecord record = new LogRecord(pLevel, pMessage); @@ -198,7 +229,8 @@ record.setThrown(pThrown); logger.log(record); } - }); + }; + addTraceListener(this.iInternalListenerTraceConsole); } } catch (Exception e) { // Don't crash for logging @@ -216,7 +248,9 @@ logger.addHandler(handler); logger.setLevel(level); logger.setUseParentHandlers(false); - addTraceListener(new TraceListener() { + this.iInternalLevelTraceFile = level.intValue(); + if (this.iInternalListenerTraceFile != null) removeTraceListener(this.iInternalListenerTraceFile); + this.iInternalListenerTraceFile = new TraceListener() { public void trace(Level pLevel, StackTraceElement pOrigin, String pMessage) { LogRecord record = new LogRecord(pLevel, pMessage); @@ -231,7 +265,8 @@ record.setThrown(pThrown); logger.log(record); } - }); + }; + addTraceListener(this.iInternalListenerTraceFile); } } catch (Exception e) { // Don't crash for logging @@ -246,10 +281,20 @@ * The listener */ public synchronized void addLogListener(LogListener pListener) { + if (pListener == null) return; sendGreetings(pListener); ArrayList<LogListener> newListeners = new ArrayList<LogListener>(this.iLogListeners); newListeners.add(pListener); this.iLogListeners = newListeners; + + if ((this.iInternalListenerLogFile != null && this.iInternalListenerLogFile + .equals(pListener)) + || (this.iInternalListenerLogConsole != null && this.iInternalListenerLogConsole + .equals(pListener))) { + this.iNumInternalLogListeners++; + } else { + this.iNumExternalLogListeners++; + } } private void loadVersionTxt() { @@ -356,8 +401,23 @@ */ public synchronized void removeLogListener(LogListener pListener) { ArrayList<LogListener> newListeners = new ArrayList<LogListener>(this.iLogListeners); - newListeners.remove(pListener); + if (!newListeners.remove(pListener)) return; this.iLogListeners = newListeners; + + if (this.iInternalListenerLogFile != null + && this.iInternalListenerLogFile.equals(pListener)) { + // Removing internal log listener for file + this.iInternalListenerLogFile = null; + this.iNumInternalLogListeners--; + } else if (this.iInternalListenerLogConsole != null + && this.iInternalListenerLogConsole.equals(pListener)) { + // Removing internal log listener for console + this.iInternalListenerLogConsole = null; + this.iNumInternalLogListeners--; + } else { + // Removing user log listener + this.iNumExternalLogListeners--; + } } /** @@ -368,6 +428,11 @@ this.iLogListeners = new ArrayList<LogListener>(); removeHandlers(Logger.getLogger(CONSOLE_LOGGER)); removeHandlers(Logger.getLogger(FILE_LOGGER)); + + this.iInternalListenerLogFile = null; + this.iInternalListenerLogConsole = null; + this.iNumInternalLogListeners = 0; + this.iNumExternalLogListeners = 0; } /** @@ -388,10 +453,20 @@ * The listener */ public synchronized void addTraceListener(TraceListener pListener) { + if (pListener == null) return; sendGreetings(pListener); ArrayList<TraceListener> newListeners = new ArrayList<TraceListener>(this.iTraceListeners); newListeners.add(pListener); this.iTraceListeners = newListeners; + + if ((this.iInternalListenerTraceFile != null && this.iInternalListenerTraceFile + .equals(pListener)) + || (this.iInternalListenerTraceConsole != null && this.iInternalListenerTraceConsole + .equals(pListener))) { + this.iNumInternalTraceListeners++; + } else { + this.iNumExternalTraceListeners++; + } } /** @@ -403,8 +478,23 @@ */ public synchronized void removeTraceListener(TraceListener pListener) { ArrayList<TraceListener> newListeners = new ArrayList<TraceListener>(this.iTraceListeners); - newListeners.remove(pListener); + if (!newListeners.remove(pListener)) return; this.iTraceListeners = newListeners; + + if (this.iInternalListenerTraceFile != null + && this.iInternalListenerTraceFile.equals(pListener)) { + // Removing internal tracelistener for file + this.iInternalListenerTraceFile = null; + this.iNumInternalTraceListeners--; + } else if (this.iInternalListenerTraceConsole != null + && this.iInternalListenerTraceConsole.equals(pListener)) { + // Removing internal trace listener for console + this.iInternalListenerTraceConsole = null; + this.iNumInternalTraceListeners--; + } else { + // Removing user trace listener + this.iNumExternalTraceListeners--; + } } /** @@ -414,6 +504,11 @@ public synchronized void clearTraceListeners() { this.iTraceListeners = new ArrayList<TraceListener>(); removeHandlers(Logger.getLogger(TRACE_LOGGER)); + + this.iInternalListenerTraceFile = null; + this.iInternalListenerTraceConsole = null; + this.iNumInternalTraceListeners = 0; + this.iNumExternalTraceListeners = 0; } /** @@ -599,4 +694,90 @@ } } + /** + * Checks whether there are trace listeners installed that will log a trace + * message with the specified level. Use this method to determine if a + * trace() method call could result in logging before preparing the + * information to be logged. For example: + * + * <pre> + * if (logger.isLoggableTrace(Level.WARNING) { + * // Prepare info for logging + * logger.trace(Level.WARNING, ... + * </pre> + * + * @param pLevel + * The <code>Level</code> of the trace message. + * @return <code>true</code> if trace message could be logged, + * <code>false</code> otherwise. + */ + public boolean isLoggableTrace(Level pLevel) { + // If there are no trace listeners or specified level is OFF, message + // will not be logged + if (this.iTraceListeners.size() == 0 || pLevel.intValue() == Level.OFF.intValue()) return false; + + // If there are external trace listeners, message could be logged (user + // can alter level at will, so we do not know what it is) + if (this.iNumExternalTraceListeners > 0) return true; + + // If there are internal trace listeners, determine if message will be + // logged + if (this.iNumInternalTraceListeners > 0) { + int level = Level.OFF.intValue(); + if (this.iInternalListenerTraceFile != null) { + level = this.iInternalLevelTraceFile; + } + if (this.iInternalListenerTraceConsole != null && level > this.iInternalLevelConsole) { + level = this.iInternalLevelConsole; + } + return level <= pLevel.intValue(); + } + + return true; + } + + /** + * Checks whether there are log listeners installed that will log a message + * with the specified level. Use this method to determine if a message() + * method call could result in logging before preparing the information to + * be logged. For example: + * + * <pre> + * if (logger.isLoggableMessage(Level.WARNING) { + * // Prepare info for logging + * logger.message(Level.WARNING, ... + * </pre> + * + * @param pLevel + * The <code>Level</code> of the message. + * @return <code>true</code> if message could be logged, <code>false</code> + * otherwise. + */ + public boolean isLoggableMessage(Level pLevel) { + // If message is traceable, message could be logged + if (isLoggableTrace(pLevel)) return true; + + // If there are no log listeners or specified level is OFF, message + // will not be logged + if (this.iLogListeners.size() == 0 || pLevel.intValue() == Level.OFF.intValue()) return false; + + // If there are external log listeners, message could be logged (user + // can alter level at will, so we do not know what it is) + if (this.iNumExternalLogListeners > 0) return true; + + // If there are internal log listeners, determine if message will be + // logged + if (this.iNumInternalLogListeners > 0) { + int level = Level.OFF.intValue(); + if (this.iInternalListenerLogFile != null) { + level = this.iInternalLevelLogFile; + } + if (this.iInternalListenerLogConsole != null && level > this.iInternalLevelConsole) { + level = this.iInternalLevelConsole; + } + return level <= pLevel.intValue(); + } + + return true; + } } |