ekbush      2002/10/15 10:37:25

  Modified:    src/share/org/apache/struts/util RequestUtils.java
  Log:
  Change RequestUtils.selectApplication so that it looks for an exact match
  rather than using the startsWith criteria.  This fixes a problem where
  an incorrect module would be selected that either became aparant when
  the application had modules where the name of one could be used as the "root"
  of the other.  The bug also manifests itself when an action is invoked from
  the default module, which has a path that could be interpreted as a "root" of
  a non-default module.
  
  Ex:  modules /foo and /foobar
       module /foo and action /foo in the default module
  
  PR: 12702
  
  Revision  Changes    Path
  1.61      +33 -11    
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.60
  retrieving revision 1.61
  diff -u -r1.60 -r1.61
  --- RequestUtils.java 14 Oct 2002 18:16:19 -0000      1.60
  +++ RequestUtils.java 15 Oct 2002 17:37:25 -0000      1.61
  @@ -1424,19 +1424,41 @@
           // Acquire the path used to compute the module
           String matchPath = (String)
               request.getAttribute(RequestProcessor.INCLUDE_SERVLET_PATH);
  +     
           if (matchPath == null) {
               matchPath = request.getServletPath();
           }
   
  -        // Match against the list of module prefixes
  -        String prefix = "";
  -        String prefixes[] = getApplicationPrefixes(context);
  -        for (int i = 0; i < prefixes.length; i++) {
  -            if (matchPath.startsWith(prefixes[i])) {
  -                prefix = prefixes[i];
  -                break;
  +        if (LOG.isDebugEnabled())
  +            {
  +                LOG.debug("Selecting module for path " + matchPath);
  +            }
  +
  +        String prefix = "";  // Initialize prefix before we try lookup
  +        String prefixes[] =
  +            getApplicationPrefixes(context); // Get all other possible prefixes
  +        int lastSlash = 0;  // Initialize before loop
  +        
  +        while (prefix.equals("") &&
  +               ((lastSlash = matchPath.lastIndexOf("/")) != 0)) {
  +            
  +            // We may be in a non-default sub-app.  Try to get it's prefix.
  +            matchPath = matchPath.substring(0, lastSlash);
  +            
  +            // Match against the list of module prefixes
  +            for (int i = 0; i < prefixes.length; i++) {
  +                if (matchPath.equals(prefixes[i])) {
  +                    prefix = prefixes[i];
  +                    break;
  +                }
               }
           }
  +
  +        if (LOG.isDebugEnabled())
  +            {
  +                LOG.debug("Activating module " +
  +                          (prefix.equals("") ? "default" : prefix));
  +            }
   
           // Expose the resources for this module
           selectApplication(prefix, request, context);
  
  
  

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

Reply via email to