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:51 UTC

[02/10] git commit: Refactored servlet module code into multiple filters and listeners

Refactored servlet module code into multiple filters and listeners


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

Branch: refs/heads/master
Commit: 7df63a86762f9f0688a1d9699ccaae5612bfd11a
Parents: 9fc325a
Author: Christian Kaltepoth <ch...@kaltepoth.de>
Authored: Tue Jun 11 07:07:19 2013 +0200
Committer: Christian Kaltepoth <ch...@kaltepoth.de>
Committed: Thu Jun 13 06:53:29 2013 +0200

----------------------------------------------------------------------
 .../deltaspike/servlet/impl/EventEmitter.java   |  43 -------
 .../servlet/impl/RequestResponse.java           |  65 ----------
 .../servlet/impl/RequestResponseHolder.java     |  92 -------------
 .../servlet/impl/ServletContextHolder.java      | 105 ---------------
 .../servlet/impl/ServletEventBridgeFilter.java  |  87 -------------
 .../impl/ServletEventBridgeListener.java        |  69 ----------
 .../servlet/impl/ServletObjectProducer.java     | 128 -------------------
 .../impl/event/EventBridgeContextListener.java  |  48 +++++++
 .../servlet/impl/event/EventBridgeFilter.java   |  76 +++++++++++
 .../impl/event/EventBridgeSessionListener.java  |  47 +++++++
 .../servlet/impl/event/EventEmitter.java        |  43 +++++++
 .../servlet/impl/produce/RequestResponse.java   |  65 ++++++++++
 .../impl/produce/RequestResponseHolder.java     |  92 +++++++++++++
 .../produce/RequestResponseHolderFilter.java    |  67 ++++++++++
 .../impl/produce/ServletContextHolder.java      | 105 +++++++++++++++
 .../produce/ServletContextHolderListener.java   |  44 +++++++
 .../impl/produce/ServletObjectProducer.java     | 128 +++++++++++++++++++
 .../main/resources/META-INF/web-fragment.xml    |  33 ++++-
 18 files changed, 742 insertions(+), 595 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/deltaspike/blob/7df63a86/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/EventEmitter.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/EventEmitter.java b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/EventEmitter.java
deleted file mode 100644
index a9af77e..0000000
--- a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/EventEmitter.java
+++ /dev/null
@@ -1,43 +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;
-
-import java.lang.annotation.Annotation;
-
-import org.apache.deltaspike.core.api.provider.BeanManagerProvider;
-
-/**
- * Base class for classes which send servlet events to the CDI event bus. This class uses {@link BeanManagerProvider} to
- * obtain the BeanManager.
- * 
- * @author Christian Kaltepoth
- */
-abstract class EventEmitter
-{
-
-    protected void fireEvent(Object event, Annotation... qualifier)
-    {
-        /*
-         * No need to cache the BeanManager reference because the providers already does this on a context class loader
-         * level.
-         */
-        BeanManagerProvider.getInstance().getBeanManager().fireEvent(event, qualifier);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/7df63a86/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
deleted file mode 100644
index 16b3d28..0000000
--- a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/RequestResponse.java
+++ /dev/null
@@ -1,65 +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;
-
-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/7df63a86/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
deleted file mode 100644
index add047c..0000000
--- a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/RequestResponseHolder.java
+++ /dev/null
@@ -1,92 +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;
-
-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/7df63a86/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/ServletContextHolder.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/ServletContextHolder.java b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/ServletContextHolder.java
deleted file mode 100644
index e590cc7..0000000
--- a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/ServletContextHolder.java
+++ /dev/null
@@ -1,105 +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;
-
-import java.util.Collections;
-import java.util.Map;
-import java.util.WeakHashMap;
-import java.util.logging.Logger;
-
-import javax.servlet.ServletContext;
-
-/**
- * This class holds the {@link ServletContext} for each context class loader.
- * 
- * @author Christian Kaltepoth
- */
-class ServletContextHolder
-{
-
-    private static final Logger log = Logger.getLogger(ServletContextHolder.class.getName());
-
-    private static final Map<ClassLoader, ServletContext> CONTEXT_BY_CLASSLOADER = Collections.synchronizedMap(
-            new WeakHashMap<ClassLoader, ServletContext>());
-
-    private ServletContextHolder()
-    {
-        // hide constructor
-    }
-
-    /**
-     * Bind the supplied {@link ServletContext} to the current context class loader. Subsequent calls to {@link #get()}
-     * with the same context class loader will always return this context.
-     * 
-     * @param servletContext
-     *            The context to bind to the context class loader
-     */
-    static void bind(ServletContext servletContext)
-    {
-        ClassLoader classLoader = getContextClassLoader();
-        ServletContext existingContext = CONTEXT_BY_CLASSLOADER.put(classLoader, servletContext);
-        if (existingContext != null)
-        {
-            throw new IllegalArgumentException("There is already a ServletContext associated with class loader: "
-                    + classLoader);
-        }
-    }
-
-    /**
-     * Returns the {@link ServletContext} associated with the current context class loader.
-     * 
-     * @throws IllegalStateException
-     *             if there is no {@link ServletContext} stored for the current context class loader
-     */
-    static ServletContext get()
-    {
-        ClassLoader classLoader = getContextClassLoader();
-        ServletContext servletContext = CONTEXT_BY_CLASSLOADER.get(classLoader);
-        if (servletContext == null)
-        {
-            throw new IllegalStateException("There is no ServletContext stored for class loader: " + classLoader);
-        }
-        return servletContext;
-    }
-
-    /**
-     * Releases the {@link ServletContext} from the current context class loader. Subsequent calls to {@link #get()}
-     * with the same context class loader will return <code>null</code>.
-     */
-    static void release()
-    {
-        ClassLoader classLoader = getContextClassLoader();
-        ServletContext removedContext = CONTEXT_BY_CLASSLOADER.remove(classLoader);
-        if (removedContext == null)
-        {
-            log.warning("Cannot find a ServletContext to release for class loader: " + classLoader);
-        }
-    }
-
-    private static ClassLoader getContextClassLoader()
-    {
-        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-        if (classLoader == null)
-        {
-            throw new IllegalStateException("Unable to obtain the context class loader for the current thread");
-        }
-        return classLoader;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/7df63a86/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
deleted file mode 100644
index 182f185..0000000
--- a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/ServletEventBridgeFilter.java
+++ /dev/null
@@ -1,87 +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;
-
-import java.io.IOException;
-
-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 org.apache.deltaspike.servlet.api.literal.DestroyedLiteral;
-import org.apache.deltaspike.servlet.api.literal.InitializedLiteral;
-import org.apache.deltaspike.servlet.api.literal.WebLiteral;
-
-/**
- * @author Christian Kaltepoth
- */
-public class ServletEventBridgeFilter extends EventEmitter implements Filter
-{
-
-    @Override
-    public void init(FilterConfig config) throws ServletException
-    {
-        // nothing yet
-    }
-
-    @Override
-    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
-            ServletException
-    {
-
-        // store the request/response in a holder to access it later
-        RequestResponseHolder.bind(request, response);
-        try
-        {
-
-            // 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
-        {
-            RequestResponseHolder.release();
-        }
-
-    }
-
-    @Override
-    public void destroy()
-    {
-        // nothing yet
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/7df63a86/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/ServletEventBridgeListener.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/ServletEventBridgeListener.java b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/ServletEventBridgeListener.java
deleted file mode 100644
index 21f7450..0000000
--- a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/ServletEventBridgeListener.java
+++ /dev/null
@@ -1,69 +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;
-
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
-import javax.servlet.http.HttpSessionEvent;
-import javax.servlet.http.HttpSessionListener;
-
-import org.apache.deltaspike.servlet.api.literal.DestroyedLiteral;
-import org.apache.deltaspike.servlet.api.literal.InitializedLiteral;
-import org.apache.deltaspike.servlet.api.literal.WebLiteral;
-
-/**
- * This class listens for various servlet events and forwards them to the CDI event bus.
- * 
- * @author Christian Kaltepoth
- */
-public class ServletEventBridgeListener extends EventEmitter implements ServletContextListener, HttpSessionListener
-{
-
-    @Override
-    public void contextInitialized(ServletContextEvent sce)
-    {
-        ServletContextHolder.bind(sce.getServletContext());
-        fireEvent(sce.getServletContext(), WebLiteral.INSTANCE, InitializedLiteral.INSTANCE);
-    }
-
-    @Override
-    public void contextDestroyed(ServletContextEvent sce)
-    {
-        try
-        {
-            fireEvent(sce.getServletContext(), WebLiteral.INSTANCE, DestroyedLiteral.INSTANCE);
-        }
-        finally
-        {
-            ServletContextHolder.release();
-        }
-    }
-
-    @Override
-    public void sessionCreated(HttpSessionEvent se)
-    {
-        fireEvent(se.getSession(), WebLiteral.INSTANCE, InitializedLiteral.INSTANCE);
-    }
-
-    @Override
-    public void sessionDestroyed(HttpSessionEvent se)
-    {
-        fireEvent(se.getSession(), WebLiteral.INSTANCE, DestroyedLiteral.INSTANCE);
-    }
-}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/7df63a86/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
deleted file mode 100644
index 07d1798..0000000
--- a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/ServletObjectProducer.java
+++ /dev/null
@@ -1,128 +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;
-
-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.ServletContext;
-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 ServletContext}</li>
- * <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
-    public ServletContext getServletContext()
-    {
-        return ServletContextHolder.get();
-    }
-
-    @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/7df63a86/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/event/EventBridgeContextListener.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/event/EventBridgeContextListener.java b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/event/EventBridgeContextListener.java
new file mode 100644
index 0000000..a993bce
--- /dev/null
+++ b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/event/EventBridgeContextListener.java
@@ -0,0 +1,48 @@
+/*
+ * 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.event;
+
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+
+import org.apache.deltaspike.servlet.api.literal.DestroyedLiteral;
+import org.apache.deltaspike.servlet.api.literal.InitializedLiteral;
+import org.apache.deltaspike.servlet.api.literal.WebLiteral;
+
+/**
+ * This class listens for servlet context events and forwards them to the CDI event bus.
+ * 
+ * @author Christian Kaltepoth
+ */
+public class EventBridgeContextListener extends EventEmitter implements ServletContextListener
+{
+
+    @Override
+    public void contextInitialized(ServletContextEvent sce)
+    {
+        fireEvent(sce.getServletContext(), WebLiteral.INSTANCE, InitializedLiteral.INSTANCE);
+    }
+
+    @Override
+    public void contextDestroyed(ServletContextEvent sce)
+    {
+        fireEvent(sce.getServletContext(), WebLiteral.INSTANCE, DestroyedLiteral.INSTANCE);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/7df63a86/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/event/EventBridgeFilter.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/event/EventBridgeFilter.java b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/event/EventBridgeFilter.java
new file mode 100644
index 0000000..79db1a7
--- /dev/null
+++ b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/event/EventBridgeFilter.java
@@ -0,0 +1,76 @@
+/*
+ * 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.event;
+
+import java.io.IOException;
+
+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 org.apache.deltaspike.servlet.api.literal.DestroyedLiteral;
+import org.apache.deltaspike.servlet.api.literal.InitializedLiteral;
+import org.apache.deltaspike.servlet.api.literal.WebLiteral;
+
+/**
+ * This filter sends events to the CDI event bus when requests and responses get created and destroyed.
+ * 
+ * @author Christian Kaltepoth
+ */
+public class EventBridgeFilter extends EventEmitter implements Filter
+{
+
+    @Override
+    public void init(FilterConfig config) throws ServletException
+    {
+        // nothing yet
+    }
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
+            ServletException
+    {
+
+        // 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);
+        }
+
+    }
+
+    @Override
+    public void destroy()
+    {
+        // nothing yet
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/7df63a86/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/event/EventBridgeSessionListener.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/event/EventBridgeSessionListener.java b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/event/EventBridgeSessionListener.java
new file mode 100644
index 0000000..691f3b9
--- /dev/null
+++ b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/event/EventBridgeSessionListener.java
@@ -0,0 +1,47 @@
+/*
+ * 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.event;
+
+import javax.servlet.http.HttpSessionEvent;
+import javax.servlet.http.HttpSessionListener;
+
+import org.apache.deltaspike.servlet.api.literal.DestroyedLiteral;
+import org.apache.deltaspike.servlet.api.literal.InitializedLiteral;
+import org.apache.deltaspike.servlet.api.literal.WebLiteral;
+
+/**
+ * This class listens for HTTP session events and forwards them to the CDI event bus.
+ * 
+ * @author Christian Kaltepoth
+ */
+public class EventBridgeSessionListener extends EventEmitter implements HttpSessionListener
+{
+
+    @Override
+    public void sessionCreated(HttpSessionEvent se)
+    {
+        fireEvent(se.getSession(), WebLiteral.INSTANCE, InitializedLiteral.INSTANCE);
+    }
+
+    @Override
+    public void sessionDestroyed(HttpSessionEvent se)
+    {
+        fireEvent(se.getSession(), WebLiteral.INSTANCE, DestroyedLiteral.INSTANCE);
+    }
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/7df63a86/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/event/EventEmitter.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/event/EventEmitter.java b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/event/EventEmitter.java
new file mode 100644
index 0000000..899e3f7
--- /dev/null
+++ b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/event/EventEmitter.java
@@ -0,0 +1,43 @@
+/*
+ * 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.event;
+
+import java.lang.annotation.Annotation;
+
+import org.apache.deltaspike.core.api.provider.BeanManagerProvider;
+
+/**
+ * Base class for classes which send servlet events to the CDI event bus. This class uses {@link BeanManagerProvider} to
+ * obtain the BeanManager.
+ * 
+ * @author Christian Kaltepoth
+ */
+abstract class EventEmitter
+{
+
+    protected void fireEvent(Object event, Annotation... qualifier)
+    {
+        /*
+         * No need to cache the BeanManager reference because the providers already does this on a context class loader
+         * level.
+         */
+        BeanManagerProvider.getInstance().getBeanManager().fireEvent(event, qualifier);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/7df63a86/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
new file mode 100644
index 0000000..fa257cb
--- /dev/null
+++ b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/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.produce;
+
+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/7df63a86/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
new file mode 100644
index 0000000..3996dda
--- /dev/null
+++ b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/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.produce;
+
+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/7df63a86/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
new file mode 100644
index 0000000..932875c
--- /dev/null
+++ b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/RequestResponseHolderFilter.java
@@ -0,0 +1,67 @@
+/*
+ * 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 java.io.IOException;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+/**
+ * This filter stores the current request and response in the {@link RequestResponseHolder}.
+ * 
+ * @author Christian Kaltepoth
+ */
+public class RequestResponseHolderFilter implements Filter
+{
+
+    @Override
+    public void init(FilterConfig config) throws ServletException
+    {
+        // nothing yet
+    }
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
+            ServletException
+    {
+
+        RequestResponseHolder.bind(request, response);
+        try
+        {
+            chain.doFilter(request, response);
+        }
+        finally
+        {
+            RequestResponseHolder.release();
+        }
+
+    }
+
+    @Override
+    public void destroy()
+    {
+        // nothing yet
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/7df63a86/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/ServletContextHolder.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/ServletContextHolder.java b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/ServletContextHolder.java
new file mode 100644
index 0000000..14044d8
--- /dev/null
+++ b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/ServletContextHolder.java
@@ -0,0 +1,105 @@
+/*
+ * 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 java.util.Collections;
+import java.util.Map;
+import java.util.WeakHashMap;
+import java.util.logging.Logger;
+
+import javax.servlet.ServletContext;
+
+/**
+ * This class holds the {@link ServletContext} for each context class loader.
+ * 
+ * @author Christian Kaltepoth
+ */
+class ServletContextHolder
+{
+
+    private static final Logger log = Logger.getLogger(ServletContextHolder.class.getName());
+
+    private static final Map<ClassLoader, ServletContext> CONTEXT_BY_CLASSLOADER = Collections.synchronizedMap(
+            new WeakHashMap<ClassLoader, ServletContext>());
+
+    private ServletContextHolder()
+    {
+        // hide constructor
+    }
+
+    /**
+     * Bind the supplied {@link ServletContext} to the current context class loader. Subsequent calls to {@link #get()}
+     * with the same context class loader will always return this context.
+     * 
+     * @param servletContext
+     *            The context to bind to the context class loader
+     */
+    static void bind(ServletContext servletContext)
+    {
+        ClassLoader classLoader = getContextClassLoader();
+        ServletContext existingContext = CONTEXT_BY_CLASSLOADER.put(classLoader, servletContext);
+        if (existingContext != null)
+        {
+            throw new IllegalArgumentException("There is already a ServletContext associated with class loader: "
+                    + classLoader);
+        }
+    }
+
+    /**
+     * Returns the {@link ServletContext} associated with the current context class loader.
+     * 
+     * @throws IllegalStateException
+     *             if there is no {@link ServletContext} stored for the current context class loader
+     */
+    static ServletContext get()
+    {
+        ClassLoader classLoader = getContextClassLoader();
+        ServletContext servletContext = CONTEXT_BY_CLASSLOADER.get(classLoader);
+        if (servletContext == null)
+        {
+            throw new IllegalStateException("There is no ServletContext stored for class loader: " + classLoader);
+        }
+        return servletContext;
+    }
+
+    /**
+     * Releases the {@link ServletContext} from the current context class loader. Subsequent calls to {@link #get()}
+     * with the same context class loader will return <code>null</code>.
+     */
+    static void release()
+    {
+        ClassLoader classLoader = getContextClassLoader();
+        ServletContext removedContext = CONTEXT_BY_CLASSLOADER.remove(classLoader);
+        if (removedContext == null)
+        {
+            log.warning("Cannot find a ServletContext to release for class loader: " + classLoader);
+        }
+    }
+
+    private static ClassLoader getContextClassLoader()
+    {
+        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+        if (classLoader == null)
+        {
+            throw new IllegalStateException("Unable to obtain the context class loader for the current thread");
+        }
+        return classLoader;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/7df63a86/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/ServletContextHolderListener.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/ServletContextHolderListener.java b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/ServletContextHolderListener.java
new file mode 100644
index 0000000..88e1246
--- /dev/null
+++ b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/ServletContextHolderListener.java
@@ -0,0 +1,44 @@
+/*
+ * 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.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+
+/**
+ * This class stores the ServletContext in the {@link ServletContextHolder}.
+ * 
+ * @author Christian Kaltepoth
+ */
+public class ServletContextHolderListener implements ServletContextListener
+{
+
+    @Override
+    public void contextInitialized(ServletContextEvent sce)
+    {
+        ServletContextHolder.bind(sce.getServletContext());
+    }
+
+    @Override
+    public void contextDestroyed(ServletContextEvent sce)
+    {
+        ServletContextHolder.release();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/7df63a86/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
new file mode 100644
index 0000000..68534f9
--- /dev/null
+++ b/deltaspike/modules/servlet/impl/src/main/java/org/apache/deltaspike/servlet/impl/produce/ServletObjectProducer.java
@@ -0,0 +1,128 @@
+/*
+ * 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 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.ServletContext;
+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 ServletContext}</li>
+ * <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
+    public ServletContext getServletContext()
+    {
+        return ServletContextHolder.get();
+    }
+
+    @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/7df63a86/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 af56b7d..d8ec9f6 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
@@ -2,6 +2,8 @@
 <web-fragment version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd">
 
+    <name>deltaspike_servlet_module</name>
+
     <distributable />
 
     <ordering>
@@ -11,18 +13,37 @@
     </ordering>
 
     <listener>
-        <display-name>ServletEventBridgeListener</display-name>
-        <listener-class>org.apache.deltaspike.servlet.impl.ServletEventBridgeListener</listener-class>
+        <display-name>EventBridgeContextListener</display-name>
+        <listener-class>org.apache.deltaspike.servlet.impl.event.EventBridgeContextListener</listener-class>
+    </listener>
+
+    <listener>
+        <display-name>EventBridgeSessionListener</display-name>
+        <listener-class>org.apache.deltaspike.servlet.impl.event.EventBridgeSessionListener</listener-class>
+    </listener>
+
+    <listener>
+        <display-name>ServletContextHolderListener</display-name>
+        <listener-class>org.apache.deltaspike.servlet.impl.produce.ServletContextHolderListener</listener-class>
     </listener>
 
     <filter>
-        <display-name>ServletEventBridgeFilter</display-name>
-        <filter-name>ServletEventBridgeFilter</filter-name>
-        <filter-class>org.apache.deltaspike.servlet.impl.ServletEventBridgeFilter</filter-class>
+        <display-name>RequestResponseHolderFilter</display-name>
+        <filter-name>RequestResponseHolderFilter</filter-name>
+        <filter-class>org.apache.deltaspike.servlet.impl.produce.RequestResponseHolderFilter</filter-class>
     </filter>
+    <filter-mapping>
+        <filter-name>RequestResponseHolderFilter</filter-name>
+        <url-pattern>/*</url-pattern>
+    </filter-mapping>
 
+    <filter>
+        <display-name>EventBridgeFilter</display-name>
+        <filter-name>EventBridgeFilter</filter-name>
+        <filter-class>org.apache.deltaspike.servlet.impl.event.EventBridgeFilter</filter-class>
+    </filter>
     <filter-mapping>
-        <filter-name>ServletEventBridgeFilter</filter-name>
+        <filter-name>EventBridgeFilter</filter-name>
         <url-pattern>/*</url-pattern>
     </filter-mapping>