You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2014/12/23 14:12:29 UTC
tomee git commit: let embedded http layer have a default request + a
mocked servlet context
Repository: tomee
Updated Branches:
refs/heads/develop 1491a4b49 -> 0d9d30baf
let embedded http layer have a default request + a mocked servlet context
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/0d9d30ba
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/0d9d30ba
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/0d9d30ba
Branch: refs/heads/develop
Commit: 0d9d30baff9c796825d2e1df903cc60de5ab75b9
Parents: 1491a4b
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Tue Dec 23 14:12:16 2014 +0100
Committer: Romain Manni-Bucau <rm...@apache.org>
Committed: Tue Dec 23 14:12:16 2014 +0100
----------------------------------------------------------------------
.../apache/openejb/cdi/OpenEJBLifecycle.java | 36 ++++++++++++++------
.../java/org/apache/openejb/cdi/Proxys.java | 34 ++++++++++++------
.../openejb/server/cxf/rs/CxfRSService.java | 12 -------
.../server/httpd/EmbeddedServletContext.java | 36 ++++++++++++++++++++
.../server/httpd/HttpListenerRegistry.java | 24 +++++++++----
.../openejb/server/httpd/HttpRequestImpl.java | 4 +--
tck/cdi-embedded/src/test/resources/failing.xml | 2 +-
.../tomee/catalina/TomcatWebAppBuilder.java | 4 +--
8 files changed, 107 insertions(+), 45 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/0d9d30ba/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java
index 53a56ef..6e59360 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java
@@ -54,6 +54,7 @@ import javax.enterprise.inject.spi.BeanManager;
import javax.inject.Provider;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.jsp.JspApplicationContext;
@@ -243,13 +244,16 @@ public class OpenEJBLifecycle implements ContainerLifecycle {
beanManager.getInjectionResolver().clearCaches();
if (!hasBean(beanManager, HttpServletRequest.class)) {
- beanManager.addInternalBean(new InternalBean<>(webBeansContext, HttpServletRequest.class));
+ beanManager.addInternalBean(new InternalBean<>(webBeansContext, HttpServletRequest.class, HttpServletRequest.class));
+ }
+ if (!hasBean(beanManager, ServletRequest.class)) {
+ beanManager.addInternalBean(new InternalBean<>(webBeansContext, ServletRequest.class, HttpServletRequest.class));
}
if (!hasBean(beanManager, HttpSession.class)) {
- beanManager.addInternalBean(new InternalBean<>(webBeansContext, HttpSession.class));
+ beanManager.addInternalBean(new InternalBean<>(webBeansContext, HttpSession.class, HttpSession.class));
}
if (!hasBean(beanManager, ServletContext.class)) {
- beanManager.addInternalBean(new InternalBean<>(webBeansContext, ServletContext.class));
+ beanManager.addInternalBean(new InternalBean<>(webBeansContext, ServletContext.class, ServletContext.class));
}
beanManager.getInjectionResolver().clearCaches(); // hasBean() usage can have cached several things
@@ -430,13 +434,23 @@ public class OpenEJBLifecycle implements ContainerLifecycle {
}
public static class InternalBean<T> extends BuiltInOwbBean<T> {
- private final Class<T> type;
+ private final String id;
- protected InternalBean(final WebBeansContext webBeansContext, final Class<T> type) {
- super(webBeansContext, WebBeansType.MANAGED, type,
+ protected InternalBean(final WebBeansContext webBeansContext, final Class<T> api, final Class<?> type) {
+ super(webBeansContext, WebBeansType.MANAGED, api,
new SimpleProducerFactory<T>(
- new ProviderBasedProducer<>(webBeansContext, type, new OpenEJBComponentProvider<T>(webBeansContext, type), false)));
- this.type = type;
+ new ProviderBasedProducer<>(webBeansContext, type, new OpenEJBComponentProvider(webBeansContext, type), false)));
+ this.id = "openejb#container#" + api.getName();
+ }
+
+ @Override
+ public boolean isPassivationCapable() {
+ return true;
+ }
+
+ @Override
+ protected String providedId() {
+ return id;
}
@Override
@@ -446,10 +460,10 @@ public class OpenEJBLifecycle implements ContainerLifecycle {
}
private static class OpenEJBComponentProvider<T> implements Provider<T>, Serializable {
- private Class<T> type;
+ private Class<?> type;
private transient WebBeansContext webBeansContext;
- public OpenEJBComponentProvider(final WebBeansContext webBeansContext, final Class<T> type) {
+ public OpenEJBComponentProvider(final WebBeansContext webBeansContext, final Class<?> type) {
this.webBeansContext = webBeansContext;
this.type = type;
}
@@ -459,7 +473,7 @@ public class OpenEJBLifecycle implements ContainerLifecycle {
if (webBeansContext == null) {
webBeansContext = WebBeansContext.currentInstance();
}
- return SystemInstance.get().getComponent(type);
+ return (T) SystemInstance.get().getComponent(type);
}
Object readResolve() throws ObjectStreamException {
http://git-wip-us.apache.org/repos/asf/tomee/blob/0d9d30ba/container/openejb-core/src/main/java/org/apache/openejb/cdi/Proxys.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/Proxys.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/Proxys.java
index a78824f..f1a7de4 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/Proxys.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/Proxys.java
@@ -26,14 +26,14 @@ import java.lang.reflect.Proxy;
// some helper reused accross several modules
public final class Proxys {
- public static <T> T threadLocalProxy(final Class<T> type, final ThreadLocal<? extends T> threadLocal) {
+ public static <T> T threadLocalProxy(final Class<T> type, final ThreadLocal<? extends T> threadLocal, final T defaultValue) {
return (T) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
- new Class<?>[] { type, Serializable.class }, new ThreadLocalHandler<>(threadLocal));
+ new Class<?>[] { type, Serializable.class }, new ThreadLocalHandler<>(threadLocal, defaultValue));
}
- public static HttpSession threadLocalRequestSessionProxy(final ThreadLocal<? extends HttpServletRequest> threadLocal) {
+ public static HttpSession threadLocalRequestSessionProxy(final ThreadLocal<? extends HttpServletRequest> threadLocal, final HttpSession defaultValue) {
return (HttpSession) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
- new Class<?>[] { HttpSession.class, Serializable.class }, new ThreadLocalSessionFromRequestHandler(threadLocal));
+ new Class<?>[] { HttpSession.class, Serializable.class }, new ThreadLocalSessionFromRequestHandler(threadLocal, defaultValue));
}
public static <T> T handlerProxy(final Class<T> type, final InvocationHandler raw) {
@@ -47,15 +47,21 @@ public final class Proxys {
private static final class ThreadLocalSessionFromRequestHandler implements InvocationHandler {
private final ThreadLocal<? extends HttpServletRequest> holder;
+ private final HttpSession defaultValue;
- public ThreadLocalSessionFromRequestHandler(final ThreadLocal<? extends HttpServletRequest> threadLocal) {
- holder = threadLocal;
+ public ThreadLocalSessionFromRequestHandler(final ThreadLocal<? extends HttpServletRequest> threadLocal, final HttpSession defaultValue) {
+ this.holder = threadLocal;
+ this.defaultValue = defaultValue;
}
@Override
public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
try {
- return method.invoke(holder.get().getSession(), args);
+ final HttpServletRequest request = holder.get();
+ if (request == null) {
+ return method.invoke(defaultValue, args);
+ }
+ return method.invoke(request.getSession(), args);
} catch (final InvocationTargetException ite) {
throw ite.getCause();
}
@@ -63,16 +69,22 @@ public final class Proxys {
}
private static final class ThreadLocalHandler<T> implements InvocationHandler {
- private final ThreadLocal<T> holder;
+ private final ThreadLocal<? extends T> holder;
+ private final T defaultValue;
- public ThreadLocalHandler(final ThreadLocal<T> threadLocal) {
- holder = threadLocal;
+ public ThreadLocalHandler(final ThreadLocal<? extends T> threadLocal, final T defaultValue) {
+ this.holder = threadLocal;
+ this.defaultValue = defaultValue;
}
@Override
public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable {
try {
- return method.invoke(holder.get(), args);
+ T obj = holder.get();
+ if (obj == null) {
+ obj = defaultValue;
+ }
+ return method.invoke(obj, args);
} catch (final InvocationTargetException ite) {
throw ite.getCause();
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/0d9d30ba/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java
----------------------------------------------------------------------
diff --git a/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java b/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java
index d456a68..801a8a6 100644
--- a/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java
+++ b/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java
@@ -48,7 +48,6 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.container.ResourceContext;
import javax.ws.rs.container.ResourceInfo;
-import javax.ws.rs.core.Configuration;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Request;
@@ -113,9 +112,6 @@ public class CxfRSService extends RESTService {
if (!hasBean(beanManagerImpl, UriInfo.class)) {
beanManagerImpl.addInternalBean(new ContextBean<>(UriInfo.class, ThreadLocalContextManager.URI_INFO));
}
- if (!hasBean(beanManagerImpl, HttpServletRequest.class)) {
- beanManagerImpl.addInternalBean(new ContextBean<>(HttpServletRequest.class, ThreadLocalContextManager.HTTP_SERVLET_REQUEST));
- }
if (!hasBean(beanManagerImpl, HttpServletResponse.class)) {
beanManagerImpl.addInternalBean(new ContextBean<>(HttpServletResponse.class, ThreadLocalContextManager.HTTP_SERVLET_RESPONSE));
}
@@ -125,14 +121,6 @@ public class CxfRSService extends RESTService {
if (!hasBean(beanManagerImpl, Request.class)) {
beanManagerImpl.addInternalBean(new ContextBean<>(Request.class, ThreadLocalContextManager.REQUEST));
}
- /* HttpServletRequest impl it
- if (!hasBean(beanManagerImpl, ServletRequest.class)) {
- beanManagerImpl.addInternalBean(new ContextBean<>(ServletRequest.class, ThreadLocalContextManager.SERVLET_REQUEST));
- }
- */
- if (!hasBean(beanManagerImpl, ServletContext.class)) {
- beanManagerImpl.addInternalBean(new ContextBean<>(ServletContext.class, ThreadLocalContextManager.SERVLET_CONTEXT));
- }
if (!hasBean(beanManagerImpl, ServletConfig.class)) {
beanManagerImpl.addInternalBean(new ContextBean<>(ServletConfig.class, ThreadLocalContextManager.SERVLET_CONFIG));
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/0d9d30ba/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EmbeddedServletContext.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EmbeddedServletContext.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EmbeddedServletContext.java
new file mode 100644
index 0000000..f5ca282
--- /dev/null
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EmbeddedServletContext.java
@@ -0,0 +1,36 @@
+/**
+ * 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.server.httpd;
+
+import org.apache.webbeans.web.lifecycle.test.MockServletContext;
+
+public class EmbeddedServletContext extends MockServletContext {
+ @Override
+ public int getMajorVersion() {
+ return 3;
+ }
+
+ @Override
+ public int getEffectiveMajorVersion() {
+ return 3;
+ }
+
+ @Override
+ public String getVirtualServerName() {
+ return "openejb";
+ }
+}
http://git-wip-us.apache.org/repos/asf/tomee/blob/0d9d30ba/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java
index 249dc4e..dc7439e 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java
@@ -16,16 +16,18 @@
*/
package org.apache.openejb.server.httpd;
-import org.apache.openejb.loader.SystemInstance;
-
import org.apache.openejb.cdi.Proxys;
+import org.apache.openejb.loader.SystemInstance;
+import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
+import java.net.URI;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
+import java.util.StringTokenizer;
/**
* @version $Revision$ $Date$
@@ -38,13 +40,22 @@ public class HttpListenerRegistry implements HttpListener {
public HttpListenerRegistry() {
final SystemInstance systemInstance = SystemInstance.get();
+ HttpRequestImpl mockRequest = null;
+ try {
+ mockRequest = new HttpRequestImpl(new URI("http://mock/"));
+ mockRequest.parseURI(new StringTokenizer("mock\n")); // will do http://mock/mock, we don't really care
+ } catch (final Exception e) {
+ // no-op
+ }
if (systemInstance.getComponent(HttpServletRequest.class) == null) {
- systemInstance.setComponent(HttpServletRequest.class, Proxys.threadLocalProxy(HttpServletRequest.class, request));
+ systemInstance.setComponent(HttpServletRequest.class, Proxys.threadLocalProxy(HttpServletRequest.class, request, mockRequest));
}
if (systemInstance.getComponent(HttpSession.class) == null) {
- systemInstance.setComponent(javax.servlet.http.HttpSession.class, Proxys.threadLocalRequestSessionProxy(request));
+ systemInstance.setComponent(javax.servlet.http.HttpSession.class, Proxys.threadLocalRequestSessionProxy(request, mockRequest.getSession()));
+ }
+ if (systemInstance.getComponent(ServletContext.class) == null) { // a poor impl but at least we set something
+ systemInstance.setComponent(ServletContext.class, new EmbeddedServletContext());
}
- // servlet context is unknown in this module
}
@Override
@@ -88,8 +99,9 @@ public class HttpListenerRegistry implements HttpListener {
}
} finally {
if (currentFL == null) {
- currentFilterListener.remove();
+ currentFilterListener.set(null);
}
+ this.request.set(null);
}
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/0d9d30ba/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
index 9b5350d..10320a9 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
@@ -267,7 +267,7 @@ public class HttpRequestImpl implements HttpRequest {
@Override
public StringBuffer getRequestURL() {
- return new StringBuffer(uri.getScheme() + "://" + uri.getHost() + ":" + uri.getPort() + uri.getRawPath());
+ return new StringBuffer(uri.getScheme() + "://" + uri.getAuthority() + uri.getRawPath());
}
@Override
@@ -471,7 +471,7 @@ public class HttpRequestImpl implements HttpRequest {
* @param lineParts a StringTokenizer of the URI
* @throws java.io.IOException if an exeption is thrown
*/
- private void parseURI(StringTokenizer lineParts) throws IOException {
+ public void parseURI(StringTokenizer lineParts) throws IOException {
String token;
try {
token = lineParts.nextToken();
http://git-wip-us.apache.org/repos/asf/tomee/blob/0d9d30ba/tck/cdi-embedded/src/test/resources/failing.xml
----------------------------------------------------------------------
diff --git a/tck/cdi-embedded/src/test/resources/failing.xml b/tck/cdi-embedded/src/test/resources/failing.xml
index 0e22900..0416d96 100644
--- a/tck/cdi-embedded/src/test/resources/failing.xml
+++ b/tck/cdi-embedded/src/test/resources/failing.xml
@@ -18,7 +18,7 @@
<suite name="CDI TCK" verbose="0">
<test name="CDI TCK">
<classes>
- <class name="org.jboss.cdi.tck.tests.implementation.builtin.broken.transaction.UserTransactionInvalidInjectionTest" />
+ <class name="org.jboss.cdi.tck.tests.implementation.builtin.servlet.ServletContainerBuiltinBeanTest" />
</classes>
</test>
</suite>
http://git-wip-us.apache.org/repos/asf/tomee/blob/0d9d30ba/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
index 62eb28b..2ef5e92 100644
--- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
+++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
@@ -326,10 +326,10 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare
private void setComponentsUsedByCDI() {
final SystemInstance systemInstance = SystemInstance.get();
if (systemInstance.getComponent(HttpServletRequest.class) == null) {
- systemInstance.setComponent(HttpServletRequest.class, Proxys.threadLocalProxy(HttpServletRequest.class, OpenEJBSecurityListener.requests));
+ systemInstance.setComponent(HttpServletRequest.class, Proxys.threadLocalProxy(HttpServletRequest.class, OpenEJBSecurityListener.requests, null));
}
if (systemInstance.getComponent(HttpSession.class) == null) {
- systemInstance.setComponent(javax.servlet.http.HttpSession.class, Proxys.threadLocalRequestSessionProxy(OpenEJBSecurityListener.requests));
+ systemInstance.setComponent(javax.servlet.http.HttpSession.class, Proxys.threadLocalRequestSessionProxy(OpenEJBSecurityListener.requests, null));
}
if (systemInstance.getComponent(ServletContext.class) == null) {
systemInstance.setComponent(ServletContext.class, Proxys.handlerProxy(ServletContext.class, new ServletContextHandler()));