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}