You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2013/04/22 21:21:45 UTC
svn commit: r1470669 - in /myfaces/core/trunk: ./
impl/src/main/java/org/apache/myfaces/application/viewstate/
impl/src/main/java/org/apache/myfaces/view/facelets/
impl/src/main/java/org/apache/myfaces/view/facelets/compiler/
impl/src/main/java/org/apa...
Author: lu4242
Date: Mon Apr 22 19:21:44 2013
New Revision: 1470669
URL: http://svn.apache.org/r1470669
Log:
merge revisions 1469145-1470662 from 2.1.x branch
Added:
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/AbstractFaceletCache.java
- copied unchanged from r1470662, myfaces/core/branches/2.1.x/impl/src/main/java/org/apache/myfaces/view/facelets/AbstractFaceletCache.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/CacheELFaceletCacheImpl.java
- copied unchanged from r1470662, myfaces/core/branches/2.1.x/impl/src/main/java/org/apache/myfaces/view/facelets/impl/CacheELFaceletCacheImpl.java
myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/view/facelets/el/CacheELExpressionsAlwaysRecompileTestCase.java
- copied unchanged from r1470662, myfaces/core/branches/2.1.x/impl/src/test/java/org/apache/myfaces/view/facelets/el/CacheELExpressionsAlwaysRecompileTestCase.java
myfaces/core/trunk/impl/src/test/resources/org/apache/myfaces/view/facelets/el/includetagtest1.xhtml
- copied unchanged from r1470662, myfaces/core/branches/2.1.x/impl/src/test/resources/org/apache/myfaces/view/facelets/el/includetagtest1.xhtml
myfaces/core/trunk/impl/src/test/resources/org/apache/myfaces/view/facelets/el/user.taglib.xml
- copied unchanged from r1470662, myfaces/core/branches/2.1.x/impl/src/test/resources/org/apache/myfaces/view/facelets/el/user.taglib.xml
myfaces/core/trunk/impl/src/test/resources/org/apache/myfaces/view/facelets/el/usertagtest1.xhtml
- copied unchanged from r1470662, myfaces/core/branches/2.1.x/impl/src/test/resources/org/apache/myfaces/view/facelets/el/usertagtest1.xhtml
myfaces/core/trunk/impl/src/test/resources/org/apache/myfaces/view/facelets/el/usertagtest1_1.xhtml
- copied unchanged from r1470662, myfaces/core/branches/2.1.x/impl/src/test/resources/org/apache/myfaces/view/facelets/el/usertagtest1_1.xhtml
myfaces/core/trunk/impl/src/test/resources/org/apache/myfaces/view/facelets/el/usertagtest1_2.xhtml
- copied unchanged from r1470662, myfaces/core/branches/2.1.x/impl/src/test/resources/org/apache/myfaces/view/facelets/el/usertagtest1_2.xhtml
Modified:
myfaces/core/trunk/ (props changed)
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/viewstate/ClientSideStateCacheImpl.java (props changed)
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/viewstate/ServerSideStateCacheImpl.java (props changed)
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/viewstate/SessionIdGenerator.java (props changed)
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/viewstate/StateCacheFactoryImpl.java (props changed)
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/viewstate/StateCacheUtils.java (props changed)
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/ELExpressionCacheMode.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/FaceletFactory.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/TemplateContext.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/compiler/UILeaf.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/el/DefaultVariableMapper.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/DefaultFacelet.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/DefaultFaceletFactory.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/FaceletCacheFactoryImpl.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/TemplateContextImpl.java
myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/UserTagHandler.java
myfaces/core/trunk/impl/src/main/resources/META-INF/faces-config20.vm (props changed)
myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/application/viewstate/ClientSideStateCacheTest.java (props changed)
myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/application/viewstate/ServerSideStateCacheTest.java (props changed)
myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/view/facelets/tag/ui/IncludeParamTestCase.java
myfaces/core/trunk/parent/pom.xml (props changed)
myfaces/core/trunk/parent/src/ (props changed)
myfaces/core/trunk/shared/ (props changed)
myfaces/core/trunk/shared-public/pom.xml (props changed)
myfaces/core/trunk/shared-public/src/ (props changed)
myfaces/core/trunk/shared-public/src/main/java/org/apache/myfaces/shared/util/AttachedDeltaWrapper.java (props changed)
myfaces/core/trunk/shared-public/src/main/java/org/apache/myfaces/shared/util/ComponentUtils.java (props changed)
myfaces/core/trunk/shared-public/src/main/java/org/apache/myfaces/shared/util/DebugUtils.java (props changed)
myfaces/core/trunk/shared-public/src/main/java/org/apache/myfaces/shared/util/RendererUtils.java (props changed)
myfaces/core/trunk/shared-public/src/main/java/org/apache/myfaces/shared/util/TagUtils.java (props changed)
myfaces/core/trunk/shared-public/src/main/java/org/apache/myfaces/shared/util/renderkit/ (props changed)
Propchange: myfaces/core/trunk/
------------------------------------------------------------------------------
Merged /myfaces/core/branches/2.1.x:r1469145-1470662
Propchange: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/viewstate/ClientSideStateCacheImpl.java
------------------------------------------------------------------------------
Merged /myfaces/core/branches/2.1.x/impl/src/main/java/org/apache/myfaces/application/viewstate/ClientSideStateCacheImpl.java:r1469145-1470662
Propchange: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/viewstate/ServerSideStateCacheImpl.java
------------------------------------------------------------------------------
Merged /myfaces/core/branches/2.1.x/impl/src/main/java/org/apache/myfaces/application/viewstate/ServerSideStateCacheImpl.java:r1469145-1470662
Propchange: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/viewstate/SessionIdGenerator.java
------------------------------------------------------------------------------
Merged /myfaces/core/branches/2.1.x/impl/src/main/java/org/apache/myfaces/application/viewstate/SessionIdGenerator.java:r1469145-1470662
Propchange: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/viewstate/StateCacheFactoryImpl.java
------------------------------------------------------------------------------
Merged /myfaces/core/branches/2.1.x/impl/src/main/java/org/apache/myfaces/application/viewstate/StateCacheFactoryImpl.java:r1469145-1470662
Propchange: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/viewstate/StateCacheUtils.java
------------------------------------------------------------------------------
Merged /myfaces/core/branches/2.1.x/impl/src/main/java/org/apache/myfaces/application/viewstate/StateCacheUtils.java:r1469145-1470662
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/ELExpressionCacheMode.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/ELExpressionCacheMode.java?rev=1470669&r1=1470668&r2=1470669&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/ELExpressionCacheMode.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/ELExpressionCacheMode.java Mon Apr 22 19:21:44 2013
@@ -52,5 +52,16 @@ public enum ELExpressionCacheMode
* Note if ui:param is used, each template call should define the same
* param count, even if only just a few are used.
*/
- always
+ always,
+
+ /**
+ * Does not cache expressions on these cases:
+ * - An expression uses a variable resolved through VariableMapper
+ *
+ * It uses an alternate FaceletCache that implements AbstractFaceletCache
+ * contract and force recompile the facelet in case additional ui:param
+ * instances are detected.
+ *
+ */
+ alwaysRecompile,
}
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/FaceletFactory.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/FaceletFactory.java?rev=1470669&r1=1470668&r2=1470669&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/FaceletFactory.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/FaceletFactory.java Mon Apr 22 19:21:44 2013
@@ -23,6 +23,7 @@ import javax.faces.FacesException;
import javax.faces.view.facelets.FaceletException;
import java.io.IOException;
import java.net.URL;
+import javax.faces.view.facelets.FaceletContext;
/**
* FaceletFactory for producing Facelets relative to the context of the underlying implementation.
@@ -60,6 +61,23 @@ public abstract class FaceletFactory
* @throws ELException
*/
public abstract Facelet getFacelet(URL url) throws IOException, FaceletException, FacesException, ELException;
+
+ /**
+ * Create a Facelet from the passed URL, but take into account the context. This method is
+ * useful in cases where the facelet instance must replace the one in the cache based on
+ * the context, instead take the one from the cache, like for example when the EL expression
+ * cache is used.
+ *
+ * @param url
+ * source url
+ * @return Facelet instance
+ * @throws IOException
+ * @throws FaceletException
+ * @throws FacesException
+ * @throws ELException
+ */
+ public abstract Facelet getFacelet(FaceletContext ctx, URL url)
+ throws IOException, FaceletException, FacesException, ELException;
/**
* Return a Facelet instance as specified by the file at the passed URI. The returned facelet is used
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/TemplateContext.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/TemplateContext.java?rev=1470669&r1=1470668&r2=1470669&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/TemplateContext.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/TemplateContext.java Mon Apr 22 19:21:44 2013
@@ -20,6 +20,7 @@ package org.apache.myfaces.view.facelets
import java.io.IOException;
import java.util.Map;
+import java.util.Set;
import javax.el.ELException;
import javax.el.ValueExpression;
@@ -140,4 +141,43 @@ public abstract class TemplateContext
* @return
*/
public abstract void setAllowCacheELExpressions(boolean cacheELExpressions);
+
+ /**
+ *
+ * @since 2.1.12
+ * @param key
+ * @return
+ */
+ public abstract boolean containsParameter(String key);
+
+ /**
+ * Return a set of the parameters known associated to this template context and/or
+ * template. This logic is used to detect which EL Expressions can be cached or not.
+ *
+ * @since 2.1.12
+ * @return
+ */
+ public abstract Set<String> getKnownParameters();
+
+ /**
+ *
+ * @since 2.1.12
+ * @param key
+ * @return
+ */
+ public abstract boolean containsKnownParameter(String key);
+
+ /**
+ *
+ * @since 2.1.12
+ * @return
+ */
+ public abstract boolean isKnownParametersEmpty();
+
+ /**
+ *
+ * @since 2.1.12
+ * @param knownParameters
+ */
+ public abstract void addKnownParameters(String knownParameters);
}
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/compiler/UILeaf.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/compiler/UILeaf.java?rev=1470669&r1=1470668&r2=1470669&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/compiler/UILeaf.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/compiler/UILeaf.java Mon Apr 22 19:21:44 2013
@@ -159,11 +159,14 @@ class UILeaf extends UIComponent impleme
@Override
public void setId(String id)
{
- isIdValid(id);
+ // UILeaf instance are just a wrapper for html markup. It never has
+ // an user defined id. The validation check here is just useless,
+ // because facelets algorithm ensures that.
+ //isIdValid(id);
_id = id;
_clientId = null;
}
-
+ /*
private void isIdValid(String string)
{
@@ -205,7 +208,7 @@ class UILeaf extends UIComponent impleme
+ c + "\"");
}
}
- }
+ }*/
private String getComponentLocation(UIComponent component)
{
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/el/DefaultVariableMapper.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/el/DefaultVariableMapper.java?rev=1470669&r1=1470668&r2=1470669&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/el/DefaultVariableMapper.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/el/DefaultVariableMapper.java Mon Apr 22 19:21:44 2013
@@ -93,9 +93,10 @@ public final class DefaultVariableMapper
}
}
- if (_templateContext != null && !_templateContext.isParameterEmpty())
+ if (_templateContext != null)
{
- if (_templateContext.getParameterMap().containsKey(name))
+ if (!_templateContext.isParameterEmpty() &&
+ _templateContext.containsParameter(name))
{
returnValue = _templateContext.getParameter(name);
if (_trackResolveVariables)
@@ -104,6 +105,21 @@ public final class DefaultVariableMapper
}
return returnValue;
}
+ else if (!_templateContext.isKnownParametersEmpty() &&
+ _templateContext.containsKnownParameter(name))
+ {
+ // This part is the most important in alwaysRecompile EL cache hack.
+ // The idea is maintain a list of the parameters used in a template,
+ // and if the name to be resolved match one of the list, even if the
+ // param was not set it is necessary to track it as variable resolved.
+ // This will force create a new EL expression each time the view is
+ // built, preserving ui:param and VariableMapper behavior, but allow
+ // cache all expressions that are not related.
+ if (_trackResolveVariables)
+ {
+ _variableResolved = true;
+ }
+ }
}
if (_delegate != null)
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/DefaultFacelet.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/DefaultFacelet.java?rev=1470669&r1=1470668&r2=1470669&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/DefaultFacelet.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/DefaultFacelet.java Mon Apr 22 19:21:44 2013
@@ -462,7 +462,7 @@ final class DefaultFacelet extends Abstr
public void include(AbstractFaceletContext ctx, UIComponent parent, URL url) throws IOException, FacesException,
FaceletException, ELException
{
- DefaultFacelet f = (DefaultFacelet) _factory.getFacelet(url);
+ DefaultFacelet f = (DefaultFacelet) _factory.getFacelet(ctx, url);
f.include(ctx, parent);
}
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/DefaultFaceletFactory.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/DefaultFaceletFactory.java?rev=1470669&r1=1470668&r2=1470669&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/DefaultFaceletFactory.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/DefaultFaceletFactory.java Mon Apr 22 19:21:44 2013
@@ -34,11 +34,13 @@ import javax.faces.FacesException;
import javax.faces.FactoryFinder;
import javax.faces.view.facelets.FaceletCache;
import javax.faces.view.facelets.FaceletCacheFactory;
+import javax.faces.view.facelets.FaceletContext;
import javax.faces.view.facelets.FaceletException;
import javax.faces.view.facelets.FaceletHandler;
import javax.faces.view.facelets.ResourceResolver;
import org.apache.myfaces.shared.resource.ResourceLoaderUtils;
+import org.apache.myfaces.view.facelets.AbstractFaceletCache;
import org.apache.myfaces.view.facelets.Facelet;
import org.apache.myfaces.view.facelets.FaceletFactory;
import org.apache.myfaces.view.facelets.compiler.Compiler;
@@ -75,6 +77,7 @@ public final class DefaultFaceletFactory
private javax.faces.view.facelets.ResourceResolver _resolver;
private FaceletCache<Facelet> _faceletCache;
+ private AbstractFaceletCache<Facelet> _abstractFaceletCache;
public DefaultFaceletFactory(Compiler compiler, ResourceResolver resolver) throws IOException
{
@@ -122,22 +125,55 @@ public final class DefaultFaceletFactory
}
};
- // Note that FaceletCache.setMemberFactories method is protected, and this is the place where call
- // this method has sense, because DefaultFaceletFactory is the responsible to create Facelet instances.
- // The only way to do it is using reflection, and it has sense, because in this way it is possible to
- // setup a java SecurityManager that prevents call this method (because it is protected, and to do that
- // the code first check for "suppressAccessChecks" permission).
- try
+ if (_faceletCache instanceof AbstractFaceletCache)
{
- Method setMemberFactoriesMethod = FaceletCache.class.getDeclaredMethod("setMemberFactories",
- new Class[]{FaceletCache.MemberFactory.class, FaceletCache.MemberFactory.class});
- setMemberFactoriesMethod.setAccessible(true);
- setMemberFactoriesMethod.invoke(_faceletCache, faceletFactory, viewMetadataFaceletFactory);
- }
- catch (Exception e)
+ _abstractFaceletCache = (AbstractFaceletCache<Facelet>) _faceletCache;
+
+ FaceletCache.MemberFactory<Facelet> compositeComponentMetadataFaceletFactory =
+ new FaceletCache.MemberFactory<Facelet>()
+ {
+ public Facelet newInstance(URL url) throws IOException
+ {
+ return _createCompositeComponentMetadataFacelet(url);
+ }
+ };
+
+ try
+ {
+ Method setMemberFactoriesMethod = AbstractFaceletCache.class.getDeclaredMethod("setMemberFactories",
+ new Class[]{FaceletCache.MemberFactory.class, FaceletCache.MemberFactory.class,
+ FaceletCache.MemberFactory.class});
+ setMemberFactoriesMethod.setAccessible(true);
+ setMemberFactoriesMethod.invoke(_faceletCache, faceletFactory, viewMetadataFaceletFactory,
+ compositeComponentMetadataFaceletFactory);
+ }
+ catch (Exception e)
+ {
+ throw new FacesException(
+ "Cannot call setMemberFactories method, Initialization of FaceletCache failed.",
+ e);
+ }
+ }
+ else
{
- throw new FacesException("Cannot call setMemberFactories method, Initialization of FaceletCache failed.",
- e);
+ // Note that FaceletCache.setMemberFactories method is protected, and this is the place where call
+ // this method has sense, because DefaultFaceletFactory is the responsible to create Facelet instances.
+ // The only way to do it is using reflection, and it has sense, because in this way it is possible to
+ // setup a java SecurityManager that prevents call this method (because it is protected, and to do that
+ // the code first check for "suppressAccessChecks" permission).
+ try
+ {
+ Method setMemberFactoriesMethod = FaceletCache.class.getDeclaredMethod("setMemberFactories",
+ new Class[]{FaceletCache.MemberFactory.class, FaceletCache.MemberFactory.class});
+ setMemberFactoriesMethod.setAccessible(true);
+ setMemberFactoriesMethod.invoke(_faceletCache, faceletFactory, viewMetadataFaceletFactory);
+ }
+ catch (Exception e)
+ {
+ throw new FacesException(
+ "Cannot call setMemberFactories method, Initialization of FaceletCache failed.",
+ e);
+ }
}
if (log.isLoggable(Level.FINE))
@@ -162,6 +198,7 @@ public final class DefaultFaceletFactory
*
* @see org.apache.myfaces.view.facelets.FaceletFactory#getFacelet(java.lang.String)
*/
+ @Override
public Facelet getFacelet(String uri) throws IOException, FaceletException, FacesException, ELException
{
URL url = (URL) _relativeLocations.get(uri);
@@ -194,10 +231,26 @@ public final class DefaultFaceletFactory
* @throws FacesException
* @throws ELException
*/
+ @Override
public Facelet getFacelet(URL url) throws IOException, FaceletException, FacesException, ELException
{
return _faceletCache.getFacelet(url);
}
+
+
+ @Override
+ public Facelet getFacelet(FaceletContext ctx, URL url)
+ throws IOException, FaceletException, FacesException, ELException
+ {
+ if (_abstractFaceletCache != null)
+ {
+ return _abstractFaceletCache.getFacelet(ctx, url);
+ }
+ else
+ {
+ return _faceletCache.getFacelet(url);
+ }
+ }
public long getRefreshPeriod()
{
@@ -408,7 +461,14 @@ public final class DefaultFaceletFactory
public Facelet getViewMetadataFacelet(URL url) throws IOException,
FaceletException, FacesException, ELException
{
- return _faceletCache.getViewMetadataFacelet(url);
+ if (_abstractFaceletCache != null)
+ {
+ return _abstractFaceletCache.getViewMetadataFacelet(url);
+ }
+ else
+ {
+ return _faceletCache.getViewMetadataFacelet(url);
+ }
}
/**
@@ -444,25 +504,31 @@ public final class DefaultFaceletFactory
public Facelet getCompositeComponentMetadataFacelet(URL url) throws IOException,
FaceletException, FacesException, ELException
{
- ParameterCheck.notNull("url", url);
-
- String key = url.toString();
-
- DefaultFacelet f = _compositeComponentMetadataFacelets.get(key);
-
- if (f == null || this.needsToBeRefreshed(f))
+ if (_abstractFaceletCache != null)
{
- f = this._createCompositeComponentMetadataFacelet(url);
- if (_refreshPeriod != NO_CACHE_DELAY)
+ return _abstractFaceletCache.getCompositeComponentMetadataFacelet(url);
+ }
+ else
+ {
+ ParameterCheck.notNull("url", url);
+
+ String key = url.toString();
+
+ DefaultFacelet f = _compositeComponentMetadataFacelets.get(key);
+
+ if (f == null || this.needsToBeRefreshed(f))
{
- Map<String, DefaultFacelet> newLoc
- = new HashMap<String, DefaultFacelet>(_compositeComponentMetadataFacelets);
- newLoc.put(key, f);
- _compositeComponentMetadataFacelets = newLoc;
+ f = this._createCompositeComponentMetadataFacelet(url);
+ if (_refreshPeriod != NO_CACHE_DELAY)
+ {
+ Map<String, DefaultFacelet> newLoc
+ = new HashMap<String, DefaultFacelet>(_compositeComponentMetadataFacelets);
+ newLoc.put(key, f);
+ _compositeComponentMetadataFacelets = newLoc;
+ }
}
+ return f;
}
-
- return f;
}
/**
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/FaceletCacheFactoryImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/FaceletCacheFactoryImpl.java?rev=1470669&r1=1470668&r2=1470669&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/FaceletCacheFactoryImpl.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/FaceletCacheFactoryImpl.java Mon Apr 22 19:21:44 2013
@@ -25,6 +25,7 @@ import javax.faces.view.facelets.Facelet
import javax.faces.view.facelets.FaceletCacheFactory;
import org.apache.myfaces.shared.util.WebConfigParamUtils;
+import org.apache.myfaces.view.facelets.ELExpressionCacheMode;
import org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage;
/**
@@ -59,7 +60,19 @@ public class FaceletCacheFactoryImpl ext
FaceletViewDeclarationLanguage.DEFAULT_REFRESH_PERIOD);
}
- return new FaceletCacheImpl(refreshPeriod);
+ String elMode = WebConfigParamUtils.getStringInitParameter(
+ context.getExternalContext(),
+ FaceletCompositionContextImpl.INIT_PARAM_CACHE_EL_EXPRESSIONS,
+ ELExpressionCacheMode.noCache.name());
+
+ if (ELExpressionCacheMode.alwaysRecompile.toString().equals(elMode))
+ {
+ return new CacheELFaceletCacheImpl(refreshPeriod);
+ }
+ else
+ {
+ return new FaceletCacheImpl(refreshPeriod);
+ }
}
}
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/TemplateContextImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/TemplateContextImpl.java?rev=1470669&r1=1470668&r2=1470669&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/TemplateContextImpl.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/TemplateContextImpl.java Mon Apr 22 19:21:44 2013
@@ -19,12 +19,12 @@
package org.apache.myfaces.view.facelets.impl;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
+import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Set;
@@ -63,18 +63,22 @@ public class TemplateContextImpl extends
*/
private static final PageContext INITIAL_PAGE_CONTEXT = new InitialPageContext();
- private final LinkedList<TemplateManagerImpl> _clients;
+ private final List<TemplateManagerImpl> _clients;
private TemplateManager _compositeComponentClient;
private TemplateManagerImpl _lastClient;
private boolean _isCacheELExpressions;
+
+ private final TemplateClientAttributeMap _templateClientAttributeMap;
+
+ private final TemplateClientKnownParameterMap _templateClientKnownParameterMap;
public TemplateContextImpl()
{
super();
- _clients = new LinkedList<TemplateManagerImpl>();
+ _clients = new ArrayList<TemplateManagerImpl>(4);
// Parameters registered using ui:param now are bound to template manager instances, because
// it should follow the same rules as template clients registered here. For example, to resolve
// params on nested ui:decorate and ui:composition the same rules applies than for ui:define and
@@ -82,36 +86,38 @@ public class TemplateContextImpl extends
// page context, so when a new context is added (like in a ui:include), all params registered go
// to this manager.
_clients.add(new TemplateManagerImpl(null, INITIAL_TEMPLATE_CLIENT, true, INITIAL_PAGE_CONTEXT));
- _lastClient = _clients.getFirst();
+ _lastClient = _clients.get(0); //_clients.getFirst();
_isCacheELExpressions = true;
+ _templateClientAttributeMap = new TemplateClientAttributeMap();
+ _templateClientKnownParameterMap = new TemplateClientKnownParameterMap();
}
@Override
public TemplateManager popClient(final AbstractFaceletContext actx)
{
_lastClient = null;
- return _clients.removeFirst();
+ return _clients.remove(0);
}
@Override
public void pushClient(final AbstractFaceletContext actx, final AbstractFacelet owner, final TemplateClient client)
{
- _clients.addFirst(new TemplateManagerImpl(owner, client, true, actx.getPageContext()));
- _lastClient = _clients.getFirst();
+ _clients.add(0, new TemplateManagerImpl(owner, client, true, actx.getPageContext()));
+ _lastClient = _clients.get(0);
}
public TemplateManager popExtendedClient(final AbstractFaceletContext actx)
{
_lastClient = null;
- return _clients.removeLast();
+ return _clients.remove(_clients.size()-1);
}
@Override
public void extendClient(final AbstractFaceletContext actx, final AbstractFacelet owner,
final TemplateClient client)
{
- _clients.addLast(new TemplateManagerImpl(owner, client, false, actx.getPageContext()));
- _lastClient = _clients.getLast();
+ _clients.add(new TemplateManagerImpl(owner, client, false, actx.getPageContext()));
+ _lastClient = _clients.get(_clients.size()-1);
}
@Override
@@ -120,10 +126,9 @@ public class TemplateContextImpl extends
{
boolean found = false;
TemplateManager client;
- Iterator<TemplateManagerImpl> itr = _clients.iterator();
- while (itr.hasNext() && !found)
+ for (int i = 0; i < _clients.size() && !found; i++)
{
- client = itr.next();
+ client = _clients.get(i);
if (client.equals(owner))
{
continue;
@@ -146,6 +151,8 @@ public class TemplateContextImpl extends
private final PageContext _pageContext;
private Map<String, ValueExpression> _parameters = null;
+
+ private Set<String> _knownParameters;
public TemplateManagerImpl(AbstractFacelet owner, TemplateClient target,
boolean root, PageContext pageContext)
@@ -206,11 +213,25 @@ public class TemplateContextImpl extends
return _parameters;
}
- public boolean isParamentersMapEmpty()
+ public boolean isParametersMapEmpty()
{
return _parameters == null ? true : _parameters.isEmpty();
}
+ public Set<String> getKnownParameters()
+ {
+ if (_knownParameters == null)
+ {
+ _knownParameters = new HashSet<String>(4);
+ }
+ return _knownParameters;
+ }
+
+ public boolean isKnownParametersEmpty()
+ {
+ return _knownParameters == null ? true : _knownParameters.isEmpty();
+ }
+
public boolean equals(Object o)
{
if (this._owner != null)
@@ -254,11 +275,10 @@ public class TemplateContextImpl extends
public ValueExpression getParameter(String key)
{
TemplateManagerImpl client;
- Iterator<TemplateManagerImpl> itr = _clients.iterator();
- while (itr.hasNext())
+ for (int i = 0; i < _clients.size(); i++)
{
- client = itr.next();
- if (!client.isParamentersMapEmpty() &&
+ client = _clients.get(i);
+ if (!client.isParametersMapEmpty() &&
client.getParametersMap().containsKey(key))
{
return client.getParametersMap().get(key);
@@ -268,11 +288,28 @@ public class TemplateContextImpl extends
}
@Override
+ public boolean containsParameter(String key)
+ {
+ TemplateManagerImpl client;
+ for (int i = 0; i < _clients.size(); i++)
+ {
+ client = _clients.get(i);
+ if (!client.isParametersMapEmpty() &&
+ client.getParametersMap().containsKey(key))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
public void setParameter(String key, ValueExpression value)
{
if (_lastClient != null)
{
_lastClient.getParametersMap().put(key, value);
+ _lastClient.getKnownParameters().add(key);
}
}
@@ -280,11 +317,10 @@ public class TemplateContextImpl extends
public boolean isParameterEmpty()
{
TemplateManagerImpl client;
- Iterator<TemplateManagerImpl> itr = _clients.iterator();
- while (itr.hasNext())
+ for (int i = 0; i < _clients.size(); i++)
{
- client = itr.next();
- if (!client.isParamentersMapEmpty())
+ client = _clients.get(i);
+ if (!client.isParametersMapEmpty())
{
return false;
}
@@ -294,7 +330,50 @@ public class TemplateContextImpl extends
public Map<String, ValueExpression> getParameterMap()
{
- return new TemplateClientAttributeMap();
+ return _templateClientAttributeMap;
+ }
+
+ public boolean isKnownParametersEmpty()
+ {
+ TemplateManagerImpl client;
+ for (int i = 0; i < _clients.size(); i++)
+ {
+ client = _clients.get(i);
+ if (!client.isKnownParametersEmpty())
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public Set<String> getKnownParameters()
+ {
+ return _templateClientKnownParameterMap.keySet();
+ }
+
+ @Override
+ public boolean containsKnownParameter(String key)
+ {
+ TemplateManagerImpl client;
+ for (int i = 0; i < _clients.size(); i++)
+ {
+ client = _clients.get(i);
+ if (client.getKnownParameters().contains(key))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void addKnownParameters(String key)
+ {
+ if (_lastClient != null)
+ {
+ _lastClient.getKnownParameters().add(key);
+ }
}
private final class TemplateClientAttributeMap extends AbstractAttributeMap<ValueExpression>
@@ -308,11 +387,10 @@ public class TemplateContextImpl extends
protected ValueExpression getAttribute(String key)
{
TemplateManagerImpl client;
- Iterator<TemplateManagerImpl> itr = _clients.iterator();
- while (itr.hasNext())
+ for (int i = 0; i < _clients.size(); i++)
{
- client = itr.next();
- if (!client.isParamentersMapEmpty() &&
+ client = _clients.get(i);
+ if (!client.isParametersMapEmpty() &&
client.getParametersMap().containsKey(key))
{
return client.getParametersMap().get(key);
@@ -324,19 +402,14 @@ public class TemplateContextImpl extends
@Override
protected void setAttribute(String key, ValueExpression value)
{
- if (_lastClient != null)
- {
- _lastClient.getParametersMap().put(key, value);
- }
+ //Use the parent methods.
+ throw new UnsupportedOperationException();
}
@Override
protected void removeAttribute(String key)
{
- if (_lastClient != null)
- {
- _lastClient.getParametersMap().remove(key);
- }
+ throw new UnsupportedOperationException();
}
@Override
@@ -344,11 +417,10 @@ public class TemplateContextImpl extends
{
Set<String> attributeNames = new HashSet<String>();
TemplateManagerImpl client;
- Iterator<TemplateManagerImpl> itr = _clients.iterator();
- while (itr.hasNext())
+ for (int i = 0; i < _clients.size(); i++)
{
- client = itr.next();
- if (!client.isParamentersMapEmpty())
+ client = _clients.get(i);
+ if (!client.isParametersMapEmpty())
{
attributeNames.addAll(client.getParametersMap().keySet());
}
@@ -385,6 +457,59 @@ public class TemplateContextImpl extends
}
}
+ private final class TemplateClientKnownParameterMap extends AbstractAttributeMap<Boolean>
+ {
+
+ public TemplateClientKnownParameterMap()
+ {
+ }
+
+ @Override
+ protected Boolean getAttribute(String key)
+ {
+ TemplateManagerImpl client;
+ for (int i = 0; i < _clients.size(); i++)
+ {
+ client = _clients.get(i);
+ if (!client.isKnownParametersEmpty() &&
+ client.getKnownParameters().contains(key))
+ {
+ return Boolean.TRUE;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ protected void setAttribute(String key, Boolean value)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ protected void removeAttribute(String key)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ protected Enumeration<String> getAttributeNames()
+ {
+ Set<String> attributeNames = new HashSet<String>();
+ TemplateManagerImpl client;
+ for (int i = 0; i < _clients.size(); i++)
+ {
+ client = _clients.get(i);
+ if (!client.isParametersMapEmpty())
+ {
+ attributeNames.addAll(client.getParametersMap().keySet());
+ }
+ }
+
+ return new ParameterNameEnumeration(attributeNames.toArray(new String[attributeNames.size()]));
+ }
+ }
+
/**
* This is just a dummy template client that does nothing that is added by default
* for each template context
@@ -446,5 +571,4 @@ public class TemplateContextImpl extends
_isCacheELExpressions = cacheELExpressions;
}
-
}
Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/UserTagHandler.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/UserTagHandler.java?rev=1470669&r1=1470668&r2=1470669&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/UserTagHandler.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/UserTagHandler.java Mon Apr 22 19:21:44 2013
@@ -37,6 +37,7 @@ import javax.faces.view.facelets.TagExce
import javax.faces.view.facelets.TagHandler;
import org.apache.myfaces.view.facelets.AbstractFaceletContext;
+import org.apache.myfaces.view.facelets.ELExpressionCacheMode;
import org.apache.myfaces.view.facelets.TemplateClient;
import org.apache.myfaces.view.facelets.TemplateContext;
import org.apache.myfaces.view.facelets.impl.TemplateContextImpl;
@@ -111,6 +112,7 @@ final class UserTagHandler extends TagHa
}
}
actx.pushTemplateContext(new TemplateContextImpl());
+ actx.pushClient(this);
if (this._vars.length > 0)
{
for (int i = 0; i < this._vars.length; i++)
@@ -118,9 +120,12 @@ final class UserTagHandler extends TagHa
((AbstractFaceletContext) ctx).getTemplateContext().setParameter(names[i], values[i]);
}
}
- //Disable caching always, even in 'always' mode
- actx.getTemplateContext().setAllowCacheELExpressions(false);
- actx.pushClient(this);
+ // Disable caching always, even in 'always' mode
+ // The only mode that can support EL caching in this condition is alwaysRedirect.
+ if (!ELExpressionCacheMode.alwaysRecompile.equals(actx.getELExpressionCacheMode()))
+ {
+ actx.getTemplateContext().setAllowCacheELExpressions(false);
+ }
ctx.includeFacelet(parent, this._location);
}
catch (FileNotFoundException e)
Propchange: myfaces/core/trunk/impl/src/main/resources/META-INF/faces-config20.vm
------------------------------------------------------------------------------
Merged /myfaces/core/branches/2.1.x/impl/src/main/resources/META-INF/faces-config20.vm:r1469145-1470662
Propchange: myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/application/viewstate/ClientSideStateCacheTest.java
------------------------------------------------------------------------------
Merged /myfaces/core/branches/2.1.x/impl/src/test/java/org/apache/myfaces/application/viewstate/ClientSideStateCacheTest.java:r1469145-1470662
Propchange: myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/application/viewstate/ServerSideStateCacheTest.java
------------------------------------------------------------------------------
Merged /myfaces/core/branches/2.1.x/impl/src/test/java/org/apache/myfaces/application/viewstate/ServerSideStateCacheTest.java:r1469145-1470662
Modified: myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/view/facelets/tag/ui/IncludeParamTestCase.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/view/facelets/tag/ui/IncludeParamTestCase.java?rev=1470669&r1=1470668&r2=1470669&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/view/facelets/tag/ui/IncludeParamTestCase.java (original)
+++ myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/view/facelets/tag/ui/IncludeParamTestCase.java Mon Apr 22 19:21:44 2013
@@ -32,7 +32,9 @@ import org.apache.myfaces.renderkit.html
import org.apache.myfaces.renderkit.html.HtmlCompositeFacetRenderer;
import org.apache.myfaces.renderkit.html.HtmlTextRenderer;
import org.apache.myfaces.test.mock.MockExternalContext;
+import org.apache.myfaces.view.facelets.ELExpressionCacheMode;
import org.apache.myfaces.view.facelets.FaceletTestCase;
+import org.apache.myfaces.view.facelets.impl.FaceletCompositionContextImpl;
import org.apache.myfaces.view.facelets.tag.jsf.ComponentSupport;
import org.apache.myfaces.view.facelets.util.FastWriter;
import org.junit.Assert;
@@ -77,7 +79,7 @@ public class IncludeParamTestCase extend
// handle VariableMapper stuff properly and ui:param logic will not work
return new org.apache.el.ExpressionFactoryImpl();
}
-
+
@Test
public void testCaching() throws Exception
{
Propchange: myfaces/core/trunk/parent/pom.xml
------------------------------------------------------------------------------
Merged /myfaces/core/branches/2.1.x/parent/pom.xml:r1469145-1470662
Propchange: myfaces/core/trunk/parent/src/
------------------------------------------------------------------------------
Merged /myfaces/core/branches/2.1.x/parent/src:r1469145-1470662
Propchange: myfaces/core/trunk/shared/
------------------------------------------------------------------------------
Merged /myfaces/core/branches/2.1.x/shared:r1469145-1470662
Propchange: myfaces/core/trunk/shared-public/pom.xml
------------------------------------------------------------------------------
Merged /myfaces/core/branches/2.1.x/shared-public/pom.xml:r1469145-1470662
Propchange: myfaces/core/trunk/shared-public/src/
------------------------------------------------------------------------------
Merged /myfaces/core/branches/2.1.x/shared-public/src:r1469145-1470662
Propchange: myfaces/core/trunk/shared-public/src/main/java/org/apache/myfaces/shared/util/AttachedDeltaWrapper.java
------------------------------------------------------------------------------
Merged /myfaces/core/branches/2.1.x/shared-public/src/main/java/org/apache/myfaces/shared/util/AttachedDeltaWrapper.java:r1469145-1470662
Propchange: myfaces/core/trunk/shared-public/src/main/java/org/apache/myfaces/shared/util/ComponentUtils.java
------------------------------------------------------------------------------
Merged /myfaces/core/branches/2.1.x/shared-public/src/main/java/org/apache/myfaces/shared/util/ComponentUtils.java:r1469145-1470662
Propchange: myfaces/core/trunk/shared-public/src/main/java/org/apache/myfaces/shared/util/DebugUtils.java
------------------------------------------------------------------------------
Merged /myfaces/core/branches/2.1.x/shared-public/src/main/java/org/apache/myfaces/shared/util/DebugUtils.java:r1469145-1470662
Propchange: myfaces/core/trunk/shared-public/src/main/java/org/apache/myfaces/shared/util/RendererUtils.java
------------------------------------------------------------------------------
Merged /myfaces/core/branches/2.1.x/shared-public/src/main/java/org/apache/myfaces/shared/util/RendererUtils.java:r1469145-1470662
Propchange: myfaces/core/trunk/shared-public/src/main/java/org/apache/myfaces/shared/util/TagUtils.java
------------------------------------------------------------------------------
Merged /myfaces/core/branches/2.1.x/shared-public/src/main/java/org/apache/myfaces/shared/util/TagUtils.java:r1469145-1470662
Propchange: myfaces/core/trunk/shared-public/src/main/java/org/apache/myfaces/shared/util/renderkit/
------------------------------------------------------------------------------
Merged /myfaces/core/branches/2.1.x/shared-public/src/main/java/org/apache/myfaces/shared/util/renderkit:r1469145-1470662