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 2013/12/02 18:30:13 UTC
svn commit: r1547120 - in /myfaces/trinidad/trunk:
trinidad-api/src/main/java/org/apache/myfaces/trinidad/context/RequestContext.java
trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/taglib/ForEachTag.java
Author: arobinson74
Date: Mon Dec 2 17:30:13 2013
New Revision: 1547120
URL: http://svn.apache.org/r1547120
Log:
TRINIDAD-2430
Added an API to RequestContext to be used by ForEachTag to avoid cleaning up when tags are not going to be executed during a request
Modified:
myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/context/RequestContext.java
myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/taglib/ForEachTag.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=1547120&r1=1547119&r2=1547120&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 Mon Dec 2 17:30:13 2013
@@ -23,6 +23,7 @@ import java.awt.Color;
import java.io.IOException;
import java.math.RoundingMode;
+
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@@ -96,8 +97,6 @@ abstract public class RequestContext
return _CURRENT_CONTEXT.get();
}
-
-
/**
* Creates an RequestContext. RequestContext is abstract
* and may not be instantiated directly.
@@ -257,6 +256,7 @@ abstract public class RequestContext
* @return is this request a PPR request?
*/
public abstract boolean isPartialRequest(FacesContext context);
+
/**
* Returns true if output should contain debugging information.
*/
@@ -409,12 +409,12 @@ abstract public class RequestContext
/**
* Performs a reverse lookup of an Accessibilty constant based on
* its display name.
- *
+ *
* @param displayName the display name of the Accessibility constant to return.
* @return the non-null Accessibility constant associated with the display name.
* @throws IllegalArgumentException if displayName does not correspond
* to some Accessibility constant.
- * @throws NullPointerException if displayName is null.
+ * @throws NullPointerException if displayName is null.
*/
public static Accessibility valueOfDisplayName(String displayName)
{
@@ -422,23 +422,23 @@ abstract public class RequestContext
{
throw new NullPointerException();
}
-
+
Accessibility accessibility = _displayNameMap.get(displayName);
-
+
if (accessibility == null)
{
- String message = _LOG.getMessage("ILLEGAL_ENUM_VALUE",
+ String message = _LOG.getMessage("ILLEGAL_ENUM_VALUE",
new Object[] { Accessibility.class.getName(), displayName });
throw new IllegalArgumentException(message);
}
-
+
return accessibility;
}
private final String _displayName;
-
+
private static final Map<String, Accessibility> _displayNameMap;
-
+
static
{
Map<String, Accessibility> displayNameMap = new ArrayMap<String, Accessibility>(3);
@@ -446,12 +446,11 @@ abstract public class RequestContext
{
displayNameMap.put(accessibility.displayName(), accessibility);
}
-
+
_displayNameMap = Collections.unmodifiableMap(displayNameMap);
}
};
-
public enum ClientValidation
{
ALERT("alert"),
@@ -534,6 +533,39 @@ abstract public class RequestContext
// TODO do we need to provide getCurrencySymbol() as well?
public abstract String getCurrencyCode();
+ /**
+ * Notify Trinidad that tag execution will not be performed during this request. Functionality in
+ * Trinidad assumes that tags will be executed as part of the render response phase. If 3rd party
+ * libraries are used that cause the tags to not be executed, Trinidad must be notified to avoid
+ * errors.
+ */
+ public void tagExecutionSkipped()
+ {
+ _tagExecution = TagExecution.NONE;
+ }
+
+ /**
+ * Checks if the tags will be executed during this request.
+ * @see #tagExecutionSkipped()
+ * @return an enumeration indicating the status of the tag execution
+ */
+ public TagExecution getTagExecutionStatus()
+ {
+ return _tagExecution;
+ }
+
+ /**
+ * @see #isTagExecutionSkipped()
+ */
+ public enum TagExecution
+ {
+ /** Tag execution will be run normally during this request */
+ FULL,
+
+ /** Tag execution will not be run during this request */
+ NONE
+ }
+
//
// DateFormating API
//
@@ -606,13 +638,13 @@ abstract public class RequestContext
}
/**
- * Gets the PageFlowScopeProvider for the current application.
- */
+ * Gets the PageFlowScopeProvider for the current application.
+ */
public abstract PageFlowScopeProvider getPageFlowScopeProvider();
/**
- * Gets the PageResolver for the current application.
- */
+ * Gets the PageResolver for the current application.
+ */
public abstract PageResolver getPageResolver();
/**
@@ -677,9 +709,9 @@ abstract public class RequestContext
public abstract void partialUpdateNotify(UIComponent updated);
/**
- * Starts a new component binding context. Typically called from tag handlers when component
- * bindings in its subtree needs to be cleared, forcing the creation of new components.
- *
+ * Starts a new component binding context. Typically called from tag handlers when component
+ * bindings in its subtree needs to be cleared, forcing the creation of new components.
+ *
* @param context FacesContext instance
* @see RequestContext#popComponentBindingContext
* @see RequestContext#isInComponentBindingContext
@@ -689,7 +721,7 @@ abstract public class RequestContext
ExternalContext ec = context.getExternalContext();
if (null != ec)
{
- // Use a counter on the request map to generate the IDs.
+ // Use a counter on the request map to generate the IDs.
Map<String, Object> reqMap = ec.getRequestMap();
Integer value = (Integer)reqMap.get(_CURRENT_COMPONENT_BINDING_CONTEXT_KEY);
int val = 0;
@@ -705,11 +737,11 @@ abstract public class RequestContext
reqMap.put(_CURRENT_COMPONENT_BINDING_CONTEXT_KEY, val);
}
}
-
+
/**
- * Pops out of the last pushed component binding context. Component binding instances will not be
+ * Pops out of the last pushed component binding context. Component binding instances will not be
* cleared after popping out the outermost context.
- *
+ *
* @param context FacesContext instance
* @see RequestContext#pushComponentBindingContext
* @see RequestContext#isInComponentBindingContext
@@ -730,17 +762,17 @@ abstract public class RequestContext
{
val = value - 1;
}
-
+
if (val > 0)
reqMap.put(_CURRENT_COMPONENT_BINDING_CONTEXT_KEY, val);
else
reqMap.put(_CURRENT_COMPONENT_BINDING_CONTEXT_KEY, null);
}
}
-
+
/**
* Returns true if we are currently within a component binding context.
- *
+ *
* @see RequestContext#pushComponentBindingContext
* @see RequestContext#popComponentBindingContext
*/
@@ -751,11 +783,11 @@ abstract public class RequestContext
{
Map<String, Object> reqMap = ec.getRequestMap();
Integer value = (Integer)reqMap.get(_CURRENT_COMPONENT_BINDING_CONTEXT_KEY);
-
+
if (value != null && value > 0)
return true;
}
-
+
return false;
}
@@ -790,13 +822,13 @@ abstract public class RequestContext
public abstract Long getUploadedFileMaxMemory();
public abstract Long getUploadedFileMaxDiskSpace();
-
+
public Long getUploadedFileMaxFileSize()
{
// default of unlimited file size
return -1L;
}
-
+
public Long getUploadedFileMaxChunkSize()
{
// default of 2GB which is the maximum allowed chunk size
@@ -1105,12 +1137,13 @@ abstract public class RequestContext
new ConcurrentHashMap<ClassLoader, ConcurrentMap<String, Object>>();
static private final ThreadLocal<RequestContext> _CURRENT_CONTEXT =
new ThreadLocal<RequestContext>();
- static private final String _CURRENT_COMPONENT_BINDING_CONTEXT_KEY =
+ static private final String _CURRENT_COMPONENT_BINDING_CONTEXT_KEY =
RequestContext.class.getName() + ".CCBCK";
static private final TrinidadLogger _LOG =
TrinidadLogger.createTrinidadLogger(RequestContext.class);
private ComponentContextManager _componentContextManager;
+ private TagExecution _tagExecution = TagExecution.FULL;
// window manager for this request
private WindowManager _windowManager;
Modified: myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/taglib/ForEachTag.java
URL: http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/taglib/ForEachTag.java?rev=1547120&r1=1547119&r2=1547120&view=diff
==============================================================================
--- myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/taglib/ForEachTag.java (original)
+++ myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/taglib/ForEachTag.java Mon Dec 2 17:30:13 2013
@@ -51,6 +51,7 @@ import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.JspIdConsumer;
+import org.apache.myfaces.trinidad.context.RequestContext;
import org.apache.myfaces.trinidad.logging.TrinidadLogger;
import org.apache.myfaces.trinidad.model.CollectionModel;
import org.apache.myfaces.trinidad.util.ComponentUtils;
@@ -1248,6 +1249,15 @@ public class ForEachTag
public void beforePhase(PhaseEvent event)
{
_LOG.finest("Running the iteration status cleanup code");
+
+ // Ensure that tag execution has not been skipped during this request
+ RequestContext requestContext = RequestContext.getCurrentInstance();
+ if (requestContext.getTagExecutionStatus() == RequestContext.TagExecution.NONE)
+ {
+ _LOG.finest("Tag execution is not being run, avoiding cleanup");
+ return;
+ }
+
FacesContext facesContext = event.getFacesContext();
UIViewRoot viewRoot = facesContext.getViewRoot();
Map<String, Object> viewAttrs = viewRoot.getAttributes();