On 3/3/07, Mathias Brökelmann <[EMAIL PROTECTED]> wrote:
No code in myfaces (or any other apache project) is owned by someone. That is important for a healthy and moving community. Bernds submission was a little bit fast but sometimes a complex issue is better understand if we can look at the code - no matter if that is the solution we finally have.
I hope you did not get the idea that this was about territory here. How about this solution:
We define a myfaces specific interface of an AnnotationProcessor/InjectionProvider which will be used throughout the code in myfaces. The initialization code lookups an implementation for that interface. If there is nothing found (through context param, META-INF/service, etc.) we implement some fallback strategies to either looking for a InjectionProvider implementation for suns RI or if that also fails we try to lookup container specific implementations like tomcats AnnotationProcessor implementation. If all fails we supply a default implementation which only handles @PostConstruct and @PreDestroy annotations - I don't think that it is possible to inject any resource w/o knowing how to lookup these.
This sounds very similar to what Ryan just talked about in his blog. Bernd, if are happy w/ this and still interested, feel free to go forward with this. If you still want to, I ask that the default implementation uses the annotation name, rather than the annotation. This gives Tomcat 5.5/Facelets users fewer headaches. Do either of you have a problem w/ the context listener doing a classpath search for well known injection providers? I meet a lot of devs who find JSF too configuration heavy. Bernd if you don't get around to doing this, I will just end up doing it sometime next week. 2007/3/3, Bernd Bohmann <[EMAIL PROTECTED]>:
> Sorry, > I ask you if it's ok to add the code. > I get no answer then I asume it's ok to add my idea. > > It's only a different possible implementation. > If you don't like it you can remove it. > Is anything wrong with the code? > > Bernd > > > > Dennis Byrne wrote: > > Mathias, me and Paul were discussing the future of this feature. For the > > most part we were in agreement. I appreciate your input, but it did not > > gain traction w/ anyone. You then went ahead and committed a bunch of > > code. > > > > > > IMO, you have not been a good team member today Bernd. Please assign the > > issue to yourself. > > > > Thank you very much for your interest in getting us closer to a > > 1.2implementation. > > > > Dennis Byrne > > > > On 3/3/07, Bernd Bohmann <[EMAIL PROTECTED]> wrote: > >> > >> ??? Yes, I know it. > >> > >> Dennis Byrne wrote: > >> > Are you under the impression that our 1.2 branch didn't already handle > >> > @PostConstruct and @PreDestroy? Looks like the left hand doesn't know > >> what > >> > the right hand is doing here. > >> > > >> > Dennis Byrne > >> > > >> > On 3/3/07, Bernd Bohmann <[EMAIL PROTECTED]> wrote: > >> >> > >> >> Just added an implementation of the annotation handling based on the > >> >> tomcat implementation. > >> >> > >> >> Bernd > >> >> > >> >> Dennis Byrne wrote: > >> >> > I added a comment > >> >> > > >> >> > >> http://blogs.sun.com/rlubke/entry/jsf_ri_1_2_and#comment-1172947192023. > >> >> > > >> >> > Two more ideas. Ryan mentions applications using facelets, jsf > >> 1.2and > >> >> > servlet 2.4. Unless I'm missing something, there's one reason to > >> use > >> >> > annotation.getName().equals("javax.annotation.PostConstruct") rather > >> >> than > >> >> > annotation.class == PostConstruct.class. Also, the tomcat guys are > >> >> > processing annotations even when the method is marked private. > >> >> > > >> >> > Dennis Byrne > >> >> > > >> >> > On 3/3/07, Paul McMahan <[EMAIL PROTECTED]> wrote: > >> >> >> > >> >> >> OK, I think the RI also recently added the META-INF/services > >> >> >> technique. But I don't know how reliable this sun blog entry is: > >> >> >> http://tinyurl.com/yrrjs2 > >> >> >> > >> >> >> Best wishes, > >> >> >> Paul > >> >> >> > >> >> >> On 3/2/07, Mathias Brökelmann <[EMAIL PROTECTED]> wrote: > >> >> >> > The RI uses two ways to lookup the implementation of the vendor > >> >> >> > specific implementation of the InjectionProvider. They first try > >> to > >> >> >> > use a web context init param and if that is not configured they > >> >> simply > >> >> >> > use a system property. Both keyed by the class name of the > >> >> >> > InjectionProvider interface. > >> >> >> > > >> >> >> > 2007/3/2, Paul McMahan <[EMAIL PROTECTED]>: > >> >> >> > > I think Mathias' suggestion is right on. I haven't looked at > >> the > >> >> RI > >> >> >> > > code but I read somewhere that it passes the name of > >> >> >> > > InjectionProviders via entries in META-INF/services. If > >> MyFaces > >> >> used > >> >> >> > > a similar approach I think it should work OK for Geronimo and > >> just > >> >> >> > > about any other container that supports injection, And it > >> should > >> >> >> also > >> >> >> > > make MyFaces more interchangeable with the RI. > >> >> >> > > > >> >> >> > > Best wishes, > >> >> >> > > Paul > >> >> >> > > > >> >> >> > > On 3/2/07, Dennis Byrne <[EMAIL PROTECTED]> wrote: > >> >> >> > > > Similar to what Mathias mentioned? > >> >> >> > > > > >> >> >> > > > > >> >> http://issues.apache.org/jira/browse/MYFACES-1246#action_12475337 > >> >> >> > > > > >> >> >> > > > It's not much work (on our side) but it sounds pretty vendor > >> >> >> specific. > >> >> >> > > > Again, I don't have a better solution. Mathias writes "which > >> is > >> >> >> implemented > >> >> >> > > > by j2ee containers". I wonder if each container will end up > >> >> >> looking > >> >> >> for > >> >> >> > > > different interfaces. How would MyFaces find Geronimo's > >> >> >> implementation ? A > >> >> >> > > > context parameter? A for loop like this ... > >> >> >> > > > > >> >> >> > > > String[] providers = new > >> >> String[]{"org,apache.geronimo.DIProvider > >> >> ", > >> >> >> > > > "com.bea.DIProvider", "org.jboss.DIProvider"} > >> >> >> > > > > >> >> >> > > > for(String clazz : providers){ > >> >> >> > > > try{ > >> >> >> > > > return ClassUtils.load (clazz) > >> >> >> > > > }catch(){} > >> >> >> > > > } > >> >> >> > > > > >> >> >> > > > Dennis Byrne > >> >> >> > > > > >> >> >> > > > > >> >> >> > > > On 3/1/07, Paul McMahan <[EMAIL PROTECTED]> wrote: > >> >> >> > > > > OK, I think your interpretation of the spec makes sense and > >> >> >> there's > >> >> >> > > > > one particular aspect we should discuss a little further. > >> >> >> > > > > > >> >> >> > > > > The container doesn't know which classes are managed beans > >> so > >> >> it > >> >> >> > > > > wouldn't know when to intercept the instantiation > >> process to > >> >> >> perform > >> >> >> > > > > injection. What would you all think about MyFaces > >> >> providing an > >> >> >> > > > > interface that containers could implement to perform > >> injection > >> >> on > >> >> >> a > >> >> >> > > > > managed bean when MyFaces brings that bean into > >> service? This > >> >> >> would > >> >> >> > > > > allow MyFaces to maintain control of the timing while > >> allowing > >> >> >> the > >> >> >> > > > > container to scan for annotations and handle injection when > >> >> >> prompted > >> >> >> > > > > to do so. > >> >> >> > > > > > >> >> >> > > > > Best wishes, > >> >> >> > > > > Paul > >> >> >> > > > > > >> >> >> > > > > > >> >> >> > > > > On 2/26/07, Dennis Byrne <[EMAIL PROTECTED]> wrote: > >> >> >> > > > > > I know the specs can be vague sometimes, but I don't > >> >> interpret > >> >> >> the first > >> >> >> > > > > > paragraph of section 5.4 as meaning the JSF > >> >> implementation is > >> >> >> > > > responsible > >> >> >> > > > > > for @EJB, @Resources, etc. The JSF spec specifically > >> >> mentions > >> >> >> "the > >> >> >> > > > > > container to inject references". If Geronimo can > >> intercept > >> >> the > >> >> >> > > > > > instantiation of these classes in the classloader > >> (something > >> >> I > >> >> >> know > >> >> >> > > > nothing > >> >> >> > > > > > about right now), I think we are all good here. Wouldn't > >> >> >> MyFaces then > >> >> >> > > > be > >> >> >> > > > > > observing the requirements (in plain java) around > >> >> >> @PostConstruct > >> >> >> after > >> >> >> > > > > > Geronimo had injected the resources? > >> >> >> > > > > > > >> >> >> > > > > > I think the JSF impl is only responsible for > >> @PostConstruct > >> >> and > >> >> >> > > > @Predestroy. > >> >> >> > > > > > This makes sense because scoped (request, session, > >> >> >> application) > >> >> >> are the > >> >> >> > > > > > only candidates for this, and it would be more awkward to > >> do > >> >> >> that from > >> >> >> > > > the > >> >> >> > > > > > container. I say all of this in an open manner, so anyone > >> >> feel > >> >> >> free to > >> >> >> > > > > > discuss. > >> >> >> > > > > > > >> >> >> > > > > > You're point about javax.annotation being in the Servlet > >> >> 2.5is > >> >> >> taken. > >> >> >> > > > I > >> >> >> > > > > > totally missed that. > >> >> >> > > > > > > >> >> >> > > > > > > >> >> >> > > > > > Dennis Byrne > >> >> >> > > > > > > >> >> >> > > > > > On 2/26/07, Paul McMahan <[EMAIL PROTECTED]> wrote: > >> >> >> > > > > > > Actually by "dependency injection" I'm specifically > >> >> referring > >> >> >> to the > >> >> >> > > > > > > portion of the JSF spec that discusses injecting > >> resources > >> >> >> where > >> >> >> > > > > > > certain annotations are found in a managed bean. So, > >> >> while > >> >> >> scanning > >> >> >> > > > > > > for the @PreConstruct and @PostDestroy annotations > >> MyFaces > >> >> >> would also > >> >> >> > > > > > > scan for @EJB, @Resource, @WebServiceRef, etc and then > >> >> time > >> >> >> the > >> >> >> > > > > > > invocation of @PreConstruct and @PostDestroy to support > >> >> the > >> >> >> injection. > >> >> >> > > > > > > > >> >> >> > > > > > > Tomcat provides an example of how this can be done. > >> The > >> >> >> following > >> >> >> > > > > > > class scans for annotations when a web app starts: > >> >> >> > > > > > > > >> >> >> > > > > > > >> >> >> > > > > >> >> >> > >> >> > >> http://svn.apache.org/repos/asf/tomcat/tc6.0.x/trunk/java/org/apache/catalina/startup/WebAnnotationSet.java > >> > >> >> > >> >> >> > >> >> >> > > > > > > > >> >> >> > > > > > > And then this class handles the injection and calling > >> the > >> >> >> > > > > > > PostConstruct and PreDestroy methods when an servlet, > >> >> filter, > >> >> >> or > >> >> >> > > > > > > listener is brought into service: > >> >> >> > > > > > > > >> >> >> > > > > > > >> >> >> > > > > >> >> >> > >> >> > >> http://svn.apache.org/repos/asf/tomcat/tc6.0.x/trunk/java/org/apache/catalina/util/DefaultAnnotationProcessor.java > >> > >> >> > >> >> >> > >> >> >> > > > > > > > >> >> >> > > > > > > Would it make sense for MyFaces to follow a similar > >> >> approach > >> >> >> for > >> >> >> > > > > > > managed beans? Also, I'm curious why you're hoping to > >> >> avoid > >> >> >> importing > >> >> >> > > > > > > classes from javax.annotation classes since servlet > >> >> >> 2.5containers are > >> >> >> > > > > > > required to support them. Is this so that MyFaces > >> 1.2can > >> >> >> support > >> >> >> > > > > > > servlet 2.4 containers? > >> >> >> > > > > > > > >> >> >> > > > > > > Best wishes, > >> >> >> > > > > > > Paul > >> >> >> > > > > > > > >> >> >> > > > > > > On 2/26/07, Dennis Byrne <[EMAIL PROTECTED]> wrote: > >> >> >> > > > > > > > I ended up going with Servlet/Request/Context > >> attribute > >> >> >> listeners > >> >> >> > > > for > >> >> >> > > > > > > > @PreDestroy. This did not involve importing > >> >> >> > > > > > javax.annotation.PreDestroy, so > >> >> >> > > > > > > > people w/out application servers don't have to worry > >> >> about > >> >> >> > > > > > > > ClassDefNotFoundErrors. This also keeps us > >> compatible > >> >> with > >> >> >> the > >> >> >> > > > > > reference > >> >> >> > > > > > > > implementation in terms of timing, although I really > >> >> wish > >> >> >> they'd > >> >> >> > > > change > >> >> >> > > > > > the > >> >> >> > > > > > > > wording in the spec. > >> >> >> > > > > > > > > >> >> >> > > > > > > > Dennis Byrne > >> >> >> > > > > > > > > >> >> >> > > > > > > > > >> >> >> > > > > > > > On 2/26/07, Paul McMahan <[EMAIL PROTECTED]> > >> wrote: > >> >> >> > > > > > > > > Sorry if I'm behind on this discussion but what are > >> >> the > >> >> >> current > >> >> >> > > > > > > > > thoughts on how dependency injection will be > >> >> implemented > >> >> >> for > >> >> >> > > > managed > >> >> >> > > > > > > > > beans? The reason I'm curious is because > >> PreDestroy > >> >> and > >> >> >> > > > PostConstruct > >> >> >> > > > > > > > > annotations are used to deal with injected > >> resources, > >> >> so > >> >> >> from a > >> >> >> > > > timing > >> >> >> > > > > > > > > perspective it would be important to process all > >> these > >> >> >> annotations > >> >> >> > > > > > > > > accordingly. > >> >> >> > > > > > > > > > >> >> >> > > > > > > > > Best wishes, > >> >> >> > > > > > > > > Paul > >> >> >> > > > > > > > > > >> >> >> > > > > > > > > On 2/24/07, Dennis Byrne < [EMAIL PROTECTED]> > >> wrote: > >> >> >> > > > > > > > > > I'm weighing options about invoking @PreDestroy > >> >> methods > >> >> >> > > > > > (@PostConstruct > >> >> >> > > > > > > > is > >> >> >> > > > > > > > > > done BTW). I haven't made up my mind yet but > >> here's > >> >> >> where I'm > >> >> >> > > > at on > >> >> >> > > > > > > > this. > >> >> >> > > > > > > > > > > >> >> >> > > > > > > > > > As far as *when* this happens, the request is > >> easy, > >> >> in > >> >> >> > > > > > > > > > FacesServelet.service(). Session and app scope > >> are > >> >> more > >> >> >> > > > difficult > >> >> >> > > > > > > > decisions. > >> >> >> > > > > > > > > > A new > >> >> >> > > > > > HttpSessionActivationListener.attributeRemoved > >> >> >> > > > > > > > and a > >> >> >> > > > > > > > > > new > >> >> >> > > > > > ServletContextAttributeListener.attributeRemoved () > >> >> >> > > > > > > > seem > >> >> >> > > > > > > > > > like nice solutions, but this doesn't meet the > >> spec > >> >> >> requirements > >> >> >> > > > for > >> >> >> > > > > > > > 5.4.1. > >> >> >> > > > > > > > > > The methods have to be invoked *before* the bean > >> is > >> >> >> pulled from > >> >> >> > > > > > scope > >> >> >> > > > > > > > and > >> >> >> > > > > > > > > > the servlet API does not provide a > >> >> >> > > > > > > > > > > >> >> >> > > > > > > > > >> >> >> > > > > > > >> >> >> > > > ServletContextAttributeListener.attribute_WILL_BE_Removed () > >> >> >> > > > > > > > > > or a > >> >> >> > > > > > > > > > > >> >> >> > > > > > HttpSessionActivationListener.attribute_WILL_BE_Removed > >> >> >> > > > > > > > (). > >> >> >> > > > > > > > > > Also, I say *new* > >> ServletContextAttributeListener > >> >> and > >> >> >> because > >> >> >> > > > > > > > > > StartupServletContextListener (already in code > >> base) > >> >> >> implements > >> >> >> > > > > > > > > > ServletContextListener, not > >> >> >> > > > > > > > > > ServletContextAttributeListener. > >> >> >> > > > > > > > > > > >> >> >> > > > > > > > > > The other side of the problem is *how* to invoke > >> >> each > >> >> >> > > > @PreDestroy > >> >> >> > > > > > > > method, > >> >> >> > > > > > > > > > much easier. Iterating over the attributes at > >> each > >> >> >> scope level > >> >> >> > > > is > >> >> >> > > > > > > > trivial, > >> >> >> > > > > > > > > > and so is determining if the bean's class is a > >> >> managed > >> >> >> bean > >> >> >> > > > class. > >> >> >> > > > > > But > >> >> >> > > > > > > > this > >> >> >> > > > > > > > > > does not mean the *instance* was placed there by > >> the > >> >> >> JSF > >> >> >> > > > > > implementation. > >> >> >> > > > > > > > > > Using a list (at each level of scope) to track > >> >> managed > >> >> >> instances > >> >> >> > > > > > solves > >> >> >> > > > > > > > the > >> >> >> > > > > > > > > > problem, as long as you sync on the session (only > >> >> one > >> >> >> time per > >> >> >> > > > > > session) > >> >> >> > > > > > > > in > >> >> >> > > > > > > > > > order to avoid concurrency issues; it also means > >> >> three > >> >> >> more data > >> >> >> > > > > > > > structures > >> >> >> > > > > > > > > > in memory. > >> >> >> > > > > > > > > > > >> >> >> > > > > > > > > > -- > >> >> >> > > > > > > > > > Dennis Byrne > >> >> >> > > > > > > > > > >> >> >> > > > > > > > > >> >> >> > > > > > > > > >> >> >> > > > > > > > > >> >> >> > > > > > > > -- > >> >> >> > > > > > > > Dennis Byrne > >> >> >> > > > > > > > >> >> >> > > > > > > >> >> >> > > > > > > >> >> >> > > > > > > >> >> >> > > > > > -- > >> >> >> > > > > > Dennis Byrne > >> >> >> > > > > > >> >> >> > > > > >> >> >> > > > > >> >> >> > > > > >> >> >> > > > -- > >> >> >> > > > Dennis Byrne > >> >> >> > > > >> >> >> > > >> >> >> > > >> >> >> > -- > >> >> >> > Mathias > >> >> >> > > >> >> >> > >> >> > > >> >> > > >> >> > > >> >> > >> > > >> > > >> > > >> > > > > > > > -- Mathias
-- Dennis Byrne