You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ar...@apache.org on 2012/02/02 00:42:30 UTC

svn commit: r1239407 - in /myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component: UIXDocumentTemplate.java html/HtmlBodyTemplate.java html/HtmlHeadTemplate.java

Author: arobinson74
Date: Wed Feb  1 23:42:30 2012
New Revision: 1239407

URL: http://svn.apache.org/viewvc?rev=1239407&view=rev
Log:
TRINIDAD-2203 - Move the suspension and resume code into the setup/teardown of UIXDocument, HtmlHead and HtmlBody so that the re-entrant call does not cause false errors in testing mode since the context change stack is going to be suspended.

Modified:
    myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXDocumentTemplate.java
    myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/html/HtmlBodyTemplate.java
    myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/html/HtmlHeadTemplate.java

Modified: myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXDocumentTemplate.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXDocumentTemplate.java?rev=1239407&r1=1239406&r2=1239407&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXDocumentTemplate.java (original)
+++ myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/UIXDocumentTemplate.java Wed Feb  1 23:42:30 2012
@@ -18,64 +18,77 @@
  */
 package org.apache.myfaces.trinidad.component;
 
-import javax.faces.FacesException;
-import javax.faces.component.ContextCallback;
-import javax.faces.component.visit.VisitCallback;
-import javax.faces.component.visit.VisitContext;
+import java.util.ArrayDeque;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Queue;
+
 import javax.faces.context.FacesContext;
 
 import org.apache.myfaces.trinidad.context.ComponentContextManager;
 import org.apache.myfaces.trinidad.context.RequestContext;
 import org.apache.myfaces.trinidad.context.SuspendedContextChanges;
+import org.apache.myfaces.trinidad.logging.TrinidadLogger;
 
 
 public abstract class UIXDocumentTemplate
   extends UIXComponentBase
 {
+  /**
+   * Suspends any context changes before allowing invokeOnComponent or visitTree calls to continue,
+   * allowing components to undo any context changes during a re-entrant call.
+   * @param facesContext the faces context
+   * @see ComponentContextManager#suspend(FacesContext)
+   */
   @Override
-  public boolean visitTree(
-    VisitContext  visitContext,
-    VisitCallback callback)
+  protected void setupVisitingContext(FacesContext facesContext)
   {
     ComponentContextManager ctxMgr = RequestContext.getCurrentInstance()
       .getComponentContextManager();
-    FacesContext facesContext = visitContext.getFacesContext();
 
     // Suspend any current component context during a visit tree for re-entrant
     // component tree processing
     SuspendedContextChanges suspendedChanges = ctxMgr.suspend(facesContext);
 
-    try
-    {
-      return super.visitTree(visitContext, callback);
-    }
-    finally
+    Map<String, Object> reqMap = facesContext.getExternalContext().getRequestMap();
+    @SuppressWarnings("unchecked")
+    Queue<SuspendedContextChanges> suspendedChangesQueue = (Queue<SuspendedContextChanges>)
+      reqMap.get(_SUSPENDED_CHANGES_KEY);
+    if (suspendedChangesQueue == null)
     {
-      ctxMgr.resume(facesContext, suspendedChanges);
+      suspendedChangesQueue = Collections.asLifoQueue(new ArrayDeque<SuspendedContextChanges>());
+      reqMap.put(_SUSPENDED_CHANGES_KEY, suspendedChangesQueue);
     }
+
+    suspendedChangesQueue.offer(suspendedChanges);
+    _LOG.severe("UIXDocument suspended context changes in setupVisitingContext");
+
+    super.setupVisitingContext(facesContext);
   }
 
+  /**
+   * Re-applies the suspended context changes.
+   * @param facesContext the faces context
+   * @see #setupVisitingContext(FacesContext)
+   * @see ComponentContextManager#resume(FacesContext, SuspendedContextChanges)
+   */
   @Override
-  public boolean invokeOnComponent(
-    FacesContext    facesContext,
-    String          clientId,
-    ContextCallback callback
-    ) throws FacesException
+  protected void tearDownVisitingContext(FacesContext facesContext)
   {
+    super.tearDownVisitingContext(facesContext);
+
     ComponentContextManager ctxMgr = RequestContext.getCurrentInstance()
       .getComponentContextManager();
-
-    // Suspend any current component context during an invoke on component call for re-entrant
-    // component tree processing
-    SuspendedContextChanges suspendedChanges = ctxMgr.suspend(facesContext);
-
-    try
-    {
-      return super.invokeOnComponent(facesContext, clientId, callback);
-    }
-    finally
-    {
-      ctxMgr.resume(facesContext, suspendedChanges);
-    }
+    Map<String, Object> reqMap = facesContext.getExternalContext().getRequestMap();
+    @SuppressWarnings("unchecked")
+    Queue<SuspendedContextChanges> suspendedChangesQueue = (Queue<SuspendedContextChanges>)
+      reqMap.get(_SUSPENDED_CHANGES_KEY);
+    SuspendedContextChanges changes = suspendedChangesQueue.poll();
+    ctxMgr.resume(facesContext, changes);
+    _LOG.severe("UIXDocument resumed context changes in setupVisitingContext");
   }
+
+  private final static String _SUSPENDED_CHANGES_KEY = UIXDocument.class.getName() +
+                                                       ".SUSPENDED_CHANGES";
+  private static final TrinidadLogger _LOG = TrinidadLogger.createTrinidadLogger(UIXDocument.class);
 }

Modified: myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/html/HtmlBodyTemplate.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/html/HtmlBodyTemplate.java?rev=1239407&r1=1239406&r2=1239407&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/html/HtmlBodyTemplate.java (original)
+++ myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/html/HtmlBodyTemplate.java Wed Feb  1 23:42:30 2012
@@ -18,10 +18,11 @@
  */
 package org.apache.myfaces.trinidad.component.html;
 
-import javax.faces.FacesException;
-import javax.faces.component.ContextCallback;
-import javax.faces.component.visit.VisitCallback;
-import javax.faces.component.visit.VisitContext;
+import java.util.ArrayDeque;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Queue;
+
 import javax.faces.context.FacesContext;
 
 import org.apache.myfaces.trinidad.component.UIXComponentBase;
@@ -33,50 +34,58 @@ import org.apache.myfaces.trinidad.conte
 public abstract class HtmlBodyTemplate
   extends UIXComponentBase
 {
+  /**
+   * Suspends any context changes before allowing invokeOnComponent or visitTree calls to continue,
+   * allowing components to undo any context changes during a re-entrant call.
+   * @param facesContext the faces context
+   * @see ComponentContextManager#suspend(FacesContext)
+   */
   @Override
-  public boolean visitTree(
-    VisitContext  visitContext,
-    VisitCallback callback)
+  protected void setupVisitingContext(FacesContext facesContext)
   {
     ComponentContextManager ctxMgr = RequestContext.getCurrentInstance()
       .getComponentContextManager();
-    FacesContext facesContext = visitContext.getFacesContext();
 
     // Suspend any current component context during a visit tree for re-entrant
     // component tree processing
     SuspendedContextChanges suspendedChanges = ctxMgr.suspend(facesContext);
 
-    try
-    {
-      return super.visitTree(visitContext, callback);
-    }
-    finally
+    Map<String, Object> reqMap = facesContext.getExternalContext().getRequestMap();
+    @SuppressWarnings("unchecked")
+    Queue<SuspendedContextChanges> suspendedChangesQueue = (Queue<SuspendedContextChanges>)
+      reqMap.get(_SUSPENDED_CHANGES_KEY);
+    if (suspendedChanges == null)
     {
-      ctxMgr.resume(facesContext, suspendedChanges);
+      suspendedChangesQueue = Collections.asLifoQueue(new ArrayDeque<SuspendedContextChanges>());
+      reqMap.put(_SUSPENDED_CHANGES_KEY, suspendedChangesQueue);
     }
+
+    suspendedChangesQueue.offer(suspendedChanges);
+
+    super.setupVisitingContext(facesContext);
   }
 
+  /**
+   * Re-applies the suspended context changes.
+   * @param facesContext the faces context
+   * @see #setupVisitingContext(FacesContext)
+   * @see ComponentContextManager#resume(FacesContext, SuspendedContextChanges)
+   */
   @Override
-  public boolean invokeOnComponent(
-    FacesContext    facesContext,
-    String          clientId,
-    ContextCallback callback
-    ) throws FacesException
+  protected void tearDownVisitingContext(FacesContext facesContext)
   {
+    super.tearDownVisitingContext(facesContext);
+
     ComponentContextManager ctxMgr = RequestContext.getCurrentInstance()
       .getComponentContextManager();
-
-    // Suspend any current component context during an invoke on component call for re-entrant
-    // component tree processing
-    SuspendedContextChanges suspendedChanges = ctxMgr.suspend(facesContext);
-
-    try
-    {
-      return super.invokeOnComponent(facesContext, clientId, callback);
-    }
-    finally
-    {
-      ctxMgr.resume(facesContext, suspendedChanges);
-    }
+    Map<String, Object> reqMap = facesContext.getExternalContext().getRequestMap();
+    @SuppressWarnings("unchecked")
+    Queue<SuspendedContextChanges> suspendedChangesQueue = (Queue<SuspendedContextChanges>)
+      reqMap.get(_SUSPENDED_CHANGES_KEY);
+    SuspendedContextChanges changes = suspendedChangesQueue.poll();
+    ctxMgr.resume(facesContext, changes);
   }
+
+  private final static String _SUSPENDED_CHANGES_KEY = HtmlBody.class.getName() +
+                                                       ".SUSPENDED_CHANGES";
 }
\ No newline at end of file

Modified: myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/html/HtmlHeadTemplate.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/html/HtmlHeadTemplate.java?rev=1239407&r1=1239406&r2=1239407&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/html/HtmlHeadTemplate.java (original)
+++ myfaces/trinidad/trunk/trinidad-api/src/main/java-templates/org/apache/myfaces/trinidad/component/html/HtmlHeadTemplate.java Wed Feb  1 23:42:30 2012
@@ -18,10 +18,11 @@
  */
 package org.apache.myfaces.trinidad.component.html;
 
-import javax.faces.FacesException;
-import javax.faces.component.ContextCallback;
-import javax.faces.component.visit.VisitCallback;
-import javax.faces.component.visit.VisitContext;
+import java.util.ArrayDeque;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Queue;
+
 import javax.faces.context.FacesContext;
 
 import org.apache.myfaces.trinidad.component.UIXComponentBase;
@@ -33,50 +34,58 @@ import org.apache.myfaces.trinidad.conte
 public abstract class HtmlHeadTemplate
   extends UIXComponentBase
 {
+  /**
+   * Suspends any context changes before allowing invokeOnComponent or visitTree calls to continue,
+   * allowing components to undo any context changes during a re-entrant call.
+   * @param facesContext the faces context
+   * @see ComponentContextManager#suspend(FacesContext)
+   */
   @Override
-  public boolean visitTree(
-    VisitContext  visitContext,
-    VisitCallback callback)
+  protected void setupVisitingContext(FacesContext facesContext)
   {
     ComponentContextManager ctxMgr = RequestContext.getCurrentInstance()
       .getComponentContextManager();
-    FacesContext facesContext = visitContext.getFacesContext();
 
     // Suspend any current component context during a visit tree for re-entrant
     // component tree processing
     SuspendedContextChanges suspendedChanges = ctxMgr.suspend(facesContext);
 
-    try
-    {
-      return super.visitTree(visitContext, callback);
-    }
-    finally
+    Map<String, Object> reqMap = facesContext.getExternalContext().getRequestMap();
+    @SuppressWarnings("unchecked")
+    Queue<SuspendedContextChanges> suspendedChangesQueue = (Queue<SuspendedContextChanges>)
+      reqMap.get(_SUSPENDED_CHANGES_KEY);
+    if (suspendedChanges == null)
     {
-      ctxMgr.resume(facesContext, suspendedChanges);
+      suspendedChangesQueue = Collections.asLifoQueue(new ArrayDeque<SuspendedContextChanges>());
+      reqMap.put(_SUSPENDED_CHANGES_KEY, suspendedChangesQueue);
     }
+
+    suspendedChangesQueue.offer(suspendedChanges);
+
+    super.setupVisitingContext(facesContext);
   }
 
+  /**
+   * Re-applies the suspended context changes.
+   * @param facesContext the faces context
+   * @see #setupVisitingContext(FacesContext)
+   * @see ComponentContextManager#resume(FacesContext, SuspendedContextChanges)
+   */
   @Override
-  public boolean invokeOnComponent(
-    FacesContext    facesContext,
-    String          clientId,
-    ContextCallback callback
-    ) throws FacesException
+  protected void tearDownVisitingContext(FacesContext facesContext)
   {
+    super.tearDownVisitingContext(facesContext);
+
     ComponentContextManager ctxMgr = RequestContext.getCurrentInstance()
       .getComponentContextManager();
-
-    // Suspend any current component context during an invoke on component call for re-entrant
-    // component tree processing
-    SuspendedContextChanges suspendedChanges = ctxMgr.suspend(facesContext);
-
-    try
-    {
-      return super.invokeOnComponent(facesContext, clientId, callback);
-    }
-    finally
-    {
-      ctxMgr.resume(facesContext, suspendedChanges);
-    }
+    Map<String, Object> reqMap = facesContext.getExternalContext().getRequestMap();
+    @SuppressWarnings("unchecked")
+    Queue<SuspendedContextChanges> suspendedChangesQueue = (Queue<SuspendedContextChanges>)
+      reqMap.get(_SUSPENDED_CHANGES_KEY);
+    SuspendedContextChanges changes = suspendedChangesQueue.poll();
+    ctxMgr.resume(facesContext, changes);
   }
+
+  private final static String _SUSPENDED_CHANGES_KEY = HtmlHead.class.getName() +
+                                                       ".SUSPENDED_CHANGES";
 }
\ No newline at end of file