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

Reply via email to