org.ambraproject.struts2.AmbraStruts2Dispatcher.java Source code

Java tutorial

Introduction

Here is the source code for org.ambraproject.struts2.AmbraStruts2Dispatcher.java

Source

/* $HeadURL::                                                                            $
 * $Id$
 *
 * Copyright (c) 2006-2010 by Public Library of Science
 * http://plos.org
 * http://ambraproject.org
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.ambraproject.struts2;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.servlet.FilterConfig;

import org.apache.commons.configuration.Configuration;
import org.apache.struts2.dispatcher.ng.ExecuteOperations;
import org.apache.struts2.dispatcher.ng.InitOperations;
import org.apache.struts2.dispatcher.ng.PrepareOperations;
import org.apache.struts2.dispatcher.ng.filter.FilterHostConfig;
import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.apache.struts2.StrutsConstants;
import org.apache.struts2.dispatcher.Dispatcher;

import org.ambraproject.configuration.ConfigurationStore;

/**
 * Override the Struts Constants configurations from our Commons config files. This adds one
 * more override to the Struts constant configuration hierarchy specified in
 * http://struts.apache.org/2.0.14/docs/constant-configuration.html So the overrides order now is
 * struts-defaults.xml,struts-plugin.xml,struts.xml,struts.properties,commons-config. This also
 * means that struts constants now can be specified as a system property. (eg.
 * -Dstruts.devMode=true)
 *
 * @author Pradeep Krishnan
 */
public class AmbraStruts2Dispatcher extends StrutsPrepareAndExecuteFilter {
    private static final Logger log = LoggerFactory.getLogger(AmbraStruts2Dispatcher.class);
    private static final String[] keys = { StrutsConstants.STRUTS_DEVMODE, StrutsConstants.STRUTS_I18N_RELOAD,
            StrutsConstants.STRUTS_I18N_ENCODING, StrutsConstants.STRUTS_CONFIGURATION_XML_RELOAD,
            StrutsConstants.STRUTS_ACTION_EXTENSION, StrutsConstants.STRUTS_TAG_ALTSYNTAX,
            StrutsConstants.STRUTS_URL_HTTP_PORT, StrutsConstants.STRUTS_URL_HTTPS_PORT,
            StrutsConstants.STRUTS_URL_INCLUDEPARAMS, StrutsConstants.STRUTS_OBJECTFACTORY,
            StrutsConstants.STRUTS_OBJECTTYPEDETERMINER, StrutsConstants.STRUTS_CONTINUATIONS_PACKAGE,
            StrutsConstants.STRUTS_CONFIGURATION, StrutsConstants.STRUTS_LOCALE,
            StrutsConstants.STRUTS_DISPATCHER_PARAMETERSWORKAROUND,
            StrutsConstants.STRUTS_FREEMARKER_MANAGER_CLASSNAME, StrutsConstants.STRUTS_VELOCITY_MANAGER_CLASSNAME,
            StrutsConstants.STRUTS_VELOCITY_CONFIGFILE, StrutsConstants.STRUTS_VELOCITY_TOOLBOXLOCATION,
            StrutsConstants.STRUTS_VELOCITY_CONTEXTS, StrutsConstants.STRUTS_UI_TEMPLATEDIR,
            StrutsConstants.STRUTS_UI_THEME, StrutsConstants.STRUTS_MULTIPART_MAXSIZE,
            StrutsConstants.STRUTS_MULTIPART_SAVEDIR, StrutsConstants.STRUTS_MULTIPART_PARSER,
            StrutsConstants.STRUTS_OBJECTFACTORY_SPRING_AUTOWIRE,
            StrutsConstants.STRUTS_OBJECTFACTORY_SPRING_USE_CLASS_CACHE, StrutsConstants.STRUTS_XSLT_NOCACHE,
            StrutsConstants.STRUTS_CUSTOM_PROPERTIES, StrutsConstants.STRUTS_CUSTOM_I18N_RESOURCES,
            StrutsConstants.STRUTS_MAPPER_CLASS, StrutsConstants.STRUTS_SERVE_STATIC_CONTENT,
            StrutsConstants.STRUTS_SERVE_STATIC_BROWSER_CACHE,
            StrutsConstants.STRUTS_ENABLE_DYNAMIC_METHOD_INVOCATION,
            StrutsConstants.STRUTS_ENABLE_SLASHES_IN_ACTION_NAMES, StrutsConstants.STRUTS_MAPPER_COMPOSITE,
            StrutsConstants.STRUTS_ACTIONPROXYFACTORY, StrutsConstants.STRUTS_FREEMARKER_WRAPPER_ALT_MAP,
            StrutsConstants.STRUTS_XWORKCONVERTER, StrutsConstants.STRUTS_ALWAYS_SELECT_FULL_NAMESPACE,
            StrutsConstants.STRUTS_XWORKTEXTPROVIDER, StrutsConstants.STRUTS_ID_PARAMETER_NAME, };

    @Override
    public void init(FilterConfig filterConfig) {
        // Copied the init function of the StrutsPrepareAndExecuteFilter class
        // and modified how the Dispatcher object is getting created by passing our own configuration values.

        // There should be a better way to do this than what we are doing here.

        InitOperations init = new InitOperations();
        Dispatcher dispatcher = null;
        try {
            FilterHostConfig config = new FilterHostConfig(filterConfig);
            init.initLogging(config);

            // initDispatcher is the function we really want to override
            // dispatcher = init.initDispatcher(config);

            Map<String, String> params = new HashMap<String, String>();
            for (Iterator e = config.getInitParameterNames(); e.hasNext();) {
                String name = (String) e.next();
                String value = filterConfig.getInitParameter(name);

                params.put(name, value);
            }

            // adding our own configuration values
            Configuration conf = ConfigurationStore.getInstance().getConfiguration();
            for (String name : keys) {
                String val = conf.getString(name);

                if (val != null) {
                    log.info("Setting struts constant: " + name + "=" + val);
                    params.put(name, val);
                }
            }

            dispatcher = new Dispatcher(config.getServletContext(), params);
            dispatcher.init();

            init.initStaticContentLoader(config, dispatcher);

            prepare = new PrepareOperations(filterConfig.getServletContext(), dispatcher);
            execute = new ExecuteOperations(filterConfig.getServletContext(), dispatcher);
            this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);

            postInit(dispatcher, filterConfig);
        } finally {
            if (dispatcher != null) {
                dispatcher.cleanUpAfterInit();
            }
            init.cleanup();
        }
    }

}