Author: dan.j.allen
Date: 2008-12-04 03:06:28 -0500 (Thu, 04 Dec 2008)
New Revision: 9716
Modified:
trunk/src/main/org/jboss/seam/security/SecurityInterceptor.java
Log:
workaround a JVM bug by initializing the restrictions map lazily if it is found to be
null; use the volatile keyword for thread safety
Modified: trunk/src/main/org/jboss/seam/security/SecurityInterceptor.java
===================================================================
--- trunk/src/main/org/jboss/seam/security/SecurityInterceptor.java 2008-12-04 08:00:42
UTC (rev 9715)
+++ trunk/src/main/org/jboss/seam/security/SecurityInterceptor.java 2008-12-04 08:06:28
UTC (rev 9716)
@@ -30,7 +30,11 @@
{
private static final long serialVersionUID = -6567750187000766925L;
- private transient Map<Method,Restriction> restrictions = new
HashMap<Method,Restriction>();
+ /**
+ * You may encounter a JVM bug where the field initializer is not evaluated for a
transient field after deserialization.
+ * @see
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6252102
+ */
+ private transient volatile Map<Method,Restriction> restrictions = new
HashMap<Method,Restriction>();
private class Restriction
{
@@ -159,10 +163,20 @@
private Restriction getRestriction(Method interfaceMethod) throws Exception
{
+ // see field declaration as to why this is done
+ if (restrictions == null)
+ {
+ synchronized(this)
+ {
+ restrictions = new HashMap<Method, Restriction>();
+ }
+ }
+
if (!restrictions.containsKey(interfaceMethod))
{
synchronized(restrictions)
{
+ // FIXME this logic should be abstracted rather than sitting in the middle of
this interceptor
if (!restrictions.containsKey(interfaceMethod))
{
Restriction restriction = null;