You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by gc...@apache.org on 2008/02/01 20:50:26 UTC

svn commit: r617621 - /myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/context/RequestContext.java

Author: gcrawford
Date: Fri Feb  1 11:50:22 2008
New Revision: 617621

URL: http://svn.apache.org/viewvc?rev=617621&view=rev
Log:
TRINIDAD-926 add method to get an application scoped concurrentMap to RequestContext

Modified:
    myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/context/RequestContext.java

Modified: myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/context/RequestContext.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/context/RequestContext.java?rev=617621&r1=617620&r2=617621&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/context/RequestContext.java (original)
+++ myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/context/RequestContext.java Fri Feb  1 11:50:22 2008
@@ -24,6 +24,9 @@
 import java.util.Map;
 import java.util.TimeZone;
 
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
 import javax.faces.component.UIComponent;
 import javax.faces.component.UIViewRoot;
 import javax.faces.context.FacesContext;
@@ -365,6 +368,29 @@
   public abstract ChangeManager getChangeManager();
 
   /**
+   * Gets a per application concurrent map. There is no synchronization
+   * with ServletContext attributes.
+   */
+   public ConcurrentMap<String, Object> getApplicationScopedConcurrentMap()
+   {
+     ClassLoader cl = _getClassLoader();
+
+     ConcurrentMap<String, Object> classMap = _APPLICATION_MAPS.get(cl);
+
+     if (classMap == null)
+     {
+       ConcurrentMap<String, Object> newClassMap = new ConcurrentHashMap<String, Object>();
+       ConcurrentMap<String, Object> oldClassMap = _APPLICATION_MAPS.putIfAbsent(cl, newClassMap);
+
+       classMap = ((oldClassMap != null)? oldClassMap : newClassMap);
+
+       assert(classMap != null);
+     }
+
+     return classMap;
+   }
+
+  /**
     * Gets the PageFlowScopeProvider for the current application.
     */
   public abstract PageFlowScopeProvider getPageFlowScopeProvider();
@@ -529,6 +555,17 @@
     return error;
   }
 
+  //
+  // Pick a ClassLoader
+  //
+  private ClassLoader _getClassLoader()
+  {
+    return Thread.currentThread().getContextClassLoader();
+  }
+
+  @SuppressWarnings({"CollectionWithoutInitialCapacity"})
+  private static final ConcurrentMap<ClassLoader, ConcurrentMap<String, Object>> _APPLICATION_MAPS =
+       new ConcurrentHashMap<ClassLoader, ConcurrentMap<String, Object>>();
   static private final ThreadLocal<RequestContext> _CURRENT_CONTEXT = 
     new ThreadLocal<RequestContext>();
   static private final TrinidadLogger _LOG =