I don't hold anything against you. Ultimately I feel like this is a lose-lose situation for MyFaces because where things stand now, you are likely to feel as though your efforts on that branch are not appreciated. They are.
Ryan has responded ... http://blogs.sun.com/rlubke/entry/jsf_ri_1_2_and#comment-1172947192000 Dennis Byrne On 3/3/07, Bernd Bohmann <[EMAIL PROTECTED]> wrote:
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 >> >> >> > >> >> >> >> >> > >> >> > >> >> > >> >> >> > >> > >> > >> > > >
-- Dennis Byrne