blob: 2415eb7177147ee0967e778456e2973aa6b734ee [file] [log] [blame]
/*
* Copyright 2004-2005 the original author or authors.
*
* 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.codehaus.groovy.grails.web.servlet;
import org.codehaus.groovy.grails.commons.GrailsApplication;
import org.codehaus.groovy.grails.commons.GrailsBootstrapClass;
import org.codehaus.groovy.grails.commons.spring.SpringConfig;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.util.StringUtils;
import org.springframework.web.context.ConfigurableWebApplicationContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.XmlWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
import org.springmodules.beans.factory.drivers.xml.XmlWebApplicationContextDriver;
/**
* <p>Servlet that handles incoming requests for Grails.
* <p/>
* <p>This servlet loads the Spring configuration based on the Grails application
* in the parent application context.
*
* @author Steven Devijver
* @since Jul 2, 2005
*/
public class GrailsDispatcherServlet extends DispatcherServlet {
private static final String GRAILS_APPLICATION_ID = "grailsApplication";
private static final String GRAILS_APPLICATION_CONTEXT = "grailsApplicationContext";
public GrailsDispatcherServlet() {
super();
}
protected WebApplicationContext createWebApplicationContext(WebApplicationContext parent) throws BeansException {
// use config file locations if available
ApplicationContext grailsContext = (ApplicationContext)getServletContext().getAttribute(GRAILS_APPLICATION_CONTEXT );
GrailsApplication application;
WebApplicationContext webContext;
if(grailsContext != null) {
XmlWebApplicationContext xmlContext = new XmlWebApplicationContext();
xmlContext.setParent(grailsContext);
webContext = xmlContext;
application = (GrailsApplication) webContext.getBean(GRAILS_APPLICATION_ID, GrailsApplication.class);
}
else {
String[] locations = null;
if (null != getContextConfigLocation()) {
locations = StringUtils.tokenizeToStringArray(
getContextConfigLocation(),
ConfigurableWebApplicationContext.CONFIG_LOCATION_DELIMITERS);
}
// construct the SpringConfig for the container managed application
application = (GrailsApplication) parent.getBean(GRAILS_APPLICATION_ID, GrailsApplication.class);
SpringConfig springConfig = new SpringConfig(application);
// return a context that obeys grails' settings
webContext = new XmlWebApplicationContextDriver().getWebApplicationContext(
springConfig.getBeanReferences(),
parent,
getServletContext(),
getNamespace(),
locations);
getServletContext().setAttribute(GRAILS_APPLICATION_CONTEXT,webContext );
}
// init the Grails application
GrailsBootstrapClass[] bootstraps = application.getGrailsBootstrapClasses();
for (int i = 0; i < bootstraps.length; i++) {
bootstraps[i].callInit( getServletContext() );
}
return webContext;
}
public void destroy() {
WebApplicationContext webContext = getWebApplicationContext();
GrailsApplication application = (GrailsApplication) webContext.getBean(GRAILS_APPLICATION_ID, GrailsApplication.class);
GrailsBootstrapClass[] bootstraps = application.getGrailsBootstrapClasses();
for (int i = 0; i < bootstraps.length; i++) {
bootstraps[i].callDestroy();
}
// call super
super.destroy();
}
}