/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.test;
import java.io.File;
import java.io.IOException;
import javax.servlet.ServletContext;
import org.apache.commons.io.FileUtils;
import org.geoserver.util.IOUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.xml.BeanDefinitionParserDelegate;
import org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.beans.factory.xml.XmlReaderContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.ui.context.Theme;
import org.springframework.web.context.ServletConfigAware;
import org.springframework.web.context.ServletContextAware;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.ServletContextAwareProcessor;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.w3c.dom.Element;
/**
* A spring application context used for GeoServer testing.
*
* @author Justin Deoliveira, The Open Planning Project, jdeolive@openplans.org
*
*/
public class GeoServerTestApplicationContext extends ClassPathXmlApplicationContext
implements WebApplicationContext {
ServletContext servletContext;
boolean useLegacyGeoServerLoader = true;
final File contextTmp;
public GeoServerTestApplicationContext(String[] configLocation, ServletContext servletContext)
throws BeansException {
super(configLocation, false);
try {
contextTmp = IOUtils.createRandomDirectory("./target", "mock", "tmp");
servletContext.setAttribute("javax.servlet.context.tempdir", contextTmp);
} catch (Exception e) {
throw new RuntimeException(e);
}
this.servletContext = servletContext;
}
public ServletContext getServletContext() {
return servletContext;
}
public Theme getTheme(String themeName) {
return null;
}
public void setUseLegacyGeoServerLoader(boolean useLegacyGeoServerLoader) {
this.useLegacyGeoServerLoader = useLegacyGeoServerLoader;
}
/*
* JD: Overriding manually and playing with bean definitions. We do this
* because we have not ported all the mock test data to a 2.x style configuration
* directory, so we need to force the legacy data directory loader to engage.
*/
protected void loadBeanDefinitions(XmlBeanDefinitionReader reader)
throws BeansException, IOException {
super.loadBeanDefinitions(reader);
if (useLegacyGeoServerLoader) {
BeanDefinition def = reader.getBeanFactory().getBeanDefinition("geoServerLoader");
def.setBeanClassName( "org.geoserver.test.TestGeoServerLoaderProxy");
}
}
@Override
protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
beanFactory.addBeanPostProcessor(new ServletContextAwareProcessor(this.servletContext));
beanFactory.ignoreDependencyInterface(ServletContextAware.class);
beanFactory.ignoreDependencyInterface(ServletConfigAware.class);
WebApplicationContextUtils.registerWebApplicationScopes(beanFactory, this.servletContext);
WebApplicationContextUtils.registerEnvironmentBeans(beanFactory, this.servletContext);
}
@Override
protected void initPropertySources() {
super.initPropertySources();
WebApplicationContextUtils.initServletPropertySources(
this.getEnvironment().getPropertySources(), this.servletContext);
}
@Override
protected void initBeanDefinitionReader(XmlBeanDefinitionReader reader) {
super.initBeanDefinitionReader(reader);
reader.setDocumentReaderClass(LazyBeanDefinitionDocumentReader.class);
}
static class LazyBeanDefinitionDocumentReader extends DefaultBeanDefinitionDocumentReader {
@Override
protected BeanDefinitionParserDelegate createDelegate(XmlReaderContext readerContext,
Element root, BeanDefinitionParserDelegate parentDelegate) {
root.setAttribute("default-lazy-init", "true");
BeanDefinitionParserDelegate delegate = super.createDelegate(readerContext, root,
parentDelegate);
return delegate;
}
}
@Override
protected void onClose() {
super.onClose();
FileUtils.deleteQuietly(contextTmp);
}
}