Author: rmannibucau
Date: Sat Oct 22 18:30:58 2016
New Revision: 1766222

URL: http://svn.apache.org/viewvc?rev=1766222&view=rev
Log:
reuse our finder even for SCI

Added:
    
openwebbeans/microwave/trunk/microwave-core/src/test/java/org/superbiz/app/Init.java
    openwebbeans/microwave/trunk/microwave-core/src/test/resources/META-INF/
    
openwebbeans/microwave/trunk/microwave-core/src/test/resources/META-INF/services/
    
openwebbeans/microwave/trunk/microwave-core/src/test/resources/META-INF/services/javax.servlet.ServletContainerInitializer
Modified:
    
openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/catalina/startup/MicrowaveContextConfig.java
    
openwebbeans/microwave/trunk/microwave-core/src/test/java/org/apache/microwave/MicrowaveTest.java

Modified: 
openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/catalina/startup/MicrowaveContextConfig.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/catalina/startup/MicrowaveContextConfig.java?rev=1766222&r1=1766221&r2=1766222&view=diff
==============================================================================
--- 
openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/catalina/startup/MicrowaveContextConfig.java
 (original)
+++ 
openwebbeans/microwave/trunk/microwave-core/src/main/java/org/apache/catalina/startup/MicrowaveContextConfig.java
 Sat Oct 22 18:30:58 2016
@@ -24,24 +24,30 @@ import org.apache.microwave.logging.tomc
 import org.apache.tomcat.util.descriptor.web.WebXml;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.corespi.scanner.xbean.CdiArchive;
+import org.apache.webbeans.corespi.scanner.xbean.OwbAnnotationFinder;
 import org.apache.webbeans.web.scanner.WebScannerService;
 
+import javax.servlet.ServletContainerInitializer;
+import javax.servlet.annotation.HandlesTypes;
 import javax.servlet.annotation.WebFilter;
 import javax.servlet.annotation.WebListener;
 import javax.servlet.annotation.WebServlet;
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.annotation.Annotation;
 import java.lang.reflect.Modifier;
 import java.net.URL;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Stream;
 
 public class MicrowaveContextConfig extends ContextConfig {
     private final Microwave.Builder configuration;
     private final Map<String, Collection<Class<?>>> webClasses = new 
HashMap<>();
+    private OwbAnnotationFinder finder;
 
     public MicrowaveContextConfig(final Microwave.Builder configuration) {
         this.configuration = configuration;
@@ -49,6 +55,11 @@ public class MicrowaveContextConfig exte
 
     @Override
     protected void webConfig() {
+        if (!configuration.isTomcatScanning()) {
+            super.webConfig();
+            return;
+        }
+
         // eagerly start CDI to scan only once and not twice (tomcat+CDI)
         final ClassLoader loader = context.getLoader().getClassLoader(); // 
should already be started at that point
         final Thread thread = Thread.currentThread();
@@ -57,9 +68,11 @@ public class MicrowaveContextConfig exte
         try {
             final WebScannerService scannerService = 
WebScannerService.class.cast(WebBeansContext.getInstance().getScannerService());
             scannerService.scan();
-            final CdiArchive archive = 
CdiArchive.class.cast(scannerService.getFinder().getArchive());
+            finder = scannerService.getFinder();
+            finder.link();
+            final CdiArchive archive = 
CdiArchive.class.cast(finder.getArchive());
             Stream.of(WebServlet.class, WebFilter.class, WebListener.class)
-                    .forEach(marker -> 
scannerService.getFinder().findAnnotatedClasses(marker).stream()
+                    .forEach(marker -> 
finder.findAnnotatedClasses(marker).stream()
                             .filter(c -> 
!Modifier.isAbstract(c.getModifiers()) && Modifier.isPublic(c.getModifiers()))
                             .forEach(webComponent -> 
webClasses.computeIfAbsent(
                                     archive.classesByUrl().entrySet().stream()
@@ -73,6 +86,7 @@ public class MicrowaveContextConfig exte
             super.webConfig();
         } finally {
             webClasses.clear();
+            finder = null;
         }
     }
 
@@ -80,26 +94,64 @@ public class MicrowaveContextConfig exte
     protected void processAnnotationsWebResource(final WebResource 
webResource, final WebXml fragment,
                                                  final boolean 
handlesTypesOnly,
                                                  final Map<String, 
JavaClassCacheEntry> javaClassCache) {
-        if (configuration.isTomcatScanning()) {
+        if (configuration.isTomcatScanning()) { // TODO: use our finder
             super.processAnnotationsWebResource(webResource, fragment, 
handlesTypesOnly, javaClassCache);
         }
     }
 
     @Override
     protected void processAnnotationsUrl(final URL url, final WebXml fragment, 
final boolean handlesTypesOnly,
-                                         final Map<String, 
JavaClassCacheEntry> javaClassCache) {
-        if (configuration.isTomcatScanning()) {
-            final Collection<Class<?>> classes = 
webClasses.remove(url.toExternalForm());
-            if (classes != null && !classes.isEmpty()) {
-                final ClassLoader loader = 
Thread.currentThread().getContextClassLoader();
-                classes.forEach(c -> {
-                    try (final InputStream stream = 
loader.getResourceAsStream(c.getName().replace('.', '/') + ".class")) {
-                        super.processAnnotationsStream(stream, fragment, 
handlesTypesOnly, javaClassCache);
-                    } catch (final IOException e) {
-                        new 
LogFacade(MicrowaveContextConfig.class.getName()).error("Can't parse " + c);
+                                         final Map<String, 
JavaClassCacheEntry> javaClassCache) { // use our finder
+        if (!configuration.isTomcatScanning()) {
+            return;
+        }
+
+        final Collection<Class<?>> classes = 
webClasses.remove(url.toExternalForm());
+        if (classes != null && !classes.isEmpty()) {
+            final ClassLoader loader = 
Thread.currentThread().getContextClassLoader();
+            classes.forEach(c -> {
+                try (final InputStream stream = 
loader.getResourceAsStream(c.getName().replace('.', '/') + ".class")) {
+                    super.processAnnotationsStream(stream, fragment, 
handlesTypesOnly, javaClassCache);
+                } catch (final IOException e) {
+                    new 
LogFacade(MicrowaveContextConfig.class.getName()).error("Can't parse " + c);
+                }
+            });
+        }
+    }
+
+    @Override
+    protected void processServletContainerInitializers() { // use our finder
+        if (!configuration.isTomcatScanning()) {
+            return;
+        }
+
+        try {
+            new 
WebappServiceLoader<ServletContainerInitializer>(context).load(ServletContainerInitializer.class).forEach(sci
 -> {
+                final Set<Class<?>> classes = new HashSet<>();
+                initializerClassMap.put(sci, classes);
+
+                final HandlesTypes ht;
+                try {
+                    ht = sci.getClass().getAnnotation(HandlesTypes.class);
+                } catch (final Exception | NoClassDefFoundError e) {
+                    return;
+                }
+                if (ht == null) {
+                    return;
+                }
+                Stream.of(ht.value()).forEach(t -> {
+                    if (t.isAnnotation()) {
+                        final Class<? extends Annotation> annotation = 
Class.class.cast(t);
+                        
finder.findAnnotatedClasses(annotation).forEach(classes::add);
+                    } else if (t.isInterface()) {
+                        finder.findImplementations(t).forEach(classes::add);
+                    } else {
+                        finder.findSubclasses(t).forEach(classes::add);
                     }
                 });
-            }
+            });
+        } catch (final IOException e) {
+            ok = false;
         }
     }
 }

Modified: 
openwebbeans/microwave/trunk/microwave-core/src/test/java/org/apache/microwave/MicrowaveTest.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/microwave/trunk/microwave-core/src/test/java/org/apache/microwave/MicrowaveTest.java?rev=1766222&r1=1766221&r2=1766222&view=diff
==============================================================================
--- 
openwebbeans/microwave/trunk/microwave-core/src/test/java/org/apache/microwave/MicrowaveTest.java
 (original)
+++ 
openwebbeans/microwave/trunk/microwave-core/src/test/java/org/apache/microwave/MicrowaveTest.java
 Sat Oct 22 18:30:58 2016
@@ -88,6 +88,9 @@ public class MicrowaveTest {
         try (final Microwave microwave = new Microwave(new 
Microwave.Builder().randomHttpPort()).bake()) {
             assertEquals("simple", IOUtils.toString(new 
URL("http://localhost:"; + microwave.getConfiguration().getHttpPort() + 
"/api/test")));
             assertEquals("simplefiltertrue", IOUtils.toString(new 
URL("http://localhost:"; + microwave.getConfiguration().getHttpPort() + 
"/filter")));
+            assertEquals(
+                    "sci:" + Endpoint.class.getName() + RsApp.class.getName(),
+                    IOUtils.toString(new URL("http://localhost:"; + 
microwave.getConfiguration().getHttpPort() + "/sci")));
         } catch (final IOException e) {
             fail(e.getMessage());
         }

Added: 
openwebbeans/microwave/trunk/microwave-core/src/test/java/org/superbiz/app/Init.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/microwave/trunk/microwave-core/src/test/java/org/superbiz/app/Init.java?rev=1766222&view=auto
==============================================================================
--- 
openwebbeans/microwave/trunk/microwave-core/src/test/java/org/superbiz/app/Init.java
 (added)
+++ 
openwebbeans/microwave/trunk/microwave-core/src/test/java/org/superbiz/app/Init.java
 Sat Oct 22 18:30:58 2016
@@ -0,0 +1,60 @@
+/*
+ * 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.superbiz.app;
+
+import javax.servlet.DispatcherType;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+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 javax.ws.rs.Path;
+import javax.ws.rs.core.Application;
+import java.io.IOException;
+import java.util.EnumSet;
+import java.util.Set;
+
+import static java.util.stream.Collectors.joining;
+
+@HandlesTypes({Path.class, Application.class})
+public class Init implements ServletContainerInitializer {
+    @Override
+    public void onStartup(final Set<Class<?>> c, final ServletContext ctx) 
throws ServletException {
+        ctx.addFilter("sci", new Filter() {
+            @Override
+            public void init(final FilterConfig filterConfig) throws 
ServletException {
+                // no-op
+            }
+
+            @Override
+            public void doFilter(final ServletRequest request, final 
ServletResponse response, final FilterChain chain) throws IOException, 
ServletException {
+                response.getWriter().write("sci:" + 
c.stream().map(Class::getName).sorted().collect(joining()));
+            }
+
+            @Override
+            public void destroy() {
+                // no-op
+            }
+        }).addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), 
false, "/sci");
+    }
+}

Added: 
openwebbeans/microwave/trunk/microwave-core/src/test/resources/META-INF/services/javax.servlet.ServletContainerInitializer
URL: 
http://svn.apache.org/viewvc/openwebbeans/microwave/trunk/microwave-core/src/test/resources/META-INF/services/javax.servlet.ServletContainerInitializer?rev=1766222&view=auto
==============================================================================
--- 
openwebbeans/microwave/trunk/microwave-core/src/test/resources/META-INF/services/javax.servlet.ServletContainerInitializer
 (added)
+++ 
openwebbeans/microwave/trunk/microwave-core/src/test/resources/META-INF/services/javax.servlet.ServletContainerInitializer
 Sat Oct 22 18:30:58 2016
@@ -0,0 +1 @@
+org.superbiz.app.Init


Reply via email to