Re: EL 3.0 Static Field References

2015-03-27 Thread William Lucy

Thanks for the response, Leonardo.

From what I can tell, the issue isn't that MyFaces can't find the
StaticFieldELResolver - that is loaded correctly.  JSP static field EL
references do work properly through MyFaces, so there does seem to be some
JSF issue.

I think there may be a spec issue here?  (What I believe to be) a similar
issue had to be addressed for JSP 2.3:
https://bz.apache.org/bugzilla/show_bug.cgi?id=57141

MyFaces has a resolver, ScopedAttributeResolver, which always sets the
resolved field on the EvaluationContext to true if the EL expression's
property isn't null.  The issue with that is when we're trying to resolve
the EL expression base (eg. Boolean in the expression Boolean.TRUE) EL
3.0 never has a chance to resolve the import the base ELClass, since it
first runs through the EL Resolvers.

My testing has shown that if we don't set context.setPropertyResolved(true)
in the ScopedAttributeResolver, this particular case (#{Boolean.TRUE})
works as expected.

Any thoughts on this?  Let me know if I need to clarify anything.

Regards,

Bill Lucy


Leonardo Uribe lu4...@gmail.com wrote on 03/25/2015 06:10:00 PM:

 From: Leonardo Uribe lu4...@gmail.com
 To: MyFaces Discussion users@myfaces.apache.org
 Date: 03/25/2015 06:11 PM
 Subject: Re: EL 3.0 Static Field References

 Hi

 It is in the spec, it should work.

 There is some code in
 org.apache.myfaces.el.unified.ResolverBuilderForFaces that deals with
 this:

 if (STATIC_FIELD_EL_RESOLVER_CLASS != null 
 GET_STREAM_EL_RESOLVER_METHOD != null)
 {
 try
 {
 ELResolver streamElResolver = (ELResolver)
 GET_STREAM_EL_RESOLVER_METHOD.invoke(
 getRuntimeConfig().getExpressionFactory());
 if (streamElResolver != null)
 {
 // By default return null, but in a EL 3
 implementation it should be there,
 // this is just to avoid exceptions in junit testing
 list.add(streamElResolver);
 }
 list.add((ELResolver)
 STATIC_FIELD_EL_RESOLVER_CLASS.newInstance());
 }

 The code checks for javax.el.StaticFieldELResolver class and
 ExpressionFactory.getStreamELResolver(...) method before
 add both EL resolvers.

 If MyFaces jars cannot locate these classes, the EL resolvers
 are not loaded (because it assumes EL  3.0), and the
 described behavior will happen.

 regards,

 Leonardo Uribe

 2015-03-25 15:14 GMT-05:00 William Lucy wtl...@us.ibm.com:
 
 
  Hi All,
 
  I'm running into some issues trying to test the EL 3.0 functionality on
  MyFaces 2.2.7 + Tomcat 8.0.16.  My understanding is that we should be
able
  to reference static fields/methods directly from facelets, eg.
 
Boolean.TRUE test: [h:outputText id=out2
value=#{Boolean.TRUE}/]
 
  should return Boolean.TRUE test: [true].  This isn't the case,
however;
  no value is returned, and nothing's logged.  Additionally, when I try
to
  access a static field on a local ManagedBean, I get
 
...
javax.el.PropertyNotFoundException: Property 'staticReference'
not
found on type beans.EL30StaticFieldsAndMethodsBean
   at javax.el.BeanELResolver$BeanProperties.get
   (BeanELResolver.java:244)
   at javax.el.BeanELResolver$BeanProperties.access$300
   (BeanELResolver.java:221)
   at javax.el.BeanELResolver.property(BeanELResolver.java:331)
   at javax.el.BeanELResolver.getValue(BeanELResolver.java:95)
   at javax.el.CompositeELResolver.getValue
   (CompositeELResolver.java:66)
   at
 
 org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue
  (FacesCompositeELResolver.java:179)
   ... 1 more
 
  Where the ManagedBean is defined simply as
 
package beans;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
 
@ManagedBean(name = staticbean)
@ApplicationScoped
public class EL30StaticFieldsAndMethodsBean {
   ...
public static final String staticReference = static
reference;
   ...
}
 
  Has anyone else tried working with these kinds of EL 3.0 features?  Or
am I
  possibly just missing something here?
 
  Thanks,
  Bill Lucy


Re: EL 3.0 Static Field References

2015-03-27 Thread Leonardo Uribe
Hi

I think it is a bug in JSF 2.2 spec. The behavior for
ScopedAttributeELResolver (for facelets) is defined in section
5.6.2.9. To solve it (for 2.3) you should raise an issue on:

https://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC

But I found this one already created on Mojarra issue tracker:

https://java.net/jira/browse/JAVASERVERFACES-3362

Please create an issue on the spec issue tracker. MyFaces already has
some params to control the EL Resolver ordering, so I suppose this
feature will help to fix the problem for 2.2.x. Besides that, we can't
do anything else from this side.

regards,

Leonardo Uribe

2015-03-27 9:19 GMT-05:00 William Lucy wtl...@us.ibm.com:

 Thanks for the response, Leonardo.

 From what I can tell, the issue isn't that MyFaces can't find the
 StaticFieldELResolver - that is loaded correctly.  JSP static field EL
 references do work properly through MyFaces, so there does seem to be some
 JSF issue.

 I think there may be a spec issue here?  (What I believe to be) a similar
 issue had to be addressed for JSP 2.3:
 https://bz.apache.org/bugzilla/show_bug.cgi?id=57141

 MyFaces has a resolver, ScopedAttributeResolver, which always sets the
 resolved field on the EvaluationContext to true if the EL expression's
 property isn't null.  The issue with that is when we're trying to resolve
 the EL expression base (eg. Boolean in the expression Boolean.TRUE) EL
 3.0 never has a chance to resolve the import the base ELClass, since it
 first runs through the EL Resolvers.

 My testing has shown that if we don't set context.setPropertyResolved(true)
 in the ScopedAttributeResolver, this particular case (#{Boolean.TRUE})
 works as expected.

 Any thoughts on this?  Let me know if I need to clarify anything.

 Regards,

 Bill Lucy


 Leonardo Uribe lu4...@gmail.com wrote on 03/25/2015 06:10:00 PM:

 From: Leonardo Uribe lu4...@gmail.com
 To: MyFaces Discussion users@myfaces.apache.org
 Date: 03/25/2015 06:11 PM
 Subject: Re: EL 3.0 Static Field References

 Hi

 It is in the spec, it should work.

 There is some code in
 org.apache.myfaces.el.unified.ResolverBuilderForFaces that deals with
 this:

 if (STATIC_FIELD_EL_RESOLVER_CLASS != null 
 GET_STREAM_EL_RESOLVER_METHOD != null)
 {
 try
 {
 ELResolver streamElResolver = (ELResolver)
 GET_STREAM_EL_RESOLVER_METHOD.invoke(
 getRuntimeConfig().getExpressionFactory());
 if (streamElResolver != null)
 {
 // By default return null, but in a EL 3
 implementation it should be there,
 // this is just to avoid exceptions in junit testing
 list.add(streamElResolver);
 }
 list.add((ELResolver)
 STATIC_FIELD_EL_RESOLVER_CLASS.newInstance());
 }

 The code checks for javax.el.StaticFieldELResolver class and
 ExpressionFactory.getStreamELResolver(...) method before
 add both EL resolvers.

 If MyFaces jars cannot locate these classes, the EL resolvers
 are not loaded (because it assumes EL  3.0), and the
 described behavior will happen.

 regards,

 Leonardo Uribe

 2015-03-25 15:14 GMT-05:00 William Lucy wtl...@us.ibm.com:
 
 
  Hi All,
 
  I'm running into some issues trying to test the EL 3.0 functionality on
  MyFaces 2.2.7 + Tomcat 8.0.16.  My understanding is that we should be
 able
  to reference static fields/methods directly from facelets, eg.
 
Boolean.TRUE test: [h:outputText id=out2
value=#{Boolean.TRUE}/]
 
  should return Boolean.TRUE test: [true].  This isn't the case,
 however;
  no value is returned, and nothing's logged.  Additionally, when I try
 to
  access a static field on a local ManagedBean, I get
 
...
javax.el.PropertyNotFoundException: Property 'staticReference'
 not
found on type beans.EL30StaticFieldsAndMethodsBean
   at javax.el.BeanELResolver$BeanProperties.get
   (BeanELResolver.java:244)
   at javax.el.BeanELResolver$BeanProperties.access$300
   (BeanELResolver.java:221)
   at javax.el.BeanELResolver.property(BeanELResolver.java:331)
   at javax.el.BeanELResolver.getValue(BeanELResolver.java:95)
   at javax.el.CompositeELResolver.getValue
   (CompositeELResolver.java:66)
   at
 
 org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue
  (FacesCompositeELResolver.java:179)
   ... 1 more
 
  Where the ManagedBean is defined simply as
 
package beans;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
 
@ManagedBean(name = staticbean)
@ApplicationScoped
public class EL30StaticFieldsAndMethodsBean {
   ...
public static final String staticReference = static
 reference;
   ...
}
 
  Has anyone else tried working with these kinds of EL 3.0 features

Re: EL 3.0 Static Field References

2015-03-25 Thread Leonardo Uribe
Hi

It is in the spec, it should work.

There is some code in
org.apache.myfaces.el.unified.ResolverBuilderForFaces that deals with
this:

if (STATIC_FIELD_EL_RESOLVER_CLASS != null 
GET_STREAM_EL_RESOLVER_METHOD != null)
{
try
{
ELResolver streamElResolver = (ELResolver)
GET_STREAM_EL_RESOLVER_METHOD.invoke(
getRuntimeConfig().getExpressionFactory());
if (streamElResolver != null)
{
// By default return null, but in a EL 3
implementation it should be there,
// this is just to avoid exceptions in junit testing
list.add(streamElResolver);
}
list.add((ELResolver)
STATIC_FIELD_EL_RESOLVER_CLASS.newInstance());
}

The code checks for javax.el.StaticFieldELResolver class and
ExpressionFactory.getStreamELResolver(...) method before
add both EL resolvers.

If MyFaces jars cannot locate these classes, the EL resolvers
are not loaded (because it assumes EL  3.0), and the
described behavior will happen.

regards,

Leonardo Uribe

2015-03-25 15:14 GMT-05:00 William Lucy wtl...@us.ibm.com:


 Hi All,

 I'm running into some issues trying to test the EL 3.0 functionality on
 MyFaces 2.2.7 + Tomcat 8.0.16.  My understanding is that we should be able
 to reference static fields/methods directly from facelets, eg.

   Boolean.TRUE test: [h:outputText id=out2
   value=#{Boolean.TRUE}/]

 should return Boolean.TRUE test: [true].  This isn't the case, however;
 no value is returned, and nothing's logged.  Additionally, when I try to
 access a static field on a local ManagedBean, I get

   ...
   javax.el.PropertyNotFoundException: Property 'staticReference' not
   found on type beans.EL30StaticFieldsAndMethodsBean
  at javax.el.BeanELResolver$BeanProperties.get
  (BeanELResolver.java:244)
  at javax.el.BeanELResolver$BeanProperties.access$300
  (BeanELResolver.java:221)
  at javax.el.BeanELResolver.property(BeanELResolver.java:331)
  at javax.el.BeanELResolver.getValue(BeanELResolver.java:95)
  at javax.el.CompositeELResolver.getValue
  (CompositeELResolver.java:66)
  at
  
 org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue
 (FacesCompositeELResolver.java:179)
  ... 1 more

 Where the ManagedBean is defined simply as

   package beans;
   import javax.faces.bean.ApplicationScoped;
   import javax.faces.bean.ManagedBean;

   @ManagedBean(name = staticbean)
   @ApplicationScoped
   public class EL30StaticFieldsAndMethodsBean {
  ...
   public static final String staticReference = static reference;
  ...
   }

 Has anyone else tried working with these kinds of EL 3.0 features?  Or am I
 possibly just missing something here?

 Thanks,
 Bill Lucy