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.2 and > 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.2 can >> 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 >> > >> > > >
-- Dennis Byrne