Author: rmannibucau
Date: Tue Oct  8 15:54:55 2013
New Revision: 1530319

URL: http://svn.apache.org/r1530319
Log:
TOMEE-1053 @HandlesTypes support

Added:
    
tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/handletypes/
    
tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/handletypes/API.java
    
tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/handletypes/HandleTypesTest.java
    
tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/handletypes/Impl.java
    
tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/handletypes/Init.java
Modified:
    tomee/tomee/trunk/arquillian/arquillian-tomee-remote/pom.xml
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/FinderFactory.java
    
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/TomcatWebAppBuilder.java
    
tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/EmbeddedJarScanner.java

Modified: tomee/tomee/trunk/arquillian/arquillian-tomee-remote/pom.xml
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/arquillian-tomee-remote/pom.xml?rev=1530319&r1=1530318&r2=1530319&view=diff
==============================================================================
--- tomee/tomee/trunk/arquillian/arquillian-tomee-remote/pom.xml (original)
+++ tomee/tomee/trunk/arquillian/arquillian-tomee-remote/pom.xml Tue Oct  8 
15:54:55 2013
@@ -104,6 +104,25 @@
     </dependency>
 
     <dependency>
+      <groupId>org.apache.openejb</groupId>
+      <artifactId>tomee-loader</artifactId>
+      <version>1.6.0-SNAPSHOT</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.openejb</groupId>
+      <artifactId>tomee-catalina</artifactId>
+      <version>1.6.0-SNAPSHOT</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.xbean</groupId>
+      <artifactId>xbean-finder-shaded</artifactId>
+      <version>3.14</version>
+      <scope>provided</scope>
+    </dependency>
+
+    <dependency>
       <groupId>org.apache.geronimo.specs</groupId>
       <artifactId>geronimo-j2ee-deployment_1.1_spec</artifactId>
       <version>1.1</version>

Added: 
tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/handletypes/API.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/handletypes/API.java?rev=1530319&view=auto
==============================================================================
--- 
tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/handletypes/API.java
 (added)
+++ 
tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/handletypes/API.java
 Tue Oct  8 15:54:55 2013
@@ -0,0 +1,20 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.arquillian.handletypes;
+
+public interface API {
+}

Added: 
tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/handletypes/HandleTypesTest.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/handletypes/HandleTypesTest.java?rev=1530319&view=auto
==============================================================================
--- 
tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/handletypes/HandleTypesTest.java
 (added)
+++ 
tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/handletypes/HandleTypesTest.java
 Tue Oct  8 15:54:55 2013
@@ -0,0 +1,53 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.arquillian.handletypes;
+
+import org.apache.openejb.arquillian.common.IO;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.arquillian.test.api.ArquillianResource;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.servlet.ServletContainerInitializer;
+import java.io.IOException;
+import java.net.URL;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+@RunWith(Arquillian.class)
+public class HandleTypesTest {
+    @Deployment(testable = false)
+    public static Archive<?> war() {
+        return ShrinkWrap.create(WebArchive.class, "ht.war")
+            .addClasses(API.class, Impl.class, Init.class)
+            .addAsServiceProvider(ServletContainerInitializer.class, 
Init.class);
+    }
+
+    @ArquillianResource
+    private URL url;
+
+    @Test
+    public void check() throws IOException {
+        final String content = IO.slurp(new URL(url.toExternalForm() + 
"list"));
+        assertThat(content, containsString(Impl.class.getName()));
+    }
+}

Added: 
tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/handletypes/Impl.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/handletypes/Impl.java?rev=1530319&view=auto
==============================================================================
--- 
tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/handletypes/Impl.java
 (added)
+++ 
tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/handletypes/Impl.java
 Tue Oct  8 15:54:55 2013
@@ -0,0 +1,20 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.arquillian.handletypes;
+
+public class Impl implements API {
+}

Added: 
tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/handletypes/Init.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/handletypes/Init.java?rev=1530319&view=auto
==============================================================================
--- 
tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/handletypes/Init.java
 (added)
+++ 
tomee/tomee/trunk/arquillian/arquillian-tomee-remote/src/test/java/org/apache/openejb/arquillian/handletypes/Init.java
 Tue Oct  8 15:54:55 2013
@@ -0,0 +1,73 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.arquillian.handletypes;
+
+import javax.servlet.Servlet;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContainerInitializer;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.annotation.HandlesTypes;
+import java.io.IOException;
+import java.util.Set;
+
+@HandlesTypes(API.class)
+public class Init implements ServletContainerInitializer {
+    @Override
+    public void onStartup(final Set<Class<?>> classes, final ServletContext 
servletContext) throws ServletException {
+        servletContext.addServlet("list", new 
ListServlet(classes)).addMapping("/list");
+    }
+
+    private static class ListServlet implements Servlet {
+        private final Set<Class<?>> list;
+
+        public ListServlet(final Set<Class<?>> classes) {
+            this.list = classes;
+        }
+
+        @Override
+        public void init(final ServletConfig servletConfig) throws 
ServletException {
+
+        }
+
+        @Override
+        public ServletConfig getServletConfig() {
+            return null;
+        }
+
+        @Override
+        public void service(final ServletRequest servletRequest, final 
ServletResponse servletResponse) throws ServletException, IOException {
+            if (list == null) {
+                servletResponse.getWriter().write("oops");
+            } else {
+                servletResponse.getWriter().write(list.toString());
+            }
+        }
+
+        @Override
+        public String getServletInfo() {
+            return null;
+        }
+
+        @Override
+        public void destroy() {
+
+        }
+    }
+}

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/FinderFactory.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/FinderFactory.java?rev=1530319&r1=1530318&r2=1530319&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/FinderFactory.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/config/FinderFactory.java
 Tue Oct  8 15:54:55 2013
@@ -135,14 +135,23 @@ public class FinderFactory {
             annotationFinder.enableMetaAnnotations();
         }
         if (enableFindSubclasses()) {
-            annotationFinder.enableFindSubclasses();
+            annotationFinder.link(); // for @HandleTypes we need interface 
impl, impl of abstract classes too
         }
 
         return annotationFinder;
     }
 
-    public static boolean enableFindSubclasses() {
-        return isJaxRsInstalled() && 
SystemInstance.get().getOptions().get(TOMEE_JAXRS_DEPLOY_UNDECLARED_PROP, 
false);
+    private static boolean enableFindSubclasses() {
+        return isTomEE() || (isJaxRsInstalled() && 
SystemInstance.get().getOptions().get(TOMEE_JAXRS_DEPLOY_UNDECLARED_PROP, 
false));
+    }
+
+    private static boolean isTomEE() {
+        try {
+            
FinderFactory.class.getClassLoader().loadClass("org.apache.tomee.catalina.ServerListener");
+            return true;
+        } catch (Throwable e) {
+            return false;
+        }
     }
 
     public static boolean isJaxRsInstalled() {

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=1530319&r1=1530318&r2=1530319&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
 Tue Oct  8 15:54:55 2013
@@ -57,6 +57,7 @@ import org.apache.tomee.catalina.realm.T
 import org.apache.tomee.common.NamingUtil;
 import org.apache.tomee.common.ResourceFactory;
 import org.apache.tomee.loader.TomcatHelper;
+import org.apache.xbean.finder.IAnnotationFinder;
 
 import javax.servlet.ServletContainerInitializer;
 import javax.servlet.http.HttpServlet;
@@ -66,6 +67,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.annotation.Annotation;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLConnection;
@@ -88,6 +90,8 @@ public class OpenEJBContextConfig extend
     private static final File BASE = 
SystemInstance.get().getBase().getDirectory();
 
     private TomcatWebAppBuilder.StandardContextInfo info;
+    private IAnnotationFinder finder = null;
+    private ClassLoader tempLoader = null;
 
     // 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
@@ -98,6 +102,11 @@ public class OpenEJBContextConfig extend
         info = standardContextInfo;
     }
 
+    public void finder(final IAnnotationFinder finder, final ClassLoader 
tmpLoader) {
+        this.finder = finder;
+        this.tempLoader = tmpLoader;
+    }
+
     @Override
     public void configureStart() {
         super.configureStart();
@@ -373,6 +382,10 @@ public class OpenEJBContextConfig extend
         } catch (final NoClassDefFoundError error) {
             // no-op
         }
+
+        // let it be GC-ed
+        finder = null;
+        tempLoader = null;
     }
 
     private Set<Class<?>> getJsfClasses(final Context context) {
@@ -431,7 +444,7 @@ public class OpenEJBContextConfig extend
             return;
         }
 
-        internalProcessAnnotations(file, webAppInfo, fragment, 
handlesTypesOnly);
+        internalProcessAnnotations(file, webAppInfo, fragment);
     }
 
     @Override
@@ -479,25 +492,65 @@ public class OpenEJBContextConfig extend
             }
         }
 
-        internalProcessAnnotations(currentUrlAsFile, webAppInfo, fragment, 
handlesTypeOnly);
+        internalProcessAnnotations(currentUrlAsFile, webAppInfo, fragment);
     }
 
-    private void internalProcessAnnotations(final File currentUrlAsFile, final 
WebAppInfo webAppInfo, final WebXml fragment, final boolean  handlesTypeOnly) {
+    private void internalProcessAnnotations(final File currentUrlAsFile, final 
WebAppInfo webAppInfo, final WebXml fragment) {
+        if (typeInitializerMap.size() > 0 && finder != null) {
+            final ClassLoader loader = context.getLoader().getClassLoader();
+            if (handlesTypesNonAnnotations) {
+                for (final Map.Entry<Class<?>, 
Set<ServletContainerInitializer>> entry : typeInitializerMap.entrySet()) {
+                    for (final ServletContainerInitializer sci : 
entry.getValue()) {
+                        try { // we need to load the class (entry.getKey()) 
with the finder classloader = tempClassLoader otherwise isAssignable is false 
in almost all cases
+                            final Class<?> reloadedClass = 
tempLoader.loadClass(entry.getKey().getName());
+                            final List<Class<?>> implementations = 
List.class.cast(finder.findImplementations(reloadedClass));
+                            addClassesWithRightLoader(loader, sci, 
implementations);
+                        } catch (final Throwable th) {
+                            // no-op
+                        }
+                    }
+                }
+            }
+
+            if (handlesTypesAnnotations) {
+                for (final Map.Entry<Class<?>, 
Set<ServletContainerInitializer>> entry : typeInitializerMap.entrySet()) {
+                    final Class<?> annotation = entry.getKey();
+                    if (annotation.isAnnotation()) {
+                        for (final ServletContainerInitializer sci : 
entry.getValue()) {
+                            try {
+                                final Class<? extends Annotation> 
reloadedAnnotation = 
Class.class.cast(tempLoader.loadClass(annotation.getName()));
+                                addClassesWithRightLoader(loader, sci, 
finder.findAnnotatedClasses(reloadedAnnotation));
+                            } catch (final Throwable th) {
+                                // no-op
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
         for (final ClassListInfo webAnnotated : 
webAppInfo.webAnnotatedClasses) {
             try {
                 if (!isIncludedIn(webAnnotated.name, currentUrlAsFile)) {
                     continue;
                 }
 
-                internalProcessAnnotationsStream(webAnnotated.list, fragment, 
handlesTypeOnly);
-            } catch (MalformedURLException e) {
+                internalProcessAnnotationsStream(webAnnotated.list, fragment, 
false);
+            } catch (final MalformedURLException e) {
                 throw new IllegalArgumentException(e);
             }
         }
     }
 
+    private void addClassesWithRightLoader(final ClassLoader loader, final 
ServletContainerInitializer sci, final List<Class<?>> implementations) throws 
ClassNotFoundException {
+        final Set<Class<?>> classes = initializerClassMap.get(sci);
+        for (final Class<?> c : implementations) {
+            classes.add(loader.loadClass(c.getName()));
+        }
+    }
+
     private void internalProcessAnnotationsStream(final Collection<String> 
urls, final WebXml fragment, final boolean handlesTypeOnly) {
-        for (String url : urls) {
+        for (final String url : urls) {
             InputStream is = null;
             try {
                 is = new URL(url).openStream();

Modified: 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java?rev=1530319&r1=1530318&r2=1530319&view=diff
==============================================================================
--- 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
 (original)
+++ 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
 Tue Oct  8 15:54:55 2013
@@ -87,11 +87,7 @@ import org.apache.openejb.assembler.clas
 import 
org.apache.openejb.assembler.classic.event.NewEjbAvailableAfterApplicationCreated;
 import org.apache.openejb.cdi.CdiBuilder;
 import org.apache.openejb.cdi.OpenEJBLifecycle;
-import org.apache.openejb.config.AppModule;
-import org.apache.openejb.config.ConfigurationFactory;
-import org.apache.openejb.config.DeploymentLoader;
-import org.apache.openejb.config.TldScanner;
-import org.apache.openejb.config.WebModule;
+import org.apache.openejb.config.*;
 import org.apache.openejb.config.sys.Resource;
 import org.apache.openejb.core.CoreContainerSystem;
 import org.apache.openejb.core.ParentClassLoaderFinder;
@@ -161,6 +157,7 @@ import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
 
 import static org.apache.tomee.catalina.BackportUtil.getNamingContextListener;
+import static org.apache.tomee.catalina.Contexts.warPath;
 
 /**
  * Web application builder.
@@ -1141,6 +1138,23 @@ public class TomcatWebAppBuilder impleme
                         }
                     }
 
+                    OpenEJBContextConfig openEJBContextConfig = null;
+                    for (final LifecycleListener listener : 
standardContext.findLifecycleListeners()) {
+                        if (OpenEJBContextConfig.class.isInstance(listener)) {
+                            openEJBContextConfig = 
OpenEJBContextConfig.class.cast(listener);
+                            break;
+                        }
+                    }
+                    if (openEJBContextConfig != null) {
+                        for (final EjbModule ejbModule : 
appModule.getEjbModules()) {
+                            if (ejbModule.getFile() != null && 
warPath(standardContext).equals(rootPath(ejbModule.getFile()))) {
+                                
openEJBContextConfig.finder(ejbModule.getFinder(), ejbModule.getClassLoader());
+                                break;
+                            }
+                        }
+                    }
+
+
                     appContext = a.createApplication(contextInfo.appInfo, 
classLoader);
                     // todo add watched resources to context
 
@@ -1299,6 +1313,13 @@ public class TomcatWebAppBuilder impleme
         }
     }
 
+    private static File rootPath(final File file) {
+        if (file.isDirectory() && file.getName().equals("classes") && 
file.getParentFile() != null && 
file.getParentFile().getName().equals("WEB-INF")) {
+            return file.getParentFile().getParentFile();
+        }
+        return file;
+    }
+
     private static void deployWebServicesIfEjbCreatedHere(final AppInfo info, 
final Collection<BeanContext> beanContexts) {
         if (beanContexts == null || beanContexts.isEmpty()) {
             return;

Modified: 
tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/EmbeddedJarScanner.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/EmbeddedJarScanner.java?rev=1530319&r1=1530318&r2=1530319&view=diff
==============================================================================
--- 
tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/EmbeddedJarScanner.java
 (original)
+++ 
tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/EmbeddedJarScanner.java
 Tue Oct  8 15:54:55 2013
@@ -16,16 +16,16 @@
  */
 package org.apache.tomee.loader;
 
+import org.apache.catalina.deploy.WebXml;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.openejb.config.NewLoaderLogic;
 import org.apache.openejb.util.URLs;
+import org.apache.openejb.util.reflection.Reflections;
 import org.apache.tomcat.JarScanner;
 import org.apache.tomcat.JarScannerCallback;
 import org.apache.tomcat.util.res.StringManager;
 import org.apache.tomcat.util.scan.Constants;
-import org.apache.xbean.finder.filter.Filter;
-import org.apache.xbean.finder.filter.Filters;
 
 import javax.servlet.ServletContext;
 import java.io.File;
@@ -34,6 +34,7 @@ import java.net.JarURLConnection;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.net.URLConnection;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -62,15 +63,15 @@ public class EmbeddedJarScanner implemen
      *                      defined by {@link Constants#SKIP_JARS_PROPERTY}
      */
     @Override
-    public void scan(ServletContext context, ClassLoader classloader, 
JarScannerCallback callback, Set<String> jarsToSkip) {
+    public void scan(final ServletContext context, final ClassLoader 
classloader, final JarScannerCallback callback, final Set<String> jarsToSkip) {
 
         try {
             final org.apache.xbean.finder.UrlSet scan = 
NewLoaderLogic.applyBuiltinExcludes(new 
org.apache.xbean.finder.UrlSet(classloader).excludeJvm(), null);
 
             // scan = scan.exclude(".*/WEB-INF/lib/.*"); // doing it simply 
prevent ServletContainerInitializer to de discovered
 
-            for (URL url : scan) {
-                if (isWebInfClasses(url)) {
+            for (final URL url : scan) {
+                if (isWebInfClasses(url) && 
!"org.apache.catalina.startup.ContextConfig$FragmentJarScannerCallback".equals(callback.getClass().getName()))
 { // we need all fragments to let SCI working
                     continue;
                 }
 
@@ -81,11 +82,11 @@ public class EmbeddedJarScanner implemen
 
                 try {
                     process(callback, url);
-                } catch (IOException e) {
+                } catch (final IOException e) {
                     log.warn(sm.getString("jarScan.webinflibFail", url), e);
                 }
             }
-        } catch (IOException e) {
+        } catch (final IOException e) {
             log.warn(sm.getString("jarScan.classloaderFail", new URL[]{}), e);
         }
     }


Reply via email to