Are any of these class names or context params start w/ javax.faces ? If so, we can move the conversation back into the issue tracker and I'll close the @PostConstruct issue once Paul says it's good to go. I don't see the point of the system property though.
Dennis Byrne 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.5 is 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