Author: dblevins
Date: Thu Jun 18 04:55:05 2009
New Revision: 785901

URL: http://svn.apache.org/viewvc?rev=785901&view=rev
Log:
OPENEJB-1044: Webapp @Resource UserTransaction injection results in 
NullPointerException
OPENEJB-1045: Injection support for JSF 2.0 ManagedBeans

Modified:
    
openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatJndiBuilder.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/WebModule.java

Modified: 
openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatJndiBuilder.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatJndiBuilder.java?rev=785901&r1=785900&r2=785901&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatJndiBuilder.java
 (original)
+++ 
openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatJndiBuilder.java
 Thu Jun 18 04:55:05 2009
@@ -397,6 +397,7 @@
 
         if (UserTransaction.class.getName().equals(ref.resourceEnvRefType)) {
             resourceEnv.setProperty(Constants.FACTORY, 
UserTransactionFactory.class.getName());
+            resourceEnv.setType(ref.resourceEnvRefType);
         } else {
             resourceEnv.setProperty(Constants.FACTORY, 
ResourceFactory.class.getName());
             resourceEnv.setProperty(NAME, ref.resourceEnvRefName);

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=785901&r1=785900&r2=785901&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
 Thu Jun 18 04:55:05 2009
@@ -21,7 +21,9 @@
 import org.apache.openejb.api.RemoteClient;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.core.webservices.JaxWsUtils;
+import org.apache.openejb.core.TempClassLoader;
 import org.apache.xbean.finder.ClassFinder;
+import org.apache.xbean.finder.UrlSet;
 import org.apache.openejb.jee.ActivationConfig;
 import org.apache.openejb.jee.ApplicationClient;
 import org.apache.openejb.jee.AroundInvoke;
@@ -349,11 +351,20 @@
 
         public WebModule deploy(WebModule webModule) throws OpenEJBException {
             WebApp webApp = webModule.getWebApp();
-            if (webApp != null && (webApp.isMetadataComplete() || 
!webApp.getServlet().isEmpty())) return webModule;
+            if (webApp != null && (webApp.isMetadataComplete())) return 
webModule;
 
             ClassFinder finder;
             try {
-                finder = new ClassFinder(webModule.getClassLoader());
+                final ClassLoader webClassLoader = webModule.getClassLoader();
+                ClassLoader parent = webClassLoader.getParent();
+
+                if (webClassLoader instanceof TempClassLoader) parent = 
parent.getParent();
+
+                UrlSet urlSet = new UrlSet(webClassLoader);
+                urlSet = urlSet.exclude(parent);
+                
+                finder = new ClassFinder(webClassLoader, urlSet.getUrls());
+                webModule.setFinder(finder);
             } catch (Exception e) {
                 startupLogger.warning("Unable to scrape for @WebService or 
@WebServiceProvider annotations. ClassFinder failed.", e);
                 return webModule;
@@ -793,7 +804,7 @@
             /*
              * Classes added to this set will be scanned for annotations
              */
-            Set<Class<?>> classes = new HashSet<Class<?>>();
+            Set<Class> classes = new HashSet<Class>();
 
 
             ClassLoader classLoader = webModule.getClassLoader();
@@ -919,6 +930,38 @@
                 }
             }
 
+            ClassFinder finder = webModule.getFinder();
+
+            if (finder != null) {
+                String[] webComponentAnnotations = {
+                        "javax.faces.bean.ManagedBean",
+                        "javax.servlet.annotation.WebServlet",
+                        "javax.servlet.annotation.WebServletContextListener",
+                        "javax.servlet.annotation.ServletFilter",
+                };
+
+                List<Class<? extends Annotation>> annotations = new 
ArrayList<Class<? extends Annotation>>();
+                for (String componentAnnotationName : webComponentAnnotations) 
{
+                    try {
+                        Class<?> clazz = 
classLoader.loadClass(componentAnnotationName);
+                        annotations.add(clazz.asSubclass(Annotation.class));
+                    } catch (ClassNotFoundException e) {
+                        logger.debug("Support not enabled: " + 
componentAnnotationName);
+                    }
+                }
+
+
+                for (Class<? extends Annotation> annotation : annotations) {
+                    logger.debug("Scanning for @" + annotation.getName());
+                    List<Class> list = finder.findAnnotatedClasses(annotation);
+                    if (logger.isDebugEnabled()) for (Class clazz : list) {
+                        logger.debug("Found " + clazz.getName());
+                    }
+                    
+                    classes.addAll(list);
+                }
+            }
+
             ClassFinder inheritedClassFinder = 
createInheritedClassFinder(classes.toArray(new Class<?>[classes.size()]));
 
             /*

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java?rev=785901&r1=785900&r2=785901&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentLoader.java
 Thu Jun 18 04:55:05 2009
@@ -548,6 +548,30 @@
         }
 
         // determine war class path
+        URL[] webUrls = getWebappUrls(warFile);
+        ClassLoader warClassLoader = 
ClassLoaderUtil.createTempClassLoader(appId, webUrls, parentClassLoader);
+
+        // create web module
+        WebModule webModule = new WebModule(webApp, contextRoot, 
warClassLoader, warFile.getAbsolutePath(), moduleName);
+        webModule.getAltDDs().putAll(descriptors);
+        webModule.getWatchedResources().add(warPath);
+        webModule.getWatchedResources().add(warFile.getAbsolutePath());
+        if (webXmlUrl != null && "file".equals(webXmlUrl.getProtocol())) {
+            webModule.getWatchedResources().add(URLs.toFilePath(webXmlUrl));
+        }
+
+        // find all tag libs
+        addTagLibraries(webModule);
+
+        // load webservices descriptor
+        addWebservices(webModule);
+
+        // load faces configuration files
+        addFacesConfigs(webModule);
+        return webModule;
+    }
+
+    public static URL[] getWebappUrls(File warFile) {
         List<URL> webClassPath = new ArrayList<URL>();
         File webInfDir = new File(warFile, "WEB-INF");
         try {
@@ -571,26 +595,7 @@
 
         // create the class loader
         URL[] webUrls = webClassPath.toArray(new URL[webClassPath.size()]);
-        ClassLoader warClassLoader = 
ClassLoaderUtil.createTempClassLoader(appId, webUrls, parentClassLoader);
-
-        // create web module
-        WebModule webModule = new WebModule(webApp, contextRoot, 
warClassLoader, warFile.getAbsolutePath(), moduleName);
-        webModule.getAltDDs().putAll(descriptors);
-        webModule.getWatchedResources().add(warPath);
-        webModule.getWatchedResources().add(warFile.getAbsolutePath());
-        if (webXmlUrl != null && "file".equals(webXmlUrl.getProtocol())) {
-            webModule.getWatchedResources().add(URLs.toFilePath(webXmlUrl));
-        }
-
-        // find all tag libs
-        addTagLibraries(webModule);
-
-        // load webservices descriptor
-        addWebservices(webModule);
-
-        // load faces configuration files
-        addFacesConfigs(webModule);
-        return webModule;
+        return webUrls;
     }
 
     private static void addWebservices(WsModule wsModule) throws 
OpenEJBException {

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/WebModule.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/WebModule.java?rev=785901&r1=785900&r2=785901&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/WebModule.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/WebModule.java
 Thu Jun 18 04:55:05 2009
@@ -23,11 +23,13 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
+import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.openejb.jee.FacesConfig;
 import org.apache.openejb.jee.TldTaglib;
 import org.apache.openejb.jee.WebApp;
 import org.apache.openejb.jee.Webservices;
+import org.apache.xbean.finder.ClassFinder;
 
 /**
  * @version $Rev$ $Date$
@@ -47,6 +49,8 @@
     private final Set<String> watchedResources = new TreeSet<String>();
     // List of all faces configuration files found in this web module
     private final List<FacesConfig> facesConfigs = new 
ArrayList<FacesConfig>();
+    private ClassFinder finder;
+
 
     public WebModule(WebApp webApp, String contextRoot, ClassLoader 
classLoader, String jarLocation, String moduleId) {
         this.webApp = webApp;
@@ -82,6 +86,14 @@
         validation = new ValidationContext(WebModule.class, jarLocation);
     }
 
+    public ClassFinder getFinder() {
+        return finder;
+    }
+
+    public void setFinder(ClassFinder finder) {
+        this.finder = finder;
+    }
+
     public ValidationContext getValidation() {
         return validation;
     }


Reply via email to