[richfaces-issues] [JBoss JIRA] (RF-12654) PartialViewRender skips check for whether column is rendered before checking if children can be rendered

Alexandre Heroux (JIRA) issues at jboss.org
Sun Feb 2 10:38:28 EST 2014


    [ https://issues.jboss.org/browse/RF-12654?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12940667#comment-12940667 ] 

Alexandre Heroux commented on RF-12654:
---------------------------------------

Rewrite the class ExtendedPartialViewContextImpl to skip unrendered and change two methods

	private void visitActivatorAtExecute() {
		ExecuteComponentCallback callback = new ExecuteComponentCallback(
				getFacesContext(), behaviorEvent);

		if (visitActivatorComponent(
				activatorComponentId,
				callback,
				new HashSet<VisitHint>(Arrays.asList(VisitHint.SKIP_UNRENDERED)))) {
			setupExecuteCallbackData(callback);

			if (!executeIds.contains(ALL)) {
				addImplicitExecuteIds(executeIds);
			}
		} else {
			// TODO - log or exception?
			// TODO - process default execute value
		}
	}

and

private void visitActivatorAtRender(Collection<String> ids) {
		if (!isRenderAll()) {
			RenderComponentCallback callback = new RenderComponentCallback(
					getFacesContext(), behaviorEvent);

			if (visitActivatorComponent(
					activatorComponentId,
					callback,
					new HashSet<VisitHint>(Arrays
							.asList(VisitHint.SKIP_UNRENDERED)))) {
				setupRenderCallbackData(callback);
			} else {
				// TODO - the same as for "execute"
			}

			// take collection value stored during execute
			if (componentRenderIds != null) {
				ids.addAll(componentRenderIds);
			}

			if (!Boolean.TRUE.equals(renderAll) && !ids.contains(ALL)) {
				addImplicitRenderIds(ids, limitRender);

				appendOnbeforedomupdate(onbeforedomupdate);
				appendOncomplete(oncomplete);
				setResponseData(responseData);
			}
		}
	}
                
> PartialViewRender skips check for whether column is rendered before checking if children can be rendered
> --------------------------------------------------------------------------------------------------------
>
>                 Key: RF-12654
>                 URL: https://issues.jboss.org/browse/RF-12654
>             Project: RichFaces
>          Issue Type: Bug
>      Security Level: Public(Everyone can see) 
>    Affects Versions: 4.3.0.M2
>         Environment: JBoss 7.1.1.Final
>            Reporter: Ken H
>              Labels: lazy-loaded
>             Fix For: 5-Tracking
>
>
> When using rendered on a component within a rich:column of a rich:dataTable, the EL on the component is executed even if the column is not rendered.
> The expected behavior (per my loose understanding of the JSF spec) would suggest that the traversal should have short-circuited before checking the unrendered column's children.
> This behavior exists at least as far back as 4.1.0.Final.
> Given this minimal example:
> {code}
> <rich:dataTable value="#{bean.foos}" var="foo">
>    <rich:column rendered="false">
>        <h:outputText value="#{foo.bar}" rendered="#{foo.propertyDoesNotExist != null}" />
>    </rich:column>
>    <rich:column>
>        <a4j:commandButton value="Test" action="#{bean.noop}"
>            execute="@this" render="@form" />
>    </rich:column>
> </rich:dataTable>
> {code}
> Clicking the Test button would result in a stack trace similar to the following:
> {code}
>  /index.xhtml @33,96 rendered="#{foo.propertyDoesNotExist != null}": The class 'org.richfaces.tests.Foo' does not have the property 'propertyDoesNotExist'.
> 	at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:111) [jsf-impl-2.1.7-jbossorg-2.jar:]
> 	at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
> 	at javax.faces.component.UIComponentBase.isRendered(UIComponentBase.java:413) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
> 	at javax.faces.component.UIComponent.isVisitable(UIComponent.java:1669) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
> 	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1602) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
> 	at org.richfaces.component.UIDataAdaptor$DataVisitorForVisitTree.process(UIDataAdaptor.java:199) [richfaces-components-ui-4.3.0.20121024-M2.jar:4.3.0.20121024-M2]
> 	at org.ajax4jsf.model.SequenceDataModel.walk(SequenceDataModel.java:65) [richfaces-core-api-4.3.0.20121024-M2.jar:4.3.0.20121024-M2]
> 	at org.richfaces.component.UIDataAdaptor.walk(UIDataAdaptor.java:796) [richfaces-components-ui-4.3.0.20121024-M2.jar:4.3.0.20121024-M2]
> 	at org.richfaces.component.UIDataAdaptor.visitDataChildren(UIDataAdaptor.java:1269) [richfaces-components-ui-4.3.0.20121024-M2.jar:4.3.0.20121024-M2]
> 	at org.richfaces.component.UIDataTableBase.visitDataChildren(UIDataTableBase.java:395) [richfaces-components-ui-4.3.0.20121024-M2.jar:4.3.0.20121024-M2]
> 	at org.richfaces.component.UIDataAdaptor.visitTree(UIDataAdaptor.java:1347) [richfaces-components-ui-4.3.0.20121024-M2.jar:4.3.0.20121024-M2]
> 	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
> 	at javax.faces.component.UIForm.visitTree(UIForm.java:371) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
> 	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
> 	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1623) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
> 	at org.richfaces.context.ExtendedPartialViewContextImpl.visitActivatorComponent(ExtendedPartialViewContextImpl.java:440) [richfaces-core-impl-4.3.0.20121024-M2.jar:4.3.0.20121024-M2]
> 	at org.richfaces.context.ExtendedPartialViewContextImpl.visitActivatorAtExecute(ExtendedPartialViewContextImpl.java:310) [richfaces-core-impl-4.3.0.20121024-M2.jar:4.3.0.20121024-M2]
> 	at org.richfaces.context.ExtendedPartialViewContextImpl.getExecuteIds(ExtendedPartialViewContextImpl.java:98) [richfaces-core-impl-4.3.0.20121024-M2.jar:4.3.0.20121024-M2]
> 	at org.richfaces.context.ExtendedPartialViewContextImpl.isExecuteAll(ExtendedPartialViewContextImpl.java:148) [richfaces-core-impl-4.3.0.20121024-M2.jar:4.3.0.20121024-M2]
> 	at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:929) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
> 	at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78) [jsf-impl-2.1.7-jbossorg-2.jar:]
> {code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira


More information about the richfaces-issues mailing list