From c9fea0e495c4fbcd5773311e17f14b47e45c383c Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Tue, 15 Jul 2008 09:42:35 +0000 Subject: [PATCH] [ 1897512 ] CLogger not thread safe - replace use of static and instance variable with context. Context should then be implemented as inheritable thread local in server environment ( done for ZK client, need to check the EJB & Servlet implementation ). --- .../org/compiere/util/CLogErrorBuffer.java | 88 ++++++++++++++----- base/src/org/compiere/util/CLogger.java | 47 +++++----- 2 files changed, 87 insertions(+), 48 deletions(-) diff --git a/base/src/org/compiere/util/CLogErrorBuffer.java b/base/src/org/compiere/util/CLogErrorBuffer.java index f01652fe4d..94cca8d668 100644 --- a/base/src/org/compiere/util/CLogErrorBuffer.java +++ b/base/src/org/compiere/util/CLogErrorBuffer.java @@ -30,6 +30,12 @@ import org.compiere.model.*; */ public class CLogErrorBuffer extends Handler { + private static final String ISSUE_ERROR_KEY = "org.compiere.util.CLogErrorBuffer.issueError"; + private static final String HISTORY_KEY = "org.compiere.util.CLogErrorBuffer.history"; + private static final String ERRORS_KEY = "org.compiere.util.CLogErrorBuffer.errors"; + private static final String LOGS_KEY = "org.compiere.util.CLogErrorBuffer.logs"; + + /** * Get Client Log Handler * @param create create if not exists @@ -62,17 +68,9 @@ public class CLogErrorBuffer extends Handler /** Error Buffer Size */ private static final int ERROR_SIZE = 20; - /** The Error Buffer */ - private LinkedList m_errors = new LinkedList(); - /** The Error Buffer History */ - private LinkedList m_history = new LinkedList(); /** Log Size */ private static final int LOG_SIZE = 100; - /** The Log Buffer */ - private LinkedList m_logs = new LinkedList(); - /** Issue Error */ - private volatile boolean m_issueError = true; /** * Initialize @@ -95,7 +93,13 @@ public class CLogErrorBuffer extends Handler */ public boolean isIssueError() { - return m_issueError; + Boolean b = (Boolean) Env.getCtx().get(ISSUE_ERROR_KEY); + if (b == null) + { + b = Boolean.TRUE; + setIssueError(b); + } + return b; } // isIssueError /** @@ -104,7 +108,7 @@ public class CLogErrorBuffer extends Handler */ public void setIssueError(boolean issueError) { - m_issueError = issueError; + Env.getCtx().put(ISSUE_ERROR_KEY, issueError); } // setIssueError /** @@ -134,6 +138,9 @@ public class CLogErrorBuffer extends Handler */ public void publish (LogRecord record) { + checkContext(); + + LinkedList m_logs = (LinkedList) Env.getCtx().get(LOGS_KEY); if (!isLoggable (record) || m_logs == null) return; @@ -148,6 +155,8 @@ public class CLogErrorBuffer extends Handler // We have an error if (record.getLevel() == Level.SEVERE) { + LinkedList m_errors = (LinkedList) Env.getCtx().get(ERRORS_KEY); + LinkedList m_history = (LinkedList) Env.getCtx().get(HISTORY_KEY); if (m_errors.size() >= ERROR_SIZE) { m_errors.removeFirst(); @@ -183,7 +192,7 @@ public class CLogErrorBuffer extends Handler historyArray[no++] = (LogRecord)history.get(i); m_history.add(historyArray); // Issue Reporting - if (m_issueError) + if (isIssueError()) { String loggerName = record.getLoggerName(); // class name String className = record.getSourceClassName(); // physical class @@ -196,16 +205,16 @@ public class CLogErrorBuffer extends Handler && loggerName.indexOf("CConnection") == -1 ) { - m_issueError = false; + setIssueError(false); try { MIssue.create(record); - m_issueError = true; + setIssueError(true); } catch (Throwable e) { //failed to save exception to db, print to console System.err.println(getFormatter().format(record)); - m_issueError = false; + setIssueError(false); } } else @@ -239,15 +248,9 @@ public class CLogErrorBuffer extends Handler */ public void close () throws SecurityException { - if (m_logs != null) - m_logs.clear(); - m_logs = null; - if (m_errors != null) - m_errors.clear(); - m_errors = null; - if (m_history != null) - m_history.clear(); - m_history = null; + Env.getCtx().remove(LOGS_KEY); + Env.getCtx().remove(ERRORS_KEY); + Env.getCtx().remove(HISTORY_KEY); } // close @@ -308,6 +311,10 @@ public class CLogErrorBuffer extends Handler */ public LogRecord[] getRecords (boolean errorsOnly) { + checkContext(); + + LinkedList m_logs = (LinkedList) Env.getCtx().get(LOGS_KEY); + LinkedList m_errors = (LinkedList) Env.getCtx().get(ERRORS_KEY); LogRecord[] retValue = null; if (errorsOnly) { @@ -334,6 +341,11 @@ public class CLogErrorBuffer extends Handler */ public void resetBuffer (boolean errorsOnly) { + checkContext(); + + LinkedList m_logs = (LinkedList) Env.getCtx().get(LOGS_KEY); + LinkedList m_errors = (LinkedList) Env.getCtx().get(ERRORS_KEY); + LinkedList m_history = (LinkedList) Env.getCtx().get(HISTORY_KEY); synchronized (m_errors) { m_errors.clear(); @@ -356,10 +368,13 @@ public class CLogErrorBuffer extends Handler */ public String getErrorInfo (Properties ctx, boolean errorsOnly) { + checkContext(); + StringBuffer sb = new StringBuffer(); // if (errorsOnly) { + LinkedList m_history = (LinkedList) Env.getCtx().get(HISTORY_KEY); for (int i = 0; i < m_history.size(); i++) { sb.append("-------------------------------\n"); @@ -373,6 +388,7 @@ public class CLogErrorBuffer extends Handler } else { + LinkedList m_logs = (LinkedList) Env.getCtx().get(LOGS_KEY); for (int i = 0; i < m_logs.size(); i++) { LogRecord record = (LogRecord)m_logs.get(i); @@ -386,12 +402,38 @@ public class CLogErrorBuffer extends Handler return sb.toString(); } // getErrorInfo + private void checkContext() + { + if (!Env.getCtx().containsKey(LOGS_KEY)) + { + LinkedList m_logs = new LinkedList(); + Env.getCtx().put(LOGS_KEY, m_logs); + } + + if (!Env.getCtx().containsKey(ERRORS_KEY)) + { + LinkedList m_errors = new LinkedList(); + Env.getCtx().put(ERRORS_KEY, m_errors); + } + + if (!Env.getCtx().containsKey(HISTORY_KEY)) + { + LinkedList m_history = new LinkedList(); + Env.getCtx().put(HISTORY_KEY, m_history); + } + } + /** * String Representation * @return info */ public String toString () { + checkContext(); + + LinkedList m_logs = (LinkedList) Env.getCtx().get(LOGS_KEY); + LinkedList m_errors = (LinkedList) Env.getCtx().get(ERRORS_KEY); + LinkedList m_history = (LinkedList) Env.getCtx().get(HISTORY_KEY); StringBuffer sb = new StringBuffer ("CLogErrorBuffer["); sb.append("Errors=").append(m_errors.size()) .append(",History=").append(m_history.size()) diff --git a/base/src/org/compiere/util/CLogger.java b/base/src/org/compiere/util/CLogger.java index 40ac98bbf6..a053f663ca 100644 --- a/base/src/org/compiere/util/CLogger.java +++ b/base/src/org/compiere/util/CLogger.java @@ -28,6 +28,12 @@ import java.util.logging.*; */ public class CLogger extends Logger implements Serializable { + private static final String LAST_INFO = "org.compiere.util.CLogger.lastInfo"; + private static final String LAST_WARNING = "org.compiere.util.CLogger.lastWarning"; + private static final String LAST_ERROR = "org.compiere.util.CLogger.lastError"; + private static final String LAST_EXCEPTION = "org.compiere.util.CLogger.lastException"; + + /** * Get Logger * @param className class name @@ -91,15 +97,6 @@ public class CLogger extends Logger implements Serializable /*************************************************************************/ - /** Last Error Message */ - private static ValueNamePair s_lastError = null; - /** Last Exception */ - private static Exception s_lastException = null; - /** Last Warning Message */ - private static ValueNamePair s_lastWarning = null; - /** Last Info Message */ - private static ValueNamePair s_lastInfo = null; - /** * Set and issue Error and save as ValueNamePair * @param AD_Message message key @@ -119,7 +116,7 @@ public class CLogger extends Logger implements Serializable */ public boolean saveError (String AD_Message, Exception ex) { - s_lastException = ex; + Env.getCtx().put(LAST_EXCEPTION, ex); return saveError (AD_Message, ex.getLocalizedMessage(), true); } // saveError @@ -132,7 +129,8 @@ public class CLogger extends Logger implements Serializable */ public boolean saveError (String AD_Message, String message, boolean issueError) { - s_lastError = new ValueNamePair (AD_Message, message); + ValueNamePair lastError = new ValueNamePair (AD_Message, message); + Env.getCtx().put(LAST_ERROR, lastError); // print it if (issueError) severe(AD_Message + " - " + message); @@ -145,8 +143,7 @@ public class CLogger extends Logger implements Serializable */ public static ValueNamePair retrieveError() { - ValueNamePair vp = s_lastError; - s_lastError = null; + ValueNamePair vp = (ValueNamePair) Env.getCtx().remove(LAST_ERROR); return vp; } // retrieveError @@ -170,8 +167,7 @@ public class CLogger extends Logger implements Serializable */ public static Exception retrieveException() { - Exception ex = s_lastException; - s_lastException = null; + Exception ex = (Exception) Env.getCtx().remove(LAST_EXCEPTION); return ex; } // retrieveError @@ -183,7 +179,8 @@ public class CLogger extends Logger implements Serializable */ public boolean saveWarning (String AD_Message, String message) { - s_lastWarning = new ValueNamePair (AD_Message, message); + ValueNamePair lastWarning = new ValueNamePair(AD_Message, message); + Env.getCtx().put(LAST_WARNING, lastWarning); // print it if (true) // issueError warning(AD_Message + " - " + message); @@ -196,8 +193,7 @@ public class CLogger extends Logger implements Serializable */ public static ValueNamePair retrieveWarning() { - ValueNamePair vp = s_lastWarning; - s_lastWarning = null; + ValueNamePair vp = (ValueNamePair) Env.getCtx().remove(LAST_WARNING); return vp; } // retrieveWarning @@ -209,7 +205,9 @@ public class CLogger extends Logger implements Serializable */ public boolean saveInfo (String AD_Message, String message) { - s_lastInfo = new ValueNamePair (AD_Message, message); +// s_lastInfo = new ValueNamePair (AD_Message, message); + ValueNamePair lastInfo = new ValueNamePair (AD_Message, message); + Env.getCtx().put(LAST_INFO, lastInfo); return true; } // saveInfo @@ -219,8 +217,7 @@ public class CLogger extends Logger implements Serializable */ public static ValueNamePair retrieveInfo() { - ValueNamePair vp = s_lastInfo; - s_lastInfo = null; + ValueNamePair vp = (ValueNamePair) Env.getCtx().remove(LAST_INFO); return vp; } // retrieveInfo @@ -229,10 +226,10 @@ public class CLogger extends Logger implements Serializable */ public static void resetLast() { - s_lastError = null; - s_lastException = null; - s_lastWarning = null; - s_lastInfo = null; + Env.getCtx().remove(LAST_ERROR); + Env.getCtx().remove(LAST_EXCEPTION); + Env.getCtx().remove(LAST_WARNING); + Env.getCtx().remove(LAST_INFO); } // resetLast /**