You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltaspike.apache.org by ch...@apache.org on 2013/06/13 07:02:55 UTC

[06/10] git commit: Added support for injection of standard servlet objects

Added support for injection of standard servlet objects


Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/cab0ba0e
Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/cab0ba0e
Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/cab0ba0e

Branch: refs/heads/master
Commit: cab0ba0e3b8f5df46cd035e92a7d232edfc5625e
Parents: 28e5c71
Author: Christian Kaltepoth <ch...@kaltepoth.de>
Authored: Fri May 24 07:22:52 2013 +0200
Committer: Christian Kaltepoth <ch...@kaltepoth.de>
Committed: Thu Jun 13 06:53:29 2013 +0200

----------------------------------------------------------------------
 deltaspike/modules/servlet/impl/pom.xml         |   7 ++
 .../servlet/impl/RequestResponse.java           |  65 ++++++++++
 .../servlet/impl/RequestResponseHolder.java     |  92 ++++++++++++++
 .../servlet/impl/ServletEventBridgeFilter.java  |  27 +++-
 .../servlet/impl/ServletObjectProducer.java     | 119 ++++++++++++++++++
 .../producer/ServletObjectInjectionBean.java    | 124 +++++++++++++++++++
 .../producer/ServletObjectInjectionServlet.java |  75 +++++++++++
 .../producer/ServletObjectInjectionTest.java    | 112 +++++++++++++++++
 8 files changed, 615 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/deltaspike/blob/cab0ba0e/deltaspike/modules/servlet/impl/pom.xml
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/pom.xml b/deltaspike/modules/servlet/impl/pom.xml
index ee2ae40..01c9616 100644
--- a/deltaspike/modules/servlet/impl/pom.xml
+++ b/deltaspike/modules/servlet/impl/pom.xml
@@ -55,6 +55,13 @@
         </dependency>
 
         <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest-library</artifactId>
+            <version>1.3</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
             <groupId>org.apache.httpcomponents</groupId>
             <artifactId>httpclient</artifactId>
             <version>4.2.5</version>

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/cab0ba0e/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/RequestResponse.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/RequestResponse.java b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/RequestResponse.java
new file mode 100644
index 0000000..16b3d28
--- /dev/null
+++ b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/RequestResponse.java
@@ -0,0 +1,65 @@
+/*
+ * 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.deltaspike.servlet.impl;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+/**
+ * Simple value objects that holds a request/response pair.
+ * 
+ * @author Christian Kaltepoth
+ */
+class RequestResponse
+{
+
+    private final ServletRequest request;
+    private final ServletResponse response;
+
+    /**
+     * Creates a new instance of this class.
+     * 
+     * @param request
+     *            the request
+     * @param response
+     *            the response
+     */
+    RequestResponse(ServletRequest request, ServletResponse response)
+    {
+        this.request = request;
+        this.response = response;
+    }
+
+    /**
+     * Returns the request stored in this object.
+     */
+    ServletRequest getRequest()
+    {
+        return request;
+    }
+
+    /**
+     * Returns the response stored in this object.
+     */
+    ServletResponse getResponse()
+    {
+        return response;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/cab0ba0e/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/RequestResponseHolder.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/RequestResponseHolder.java b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/RequestResponseHolder.java
new file mode 100644
index 0000000..add047c
--- /dev/null
+++ b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/RequestResponseHolder.java
@@ -0,0 +1,92 @@
+/*
+ * 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.deltaspike.servlet.impl;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+/**
+ * The {@link RequestResponseHolder} holds {@link RequestResponse} objects in a {@link ThreadLocal}.
+ * 
+ * @author Christian Kaltepoth
+ */
+class RequestResponseHolder
+{
+
+    private static final ThreadLocal<RequestResponse> requestResponseThreadLocal = new ThreadLocal<RequestResponse>();
+
+    private RequestResponseHolder()
+    {
+        // no instance creation allowed
+    }
+
+    /**
+     * Binds the a request/response pair to the current thread.
+     * 
+     * @param request
+     *            The request, must not be <code>null</code>
+     * @param response
+     *            The response, must not be <code>null</code>
+     */
+    static void bind(ServletRequest request, ServletResponse response)
+    {
+        bind(new RequestResponse(request, response));
+    }
+
+    /**
+     * Binds the a request/response pair to the current thread.
+     * 
+     * @param pair
+     *            The request/response pair, must not be <code>null</code>
+     */
+    static void bind(RequestResponse pair)
+    {
+        if (requestResponseThreadLocal.get() != null)
+        {
+            throw new IllegalStateException("There is already an instance stored for this thread.");
+        }
+        requestResponseThreadLocal.set(pair);
+    }
+
+    /**
+     * Releases the stored request/response pair for the current thread.
+     */
+    static void release()
+    {
+        requestResponseThreadLocal.remove();
+    }
+
+    /**
+     * Retrieves the request/response pair associated with the current thread.
+     * 
+     * @return The request/response pair, never <code>null</code>
+     * @throws IllegalStateException
+     *             if no pair is associated with the thread
+     */
+    static RequestResponse get()
+    {
+        RequestResponse requestResponse = requestResponseThreadLocal.get();
+        if (requestResponse == null)
+        {
+            throw new IllegalStateException("Attempt to access the request/response without an active HTTP request");
+        }
+        return requestResponse;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/cab0ba0e/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/ServletEventBridgeFilter.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/ServletEventBridgeFilter.java b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/ServletEventBridgeFilter.java
index 90cadd3..182f185 100644
--- a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/ServletEventBridgeFilter.java
+++ b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/ServletEventBridgeFilter.java
@@ -48,17 +48,32 @@ public class ServletEventBridgeFilter extends EventEmitter implements Filter
             ServletException
     {
 
-        fireEvent(request, WebLiteral.INSTANCE, InitializedLiteral.INSTANCE);
-        fireEvent(response, WebLiteral.INSTANCE, InitializedLiteral.INSTANCE);
-
+        // store the request/response in a holder to access it later
+        RequestResponseHolder.bind(request, response);
         try
         {
-            chain.doFilter(request, response);
+
+            // fire @Initialized events
+            fireEvent(request, WebLiteral.INSTANCE, InitializedLiteral.INSTANCE);
+            fireEvent(response, WebLiteral.INSTANCE, InitializedLiteral.INSTANCE);
+
+            try
+            {
+                chain.doFilter(request, response);
+            }
+            finally
+            {
+                // fire @Destroyed events
+                fireEvent(request, WebLiteral.INSTANCE, DestroyedLiteral.INSTANCE);
+                fireEvent(response, WebLiteral.INSTANCE, DestroyedLiteral.INSTANCE);
+            }
+
         }
+
+        // release in an outer finally block to ensure the ThreadLocal is cleaned correctly
         finally
         {
-            fireEvent(request, WebLiteral.INSTANCE, DestroyedLiteral.INSTANCE);
-            fireEvent(response, WebLiteral.INSTANCE, DestroyedLiteral.INSTANCE);
+            RequestResponseHolder.release();
         }
 
     }

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/cab0ba0e/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/ServletObjectProducer.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/ServletObjectProducer.java b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/ServletObjectProducer.java
new file mode 100644
index 0000000..7421c49
--- /dev/null
+++ b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/ServletObjectProducer.java
@@ -0,0 +1,119 @@
+/*
+ * 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.deltaspike.servlet.impl;
+
+import java.security.Principal;
+
+import javax.enterprise.context.RequestScoped;
+import javax.enterprise.context.SessionScoped;
+import javax.enterprise.inject.Produces;
+import javax.enterprise.inject.Typed;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.apache.deltaspike.servlet.api.Web;
+
+/**
+ * Producer for standard servlet objects. All objects are produced with the {@link Web} qualifier. Currently the
+ * following objects are supported:
+ * 
+ * <ul>
+ * <li>{@link ServletRequest}</li>
+ * <li>{@link HttpServletRequest}</li>
+ * <li>{@link ServletResponse}</li>
+ * <li>{@link HttpServletResponse}</li>
+ * <li>{@link HttpSession}</li>
+ * <li>{@link Principal}</li>
+ * </ul>
+ * 
+ * @author Christian Kaltepoth
+ */
+public class ServletObjectProducer
+{
+
+    @Produces
+    @Web
+    @RequestScoped
+    public ServletRequest getServletRequest()
+    {
+        return RequestResponseHolder.get().getRequest();
+    }
+
+    @Produces
+    @Typed(HttpServletRequest.class)
+    @Web
+    @RequestScoped
+    public HttpServletRequest getHttpServletRequest()
+    {
+        ServletRequest request = RequestResponseHolder.get().getRequest();
+        if (request instanceof HttpServletRequest)
+        {
+            return (HttpServletRequest) request;
+        }
+        throw new IllegalStateException("The current request is not a HttpServletRequest");
+    }
+
+    @Produces
+    @Web
+    @RequestScoped
+    public ServletResponse getServletResponse()
+    {
+        return RequestResponseHolder.get().getResponse();
+    }
+
+    @Produces
+    @Typed(HttpServletResponse.class)
+    @Web
+    @RequestScoped
+    public HttpServletResponse getHttpServletResponse()
+    {
+        ServletResponse response = RequestResponseHolder.get().getResponse();
+        if (response instanceof HttpServletResponse)
+        {
+            return (HttpServletResponse) response;
+        }
+        throw new IllegalStateException("The current response is not a HttpServletResponse");
+    }
+
+    @Produces
+    @Web
+    @SessionScoped
+    public HttpSession getHttpSession()
+    {
+        ServletRequest request = RequestResponseHolder.get().getRequest();
+        if (request instanceof HttpServletRequest)
+        {
+            return ((HttpServletRequest) request).getSession(true);
+        }
+        throw new IllegalStateException(
+                "Cannot produce HttpSession because the current request is not a HttpServletRequest");
+    }
+
+    @Produces
+    @Web
+    @RequestScoped
+    public Principal getPrincipal()
+    {
+        return getHttpServletRequest().getUserPrincipal();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/cab0ba0e/deltaspike/modules/servlet/impl/src/test/java/org/apache/deltaspike/test/servlet/impl/producer/ServletObjectInjectionBean.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/src/test/java/org/apache/deltaspike/test/servlet/impl/producer/ServletObjectInjectionBean.java b/deltaspike/modules/servlet/impl/src/test/java/org/apache/deltaspike/test/servlet/impl/producer/ServletObjectInjectionBean.java
new file mode 100644
index 0000000..9922176
--- /dev/null
+++ b/deltaspike/modules/servlet/impl/src/test/java/org/apache/deltaspike/test/servlet/impl/producer/ServletObjectInjectionBean.java
@@ -0,0 +1,124 @@
+/*
+ * 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.deltaspike.test.servlet.impl.producer;
+
+import java.security.Principal;
+
+import javax.inject.Inject;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.apache.deltaspike.servlet.api.Web;
+
+/**
+ * Simple CDI beans with various injection points for servlet ojbects.
+ * 
+ * @author Christian Kaltepoth
+ */
+public class ServletObjectInjectionBean
+{
+
+    @Web
+    @Inject
+    private ServletRequest servletRequest;
+
+    @Web
+    @Inject
+    private HttpServletRequest httpServletRequest;
+
+    @Web
+    @Inject
+    private ServletResponse servletResponse;
+
+    @Web
+    @Inject
+    private HttpServletResponse httpServletResponse;
+
+    @Web
+    @Inject
+    private HttpSession httpSession;
+
+    @Web
+    @Inject
+    private Principal principal;
+
+    public ServletRequest getServletRequest()
+    {
+        return servletRequest;
+    }
+
+    public void setServletRequest(ServletRequest servletRequest)
+    {
+        this.servletRequest = servletRequest;
+    }
+
+    public HttpServletRequest getHttpServletRequest()
+    {
+        return httpServletRequest;
+    }
+
+    public void setHttpServletRequest(HttpServletRequest httpServletRequest)
+    {
+        this.httpServletRequest = httpServletRequest;
+    }
+
+    public ServletResponse getServletResponse()
+    {
+        return servletResponse;
+    }
+
+    public void setServletResponse(ServletResponse servletResponse)
+    {
+        this.servletResponse = servletResponse;
+    }
+
+    public HttpServletResponse getHttpServletResponse()
+    {
+        return httpServletResponse;
+    }
+
+    public void setHttpServletResponse(HttpServletResponse httpServletResponse)
+    {
+        this.httpServletResponse = httpServletResponse;
+    }
+
+    public HttpSession getHttpSession()
+    {
+        return httpSession;
+    }
+
+    public void setHttpSession(HttpSession httpSession)
+    {
+        this.httpSession = httpSession;
+    }
+
+    public Principal getPrincipal()
+    {
+        return principal;
+    }
+
+    public void setPrincipal(Principal principal)
+    {
+        this.principal = principal;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/cab0ba0e/deltaspike/modules/servlet/impl/src/test/java/org/apache/deltaspike/test/servlet/impl/producer/ServletObjectInjectionServlet.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/src/test/java/org/apache/deltaspike/test/servlet/impl/producer/ServletObjectInjectionServlet.java b/deltaspike/modules/servlet/impl/src/test/java/org/apache/deltaspike/test/servlet/impl/producer/ServletObjectInjectionServlet.java
new file mode 100644
index 0000000..5b0af1e
--- /dev/null
+++ b/deltaspike/modules/servlet/impl/src/test/java/org/apache/deltaspike/test/servlet/impl/producer/ServletObjectInjectionServlet.java
@@ -0,0 +1,75 @@
+/*
+ * 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.deltaspike.test.servlet.impl.producer;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.deltaspike.core.api.provider.BeanProvider;
+
+/**
+ * Simple servlet that logs details about the servlet objects injected into {@link ServletObjectInjectionBean}.
+ * 
+ * @author Christian Kaltepoth
+ */
+public class ServletObjectInjectionServlet extends HttpServlet
+{
+
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+    {
+
+        /*
+         * The ServletObjectInjectionBean is manually looked up using BeanProvider because not all containers may
+         * support injection into servlets.
+         */
+        ServletObjectInjectionBean bean =
+                BeanProvider.getContextualReference(ServletObjectInjectionBean.class);
+
+        ServletOutputStream stream = resp.getOutputStream();
+        logDetails(stream, "ServletRequest", bean.getServletRequest());
+        logDetails(stream, "HttpServletRequest", bean.getHttpServletRequest());
+        logDetails(stream, "ServletResponse", bean.getServletResponse());
+        logDetails(stream, "HttpServletResponse", bean.getHttpServletResponse());
+        logDetails(stream, "HttpSession", bean.getHttpSession());
+        logDetails(stream, "Principal", bean.getPrincipal());
+
+    }
+
+    /**
+     * Writes debug information to the supplied {@link ServletOutputStream}.
+     */
+    private void logDetails(ServletOutputStream stream, String name, Object obj)
+            throws IOException
+    {
+        stream.print("[");
+        stream.print(name);
+        stream.print("=");
+        stream.print(obj != null ? "OK" : "null");
+        stream.print("]\n");
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/cab0ba0e/deltaspike/modules/servlet/impl/src/test/java/org/apache/deltaspike/test/servlet/impl/producer/ServletObjectInjectionTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/src/test/java/org/apache/deltaspike/test/servlet/impl/producer/ServletObjectInjectionTest.java b/deltaspike/modules/servlet/impl/src/test/java/org/apache/deltaspike/test/servlet/impl/producer/ServletObjectInjectionTest.java
new file mode 100644
index 0000000..34f8fa9
--- /dev/null
+++ b/deltaspike/modules/servlet/impl/src/test/java/org/apache/deltaspike/test/servlet/impl/producer/ServletObjectInjectionTest.java
@@ -0,0 +1,112 @@
+/*
+ * 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.deltaspike.test.servlet.impl.producer;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+import java.net.URL;
+
+import org.apache.deltaspike.test.category.WebProfileCategory;
+import org.apache.deltaspike.test.servlet.impl.Deployments;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.util.EntityUtils;
+import org.hamcrest.Matchers;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.arquillian.test.api.ArquillianResource;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.StringAsset;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+import org.jboss.shrinkwrap.descriptor.api.Descriptors;
+import org.jboss.shrinkwrap.descriptor.api.spec.servlet.web.WebAppDescriptor;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+
+/**
+ * Test which validates that servlet objects are correctly injected.
+ * 
+ * @author Christian Kaltepoth
+ */
+@RunWith(Arquillian.class)
+@Category(WebProfileCategory.class)
+public class ServletObjectInjectionTest
+{
+
+    @Deployment(testable = false)
+    public static WebArchive getDeployment()
+    {
+        return ShrinkWrap.create(WebArchive.class, "test.war")
+                .addAsLibraries(Deployments.getDeltaSpikeCoreArchives())
+                .addAsLibraries(Deployments.getDeltaSpikeServletArchives())
+                .addClass(ServletObjectInjectionBean.class)
+                .addClass(ServletObjectInjectionServlet.class)
+                .addAsWebInfResource(new StringAsset("<beans/>"), "beans.xml")
+                .setWebXML(new StringAsset(
+                        Descriptors.create(WebAppDescriptor.class)
+                                .servlet(ServletObjectInjectionServlet.class, "/servlet-object-injecetion")
+                                .exportAsString()));
+
+    }
+
+    @ArquillianResource
+    private URL contextPath;
+
+    @Test
+    public void shouldInjectServletRequest() throws Exception
+    {
+        assertThat(responseFromServlet(), Matchers.containsString("[ServletRequest=OK]"));
+    }
+
+    @Test
+    public void shouldInjectHttpServletRequest() throws Exception
+    {
+        assertThat(responseFromServlet(), Matchers.containsString("[HttpServletRequest=OK]"));
+    }
+
+    @Test
+    public void shouldInjectServletResponse() throws Exception
+    {
+        assertThat(responseFromServlet(), Matchers.containsString("[ServletResponse=OK]"));
+    }
+
+    @Test
+    public void shouldInjectHttpServletResponse() throws Exception
+    {
+        assertThat(responseFromServlet(), Matchers.containsString("[HttpServletResponse=OK]"));
+    }
+
+    @Test
+    public void shouldInjectHttpSession() throws Exception
+    {
+        assertThat(responseFromServlet(), Matchers.containsString("[HttpSession=OK]"));
+    }
+
+    private String responseFromServlet() throws Exception
+    {
+        String url = new URL(contextPath, "servlet-object-injecetion").toString();
+        HttpResponse response = new DefaultHttpClient().execute(new HttpGet(url));
+        assertEquals(200, response.getStatusLine().getStatusCode());
+        return EntityUtils.toString(response.getEntity());
+    }
+
+}