openwebbeans-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From strub...@apache.org
Subject 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/
Date Tue, 12 Jan 2010 18:20:42 GMT
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



Mime
View raw message