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