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.