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