Author: rmannibucau
Date: Fri Jul 25 22:10:47 2014
New Revision: 1613521

URL: http://svn.apache.org/r1613521
Log:
trying to avoid to force tomcat to scan the whole webapp - side note we can 
refine it later if we think we shouldn't own this code

Modified:
    
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
    
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappClassLoader.java

Modified: 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java?rev=1613521&r1=1613520&r2=1613521&view=diff
==============================================================================
--- 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
 (original)
+++ 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
 Fri Jul 25 22:10:47 2014
@@ -18,12 +18,14 @@ package org.apache.tomee.catalina;
 
 import org.apache.catalina.Container;
 import org.apache.catalina.Context;
+import org.apache.catalina.WebResource;
 import org.apache.catalina.Wrapper;
 import org.apache.catalina.core.StandardContext;
 import org.apache.catalina.core.StandardWrapper;
 import org.apache.catalina.deploy.NamingResourcesImpl;
 import org.apache.catalina.realm.DataSourceRealm;
 import org.apache.catalina.startup.ContextConfig;
+import org.apache.catalina.webresources.FileResource;
 import org.apache.naming.factory.Constants;
 import org.apache.openejb.assembler.classic.AppInfo;
 import org.apache.openejb.assembler.classic.ClassListInfo;
@@ -42,6 +44,7 @@ import org.apache.openejb.util.LogCatego
 import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.URLs;
 import org.apache.tomcat.util.bcel.classfile.AnnotationEntry;
+import org.apache.tomcat.util.bcel.classfile.ClassFormatException;
 import org.apache.tomcat.util.bcel.classfile.ElementValuePair;
 import org.apache.tomcat.util.bcel.classfile.JavaClass;
 import org.apache.tomcat.util.descriptor.web.ContextResource;
@@ -94,7 +97,7 @@ public class OpenEJBContextConfig extend
 
     // processAnnotationXXX is called for each folder of WEB-INF
     // since we store all classes in WEB-INF we will do it only once so use 
this boolean to avoid multiple processing
-    private boolean webInfClassesAnnotationsProcessed;
+    private Collection<String> webInfClassesAnnotationsProcessed = new 
ArrayList<>(1);
 
     public OpenEJBContextConfig(final TomcatWebAppBuilder.StandardContextInfo 
standardContextInfo) {
         logger.debug("OpenEJBContextConfig({0})", 
standardContextInfo.toString());
@@ -431,7 +434,6 @@ public class OpenEJBContextConfig extend
 
     @Override // called before processAnnotationsFile so using it as hook to 
init webInfClassesAnnotationsProcessed
     protected void processServletContainerInitializers(final ServletContext 
ctx) {
-        webInfClassesAnnotationsProcessed = false;
         try {
             super.processServletContainerInitializers(ctx);
             final 
Iterator<Map.Entry<ServletContainerInitializer,Set<Class<?>>>> iterator = 
initializerClassMap.entrySet().iterator();
@@ -505,15 +507,40 @@ public class OpenEJBContextConfig extend
             finder = null;
             tempLoader = null;
         } catch (final RuntimeException e) { // if exception occurs we have to 
clear the threadlocal
-            webInfClassesAnnotationsProcessed = false;
             throw e;
         }
     }
 
-    @Override // called after processAnnotationsXX so using it as hook to 
reset webInfClassesAnnotationsProcessed
-    protected void processAnnotations(final Set<WebXml> fragments, final 
boolean handlesTypesOnly) {
-        webInfClassesAnnotationsProcessed = false;
-        super.processAnnotations(fragments, handlesTypesOnly);
+    @Override
+    protected void processAnnotationsWebResource(final WebResource webResource,
+                                                 final WebXml fragment,
+                                                 final boolean 
handlesTypesOnly) {
+        final WebAppInfo webAppInfo = info.get();
+        if (webAppInfo != null && FileResource.class.isInstance(webResource)) {
+            final File file = new 
File(FileResource.class.cast(webResource).getCanonicalPath());
+            for (final ClassListInfo info : webAppInfo.webAnnotatedClasses) {
+                if (webInfClassesAnnotationsProcessed.contains(info.name)) {
+                    continue;
+                }
+                try {
+                    if (file.getAbsolutePath().startsWith(URLs.toFile(new 
URL(info.name)).getAbsolutePath())) {
+                        webInfClassesAnnotationsProcessed.add(info.name);
+                        internalProcessAnnotationsStream(info.list, fragment, 
false);
+                    }
+                } catch (final MalformedURLException e) {
+                    logger.warning(e.getMessage(), e);
+                    continue;
+                }
+            }
+        } else {
+            super.processAnnotationsWebResource(webResource, fragment, 
handlesTypesOnly);
+        }
+    }
+
+    @Override
+    protected void processAnnotationsStream(final InputStream is, final WebXml 
fragment,
+                                            final boolean handlesTypesOnly) 
throws ClassFormatException, IOException {
+        // no-op
     }
 
     @Override
@@ -522,6 +549,12 @@ public class OpenEJBContextConfig extend
     }
 
     @Override
+    protected synchronized void configureStop() {
+        webInfClassesAnnotationsProcessed.clear();
+        super.configureStop();
+    }
+
+    @Override
     protected void processAnnotationsFile(final File file, final WebXml 
fragment, final boolean handlesTypesOnly) {
         try {
             if (NewLoaderLogic.skip(file.toURI().toURL())) {
@@ -589,7 +622,7 @@ public class OpenEJBContextConfig extend
             InputStream is = null;
             try {
                 is = new URL(url).openStream();
-                processAnnotationsStream(is, fragment, handlesTypeOnly);
+                super.processAnnotationsStream(is, fragment, handlesTypeOnly);
             } catch (final MalformedURLException e) {
                 throw new IllegalArgumentException(e);
             } catch (final IOException e) {
@@ -637,11 +670,7 @@ public class OpenEJBContextConfig extend
             if (current.equals(file)) {
                 final File parent = current.getParentFile();
                 if ("classes".equals(current.getName()) && parent != null && 
"WEB-INF".equals(parent.getName())) {
-                    if (webInfClassesAnnotationsProcessed) {
-                        return false;
-                    }
-                    webInfClassesAnnotationsProcessed = true;
-                    return true;
+                    return false;
                 }
                 return true;
             }
@@ -650,16 +679,6 @@ public class OpenEJBContextConfig extend
                 return false;
             }
         }
-
         return false;
-        /* classAsFile s
-        if (current != null && current.isDirectory()) {
-            return false;
-        }
-        return (classAsFile == null
-                    || !classAsFile.getName().endsWith(".jar") || 
!file.getName().endsWith(".jar"))
-                && !webInf;
-                */
-
     }
 }

Modified: 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappClassLoader.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappClassLoader.java?rev=1613521&r1=1613520&r2=1613521&view=diff
==============================================================================
--- 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappClassLoader.java
 (original)
+++ 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEWebappClassLoader.java
 Fri Jul 25 22:10:47 2014
@@ -233,7 +233,6 @@ public class TomEEWebappClassLoader exte
         if (additionalRepos != null) {
             for (final File f : additionalRepos) {
                 final DirResourceSet webResourceSet = new 
PremptiveDirResourceSet(resources, "/", f.getAbsolutePath(), "/");
-                webResourceSet.setClassLoaderOnly(true);
                 resources.addPreResources(webResourceSet);
             }
             resources.setCachingAllowed(false);
@@ -355,7 +354,7 @@ public class TomEEWebappClassLoader exte
     }
 
     private static final class PremptiveDirResourceSet extends DirResourceSet {
-        private static final String WEB_INF_CLASSES = "/WEB-INF/classes/";
+        private static final String WEB_INF_CLASSES = "/WEB-INF/classes";
 
         public PremptiveDirResourceSet(final WebResourceRoot resources, final 
String s, final String absolutePath, final String s1) {
             super(resources, s, absolutePath, s1);
@@ -363,7 +362,19 @@ public class TomEEWebappClassLoader exte
 
         @Override
         public WebResource getResource(final String path) {
-            return super.getResource(path.startsWith(WEB_INF_CLASSES)? 
path.substring(WEB_INF_CLASSES.length() - 1) : path);
+            return super.getResource(computePath(path));
+        }
+
+        @Override
+        public String[] list(final String path) {
+            return super.list(computePath(path));
+        }
+
+        private static String computePath(final String path) {
+            if (WEB_INF_CLASSES.equals(path)) {
+                return "/";
+            }
+            return path.startsWith(WEB_INF_CLASSES)? 
path.substring(WEB_INF_CLASSES.length()) : path;
         }
     }
 }


Reply via email to