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