dgraham     2003/07/02 18:47:06

  Modified:    src/share/org/apache/struts Globals.java
               src/share/org/apache/struts/action ActionServlet.java
               src/share/org/apache/struts/util RequestUtils.java
  Log:
  Moved initialization of module prefix list to the new 
  ActionServlet.initModulePrefixes() method from RequestUtils.getModulePrefixes()
  because of a potential race condition documented in PR# 21091.  This also 
  required a move of the RequestUtils.PREFIXES constant to 
  Globals.MODULE_PREFIXES_KEY.
  
  Revision  Changes    Path
  1.6       +15 -16    jakarta-struts/src/share/org/apache/struts/Globals.java
  
  Index: Globals.java
  ===================================================================
  RCS file: /home/cvs/jakarta-struts/src/share/org/apache/struts/Globals.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- Globals.java      16 Feb 2003 02:51:32 -0000      1.5
  +++ Globals.java      3 Jul 2003 01:47:05 -0000       1.6
  @@ -7,7 +7,7 @@
    *
    * The Apache Software License, Version 1.1
    *
  - * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights
  + * Copyright (c) 1999-2003 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
  @@ -59,26 +59,17 @@
    *
    */
   
  -
   package org.apache.struts;
   
  -
   import java.io.Serializable;
   
  -
   /**
  - * <p>Global manifest constants for the entire Struts Framework.</p>
  - *
  - * <p>Many of these constants were initially defined in <code>Action</code>,
  - * but were moved here so that they could be referenced without referencing
  - * the <code>Action</code> class itself.  For backwards compatibility,
  - * constant references there point at this class, and the constant values
  - * themselves have not changed.</p>
  + * Global manifest constants for the entire Struts Framework.
    *
    * @author Craig R. McClanahan
  + * @author David Graham
    * @version $Revision$ $Date$
    */
  -
   public class Globals implements Serializable {
   
   
  @@ -138,6 +129,14 @@
        */
       public static final String MODULE_KEY =
           "org.apache.struts.action.MODULE";
  +        
  +    /**
  +     * The ServletContext attribute under which we store the module prefixes 
  +     * String[].
  +     * @since Struts 1.2
  +     */
  +    public static final String MODULE_PREFIXES_KEY =
  +        "org.apache.struts.globals.MODULE_PREFIXES";
   
   
       /**
  
  
  
  1.154     +39 -7     
jakarta-struts/src/share/org/apache/struts/action/ActionServlet.java
  
  Index: ActionServlet.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/action/ActionServlet.java,v
  retrieving revision 1.153
  retrieving revision 1.154
  diff -u -r1.153 -r1.154
  --- ActionServlet.java        2 Jul 2003 04:02:40 -0000       1.153
  +++ ActionServlet.java        3 Jul 2003 01:47:05 -0000       1.154
  @@ -72,6 +72,7 @@
   import java.util.Iterator;
   import java.util.MissingResourceException;
   
  +import javax.servlet.ServletContext;
   import javax.servlet.ServletException;
   import javax.servlet.UnavailableException;
   import javax.servlet.http.HttpServlet;
  @@ -445,13 +446,15 @@
           initOther();
           initServlet();
   
  -        // Initialize modules as needed
           getServletContext().setAttribute(Globals.ACTION_SERVLET_KEY, this);
  +        
  +        // Initialize modules as needed
           ModuleConfig moduleConfig = initModuleConfig("", config);
           initModuleMessageResources(moduleConfig);
           initModuleDataSources(moduleConfig);
           initModulePlugIns(moduleConfig);
           moduleConfig.freeze();
  +        
           Enumeration names = getServletConfig().getInitParameterNames();
           while (names.hasMoreElements()) {
               String name = (String) names.nextElement();
  @@ -466,8 +469,37 @@
               initModulePlugIns(moduleConfig);
               moduleConfig.freeze();
           }
  -        destroyConfigDigester();
  -
  +        
  +        this.initModulePrefixes(this.getServletContext());
  +        
  +        this.destroyConfigDigester();
  +    }
  +    
  +    /**
  +     * Saves a String[] of module prefixes in the ServletContext under 
  +     * Globals.MODULE_PREFIXES_KEY.  <strong>NOTE</strong> -
  +     * the "" prefix for the default module is not included in this list.
  +     * 
  +     * @since Struts 1.2
  +     */
  +    protected void initModulePrefixes(ServletContext context) {
  +        ArrayList prefixList = new ArrayList();
  +        
  +        Enumeration names = context.getAttributeNames();
  +        while (names.hasMoreElements()) {
  +            String name = (String) names.nextElement();
  +            if (!name.startsWith(Globals.MODULE_KEY)) {
  +                continue;
  +            }
  +            
  +            String prefix = name.substring(Globals.MODULE_KEY.length());
  +            if (prefix.length() > 0) {
  +                prefixList.add(prefix);
  +            }
  +        }
  +        
  +        String[] prefixes = (String[]) prefixList.toArray(new 
String[prefixList.size()]);
  +        context.setAttribute(Globals.MODULE_PREFIXES_KEY, prefixes);
       }
   
   
  
  
  
  1.107     +9 -37     
jakarta-struts/src/share/org/apache/struts/util/RequestUtils.java
  
  Index: RequestUtils.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/util/RequestUtils.java,v
  retrieving revision 1.106
  retrieving revision 1.107
  diff -u -r1.106 -r1.107
  --- RequestUtils.java 2 Jul 2003 03:09:47 -0000       1.106
  +++ RequestUtils.java 3 Jul 2003 01:47:05 -0000       1.107
  @@ -133,11 +133,6 @@
        */
       private static MessageResources messages =
           MessageResources.getMessageResources("org.apache.struts.util.LocalStrings");
  -
  -    /**
  -     * The context attribute under which we store our prefixes list.
  -     */
  -    private static final String PREFIXES_KEY = "org.apache.struts.util.PREFIXES";
       
       /**
        * Java 1.4 encode method to use instead of deprecated 1.3 version.
  @@ -1844,38 +1839,15 @@
   
       /**
        * Return the list of module prefixes that are defined for
  -     * this web application, creating it if necessary.  <strong>NOTE</strong> -
  +     * this web application.  <strong>NOTE</strong> -
        * the "" prefix for the default module is not included in this list.
        *
  -     * @param context The ServletContext for this web application
  -     * @return an array of module prefixes
  +     * @param context The ServletContext for this web application.
  +     * @return An array of module prefixes.
        * @since Struts 1.1
        */
  -    public synchronized static String[] getModulePrefixes(ServletContext context) {
  -        // TODO Move prefix list initialization to ActionServlet.init() and 
unsynchronize
  -        // this method in Struts 1.2 
  -        
  -        String prefixes[] = (String[]) context.getAttribute(PREFIXES_KEY);
  -        if (prefixes != null) {
  -            return (prefixes);
  -        }
  -
  -        ArrayList list = new ArrayList();
  -        Enumeration names = context.getAttributeNames();
  -        while (names.hasMoreElements()) {
  -            String name = (String) names.nextElement();
  -            if (!name.startsWith(Globals.MODULE_KEY)) {
  -                continue;
  -            }
  -            String prefix = name.substring(Globals.MODULE_KEY.length());
  -            if (prefix.length() > 0) {
  -                list.add(prefix);
  -            }
  -        }
  -        prefixes = (String[]) list.toArray(new String[list.size()]);
  -        context.setAttribute(PREFIXES_KEY, prefixes);
  -        return (prefixes);
  -
  +    public static String[] getModulePrefixes(ServletContext context) {
  +        return (String[]) context.getAttribute(Globals.MODULE_PREFIXES_KEY);
       }
   
       /**
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to