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