hi jakob, thx for the heads-up! yes - for sure we have to be careful. in such a case we keep e.g. a list of el-resolvers which aren't allowed to get mapped (or the other way round).
regards, gerhard http://www.irian.at Your JSF powerhouse - JSF Consulting, Development and Courses in English and German Professional Support for Apache MyFaces 2011/8/9 Jakob Korherr <jakob.korh...@gmail.com> > Hi, > > That's a good idea, however we need to be very careful with such > improvements. There are some cases in which you need different EL > resolvers for the "same" object. For example, JSF managed beans are > created by the ManagedBean EL resolver (very late in the chain), but > if they already exist, they are resolved by the respective scope EL > resolver (e.g. session EL resolver for @SessionScoped managed beans). > > Please keep that in mind! > > Regards, > Jakob > > 2011/8/8 Gerhard Petracek <gerhard.petra...@gmail.com>: > > hi martin, > > a smarter approach might be useful. e.g. after the first lookup of a > > root-bean myfaces-core could store the el-resolver which found the bean > in a > > mapping. > > before the resolver chain gets invoked, myfaces-core could do a lookup in > > the stored mapping and use the mapped el-resolver (if there is one). if > the > > el-resolver can't resolve the bean any more (or there is no mapped > > el-resolver), the whole chain would be invoked as usual. > > regards, > > gerhard > > > > http://www.irian.at > > > > Your JSF powerhouse - > > JSF Consulting, Development and > > Courses in English and German > > > > Professional Support for Apache MyFaces > > > > > > > > 2011/8/8 Martin Koci <martin.kocicak.k...@gmail.com> > >> > >> Gerhard Petracek píše v Po 08. 08. 2011 v 16:36 +0200: > >> > hi martin, > >> > > >> > > >> > i think most users will be fine with the > >> > OpenWebBeansELResolverComparator [1] > >> > >> yes, this comparator moves OWB resolver to the last posititon. Thas good > >> because most of the EL expression nodes are generally not cdi beans > >> names. Custom implicit object was only proposition how to specify that > >> following node in expression is CDI bean. > >> > >> > and a custom InterceptorHandler (btw. an add-on like the scope-boost > >> > for codi). > >> I'll take a look at it. > >> > >> > (esp. because an implicit variable would also break e.g. ide support.) > >> > > >> yes, that is a disadvantage. But generally IDEs must support something > >> like that, because custom scopes are possible in JSF 2.0 > >> > >> > however, if you have concrete numbers, we could start a vote about it. > >> > > >> > >> with 100 000 and more invocation of CompositeELResolver.getValue during > >> one render response is improvement noticeable, especially if every EL > >> expression is #{someCDIBean.someProperty} > >> > >> But I incorrectly mixed together two problems: > >> > >> 1) posibility of custom implicit objects for myfaces core, independent > >> from usage. > >> > >> 2) example of usage : CDI/CODI integration. > >> > >> > > >> > regards, > >> > gerhard > >> > > >> > > >> > [1] https://cwiki.apache.org/confluence/display/MYFACES/ELResolver > >> > +ordering > >> > > >> > http://www.irian.at > >> > > >> > Your JSF powerhouse - > >> > JSF Consulting, Development and > >> > Courses in English and German > >> > > >> > Professional Support for Apache MyFaces > >> > > >> > > >> > > >> > > >> > 2011/8/8 Martin Koci <martin.kocicak.k...@gmail.com> > >> > Hi, > >> > > >> > > >> > the OWB el-resolver itself is fast enough, thats not the > >> > problem. The > >> > problem is when you use CDI managed bean in big ELResolver > >> > chain. For > >> > example, consider this chain: > >> > > >> > ImplicitObjectResolver > >> > MapELResolver > >> > ResourceResolver > >> > CompositeComponentELResolver > >> > VariableResolverToELResolver > >> > PropertyResolverToELResolver > >> > FlashELResolver > >> > ManagedBeanResolver > >> > ResourceBundleELResolver > >> > ResourceBundleResolver > >> > ListELResolver > >> > ArrayListResolver > >> > org.apache.webbeans.el.WebBeansELResolver > >> > SkinPropertiesELResolver > >> > ResourceParametrELResolver > >> > javax.el.BeanELResolver > >> > > >> > then when resolving #{cdiScopeBean} EL impl must call first 12 > >> > resolvers > >> > and none of them sets elContext.setPropertyResolved(true) > >> > > >> > Old JSF style can shorten it with > >> > #{sessionScope.sessionScopedBean} for > >> > example and then resolving takes only first two resolvers > >> > because > >> > MapELResolver sets propertyResolved(true) > >> > > >> > so I'm looking for a solution how to minimize "void" usage of > >> > ELresolvers and how to say directly that "this is CDI bean and > >> > use CDI > >> > ELResolver for it" > >> > > >> > > >> > Gerhard Petracek píše v Po 08. 08. 2011 v 15:50 +0200: > >> > > >> > > hi martin, > >> > > > >> > > > >> > > the real overhead (after our recent improvements) is the > >> > overhead of > >> > > the proxy itself. > >> > > > >> > > > >> > > in owb we have a cache in the el-resolver as well as in > >> > > some implementations of InterceptorHandler. the upcoming > >> > version of > >> > > owb will allow to use such special caches also for custom > >> > scopes. > >> > > e.g. there is a scope-boost add-on [1] for codi. so you get > >> > contextual > >> > > instances which are cached in a thread-local and the add-on > >> > also has > >> > > to do the reset of the cache (as soon as it is needed - that > >> > depends > >> > > on the concrete scope). > >> > > > >> > > > >> > > since we already have two caches in place and the real > >> > overhead is in > >> > > the proxy implementation, i'm not sure if we really get more > >> > > performance with such a spi. > >> > > > >> > > > >> > > (mark also implemented a cache for methods which aren't > >> > intercepted. i > >> > > already tested it and depending on the constellation the > >> > increase in > >> > > performance is about 5%.) > >> > > > >> > > > >> > > regards, > >> > > gerhard > >> > > > >> > > > >> > > [1] > >> > > >> > > http://os890.blogspot.com/2011/08/benchmark-boost-myfaces-codi-scopes.html > >> > > > >> > > http://www.irian.at > >> > > > >> > > Your JSF powerhouse - > >> > > JSF Consulting, Development and > >> > > Courses in English and German > >> > > > >> > > Professional Support for Apache MyFaces > >> > > > >> > > > >> > > > >> > > > >> > > 2011/8/8 Martin Koci <martin.kocicak.k...@gmail.com> > >> > > Hi, > >> > > > >> > > if user uses plain old JSF style with managed beans > >> > like: > >> > > > >> > > #{sessionScope.mySessionScopedBean} or > >> > > #{requestScope.myRequestScopedBean} or > >> > > #{requestScope.varFromDataTable.property} > >> > > > >> > > it can achieve excellent performance during render > >> > response > >> > > phase, > >> > > because every EL resolution takes only two steps: > >> > > > >> > > 1) o.a.m.ImplicitObjectResolver resolves > >> > sessionScope or > >> > > requestScope to > >> > > java.util.Map > >> > > 2) javax.el.MapELResolver reads > >> > map.get("mySessionScopedBean") > >> > > and sets > >> > > elContext.setPropertyResolved > >> > > > >> > > (at first access ManagedBeanResolver must create > >> > bean instance > >> > > but we > >> > > can ignore it for simplicity). > >> > > > >> > > Specially if user uses EL resolvers ordering [1] > >> > and creates > >> > > chain of > >> > > (ImlicitObjectResolver,MapELResolver, other > >> > resolvers) then > >> > > resolving > >> > > takes only two first resolvers. > >> > > > >> > > > >> > > Now compare it with situation where CDI is used. > >> > Because > >> > > CDI/OWB > >> > > resolver is not so fast as default el resolvers, > >> > common usage > >> > > is put it > >> > > at bottom of resolvers chain with > >> > > OpenWebBeansELResolverComparator. Then > >> > > resolving must go thru all ELresolvers in chain (12 > >> > or more > >> > > resolvers) > >> > > to find a @Named bean. > >> > > > >> > > > >> > > How to improve this? One thing can be use custom > >> > implicit > >> > > object for > >> > > this > >> > > 1) create ImplicitObjectsProvider SPI interface in > >> > myfaces > >> > > 2) CDI and CDI extension will add own implementation > >> > of > >> > > myfaces > >> > > ImlicitObject, for example #{codiWindowScope} from > >> > CODI > >> > > 3) the resolved value from implicit object can mimic > >> > the map > >> > > interfaces > >> > > (for example WindowScopeMap) to preserve behaviour > >> > of servlet > >> > > scopes and > >> > > to use MapELResolver > >> > > > >> > > WDYT? Any other ideas? > >> > > > >> > > > >> > > Regards, > >> > > > >> > > Kočičák > >> > > > >> > > [1] > >> > https://cwiki.apache.org/MYFACES/elresolver-ordering.html > >> > > > >> > > > >> > > > >> > > >> > > >> > > >> > > >> > > >> > >> > > > > > > > > -- > Jakob Korherr > > blog: http://www.jakobk.com > twitter: http://twitter.com/jakobkorherr > work: http://www.irian.at >