All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.cayenne.conf.WebApplicationContextProvider Maven / Gradle / Ivy

There is a newer version: 2.0.4
Show newest version
/*****************************************************************
 *   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.cayenne.conf;

import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.cayenne.access.DataContext;

/**
 * WebApplicationContextProvider is a helper class integrating Cayenne with web
 * applications. It performs two related operations - (1) whenever an HttpSession is
 * started, it creates a new instance of DataContext and sets it as a session attribute;
 * (2) whenever a new request comes in for the session, it retrieves previously stored
 * session DataContext and binds it to the request worker thread for the duration of the
 * request. This way any class can get access to the correct instance of DataContext
 * without knowing anything about the servlet environment. This is useful for decoupling
 * the controller layer (Servlets, Struts, etc.) from a DAO layer, making public DAO API
 * independent from DataContext.
 * 

* Installation in the web container: WebApplicationContextProvider should be * installed as a listener, similar to the WebApplicationListener). Per servlet * specification, listener is configured in web.xml deployment descriptor: *

* *
 *        <listener>
 *          <listener-class>org.apache.cayenne.conf.WebApplicationContextProvider</listener-class>
 *        </listener>
 * 
* *

* Accessing thread DataContext: A DataContext bound to a worker thread can be * retrieved for the duration of the request processing by calling the static method * {@link DataContext#getThreadDataContext()}. *

*

*

* Upgrading from {@link WebApplicationListener}: WebApplicationContextProvider * supersedes WebApplicationListener. WebApplicationContextProvider relies on * ServletRequestListener API that is a part of Servlet Specification since version 2.4. * Therefore it requires a container that supports 2.4 spec, e.g. Tomcat 5.* *

*

* * @author Scott McClure * @since 1.1 * @deprecated since 1.2. This class is deprecated to reduce confusion due to multiple * redundant choices of web application configuration. * {@link org.apache.cayenne.conf.WebApplicationContextFilter} is the * official configuration choice for Cayenne, however you can still use a * custom listener similar to WebApplicationContextProvider if you want to. */ public class WebApplicationContextProvider extends WebApplicationListener implements ServletRequestListener { /** * Retrieves the DataContext bound earlier to the HttpSession, and binds it to the * current thread. */ public void requestInitialized(ServletRequestEvent sre) { ServletRequest req = sre.getServletRequest(); if (req instanceof HttpServletRequest) { HttpSession session = ((HttpServletRequest) req).getSession(); DataContext dataContext = ServletUtil.getSessionContext(session); // even if null, reset to null is a good thing here... DataContext.bindThreadDataContext(dataContext); if (dataContext == null) { throw new IllegalStateException( "DataContext is null for the session, cannot bind to thread."); } } } /** * Removes the reference to the DataContext from the thread. */ public void requestDestroyed(ServletRequestEvent sre) { // Prevent lingering object references DataContext.bindThreadDataContext(null); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy