001 /** 002 * Copyright 2005-2013 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.rice.kns.web.struts.action; 017 018 import org.apache.commons.beanutils.ConvertUtils; 019 import org.apache.commons.beanutils.converters.BigDecimalConverter; 020 import org.apache.commons.beanutils.converters.BigIntegerConverter; 021 import org.apache.commons.beanutils.converters.BooleanConverter; 022 import org.apache.commons.beanutils.converters.ByteConverter; 023 import org.apache.commons.beanutils.converters.CharacterConverter; 024 import org.apache.commons.beanutils.converters.DoubleConverter; 025 import org.apache.commons.beanutils.converters.FloatConverter; 026 import org.apache.commons.beanutils.converters.IntegerConverter; 027 import org.apache.commons.beanutils.converters.LongConverter; 028 import org.apache.commons.beanutils.converters.ShortConverter; 029 import org.apache.commons.collections.iterators.IteratorEnumeration; 030 import org.apache.commons.lang.StringUtils; 031 import org.apache.log4j.Logger; 032 import org.apache.struts.action.ActionServlet; 033 import org.kuali.rice.core.api.config.ConfigurationException; 034 import org.kuali.rice.core.api.config.property.ConfigContext; 035 import org.kuali.rice.core.framework.config.module.ModuleConfigurer; 036 import org.kuali.rice.core.framework.config.module.WebModuleConfiguration; 037 038 import java.io.IOException; 039 import javax.servlet.http.HttpServletRequest; 040 import javax.servlet.http.HttpServletResponse; 041 import javax.servlet.ServletConfig; 042 import javax.servlet.ServletContext; 043 import javax.servlet.ServletException; 044 import java.math.BigDecimal; 045 import java.math.BigInteger; 046 import java.util.Collection; 047 import java.util.Enumeration; 048 import java.util.HashMap; 049 import java.util.Map; 050 051 public class KualiActionServlet extends ActionServlet { 052 private static final Logger LOG = Logger.getLogger(KualiActionServlet.class); 053 054 // KULRICE-8176: KFS Notes/Attachments Tab Functionality for Note Text Error - Visible/Special characters, spaces, or tabs 055 private String parameterEncoding = ""; 056 057 /** 058 * <p>Initialize other global characteristics of the controller servlet.</p> 059 * Overridden to remove the ConvertUtils.deregister() command that caused problems 060 * with the concurrent data dictionary load. (KULRNE-4405) 061 * 062 * @exception ServletException if we cannot initialize these resources 063 */ 064 @Override 065 protected void initOther() throws ServletException { 066 067 String value = null; 068 value = getServletConfig().getInitParameter("config"); 069 if (value != null) { 070 config = value; 071 } 072 073 // Backwards compatibility for form beans of Java wrapper classes 074 // Set to true for strict Struts 1.0 compatibility 075 value = getServletConfig().getInitParameter("convertNull"); 076 if ("true".equalsIgnoreCase(value) 077 || "yes".equalsIgnoreCase(value) 078 || "on".equalsIgnoreCase(value) 079 || "y".equalsIgnoreCase(value) 080 || "1".equalsIgnoreCase(value)) { 081 082 convertNull = true; 083 } 084 085 if (convertNull) { 086 ConvertUtils.register(new BigDecimalConverter(null), BigDecimal.class); 087 ConvertUtils.register(new BigIntegerConverter(null), BigInteger.class); 088 ConvertUtils.register(new BooleanConverter(null), Boolean.class); 089 ConvertUtils.register(new ByteConverter(null), Byte.class); 090 ConvertUtils.register(new CharacterConverter(null), Character.class); 091 ConvertUtils.register(new DoubleConverter(null), Double.class); 092 ConvertUtils.register(new FloatConverter(null), Float.class); 093 ConvertUtils.register(new IntegerConverter(null), Integer.class); 094 ConvertUtils.register(new LongConverter(null), Long.class); 095 ConvertUtils.register(new ShortConverter(null), Short.class); 096 } 097 098 // KULRICE-8176: KFS Notes/Attachments Tab Functionality for Note Text Error - Visible/Special characters, spaces, or tabs 099 parameterEncoding = getServletConfig().getInitParameter("PARAMETER_ENCODING"); 100 } 101 102 KualiActionServletConfig serverConfigOverride = null; 103 104 @Override 105 public ServletConfig getServletConfig() { 106 if ( serverConfigOverride == null ) { 107 ServletConfig sConfig = super.getServletConfig(); 108 109 if ( sConfig == null ) { 110 return null; 111 } 112 serverConfigOverride = new KualiActionServletConfig(sConfig); 113 } 114 return serverConfigOverride; 115 } 116 117 /** 118 * A custom ServletConfig implementation which dynamically includes web content based on the installed modules in the RiceConfigurer object. 119 * Accomplishes this by implementing custom 120 * {@link #getInitParameter(String)} and {@link #getInitParameterNames()} methods. 121 */ 122 private class KualiActionServletConfig implements ServletConfig { 123 124 private ServletConfig wrapped; 125 private Map<String,String> initParameters = new HashMap<String, String>(); 126 127 public KualiActionServletConfig(ServletConfig wrapped) { 128 this.wrapped = wrapped; 129 // copy out all the init parameters so they can be augmented 130 @SuppressWarnings("unchecked") 131 final Enumeration<String> initParameterNames = wrapped.getInitParameterNames(); 132 while ( initParameterNames.hasMoreElements() ) { 133 String paramName = initParameterNames.nextElement(); 134 initParameters.put( paramName, wrapped.getInitParameter(paramName) ); 135 } 136 // loop over the installed modules, adding their struts configuration to the servlet 137 // if they have a web interface 138 final Collection<ModuleConfigurer> riceModules = ModuleConfigurer.getCurrentContextConfigurers(); 139 140 if ( LOG.isInfoEnabled() ) { 141 LOG.info( "Configuring init parameters of the KualiActionServlet from riceModules: " + riceModules ); 142 } 143 for ( ModuleConfigurer module : riceModules ) { 144 // only install the web configuration if the module has web content 145 // and it is running in a "local" mode 146 // in "embedded" or "remote" modes, the UIs are hosted on a central server 147 if ( module.shouldRenderWebInterface() ) { 148 WebModuleConfiguration webModuleConfiguration = module.getWebModuleConfiguration(); 149 if (webModuleConfiguration == null) { 150 throw new ConfigurationException("Attempting to load WebModuleConfiguration for module '" + module.getModuleName() + "' but no configuration was provided!"); 151 } 152 if ( LOG.isInfoEnabled() ) { 153 LOG.info( "Configuring Web Content for Module: " + webModuleConfiguration.getModuleName() 154 + " / " + webModuleConfiguration.getWebModuleStrutsConfigName() 155 + " / " + webModuleConfiguration.getWebModuleStrutsConfigurationFiles() 156 + " / Base URL: " + webModuleConfiguration.getWebModuleBaseUrl() ); 157 } 158 if ( !initParameters.containsKey( webModuleConfiguration.getWebModuleStrutsConfigName() ) ) { 159 initParameters.put( webModuleConfiguration.getWebModuleStrutsConfigName(), webModuleConfiguration.getWebModuleStrutsConfigurationFiles() ); 160 } 161 } 162 } 163 } 164 165 @Override 166 public String getInitParameter(String name) { 167 return initParameters.get(name); 168 } 169 170 @Override 171 @SuppressWarnings("unchecked") 172 public Enumeration<String> getInitParameterNames() { 173 return new IteratorEnumeration( initParameters.keySet().iterator() ); 174 } 175 176 @Override 177 public ServletContext getServletContext() { 178 return wrapped.getServletContext(); 179 } 180 @Override 181 public String getServletName() { 182 return wrapped.getServletName(); 183 } 184 } 185 186 /** 187 * KULRICE-8176: KFS Notes/Attachments Tab Functionality for Note Text Error - Visible/Special characters, spaces, or tabs 188 * 189 * @see org.apache.struts.action.ActionServlet#process(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 190 */ 191 @Override 192 protected void process(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { 193 if (StringUtils.isNotBlank(parameterEncoding)) { 194 request.setCharacterEncoding(parameterEncoding); 195 response.setCharacterEncoding(parameterEncoding); 196 } 197 198 super.process(request, response); 199 } 200 }