Author: dblevins
Date: Sat Oct 10 06:22:04 2009
New Revision: 823801
URL: http://svn.apache.org/viewvc?rev=823801&view=rev
Log:
Readded OPENEJB-1045: Injection support for JSF 2.0 ManagedBeans
Found and Fixed OPENEJB-1082: @WebService and @WebServiceProvider classes not
discovered unless annotated as EJBs
Modified:
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/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=823801&r1=823800&r2=823801&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
Sat Oct 10 06:22:04 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;
@@ -160,6 +162,7 @@
import java.util.TreeSet;
import java.util.Collection;
import java.util.LinkedHashSet;
+import java.util.Iterator;
/**
* @version $Rev$ $Date$
@@ -347,31 +350,49 @@
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());
+ File file = new File(webModule.getJarLocation());
+ URL[] urls = DeploymentLoader.getWebappUrls(file);
+ final ClassLoader webClassLoader = webModule.getClassLoader();
+ finder = new ClassFinder(webClassLoader, asList(urls));
+
+ ClassFinder finder2 = new ClassFinder(webClassLoader);
+ webModule.setFinder(finder);
} catch (Exception e) {
startupLogger.warning("Unable to scrape for @WebService or
@WebServiceProvider annotations. ClassFinder failed.", e);
return webModule;
}
- // TODO: Possible this class is also annotated @Stateless or
@Singleton, in which case we maybe should skip it
+ if (webApp == null) {
+ webApp = new WebApp();
+ webModule.setWebApp(webApp);
+ }
+
+ List<String> existingServlets = new ArrayList<String>();
+ for (Servlet servlet : webApp.getServlet()) {
+ existingServlets.add(servlet.getServletClass());
+ }
+
List<Class> classes = new ArrayList<Class>();
classes.addAll(finder.findAnnotatedClasses(WebService.class));
classes.addAll(finder.findAnnotatedClasses(WebServiceProvider.class));
+
for (Class<?> webServiceClass : classes) {
+ // If this class is also annotated @Stateless or @Singleton,
we should skip it
+ if (webServiceClass.isAnnotationPresent(Singleton.class))
continue;
+ if (webServiceClass.isAnnotationPresent(Stateless.class))
continue;
+
int modifiers = webServiceClass.getModifiers();
if (!Modifier.isPublic(modifiers) ||
Modifier.isFinal(modifiers) || isAbstract(modifiers)) {
continue;
}
+ if (existingServlets.contains(webServiceClass.getName()))
continue;
+
// create webApp and webservices objects if they don't exist
already
- if (webApp == null) {
- webApp = new WebApp();
- webModule.setWebApp(webApp);
- }
// add new <servlet/> element
Servlet servlet = new Servlet();
@@ -810,7 +831,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();
@@ -936,6 +957,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=823801&r1=823800&r2=823801&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
Sat Oct 10 06:22:04 2009
@@ -552,6 +552,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 {
@@ -575,26 +599,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=823801&r1=823800&r2=823801&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
Sat Oct 10 06:22:04 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;
}