myfaces-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Leonardo Uribe (JIRA)" <...@myfaces.apache.org>
Subject [jira] Commented: (MYFACES-1741) JSR-252 Issue 21 - Provided an additional "binding" attribute for the core Converter, Listener and Validator tags has wrong behaviour
Date Sat, 13 Oct 2007 01:57:51 GMT

    [ https://issues.apache.org/jira/browse/MYFACES-1741?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12534459
] 

Leonardo Uribe commented on MYFACES-1741:
-----------------------------------------

I have made a probe of my assumptions. 

If all previous discussion is true, what should return JSF RI UIOutput.getConverter() for
any component that has a converter? 

If I use BigIntegerConverter, should return an object of the same type?

I made a simple modification of the previous code. At each phase, print what is inside this
property.

As I hoped, it returns this

#  This is the message for phase before APPLY_REQUEST_VALUES 2
# Component:javax.faces.component.html.HtmlInputText@11c55bb converter: com.sun.faces.taglib.jsf_core.ConverterTag$BindingConverter@1406eb6


This test probe that JSF RI is doing a delegate pattern, and if a solution does this for myfaces,
it remains compatible with JSF RI, 
which its my main objective.




> JSR-252 Issue 21 - Provided an additional "binding" attribute for the core Converter,
Listener and Validator tags has wrong behaviour
> -------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: MYFACES-1741
>                 URL: https://issues.apache.org/jira/browse/MYFACES-1741
>             Project: MyFaces Core
>          Issue Type: Bug
>          Components: JSR-252
>    Affects Versions:  1.2.0
>         Environment: Tomcat 6.0.14, Myfaces 1.2.1-SNAPSHOT (Oct 7 2007)
>            Reporter: Leonardo Uribe
>             Fix For: 1.2.1-SNAPSHOT
>
>
> There is a problem with the behaviour of binding attribute from actionListeners, validators
and converters.
> I have this test. The objective is explore how binding attribute is doing things comparing
jsf ri 1.2 and 
> myfaces 1.2.1-SNAPSHOT, trying to detect bugs on myfaces :) 
> bindingCLV.jsp
> <%@ page session="false" contentType="text/html;charset=utf-8"%>
> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
> <html>
> <f:view beforePhase="#{bindingCLVBean.beforePhase}" 
>     afterPhase="#{bindingCLVBean.afterPhase}">
> 	<%@include file="inc/head.inc"%>
> 	<body>
> 	<f:loadBundle
> 		basename="org.apache.myfaces.examples.resource.example_messages"
> 		var="example_messages" />
> 	<h1>Myfaces Examples JSF 1.2 Additions</h1>
> 	<h:messages></h:messages>
> 	<h:form id="form">
> 		<h:panelGrid id="grid" columns="3">
> 			<h:outputLabel value="BigInt" for="bigint"></h:outputLabel>
> 			<h:inputText id="bigint" binding="#{bindingCLVBean.input1}" value="#{bindingCLVBean.bigint}">
> 				<f:converter converterId="javax.faces.BigInteger" binding="#{bindingCLVBean.converterBigint}"/>
> 				<f:validator validatorId="org.apache.myfaces.bindingCLV.DummyValidator" 
> 				    binding="#{bindingCLVBean.validatorBigint}"/>
> 			</h:inputText>
> 			<h:message for="bigint"></h:message>
> 			<h:outputLabel value="BigDecimal" for="bigdecimal"></h:outputLabel>
> 			<h:inputText id="bigdecimal" binding="#{bindingCLVBean.input2}" value="#{bindingCLVBean.bigdecimal}">
> 				<f:converter converterId="javax.faces.BigDecimal" binding="#{bindingCLVBean.converterBigdecimal}"/>
> 				<f:validator validatorId="org.apache.myfaces.bindingCLV.DummyValidator" 
>                     binding="#{bindingCLVBean.validatorBigdecimal}"/>
> 			</h:inputText>
> 			<h:message for="bigdecimal"></h:message>
> 		</h:panelGrid>
> 		<h:commandButton id="button1" value="press me" action="#{bindingCLVBean.update}"
>
> 		  <f:actionListener type="org.apache.myfaces.bindingCLV.DummyActionListener" 
> 		      binding="#{bindingCLVBean.listener}" />
> 		</h:commandButton>
> 	</h:form>
> 	</body>
> </f:view>
> </html>
> Bean:
> package org.apache.myfaces.bindingCLV;
> import java.math.BigDecimal;
> import java.math.BigInteger;
> import javax.faces.application.FacesMessage;
> import javax.faces.component.html.HtmlInputText;
> import javax.faces.context.FacesContext;
> import javax.faces.convert.Converter;
> import javax.faces.event.ActionListener;
> import javax.faces.event.PhaseEvent;
> import javax.faces.validator.Validator;
> import org.apache.commons.logging.Log;
> import org.apache.commons.logging.LogFactory;
> public class BindingCLVBean {
> 	private BigInteger bigint;
> 	
> 	private BigDecimal bigdecimal;
> 	
> 	private Converter converterBigint;
> 	
> 	private Converter converterBigdecimal;
> 	
> 	private Validator validatorBigint;
> 	
> 	private Validator validatorBigdecimal;
> 	
> 	private HtmlInputText input1;
> 	
> 	private HtmlInputText input2;
> 	
> 	private ActionListener listener;
> 	
> 	Log log = LogFactory.getLog(BindingCLVBean.class);
> 	
> 	public void beforePhase(PhaseEvent phaseEvent){		
> 		FacesContext facesContext = FacesContext.getCurrentInstance();		
> 	
> 		facesContext.addMessage(null, new FacesMessage("This is the message for phase before
"+phaseEvent.getPhaseId().toString()));
> 		facesContext.addMessage(null, new FacesMessage("Component:"+this.getInput1()));
> 		facesContext.addMessage(null, new FacesMessage("Validator:"+this.getValidatorBigdecimal()));
> 		facesContext.addMessage(null, new FacesMessage("Converter:"+this.getConverterBigdecimal()));
> 		facesContext.addMessage(null, new FacesMessage("ActionListener:"+this.getListener()));
	
> 		log.info("This is the message for phase before "+phaseEvent.getPhaseId().toString()+"
: ");
> 	}
> 	
> 	public void afterPhase(PhaseEvent phaseEvent){
> 		FacesContext facesContext = FacesContext.getCurrentInstance();		
> 		
> 		facesContext.addMessage(null, new FacesMessage("This is the message for phase after
"+phaseEvent.getPhaseId().toString()));
> 		facesContext.addMessage(null, new FacesMessage("Component:"+this.getInput1()));
> 		facesContext.addMessage(null, new FacesMessage("Validator:"+this.getValidatorBigdecimal()));
> 		facesContext.addMessage(null, new FacesMessage("Converter:"+this.getConverterBigdecimal()));
> 		facesContext.addMessage(null, new FacesMessage("ActionListener:"+this.getListener()));
> 		log.info("This is the message for phase after "+phaseEvent.getPhaseId().toString()+"
: ");		
> 	}
> 	
> 	public BigInteger getBigint() {
> 		return bigint;
> 	}
> 	public void setBigint(BigInteger bigint) {
> 		this.bigint = bigint;
> 	}
> 	public BigDecimal getBigdecimal() {
> 		return bigdecimal;
> 	}
> 	public void setBigdecimal(BigDecimal bigdecimal) {
> 		this.bigdecimal = bigdecimal;
> 	}
> 	public Converter getConverterBigint() {
> 		return converterBigint;
> 	}
> 	public void setConverterBigint(Converter converterBigint) {
> 		this.converterBigint = converterBigint;
> 	}
> 	public Converter getConverterBigdecimal() {
> 		return converterBigdecimal;
> 	}
> 	public void setConverterBigdecimal(Converter converterBigdecimal) {
> 		this.converterBigdecimal = converterBigdecimal;
> 	}
> 	public Validator getValidatorBigint() {
> 		return validatorBigint;
> 	}
> 	public void setValidatorBigint(Validator validatorBigint) {
> 		this.validatorBigint = validatorBigint;
> 	}
> 	public Validator getValidatorBigdecimal() {
> 		return validatorBigdecimal;
> 	}
> 	public void setValidatorBigdecimal(Validator validatorBigdecimal) {
> 		this.validatorBigdecimal = validatorBigdecimal;
> 	}
> 	
> 	public String update(){
> 		FacesContext context = FacesContext.getCurrentInstance();
> 		return "update";
> 	}
> 	public HtmlInputText getInput1() {
> 		return input1;
> 	}
> 	public void setInput1(HtmlInputText input1) {
> 		this.input1 = input1;
> 	}
> 	public HtmlInputText getInput2() {
> 		return input2;
> 	}
> 	public void setInput2(HtmlInputText input2) {
> 		this.input2 = input2;
> 	}
> 	public ActionListener getListener() {
> 		return listener;
> 	}
> 	public void setListener(ActionListener listener) {
> 		this.listener = listener;
> 	}
> }
> When you call the page the first time, this is the output for <h:messages> tag
:
> JSF RI:
>     *  This is the message for phase before RENDER_RESPONSE 6
>     * Component:javax.faces.component.html.HtmlInputText@164de59
>     * Validator:null
>     * Converter:null
>     * ActionListener:null 
> Myfaces:
>     * This is the message for phase before RENDER_RESPONSE(6)
>     * Component:javax.faces.component.html.HtmlInputText@18c5e67
>     * Validator:org.apache.myfaces.bindingCLV.DummyValidator@89c116
>     * Converter:javax.faces.convert.BigDecimalConverter@1e3bbd7
>     * ActionListener:org.apache.myfaces.bindingCLV.DummyActionListener@4133b0
> QUESTION 1: Why do I create an object that I do not use?. Myfaces is wrong, and JSF RI
has the correct behaviour. 
> The first time that I load a page, it's unnecesary to create those objects.
> And when you press the button or submit the form:
> JSF RI:
>     *  This is the message for phase before APPLY_REQUEST_VALUES 2
>     * Component:javax.faces.component.html.HtmlInputText@14aa2db
>     * Validator:null
>     * Converter:null
>     * ActionListener:null
>     * This is the message for phase after APPLY_REQUEST_VALUES 2
>     * Component:javax.faces.component.html.HtmlInputText@14aa2db
>     * Validator:null
>     * Converter:null
>     * ActionListener:null
>     * This is the message for phase before PROCESS_VALIDATIONS 3
>     * Component:javax.faces.component.html.HtmlInputText@14aa2db
>     * Validator:null
>     * Converter:null
>     * ActionListener:null
>     * This is the message for phase after PROCESS_VALIDATIONS 3
>     * Component:javax.faces.component.html.HtmlInputText@14aa2db
>     * Validator:org.apache.myfaces.bindingCLV.DummyValidator@10df4e2
>     * Converter:javax.faces.convert.BigDecimalConverter@1485542
>     * ActionListener:null
>     * This is the message for phase before UPDATE_MODEL_VALUES 4
>     * Component:javax.faces.component.html.HtmlInputText@14aa2db
>     * Validator:org.apache.myfaces.bindingCLV.DummyValidator@10df4e2
>     * Converter:javax.faces.convert.BigDecimalConverter@1485542
>     * ActionListener:null
>     * This is the message for phase after UPDATE_MODEL_VALUES 4
>     * Component:javax.faces.component.html.HtmlInputText@14aa2db
>     * Validator:org.apache.myfaces.bindingCLV.DummyValidator@10df4e2
>     * Converter:javax.faces.convert.BigDecimalConverter@1485542
>     * ActionListener:null
>     * This is the message for phase before INVOKE_APPLICATION 5
>     * Component:javax.faces.component.html.HtmlInputText@14aa2db
>     * Validator:org.apache.myfaces.bindingCLV.DummyValidator@10df4e2
>     * Converter:javax.faces.convert.BigDecimalConverter@1485542
>     * ActionListener:null
>     * This is the message for phase after INVOKE_APPLICATION 5
>     * Component:javax.faces.component.html.HtmlInputText@14aa2db
>     * Validator:org.apache.myfaces.bindingCLV.DummyValidator@10df4e2
>     * Converter:javax.faces.convert.BigDecimalConverter@1485542
>     * ActionListener:org.apache.myfaces.bindingCLV.DummyActionListener@391da0
>     * This is the message for phase before RENDER_RESPONSE 6
>     * Component:javax.faces.component.html.HtmlInputText@14aa2db
>     * Validator:org.apache.myfaces.bindingCLV.DummyValidator@10df4e2
>     * Converter:javax.faces.convert.BigDecimalConverter@1485542
>     * ActionListener:org.apache.myfaces.bindingCLV.DummyActionListener@391da0 
> Myfaces:
>     * This is the message for phase before APPLY_REQUEST_VALUES(2)
>     * Component:javax.faces.component.html.HtmlInputText@16752c9
>     * Validator:null
>     * Converter:null
>     * ActionListener:null
>     * This is the message for phase after APPLY_REQUEST_VALUES(2)
>     * Component:javax.faces.component.html.HtmlInputText@16752c9
>     * Validator:null
>     * Converter:null
>     * ActionListener:null
>     * This is the message for phase before PROCESS_VALIDATIONS(3)
>     * Component:javax.faces.component.html.HtmlInputText@16752c9
>     * Validator:null
>     * Converter:null
>     * ActionListener:null
>     * This is the message for phase after PROCESS_VALIDATIONS(3)
>     * Component:javax.faces.component.html.HtmlInputText@16752c9
>     * Validator:null
>     * Converter:null
>     * ActionListener:null
>     * This is the message for phase before UPDATE_MODEL_VALUES(4)
>     * Component:javax.faces.component.html.HtmlInputText@16752c9
>     * Validator:null
>     * Converter:null
>     * ActionListener:null
>     * This is the message for phase after UPDATE_MODEL_VALUES(4)
>     * Component:javax.faces.component.html.HtmlInputText@16752c9
>     * Validator:null
>     * Converter:null
>     * ActionListener:null
>     * This is the message for phase before INVOKE_APPLICATION(5)
>     * Component:javax.faces.component.html.HtmlInputText@16752c9
>     * Validator:null
>     * Converter:null
>     * ActionListener:null
>     * This is the message for phase after INVOKE_APPLICATION(5)
>     * Component:javax.faces.component.html.HtmlInputText@16752c9
>     * Validator:null
>     * Converter:null
>     * ActionListener:null
>     * This is the message for phase before RENDER_RESPONSE(6)
>     * Component:javax.faces.component.html.HtmlInputText@16752c9
>     * Validator:org.apache.myfaces.bindingCLV.DummyValidator@1c958af
>     * Converter:javax.faces.convert.BigDecimalConverter@1dd7736
>     * ActionListener:org.apache.myfaces.bindingCLV.DummyActionListener@bd93cd
> QUESTION 2: Why I not have bindings assigned before  INVOKE_APPLICATION ?(in this time
is of value have a binding attribute) .  
> Again JSF RI has the correct behaviour and Myfaces is wrong. Myfaces create the validators,
converters and
> actionListeners on correct time, but not assign bindings when is supposed to do. If I
assign a binding for
> converter, validator or actionListener, I should be assigned minimum before INVOKE_APPLICATION,
or better,
> converters and validators on PROCESS_VALIDATIONS, and actionListeners in INVOKE_APPLICATION.
> Looks a little bit difficult but I will try to find a solution for this issue.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message