You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by cr...@locus.apache.org on 2000/09/01 20:17:18 UTC

cvs commit: jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/util LocalStrings.properties ParameterMap.java RequestUtil.java

craigmcc    00/09/01 11:17:17

  Modified:    catalina/src/share/org/apache/catalina/connector
                        HttpRequestBase.java
               catalina/src/share/org/apache/catalina/util RequestUtil.java
  Added:       catalina/src/share/org/apache/catalina/util
                        LocalStrings.properties ParameterMap.java
  Log:
  Improve the efficiency of request parameter processing, by creating a new
  "lockable" subclass of HashMap that can be returned to the application (as
  the value of a call to ServletRequest.getParameterMap() without being
  cloned in order to avoid application-level modifications.  In addition,
  the parameters variable of HttpRequestBase is now recycled instead of
  being recreated on every request.
  
  Revision  Changes    Path
  1.6       +41 -31    jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/HttpRequestBase.java
  
  Index: HttpRequestBase.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/HttpRequestBase.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- HttpRequestBase.java	2000/08/23 01:07:08	1.5
  +++ HttpRequestBase.java	2000/09/01 18:17:15	1.6
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/HttpRequestBase.java,v 1.5 2000/08/23 01:07:08 craigmcc Exp $
  - * $Revision: 1.5 $
  - * $Date: 2000/08/23 01:07:08 $
  + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/connector/HttpRequestBase.java,v 1.6 2000/09/01 18:17:15 craigmcc Exp $
  + * $Revision: 1.6 $
  + * $Date: 2000/09/01 18:17:15 $
    *
    * ====================================================================
    *
  @@ -86,6 +86,7 @@
   import org.apache.catalina.Realm;
   import org.apache.catalina.Session;
   import org.apache.catalina.util.Enumerator;
  +import org.apache.catalina.util.ParameterMap;
   import org.apache.catalina.util.RequestUtil;
   import org.apache.catalina.util.StringParser;
   
  @@ -97,7 +98,7 @@
    * be implemented.
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.5 $ $Date: 2000/08/23 01:07:08 $
  + * @version $Revision: 1.6 $ $Date: 2000/09/01 18:17:15 $
    */
   
   public class HttpRequestBase
  @@ -169,11 +170,22 @@
        * <code>getParameter()</code> family of method calls.  The key is the
        * parameter name, while the value is a String array of values for this
        * parameter.
  +     * <p>
  +     * <strong>IMPLEMENTATION NOTE</strong> - Once the parameters for a
  +     * particular request are parsed and stored here, they are not modified.
  +     * Therefore, application level access to the parameters need not be
  +     * synchronized.
        */
  -    protected HashMap parameters = null;
  +    protected ParameterMap parameters = null;
   
   
       /**
  +     * Have the parameters for this request been parsed yet?
  +     */
  +    protected boolean parsed = false;
  +
  +
  +    /**
        * The path information for this request.
        */
       protected String pathInfo = null;
  @@ -330,7 +342,11 @@
   	cookies.clear();
   	headers.clear();
   	method = null;
  -	parameters = null;
  +        if (parameters != null) {
  +            parameters.setLocked(false);
  +            parameters.clear();
  +        }
  +        parsed = false;
   	pathInfo = null;
   	queryString = null;
   	requestedSessionCookie = false;
  @@ -521,10 +537,13 @@
        */
       protected void parseParameters() {
   
  -	if (parameters != null)
  +        if (parsed)
   	    return;
   
  -	HashMap results = new HashMap();
  +	ParameterMap results = parameters;
  +        if (results == null)
  +            results = new ParameterMap();
  +        results.setLocked(false);
   
   	// Parse any parameters specified in the query string
   	String queryString = getQueryString();
  @@ -557,6 +576,8 @@
   	}
   
   	// Store the final results
  +        results.setLocked(true);
  +        parsed = true;
   	parameters = results;
   
       }
  @@ -575,14 +596,11 @@
       public String getParameter(String name) {
   
   	parseParameters();
  -
  -	synchronized (parameters) {
  -	    String values[] = (String[]) parameters.get(name);
  -	    if (values != null)
  -		return (values[0]);
  -	    else
  -		return (null);
  -	}
  +        String values[] = (String[]) parameters.get(name);
  +        if (values != null)
  +            return (values[0]);
  +        else
  +            return (null);
   
       }
   
  @@ -599,9 +617,7 @@
       public Map getParameterMap() {
   
           parseParameters();
  -	synchronized (parameters) {
  -	    return ((Map) parameters.clone());
  -	}
  +        return (this.parameters);
   
       }
   
  @@ -612,10 +628,7 @@
       public Enumeration getParameterNames() {
   
   	parseParameters();
  -
  -	synchronized (parameters) {
  -	    return (new Enumerator(parameters.keySet()));
  -	}
  +        return (new Enumerator(parameters.keySet()));
   
       }
   
  @@ -629,14 +642,11 @@
       public String[] getParameterValues(String name) {
   
   	parseParameters();
  -
  -	synchronized (parameters) {
  -	    String values[] = (String[]) parameters.get(name);
  -	    if (values != null)
  -		return (values);
  -	    else
  -		return (null);
  -	}
  +        String values[] = (String[]) parameters.get(name);
  +        if (values != null)
  +            return (values);
  +        else
  +            return (null);
   
       }
   
  
  
  
  1.3       +4 -5      jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/util/RequestUtil.java
  
  Index: RequestUtil.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/util/RequestUtil.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- RequestUtil.java	2000/08/23 01:07:15	1.2
  +++ RequestUtil.java	2000/09/01 18:17:16	1.3
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/util/RequestUtil.java,v 1.2 2000/08/23 01:07:15 craigmcc Exp $
  - * $Revision: 1.2 $
  - * $Date: 2000/08/23 01:07:15 $
  + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/util/RequestUtil.java,v 1.3 2000/09/01 18:17:16 craigmcc Exp $
  + * $Revision: 1.3 $
  + * $Date: 2000/09/01 18:17:16 $
    *
    * ====================================================================
    *
  @@ -78,7 +78,7 @@
    * General purpose request parsing and encoding utility methods.
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.2 $ $Date: 2000/08/23 01:07:15 $
  + * @version $Revision: 1.3 $ $Date: 2000/09/01 18:17:16 $
    */
   
   public final class RequestUtil {
  @@ -260,7 +260,6 @@
   	    map.put(name, newValues);
   
   	}
  -
   
       }
   
  
  
  
  1.1                  jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/util/LocalStrings.properties
  
  Index: LocalStrings.properties
  ===================================================================
  propertyMap.locked=No modifications are allowed to a locked ParameterMap
  
  
  
  1.1                  jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/util/ParameterMap.java
  
  Index: ParameterMap.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/util/ParameterMap.java,v 1.1 2000/09/01 18:17:16 craigmcc Exp $
   * $Revision: 1.1 $
   * $Date: 2000/09/01 18:17:16 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999 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", "Tomcat", 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/>.
   *
   * [Additional notices, if required by prior licensing conditions]
   *
   */ 
  
  
  package org.apache.catalina.util;
  
  
  import java.util.HashMap;
  import java.util.Map;
  
  
  /**
   * Extended implementation of <strong>HashMap</strong> that includes a
   * <code>locked</code> property.  This class can be used to safely expose
   * Catalina internal parameter map objects to user classes without having
   * to clone them in order to avoid modifications.  When first created, a
   * <code>ParmaeterMap</code> instance is not locked.
   *
   * @author Craig R. McClanahan
   * @version $Revision: 1.1 $ $Date: 2000/09/01 18:17:16 $
   */
  
  public final class ParameterMap extends HashMap {
  
  
      // ----------------------------------------------------------- Constructors
  
  
      /**
       * Construct a new, empty map with the default initial capacity and
       * load factor.
       */
      public ParameterMap() {
  
          super();
  
      }
  
  
      /**
       * Construct a new, empty map with the specified initial capacity and
       * default load factor.
       *
       * @param initialCapacity The initial capacity of this map
       */
      public ParameterMap(int initialCapacity) {
  
          super(initialCapacity);
  
      }
  
  
      /**
       * Construct a new, empty map with the specified initial capacity and
       * load factor.
       *
       * @param initialCapacity The initial capacity of this map
       * @param loadFactor The load factor of this map
       */
      public ParameterMap(int initialCapacity, float loadFactor) {
  
          super(initialCapacity, loadFactor);
  
      }
  
  
      /**
       * Construct a new map with the same mappings as the given map.
       *
       * @param map Map whose contents are dupliated in the new map
       */
      public ParameterMap(Map map) {
  
          super(map);
  
      }
  
  
      // ------------------------------------------------------------- Properties
  
  
      /**
       * The current lock state of this parameter map.
       */
      private boolean locked = false;
  
  
      /**
       * Return the locked state of this parameter map.
       */
      public boolean isLocked() {
  
          return (this.locked);
  
      }
  
  
      /**
       * Set the locked state of this parameter map.
       *
       * @param locked The new locked state
       */
      public void setLocked(boolean locked) {
  
          this.locked = locked;
  
      }
  
  
      /**
       * The string manager for this package.
       */
      private static final StringManager sm =
          StringManager.getManager("org.apache.catalina.util");
  
  
      // --------------------------------------------------------- Public Methods
  
  
  
      /**
       * Remove all mappings from this map.
       *
       * @exception IllegalStateException if this map is currently locked
       */
      public void clear() {
  
          if (locked)
              throw new IllegalStateException
                  (sm.getString("parameterMap.locked"));
          super.clear();
  
      }
  
  
      /**
       * Associate the specified value with the specified key in this map.  If
       * the map previously contained a mapping for this key, the old value is
       * replaced.
       *
       * @param key Key with which the specified value is to be associated
       * @param value Value to be associated with the specified key
       *
       * @return The previous value associated with the specified key, or
       *  <code>null</code> if there was no mapping for key
       *
       * @exception IllegalStateException if this map is currently locked
       */
      public Object put(Object key, Object value) {
  
          if (locked)
              throw new IllegalStateException
                  (sm.getString("parameterMap.locked"));
          return (super.put(key, value));
  
      }
  
  
      /**
       * Copy all of the mappings from the specified map to this one.  These
       * mappings replace any mappings that this map had for any of the keys
       * currently in the specified Map.
       *
       * @param map Mappings to be stored into this map
       *
       * @exception IllegalStateException if this map is currently locked
       */
      public void putAll(Map map) {
  
          if (locked)
              throw new IllegalStateException
                  (sm.getString("parameterMap.locked"));
          super.putAll(map);
  
      }
  
  
      /**
       * Remove the mapping for this key from the map if present.
       *
       * @param key Key whose mapping is to be removed from the map
       *
       * @return The previous value associated with the specified key, or
       *  <code>null</code> if there was no mapping for that key
       *
       * @exception IllegalStateException if this map is currently locked
       */
      public Object remove(Object key) {
  
          if (locked)
              throw new IllegalStateException
                  (sm.getString("parameterMap.locked"));
          return (super.remove(key));
  
      }
  
  
  }