[weld-commits] Weld SVN: r4827 - in extensions/trunk/servlet: int/src/main/java/org/jboss/weld/environment/servlet and 4 other directories.

weld-commits at lists.jboss.org weld-commits at lists.jboss.org
Sun Nov 8 22:56:45 EST 2009


Author: dan.j.allen
Date: 2009-11-08 22:56:44 -0500 (Sun, 08 Nov 2009)
New Revision: 4827

Added:
   extensions/trunk/servlet/int/src/main/java/org/jboss/weld/environment/servlet/util/ForwardingELResolver.java
Modified:
   extensions/trunk/servlet/int/pom.xml
   extensions/trunk/servlet/int/src/main/java/org/jboss/weld/environment/servlet/Listener.java
   extensions/trunk/servlet/int/src/main/java/org/jboss/weld/environment/servlet/deployment/AbstractScanner.java
   extensions/trunk/servlet/int/src/main/java/org/jboss/weld/environment/servlet/deployment/URLScanner.java
   extensions/trunk/servlet/int/src/main/java/org/jboss/weld/environment/servlet/jsf/WeldApplication.java
   extensions/trunk/servlet/tests/pom.xml
Log:
WELDX-44
Introduce a delegating ELResolver that plugs in the ELResolver when it becomes available
Remove weld-logging dependencies in favor of slf4j


Modified: extensions/trunk/servlet/int/pom.xml
===================================================================
--- extensions/trunk/servlet/int/pom.xml	2009-11-09 03:55:27 UTC (rev 4826)
+++ extensions/trunk/servlet/int/pom.xml	2009-11-09 03:56:44 UTC (rev 4827)
@@ -39,11 +39,6 @@
       </dependency>
       
       <dependency>
-         <groupId>org.jboss.weld</groupId>
-         <artifactId>weld-logging</artifactId>
-      </dependency>
-      
-      <dependency>
          <groupId>org.apache.tomcat</groupId>
          <artifactId>catalina</artifactId>
          <version>6.0.18</version>
@@ -67,6 +62,23 @@
       	<artifactId>jsp-api</artifactId>
          <scope>provided</scope>
       </dependency>
+
+      <dependency>
+         <groupId>org.slf4j</groupId>
+         <artifactId>slf4j-api</artifactId>
+      </dependency>
+      <dependency>
+      	<groupId>org.slf4j</groupId>
+      	<artifactId>slf4j-jcl</artifactId>
+      	<version>1.5.8</version>
+      	<scope>runtime</scope>
+      </dependency>
+      <dependency>
+      	<groupId>commons-logging</groupId>
+      	<artifactId>commons-logging</artifactId>
+      	<version>1.1.1</version>
+      	<scope>runtime</scope>
+      </dependency>
       
    </dependencies>
 

Modified: extensions/trunk/servlet/int/src/main/java/org/jboss/weld/environment/servlet/Listener.java
===================================================================
--- extensions/trunk/servlet/int/src/main/java/org/jboss/weld/environment/servlet/Listener.java	2009-11-09 03:55:27 UTC (rev 4826)
+++ extensions/trunk/servlet/int/src/main/java/org/jboss/weld/environment/servlet/Listener.java	2009-11-09 03:56:44 UTC (rev 4827)
@@ -17,7 +17,6 @@
 package org.jboss.weld.environment.servlet;
 
 import javax.el.ELContextListener;
-import javax.enterprise.inject.spi.BeanManager;
 import javax.servlet.ServletContextEvent;
 import javax.servlet.jsp.JspApplicationContext;
 import javax.servlet.jsp.JspFactory;
@@ -32,19 +31,19 @@
 import org.jboss.weld.environment.servlet.util.Reflections;
 import org.jboss.weld.environment.tomcat.WeldAnnotationProcessor;
 import org.jboss.weld.injection.spi.ResourceInjectionServices;
-import org.jboss.weld.log.Log;
-import org.jboss.weld.log.Logging;
 import org.jboss.weld.manager.api.WeldManager;
 import org.jboss.weld.servlet.api.ServletListener;
 import org.jboss.weld.servlet.api.ServletServices;
 import org.jboss.weld.servlet.api.helpers.ForwardingServletListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * @author Pete Muir
  */
 public class Listener extends ForwardingServletListener
-{   
-   private static final Log log = Logging.getLog(Listener.class);
+{
+   private static final Logger log = LoggerFactory.getLogger(Listener.class);
    
    private static final String BOOTSTRAP_IMPL_CLASS_NAME = "org.jboss.weld.bootstrap.WeldBootstrap";
    private static final String WELD_LISTENER_CLASS_NAME = "org.jboss.weld.servlet.WeldListener";
@@ -55,7 +54,7 @@
    private final transient ServletListener weldListener;
    private WeldManager manager;
    
-   public Listener() 
+   public Listener()
    {
       try
       {
@@ -79,7 +78,6 @@
    public void contextDestroyed(ServletContextEvent sce)
    {
       bootstrap.shutdown();
-      sce.getServletContext().removeAttribute(BeanManager.class.getName());
       sce.getServletContext().removeAttribute(WeldAnnotationProcessor.class.getName());
       super.contextDestroyed(sce);
    }
@@ -90,8 +88,6 @@
       BeanStore applicationBeanStore = new ConcurrentHashMapBeanStore();
       sce.getServletContext().setAttribute(APPLICATION_BEAN_STORE_ATTRIBUTE_NAME, applicationBeanStore);
       
-      
-      
       ServletDeployment deployment = new ServletDeployment(sce.getServletContext());
       try
       {
@@ -100,11 +96,11 @@
       }
       catch (NoClassDefFoundError e)
       {
-    	 // Support GAE 
+    	 // Support GAE
     	 log.warn("@Resource injection not available in simple beans");
       }
       
-      deployment.getServices().add(ServletServices.class, 
+      deployment.getServices().add(ServletServices.class,
             new ServletServicesImpl(deployment.getWebAppBeanDeploymentArchive()));
       
       bootstrap.startContainer(Environments.SERVLET, deployment, applicationBeanStore).startInitialization();
@@ -115,7 +111,7 @@
       {
          Reflections.classForName("org.apache.AnnotationProcessor");
       }
-      catch (IllegalArgumentException e) 
+      catch (IllegalArgumentException e)
       {
          log.info("JSR-299 injection will not be available in Servlets, Filters etc. This facility is only available in Tomcat");
          tomcat = false;
@@ -130,14 +126,13 @@
             Object annotationProcessor = clazz.getConstructor(WeldManager.class).newInstance(manager);
             sce.getServletContext().setAttribute(WeldAnnotationProcessor.class.getName(), annotationProcessor);
          }
-         catch (Exception e) 
+         catch (Exception e)
          {
             log.error("Unable to create Tomcat AnnotationProcessor. JSR-299 injection will not be available in Servlets, Filters etc.", e);
          }
       }
 
       // Push the manager into the servlet context so we can access in JSF
-      sce.getServletContext().setAttribute(BeanManager.class.getName(), manager);
       
       if (JspFactory.getDefaultFactory() != null)
       {
@@ -151,7 +146,7 @@
             newInstance("org.jboss.weld.el.WeldELContextListener"));
          
          // Push the wrapped expression factory into the servlet context so that Tomcat or Jetty can hook it in using a container code
-         sce.getServletContext().setAttribute(EXPRESSION_FACTORY_NAME, 
+         sce.getServletContext().setAttribute(EXPRESSION_FACTORY_NAME,
                manager.wrapExpressionFactory(jspApplicationContext.getExpressionFactory()));
       }
       
@@ -159,8 +154,6 @@
       super.contextInitialized(sce);
    }
    
-   
-
    @Override
    protected ServletListener delegate()
    {

Modified: extensions/trunk/servlet/int/src/main/java/org/jboss/weld/environment/servlet/deployment/AbstractScanner.java
===================================================================
--- extensions/trunk/servlet/int/src/main/java/org/jboss/weld/environment/servlet/deployment/AbstractScanner.java	2009-11-09 03:55:27 UTC (rev 4826)
+++ extensions/trunk/servlet/int/src/main/java/org/jboss/weld/environment/servlet/deployment/AbstractScanner.java	2009-11-09 03:56:44 UTC (rev 4827)
@@ -18,8 +18,8 @@
 
 import java.net.URL;
 
-import org.jboss.weld.log.Log;
-import org.jboss.weld.log.Logging;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Abstract base class for {@link Scanner} providing common functionality
@@ -32,7 +32,8 @@
 public abstract class AbstractScanner implements Scanner
 {
 
-   private static final Log log = Logging.getLog(Scanner.class);
+   private static final Logger log = LoggerFactory.getLogger(Scanner.class);
+   
    private final ClassLoader classLoader;
    private final WebAppBeanDeploymentArchive webAppBeanDeploymentArchive;
    

Modified: extensions/trunk/servlet/int/src/main/java/org/jboss/weld/environment/servlet/deployment/URLScanner.java
===================================================================
--- extensions/trunk/servlet/int/src/main/java/org/jboss/weld/environment/servlet/deployment/URLScanner.java	2009-11-09 03:55:27 UTC (rev 4826)
+++ extensions/trunk/servlet/int/src/main/java/org/jboss/weld/environment/servlet/deployment/URLScanner.java	2009-11-09 03:56:44 UTC (rev 4827)
@@ -29,8 +29,8 @@
 import java.util.zip.ZipException;
 import java.util.zip.ZipFile;
 
-import org.jboss.weld.log.Log;
-import org.jboss.weld.log.Logging;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Implementation of {@link Scanner} which can scan a {@link URLClassLoader}
@@ -43,7 +43,7 @@
  */
 public class URLScanner extends AbstractScanner
 {
-   private static final Log log = Logging.getLog(URLScanner.class);
+   private static final Logger log = LoggerFactory.getLogger(URLScanner.class);
    
    public URLScanner(ClassLoader classLoader, WebAppBeanDeploymentArchive webBeanDiscovery)
    {

Modified: extensions/trunk/servlet/int/src/main/java/org/jboss/weld/environment/servlet/jsf/WeldApplication.java
===================================================================
--- extensions/trunk/servlet/int/src/main/java/org/jboss/weld/environment/servlet/jsf/WeldApplication.java	2009-11-09 03:55:27 UTC (rev 4826)
+++ extensions/trunk/servlet/int/src/main/java/org/jboss/weld/environment/servlet/jsf/WeldApplication.java	2009-11-09 03:56:44 UTC (rev 4827)
@@ -9,7 +9,7 @@
  * 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,  
+ * 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.
@@ -17,39 +17,69 @@
 package org.jboss.weld.environment.servlet.jsf;
 
 import javax.el.ELContextListener;
+import javax.el.ELResolver;
 import javax.el.ExpressionFactory;
 import javax.enterprise.inject.spi.BeanManager;
 import javax.faces.application.Application;
 import javax.faces.context.FacesContext;
 import javax.servlet.ServletContext;
 
+import org.jboss.weld.environment.servlet.util.ForwardingELResolver;
 import org.jboss.weld.environment.servlet.util.Reflections;
 
 /**
- * @author pmuir
- *
+ * @author Pete Muir
+ * @author Dan Allen
  */
 public class WeldApplication extends ForwardingApplication
 {
+   /**
+    * The BeanManager may not have been initialized at the time JSF is initializing. Therefore,
+    * we stick in an ELResolver that delegates to the BeanManager ELResolver, which will
+    * be plugged in when it's available. If the ELResolver is invoked before the BeanManager
+    * is available, an IllegalStateException is thrown (is this the desired behavior?)
+    */
+   private static class LazyBeanManagerIntegrationELResolver extends ForwardingELResolver
+   {
+      private ELResolver delegate = null;
+
+      public void beanManagerReady(BeanManager beanManager)
+      {
+         this.delegate = beanManager.getELResolver();
+      }
+
+      @Override
+      protected ELResolver delegate()
+      {
+         if (delegate == null) {
+            throw new IllegalStateException("Attempt to use JSR-299 ELResolver before BeanManager initialized.");
+         }
+         return delegate;
+      }
+   }
    
-   private static final ELContextListener[] EMPTY_LISTENERS = {};
-   
    private final Application application;
+   private LazyBeanManagerIntegrationELResolver elResolver;
    private ExpressionFactory expressionFactory;
    private BeanManager beanManager;
    
    public WeldApplication(Application application)
    {
       this.application = application;
+      // QUESTION should the context listener be registered in init() instead?
+      application.addELContextListener(Reflections.<ELContextListener>newInstance("org.jboss.weld.el.WeldELContextListener"));
+      elResolver = new LazyBeanManagerIntegrationELResolver();
+      application.addELResolver(elResolver);
    }
    
    private void init()
    {
-      if (expressionFactory == null && application.getExpressionFactory() != null && beanManager() != null)
+      ExpressionFactory expressionFactory = null;
+      BeanManager beanManager = null;
+      if (expressionFactory == null && (expressionFactory = application.getExpressionFactory()) != null && (beanManager = beanManager()) != null)
       {
-         application.addELContextListener(Reflections.<ELContextListener>newInstance("org.jboss.weld.el.WeldELContextListener"));
-         application.addELResolver(beanManager().getELResolver());
-         this.expressionFactory = beanManager().wrapExpressionFactory(application.getExpressionFactory());
+         elResolver.beanManagerReady(beanManager);
+         this.expressionFactory = beanManager.wrapExpressionFactory(expressionFactory);
       }
    }
 
@@ -90,8 +120,8 @@
          }
          this.beanManager = (BeanManager) ctx.getAttribute(BeanManager.class.getName());
       }
+      
       return beanManager;
-      
    }
 
 }

Added: extensions/trunk/servlet/int/src/main/java/org/jboss/weld/environment/servlet/util/ForwardingELResolver.java
===================================================================
--- extensions/trunk/servlet/int/src/main/java/org/jboss/weld/environment/servlet/util/ForwardingELResolver.java	                        (rev 0)
+++ extensions/trunk/servlet/int/src/main/java/org/jboss/weld/environment/servlet/util/ForwardingELResolver.java	2009-11-09 03:56:44 UTC (rev 4827)
@@ -0,0 +1,88 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed 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.jboss.weld.environment.servlet.util;
+
+import java.beans.FeatureDescriptor;
+import java.util.Iterator;
+
+import javax.el.ELContext;
+import javax.el.ELResolver;
+
+/**
+ * Copied from Weld core. Consider putting this class in the SPI?
+ * 
+ * @author Dan Allen
+ */
+public abstract class ForwardingELResolver extends ELResolver
+{
+   protected abstract ELResolver delegate();
+
+   @Override
+   public Class<?> getCommonPropertyType(ELContext context, Object base)
+   {
+      return delegate().getCommonPropertyType(context, base);
+   }
+
+   @Override
+   public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext context, Object base)
+   {
+      return delegate().getFeatureDescriptors(context, base);
+   }
+
+   @Override
+   public Class<?> getType(ELContext context, Object base, Object property)
+   {
+      return delegate().getType(context, base, property);
+   }
+
+   @Override
+   public Object getValue(ELContext context, Object base, Object property)
+   {
+      return delegate().getValue(context, base, property);
+   }
+
+   @Override
+   public boolean isReadOnly(ELContext context, Object base, Object property)
+   {
+      return delegate().isReadOnly(context, base, property);
+   }
+
+   @Override
+   public void setValue(ELContext context, Object base, Object property, Object value)
+   {
+      delegate().setValue(context, base, property, value);
+   }
+   
+   @Override
+   public boolean equals(Object obj)
+   {
+      return this == obj || delegate().equals(obj);
+   }
+   
+   @Override
+   public int hashCode()
+   {
+      return delegate().hashCode();
+   }
+   
+   @Override
+   public String toString()
+   {
+      return delegate().toString();
+   }
+
+}

Modified: extensions/trunk/servlet/tests/pom.xml
===================================================================
--- extensions/trunk/servlet/tests/pom.xml	2009-11-09 03:55:27 UTC (rev 4826)
+++ extensions/trunk/servlet/tests/pom.xml	2009-11-09 03:56:44 UTC (rev 4827)
@@ -115,7 +115,13 @@
       	<groupId>commons-httpclient</groupId>
     		<artifactId>commons-httpclient</artifactId>
     	</dependency>
-   
+
+      <dependency>
+         <groupId>org.slf4j</groupId>
+         <artifactId>slf4j-simple</artifactId>
+         <scope>test</scope>
+      </dependency>
+ 
    </dependencies>
    
    <build>



More information about the weld-commits mailing list