You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@struts.apache.org by mr...@apache.org on 2003/09/29 05:23:30 UTC

cvs commit: jakarta-struts/src/share/org/apache/struts/util ActionMappingMatcher.java

mrdon       2003/09/28 20:23:30

  Modified:    src/share/org/apache/struts/action RequestProcessor.java
  Added:       src/share/org/apache/struts/action ActionMappingMatcher.java
  Removed:     src/share/org/apache/struts/util ActionMappingMatcher.java
  Log:
  Refactored for easier testing, changed package and access modifiers
  
  Revision  Changes    Path
  1.36      +5 -6      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.35
  retrieving revision 1.36
  diff -u -r1.35 -r1.36
  --- RequestProcessor.java	29 Sep 2003 01:24:21 -0000	1.35
  +++ RequestProcessor.java	29 Sep 2003 03:23:30 -0000	1.36
  @@ -82,7 +82,6 @@
   import org.apache.struts.config.ModuleConfig;
   import org.apache.struts.taglib.html.Constants;
   import org.apache.struts.upload.MultipartRequestWrapper;
  -import org.apache.struts.util.ActionMappingMatcher;
   import org.apache.struts.util.MessageResources;
   import org.apache.struts.util.RequestUtils;
   
  @@ -189,7 +188,7 @@
           
           this.servlet = servlet;
           this.moduleConfig = moduleConfig;
  -        matcher = new ActionMappingMatcher(moduleConfig);
  +        matcher = new ActionMappingMatcher(moduleConfig.findActionConfigs());
       }
   
       /**
  
  
  
  1.1                  jakarta-struts/src/share/org/apache/struts/action/ActionMappingMatcher.java
  
  Index: ActionMappingMatcher.java
  ===================================================================
  /*
   *  ====================================================================
   *
   *  The Apache Software License, Version 1.1
   *
   *  Copyright (c) 1999-2001 The Apache Software Foundation.  All rights
   *  reserved.
   *
   *  Redistribution and use in source and binary forms, with or without
   *  modification, are permitted provided that the following conditions
   *  are met:
   *
   *  1. Redistributions of source code must retain the above copyright
   *  notice, this list of conditions and the following disclaimer.
   *
   *  2. Redistributions in binary form must reproduce the above copyright
   *  notice, this list of conditions and the following disclaimer in
   *  the documentation and/or other materials provided with the
   *  distribution.
   *
   *  3. The end-user documentation included with the redistribution, if
   *  any, must include the following acknowlegement:
   *  "This product includes software developed by the
   *  Apache Software Foundation (http://www.apache.org/)."
   *  Alternately, this acknowlegement may appear in the software itself,
   *  if and wherever such third-party acknowlegements normally appear.
   *
   *  4. The names "The Jakarta Project", "Struts", and "Apache Software
   *  Foundation" must not be used to endorse or promote products derived
   *  from this software without prior written permission. For written
   *  permission, please contact apache@apache.org.
   *
   *  5. Products derived from this software may not be called "Apache"
   *  nor may "Apache" appear in their names without prior written
   *  permission of the Apache Group.
   *
   *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   *  DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   *  ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   *  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   *  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   *  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   *  SUCH DAMAGE.
   *  ====================================================================
   *
   *  This software consists of voluntary contributions made by many
   *  individuals on behalf of the Apache Software Foundation.  For more
   *  information on the Apache Software Foundation, please see
   *  <http://www.apache.org/>.
   *
   */
  package org.apache.struts.action;
  
  // Struts imports:
  import org.apache.struts.action.ActionMapping;
  import org.apache.struts.action.ActionForward;
  import org.apache.struts.config.ActionConfig;
  import org.apache.struts.config.ExceptionConfig;
  import org.apache.struts.config.ForwardConfig;
  import org.apache.struts.config.ModuleConfig;
  import org.apache.struts.util.WildcardHelper;
  
  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogFactory;
  
  import java.util.List;
  import java.util.ArrayList;
  import java.util.Map;
  import java.util.HashMap;
  import java.util.Iterator;
  
  
  /**
   *  Matches paths against pre-compiled wildcard expressions pulled from 
   *  action mappings. It uses the wildcard matcher from the Apache
   *  Cocoon project.
   *
   * @author    Don Brown
   */
  class ActionMappingMatcher {
  
      /**  
       * The logging instance 
       */
      private static final Log log =
          LogFactory.getLog(ActionMappingMatcher.class);
      
      /**  
       * The compiled paths and their associated ActionMapping's 
       */
      private List compiledPaths;
  
      /**
       *  Finds and precompiles the wildcard patterns from the ActionMapping
       *  "path" attributes.
       *  ActionMapping's will be evaluated in the order they exist in the
       *  Struts config file. Only paths that actually contain a wildcard
       *  will be compiled.
       *
       * @param  configs  An array of ActionConfig's to process
       */
      protected ActionMappingMatcher(ActionConfig[] configs) {
          compiledPaths = new ArrayList();
          int[] pattern;
          String path;
          for (int x = 0; x < configs.length; x++) {
              path = configs[x].getPath();
              if (path.indexOf('*') > -1) {
                  if (path.length() > 0 && path.charAt(0) == '/') {
                      path = path.substring(1);
                  }
                  if (log.isDebugEnabled()) {
                      log.debug("Compiling action mapping path '" + path + "'");
                  }    
                  pattern = WildcardHelper.compilePattern(path);
                  compiledPaths.add(new Mapping(pattern, configs[x]));
              }    
          }
      }
  
      /**
       *  Matches the path against the compiled wildcard patterns.
       *
       * @param  path             The portion of the request URI for selecting a
       *      mapping
       * @return                  The action mapping if matched, else null
       */
      protected ActionMapping match(String path) {
  
          ActionMapping mapping = null;
          if (compiledPaths.size() > 0) {
              if (log.isDebugEnabled()) {
                  log.debug("Attempting to match '" + path
                      + "' to a wildcard pattern");
              }    
              if (path.length() > 0 && path.charAt(0) == '/') {
                  path = path.substring(1);
              }    
              Mapping m;
              HashMap vars = new HashMap();
              for (Iterator i = compiledPaths.iterator(); i.hasNext();) {
                  m = (Mapping) i.next();
                  if (WildcardHelper.match(vars, path, m.getPattern())) {
                      mapping = convertActionMapping(
                              path,
                              (ActionMapping) m.getActionConfig(),
                              vars);
                  }
              }
          }    
  
          return mapping;
      }
      
      /**
       *  Clones the ActionMapping and its children, replacing various properties
       *  with the values of the wildcard-matched strings.
       *
       * @param  path  The requested path
       * @param  orig  The original ActionMapping
       * @param  vars  A Map of wildcard-matched strings
       * @return       A cloned ActionMapping with appropriate properties replaced
       *      with wildcard-matched values
       */
      protected ActionMapping convertActionMapping(String path, 
              ActionMapping orig, Map vars) {
          ActionMapping mapping = new ActionMapping();
          mapping.setModuleConfig(orig.getModuleConfig());
  
          mapping.setMultipartClass(orig.getMultipartClass());
          mapping.setName(convertParam(orig.getName(), vars));
          if (path.charAt(0) != '/') {
              path = "/" + path;
          }    
          mapping.setPath(path);
          mapping.setPrefix(orig.getPrefix());
          mapping.setScope(orig.getScope());
          mapping.setSuffix(orig.getSuffix());
          mapping.setUnknown(orig.getUnknown());
          mapping.setValidate(orig.getValidate());
  
          mapping.setType(convertParam(orig.getType(), vars));
          mapping.setRoles(convertParam(orig.getRoles(), vars));
          mapping.setParameter(convertParam(orig.getParameter(), vars));
          mapping.setAttribute(convertParam(orig.getAttribute(), vars));
          mapping.setForward(convertParam(orig.getForward(), vars));
          mapping.setInclude(convertParam(orig.getInclude(), vars));
          mapping.setInput(convertParam(orig.getInput(), vars));
  
          ExceptionConfig[] exConfigs = orig.findExceptionConfigs();
          for (int x = 0; x < exConfigs.length; x++) {
              mapping.addExceptionConfig(exConfigs[x]);
          }
  
          ForwardConfig[] fConfigs = orig.findForwardConfigs();
          ForwardConfig cfg;
          for (int x = 0; x < fConfigs.length; x++) {
              cfg = new ActionForward();
              cfg.setContextRelative(fConfigs[x].getContextRelative());
              cfg.setName(fConfigs[x].getName());
              cfg.setPath(convertParam(fConfigs[x].getPath(), vars));
              mapping.addForwardConfig(cfg);
          }
          return mapping;
      }
  
      /**
       *  Inserts into a value wildcard-matched strings where specified.
       *
       * @param  val   The value to convert
       * @param  vars  A Map of wildcard-matched strings
       * @return       The new value
       */
      protected String convertParam(String val, Map vars) {
          if (val == null) {
              return null;
          } else if (val.indexOf("{") == -1) {
              return val;
          }
  
          Map.Entry entry;
          StringBuffer key = new StringBuffer("{0}");
          StringBuffer ret = new StringBuffer(val);
          int x;
          for (Iterator i = vars.entrySet().iterator(); i.hasNext();) {
              entry = (Map.Entry) i.next();
              key.setCharAt(1, ((String) entry.getKey()).charAt(0));
              x = ret.toString().indexOf(key.toString());
              if (x > -1) {
                  ret.replace(x, x + 3, (String) entry.getValue());
              }
          }
          return ret.toString();
      }
  
      /**
       *  Stores a compiled wildcard pattern and the ActionConfig it came from
       */
      private class Mapping {
  
          /**  The compiled pattern */
          private int[] pattern;
  
          /**  The original ActionConfig */
          private ActionConfig config;
  
          /**
           *  Contructs a read-only Mapping instance
           *
           *  @param pattern  The compiled pattern
           *  @param config   The original ActionConfig
           */
          public Mapping(int[] pattern, ActionConfig config) {
              this.pattern = pattern;
              this.config = config;
          }    
  
          /**
           *  Gets the compiled wildcard pattern
           *
           *  @return The compiled pattern
           */
          public int[] getPattern() {
              return this.pattern;
          }
  
          /**
           *  Gets the ActionConfig that contains the pattern
           *
           *  @return The associated ActionConfig
           */
          public ActionConfig getActionConfig() {
              return this.config;
          }    
      }    
  }
  
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: struts-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: struts-dev-help@jakarta.apache.org


Re: cvs commit: jakarta-struts/src/share/org/apache/struts/util ActionMappingMatcher.java

Posted by Ted Husted <hu...@apache.org>.
Just a heads-up: The discussions about the short "2.0" license are 
heating up again. A good time to catch the 1.0 licenses would when 2.0 
goes through. In the meantime, as Rob says, new development should use 
the 1.1 license

http://www.apache.org/licenses

with #4 modified to read:

  * 4. The names "The Jakarta Project", "Struts", and "Apache Software
  *    Foundation" must not be used to endorse or promote products
  *    derived from this software without prior written permission. For
  *    written permission, please contact apache@apache.org.

There's a reference copy of this at

http://cvs.apache.org/viewcvs/jakarta-struts/LICENSE.txt

-Ted.

Robert Leland wrote:
> mrdon@apache.org wrote:
> 
>> mrdon       2003/09/28 20:23:30
>>
>>  Modified:    src/share/org/apache/struts/action RequestProcessor.java
>>  Added:       src/share/org/apache/struts/action 
>> ActionMappingMatcher.java
>>  Removed:     src/share/org/apache/struts/util ActionMappingMatcher.java
>>  
>>
> I forgot to mention, most of the Struts source code uses the OLD Apache 
> 1.0 license, even though
> it is labeled version 1.1.
> Take a look at the License.txt in the top level of Struts, this is the 
> correct wording al code should be using.



---------------------------------------------------------------------
To unsubscribe, e-mail: struts-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: struts-dev-help@jakarta.apache.org


Re: cvs commit: jakarta-struts/src/share/org/apache/struts/util ActionMappingMatcher.java

Posted by Robert Leland <rl...@apache.org>.
mrdon@apache.org wrote:

>mrdon       2003/09/28 20:23:30
>
>  Modified:    src/share/org/apache/struts/action RequestProcessor.java
>  Added:       src/share/org/apache/struts/action ActionMappingMatcher.java
>  Removed:     src/share/org/apache/struts/util ActionMappingMatcher.java
>  
>
I forgot to mention, most of the Struts source code uses the OLD Apache 
1.0 license, even though
it is labeled version 1.1.
Take a look at the License.txt in the top level of Struts, this is the 
correct wording al code should be using.




---------------------------------------------------------------------
To unsubscribe, e-mail: struts-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: struts-dev-help@jakarta.apache.org