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 >
