Author: rmannibucau
Date: Sun Sep 30 15:18:51 2012
New Revision: 1392034

URL: http://svn.apache.org/viewvc?rev=1392034&view=rev
Log:
better integration for @WebXXX (tomcat call method we override too much for us 
so simply skip calls > 1 when processing is already done + fixing bad 
management of a map in core)

Modified:
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
    
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java

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=1392034&r1=1392033&r2=1392034&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
 Sun Sep 30 15:18:51 2012
@@ -1127,7 +1127,7 @@ public class AnnotationDeployer implemen
                 }
 
                 final List<Annotated<Class<?>>> found = 
finder.findMetaAnnotatedClasses(clazz);
-                webModule.getWebAnnotatedClasses().putAll(metaToStr(found));
+                addWebAnnotatedClassInfo(webModule.getWebAnnotatedClasses(), 
found);
             }
 
             return webModule;
@@ -5174,22 +5174,21 @@ public class AnnotationDeployer implemen
         return classes;
     }
 
-    private static Map<String, Set<String>> metaToStr(final 
List<Annotated<Class<?>>> found) {
-        final Map<String, Set<String>> classes = new HashMap<String, 
Set<String>>(found.size());
+    private static Map<String, Set<String>> addWebAnnotatedClassInfo(final 
Map<String, Set<String>> classes, final List<Annotated<Class<?>>> found) {
         for (Annotated<Class<?>> clazz : found) {
             final Class<?> loadedClass = clazz.get();
 
             // url of the jar/folder containing the class
-            URL url;
+            String url;
             try {
-                url = JarLocation.jarLocation(loadedClass).toURI().toURL();
+                url = 
JarLocation.jarLocation(loadedClass).toURI().toURL().toExternalForm();
             } catch (MalformedURLException e) {
-                url = classLocation(loadedClass);
+                url = classLocation(loadedClass).toExternalForm();
             }
             Set<String> list = classes.get(url);
             if (list == null) {
                 list = new HashSet<String>();
-                classes.put(url.toExternalForm(), list);
+                classes.put(url, list);
             }
 
             // saving class url

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=1392034&r1=1392033&r2=1392034&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
 Sun Sep 30 15:18:51 2012
@@ -28,7 +28,6 @@ import org.apache.openejb.loader.SystemI
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.URLs;
-import org.xml.sax.InputSource;
 
 import javax.servlet.ServletContainerInitializer;
 import java.io.File;
@@ -50,6 +49,10 @@ public class OpenEJBContextConfig extend
 
     private TomcatWebAppBuilder.StandardContextInfo info;
 
+    // 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 ThreadLocal<Boolean> webInfClassesAnnotationsProcessed = new 
ThreadLocal<Boolean>();
+
     public OpenEJBContextConfig(TomcatWebAppBuilder.StandardContextInfo 
standardContextInfo) {
         logger.debug("OpenEJBContextConfig({0})", 
standardContextInfo.toString());
         info = standardContextInfo;
@@ -123,8 +126,30 @@ public class OpenEJBContextConfig extend
         return classes;
     }
 
+    @Override // called before processAnnotationsFile so using it as hook to 
init webInfClassesAnnotationsProcessed
+    protected void processServletContainerInitializers(final Set<WebXml> 
fragments) {
+        webInfClassesAnnotationsProcessed.set(false);
+        try {
+            super.processServletContainerInitializers(fragments);
+        } catch (RuntimeException e) { // if exception occurs we have to clear 
the threadlocal
+            webInfClassesAnnotationsProcessed.remove();
+            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.remove();
+        super.processAnnotations(fragments, handlesTypesOnly);
+    }
+
+
     @Override
     protected void processAnnotationsFile(File file, WebXml fragment, boolean 
handlesTypesOnly) {
+        if (webInfClassesAnnotationsProcessed.get()) {
+            return;
+        }
+
         final WebAppInfo webAppInfo = info.get();
         if (webAppInfo == null) {
             super.processAnnotationsFile(file, fragment, handlesTypesOnly);
@@ -134,7 +159,7 @@ public class OpenEJBContextConfig extend
         for (ClassListInfo webAnnotated : webAppInfo.webAnnotatedClasses) {
             try {
                 final File classContainerAsFile = URLs.toFile(new 
URL(webAnnotated.name));
-                if (!isIncludedIn(file, classContainerAsFile)) {
+                if (!isIncludedIn(classContainerAsFile, file)) {
                     continue;
                 }
 
@@ -145,6 +170,7 @@ public class OpenEJBContextConfig extend
                 throw new IllegalArgumentException(e);
             }
         }
+        webInfClassesAnnotationsProcessed.set(true);
     }
 
     @Override
@@ -159,7 +185,7 @@ public class OpenEJBContextConfig extend
             try {
                 final File classContainerAsFile = URLs.toFile(new 
URL(webAnnotated.name));
                 final File currentUrlAsFile = URLs.toFile(currentUrl);
-                if (!isIncludedIn(currentUrlAsFile, classContainerAsFile)) {
+                if (!isIncludedIn(classContainerAsFile, currentUrlAsFile)) {
                     continue;
                 }
 


Reply via email to