001 /** 002 * Copyright 2010 The Kuali Foundation Licensed under the 003 * Educational Community License, Version 2.0 (the "License"); you may 004 * not use this file except in compliance with the License. You may 005 * obtain a copy of the License at 006 * 007 * http://www.osedu.org/licenses/ECL-2.0 008 * 009 * Unless required by applicable law or agreed to in writing, 010 * software distributed under the License is distributed on an "AS IS" 011 * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 012 * or implied. See the License for the specific language governing 013 * permissions and limitations under the License. 014 */ 015 016 package org.kuali.student.common.ws; 017 018 import java.util.Enumeration; 019 import java.util.Properties; 020 021 import javax.servlet.Servlet; 022 import javax.servlet.ServletConfig; 023 import javax.servlet.ServletContext; 024 import javax.servlet.http.HttpServletRequest; 025 import javax.servlet.http.HttpServletResponse; 026 027 import org.apache.log4j.Logger; 028 import org.springframework.beans.factory.BeanNameAware; 029 import org.springframework.beans.factory.DisposableBean; 030 import org.springframework.beans.factory.InitializingBean; 031 import org.springframework.web.servlet.ModelAndView; 032 import org.springframework.web.servlet.mvc.AbstractController; 033 034 /** 035 * Spring Controller implementation that mimics standard 036 * ServletWrappingController behaviour (see its documentation), but with the 037 * important difference that it doesn't instantiate the Servlet instance 038 * directly but delegate for this the BeanContext, so that we can also use IoC.* 039 */ 040 public class ServletWrappingController extends AbstractController implements 041 BeanNameAware, InitializingBean, DisposableBean { 042 private Class<? extends Servlet> servletClass; 043 private String servletName; 044 private Properties initParameters = new Properties(); 045 private String beanName; 046 private Servlet servletInstance; 047 048 private static org.apache.log4j.Logger log = Logger.getLogger(ServletWrappingController.class); 049 050 051 public void setServletClass(Class<? extends Servlet> servletClass) { 052 log.info("setServletClass : " + servletClass); 053 this.servletClass = servletClass; 054 } 055 056 public void setServletName(String servletName) { 057 log.info("setServletName : " + servletName); 058 this.servletName = servletName; 059 } 060 061 public void setInitParameters(Properties initParameters) { 062 log.info("setInitParameters : " + initParameters); 063 this.initParameters = initParameters; 064 } 065 066 public void setBeanName(String name) { 067 log.info("setBeanName : " + name); 068 this.beanName = name; 069 } 070 071 public void setServletInstance(Servlet servletInstance) { 072 log.info("setServletInstance : " + servletInstance); 073 this.servletInstance = servletInstance; 074 } 075 076 public void afterPropertiesSet() throws Exception { 077 log.info("afterPropertiesSet"); 078 if (this.servletInstance == null) { 079 throw new IllegalArgumentException("servletInstance is required"); 080 } 081 if (!Servlet.class.isAssignableFrom(servletInstance.getClass())) { 082 throw new IllegalArgumentException("servletInstance [" 083 + this.servletClass.getName() 084 + "] needs to implement interface [javax.servlet.Servlet]"); 085 } 086 if (this.servletName == null) { 087 this.servletName = this.beanName; 088 } 089 this.servletInstance.init(new DelegatingServletConfig()); 090 } 091 092 protected ModelAndView handleRequestInternal(HttpServletRequest request, 093 HttpServletResponse response) throws Exception { 094 log.info("handleRequestInternal : " + servletName); 095 try{ 096 this.servletInstance.service(request, response); 097 }catch(Exception e){ 098 log.error(e.getMessage()); 099 throw e; 100 } 101 102 return null; 103 } 104 105 public void destroy() { 106 log.info("destroy : " + servletName); 107 this.servletInstance.destroy(); 108 } 109 110 private class DelegatingServletConfig implements ServletConfig { 111 public String getServletName() { 112 return servletName; 113 } 114 115 public ServletContext getServletContext() { 116 return getWebApplicationContext().getServletContext(); 117 } 118 119 public String getInitParameter(String paramName) { 120 return initParameters.getProperty(paramName); 121 122 } 123 124 public Enumeration<?> getInitParameterNames() { 125 return initParameters.keys(); 126 } 127 } 128 }