Author: rmannibucau
Date: Mon Sep 22 20:40:10 2014
New Revision: 1626889

URL: http://svn.apache.org/r1626889
Log:
TOMEE-1355 ensuring we can use jsp and resources with tomee embedded + hacking 
tomcat scanner to support surefire scanning as well

Added:
    
tomee/tomee/trunk/tomee/tomee-embedded/src/test/resources/META-INF/resources/
    
tomee/tomee/trunk/tomee/tomee-embedded/src/test/resources/META-INF/resources/index.jsp
Modified:
    
tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Main.java
    
tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/internal/StandardContextCustomizer.java
    
tomee/tomee/trunk/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/ClasspathAsWebappTest.java
    
tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomEEJarScanner.java

Modified: 
tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Main.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Main.java?rev=1626889&r1=1626888&r2=1626889&view=diff
==============================================================================
--- 
tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Main.java
 (original)
+++ 
tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Main.java
 Mon Sep 22 20:40:10 2014
@@ -33,6 +33,7 @@ public class Main {
     public static final String PATH = "path";
     public static final String CONTEXT = "context";
     public static final String DIRECTORY = "directory";
+    public static final String AS_WAR = "as-war";
 
     public static void main(final String[] args) {
         final CommandLineParser parser = new PosixParser();
@@ -50,14 +51,15 @@ public class Main {
         // run TomEE
         try {
             final Container container = new 
Container(createConfiguration(line));
+            final String[] contexts;
+            if (line.hasOption(CONTEXT)) {
+                contexts = line.getOptionValues(CONTEXT);
+            } else {
+                contexts = null;
+            }
+
+            int i = 0;
             if (line.hasOption(PATH)) {
-                final String[] contexts;
-                if (line.hasOption(CONTEXT)) {
-                    contexts = line.getOptionValues(CONTEXT);
-                } else {
-                    contexts = null;
-                }
-                int i = 0;
                 for (final String path : line.getOptionValues(PATH)) {
                     final Set<String> locations = 
ProvisioningUtil.realLocation(path);
                     for (final String location : locations) {
@@ -75,6 +77,9 @@ public class Main {
                     }
                 }
             }
+            if (line.hasOption(AS_WAR)) {
+                container.deployClasspathAsWebApp(contexts == null || i == 
contexts.length ? "" : contexts[i]);
+            }
 
             Runtime.getRuntime().addShutdownHook(new Thread() {
                 @Override

Modified: 
tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/internal/StandardContextCustomizer.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/internal/StandardContextCustomizer.java?rev=1626889&r1=1626888&r2=1626889&view=diff
==============================================================================
--- 
tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/internal/StandardContextCustomizer.java
 (original)
+++ 
tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/internal/StandardContextCustomizer.java
 Mon Sep 22 20:40:10 2014
@@ -27,10 +27,12 @@ import org.apache.openejb.config.WebModu
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.observer.Observes;
 import org.apache.openejb.util.URLs;
+import org.apache.openejb.util.reflection.Reflections;
 import org.apache.tomee.catalina.TomcatWebAppBuilder;
 
 import java.io.File;
 import java.net.URL;
+import java.util.List;
 
 public class StandardContextCustomizer {
     private final WebModule module;
@@ -52,15 +54,23 @@ public class StandardContextCustomizer {
 
         switch (event.getType()) {
             case Lifecycle.BEFORE_START_EVENT:
-                context.setResources(new StandardRoot(context));
+                final WebResourceRoot resources = new StandardRoot(context);
+                context.setResources(resources);
+
+                // move last fake folder, tomcat is broken without it so we 
can't remove it
+                final List allResources = 
List.class.cast(Reflections.get(resources, "allResources"));
+                final Object mainResources = allResources.remove(1);
+                allResources.add(mainResources);
 
-                final WebResourceRoot resources = context.getResources();
                 for (final URL url : module.getScannableUrls()) {
                     final File file = URLs.toFile(url);
+                    final String absolutePath = file.getAbsolutePath();
                     if (file.isDirectory()) {
-                        
resources.createWebResourceSet(WebResourceRoot.ResourceSetType.RESOURCE_JAR, 
"/WEB-INF/classes", file.getAbsolutePath(), "", "/");
+                        
resources.createWebResourceSet(WebResourceRoot.ResourceSetType.CLASSES_JAR, 
"/WEB-INF/classes", absolutePath, "", "/");
+                        
resources.createWebResourceSet(WebResourceRoot.ResourceSetType.RESOURCE_JAR, 
"/", absolutePath, "", "/META-INF/resources");
                     } else {
-                        
resources.createWebResourceSet(WebResourceRoot.ResourceSetType.RESOURCE_JAR, 
"/WEB-INF/lib", file.getAbsolutePath(), "", "/");
+                        
resources.createWebResourceSet(WebResourceRoot.ResourceSetType.CLASSES_JAR, 
"/WEB-INF/lib", absolutePath, "", "/");
+                        
resources.createWebResourceSet(WebResourceRoot.ResourceSetType.RESOURCE_JAR, 
"/", url, "/META-INF/resources");
                     }
                 }
                 break;

Modified: 
tomee/tomee/trunk/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/ClasspathAsWebappTest.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/ClasspathAsWebappTest.java?rev=1626889&r1=1626888&r2=1626889&view=diff
==============================================================================
--- 
tomee/tomee/trunk/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/ClasspathAsWebappTest.java
 (original)
+++ 
tomee/tomee/trunk/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/ClasspathAsWebappTest.java
 Mon Sep 22 20:40:10 2014
@@ -35,7 +35,6 @@ import javax.servlet.http.HttpServletRes
 import javax.websocket.ClientEndpoint;
 import javax.websocket.CloseReason;
 import javax.websocket.ContainerProvider;
-import javax.websocket.DeploymentException;
 import javax.websocket.OnMessage;
 import javax.websocket.OnOpen;
 import javax.websocket.Session;
@@ -48,7 +47,6 @@ import javax.ws.rs.core.Application;
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URI;
-import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.Set;
 import java.util.concurrent.CountDownLatch;
@@ -72,7 +70,9 @@ public class ClasspathAsWebappTest {
         MyInitializer.found = null;
         MyBean.VALUE = null;
         try (final Container container = new Container(
-                    new 
Configuration().http(NetworkUtil.getNextAvailablePort()))
+                    new Configuration()
+                            .http(NetworkUtil.getNextAvailablePort())
+                            .property("openejb.additional.include", "tomee-"))
                 .deployPathsAsWebapp("", 
asList(JarLocation.jarLocation(MyInitializer.class).toURI().toURL()))
                 .inject(this)) {
 
@@ -91,6 +91,13 @@ public class ClasspathAsWebappTest {
                 fail(e.getMessage());
             }
 
+            // JSP
+            try {
+                assertEquals("JSP", IO.slurp(new URL("http://localhost:"; + 
container.getConfiguration().getHttpPort() + "/?test=JSP")).trim());
+            } catch (final IOException e) {
+                fail(e.getMessage());
+            }
+
             // CDI
             assertNotNull(bean);
             assertNull(bean.value());

Added: 
tomee/tomee/trunk/tomee/tomee-embedded/src/test/resources/META-INF/resources/index.jsp
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-embedded/src/test/resources/META-INF/resources/index.jsp?rev=1626889&view=auto
==============================================================================
--- 
tomee/tomee/trunk/tomee/tomee-embedded/src/test/resources/META-INF/resources/index.jsp
 (added)
+++ 
tomee/tomee/trunk/tomee/tomee-embedded/src/test/resources/META-INF/resources/index.jsp
 Mon Sep 22 20:40:10 2014
@@ -0,0 +1,21 @@
+<%
+ /*
+  * 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.
+  */
+%>
+<%@ page session="false" %>
+${param.test}

Modified: 
tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomEEJarScanner.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomEEJarScanner.java?rev=1626889&r1=1626888&r2=1626889&view=diff
==============================================================================
--- 
tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomEEJarScanner.java
 (original)
+++ 
tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/TomEEJarScanner.java
 Mon Sep 22 20:40:10 2014
@@ -20,12 +20,22 @@
 package org.apache.tomee.loader;
 
 import org.apache.openejb.config.NewLoaderLogic;
+import org.apache.openejb.util.URLs;
 import org.apache.tomcat.JarScanFilter;
 import org.apache.tomcat.JarScanType;
+import org.apache.tomcat.JarScannerCallback;
 import org.apache.tomcat.util.scan.StandardJarScanner;
+import org.apache.xbean.finder.ClassLoaders;
 import org.apache.xbean.finder.filter.Filter;
 import org.apache.xbean.finder.filter.Filters;
 
+import javax.servlet.ServletContext;
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.util.Set;
+
 // todo: share common tld parsing, tomcat has a built in method for it, ensure 
we reuse it
 public class TomEEJarScanner extends StandardJarScanner {
     public TomEEJarScanner() {
@@ -44,6 +54,43 @@ public class TomEEJarScanner extends Sta
         }
     }
 
+    @Override
+    public void scan(final JarScanType scanType, final ServletContext context, 
final JarScannerCallback callback) {
+        super.scan(scanType, context, callback);
+        embeddedSurefireScanning(scanType, context, callback);
+    }
+
+    private void embeddedSurefireScanning(final JarScanType scanType, final 
ServletContext context, final JarScannerCallback callback) {
+        if (isScanClassPath() && 
System.getProperty("surefire.real.class.path") != null) {
+            Method process = null;
+            try {
+                final Set<URL> urls = 
ClassLoaders.findUrls(context.getClassLoader().getParent());
+                final boolean scanAllDirectories = isScanAllDirectories();
+                for (final URL url : urls) {
+                    final File cpe = URLs.toFile(url);
+                    if ((cpe.getName().endsWith(".jar") ||
+                            scanType == JarScanType.PLUGGABILITY ||
+                            scanAllDirectories) &&
+                            getJarScanFilter().check(scanType, cpe.getName())) 
{
+                        try {
+                            if (process == null) {
+                                process = 
StandardJarScanner.class.getDeclaredMethod("process", JarScanType.class, 
JarScannerCallback.class, URL.class, String.class, boolean.class);
+                                if (!process.isAccessible()) {
+                                    process.setAccessible(true);
+                                }
+                            }
+                            process.invoke(this, scanType, callback, url, 
null, true);
+                        } catch (final Exception ioe) {
+                            // no-op
+                        }
+                    }
+                }
+            } catch (final IOException e) {
+                // no-op
+            }
+        }
+    }
+
     private static class TomEEFilter implements JarScanFilter {
         private static final Filter INCLUDE = Filters.tokens("javax.faces-2.", 
"spring-security-taglibs", "spring-webmvc");
         private final JarScanFilter delegate;
@@ -62,7 +109,7 @@ public class TomEEJarScanner extends Sta
                     return false;
                 }
             }
-            if (jarName.startsWith("fleece-")) {
+            if (jarName.startsWith("johnzon-")) {
                 return false; // but we scan it in openejb scnaning
             }
             return !NewLoaderLogic.skip(jarName) && (delegate == null || 
delegate.check(jarScanType, jarName));


Reply via email to