Hi,

it works with Enums because EL uses for "EnumValue" coercion
Enum.valueOf(EnumType.class, "EnumValue") - see Unified EL spec, section
1.17 Enums . I added a test for this explicitly. But
MockExpressionFactory currently does not implement this enum coercion in
coerceToType method - MYFACES-2920-v2.patch contains fix for that.


Regards, 

Kočičák


Jakob Korherr píše v Út 14. 09. 2010 v 16:57 +0200:
> Hi,
> 
> The patch looks good, but actually I did not test it myself. Have you
> also tried it with enum values?
> 
> Funny that the TCK does not fail here, because the spec explicitly
> tells us to use coercion.
> 
> If it works well with enums, +1 on committing this patch.
> 
> Regards,
> Jakob
> 
> 2010/9/14 Martin Koci <martin.kocicak.k...@gmail.com>:
> > Hi,
> >
> > please review https://issues.apache.org/jira/browse/MYFACES-2920
> >
> > 1) JavaDoc explicitly mentions EL coecion but not Converter:
> > https://javaserverfaces.dev.java.net/nonav/docs/2.0/javadocs/javax/faces/component/UISelectOne.html#validateValue%28javax.faces.context.FacesContext,%20java.lang.Object%29
> >
> > "Before comparing each option, coerce the option value type to the type
> > of this component's value following the Expression Language coercion
> > rules" -
> >
> > but obviously if Converter was used for SelectItem.value -> String
> > should be used for String -> SelectItem.value
> >
> > 2) EL coercion problem: yes, that can happen:
> >
> >
> > <h:selectOne value="#{bean.floatProperty}">
> >  <f:selectItem itemValue="" .../>
> >
> >
> > Selected value will be 0.0 in this case. This is probably not problem if
> > property is primitive float but with Object Float user expects null
> > (maybe). But is itemValue="" permitted at all?
> >
> >
> > 3) Trinidad: Matthias, isn't this change related to this problem too? :
> > http://svn.apache.org/viewvc/myfaces/trinidad/trunk/trinidad-impl/src/main/java/org/apache/myfaces/trinidadinternal/renderkit/core/xhtml/SimpleSelectOneRenderer.java?r1=672549&r2=694485&diff_format=h
> >
> >
> > Regards,
> >
> > Kočičák
> >
> >
> > Martin Marinschek píše v Pá 27. 08. 2010 v 17:50 +0200:
> >> I didn't totally think through if it is usable in this case, but more
> >> general, if you can prevent it, do not use EL coercion. Why?
> >>
> >> As specified, EL coercion will coerce null to 0 or an "". For the next
> >> version of the EL, this behaviour might be configurable.
> >>
> >> best regards,
> >>
> >> Martin
> >>
> >> On 8/27/10, Jakob Korherr <jakob.korh...@gmail.com> wrote:
> >> > Hi,
> >> >
> >> > Hmm, could be. I guess this code was introduced in JSF 1.1 (no unified EL
> >> > and thus no EL coercion available) and never changed in later versions.
> >> >
> >> > If you can make the scenario work using EL coercion, please file an 
> >> > issue in
> >> > the JIRA. Thanks!
> >> >
> >> > Regards,
> >> > Jakob
> >> >
> >> > 2010/8/27 Martin Koci <martin.k...@aura.cz>
> >> >
> >> >> Hi,
> >> >>
> >> >>
> >> >> I understand that requirement but isn't it EL coercion task ? :
> >> >>
> >> >> https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=152
> >> >>
> >> >> and from UISelectMany.validateValue JavaDoc:
> >> >>
> >> >> " ...Before comparing each option, coerce the option value type to the
> >> >> type of this component's value following the Expression Language
> >> >> coercion rules ..."
> >> >>
> >> >>
> >> >> Regards,
> >> >>
> >> >> Martin Kočí
> >> >>
> >> >> Jakob Korherr píše v Pá 27. 08. 2010 v 15:31 +0200:
> >> >> > Hi Martin,
> >> >> >
> >> >> > The purpose of this conversion is that the value of the SelectItems
> >> >> > may be a String, but the real (already converted) value of the
> >> >> > UISelectMany may be something else, e.g. Float. Imagine the following
> >> >> > scenario:
> >> >> >
> >> >> > <h:selectManyCheckbox value="#{myBean.inputFloatArray}">
> >> >> >             <f:selectItem itemValue="1.1" />
> >> >> >             <f:selectItem itemValue="1.2" />
> >> >> >             <f:selectItem itemValue="1.3" />
> >> >> > </h:selectManyCheckbox>
> >> >> >
> >> >> > The itemValues of all SelectItems are Strings, but the UISelectMany
> >> >> > points to a property which is of type Float[]. Now because of the fact
> >> >> > that all Strings can be converted into Floats, this scenario must
> >> >> > work.
> >> >> >
> >> >> > If you now take a look at _SelectItemsUtil.matchValue(), you can see
> >> >> > that not the component's value, but the value of the SelectItem is
> >> >> > converted via the _ValueConverter:
> >> >> >
> >> >> > SelectItem item = selectItemsIter.next();
> >> >> > Object itemValue = item.getValue();
> >> >> > if(converter != null && itemValue instanceof String)
> >> >> > {
> >> >> >     itemValue = converter.getConvertedValue(context,
> >> >> > (String)itemValue);
> >> >> > }
> >> >> >
> >> >> > and then matched against the real value (again which is e.g. Float):
> >> >> >
> >> >> > if (value==itemValue || value.equals(itemValue))
> >> >> > {
> >> >> >     return true;
> >> >> > }
> >> >> >
> >> >> > Furthermore the converter has to be invoked with the wrapped String in
> >> >> > a String[], because UISelectMany.getConvertedValue() needs a
> >> >> > submittedValue of type String[].
> >> >> >
> >> >> > Is this clear for you or should I explain it in more detail?
> >> >> >
> >> >> > Regards,
> >> >> > Jakob
> >> >> >
> >> >> > 2010/8/27 Martin Koci <martin.k...@aura.cz>
> >> >> >         Hi,
> >> >> >
> >> >> >
> >> >> >         what is the purpose of _SelectItemsUtil._ValueConverter in
> >> >> >         UISelectMany.validateValue(FacesContext, Object) ?
> >> >> >
> >> >> >         Two weird things:
> >> >> >
> >> >> >         1) it wraps value into new String[] { value }
> >> >> >         2) it calls UISelectMany.this.getConvertedValue and it leads
> >> >> >         to
> >> >> >         Rendered.getConvertedValue call
> >> >> >
> >> >> >         I don't see sence in  call of
> >> >> >         UISelectMany.this.getConvertedValue
> >> >> >         because this already done: we are in method validateValue here
> >> >> >         and
> >> >> >         conversion with Renderer.getConvertedValue is done already.
> >> >> >         This causes
> >> >> >         calls to Renderer.getConvertedValue during process validation
> >> >> >         which is
> >> >> >         unintented I think.
> >> >> >
> >> >> >
> >> >> >         Regards,
> >> >> >
> >> >> >         Martin Kočí
> >> >> >
> >> >> >
> >> >> >
> >> >> >
> >> >> >
> >> >> > --
> >> >> > Jakob Korherr
> >> >> >
> >> >> > blog: http://www.jakobk.com
> >> >> > twitter: http://twitter.com/jakobkorherr
> >> >> > work: http://www.irian.at
> >> >>
> >> >>
> >> >>
> >> >
> >> >
> >> > --
> >> > Jakob Korherr
> >> >
> >> > blog: http://www.jakobk.com
> >> > twitter: http://twitter.com/jakobkorherr
> >> > work: http://www.irian.at
> >> >
> >>
> >>
> >> --
> >>
> >> http://www.irian.at
> >>
> >> Your JSF powerhouse -
> >> JSF Consulting, Development and
> >> Courses in English and German
> >>
> >> Professional Support for Apache MyFaces
> >>
> >
> >
> >
> 
> 
> 


Reply via email to