husted      2004/02/13 03:07:55

  Modified:    doc/userGuide struts-html.xml
               src/share/org/apache/struts/action RequestProcessor.java
               src/share/org/apache/struts/config ForwardConfig.java
               src/share/org/apache/struts/taglib TagUtils.java
               src/share/org/apache/struts/util RequestUtils.java
               src/test/org/apache/struts/util TestRequestUtils.java
               web/examples/WEB-INF struts-config.xml
               web/examples/WEB-INF/exercise struts-config.xml
               web/examples/exercise html-link.jsp
               web/exercise-taglib html-link.jsp
               web/exercise-taglib/WEB-INF web.xml
  Log:
  Apply additional patch per #24235 " html:link tag plus module support" submitted by 
Gary Ashley.
  
  Revision  Changes    Path
  1.75      +85 -9     jakarta-struts/doc/userGuide/struts-html.xml
  
  Index: struts-html.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-struts/doc/userGuide/struts-html.xml,v
  retrieving revision 1.74
  retrieving revision 1.75
  diff -u -r1.74 -r1.75
  --- struts-html.xml   1 Feb 2004 18:53:05 -0000       1.74
  +++ struts-html.xml   13 Feb 2004 11:07:54 -0000      1.75
  @@ -1617,10 +1617,29 @@
                  <code>forward</code> attribute, the
                  <code>href</code> attribute,
                  or the <code>page</code> attribute.</p>
  -           </info>
  -       </attribute>
  +               
  +                    <p>Additionally, you can specify a <code>module</code> prefix 
  +                        for linking to other modules.</p>
  +                                                
  +                </info>
  +         </attribute>
  +                
  +         <attribute>
  +                <name>module</name>
  +                <required>false</required>
  +                <rtexprvalue>true</rtexprvalue>
  +                <info>
  +                        <p>Prefix name of a <code>Module</code> that
  +                    contains the action mapping for the <code>Action</code>
  +                    that is specified by the <code>action</code> attribute.
  +                    You <strong>must</strong> specify an <code>action</code> 
  +                    attribute for this to have an effect.</p>
  +             
  +                    <p><strong>Note: </strong>Use "" to map to the default 
module.</p>
  +               </info>
  +         </attribute>
   
  -       <attribute>
  +          <attribute>
               <name>anchor</name>
               <required>false</required>
               <rtexprvalue>true</rtexprvalue>
  @@ -3036,8 +3055,27 @@
                 <strong>must</strong> specify the <code>action</code>,
                 <code>page</code>
                     attribute or the <code>src</code> attribute.</p>
  -              </info>
  -            </attribute>
  +               
  +                    <p>Additionally, you can specify a <code>module</code> prefix 
  +                        for linking to other modules.</p>
  +                                                
  +                        </info>
  +                      </attribute>
  +                                     
  +                      <attribute>
  +                        <name>module</name>
  +                        <required>false</required>
  +                        <rtexprvalue>true</rtexprvalue>
  +                        <info>
  +                                <p>Prefix name of a <code>Module</code> that
  +                                contains the action mapping for the 
<code>Action</code>
  +                                that is specified by the <code>action</code> 
attribute.
  +                                You <strong>must</strong> specify an 
<code>action</code> 
  +                                attribute for this to have an effect.</p>
  +                     
  +                                <p><strong>Note: </strong>Use "" to map to the 
default module.</p>
  +                       </info>
  +                      </attribute>
   
                   <attribute>
                     <name>paramName</name>
  @@ -3487,8 +3525,27 @@
                     <code>forward</code> attribute, the
                     <code>href</code> attribute, the <code>linkName</code>
                     attribute, or the <code>page</code> attribute.</p>
  -                  </info>
  -                </attribute>
  +               
  +                    <p>Additionally, you can specify a <code>module</code> prefix 
  +                        for linking to other modules.</p>
  +                                                
  +                        </info>
  +                      </attribute>
  +                                     
  +                      <attribute>
  +                        <name>module</name>
  +                        <required>false</required>
  +                        <rtexprvalue>true</rtexprvalue>
  +                        <info>
  +                                <p>Prefix name of a <code>Module</code> that
  +                                contains the action mapping for the 
<code>Action</code>
  +                                that is specified by the <code>action</code> 
attribute.
  +                                You <strong>must</strong> specify an 
<code>action</code> 
  +                                attribute for this to have an effect.</p>
  +                     
  +                                <p><strong>Note: </strong>Use "" to map to the 
default module.</p>
  +                       </info>
  +                      </attribute>
   
                   <attribute>
                     <name>anchor</name>
  @@ -5631,8 +5688,27 @@
                     <code>forward</code> attribute, the
                     <code>href</code> attribute, or the <code>page</code>
                     attribute.</p>
  -                  </info>
  -                </attribute>
  +               
  +                    <p>Additionally, you can specify a <code>module</code> prefix 
  +                        for linking to other modules.</p>
  +                                                
  +                        </info>
  +                      </attribute>
  +                                     
  +                      <attribute>
  +                        <name>module</name>
  +                        <required>false</required>
  +                        <rtexprvalue>true</rtexprvalue>
  +                        <info>
  +                                <p>Prefix name of a <code>Module</code> that
  +                                contains the action mapping for the 
<code>Action</code>
  +                                that is specified by the <code>action</code> 
attribute.
  +                                You <strong>must</strong> specify an 
<code>action</code> 
  +                                attribute for this to have an effect.</p>
  +                     
  +                                <p><strong>Note: </strong>Use "" to map to the 
default module.</p>
  +                       </info>
  +                      </attribute>
   
                   <attribute>
                     <name>anchor</name>
  
  
  
  1.43      +5 -5      
jakarta-struts/src/share/org/apache/struts/action/RequestProcessor.java
  
  Index: RequestProcessor.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/action/RequestProcessor.java,v
  retrieving revision 1.42
  retrieving revision 1.43
  diff -u -r1.42 -r1.43
  --- RequestProcessor.java     10 Jan 2004 21:03:38 -0000      1.42
  +++ RequestProcessor.java     13 Feb 2004 11:07:54 -0000      1.43
  @@ -413,7 +413,7 @@
           // paths not starting with / should be passed through without any processing
           // (ie. they're absolute)
           if (forwardPath.startsWith("/")) {
  -            uri = RequestUtils.forwardURL(request, forward);    // get module 
relative uri
  +            uri = RequestUtils.forwardURL(request, forward, null);    // get module 
relative uri
           } else {
               uri = forwardPath;
           }
  
  
  
  1.12      +23 -4     
jakarta-struts/src/share/org/apache/struts/config/ForwardConfig.java
  
  Index: ForwardConfig.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/config/ForwardConfig.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- ForwardConfig.java        13 Jan 2004 12:48:45 -0000      1.11
  +++ ForwardConfig.java        13 Feb 2004 11:07:54 -0000      1.12
  @@ -181,6 +181,7 @@
        * <p>The URL to which this <code>ForwardConfig</code> entry points,
        * which must start with a slash ("/") character.  It is
        * interpreted according to the following rules:</p>
  +     * <ul>
        * <li>If <code>contextRelative</code> property is <code>true</code>, the
        *     path is considered to be context-relative within the current web
        *     application (even if we are in a named module).  It will be
  @@ -208,6 +209,24 @@
           }
           this.path = path;
       }
  +
  +
  +     /**
  +      * <p>The prefix of the module to which this <code>ForwardConfig</code> entry 
points,
  +      * which must start with a slash ("/") character.  </p>
  +      */
  +     protected String module = null;
  +
  +     public String getModule() {
  +             return (this.module);
  +     }
  +
  +     public void setModule(String module) {
  +             if (configured) {
  +                     throw new IllegalStateException("Configuration is frozen");
  +             }
  +             this.module = module;
  +     }
   
   
       /**
  
  
  
  1.32      +18 -19    jakarta-struts/src/share/org/apache/struts/taglib/TagUtils.java
  
  Index: TagUtils.java
  ===================================================================
  RCS file: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/TagUtils.java,v
  retrieving revision 1.31
  retrieving revision 1.32
  diff -u -r1.31 -r1.32
  --- TagUtils.java     7 Feb 2004 15:55:02 -0000       1.31
  +++ TagUtils.java     13 Feb 2004 11:07:54 -0000      1.32
  @@ -478,24 +478,24 @@
           }
   
           // Look up the module configuration for this request
  -        ModuleConfig config = instance.getModuleConfig(module, pageContext);
  +        ModuleConfig moduleConfig = instance.getModuleConfig(module, pageContext);
   
           // Calculate the appropriate URL
           StringBuffer url = new StringBuffer();
           HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
           if (forward != null) {
  -            ForwardConfig fc = config.findForwardConfig(forward);
  -            if (fc == null) {
  +            ForwardConfig forwardConfig = moduleConfig.findForwardConfig(forward);
  +            if (forwardConfig == null) {
                   throw new 
MalformedURLException(messages.getMessage("computeURL.forward", forward));
               }
  -            if (fc.getRedirect()) {
  +            if (forwardConfig.getRedirect()) {
                   redirect = true;
               }
  -            if (fc.getPath().startsWith("/")) {
  +            if (forwardConfig.getPath().startsWith("/")) {
                   url.append(request.getContextPath());
  -                url.append(RequestUtils.forwardURL(request, fc));
  +                url.append(RequestUtils.forwardURL(request, forwardConfig, 
moduleConfig));
               } else {
  -                url.append(fc.getPath());
  +                url.append(forwardConfig.getPath());
               }
           } else if (href != null) {
               url.append(href);
  @@ -504,7 +504,7 @@
   
           } else /* if (page != null) */ {
               url.append(request.getContextPath());
  -            url.append(this.pageURL(request, page));
  +            url.append(this.pageURL(request, page, moduleConfig));
           }
   
           // Add anchor if requested (replacing any existing anchor)
  @@ -796,10 +796,10 @@
   
           HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
           StringBuffer value = new StringBuffer(request.getContextPath());
  -        ModuleConfig config = ModuleUtils.getInstance().getModuleConfig(module, 
request, pageContext.getServletContext());
  +        ModuleConfig moduleConfig = 
ModuleUtils.getInstance().getModuleConfig(module, request, 
pageContext.getServletContext());
   
  -        if ((config != null) && (!contextRelative)) {
  -            value.append(config.getPrefix());
  +        if ((moduleConfig != null) && (!contextRelative)) {
  +            value.append(moduleConfig.getPrefix());
           }
   
           // Use our servlet mapping, if one is specified
  @@ -1149,10 +1149,9 @@
        * (<strong>MUST</strong> start with a slash)
        * @return context-relative URL
        */
  -    public String pageURL(HttpServletRequest request, String page) {
  +    public String pageURL(HttpServletRequest request, String page, ModuleConfig 
moduleConfig) {
   
           StringBuffer sb = new StringBuffer();
  -        ModuleConfig moduleConfig = 
ModuleUtils.getInstance().getModuleConfig(request);
           String pagePattern = moduleConfig.getControllerConfig().getPagePattern();
   
           if (pagePattern == null) {
  @@ -1257,10 +1256,10 @@
           }
   
           if (resources == null) {
  -            ModuleConfig config = getModuleConfig(pageContext);
  +            ModuleConfig moduleConfig = getModuleConfig(pageContext);
               resources =
                       (MessageResources) pageContext.getAttribute(
  -                            bundle + config.getPrefix(),
  +                            bundle + moduleConfig.getPrefix(),
                               PageContext.APPLICATION_SCOPE);
           }
           
  
  
  
  1.146     +120 -110  
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.145
  retrieving revision 1.146
  diff -u -r1.145 -r1.146
  --- RequestUtils.java 7 Feb 2004 15:55:02 -0000       1.145
  +++ RequestUtils.java 13 Feb 2004 11:07:54 -0000      1.146
  @@ -753,112 +753,120 @@
           return sb.toString();
   
       }
  +    
  +     /**
  +      * <p>Return the context-relative URL that corresponds to the specified
  +      * <code>ForwardConfig</code>. The URL is calculated based on the properties
  +      * of the [EMAIL PROTECTED] ForwardConfig} instance as follows:</p>
  +      * <ul>
  +      * <li>If the <code>contextRelative</code> property is set, it is
  +      *     assumed that the <code>path</code> property contains a path
  +      *     that is already context-relative:
  +      *     <ul>
  +      *     <li>If the <code>path</code> property value starts with a slash,
  +      *         it is returned unmodified.</li>
  +      *     <li>If the <code>path</code> property value does not start
  +      *         with a slash, a slash is prepended.</li>
  +      *     </ul></li>
  +      * <li>Acquire the <code>forwardPattern</code> property from the
  +      *     <code>ControllerConfig</code> for the application module used
  +      *     to process this request. If no pattern was configured, default
  +      *     to a pattern of <code>$M$P</code>, which is compatible with the
  +      *     hard-coded mapping behavior in Struts 1.0.</li>
  +      * <li>Process the acquired <code>forwardPattern</code>, performing the
  +      *     following substitutions:
  +      *     <ul>
  +      *     <li><strong>$M</strong> - Replaced by the module prefix for the
  +      *         application module processing this request.</li>
  +      *     <li><strong>$P</strong> - Replaced by the <code>path</code>
  +      *         property of the specified [EMAIL PROTECTED] ForwardConfig}, 
prepended
  +      *         with a slash if it does not start with one.</li>
  +      *     <li><strong>$$</strong> - Replaced by a single dollar sign
  +      *         character.</li>
  +      *     <li><strong>$x</strong> (where "x" is any charater not listed
  +      *         above) - Silently omit these two characters from the result
  +      *         value.  (This has the side effect of causing all other
  +      *         $+letter combinations to be reserved.)</li>
  +      *     </ul></li>
  +      * </ul>
  +      *
  +      * @param request The servlet request we are processing
  +      * @param forward ForwardConfig to be evaluated
  +      *
  +      * @return context-relative URL
  +      * @since Struts 1.1
  +      */
  +     public static String forwardURL(HttpServletRequest request, ForwardConfig 
forward, ModuleConfig moduleConfig) {
  +             //load the current moduleConfig, if null
  +             if(moduleConfig == null) {
  +                     moduleConfig = 
ModuleUtils.getInstance().getModuleConfig(request);
  +             }
  +                   
  +             String path = forward.getPath();
  +             //load default prefix
  +             String prefix = moduleConfig.getPrefix();
  +             
  +             //override prefix if supplied by forward
  +             if(forward.getModule() != null) {
  +                     prefix = forward.getModule();
  +             }
  +
  +             // Handle a ForwardConfig marked as context relative
  +             StringBuffer sb = new StringBuffer();
  +             if (forward.getContextRelative()) {
  +                     if (!path.startsWith("/")) {
  +                             sb.append("/");
  +                     }
  +                     sb.append(path);
  +                     return (sb.toString());
  +             }
  +
  +             // Calculate a context relative path for this ForwardConfig
  +             String forwardPattern = 
moduleConfig.getControllerConfig().getForwardPattern();
  +             if (forwardPattern == null) {
  +                     // Performance optimization for previous default behavior
  +                     sb.append(prefix);
  +                     // smoothly insert a '/' if needed
  +                     if (!path.startsWith("/")) {
  +                             sb.append("/");
  +                     }
  +                     sb.append(path);
  +
  +             } else {
  +                     boolean dollar = false;
  +                     for (int i = 0; i < forwardPattern.length(); i++) {
  +                             char ch = forwardPattern.charAt(i);
  +                             if (dollar) {
  +                                     switch (ch) {
  +                                             case 'M':
  +                                                     sb.append(prefix);
  +                                                     break;
  +                                             case 'P':
  +                                                     // add '/' if needed
  +                                                     if (!path.startsWith("/")) {
  +                                                             sb.append("/");
  +                                                     }
  +                                                     sb.append(path);
  +                                                     break;
  +                                             case '$':
  +                                                     sb.append('$');
  +                                                     break;
  +                                             default :
  +                                                     ; // Silently swallow
  +                                     }
  +                                     dollar = false;
  +                                     continue;
  +                             } else if (ch == '$') {
  +                                     dollar = true;
  +                             } else {
  +                                     sb.append(ch);
  +                             }
  +                     }
  +             }
   
  +             return (sb.toString());
   
  -    /**
  -     * <p>Return the context-relative URL that corresponds to the specified
  -     * <code>ForwardConfig</code>. The URL is calculated based on the properties
  -     * of the [EMAIL PROTECTED] ForwardConfig} instance as follows:</p>
  -     * <ul>
  -     * <li>If the <code>contextRelative</code> property is set, it is
  -     *     assumed that the <code>path</code> property contains a path
  -     *     that is already context-relative:
  -     *     <ul>
  -     *     <li>If the <code>path</code> property value starts with a slash,
  -     *         it is returned unmodified.</li>
  -     *     <li>If the <code>path</code> property value does not start
  -     *         with a slash, a slash is prepended.</li>
  -     *     </ul></li>
  -     * <li>Acquire the <code>forwardPattern</code> property from the
  -     *     <code>ControllerConfig</code> for the application module used
  -     *     to process this request. If no pattern was configured, default
  -     *     to a pattern of <code>$M$P</code>, which is compatible with the
  -     *     hard-coded mapping behavior in Struts 1.0.</li>
  -     * <li>Process the acquired <code>forwardPattern</code>, performing the
  -     *     following substitutions:
  -     *     <ul>
  -     *     <li><strong>$M</strong> - Replaced by the module prefix for the
  -     *         application module processing this request.</li>
  -     *     <li><strong>$P</strong> - Replaced by the <code>path</code>
  -     *         property of the specified [EMAIL PROTECTED] ForwardConfig}, prepended
  -     *         with a slash if it does not start with one.</li>
  -     *     <li><strong>$$</strong> - Replaced by a single dollar sign
  -     *         character.</li>
  -     *     <li><strong>$x</strong> (where "x" is any charater not listed
  -     *         above) - Silently omit these two characters from the result
  -     *         value.  (This has the side effect of causing all other
  -     *         $+letter combinations to be reserved.)</li>
  -     *     </ul></li>
  -     * </ul>
  -     *
  -     * @param request The servlet request we are processing
  -     * @param forward ForwardConfig to be evaluated
  -     *
  -     * @return context-relative URL
  -     * @since Struts 1.1
  -     */
  -    public static String forwardURL(HttpServletRequest request, ForwardConfig 
forward) {
  -
  -        String path = forward.getPath();
  -
  -        // Handle a ForwardConfig marked as context relative
  -        StringBuffer sb = new StringBuffer();
  -        if (forward.getContextRelative()) {
  -            if (!path.startsWith("/")) {
  -                sb.append("/");
  -            }
  -            sb.append(path);
  -            return (sb.toString());
  -        }
  -
  -        // Calculate a context relative path for this ForwardConfig
  -        ModuleConfig moduleConfig =
  -                ModuleUtils.getInstance().getModuleConfig(request);
  -        String forwardPattern = 
moduleConfig.getControllerConfig().getForwardPattern();
  -        if (forwardPattern == null) {
  -            // Performance optimization for previous default behavior
  -            sb.append(moduleConfig.getPrefix());
  -            // smoothly insert a '/' if needed
  -            if (!path.startsWith("/")) {
  -                sb.append("/");
  -            }
  -            sb.append(path);
  -
  -        } else {
  -            boolean dollar = false;
  -            for (int i = 0; i < forwardPattern.length(); i++) {
  -                char ch = forwardPattern.charAt(i);
  -                if (dollar) {
  -                    switch (ch) {
  -                        case 'M':
  -                            sb.append(moduleConfig.getPrefix());
  -                            break;
  -                        case 'P':
  -                            // add '/' if needed
  -                            if (!path.startsWith("/")) {
  -                                sb.append("/");
  -                            }
  -                            sb.append(path);
  -                            break;
  -                        case '$':
  -                            sb.append('$');
  -                            break;
  -                        default :
  -                            ; // Silently swallow
  -                    }
  -                    dollar = false;
  -                    continue;
  -                } else if (ch == '$') {
  -                    dollar = true;
  -                } else {
  -                    sb.append(ch);
  -                }
  -            }
  -        }
  -
  -        return (sb.toString());
  -
  -    }
  +     }
   
   
       /**
  @@ -1572,8 +1580,10 @@
        * This will be removed after Struts 1.2.
        */
       public static String pageURL(HttpServletRequest request, String page) {
  -
  -        return TagUtils.getInstance().pageURL(request, page);
  +     //load the current moduleConfig
  +             ModuleConfig moduleConfig = 
ModuleUtils.getInstance().getModuleConfig(request);
  +             
  +        return TagUtils.getInstance().pageURL(request, page, moduleConfig);
           //:TODO: Remove after Struts 1.2
   
       }
  
  
  
  1.25      +87 -22    
jakarta-struts/src/test/org/apache/struts/util/TestRequestUtils.java
  
  Index: TestRequestUtils.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-struts/src/test/org/apache/struts/util/TestRequestUtils.java,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- TestRequestUtils.java     13 Jan 2004 12:48:57 -0000      1.24
  +++ TestRequestUtils.java     13 Feb 2004 11:07:54 -0000      1.25
  @@ -1218,7 +1218,7 @@
           // redirect=false, contextRelative=false
           forward = moduleConfig.findForwardConfig("moduleForward");
           assertNotNull("moduleForward found", forward);
  -        result = RequestUtils.forwardURL(request, forward);
  +        result = RequestUtils.forwardURL(request, forward, null);
           assertNotNull("moduleForward computed", result);
           assertEquals("moduleForward value",
                        "/module/forward",
  @@ -1227,7 +1227,7 @@
           // redirect=true, contextRelative=false
           forward = moduleConfig.findForwardConfig("moduleRedirect");
           assertNotNull("moduleRedirect found", forward);
  -        result = RequestUtils.forwardURL(request, forward);
  +        result = RequestUtils.forwardURL(request, forward, null);
           assertNotNull("moduleRedirect computed", result);
           assertEquals("moduleRedirect value",
                        "/module/redirect",
  @@ -1236,7 +1236,7 @@
           // redirect=false, contextRelative=true
           forward = moduleConfig.findForwardConfig("contextForward");
           assertNotNull("contextForward found", forward);
  -        result = RequestUtils.forwardURL(request, forward);
  +        result = RequestUtils.forwardURL(request, forward, null);
           assertNotNull("contextForward computed", result);
           assertEquals("contextForward value",
                        "/context/forward",
  @@ -1245,7 +1245,7 @@
           // redirect=true, contextRelative=true
           forward = moduleConfig.findForwardConfig("contextRedirect");
           assertNotNull("contextRedirect found", forward);
  -        result = RequestUtils.forwardURL(request, forward);
  +        result = RequestUtils.forwardURL(request, forward, null);
           assertNotNull("contextRedirect computed", result);
           assertEquals("contextRedirct value",
                        "/context/redirect",
  @@ -1254,7 +1254,7 @@
           // noslash, contextRelative=false
           forward = moduleConfig.findForwardConfig("moduleNoslash");
           assertNotNull("moduleNoslash found", forward);
  -        result = RequestUtils.forwardURL(request, forward);
  +        result = RequestUtils.forwardURL(request, forward, null);
           assertNotNull("moduleNoslash computed", result);
           assertEquals("moduleNoslash value",
                        "/module/noslash",
  @@ -1263,7 +1263,7 @@
           // noslash, contextRelative=true
           forward = moduleConfig.findForwardConfig("contextNoslash");
           assertNotNull("contextNoslash found", forward);
  -        result = RequestUtils.forwardURL(request, forward);
  +        result = RequestUtils.forwardURL(request, forward, null);
           assertNotNull("contextNoslash computed", result);
           assertEquals("contextNoslash value",
                        "/context/noslash",
  @@ -1283,7 +1283,7 @@
           // redirect=false, contextRelative=false
           forward = moduleConfig2.findForwardConfig("moduleForward");
           assertNotNull("moduleForward found", forward);
  -        result = RequestUtils.forwardURL(request, forward);
  +        result = RequestUtils.forwardURL(request, forward, null);
           assertNotNull("moduleForward computed", result);
           assertEquals("moduleForward value",
                        "/2/module/forward",
  @@ -1292,7 +1292,7 @@
           // redirect=true, contextRelative=false
           forward = moduleConfig2.findForwardConfig("moduleRedirect");
           assertNotNull("moduleRedirect found", forward);
  -        result = RequestUtils.forwardURL(request, forward);
  +        result = RequestUtils.forwardURL(request, forward, null);
           assertNotNull("moduleRedirect computed", result);
           assertEquals("moduleRedirect value",
                        "/2/module/redirect",
  @@ -1301,7 +1301,7 @@
           // redirect=false, contextRelative=true
           forward = moduleConfig2.findForwardConfig("contextForward");
           assertNotNull("contextForward found", forward);
  -        result = RequestUtils.forwardURL(request, forward);
  +        result = RequestUtils.forwardURL(request, forward, null);
           assertNotNull("contextForward computed", result);
           assertEquals("contextForward value",
                        "/context/forward",
  @@ -1310,7 +1310,7 @@
           // redirect=true, contextRelative=true
           forward = moduleConfig2.findForwardConfig("contextRedirect");
           assertNotNull("contextRedirect found", forward);
  -        result = RequestUtils.forwardURL(request, forward);
  +        result = RequestUtils.forwardURL(request, forward, null);
           assertNotNull("contextRedirect computed", result);
           assertEquals("contextRedirct value",
                        "/context/redirect",
  @@ -1319,7 +1319,7 @@
           // noslash, contextRelative=false
           forward = moduleConfig2.findForwardConfig("moduleNoslash");
           assertNotNull("moduleNoslash found", forward);
  -        result = RequestUtils.forwardURL(request, forward);
  +        result = RequestUtils.forwardURL(request, forward, null);
           assertNotNull("moduleNoslash computed", result);
           assertEquals("moduleNoslash value",
                        "/2/module/noslash",
  @@ -1328,7 +1328,7 @@
           // noslash, contextRelative=true
           forward = moduleConfig2.findForwardConfig("contextNoslash");
           assertNotNull("contextNoslash found", forward);
  -        result = RequestUtils.forwardURL(request, forward);
  +        result = RequestUtils.forwardURL(request, forward, null);
           assertNotNull("contextNoslash computed", result);
           assertEquals("contextNoslash value",
                        "/context/noslash",
  @@ -1348,7 +1348,7 @@
           // redirect=false, contextRelative=false
           forward = moduleConfig3.findForwardConfig("moduleForward");
           assertNotNull("moduleForward found", forward);
  -        result = RequestUtils.forwardURL(request, forward);
  +        result = RequestUtils.forwardURL(request, forward, null);
           assertNotNull("moduleForward computed", result);
           assertEquals("moduleForward value",
                        "/forwarding/3/module/forward",
  @@ -1357,7 +1357,7 @@
           // redirect=true, contextRelative=false
           forward = moduleConfig3.findForwardConfig("moduleRedirect");
           assertNotNull("moduleRedirect found", forward);
  -        result = RequestUtils.forwardURL(request, forward);
  +        result = RequestUtils.forwardURL(request, forward, null);
           assertNotNull("moduleRedirect computed", result);
           assertEquals("moduleRedirect value",
                        "/forwarding/3/module/redirect",
  @@ -1366,7 +1366,7 @@
           // redirect=false, contextRelative=true
           forward = moduleConfig3.findForwardConfig("contextForward");
           assertNotNull("contextForward found", forward);
  -        result = RequestUtils.forwardURL(request, forward);
  +        result = RequestUtils.forwardURL(request, forward, null);
           assertNotNull("contextForward computed", result);
           assertEquals("contextForward value",
                        "/context/forward",
  @@ -1375,7 +1375,7 @@
           // redirect=true, contextRelative=true
           forward = moduleConfig3.findForwardConfig("contextRedirect");
           assertNotNull("contextRedirect found", forward);
  -        result = RequestUtils.forwardURL(request, forward);
  +        result = RequestUtils.forwardURL(request, forward, null);
           assertNotNull("contextRedirect computed", result);
           assertEquals("contextRedirct value",
                        "/context/redirect",
  @@ -1384,7 +1384,7 @@
           // noslash, contextRelative=false
           forward = moduleConfig3.findForwardConfig("moduleNoslash");
           assertNotNull("moduleNoslash found", forward);
  -        result = RequestUtils.forwardURL(request, forward);
  +        result = RequestUtils.forwardURL(request, forward, null);
           assertNotNull("moduleNoslash computed", result);
           assertEquals("moduleNoslash value",
                        "/forwarding/3/module/noslash",
  @@ -1393,13 +1393,78 @@
           // noslash, contextRelative=true
           forward = moduleConfig3.findForwardConfig("contextNoslash");
           assertNotNull("contextNoslash found", forward);
  -        result = RequestUtils.forwardURL(request, forward);
  +        result = RequestUtils.forwardURL(request, forward, null);
           assertNotNull("contextNoslash computed", result);
           assertEquals("contextNoslash value",
                        "/context/noslash",
                        result);
   
       }
  +
  +
  +     // Cross module forwards
  +     public void testForwardURLa() {
  +
  +             request.setAttribute(Globals.MODULE_KEY, moduleConfig);
  +             request.setPathElements("/myapp", "/action.do", null, null);
  +             ForwardConfig forward = null;
  +             String result = null;
  +
  +             // redirect=false, contextRelative=false, link to module 3
  +             forward = moduleConfig3.findForwardConfig("moduleForward");
  +             assertNotNull("moduleForward found", forward);
  +             result = RequestUtils.forwardURL(request, forward, moduleConfig3);
  +             assertNotNull("moduleForward computed", result);
  +             assertEquals("moduleForward value",
  +                                      "/forwarding/3/module/forward",
  +                                      result);
  +
  +             // redirect=true, contextRelative=false, link to module 3
  +             forward = moduleConfig3.findForwardConfig("moduleRedirect");
  +             assertNotNull("moduleRedirect found", forward);
  +             result = RequestUtils.forwardURL(request, forward, moduleConfig3);
  +             assertNotNull("moduleRedirect computed", result);
  +             assertEquals("moduleRedirect value",
  +                                      "/forwarding/3/module/redirect",
  +                                      result);
  +
  +             // redirect=false, contextRelative=true, link to module 3
  +             forward = moduleConfig3.findForwardConfig("contextForward");
  +             assertNotNull("contextForward found", forward);
  +             result = RequestUtils.forwardURL(request, forward, moduleConfig3);
  +             assertNotNull("contextForward computed", result);
  +             assertEquals("contextForward value",
  +                                      "/context/forward",
  +                                      result);
  +
  +             // redirect=true, contextRelative=true, link to module 3
  +             forward = moduleConfig3.findForwardConfig("contextRedirect");
  +             assertNotNull("contextRedirect found", forward);
  +             result = RequestUtils.forwardURL(request, forward, moduleConfig3);
  +             assertNotNull("contextRedirect computed", result);
  +             assertEquals("contextRedirct value",
  +                                      "/context/redirect",
  +                                      result);
  +
  +             // noslash, contextRelative=false, link to module 3
  +             forward = moduleConfig3.findForwardConfig("moduleNoslash");
  +             assertNotNull("moduleNoslash found", forward);
  +             result = RequestUtils.forwardURL(request, forward, moduleConfig3);
  +             assertNotNull("moduleNoslash computed", result);
  +             assertEquals("moduleNoslash value",
  +                                      "/forwarding/3/module/noslash",
  +                                      result);
  +
  +             // noslash, contextRelative=true, link to module 3
  +             forward = moduleConfig3.findForwardConfig("contextNoslash");
  +             assertNotNull("contextNoslash found", forward);
  +             result = RequestUtils.forwardURL(request, forward, moduleConfig3);
  +             assertNotNull("contextNoslash computed", result);
  +             assertEquals("contextNoslash value",
  +                                      "/context/noslash",
  +                                      result);
  +
  +     }
   
   
       // -------------------------------------------------------------- pageURL()
  
  
  
  1.4       +2 -2      jakarta-struts/web/examples/WEB-INF/struts-config.xml
  
  Index: struts-config.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-struts/web/examples/WEB-INF/struts-config.xml,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- struts-config.xml 7 Feb 2004 00:09:33 -0000       1.3
  +++ struts-config.xml 13 Feb 2004 11:07:54 -0000      1.4
  @@ -13,7 +13,7 @@
       <forward name="welcome" path="/welcome.do" />
     </global-forwards>
     <action-mappings>
  -    <action path="/welcome" forward="/welcome.html" />
  +    <action path="/welcome" forward="/welcome.jsp" />
     </action-mappings>
     <message-resources parameter="MessageResources" />
   </struts-config>
  
  
  
  1.7       +1 -0      jakarta-struts/web/examples/WEB-INF/exercise/struts-config.xml
  
  Index: struts-config.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-struts/web/examples/WEB-INF/exercise/struts-config.xml,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- struts-config.xml 20 Jan 2004 03:57:02 -0000      1.6
  +++ struts-config.xml 13 Feb 2004 11:07:55 -0000      1.7
  @@ -16,6 +16,7 @@
       <forward name="relative" path="/welcome.do" />
       <forward name="redirect-default" path="/" redirect="true" />
       <forward name="logic-forward" path="/logic-forward.do" />
  +    <forward name="cross-module" module="" path="/welcome.do" />
     </global-forwards>
     <action-mappings>
       <action path="/welcome" forward="/index.html" />
  
  
  
  1.3       +90 -29    jakarta-struts/web/examples/exercise/html-link.jsp
  
  Index: html-link.jsp
  ===================================================================
  RCS file: /home/cvs/jakarta-struts/web/examples/exercise/html-link.jsp,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- html-link.jsp     17 Jan 2004 04:15:00 -0000      1.2
  +++ html-link.jsp     13 Feb 2004 11:07:55 -0000      1.3
  @@ -90,35 +90,61 @@
             </td>
           </tr>
           <tr>
  -          <th colspan="4" align="center">Hyperlinks To Be Tested via action 
attribute</th>
  -        </tr>
  -        <tr>
  -          <td colspan="4" align="center">
  -            <html:link action="/html-link-submit">No modifications at 
all</html:link>
  -          </td>
  -        </tr>
  -        <tr>
  -          <td colspan="4" align="center">
  -            <html:link 
action="/html-link-submit?doubleProperty=321.321&amp;longProperty=321321">Double and 
long via hard coded changes</html:link>
  -          </td>
  -        </tr>
  -        <tr>
  -          <td colspan="4" align="center">
  -            <html:link action="/html-link-submit" paramId="stringProperty" 
paramName="newValue">String via paramId and paramName</html:link>
  -          </td>
  -        </tr>
  -        <tr>
  -          <td colspan="4" align="center">
  -            <html:link action="/html-link-submit" paramId="booleanProperty" 
paramName="testbean" paramProperty="nested.booleanProperty">Boolean via paramId, 
paramName, and paramValue</html:link>
  -          </td>
  -        </tr>
  -        <tr>
  -          <td colspan="4" align="center">
  -            <html:link action="/html-link-submit" name="newValues">Float, int, and 
stringArray via name (Map)</html:link>
  -          </td>
  -        </tr>
  -        <tr>
  -          <th colspan="4" align="center">Reset and Cancel Buttons</th>
  +
  + <tr>
  +   <th colspan="4" align="center">
  +     Hyperlinks To Be Tested via action and module attributes
  +   </th>
  + </tr>
  +
  + <tr>
  +   <td colspan="4" align="center">
  +     <html:link action="/html-link">
  +       No modifications at all, but link to the default module.
  +     </html:link>
  +   </td>
  + </tr>
  +
  + <tr>
  +   <td colspan="4" align="center">
  +     <html:link action="/html-link?doubleProperty=321.321&amp;longProperty=321321"
  +                              module="/exercise">
  +       Double and long via hard coded changes (module)
  +     </html:link>
  +   </td>
  + </tr>
  +
  + <tr>
  +   <td colspan="4" align="center">
  +     <html:link action="/html-link"
  +             paramId="stringProperty" paramName="newValue">
  +       String via paramId and paramName
  +     </html:link>
  +   </td>
  + </tr>
  +
  + <tr>
  +   <td colspan="4" align="center">
  +     <html:link action="/html-link"
  +             paramId="booleanProperty"
  +             paramName="testbean" paramProperty="nested.booleanProperty"
  +                              module="/exercise">
  +       Boolean via paramId, paramName, and paramValue (module)
  +     </html:link>
  +   </td>
  + </tr>
  +
  + <tr>
  +   <td colspan="4" align="center">
  +     <html:link action="/html-link"
  +                name="newValues">
  +       Float, int, and stringArray via name (Map)
  +     </html:link>
  +   </td>
  + </tr>
  +
  +   <tr>
  +     <th colspan="4" align="center">Reset and Cancel Buttons</th>
           </tr>
           <tr>
             <td colspan="4" align="center">
  @@ -128,7 +154,9 @@
           </tr>
         </table>
       </html:form>
  +
       <p>The following list tests relative, context-relative, and absolute links. 
Press (back) to return.</p>
  +    <p>Forwards</p>
       <ul>
         <li>
           <html:link forward="relative">module welcome page</html:link>
  @@ -143,5 +171,38 @@
           <html:link forward="redirect-default">Redirect to the default page 
("/")</html:link>
         </li>
       </ul>
  +    <p>Actions</p>
  +    <ul>
  +      <li>
  +        <html:link action="/welcome" module="/">application welcome page</html:link>
  +        <!-- Test with empty string for module: <html:link action="/welcome" 
module="">application welcome page</html:link> -->
  +      </li>
  +      <li>
  +        <html:link action="/welcome" module="/exercise">Exercise module welcome 
page</html:link>
  +      </li>
  +      <li>
  +        <html:link action="/upload" module="/upload">Upload welcome page</html:link>
  +      </li>
  +      <li>
  +        <html:link action="/welcome" module="/validator">Validator welcome 
page</html:link>
  +      </li>
  +      </ul>
  +
  +    <p>Pages</p>
  +    <ul>
  +      <li>
  +        <html:link page="/welcome.do" module="">application welcome page</html:link>
  +        <%-- FIXME: "/" slash throws NPE: <html:link page="/welcome.do" 
module="/">application welcome page</html:link> --%>
  +      </li>
  +      <li>
  +        <html:link page="/welcome.do" module="/exercise">Exercise module welcome 
page</html:link>
  +      </li>
  +      <li>
  +        <html:link page="/upload.do" module="/upload">Upload welcome 
page</html:link>
  +      </li>
  +      <li>
  +        <html:link page="/welcome.do" module="/validator">Validator welcome 
page</html:link>
  +      </li>
  +      </ul>
     </body>
   </html:html>
  
  
  
  1.6       +55 -0     jakarta-struts/web/exercise-taglib/html-link.jsp
  
  Index: html-link.jsp
  ===================================================================
  RCS file: /home/cvs/jakarta-struts/web/exercise-taglib/html-link.jsp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- html-link.jsp     21 Dec 2003 22:46:27 -0000      1.5
  +++ html-link.jsp     13 Feb 2004 11:07:55 -0000      1.6
  @@ -178,6 +178,61 @@
         </html:link>
       </td>
     </tr>
  +
  +  <tr>
  +    <th colspan="4" align="center">
  +      Hyperlinks To Be Tested via action and module attributes
  +    </th>
  +  </tr>
  +
  +  <tr>
  +    <td colspan="4" align="center">
  +      <html:link action="/html-link"
  +                              module="">
  +        No modifications at all, but link to the default module.
  +      </html:link>
  +    </td>
  +  </tr>
  +
  +  <tr>
  +    <td colspan="4" align="center">
  +      <html:link 
action="/html-module-link?doubleProperty=321.321&amp;longProperty=321321"
  +                              module="/moduleA">
  +        Double and long via hard coded changes
  +      </html:link>
  +    </td>
  +  </tr>
  +
  +  <tr>
  +    <td colspan="4" align="center">
  +      <html:link action="/html-module-link"
  +              paramId="stringProperty" paramName="newValue"
  +              module="/moduleA">
  +        String via paramId and paramName
  +      </html:link>
  +    </td>
  +  </tr>
  +
  +  <tr>
  +    <td colspan="4" align="center">
  +      <html:link action="/html-module-link"
  +              paramId="booleanProperty"
  +              paramName="testbean" paramProperty="nested.booleanProperty"
  +              module="/moduleA">
  +        Boolean via paramId, paramName, and paramValue
  +      </html:link>
  +    </td>
  +  </tr>
  +
  +  <tr>
  +    <td colspan="4" align="center">
  +      <html:link action="/html-module-link"
  +                 name="newValues"
  +                 module="/moduleA">
  +        Float, int, and stringArray via name (Map)
  +      </html:link>
  +    </td>
  +  </tr>
     
     <tr>
       <th colspan="4" align="center">Reset and Cancel Buttons</th>
  
  
  
  1.5       +4 -0      jakarta-struts/web/exercise-taglib/WEB-INF/web.xml
  
  Index: web.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-struts/web/exercise-taglib/WEB-INF/web.xml,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- web.xml   22 Apr 2003 03:25:47 -0000      1.4
  +++ web.xml   13 Feb 2004 11:07:55 -0000      1.5
  @@ -20,6 +20,10 @@
         <param-value>/WEB-INF/struts-config.xml</param-value>
       </init-param>
       <init-param>
  +      <param-name>config/moduleA</param-name>
  +      <param-value>/WEB-INF/struts-moduleA.xml</param-value>
  +    </init-param>
  +    <init-param>
         <param-name>debug</param-name>
         <param-value>2</param-value>
       </init-param>
  
  
  

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

Reply via email to