You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2012/04/05 21:38:16 UTC
svn commit: r1310035 - in /openejb/trunk/openejb:
container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/
container/openejb-core/src/main/java/org/apache/openejb/config/
tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/
Author: dblevins
Date: Thu Apr 5 19:38:16 2012
New Revision: 1310035
URL: http://svn.apache.org/viewvc?rev=1310035&view=rev
Log:
TOMEE-144: Eliminate servlet-specific double scan
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/WebModule.java
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java?rev=1310035&r1=1310034&r2=1310035&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java Thu Apr 5 19:38:16 2012
@@ -35,6 +35,7 @@ public class WebAppInfo extends CommonIn
public final Set<String> restApplications = new TreeSet<String>();
public final Set<String> ejbWebServices = new TreeSet<String>();
public final Set<String> ejbRestServices = new TreeSet<String>();
+ public final Set<String> webAnnotatedClasses = new TreeSet<String>();
public final List<PortInfo> portInfos = new ArrayList<PortInfo>();
public final JndiEncInfo jndiEnc = new JndiEncInfo();
public final List<ServletInfo> servlets = new ArrayList<ServletInfo>();
Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=1310035&r1=1310034&r2=1310035&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java Thu Apr 5 19:38:16 2012
@@ -249,6 +249,12 @@ public class AnnotationDeployer implemen
"javax.faces.validator.FacesValidator"
};
+ private static final String[] WEB_CLASSES = new String[] {
+ "javax.servlet.annotation.WebServlet",
+ "javax.servlet.annotation.WebFilter",
+ "javax.servlet.annotation.WebListener"
+ };
+
public static final Set<String> knownResourceEnvTypes = new TreeSet<String>(asList(
"javax.ejb.EJBContext",
"javax.ejb.SessionContext",
@@ -1066,6 +1072,23 @@ public class AnnotationDeployer implemen
webModule.getJsfAnnotatedClasses().put(jsfClass, convertedClasses);
}
+ /*
+ * Servlet, Filter, Listener
+ */
+ for (String apiClassName : WEB_CLASSES) {
+ final Class<? extends Annotation> clazz;
+ try {
+ clazz = (Class<? extends Annotation>) classLoader.loadClass(apiClassName);
+ } catch (ClassNotFoundException e) {
+ continue;
+ }
+
+ final List<Class<?>> found = finder.findAnnotatedClasses(clazz);
+ for (Class<?> annotatedClass : found) {
+ webModule.getWebAnnotatedClasses().add(annotatedClass.getName());
+ }
+ }
+
return webModule;
}
Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java?rev=1310035&r1=1310034&r2=1310035&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java Thu Apr 5 19:38:16 2012
@@ -319,6 +319,7 @@ class AppInfoBuilder {
webAppInfo.restClass.addAll(webModule.getRestClasses());
webAppInfo.ejbWebServices.addAll(webModule.getEjbWebServices());
webAppInfo.ejbRestServices.addAll(webModule.getEjbRestServices());
+ webAppInfo.webAnnotatedClasses.addAll(webModule.getWebAnnotatedClasses());
for (Map.Entry<String, Set<String>> entry : webModule.getJsfAnnotatedClasses().entrySet()) {
final ClassListInfo info = new ClassListInfo();
Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/WebModule.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/WebModule.java?rev=1310035&r1=1310034&r2=1310035&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/WebModule.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/WebModule.java Thu Apr 5 19:38:16 2012
@@ -51,6 +51,7 @@ public class WebModule extends Module im
private final Set<String> ejbRestServices = new TreeSet<String>();
private final Set<String> restApplications = new TreeSet<String>();
private final Map<String, Set<String>> jsfAnnotatedClasses = new HashMap<String, Set<String>>();
+ private final Set<String> webAnnotatedClasses = new TreeSet<String>();
private ID id;
@@ -199,4 +200,8 @@ public class WebModule extends Module im
public Map<String, Set<String>> getJsfAnnotatedClasses() {
return jsfAnnotatedClasses;
}
+
+ public Set<String> getWebAnnotatedClasses() {
+ return webAnnotatedClasses;
+ }
}
Modified: openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java?rev=1310035&r1=1310034&r2=1310035&view=diff
==============================================================================
--- openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java (original)
+++ openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java Thu Apr 5 19:38:16 2012
@@ -20,14 +20,32 @@ import org.apache.catalina.core.Standard
import org.apache.catalina.deploy.WebXml;
import org.apache.catalina.startup.ContextConfig;
import org.apache.openejb.OpenEJBException;
+import org.apache.openejb.assembler.classic.WebAppInfo;
import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.util.LogCategory;
+import org.apache.openejb.util.Logger;
import org.apache.openejb.util.reflection.ReflectionUtil;
+import org.xml.sax.InputSource;
import javax.servlet.descriptor.JspPropertyGroupDescriptor;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLClassLoader;
import java.util.LinkedHashSet;
public class OpenEJBContextConfig extends ContextConfig {
- @Override protected WebXml createWebXml() {
+
+ private static final Logger logger = Logger.getInstance(LogCategory.OPENEJB.createChild("catalina").createChild("context"), OpenEJBContextConfig.class);
+
+ private TomcatWebAppBuilder.StandardContextInfo info;
+
+ public OpenEJBContextConfig(TomcatWebAppBuilder.StandardContextInfo standardContextInfo) {
+ info = standardContextInfo;
+ }
+
+ @Override
+ protected WebXml createWebXml() {
String prefix = "";
if (context instanceof StandardContext) {
StandardContext standardContext = (StandardContext) context;
@@ -56,9 +74,58 @@ public class OpenEJBContextConfig extend
}
}
- @Override public int getMajorVersion() {
+ @Override
+ public int getMajorVersion() {
return SystemInstance.get().getOptions().get(prefix + "." + OPENEJB_WEB_XML_MAJOR_VERSION_PROPERTY,
- SystemInstance.get().getOptions().get(OPENEJB_WEB_XML_MAJOR_VERSION_PROPERTY, super.getMajorVersion()));
+ SystemInstance.get().getOptions().get(OPENEJB_WEB_XML_MAJOR_VERSION_PROPERTY, super.getMajorVersion()));
+ }
+ }
+
+ @Override
+ protected void parseWebXml(InputSource source, WebXml dest, boolean fragment) {
+ super.parseWebXml(source, dest, fragment);
+ }
+
+ @Override
+ protected void processAnnotationsUrl(URL url, WebXml fragment) {
+ if (SystemInstance.get().getOptions().get("tomee.tomcat.scan", false)) {
+ super.processAnnotationsUrl(url, fragment);
+ return;
+ }
+
+ try {
+ final WebAppInfo webAppInfo = info.get();
+
+ if (webAppInfo == null) {
+ logger.warning("WebAppInfo not found. " + info);
+ super.processAnnotationsUrl(url, fragment);
+ return;
+ }
+
+ // TODO We should just remember which jars each class came from
+ // then we wouldn't need to lookup the class from the URL in this
+ // way to guarantee we only add classes from this URL.
+ final URLClassLoader loader = new URLClassLoader(new URL[]{url});
+ for (String webAnnotatedClassName : webAppInfo.webAnnotatedClasses) {
+ final String classFile = webAnnotatedClassName.replace('.', '/') + ".class";
+ final URL classUrl = loader.getResource(classFile);
+
+ if (classUrl == null) {
+ continue;
+ }
+
+ final InputStream inputStream = classUrl.openStream();
+ try {
+ processAnnotationsStream(inputStream, fragment);
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ inputStream.close();
+ }
+
+ }
+ } catch (Exception e) {
+ logger.error("OpenEJBContextConfig.processAnnotationsUrl: failed.", e);
}
}
}
Modified: openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java?rev=1310035&r1=1310034&r2=1310035&view=diff
==============================================================================
--- openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java (original)
+++ openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java Thu Apr 5 19:38:16 2012
@@ -180,8 +180,8 @@ public class TomcatWebAppBuilder impleme
* instance.
*/
public TomcatWebAppBuilder() {
-
- // TODO: re-write this bit, so this becomes part of the listener, and we register this with the mbean server.
+
+ // TODO: re-write this bit, so this becomes part of the listener, and we register this with the mbean server.
StandardServer standardServer = TomcatHelper.getServer();
globalListenerSupport = new GlobalListenerSupport(standardServer, this);
@@ -508,7 +508,7 @@ public class TomcatWebAppBuilder impleme
standardContext.removeLifecycleListener(l);
}
}
- standardContext.addLifecycleListener(new OpenEJBContextConfig());
+ standardContext.addLifecycleListener(new OpenEJBContextConfig(new StandardContextInfo(standardContext)));
// force manually the namingContextListener to merge jndi in an easier way
NamingContextListener ncl = new NamingContextListener();
@@ -518,6 +518,34 @@ public class TomcatWebAppBuilder impleme
standardContext.addLifecycleListener(new TomcatJavaJndiBinder());
}
+ public class StandardContextInfo {
+
+ private final StandardContext standardContext;
+
+ public StandardContextInfo(StandardContext standardContext) {
+ this.standardContext = standardContext;
+ }
+
+ public WebAppInfo get() {
+ final ContextInfo contextInfo = getContextInfo(standardContext);
+ System.out.println("contextInfo = " + contextInfo);
+ System.out.println("standardContext = " + standardContext);
+ for (WebAppInfo webApp : contextInfo.appInfo.webApps) {
+ if (standardContext.getName().equals("/"+webApp.contextRoot)) {
+ return webApp;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public String toString() {
+ return "StandardContextInfo{" +
+ "standardContext=" + standardContext +
+ '}';
+ }
+ }
+
/**
* a small hack to preserve order of jsppropertygroups.
*