You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by mf...@apache.org on 2010/08/06 00:24:45 UTC

svn commit: r982809 - in /myfaces/portlet-bridge/core/trunk: api/src/main/java/javax/portlet/faces/ impl/src/main/java/org/apache/myfaces/portlet/faces/bridge/ impl/src/main/java/org/apache/myfaces/portlet/faces/util/

Author: mfreedman
Date: Thu Aug  5 22:24:45 2010
New Revision: 982809

URL: http://svn.apache.org/viewvc?rev=982809&view=rev
Log:
PORTLETBRIDGE-165: Bridge explicit scope removal doesn't cause its attributes to be notified but should
PORTLETBRIDGE-164: Bridge shouldn't notify (bridge) request scope attributes that they are being destroyed if only updating the scope at the end of a request
PORTLETBRIDGE-160: QueryString.numParameters throws NullPointerException
PORTLETBRIDGE-159: Race condition in GenericFacesPortlet: mFacesBridge 

Modified:
    myfaces/portlet-bridge/core/trunk/api/src/main/java/javax/portlet/faces/GenericFacesPortlet.java
    myfaces/portlet-bridge/core/trunk/impl/src/main/java/org/apache/myfaces/portlet/faces/bridge/BridgeImpl.java
    myfaces/portlet-bridge/core/trunk/impl/src/main/java/org/apache/myfaces/portlet/faces/util/QueryString.java

Modified: myfaces/portlet-bridge/core/trunk/api/src/main/java/javax/portlet/faces/GenericFacesPortlet.java
URL: http://svn.apache.org/viewvc/myfaces/portlet-bridge/core/trunk/api/src/main/java/javax/portlet/faces/GenericFacesPortlet.java?rev=982809&r1=982808&r2=982809&view=diff
==============================================================================
--- myfaces/portlet-bridge/core/trunk/api/src/main/java/javax/portlet/faces/GenericFacesPortlet.java (original)
+++ myfaces/portlet-bridge/core/trunk/api/src/main/java/javax/portlet/faces/GenericFacesPortlet.java Thu Aug  5 22:24:45 2010
@@ -167,7 +167,9 @@ public class GenericFacesPortlet extends
     getPortletContext().setAttribute(Bridge.BRIDGE_PACKAGE_PREFIX + getPortletName() + "." + 
                                      Bridge.DEFAULT_VIEWID_MAP, defaultViewIdMap);
 
-    // Don't instanciate/initialize the bridge yet. Do it on first use
+    // Initialize the bridge as the double lock mechanism used for lazy instantiation doesn't (always) work in Java even if 
+    // declared a volitle -- and the bridge is likely to be used anyway -- so why worry about it
+    initBridge();
   }
 
   /**
@@ -530,9 +532,6 @@ public class GenericFacesPortlet extends
   private void initBridgeRequest(PortletRequest request, 
                                  PortletResponse response) throws PortletException
   {
-    initBridge();
-
-
     // Now do any per request initialization
     // I nthis case look to see if the request is encoded (usually 
     // from a NonFaces view response) with the specific Faces
@@ -559,13 +558,10 @@ public class GenericFacesPortlet extends
       try
       {
         // ensure we only ever create/init one bridge per portlet
-        synchronized(mLock)
+        if (mFacesBridge == null)
         {
-          if (mFacesBridge == null)
-          {
-            mFacesBridge = mFacesBridgeClass.newInstance();
-            mFacesBridge.init(getPortletConfig());
-          }
+          mFacesBridge = mFacesBridgeClass.newInstance();
+          mFacesBridge.init(getPortletConfig());
         }
       }
       catch (Exception e)

Modified: myfaces/portlet-bridge/core/trunk/impl/src/main/java/org/apache/myfaces/portlet/faces/bridge/BridgeImpl.java
URL: http://svn.apache.org/viewvc/myfaces/portlet-bridge/core/trunk/impl/src/main/java/org/apache/myfaces/portlet/faces/bridge/BridgeImpl.java?rev=982809&r1=982808&r2=982809&view=diff
==============================================================================
--- myfaces/portlet-bridge/core/trunk/impl/src/main/java/org/apache/myfaces/portlet/faces/bridge/BridgeImpl.java (original)
+++ myfaces/portlet-bridge/core/trunk/impl/src/main/java/org/apache/myfaces/portlet/faces/bridge/BridgeImpl.java Thu Aug  5 22:24:45 2010
@@ -39,6 +39,8 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 
+import java.util.Vector;
+
 import javax.el.ELContext;
 import javax.el.ELContextEvent;
 import javax.el.ELContextListener;
@@ -1603,15 +1605,28 @@ public class BridgeImpl
 
       if (requestScopeMap != null)
       {
-      	Iterator<String> iterator = requestScopeMap.keySet().iterator();
-      	while (iterator.hasNext())
-      	{
+        Vector<String> scopesToRemove = (Vector<String>) new Vector(5);
+
+        Iterator<String> iterator = requestScopeMap.keySet().iterator();
+        while (iterator.hasNext())
+        {
           String scopeId = iterator.next();
           if (scopeId != null && scopeId.startsWith(scopePrefix))
           {
-          	iterator.remove();
+            // don't remove from iterator -- rather directly from the Map
+            // So the Maps.remove is called which invoked notifyPredestroy()
+            scopesToRemove.add(scopeId);
           }
-      	}
+        }
+        iterator = scopesToRemove.iterator();
+        while (iterator.hasNext())
+        {
+          String scopeId = iterator.next();
+          if (scopeId != null)
+          {
+            requestScopeMap.remove(scopeId);
+          }
+        }
       }
     }
   }
@@ -1763,12 +1778,9 @@ public class BridgeImpl
 
     public Map<String,Object> put(String key, Map<String, Object> value)
     {
-      Map<String,Object> o = super.put(key, value);
-      // notify attributes maintained in this object (map) they are going away
-      // Method in the outer BridgeImpl class
-      if (o != null)
-        notifyPreDestroy(o);
-      return o;
+      // Don't notify PreDestroy here.  New entry should be a duplicate/replacement for old entry
+      // containing the same elements (minus any added/removed in this request)
+      return super.put(key, value);
     }
 
   }

Modified: myfaces/portlet-bridge/core/trunk/impl/src/main/java/org/apache/myfaces/portlet/faces/util/QueryString.java
URL: http://svn.apache.org/viewvc/myfaces/portlet-bridge/core/trunk/impl/src/main/java/org/apache/myfaces/portlet/faces/util/QueryString.java?rev=982809&r1=982808&r2=982809&view=diff
==============================================================================
--- myfaces/portlet-bridge/core/trunk/impl/src/main/java/org/apache/myfaces/portlet/faces/util/QueryString.java (original)
+++ myfaces/portlet-bridge/core/trunk/impl/src/main/java/org/apache/myfaces/portlet/faces/util/QueryString.java Thu Aug  5 22:24:45 2010
@@ -168,7 +168,7 @@ public final class QueryString
   
   public int numParameters()
   {
-    return mParameterMap.size();
+    return (mParameterMap != null) ? mParameterMap.size() : 0;
   }
 
   public String getParameter(String name)