/* * Copyright 2005 Joe Walker * * Licensed 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.directwebremoting.spring; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import org.directwebremoting.Container; import org.directwebremoting.WebContextFactory.WebContextBuilder; import org.directwebremoting.extend.Configurator; import org.directwebremoting.impl.StartupUtil; import org.directwebremoting.servlet.DwrServlet; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.context.ApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; /** * The servlet that handles all calls to DWR. <br> * It retrieves its configuration from the Spring IoC container. This is done in two ways: * <ol> * <li>Use the Spring namespace. When using the Spring namespace for DWR, the configuration for DWR is * automatically picked up by this servlet.</li> * <li>Explicitly specify which configurations to pick up. When explicitly defining the DWR configuration in * Spring yourself, you can explicitly specify them in the init parameters.</li> * </ol> * Same as with the <code>DwrServlet</code>, you can specify a <code>debug</code> init parameter on this servlet * to put DWR in debug mode (allowing access to the very handy debug pages). * * @see org.directwebremoting.servlet.DwrServlet * * @author Bram Smeets * @author Joe Walker [joe at getahead dot ltd dot uk] */ public class DwrSpringServlet extends DwrServlet { /* (non-Javadoc) * @see org.directwebremoting.servlet.DwrServlet#createContainer(javax.servlet.ServletConfig) */ @Override protected SpringContainer createContainer(ServletConfig servletConfig) { ApplicationContext appContext = getApplicationContext(servletConfig.getServletContext()); SpringContainer springContainer = new SpringContainer(); springContainer.setBeanFactory(appContext); StartupUtil.setupDefaultContainer(springContainer, servletConfig); return springContainer; } /* (non-Javadoc) * @see org.directwebremoting.servlet.DwrServlet#configureContainer(org.directwebremoting.Container, javax.servlet.ServletConfig) */ @Override protected void configureContainer(Container container, ServletConfig servletConfig) throws ServletException, IOException { // retrieve the configurators from Spring (loaded by the ContextLoaderListener) try { ApplicationContext appContext = getApplicationContext(servletConfig.getServletContext()); configurators.add((Configurator) appContext.getBean(DwrNamespaceHandler.DEFAULT_SPRING_CONFIGURATOR_ID)); } catch (NoSuchBeanDefinitionException ex) { throw new ServletException("No DWR configuration was found in your application context, make sure to define one", ex); } try { if (includeDefaultConfig) { StartupUtil.configureFromSystemDwrXml(container); } StartupUtil.configureFromInitParams(container, servletConfig); StartupUtil.configure(container, configurators); } catch (IOException ex) { throw ex; } catch (Exception ex) { throw new ServletException(ex); } } /** * Setter for use by the Spring IoC container to tell us what Configurators * exist for us to configure ourselves. * @param configurators */ public void setConfigurators(List<Configurator> configurators) { this.configurators = configurators; } /** * Do we prefix the list of Configurators with a default to read the system * dwr.xml file? * @param includeDefaultConfig the includeDefaultConfig to set */ public void setIncludeDefaultConfig(boolean includeDefaultConfig) { this.includeDefaultConfig = includeDefaultConfig; } /** * Use provided application context rather than the default. * @param applicationContext */ public void setApplicationContext(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } /** * Allow easy override when retrieving the application context. * @param servletContext * @return the default application context. */ protected ApplicationContext getApplicationContext(ServletContext servletContext) { return this.applicationContext == null ? WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext) : this.applicationContext; } /** * The application context that has the configuration. If null, * the default application context will be used. */ private ApplicationContext applicationContext = null; /** * Do we prefix the list of Configurators with a default to read the system * dwr.xml file? */ private boolean includeDefaultConfig = true; /** * What Configurators exist for us to configure ourselves. */ private List<Configurator> configurators = new ArrayList<Configurator>(); /** * The WebContext that keeps http objects local to a thread */ protected WebContextBuilder webContextBuilder = null; }