Author: rich Date: Sun Dec 12 21:14:05 2004 New Revision: 111689 URL: http://svn.apache.org/viewcvs?view=rev&rev=111689 Log: - Beginning of work to upgrade from Struts 1.1 to 1.2.x: * Got rid of legacy (Struts 1.0) behavior in AutoRegisterActionServlet, namely, the initialization of deprecated collections (ActionForwards, ActionMappings, ActionFormBeans) in the ServletContext. * Workaround for http://issues.apache.org/bugzilla/show_bug.cgi?id=32661.
- Fixed an assertion error while parsing generated Struts config files in webapps that contained no shared flows (*.jpfs) and no (deprecated) Global.app. DRT: netui (WinXP) BB: self (linux) Modified: incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/AutoRegisterActionServlet.java incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowPageFilter.java incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/config/PageFlowControllerConfig.java Modified: incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/AutoRegisterActionServlet.java Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/AutoRegisterActionServlet.java?view=diff&rev=111689&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/AutoRegisterActionServlet.java&r1=111688&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/AutoRegisterActionServlet.java&r2=111689 ============================================================================== --- incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/AutoRegisterActionServlet.java (original) +++ incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/AutoRegisterActionServlet.java Sun Dec 12 21:14:05 2004 @@ -17,61 +17,49 @@ */ package org.apache.beehive.netui.pageflow; +import org.apache.beehive.netui.pageflow.internal.ContextCache; +import org.apache.beehive.netui.pageflow.internal.InternalConstants; +import org.apache.beehive.netui.pageflow.internal.InternalUtils; +import org.apache.beehive.netui.util.Bundle; +import org.apache.beehive.netui.util.DiscoveryUtils; +import org.apache.beehive.netui.util.config.ConfigUtil; +import org.apache.beehive.netui.util.config.bean.ModuleConfigLocators; +import org.apache.beehive.netui.util.config.bean.PageflowConfig; +import org.apache.beehive.netui.util.logging.Logger; +import org.apache.commons.digester.Digester; +import org.apache.struts.Globals; import org.apache.struts.action.ActionServlet; -import org.apache.struts.action.RequestProcessor; import org.apache.struts.action.DynaActionFormClass; -import org.apache.struts.action.ActionFormBeans; -import org.apache.struts.action.ActionFormBean; -import org.apache.struts.action.ActionForwards; -import org.apache.struts.action.ActionForward; -import org.apache.struts.action.ActionMappings; -import org.apache.struts.action.ActionMapping; -import org.apache.struts.config.ModuleConfig; -import org.apache.struts.config.ModuleConfigFactory; -import org.apache.struts.config.FormBeanConfig; +import org.apache.struts.action.RequestProcessor; import org.apache.struts.config.ControllerConfig; -import org.apache.struts.config.ForwardConfig; -import org.apache.struts.config.ActionConfig; +import org.apache.struts.config.FormBeanConfig; import org.apache.struts.config.MessageResourcesConfig; +import org.apache.struts.config.ModuleConfig; +import org.apache.struts.config.ModuleConfigFactory; import org.apache.struts.config.impl.ModuleConfigImpl; import org.apache.struts.util.RequestUtils; -import org.apache.struts.Globals; -import org.apache.commons.digester.Digester; import org.xml.sax.InputSource; -import javax.servlet.ServletException; -import javax.servlet.UnavailableException; import javax.servlet.ServletConfig; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; -import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletResponse; +import javax.servlet.UnavailableException; import javax.servlet.http.HttpServletRequest; -import java.util.Map; -import java.util.HashMap; -import java.util.Enumeration; -import java.util.Collections; -import java.util.ArrayList; -import java.util.concurrent.ConcurrentHashMap; +import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; -import java.io.ObjectOutputStream; import java.io.ObjectInputStream; -import java.net.URL; +import java.io.ObjectOutputStream; import java.net.MalformedURLException; - -import org.apache.beehive.netui.util.Bundle; -import org.apache.beehive.netui.util.ServletUtils; -import org.apache.beehive.netui.util.DiscoveryUtils; -import org.apache.beehive.netui.util.config.ConfigUtil; -import org.apache.beehive.netui.util.config.bean.PageflowConfig; -import org.apache.beehive.netui.util.config.bean.ModuleConfigLocators; -import org.apache.beehive.netui.util.logging.Logger; -import org.apache.beehive.netui.pageflow.internal.ContextCache; -import org.apache.beehive.netui.pageflow.internal.InternalUtils; -import org.apache.beehive.netui.pageflow.internal.RequestValues; -import org.apache.beehive.netui.pageflow.internal.InternalConstants; -import org.apache.beehive.netui.pageflow.handler.ForwardRedirectHandler; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; /** @@ -82,11 +70,14 @@ */ public class AutoRegisterActionServlet extends ActionServlet { + /** + * @deprecated To register [EMAIL PROTECTED] ModuleConfigLocator}s, use the <code>module-config-locators</code> element + * in <code>pageflow-config</code> of /WEB-INF/netui-config.xml. + */ public static String MODULE_CONFIG_LOCATOR_CLASS_ATTR = "moduleConfigLocators"; /** Map of module-path to ModuleConfig */ private Map< String, ModuleConfig > _registeredModules = new ConcurrentHashMap< String, ModuleConfig >(); - private boolean _hasDataSources = false; private transient Digester _cachedConfigDigester = null; private Map _configParams = null; private ModuleConfigLocator[] _moduleConfigLocators = null; @@ -157,7 +148,7 @@ } } - _moduleConfigLocators = locators.toArray( new ModuleConfigLocator[0] ); + _moduleConfigLocators = locators.toArray( new ModuleConfigLocator[locators.size()] ); } private static void addModuleConfigLocator( String locatorClassName, ArrayList< ModuleConfigLocator > locators ) @@ -242,7 +233,7 @@ catch ( MalformedURLException e ) { _log.error( "ModuleConfigLocator " + locator.getClass().getName() - + " returned an invalid path: " + moduleConfigPath + ".", e ); + + " returned an invalid path: " + moduleConfigPath + '.', e ); } } } @@ -283,14 +274,14 @@ } else { - ServletConfig config = getServletConfig(); - assert config != null; + ServletConfig servletConfig = getServletConfig(); + assert servletConfig != null; HashMap params = new HashMap(); - for ( Enumeration e = config.getInitParameterNames(); e.hasMoreElements(); ) + for ( Enumeration e = servletConfig.getInitParameterNames(); e.hasMoreElements(); ) { String name = ( String ) e.nextElement(); - params.put( name, config.getInitParameter( name ) ); + params.put( name, servletConfig.getInitParameter( name ) ); } stream.writeObject( params ); @@ -333,38 +324,6 @@ } /** - * @exclude - */ - protected void initModuleDataSources( ModuleConfig config ) - throws ServletException - { - // - // This is part of a workaround for some strange behavior on webapp redeploy, which - // indirectly calls destroyDataSources. We keep track of whether there are any - // datasources configured, and if there are not, we don't call the base destroyDataSources(). - // - super.initModuleDataSources( config ); - _hasDataSources = ! dataSources.isEmpty(); - } - - /** - * @exclude - */ - protected void destroyDataSources() - { - // - // This is part of a workaround for some strange behavior on webapp redeploy, which - // indirectly calls destroyDataSources. We keep track of whether there are any - // datasources configured, and if there are not, we don't call the base destroyDataSources(). - // - if ( _hasDataSources ) - { - super.destroyDataSources(); - } - } - - - /** * This method is almost exactly the same as the base class initModuleConfig. The only difference * is that it does not throw an UnavailableException if a module configuration file is missing or * invalid. @@ -377,24 +336,25 @@ if ( _log.isDebugEnabled() ) { - _log.debug( "Initializing module path '" + prefix + "' configuration from '" + paths + "'" ); + _log.debug( "Initializing module path '" + prefix + "' configuration from '" + paths + '\'' ); } // Parse the configuration for this module - ModuleConfig config = null; + ModuleConfig moduleConfig = null; InputStream input = null; - String mapping = null; + String mapping; + try { ModuleConfigFactory factoryObject = ModuleConfigFactory.createFactory(); - config = factoryObject.createModuleConfig( prefix ); + moduleConfig = factoryObject.createModuleConfig( prefix ); // Support for module-wide ActionMapping type override mapping = getServletConfig().getInitParameter( "mapping" ); if ( mapping != null ) { - config.setActionMappingClass( mapping ); + moduleConfig.setActionMappingClass( mapping ); } // Configure the Digester instance we will use @@ -403,8 +363,8 @@ // Process each specified resource path while ( paths.length() > 0 ) { - digester.push( config ); - String path = null; + digester.push( moduleConfig ); + String path; int comma = paths.indexOf( ',' ); if ( comma >= 0 ) { @@ -436,7 +396,7 @@ try { digester.parse( is ); - getServletContext().setAttribute( Globals.MODULE_KEY + prefix, config ); + getServletContext().setAttribute( Globals.MODULE_KEY + prefix, moduleConfig ); } catch ( Exception e ) { @@ -463,7 +423,7 @@ // Set the ControllerConfig to a MissingRootModuleControllerConfig. This is used by // PageFlowRequestProcessor. // - config.setControllerConfig( new MissingRootModuleControllerConfig() ); + moduleConfig.setControllerConfig( new MissingRootModuleControllerConfig() ); } else { @@ -495,7 +455,7 @@ // Force creation and registration of DynaActionFormClass instances // for all dynamic form beans we wil be using - FormBeanConfig fbs[] = config.findFormBeanConfigs(); + FormBeanConfig fbs[] = moduleConfig.findFormBeanConfigs(); for ( int i = 0; i < fbs.length; i++ ) { if ( fbs[i].getDynamic() ) @@ -508,16 +468,13 @@ // backwards compatibility only, will be removed later) if ( prefix.length() < 1 ) { - defaultControllerConfig( config ); - defaultMessageResourcesConfig( config ); - defaultFormBeansConfig( config ); - defaultForwardsConfig( config ); - defaultMappingsConfig( config ); + defaultControllerConfig( moduleConfig ); + defaultMessageResourcesConfig( moduleConfig ); } // Return the completed configuration object //config.freeze(); // Now done after plugins init - return ( config ); + return moduleConfig; } @@ -886,83 +843,6 @@ } } - - - /** - * Perform backwards-compatible configuration of an ActionFormBeans - * collection, and expose it as a servlet context attribute (as was - * used in Struts 1.0). Note that the current controller code does - * not (and should not) reference this attribute for any reason. - * - * @param config The ModuleConfig object for the default app - * - * @since Struts 1.1 - * @deprecated Will be removed in a release after Struts 1.1. - */ - private void defaultFormBeansConfig(ModuleConfig config) { - - FormBeanConfig fbcs[] = config.findFormBeanConfigs(); - ActionFormBeans afb = new ActionFormBeans(); - afb.setFast(false); - for (int i = 0; i < fbcs.length; i++) { - afb.addFormBean((ActionFormBean) fbcs[i]); - } - afb.setFast(true); - getServletContext().setAttribute(Globals.FORM_BEANS_KEY, afb); - - } - - - /** - * Perform backwards-compatible configuration of an ActionForwards - * collection, and expose it as a servlet context attribute (as was - * used in Struts 1.0). Note that the current controller code does - * not (and should not) reference this attribute for any reason. - * - * @param config The ModuleConfig object for the default app - * - * @since Struts 1.1 - * @deprecated Will be removed in a release after Struts 1.1. - */ - private void defaultForwardsConfig(ModuleConfig config) { - - ForwardConfig fcs[] = config.findForwardConfigs(); - ActionForwards af = new ActionForwards(); - af.setFast(false); - for (int i = 0; i < fcs.length; i++) { - af.addForward((ActionForward) fcs[i]); - } - af.setFast(true); - getServletContext().setAttribute(Globals.FORWARDS_KEY, af); - - } - - - /** - * Perform backwards-compatible configuration of an ActionMappings - * collection, and expose it as a servlet context attribute (as was - * used in Struts 1.0). Note that the current controller code does - * not (and should not) reference this attribute for any reason. - * - * @param config The ModuleConfig object for the default app - * - * @since Struts 1.1 - * @deprecated Will be removed in a release after Struts 1.1. - */ - private void defaultMappingsConfig(ModuleConfig config) { - - ActionConfig acs[] = config.findActionConfigs(); - ActionMappings am = new ActionMappings(); - am.setServlet(this); - am.setFast(false); - for (int i = 0; i < acs.length; i++) { - am.addMapping((ActionMapping) acs[i]); - } - am.setFast(true); - getServletContext().setAttribute(Globals.MAPPINGS_KEY, am); - - } - /** * Perform backwards-compatible configuration of the default module's Modified: incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowPageFilter.java Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowPageFilter.java?view=diff&rev=111689&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowPageFilter.java&r1=111688&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowPageFilter.java&r2=111689 ============================================================================== --- incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowPageFilter.java (original) +++ incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowPageFilter.java Sun Dec 12 21:14:05 2004 @@ -292,8 +292,15 @@ das.ensureModuleRegistered( curModulePath, request ); } - RequestUtils.selectModule( curModulePath, request, _servletContext ); - + // + // TODO: the only reason we have to do the getModuleConfig check below is that there's an NPE bug in + // ModuleUtils.selectModule(). I've entered http://issues.apache.org/bugzilla/show_bug.cgi?id=32661 . + // + if ( InternalUtils.getModuleConfig( curModulePath, _servletContext ) != null ) + { + RequestUtils.selectModule( curModulePath, request, _servletContext ); + } + if ( RequestUtils.getRequestModuleConfig( request ) == null ) { // Modified: incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/config/PageFlowControllerConfig.java Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/config/PageFlowControllerConfig.java?view=diff&rev=111689&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/config/PageFlowControllerConfig.java&r1=111688&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/config/PageFlowControllerConfig.java&r2=111689 ============================================================================== --- incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/config/PageFlowControllerConfig.java (original) +++ incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/config/PageFlowControllerConfig.java Sun Dec 12 21:14:05 2004 @@ -95,6 +95,12 @@ public void setSharedFlows( String sharedFlows ) { + if ( sharedFlows == null || sharedFlows.length() == 0 ) + { + _sharedFlowTypes = null; + return; + } + String[] keyValues = sharedFlows.split( "," ); _sharedFlowTypes = new LinkedHashMap< String, String >();
