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>