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