1 24 package org.riotfamily.common.web.dwr; 25 26 import java.util.List ; 27 import java.util.Map ; 28 29 import javax.servlet.ServletConfig ; 30 import javax.servlet.ServletContext ; 31 import javax.servlet.http.HttpServletRequest ; 32 import javax.servlet.http.HttpServletResponse ; 33 34 import org.directwebremoting.WebContextFactory.WebContextBuilder; 35 import org.directwebremoting.impl.ContainerUtil; 36 import org.directwebremoting.impl.StartupUtil; 37 import org.directwebremoting.servlet.UrlProcessor; 38 import org.directwebremoting.spring.SpringContainer; 39 import org.directwebremoting.util.FakeServletConfig; 40 import org.springframework.beans.BeansException; 41 import org.springframework.beans.factory.BeanFactory; 42 import org.springframework.beans.factory.BeanFactoryAware; 43 import org.springframework.beans.factory.BeanNameAware; 44 import org.springframework.beans.factory.InitializingBean; 45 import org.springframework.util.Assert; 46 import org.springframework.web.context.ServletContextAware; 47 import org.springframework.web.servlet.ModelAndView; 48 import org.springframework.web.servlet.mvc.AbstractController; 49 50 public class DwrController extends AbstractController 51 implements BeanNameAware, InitializingBean, BeanFactoryAware, 52 ServletContextAware { 53 54 private String beanName; 55 56 private String mapping; 57 58 private List configurators; 59 60 private boolean includeDefaultConfig = true; 61 62 private ServletConfig servletConfig; 63 64 private Map parameters; 65 66 private SpringContainer container; 67 68 protected WebContextBuilder webContextBuilder; 69 70 public void setMapping(String mapping) { 71 this.mapping = mapping; 72 } 73 74 public void setBeanName(String beanName) { 75 this.beanName = beanName; 76 if (mapping == null) { 77 mapping = beanName; 78 } 79 } 80 81 87 public void setBeanFactory(BeanFactory beanFactory) throws BeansException { 88 container = new SpringContainer(); 89 container.setBeanFactory(beanFactory); 90 } 91 92 96 public void setConfigurators(List configurators) { 97 this.configurators = configurators; 98 } 99 100 103 public void setParameters(Map parameters) { 104 this.parameters = parameters; 105 } 106 107 114 public void setIncludeDefaultConfig(boolean includeDefaultConfig) { 115 this.includeDefaultConfig = includeDefaultConfig; 116 } 117 118 125 public void afterPropertiesSet() throws Exception { 126 ServletContext servletContext = getServletContext(); 127 Assert.notNull(configurators, "The 'configurators' property must be set"); 128 servletConfig = new FakeServletConfig(beanName, servletContext, parameters); 129 130 try { 131 ContainerUtil.setupDefaults(container, servletConfig); 132 ContainerUtil.setupFromServletConfig(container, servletConfig); 133 container.setupFinished(); 134 135 webContextBuilder = StartupUtil.initWebContext(servletConfig, servletContext, container); 136 StartupUtil.initServerContext(servletConfig, servletContext, container); 137 138 if (includeDefaultConfig) { 139 ContainerUtil.configureFromSystemDwrXml(container); 140 } 141 142 ContainerUtil.configure(container, configurators); 143 ContainerUtil.publishContainer(container, servletConfig); 144 } 145 finally { 146 webContextBuilder.unset(); 147 } 148 } 149 150 156 protected ModelAndView handleRequestInternal(HttpServletRequest request, 157 HttpServletResponse response) throws Exception { 158 159 HttpServletRequest shiftedRequest = new PathShiftingRequestWrapper( 160 request, getPathOffset(request)); 161 162 try { 163 webContextBuilder.set(shiftedRequest, response, servletConfig, 165 getServletContext(), container); 166 167 UrlProcessor processor = (UrlProcessor) 168 container.getBean(UrlProcessor.class.getName()); 169 170 processor.handle(shiftedRequest, response); 171 } 172 finally { 173 webContextBuilder.unset(); 174 } 175 176 return null; 177 } 178 179 protected int getPathOffset(HttpServletRequest request) { 180 String pathInfo = request.getPathInfo(); 181 int i = pathInfo.indexOf(mapping); 182 return i + mapping.length(); 183 } 184 185 } 186 | Popular Tags |