details:   /erp/devel/pi/rev/d425ef421479
changeset: 7566:d425ef421479
user:      Martin Taal <martin.taal <at> openbravo.com>
date:      Mon Jun 07 20:50:55 2010 +0200
summary:   Fixes issue 13572: Maintain and print stacktraces when calls to 
setAdminMode and restoreAdminMode are unbalanced

diffstat:

 src-test/org/openbravo/test/dal/OBContextTest.java |  16 +++++++
 src/org/openbravo/dal/core/OBContext.java          |  48 +++++++++++++++++++++-
 2 files changed, 62 insertions(+), 2 deletions(-)

diffs (127 lines):

diff -r c65b9bc04055 -r d425ef421479 
src-test/org/openbravo/test/dal/OBContextTest.java
--- a/src-test/org/openbravo/test/dal/OBContextTest.java        Mon Jun 07 
20:29:21 2010 +0200
+++ b/src-test/org/openbravo/test/dal/OBContextTest.java        Mon Jun 07 
20:50:55 2010 +0200
@@ -151,6 +151,22 @@
     }
   }
 
+  /**
+   * See issue: https://issues.openbravo.com/view.php?id=13572 Maintain and 
print stacktraces when
+   * calls to setAdminMode and restoreAdminMode are unbalanced
+   * 
+   * To test this issue set the OBContext.ADMIN_TRACE_SIZE to a higher value 
than 0
+   */
+  public void testUnbalancedCallsToAdminMode() {
+    OBContext.setAdminMode();
+    OBContext.setAdminMode();
+    OBContext.setAdminMode();
+    OBContext.restorePreviousMode();
+    OBContext.restorePreviousMode();
+    OBContext.restorePreviousMode();
+    OBContext.restorePreviousMode();
+  }
+
   // the scenario:
   // thread1 T1
   // thread2 T2
diff -r c65b9bc04055 -r d425ef421479 src/org/openbravo/dal/core/OBContext.java
--- a/src/org/openbravo/dal/core/OBContext.java Mon Jun 07 20:29:21 2010 +0200
+++ b/src/org/openbravo/dal/core/OBContext.java Mon Jun 07 20:50:55 2010 +0200
@@ -21,6 +21,9 @@
 
 import java.io.IOException;
 import java.io.ObjectOutputStream;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -79,11 +82,15 @@
   private static final String CLIENT = "#AD_Client_ID";
   private static final String ORG = "#AD_Org_ID";
 
+  // set this to a higher value to enable admin mode tracing
+  private static final int ADMIN_TRACE_SIZE = 0;
+
   private static ThreadLocal<OBContext> instance = new 
ThreadLocal<OBContext>();
 
   private static ThreadLocal<OBContext> adminModeSet = new 
ThreadLocal<OBContext>();
 
   private static ThreadLocal<Stack<Boolean>> adminModeStack = new 
ThreadLocal<Stack<Boolean>>();
+  private static ThreadLocal<List<String>> adminModeTrace = new 
ThreadLocal<List<String>>();
 
   public static final String CONTEXT_PARAM = "#OBContext";
 
@@ -133,6 +140,9 @@
     } else if (OBContext.getOBContext() == adminContext) {
       return;
     }
+    if (OBContext.getOBContext() != null) {
+      addStackTrace("setAdminMode");
+    }
   }
 
   private static Stack<Boolean> getAdminModeStack() {
@@ -162,18 +172,51 @@
     if (stack.size() > 0) {
       stack.pop();
     } else {
-      log.warn("Unbalanced calls to setAdminMode and restorePreviousMode",
-          new IllegalStateException());
+      final List<String> adminModeTraceList = adminModeTrace.get();
+      final StringBuilder sb = new StringBuilder();
+      if (adminModeTrace != null) {
+        for (String adminModeTraceValue : adminModeTraceList) {
+          sb.append("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
+          sb.append(adminModeTraceValue);
+        }
+      }
+      if (ADMIN_TRACE_SIZE == 0) {
+        log.warn(
+            "Unbalanced calls to setAdminMode and restorePreviousMode. "
+                + "Consider setting the constant OBContext.ADMIN_TRACE_SIZE to 
a value higher than 0 to debug this situation",
+            new IllegalStateException());
+      } else {
+        log.warn("Unbalanced calls to setAdminMode and restorePreviousMode" + 
sb.toString(),
+            new IllegalStateException());
+      }
     }
 
     if (OBContext.getOBContext() == null) {
       return;
     }
+    addStackTrace("restorePreviousMode");
     if (stack.isEmpty() && OBContext.getOBContext() == adminContext) {
       OBContext.setOBContext((OBContext) null);
     }
   }
 
+  private static void addStackTrace(String prefix) {
+    final StringWriter sw = new StringWriter();
+    final PrintWriter pw = new PrintWriter(sw);
+    sw.write(prefix + "\n");
+    new Exception().printStackTrace(pw);
+    if (adminModeTrace.get() == null) {
+      adminModeTrace.set(new ArrayList<String>());
+    }
+    final List<String> list = adminModeTrace.get();
+    if (list.size() > 0 && list.size() >= ADMIN_TRACE_SIZE) {
+      list.remove(0);
+    }
+    if (ADMIN_TRACE_SIZE > 0) {
+      list.add(sw.toString());
+    }
+  }
+
   /**
    * Clears the admin context stack.
    */
@@ -187,6 +230,7 @@
       log.warn("Unbalanced calls to enableAsAdminContext and 
resetAsAdminContext");
       adminModeSet.set(null);
     }
+    adminModeTrace.set(null);
   }
 
   /**

------------------------------------------------------------------------------
ThinkGeek and WIRED's GeekDad team up for the Ultimate 
GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the 
lucky parental unit.  See the prize list and enter to win: 
http://p.sf.net/sfu/thinkgeek-promo
_______________________________________________
Openbravo-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openbravo-commits

Reply via email to