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