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 2014/03/11 06:23:20 UTC

[1/2] git commit: DELTASPIKE-414 Refactored RequestResponseHolder to allow to bind request/response individually

Repository: deltaspike
Updated Branches:
  refs/heads/master 0316dab80 -> 6f37b12f0


DELTASPIKE-414 Refactored RequestResponseHolder to allow to bind request/response individually


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

Branch: refs/heads/master
Commit: 360a69460cb4384554e9c3fa4060ec2b62f2bc00
Parents: 0316dab
Author: Christian Kaltepoth <ch...@apache.org>
Authored: Mon Mar 10 07:55:32 2014 +0100
Committer: Christian Kaltepoth <ch...@apache.org>
Committed: Mon Mar 10 07:55:32 2014 +0100

----------------------------------------------------------------------
 .../servlet/impl/produce/RequestResponse.java   | 63 -----------------
 .../impl/produce/RequestResponseHolder.java     | 72 +++++++++++---------
 .../produce/RequestResponseHolderFilter.java    |  6 +-
 .../impl/produce/ServletObjectProducer.java     | 10 +--
 4 files changed, 50 insertions(+), 101 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/deltaspike/blob/360a6946/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/RequestResponse.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/RequestResponse.java b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/RequestResponse.java
deleted file mode 100644
index 9e554d6..0000000
--- a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/RequestResponse.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * 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.produce;
-
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-
-/**
- * Simple value objects that holds a request/response pair.
- */
-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/360a6946/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/RequestResponseHolder.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/RequestResponseHolder.java b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/RequestResponseHolder.java
index b7dd459..3660d9f 100644
--- a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/RequestResponseHolder.java
+++ b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/RequestResponseHolder.java
@@ -22,69 +22,79 @@ import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 
 /**
- * The {@link RequestResponseHolder} holds {@link RequestResponse} objects in a {@link ThreadLocal}.
+ * Utility class which is used to bind the {@link ServletRequest} and {@link ServletResponse} to the current thread.
+ * 
+ * @param <Type>
+ *            {@link ServletRequest} or {@link ServletResponse}
  */
-class RequestResponseHolder
+class RequestResponseHolder<Type>
 {
 
-    private static final ThreadLocal<RequestResponse> requestResponseThreadLocal = new ThreadLocal<RequestResponse>();
+    /**
+     * Instance for storing the {@link ServletRequest}
+     */
+    static final RequestResponseHolder<ServletRequest> REQUEST = new RequestResponseHolder<ServletRequest>();
+
+    /**
+     * Instance for storing the {@link ServletResponse}
+     */
+    static final RequestResponseHolder<ServletResponse> RESPONSE = new RequestResponseHolder<ServletResponse>();
+
+    private final ThreadLocal<Type> threadLocal = new ThreadLocal<Type>();
 
     private RequestResponseHolder()
     {
-        // no instance creation allowed
+        // hide constructor
     }
 
     /**
-     * Binds the a request/response pair to the current thread.
+     * Binds the request or response to the current thread.
      * 
-     * @param request
-     *            The request, must not be <code>null</code>
-     * @param response
-     *            The response, must not be <code>null</code>
+     * @param instance
+     *            The request/response
+     * @throws IllegalStateException
+     *             if there is already an instance bound to the thread
      */
-    static void bind(ServletRequest request, ServletResponse response)
+    void bind(Type instance)
     {
-        bind(new RequestResponse(request, response));
+        if (isBound())
+        {
+            throw new IllegalStateException("There is already an instance bound to this thread.");
+        }
+        threadLocal.set(instance);
     }
 
     /**
-     * Binds the a request/response pair to the current thread.
-     * 
-     * @param pair
-     *            The request/response pair, must not be <code>null</code>
+     * Returns <code>true</code> if there is already an instance bound to the thread
      */
-    static void bind(RequestResponse pair)
+    boolean isBound()
     {
-        if (requestResponseThreadLocal.get() != null)
-        {
-            throw new IllegalStateException("There is already an instance stored for this thread.");
-        }
-        requestResponseThreadLocal.set(pair);
+        return threadLocal.get() != null;
     }
 
     /**
-     * Releases the stored request/response pair for the current thread.
+     * Release the instance bound to the current thread
      */
-    static void release()
+    void release()
     {
-        requestResponseThreadLocal.remove();
+        threadLocal.remove();
     }
 
     /**
-     * Retrieves the request/response pair associated with the current thread.
+     * Retrieve the request/response bound to the current thread.
      * 
-     * @return The request/response pair, never <code>null</code>
+     * @return instance bound to the thread
      * @throws IllegalStateException
-     *             if no pair is associated with the thread
+     *             if there is no instance bound to the thread
      */
-    static RequestResponse get()
+    Type get()
     {
-        RequestResponse requestResponse = requestResponseThreadLocal.get();
-        if (requestResponse == null)
+        Type instance = threadLocal.get();
+        if (instance == null)
         {
             throw new IllegalStateException("Attempt to access the request/response without an active HTTP request");
         }
-        return requestResponse;
+        return instance;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/360a6946/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/RequestResponseHolderFilter.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/RequestResponseHolderFilter.java b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/RequestResponseHolderFilter.java
index 29ac2cb..f63e67d 100644
--- a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/RequestResponseHolderFilter.java
+++ b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/RequestResponseHolderFilter.java
@@ -44,14 +44,16 @@ public class RequestResponseHolderFilter implements Filter
             ServletException
     {
 
-        RequestResponseHolder.bind(request, response);
+        RequestResponseHolder.REQUEST.bind(request);
+        RequestResponseHolder.RESPONSE.bind(response);
         try
         {
             chain.doFilter(request, response);
         }
         finally
         {
-            RequestResponseHolder.release();
+            RequestResponseHolder.REQUEST.release();
+            RequestResponseHolder.RESPONSE.release();
         }
 
     }

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/360a6946/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/ServletObjectProducer.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/ServletObjectProducer.java b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/ServletObjectProducer.java
index f74f3f3..3f9ca66 100644
--- a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/ServletObjectProducer.java
+++ b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/ServletObjectProducer.java
@@ -62,7 +62,7 @@ public class ServletObjectProducer
     @RequestScoped
     public ServletRequest getServletRequest()
     {
-        return RequestResponseHolder.get().getRequest();
+        return RequestResponseHolder.REQUEST.get();
     }
 
     @Produces
@@ -71,7 +71,7 @@ public class ServletObjectProducer
     @RequestScoped
     public HttpServletRequest getHttpServletRequest()
     {
-        ServletRequest request = RequestResponseHolder.get().getRequest();
+        ServletRequest request = RequestResponseHolder.REQUEST.get();
         if (request instanceof HttpServletRequest)
         {
             return (HttpServletRequest) request;
@@ -84,7 +84,7 @@ public class ServletObjectProducer
     @RequestScoped
     public ServletResponse getServletResponse()
     {
-        return RequestResponseHolder.get().getResponse();
+        return RequestResponseHolder.RESPONSE.get();
     }
 
     @Produces
@@ -93,7 +93,7 @@ public class ServletObjectProducer
     @RequestScoped
     public HttpServletResponse getHttpServletResponse()
     {
-        ServletResponse response = RequestResponseHolder.get().getResponse();
+        ServletResponse response = RequestResponseHolder.RESPONSE.get();
         if (response instanceof HttpServletResponse)
         {
             return (HttpServletResponse) response;
@@ -106,7 +106,7 @@ public class ServletObjectProducer
     @SessionScoped
     public HttpSession getHttpSession()
     {
-        ServletRequest request = RequestResponseHolder.get().getRequest();
+        ServletRequest request = RequestResponseHolder.REQUEST.get();
         if (request instanceof HttpServletRequest)
         {
             return ((HttpServletRequest) request).getSession(true);


[2/2] git commit: DELTASPIKE-414 Added a ServletRequestListener to bind the request to the current thread

Posted by ch...@apache.org.
DELTASPIKE-414 Added a ServletRequestListener to bind the request to the current thread


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

Branch: refs/heads/master
Commit: 6f37b12f0e4dc52cd6e4a57ff249c48a0ed59c59
Parents: 360a694
Author: Christian Kaltepoth <ch...@apache.org>
Authored: Mon Mar 10 17:26:28 2014 +0100
Committer: Christian Kaltepoth <ch...@apache.org>
Committed: Mon Mar 10 17:26:28 2014 +0100

----------------------------------------------------------------------
 .../produce/RequestResponseHolderFilter.java    | 30 +++++--
 .../produce/RequestResponseHolderListener.java  | 42 ++++++++++
 .../main/resources/META-INF/web-fragment.xml    |  5 ++
 .../producer/EarlyRequestInjectionFilter.java   | 69 ++++++++++++++++
 .../producer/EarlyRequestInjectionTest.java     | 87 ++++++++++++++++++++
 5 files changed, 228 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6f37b12f/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/RequestResponseHolderFilter.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/RequestResponseHolderFilter.java b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/RequestResponseHolderFilter.java
index f63e67d..9f55cb0 100644
--- a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/RequestResponseHolderFilter.java
+++ b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/RequestResponseHolderFilter.java
@@ -44,16 +44,36 @@ public class RequestResponseHolderFilter implements Filter
             ServletException
     {
 
-        RequestResponseHolder.REQUEST.bind(request);
-        RequestResponseHolder.RESPONSE.bind(response);
+        /*
+         * Typically the request is bound to the thread in RequestResponseHolderListener. But as this listener was added
+         * after the initial release of the Servlet module, the filter will also do it if necessary.
+         */
+        final boolean alreadyBound = RequestResponseHolder.REQUEST.isBound();
+        if (!alreadyBound)
+        {
+            RequestResponseHolder.REQUEST.bind(request);
+        }
+
         try
         {
-            chain.doFilter(request, response);
+
+            RequestResponseHolder.RESPONSE.bind(response);
+            try
+            {
+                chain.doFilter(request, response);
+            }
+            finally
+            {
+                RequestResponseHolder.RESPONSE.release();
+            }
+
         }
         finally
         {
-            RequestResponseHolder.REQUEST.release();
-            RequestResponseHolder.RESPONSE.release();
+            if (!alreadyBound)
+            {
+                RequestResponseHolder.REQUEST.release();
+            }
         }
 
     }

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6f37b12f/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/RequestResponseHolderListener.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/RequestResponseHolderListener.java b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/RequestResponseHolderListener.java
new file mode 100644
index 0000000..a913436
--- /dev/null
+++ b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/RequestResponseHolderListener.java
@@ -0,0 +1,42 @@
+/*
+ * 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.produce;
+
+import javax.servlet.ServletRequestEvent;
+import javax.servlet.ServletRequestListener;
+
+/**
+ * This class stores the ServletRequest in the {@link RequestResponseHolder}.
+ */
+public class RequestResponseHolderListener implements ServletRequestListener
+{
+
+    @Override
+    public void requestInitialized(ServletRequestEvent sre)
+    {
+        RequestResponseHolder.REQUEST.bind(sre.getServletRequest());
+    }
+
+    @Override
+    public void requestDestroyed(ServletRequestEvent sre)
+    {
+        RequestResponseHolder.REQUEST.release();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6f37b12f/deltaspike/modules/servlet/impl/src/main/resources/META-INF/web-fragment.xml
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/src/main/resources/META-INF/web-fragment.xml b/deltaspike/modules/servlet/impl/src/main/resources/META-INF/web-fragment.xml
index 4eff1d1..bffa282 100644
--- a/deltaspike/modules/servlet/impl/src/main/resources/META-INF/web-fragment.xml
+++ b/deltaspike/modules/servlet/impl/src/main/resources/META-INF/web-fragment.xml
@@ -45,6 +45,11 @@
         <listener-class>org.apache.deltaspike.servlet.impl.produce.ServletContextHolderListener</listener-class>
     </listener>
 
+    <listener>
+        <display-name>RequestResponseHolderListener</display-name>
+        <listener-class>org.apache.deltaspike.servlet.impl.produce.RequestResponseHolderListener</listener-class>
+    </listener>
+
     <filter>
         <display-name>RequestResponseHolderFilter</display-name>
         <filter-name>RequestResponseHolderFilter</filter-name>

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6f37b12f/deltaspike/modules/servlet/impl/src/test/java/org/apache/deltaspike/test/servlet/impl/producer/EarlyRequestInjectionFilter.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/src/test/java/org/apache/deltaspike/test/servlet/impl/producer/EarlyRequestInjectionFilter.java b/deltaspike/modules/servlet/impl/src/test/java/org/apache/deltaspike/test/servlet/impl/producer/EarlyRequestInjectionFilter.java
new file mode 100644
index 0000000..f60eecd
--- /dev/null
+++ b/deltaspike/modules/servlet/impl/src/test/java/org/apache/deltaspike/test/servlet/impl/producer/EarlyRequestInjectionFilter.java
@@ -0,0 +1,69 @@
+/*
+ * 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.inject.Inject;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.deltaspike.core.api.common.DeltaSpike;
+
+public class EarlyRequestInjectionFilter implements Filter
+{
+
+    @Inject
+    @DeltaSpike
+    private HttpServletRequest injectedRequest;
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
+            ServletException
+    {
+
+        // check if the request has been injected
+        if (injectedRequest != null && injectedRequest.getContextPath() != null)
+        {
+            ((HttpServletResponse) response).setHeader("X-DS-Request-Injected", "true");
+        }
+
+        chain.doFilter(request, response);
+
+    }
+
+    @Override
+    public void init(FilterConfig filterConfig) throws ServletException
+    {
+        // nothing to do
+    }
+
+    @Override
+    public void destroy()
+    {
+        // nothing to do
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/6f37b12f/deltaspike/modules/servlet/impl/src/test/java/org/apache/deltaspike/test/servlet/impl/producer/EarlyRequestInjectionTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/src/test/java/org/apache/deltaspike/test/servlet/impl/producer/EarlyRequestInjectionTest.java b/deltaspike/modules/servlet/impl/src/test/java/org/apache/deltaspike/test/servlet/impl/producer/EarlyRequestInjectionTest.java
new file mode 100644
index 0000000..274a8e0
--- /dev/null
+++ b/deltaspike/modules/servlet/impl/src/test/java/org/apache/deltaspike/test/servlet/impl/producer/EarlyRequestInjectionTest.java
@@ -0,0 +1,87 @@
+/*
+ * 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 java.net.URL;
+
+import org.apache.deltaspike.test.category.WebProfileCategory;
+import org.apache.deltaspike.test.servlet.impl.util.ArchiveUtils;
+import org.apache.http.Header;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.DefaultHttpClient;
+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;
+
+/**
+ * Verifies that request injection into filters work as expected.
+ * 
+ * @see https://issues.apache.org/jira/browse/DELTASPIKE-414
+ */
+@RunWith(Arquillian.class)
+@Category(WebProfileCategory.class)
+public class EarlyRequestInjectionTest
+{
+
+    @Deployment(testable = false)
+    public static WebArchive getDeployment()
+    {
+        return ShrinkWrap.create(WebArchive.class, EarlyRequestInjectionTest.class.getSimpleName() + ".war")
+                .addAsLibraries(ArchiveUtils.getDeltaSpikeCoreAndServletModuleArchive())
+                .addAsResource("META-INF/web-fragment.xml", "META-INF/web-fragment.xml")
+                .addAsWebInfResource(new StringAsset("<beans/>"), "beans.xml")
+                .addClass(EarlyRequestInjectionFilter.class)
+                .addAsWebResource(new StringAsset("foobar"), "foobar.txt")
+                .setWebXML(new StringAsset(
+                        Descriptors.create(WebAppDescriptor.class)
+                                .filter(EarlyRequestInjectionFilter.class, "/*")
+                                .exportAsString()));
+
+    }
+
+    @ArquillianResource
+    private URL contextPath;
+
+    @Test
+    public void shouldInjectRequestIntoFilters() throws Exception
+    {
+
+        String url = new URL(contextPath, "foobar.txt").toString();
+        HttpResponse response = new DefaultHttpClient().execute(new HttpGet(url));
+
+        assertEquals(200, response.getStatusLine().getStatusCode());
+
+        Header[] verificationHeader = response.getHeaders("X-DS-Request-Injected");
+        assertEquals(1, verificationHeader.length);
+        assertEquals("true", verificationHeader[0].getValue());
+
+    }
+
+}