You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by de...@apache.org on 2018/05/08 12:48:09 UTC
[myfaces] 06/28: Merge revisions 1377775-1380084
This is an automated email from the ASF dual-hosted git repository.
deki pushed a commit to branch 2.1.x-client-window
in repository https://gitbox.apache.org/repos/asf/myfaces.git
commit cbaa912835e8a8fc4b7f1090ac41fe3e4dc6df29
Author: Leonardo Uribe <lu...@apache.org>
AuthorDate: Tue Sep 4 02:17:14 2012 +0000
Merge revisions 1377775-1380084
---
.../javax/faces/component/UIViewParameter.java | 38 ++++++++++++++++++-
.../java/javax/faces/component/_MessageUtils.java | 23 +++++++++++-
.../java/javax/faces/convert/_MessageUtils.java | 23 +++++++++++-
.../java/javax/faces/validator/_MessageUtils.java | 23 +++++++++++-
.../renderkit/ServerSideStateCacheImpl.java | 18 +++++++--
.../facelets/FaceletViewDeclarationLanguage.java | 12 +++++-
.../view/facelets/compiler/AbstractUIHandler.java | 7 ++++
.../facelets/compiler/UIInstructionHandler.java | 43 +++++++++++++---------
.../myfaces/webapp/AbstractFacesInitializer.java | 27 ++++++++++++++
.../resources/META-INF/WebConfigParamsLogger.vm | 4 +-
.../apache/myfaces/shared/util/MessageUtils.java | 23 +++++++++++-
11 files changed, 211 insertions(+), 30 deletions(-)
diff --git a/api/src/main/java/javax/faces/component/UIViewParameter.java b/api/src/main/java/javax/faces/component/UIViewParameter.java
index d8e14da..6e2eec2 100644
--- a/api/src/main/java/javax/faces/component/UIViewParameter.java
+++ b/api/src/main/java/javax/faces/component/UIViewParameter.java
@@ -19,6 +19,9 @@
package javax.faces.component;
import java.io.IOException;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import javax.el.ValueExpression;
import javax.faces.FactoryFinder;
@@ -52,13 +55,15 @@ import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFPropert
longDesc = "The max number or characters allowed for this param")
public class UIViewParameter extends UIInput
{
+ private static final Logger log = Logger.getLogger(UIViewParameter.class.getName());
public static final String COMPONENT_FAMILY = "javax.faces.ViewParameter";
public static final String COMPONENT_TYPE = "javax.faces.ViewParameter";
private static final String DELEGATE_FAMILY = UIInput.COMPONENT_FAMILY;
private static final String DELEGATE_RENDERER_TYPE = "javax.faces.Text";
- private static Renderer delegateRenderer;
+ private static ConcurrentHashMap<ClassLoader,Renderer> delegateRendererMap =
+ new ConcurrentHashMap<ClassLoader,Renderer>();
public UIViewParameter()
{
@@ -251,17 +256,46 @@ public class UIViewParameter extends UIInput
private static Renderer getDelegateRenderer(FacesContext context)
{
- if (delegateRenderer == null)
+ ClassLoader classLoader = _ClassUtils.getContextClassLoader();
+ Renderer delegateRenderer = delegateRendererMap.get(classLoader);
+ if(delegateRenderer == null)
{
RenderKitFactory factory = (RenderKitFactory) FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY);
RenderKit kit = factory.getRenderKit(context, RenderKitFactory.HTML_BASIC_RENDER_KIT);
delegateRenderer = kit.getRenderer(DELEGATE_FAMILY, DELEGATE_RENDERER_TYPE);
+ delegateRendererMap.put(classLoader, delegateRenderer);
}
return delegateRenderer;
}
+ private static void releaseRenderer()
+ {
+ if (log.isLoggable(Level.FINEST))
+ {
+ log.finest("releaseRenderer rendererMap -> " + delegateRendererMap.toString());
+ }
+
+
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+
+ if (log.isLoggable(Level.FINEST))
+ {
+ log.finest("releaseRenderer classLoader -> " + classLoader.toString() );
+ log.finest("releaseRenderer renderer -> " + delegateRendererMap.get(classLoader));
+ }
+
+
+ delegateRendererMap.remove(classLoader);
+
+ if (log.isLoggable(Level.FINEST))
+ {
+ log.finest("releaseRenderer renderMap -> " + delegateRendererMap.toString());
+ }
+
+ }
+
@Override
protected FacesContext getFacesContext()
{
diff --git a/api/src/main/java/javax/faces/component/_MessageUtils.java b/api/src/main/java/javax/faces/component/_MessageUtils.java
index 86c6839..ea30c8f 100755
--- a/api/src/main/java/javax/faces/component/_MessageUtils.java
+++ b/api/src/main/java/javax/faces/component/_MessageUtils.java
@@ -194,12 +194,33 @@ class _MessageUtils
static Object getLabel(FacesContext facesContext, UIComponent component)
{
Object label = component.getAttributes().get("label");
+ ValueExpression expression = null;
+ if (label != null &&
+ label instanceof String && ((String)label).length() == 0 )
+ {
+ // Note component.getAttributes().get("label") internally try to
+ // evaluate the EL expression for the label, but in some cases,
+ // when PSS is disabled and f:loadBundle is used, when the view is
+ // restored the bundle is not set to the EL expression returns an
+ // empty String. It is not possible to check if there is a
+ // hardcoded label, but we can check if there is
+ // an EL expression set, so the best in this case is use that, and if
+ // there is an EL expression set, use it, otherwise use the hardcoded
+ // value. See MYFACES-3591 for details.
+ expression = component.getValueExpression("label");
+ if (expression != null)
+ {
+ // Set the label to null and use the EL expression instead.
+ label = null;
+ }
+ }
+
if(label != null)
{
return label;
}
- ValueExpression expression = component.getValueExpression("label");
+ expression = (expression == null) ? component.getValueExpression("label") : expression;
if(expression != null)
{
return expression;
diff --git a/api/src/main/java/javax/faces/convert/_MessageUtils.java b/api/src/main/java/javax/faces/convert/_MessageUtils.java
index 33ab793..1223e33 100755
--- a/api/src/main/java/javax/faces/convert/_MessageUtils.java
+++ b/api/src/main/java/javax/faces/convert/_MessageUtils.java
@@ -195,12 +195,33 @@ class _MessageUtils
static Object getLabel(FacesContext facesContext, UIComponent component)
{
Object label = component.getAttributes().get("label");
+ ValueExpression expression = null;
+ if (label != null &&
+ label instanceof String && ((String)label).length() == 0 )
+ {
+ // Note component.getAttributes().get("label") internally try to
+ // evaluate the EL expression for the label, but in some cases,
+ // when PSS is disabled and f:loadBundle is used, when the view is
+ // restored the bundle is not set to the EL expression returns an
+ // empty String. It is not possible to check if there is a
+ // hardcoded label, but we can check if there is
+ // an EL expression set, so the best in this case is use that, and if
+ // there is an EL expression set, use it, otherwise use the hardcoded
+ // value. See MYFACES-3591 for details.
+ expression = component.getValueExpression("label");
+ if (expression != null)
+ {
+ // Set the label to null and use the EL expression instead.
+ label = null;
+ }
+ }
+
if(label != null)
{
return label;
}
- ValueExpression expression = component.getValueExpression("label");
+ expression = (expression == null) ? component.getValueExpression("label") : expression;
if(expression != null)
{
return expression;
diff --git a/api/src/main/java/javax/faces/validator/_MessageUtils.java b/api/src/main/java/javax/faces/validator/_MessageUtils.java
index b373638..acdb118 100755
--- a/api/src/main/java/javax/faces/validator/_MessageUtils.java
+++ b/api/src/main/java/javax/faces/validator/_MessageUtils.java
@@ -200,12 +200,33 @@ class _MessageUtils
static Object getLabel(FacesContext facesContext, UIComponent component)
{
Object label = component.getAttributes().get("label");
+ ValueExpression expression = null;
+ if (label != null &&
+ label instanceof String && ((String)label).length() == 0 )
+ {
+ // Note component.getAttributes().get("label") internally try to
+ // evaluate the EL expression for the label, but in some cases,
+ // when PSS is disabled and f:loadBundle is used, when the view is
+ // restored the bundle is not set to the EL expression returns an
+ // empty String. It is not possible to check if there is a
+ // hardcoded label, but we can check if there is
+ // an EL expression set, so the best in this case is use that, and if
+ // there is an EL expression set, use it, otherwise use the hardcoded
+ // value. See MYFACES-3591 for details.
+ expression = component.getValueExpression("label");
+ if (expression != null)
+ {
+ // Set the label to null and use the EL expression instead.
+ label = null;
+ }
+ }
+
if(label != null)
{
return label;
}
- ValueExpression expression = component.getValueExpression("label");
+ expression = (expression == null) ? component.getValueExpression("label") : expression;
if(expression != null)
{
return expression;
diff --git a/impl/src/main/java/org/apache/myfaces/renderkit/ServerSideStateCacheImpl.java b/impl/src/main/java/org/apache/myfaces/renderkit/ServerSideStateCacheImpl.java
index 7d2174a..d76c5be 100644
--- a/impl/src/main/java/org/apache/myfaces/renderkit/ServerSideStateCacheImpl.java
+++ b/impl/src/main/java/org/apache/myfaces/renderkit/ServerSideStateCacheImpl.java
@@ -640,16 +640,28 @@ class ServerSideStateCacheImpl extends StateCache<Object, Object>
// into the map.
state = null;
}
- _serializedViews.put(key, state);
-
+
Integer maxCount = getNumberOfSequentialViewsInSession(context);
if (maxCount != null)
{
if (previousRestoredKey != null)
{
- _precedence.put((SerializedViewKey) key, previousRestoredKey);
+ if (!_serializedViews.isEmpty())
+ {
+ _precedence.put((SerializedViewKey) key, previousRestoredKey);
+ }
+ else
+ {
+ // Note when the session is invalidated, _serializedViews map is empty,
+ // but we could have a not null previousRestoredKey (the last one before
+ // invalidate the session), so we need to check that condition before
+ // set the precence. In that way, we ensure the precedence map will always
+ // have valid keys.
+ previousRestoredKey = null;
+ }
}
}
+ _serializedViews.put(key, state);
while (_keys.remove(key))
{
diff --git a/impl/src/main/java/org/apache/myfaces/view/facelets/FaceletViewDeclarationLanguage.java b/impl/src/main/java/org/apache/myfaces/view/facelets/FaceletViewDeclarationLanguage.java
index 2607683..e64def8 100644
--- a/impl/src/main/java/org/apache/myfaces/view/facelets/FaceletViewDeclarationLanguage.java
+++ b/impl/src/main/java/org/apache/myfaces/view/facelets/FaceletViewDeclarationLanguage.java
@@ -385,9 +385,17 @@ public class FaceletViewDeclarationLanguage extends ViewDeclarationLanguageBase
}
// setup our viewId
- String renderedViewId = getRenderedViewId(context, view.getViewId());
+ String previousViewId = view.getViewId();
+ String renderedViewId = getRenderedViewId(context, previousViewId);
- view.setViewId(renderedViewId);
+ if (renderedViewId == null)
+ {
+ view.setViewId(renderedViewId);
+ }
+ else if (!renderedViewId.equals(previousViewId))
+ {
+ view.setViewId(renderedViewId);
+ }
if (log.isLoggable(Level.FINEST))
{
diff --git a/impl/src/main/java/org/apache/myfaces/view/facelets/compiler/AbstractUIHandler.java b/impl/src/main/java/org/apache/myfaces/view/facelets/compiler/AbstractUIHandler.java
index b828376..ee2b187 100644
--- a/impl/src/main/java/org/apache/myfaces/view/facelets/compiler/AbstractUIHandler.java
+++ b/impl/src/main/java/org/apache/myfaces/view/facelets/compiler/AbstractUIHandler.java
@@ -29,6 +29,13 @@ import org.apache.myfaces.view.facelets.tag.jsf.core.FacetHandler;
public abstract class AbstractUIHandler implements FaceletHandler, TextHandler
{
+ /**
+ * @param ctx
+ * @param parent
+ * @param c
+ * @deprecated
+ */
+ @Deprecated
public void addComponent(FaceletContext ctx, UIComponent parent, UIComponent c)
{
// possible facet scoped
diff --git a/impl/src/main/java/org/apache/myfaces/view/facelets/compiler/UIInstructionHandler.java b/impl/src/main/java/org/apache/myfaces/view/facelets/compiler/UIInstructionHandler.java
index 21999a7..17ae8a3 100644
--- a/impl/src/main/java/org/apache/myfaces/view/facelets/compiler/UIInstructionHandler.java
+++ b/impl/src/main/java/org/apache/myfaces/view/facelets/compiler/UIInstructionHandler.java
@@ -81,13 +81,14 @@ final class UIInstructionHandler extends AbstractUIHandler
{
if (parent != null)
{
+ String facetName = this.getFacetName(ctx, parent);
+
// our id
String id = ctx.generateUniqueId(this.id);
// grab our component
UIComponent c = null;
FaceletCompositionContext mctx= FaceletCompositionContext.getCurrentInstance(ctx);
- boolean componentFoundInserted = false;
if (mctx.isRefreshingSection())
{
@@ -151,31 +152,39 @@ final class UIInstructionHandler extends AbstractUIHandler
if (componentFound)
{
mctx.finalizeForDeletion(c);
- if (!componentFoundInserted)
+ if (mctx.isRefreshingSection())
+ {
+ ctx.getFacesContext().setProcessingEvents(false);
+ }
+ if (facetName == null)
{
- if (mctx.isRefreshingSection())
- {
- ctx.getFacesContext().setProcessingEvents(false);
- }
parent.getChildren().remove(c);
- if (mctx.isRefreshingSection())
- {
- ctx.getFacesContext().setProcessingEvents(oldProcessingEvents);
- }
}
- }
- if (!componentFoundInserted)
- {
- if (componentFound && mctx.isRefreshingSection())
+ else
{
- ctx.getFacesContext().setProcessingEvents(false);
+ ComponentSupport.removeFacet(ctx, parent, c, facetName);
}
- this.addComponent(ctx, parent, c);
- if (componentFound && mctx.isRefreshingSection())
+ if (mctx.isRefreshingSection())
{
ctx.getFacesContext().setProcessingEvents(oldProcessingEvents);
}
}
+ if (componentFound && mctx.isRefreshingSection())
+ {
+ ctx.getFacesContext().setProcessingEvents(false);
+ }
+ if (facetName == null)
+ {
+ parent.getChildren().add(c);
+ }
+ else
+ {
+ ComponentSupport.addFacet(ctx, parent, c, facetName);
+ }
+ if (componentFound && mctx.isRefreshingSection())
+ {
+ ctx.getFacesContext().setProcessingEvents(oldProcessingEvents);
+ }
}
}
diff --git a/impl/src/main/java/org/apache/myfaces/webapp/AbstractFacesInitializer.java b/impl/src/main/java/org/apache/myfaces/webapp/AbstractFacesInitializer.java
index 571191d..16d26a7 100644
--- a/impl/src/main/java/org/apache/myfaces/webapp/AbstractFacesInitializer.java
+++ b/impl/src/main/java/org/apache/myfaces/webapp/AbstractFacesInitializer.java
@@ -18,6 +18,8 @@
*/
package org.apache.myfaces.webapp;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFWebConfigParam;
import org.apache.myfaces.config.FacesConfigValidator;
import org.apache.myfaces.config.FacesConfigurator;
@@ -319,6 +321,31 @@ public abstract class AbstractFacesInitializer implements FacesInitializer
// clear the cache of MetaRulesetImpl in order to prevent a memory leak
MetaRulesetImpl.clearMetadataTargetCache();
+
+ // clear UIViewParameter default renderer map
+ try
+ {
+ Class<?> c = Class.forName("javax.faces.component.UIViewParameter");
+ Method m = c.getDeclaredMethod("releaseRenderer");
+ m.setAccessible(true);
+ m.invoke(null);
+ }
+ catch(ClassNotFoundException e)
+ {
+ log.log(Level.SEVERE, e.getMessage(), e);
+ }
+ catch(NoSuchMethodException e)
+ {
+ log.log(Level.SEVERE, e.getMessage(), e);
+ }
+ catch(IllegalAccessException e)
+ {
+ log.log(Level.SEVERE, e.getMessage(), e);
+ }
+ catch(InvocationTargetException e)
+ {
+ log.log(Level.SEVERE, e.getMessage(), e);
+ }
// TODO is it possible to make a real cleanup?
}
diff --git a/impl/src/main/resources/META-INF/WebConfigParamsLogger.vm b/impl/src/main/resources/META-INF/WebConfigParamsLogger.vm
index 8636677..fa504cc 100644
--- a/impl/src/main/resources/META-INF/WebConfigParamsLogger.vm
+++ b/impl/src/main/resources/META-INF/WebConfigParamsLogger.vm
@@ -56,7 +56,7 @@ public class WebConfigParamsLogger
{
if(log.isLoggable(Level.INFO))
{
- log.info("Starting up Tomahawk on the RI-JSF-Implementation.");
+ log.info("Starting up Tomahawk on the MyFaces-JSF-Implementation");
}
}
@@ -64,7 +64,7 @@ public class WebConfigParamsLogger
{
if(log.isLoggable(Level.INFO))
{
- log.info("Starting up Tomahawk on the MyFaces-JSF-Implementation");
+ log.info("Starting up Tomahawk on the RI-JSF-Implementation.");
}
}
}
diff --git a/shared-public/src/main/java/org/apache/myfaces/shared/util/MessageUtils.java b/shared-public/src/main/java/org/apache/myfaces/shared/util/MessageUtils.java
index f0703d5..0052e7b 100755
--- a/shared-public/src/main/java/org/apache/myfaces/shared/util/MessageUtils.java
+++ b/shared-public/src/main/java/org/apache/myfaces/shared/util/MessageUtils.java
@@ -645,12 +645,33 @@ public final class MessageUtils
public static Object getLabel(FacesContext facesContext, UIComponent component)
{
Object label = component.getAttributes().get("label");
+ ValueExpression expression = null;
+ if (label != null &&
+ label instanceof String && ((String)label).length() == 0 )
+ {
+ // Note component.getAttributes().get("label") internally try to
+ // evaluate the EL expression for the label, but in some cases,
+ // when PSS is disabled and f:loadBundle is used, when the view is
+ // restored the bundle is not set to the EL expression returns an
+ // empty String. It is not possible to check if there is a
+ // hardcoded label, but we can check if there is
+ // an EL expression set, so the best in this case is use that, and if
+ // there is an EL expression set, use it, otherwise use the hardcoded
+ // value. See MYFACES-3591 for details.
+ expression = component.getValueExpression("label");
+ if (expression != null)
+ {
+ // Set the label to null and use the EL expression instead.
+ label = null;
+ }
+ }
+
if(label != null)
{
return label;
}
- ValueExpression expression = component.getValueExpression("label");
+ expression = (expression == null) ? component.getValueExpression("label") : expression;
if(expression != null)
{
return expression;
--
To stop receiving notification emails like this one, please contact
deki@apache.org.