btw, props also goes out to Martin Marinschek and Jakob Korherr. They helped me yesterday evening to implement the JSF eventing stuff while having a beer together ;)
LieGrue, strub --- On Tue, 1/12/10, Mark Struberg <[email protected]> wrote: > From: Mark Struberg <[email protected]> > Subject: Re: svn commit: r898454 - in > /openwebbeans/trunk/webbeans-jsf/src/main: java/org/apache/webbeans/jsf/ > java/org/apache/webbeans/jsf/plugin/ java/org/apache/webbeans/jsf/scopes/ > java/org/apache/webbeans/util/ resources/META-INF/services/ > To: [email protected] > Date: Tuesday, January 12, 2010, 7:31 PM > nice! looking forward to get feedback > or bug reports ;) > > LieGrue, > strub > > --- On Tue, 1/12/10, Matthias Wessendorf <[email protected]> > wrote: > > > From: Matthias Wessendorf <[email protected]> > > Subject: Re: svn commit: r898454 - in > /openwebbeans/trunk/webbeans-jsf/src/main: > java/org/apache/webbeans/jsf/ > java/org/apache/webbeans/jsf/plugin/ > java/org/apache/webbeans/jsf/scopes/ > java/org/apache/webbeans/util/ > resources/META-INF/services/ > > To: [email protected] > > Cc: [email protected] > > Date: Tuesday, January 12, 2010, 7:29 PM > > great. > > > > will check out now; ...and demonstrate that next week, > on > > my JSF 2 talk :-) > > > > On Tue, Jan 12, 2010 at 7:20 PM, <[email protected]> > > wrote: > > > Author: struberg > > > Date: Tue Jan 12 18:20:42 2010 > > > New Revision: 898454 > > > > > > URL: http://svn.apache.org/viewvc?rev=898454&view=rev > > > Log: > > > OWB-229 support for the new JSF-2 > > javax.faces.bean.ViewScoped annotation > > > > > > TODO: this should get moved to an own jsf-2 > module > > because this currently breaks JSF-1 compatibility! > > > > > > Added: > > > > > > openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/scopes/ > > > > > > openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/scopes/Jsf2ScopesExtension.java > > (with props) > > > > > > openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/scopes/ViewScopedContext.java > > (with props) > > > > > > openwebbeans/trunk/webbeans-jsf/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension > > > Modified: > > > > > > openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/WebBeansPhaseListener.java > > > > > > openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/plugin/OpenWebBeansJsfPlugin.java > > > > > > openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/util/JSFUtil.java > > > > > > Modified: > > > openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/WebBeansPhaseListener.java > > > URL: > > > http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/WebBeansPhaseListener.java?rev=898454&r1=898453&r2=898454&view=diff > > > > > > ============================================================================== > > > --- > > > openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/WebBeansPhaseListener.java > > (original) > > > +++ > > > openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/WebBeansPhaseListener.java > > Tue Jan 12 18:20:42 2010 > > > @@ -34,6 +34,8 @@ > > > */ > > > public class WebBeansPhaseListener implements > > PhaseListener > > > { > > > + private static final long serialVersionUID > = > > 1L; > > > + > > > /**Logger instance*/ > > > private static final WebBeansLogger logger > = > > > WebBeansLogger.getLogger(WebBeansPhaseListener.class); > > > > > > > > > Modified: > > > openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/plugin/OpenWebBeansJsfPlugin.java > > > URL: > > > http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/plugin/OpenWebBeansJsfPlugin.java?rev=898454&r1=898453&r2=898454&view=diff > > > > > > ============================================================================== > > > --- > > > openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/plugin/OpenWebBeansJsfPlugin.java > > (original) > > > +++ > > > openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/plugin/OpenWebBeansJsfPlugin.java > > Tue Jan 12 18:20:42 2010 > > > @@ -28,7 +28,7 @@ > > > /** {...@inheritdoc} */ > > > public void startUp() throws > > WebBeansConfigurationException > > > { > > > - // nothing to do > > > + // nothing to do > > > } > > > > > > /** {...@inheritdoc} */ > > > > > > Added: > > > openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/scopes/Jsf2ScopesExtension.java > > > URL: > > > http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/scopes/Jsf2ScopesExtension.java?rev=898454&view=auto > > > > > > ============================================================================== > > > --- > > > openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/scopes/Jsf2ScopesExtension.java > > (added) > > > +++ > > > openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/scopes/Jsf2ScopesExtension.java > > Tue Jan 12 18:20:42 2010 > > > @@ -0,0 +1,43 @@ > > > +/* > > > + * Licensed to the Apache Software Foundation > (ASF) > > under one > > > + * or more contributor license agreements. See > the > > NOTICE file > > > + * distributed with this work for additional > > information > > > + * regarding copyright ownership. The ASF > licenses > > this file > > > + * to you under the Apache License, Version 2.0 > (the > > > + * "License"); you may not use this file except > in > > compliance > > > + * with the License. You may obtain a copy of > the > > License at > > > + * > > > + * http://www.apache.org/licenses/LICENSE-2.0 > > > + * > > > + * Unless required by applicable law or agreed > to in > > writing, > > > + * software distributed under the License is > > distributed on an > > > + * "AS IS" BASIS, WITHOUT WARRANTIES OR > CONDITIONS OF > > ANY > > > + * KIND, either express or implied. See the > License > > for the > > > + * specific language governing permissions and > > limitations > > > + * under the License. > > > + */ > > > +package org.apache.webbeans.jsf.scopes; > > > + > > > +import javax.enterprise.event.Observes; > > > +import > > javax.enterprise.inject.spi.AfterBeanDiscovery; > > > +import > > javax.enterprise.inject.spi.BeforeBeanDiscovery; > > > +import javax.enterprise.inject.spi.Extension; > > > +import javax.faces.bean.ViewScoped; > > > + > > > +/** > > > + * This small extension adds support for various > JSF > > 2 scopes > > > + * TODO: this should be moved to an own module > > because this will > > > + * currently hinder webbeans-jsf to run in a > JSF-1 > > application! > > > + */ > > > +public class Jsf2ScopesExtension implements > Extension > > { > > > + > > > + public void addViewScoped(@Observes > > BeforeBeanDiscovery beforeBeanDiscovery) > > > + { > > > + > > beforeBeanDiscovery.addScope(ViewScoped.class, > true, > > true); > > > + } > > > + > > > + public void registerViewContext(@Observes > > AfterBeanDiscovery afterBeanDiscovery) > > > + { > > > + afterBeanDiscovery.addContext(new > > ViewScopedContext()); > > > + } > > > +} > > > \ No newline at end of file > > > > > > Propchange: > > > openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/scopes/Jsf2ScopesExtension.java > > > > > > ------------------------------------------------------------------------------ > > > svn:eol-style = native > > > > > > Propchange: > > > openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/scopes/Jsf2ScopesExtension.java > > > > > > ------------------------------------------------------------------------------ > > > svn:keywords = Author Date Id Revision > > > > > > Added: > > > openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/scopes/ViewScopedContext.java > > > URL: > > > http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/scopes/ViewScopedContext.java?rev=898454&view=auto > > > > > > ============================================================================== > > > --- > > > openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/scopes/ViewScopedContext.java > > (added) > > > +++ > > > openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/scopes/ViewScopedContext.java > > Tue Jan 12 18:20:42 2010 > > > @@ -0,0 +1,213 @@ > > > +/* > > > + * Licensed to the Apache Software Foundation > (ASF) > > under one > > > + * or more contributor license agreements. See > the > > NOTICE file > > > + * distributed with this work for additional > > information > > > + * regarding copyright ownership. The ASF > licenses > > this file > > > + * to you under the Apache License, Version 2.0 > (the > > > + * "License"); you may not use this file except > in > > compliance > > > + * with the License. You may obtain a copy of > the > > License at > > > + * > > > + * http://www.apache.org/licenses/LICENSE-2.0 > > > + * > > > + * Unless required by applicable law or agreed > to in > > writing, > > > + * software distributed under the License is > > distributed on an > > > + * "AS IS" BASIS, WITHOUT WARRANTIES OR > CONDITIONS OF > > ANY > > > + * KIND, either express or implied. See the > License > > for the > > > + * specific language governing permissions and > > limitations > > > + * under the License. > > > + */ > > > +package org.apache.webbeans.jsf.scopes; > > > + > > > +import java.lang.annotation.Annotation; > > > +import java.util.Map; > > > +import java.util.Map.Entry; > > > +import java.util.concurrent.ConcurrentHashMap; > > > + > > > +import > > javax.enterprise.context.ContextNotActiveException; > > > +import javax.enterprise.context.spi.Context; > > > +import javax.enterprise.context.spi.Contextual; > > > +import > > javax.enterprise.context.spi.CreationalContext; > > > + > > > +import javax.faces.bean.ViewScoped; > > > +import javax.faces.component.UIViewRoot; > > > +import javax.faces.context.FacesContext; > > > +import > javax.faces.event.PreDestroyViewMapEvent; > > > +import javax.faces.event.SystemEvent; > > > +import javax.faces.event.SystemEventListener; > > > + > > > +import org.apache.webbeans.util.JSFUtil; > > > + > > > +/** > > > + * This class provides the contexts lifecycle > for > > the > > > + * new JSF-2 @ViewScoped Context > > > + * > > > + */ > > > +public class ViewScopedContext implements > Context, > > SystemEventListener > > > +{ > > > + > > > + private final static String > COMPONENT_MAP_NAME > > ="openwebbeans.componentInstanceMap"; > > > + private final static String > CREATIONAL_MAP_NAME > > ="openwebbeans.creationalInstanceMap"; > > > + > > > + private boolean isJsfSubscribed = false; > > > + > > > + �...@override > > > + public <T> T > get(Contextual<T> > > component) > > > + { > > > + checkActive(); > > > + > > > + if(!isJsfSubscribed) > > > + { > > > + > > > FacesContext.getCurrentInstance().getApplication().subscribeToEvent(PreDestroyViewMapEvent.class, > > this); > > > + > > > + isJsfSubscribed = true; > > > + } > > > + > > > + Map<String, Object> viewMap = > > JSFUtil.getViewRoot().getViewMap(); > > > + > > > + �...@suppresswarnings("unchecked") > > > + > ConcurrentHashMap<Contextual<?>, > > Object> componentInstanceMap = > > (ConcurrentHashMap<Contextual<?>, > Object>) > > viewMap.get(COMPONENT_MAP_NAME); > > > + > > > + if(componentInstanceMap == null) { > > > + return null; > > > + } > > > + > > > + �...@suppresswarnings("unchecked") > > > + T instance = (T) > > componentInstanceMap.get(component); > > > + > > > + return instance; > > > + } > > > + > > > + �...@override > > > + public <T> T > get(Contextual<T> > > component, CreationalContext<T> > creationalContext) > > > + { > > > + checkActive(); > > > + > > > + Map<String, Object> viewMap = > > JSFUtil.getViewRoot().getViewMap(true); > > > + > > > + �...@suppresswarnings("unchecked") > > > + > ConcurrentHashMap<Contextual<?>, > > Object> componentInstanceMap = > > (ConcurrentHashMap<Contextual<?>, > Object>) > > viewMap.get(COMPONENT_MAP_NAME); > > > + > > > + if(componentInstanceMap == null) > > > + { > > > + // TODO we now need to start > being > > carefull with reentrancy... > > > + componentInstanceMap = new > > ConcurrentHashMap<Contextual<?>, > Object>(); > > > + > viewMap.put(COMPONENT_MAP_NAME, > > componentInstanceMap); > > > + } > > > + > > > + �...@suppresswarnings("unchecked") > > > + > ConcurrentHashMap<Contextual<?>, > > CreationalContext<?>> creationalContextMap = > > (ConcurrentHashMap<Contextual<?>, > > CreationalContext<?>>) > > viewMap.get(CREATIONAL_MAP_NAME); > > > + if(creationalContextMap == null) > > > + { > > > + // TODO we now need to start > being > > carefull with reentrancy... > > > + creationalContextMap = new > > ConcurrentHashMap<Contextual<?>, > > CreationalContext<?>>(); > > > + > viewMap.put(CREATIONAL_MAP_NAME, > > creationalContextMap); > > > + } > > > + > > > + �...@suppresswarnings("unchecked") > > > + T instance = (T) > > componentInstanceMap.get(component); > > > + if (instance != null) > > > + { > > > + return instance; > > > + } > > > + else > > > + { > > > + if(creationalContext == null) > > > + { > > > + return null; > > > + } > > > + else > > > + { > > > + synchronized > > (componentInstanceMap) > > > + { > > > + // just to make > > sure... > > > + > > �...@suppresswarnings("unchecked") > > > + T i = > > (T)componentInstanceMap.get(component); > > > + if (i != null) > > > + { > > > + return i; > > > + } > > > + > > > + instance = > > component.create(creationalContext); > > > + > > > + if (instance != > null) > > > + { > > > + > > componentInstanceMap.put(component, instance); > > > + > > creationalContextMap.put(component, > creationalContext); > > > + } > > > + } > > > + } > > > + } > > > + > > > + return instance; > > > + } > > > + > > > + �...@override > > > + public Class<? extends Annotation> > > getScope() > > > + { > > > + return ViewScoped.class; > > > + } > > > + > > > + /** > > > + * The view context is active if a valid > > ViewRoot could be detected. > > > + */ > > > + �...@override > > > + public boolean isActive() > > > + { > > > + return JSFUtil.getViewRoot() != > null; > > > + } > > > + > > > + private void checkActive() > > > + { > > > + if (!isActive()) > > > + { > > > + throw new > > ContextNotActiveException("WebBeans context with > scope > > annotation @ViewScoped is not active with respect to > the > > current thread"); > > > + } > > > + } > > > + > > > + �...@override > > > + public boolean isListenerForSource(Object > > source) { > > > + if (source instanceof UIViewRoot) > > > + { > > > + return true; > > > + } > > > + > > > + return false; > > > + } > > > + > > > + /** > > > + * We get PreDestroyViewMapEvent events > from > > the JSF servlet and destroy our contextual > > > + * instances. This should (theoretically!) > also > > get fired if the webapp closes, so there > > > + * should be no need to manually track all > view > > scopes and destroy them at a shutdown. > > > + * > > > + * @see > > > javax.faces.event.SystemEventListener#processEvent(javax.faces.event.SystemEvent) > > > + */ > > > + �...@override > > > + �...@suppresswarnings("unchecked") > > > + public void processEvent(SystemEvent > event) { > > > + if (event instanceof > > PreDestroyViewMapEvent) > > > + { > > > + // better use the viewmap we > get > > from the event to prevent concurrent modification > problems > > > + Map<String, Object> > viewMap = > > ((UIViewRoot) event.getSource()).getViewMap(); > > > + > > > + > > ConcurrentHashMap<Contextual<?>, > Object> > > componentInstanceMap > > > + = > > (ConcurrentHashMap<Contextual<?>, > Object>) > > viewMap.get(COMPONENT_MAP_NAME); > > > + > > > + > > ConcurrentHashMap<Contextual<?>, > > CreationalContext<?>> creationalContextMap > > > + = > > (ConcurrentHashMap<Contextual<?>, > > CreationalContext<?>>) > > viewMap.get(CREATIONAL_MAP_NAME); > > > + > > > + if(componentInstanceMap != > null) { > > > + for ( > > Entry<Contextual<?>, Object> > componentEntry : > > componentInstanceMap.entrySet()) > > > + { > > > + // there is no > nice way > > to explain the Java Compiler that we are handling the > same > > type T, > > > + // therefore we > need > > completely drop the type information :( > > > + Contextual > contextual = > > componentEntry.getKey(); > > > + Object instance = > > componentEntry.getValue(); > > > + CreationalContext > > creational = creationalContextMap.get(contextual); > > > + > > > + > > contextual.destroy(instance, creational); > > > + } > > > + } > > > + } > > > + } > > > + > > > +} > > > > > > Propchange: > > > openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/scopes/ViewScopedContext.java > > > > > > ------------------------------------------------------------------------------ > > > svn:eol-style = native > > > > > > Propchange: > > > openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/scopes/ViewScopedContext.java > > > > > > ------------------------------------------------------------------------------ > > > svn:keywords = Author Date Id Revision > > > > > > Modified: > > > openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/util/JSFUtil.java > > > URL: > > > http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/util/JSFUtil.java?rev=898454&r1=898453&r2=898454&view=diff > > > > > > ============================================================================== > > > --- > > > openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/util/JSFUtil.java > > (original) > > > +++ > > > openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/util/JSFUtil.java > > Tue Jan 12 18:20:42 2010 > > > @@ -63,6 +63,9 @@ > > > return > > > getCurrentFacesContext().getRenderKit().getResponseStateManager().isPostback(getCurrentFacesContext()); > > > } > > > > > > + /** > > > + * @return the viewId of the viewRoot, > e.g. > > '/user/menu.xhtml' > > > + */ > > > public static String getViewId() > > > { > > > UIViewRoot viewRoot = > > getCurrentFacesContext().getViewRoot(); > > > > > > Added: > > > openwebbeans/trunk/webbeans-jsf/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension > > > URL: > > > http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-jsf/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension?rev=898454&view=auto > > > > > > ============================================================================== > > > --- > > > openwebbeans/trunk/webbeans-jsf/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension > > (added) > > > +++ > > > openwebbeans/trunk/webbeans-jsf/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension > > Tue Jan 12 18:20:42 2010 > > > @@ -0,0 +1,18 @@ > > > +#Licensed to the Apache Software Foundation > (ASF) > > under one > > > +#or more contributor license agreements. See > the > > NOTICE file > > > +#distributed with this work for additional > > information > > > +#regarding copyright ownership. The ASF > licenses > > this file > > > +#to you under the Apache License, Version 2.0 > (the > > > +#"License"); you may not use this file except > in > > compliance > > > +#with the License. You may obtain a copy of > the > > License at > > > +# > > > +# http://www.apache.org/licenses/LICENSE-2.0 > > > +# > > > +#Unless required by applicable law or agreed to > in > > writing, > > > +#software distributed under the License is > > distributed on an > > > +#"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS > OF > > ANY > > > +#KIND, either express or implied. See the > License > > for the > > > +#specific language governing permissions and > > limitations > > > +#under the License. > > > + > > > > +org.apache.webbeans.jsf.scopes.Jsf2ScopesExtension > > > \ No newline at end of file > > > > > > > > > > > > > > > > > -- > > Matthias Wessendorf > > > > blog: http://matthiaswessendorf.wordpress.com/ > > sessions: http://www.slideshare.net/mwessendorf > > twitter: http://twitter.com/mwessendorf > > > > > >
