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 2014/11/24 22:42:01 UTC

svn commit: r1641481 - in /myfaces/core/trunk/impl/src: main/java/org/apache/myfaces/view/facelets/ main/java/org/apache/myfaces/view/facelets/impl/ main/java/org/apache/myfaces/view/facelets/tag/jsf/ test/java/org/apache/myfaces/view/facelets/pss/acid...

Author: lu4242
Date: Mon Nov 24 21:42:00 2014
New Revision: 1641481

URL: http://svn.apache.org/r1641481
Log:
MYFACES-3942 <f:viewParam binding> causes NPE because UIViewRoot is null

Added:
    myfaces/core/trunk/impl/src/test/resources/org/apache/myfaces/view/facelets/pss/acid/viewParamBinding1.xhtml
      - copied, changed from r1638905, myfaces/core/trunk/impl/src/test/resources/org/apache/myfaces/view/facelets/pss/acid/componentBinding1.xhtml
Modified:
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/FaceletCompositionContext.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/FaceletCompositionContextImpl.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/ComponentSupport.java
    myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/view/facelets/pss/acid/AcidMyFacesRequestTestCase.java
    myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/view/facelets/pss/acid/managed/ComponentBindingBean.java

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/FaceletCompositionContext.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/FaceletCompositionContext.java?rev=1641481&r1=1641480&r2=1641481&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/FaceletCompositionContext.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/FaceletCompositionContext.java Mon Nov 24 21:42:00 2014
@@ -699,6 +699,15 @@ abstract public class FaceletComposition
         return false;
     }
     
+    public UIViewRoot getViewRoot(FacesContext facesContext)
+    {
+        return facesContext.getViewRoot();
+    }
+    
+    public void setViewRoot(UIViewRoot root)
+    {
+    }
+    
     public VisitContextFactory getVisitContextFactory()
     {
         return (VisitContextFactory)FactoryFinder.getFactory(FactoryFinder.VISIT_CONTEXT_FACTORY);

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=1641481&r1=1641480&r2=1641481&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 Nov 24 21:42:00 2014
@@ -159,6 +159,7 @@ final class DefaultFacelet extends Abstr
             }
             if (parent instanceof UIViewRoot)
             {
+                myFaceletContext.setViewRoot((UIViewRoot)parent);
                 ComponentSupport.setCachedFacesContext((UIViewRoot)parent, facesContext);
             }
         }

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/FaceletCompositionContextImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/FaceletCompositionContextImpl.java?rev=1641481&r1=1641480&r2=1641481&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/FaceletCompositionContextImpl.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/impl/FaceletCompositionContextImpl.java Mon Nov 24 21:42:00 2014
@@ -162,6 +162,7 @@ public class FaceletCompositionContextIm
     private List<Integer> _dynamicOldDeletionLevel;
     
     private VisitContextFactory _visitContextFactory = null;
+    private UIViewRoot _viewRoot = null;
     
     public FaceletCompositionContextImpl(FaceletFactory factory, FacesContext facesContext)
     {
@@ -201,6 +202,7 @@ public class FaceletCompositionContextIm
         _isInMetadataSection = 0;
         _sharedStringBuilder = null;
         _ccLevel = 0;
+        _viewRoot = null;
     }
     
     /**
@@ -291,6 +293,7 @@ public class FaceletCompositionContextIm
         _sharedStringBuilder = null;
         _visitContextFactory = null;
         _dynamicOldDeletionLevel = null;
+        _viewRoot = null;
     }
    
     @Override
@@ -1222,6 +1225,22 @@ public class FaceletCompositionContextIm
     {
         return _dynamicComponentSection > 0;
     }
+
+    @Override
+    public void setViewRoot(UIViewRoot root)
+    {
+        this._viewRoot = root;
+    }
+
+    @Override
+    public UIViewRoot getViewRoot(FacesContext facesContext)
+    {
+        if (_viewRoot == null)
+        {
+            return facesContext.getViewRoot();
+        }
+        return _viewRoot;
+    }
     
     @Override
     public VisitContextFactory getVisitContextFactory()

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/ComponentSupport.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/ComponentSupport.java?rev=1641481&r1=1641480&r2=1641481&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/ComponentSupport.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/ComponentSupport.java Mon Nov 24 21:42:00 2014
@@ -460,7 +460,12 @@ public final class ComponentSupport
             }
         } while (c != null);
 
-        return ctx.getFacesContext().getViewRoot();
+        UIViewRoot root = ctx.getFacesContext().getViewRoot();
+        if (root == null)
+        {
+            root = FaceletCompositionContext.getCurrentInstance(ctx).getViewRoot(ctx.getFacesContext());
+        }
+        return root;
     }
     
     /**

Modified: myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/view/facelets/pss/acid/AcidMyFacesRequestTestCase.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/view/facelets/pss/acid/AcidMyFacesRequestTestCase.java?rev=1641481&r1=1641480&r2=1641481&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/view/facelets/pss/acid/AcidMyFacesRequestTestCase.java (original)
+++ myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/view/facelets/pss/acid/AcidMyFacesRequestTestCase.java Mon Nov 24 21:42:00 2014
@@ -18,7 +18,6 @@
  */
 package org.apache.myfaces.view.facelets.pss.acid;
 
-import java.util.HashSet;
 import java.util.Set;
 import java.util.TreeSet;
 import javax.el.ExpressionFactory;
@@ -28,6 +27,7 @@ import javax.faces.component.UIComponent
 import javax.faces.component.UIInput;
 import javax.faces.component.UIOutput;
 import javax.faces.component.UIPanel;
+import javax.faces.component.UIViewParameter;
 import javax.faces.component.html.HtmlDataTable;
 
 import org.apache.myfaces.mc.test.core.AbstractMyFacesRequestTestCase;
@@ -35,6 +35,7 @@ import org.apache.myfaces.shared.config.
 import org.apache.myfaces.test.mock.MockPrintWriter;
 import org.apache.myfaces.view.facelets.pss.acid.component.UISimpleComponent1;
 import org.apache.myfaces.view.facelets.pss.acid.managed.CheckActionEventBean;
+import org.apache.myfaces.view.facelets.pss.acid.managed.ComponentBindingBean;
 import org.apache.myfaces.view.facelets.pss.acid.managed.ComponentBindingFormBean;
 import org.apache.myfaces.view.facelets.pss.acid.managed.CustomSessionBean;
 import org.apache.myfaces.view.facelets.pss.acid.managed.ForEachBean;
@@ -596,6 +597,53 @@ public class AcidMyFacesRequestTestCase 
     }    
     
     @Test
+    public void testViewParamBinding() throws Exception
+    {
+        startViewRequest("/viewParamBinding1.xhtml");
+        processLifecycleExecuteAndRender();
+        
+        UIComponent comp = facesContext.getViewRoot().findComponent("panel");
+        Assert.assertNotNull(comp);
+        Assert.assertEquals(1, comp.getChildCount());
+        
+        UIViewParameter viewParam = (UIViewParameter) facesContext.getExternalContext().getRequestMap().get("foo");
+        Assert.assertNotNull(viewParam);
+        Assert.assertEquals("foo", viewParam.getName());
+        UIViewParameter viewParam2 = facesContext.getApplication().evaluateExpressionGet(
+                facesContext, "#{componentBindingBean}", ComponentBindingBean.class).getViewParam();
+        Assert.assertNotNull(viewParam2);
+        Assert.assertEquals("foo2", viewParam2.getName());
+        
+        UICommand button = (UICommand) facesContext.getViewRoot().findComponent("mainForm:postback");
+        client.submit(button);
+        processLifecycleExecuteAndRender();
+        Assert.assertNotNull(comp);
+        // Even if in the postback two components were added, pss algorithm must replace the
+        // component with the one saved.
+        Assert.assertEquals(1, comp.getChildCount());
+        
+        comp = facesContext.getViewRoot().findComponent("panel");
+        
+        Assert.assertEquals("value1", comp.getAttributes().get("attr1"));
+        Assert.assertEquals("value2", comp.getChildren().get(0).getAttributes().get("attr2"));
+        
+        button = (UICommand) facesContext.getViewRoot().findComponent("mainForm:postback");
+        client.submit(button);
+        processLifecycleExecuteAndRender();
+
+        comp = facesContext.getViewRoot().findComponent("panel");
+        Assert.assertNotNull(comp);
+        // Even if in the postback two components were added, pss algorithm must replace the
+        // component with the one saved.
+        Assert.assertEquals(1, comp.getChildCount());
+        
+        Assert.assertEquals("value1", comp.getAttributes().get("attr1"));
+        Assert.assertEquals("value2", comp.getChildren().get(0).getAttributes().get("attr2"));
+        
+        endRequest();
+    }    
+    
+    @Test
     public void testDynamicForm() throws Exception
     {
         startViewRequest("/dynamicForm.xhtml");

Modified: myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/view/facelets/pss/acid/managed/ComponentBindingBean.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/view/facelets/pss/acid/managed/ComponentBindingBean.java?rev=1641481&r1=1641480&r2=1641481&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/view/facelets/pss/acid/managed/ComponentBindingBean.java (original)
+++ myfaces/core/trunk/impl/src/test/java/org/apache/myfaces/view/facelets/pss/acid/managed/ComponentBindingBean.java Mon Nov 24 21:42:00 2014
@@ -22,6 +22,7 @@ import javax.faces.bean.ManagedBean;
 import javax.faces.bean.RequestScoped;
 import javax.faces.component.UIOutput;
 import javax.faces.component.UIPanel;
+import javax.faces.component.UIViewParameter;
 import javax.faces.component.html.HtmlPanelGroup;
 import javax.faces.context.FacesContext;
 
@@ -35,6 +36,8 @@ public class ComponentBindingBean
 {
     private UIPanel panel;
     
+    private UIViewParameter viewParam;
+    
     public UIPanel getPanel()
     {
         if (panel == null)
@@ -72,4 +75,20 @@ public class ComponentBindingBean
     {
         this.panel = panel;
     }
+
+    /**
+     * @return the viewParam
+     */
+    public UIViewParameter getViewParam()
+    {
+        return viewParam;
+    }
+
+    /**
+     * @param viewParam the viewParam to set
+     */
+    public void setViewParam(UIViewParameter viewParam)
+    {
+        this.viewParam = viewParam;
+    }
 }

Copied: myfaces/core/trunk/impl/src/test/resources/org/apache/myfaces/view/facelets/pss/acid/viewParamBinding1.xhtml (from r1638905, myfaces/core/trunk/impl/src/test/resources/org/apache/myfaces/view/facelets/pss/acid/componentBinding1.xhtml)
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/test/resources/org/apache/myfaces/view/facelets/pss/acid/viewParamBinding1.xhtml?p2=myfaces/core/trunk/impl/src/test/resources/org/apache/myfaces/view/facelets/pss/acid/viewParamBinding1.xhtml&p1=myfaces/core/trunk/impl/src/test/resources/org/apache/myfaces/view/facelets/pss/acid/componentBinding1.xhtml&r1=1638905&r2=1641481&rev=1641481&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/test/resources/org/apache/myfaces/view/facelets/pss/acid/componentBinding1.xhtml (original)
+++ myfaces/core/trunk/impl/src/test/resources/org/apache/myfaces/view/facelets/pss/acid/viewParamBinding1.xhtml Mon Nov 24 21:42:00 2014
@@ -16,6 +16,10 @@
     xmlns:h="http://java.sun.com/jsf/html"
     xmlns:f="http://java.sun.com/jsf/core"
     xmlns:ui="http://java.sun.com/jsf/facelets">
+<f:metadata>
+    <f:viewParam name="foo" binding="#{foo}"/>
+    <f:viewParam name="foo2" binding="#{componentBindingBean.viewParam}"/>
+</f:metadata>
 <h:head>
 </h:head>
 <h:body>