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;
}