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.
      *