soon... some meetings now... :-) On Tue, Jan 12, 2010 at 7:31 PM, Mark Struberg <[email protected]> wrote: > 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 >> > > > >
-- Matthias Wessendorf blog: http://matthiaswessendorf.wordpress.com/ sessions: http://www.slideshare.net/mwessendorf twitter: http://twitter.com/mwessendorf
