mrdon       2004/09/10 15:43:20

  Modified:    chain/src/java/org/apache/commons/chain/web/servlet
                        ServletApplicationScopeMap.java
                        ServletHeaderMap.java ServletHeaderValuesMap.java
                        ServletInitParamMap.java ServletParamMap.java
                        ServletParamValuesMap.java
                        ServletRequestScopeMap.java
                        ServletSessionScopeMap.java
               chain/src/test/org/apache/commons/chain/web/servlet
                        ServletWebContextTestCase.java
  Added:       chain/src/java/org/apache/commons/chain/web MapEntry.java
  Log:
  Changed all servlet Map implementations to use the Map.Entry implementation
  MapEntry, rather than returning the values which caused Map.putAll() to
  throw confusing ClassCastExceptions
  
  Revision  Changes    Path
  1.1                  
jakarta-commons/chain/src/java/org/apache/commons/chain/web/MapEntry.java
  
  Index: MapEntry.java
  ===================================================================
  /*
   * Copyright 1999-2004 The Apache Software Foundation
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package org.apache.commons.chain.web;
  
  
  import java.util.Map;
  
  
  /**
   * <p>Map.Entry implementation that can be constructed to either be read-only
   * or not.</p>
   *
   * @version $Revision: 1.1 $ $Date: 2004/09/10 22:43:20 $
   */
  
  public class MapEntry implements Map.Entry {
  
  
      /**
       * <p>The entry key.</p>
       */
      private Object key;
  
      /**
       * <p>The entry value.</p>
       */
      private Object value;
  
      /**
       * <p>Whether the entry can be modified.</p>
       */
      private boolean modifiable = false;
  
  
      /**
       * <p>Creates a map entry that can either allow modifications or not.</p>
       * 
       * @param key The entry key
       * @param value The entry value
       * @param modifiable Whether the entry should allow modification or not
       */
      public MapEntry(Object key, Object value, boolean modifiable) {
          this.key = key;
          this.value = value;
          this.modifiable = modifiable;
      }
  
  
      /**
       * <p>Gets the entry key.</p>
       * 
       * @return The entry key
       */
      public Object getKey() {
          return key;
      }
  
  
      /**
       * <p>Gets the entry value.</p>
       * 
       * @return The entry key
       */
      public Object getValue() {
          return value;
      }
  
  
      /**
       * <p>Sets the entry value if the entry can be modified.</p>
       * 
       * @param val The new value
       * @return The old entry value
       * @throw UnsupportedOperationException If the entry cannot be modified
       */
      public Object setValue(Object val) {
          if (modifiable) {
              Object oldVal = this.value;
              this.value = val;
              return oldVal;
          } else {
              throw new UnsupportedOperationException();
          }
      }
  
  
      /**
       * <p>Determines if this entry is equal to the passed object.</p>
       * 
       * @param o The object to test
       * @return True if equal, else false
       */
      public boolean equals(Object o) {
          if (o != null && o instanceof Map.Entry) {
              Map.Entry entry = (Map.Entry)o; 
              return (this.getKey()==null ?
                      entry.getKey()==null : this.getKey().equals(entry.getKey()))  &&
                     (this.getValue()==null ?
                      entry.getValue()==null : 
this.getValue().equals(entry.getValue()));
          }
          return false;
      }    
  
  
      /**
       * <p>Returns the hashcode for this entry.</p>
       * 
       * @return The and'ed hashcode of the key and value
       */
      public int hashCode() {
          return (this.getKey()==null   ? 0 : this.getKey().hashCode()) ^
                 (this.getValue()==null ? 0 : this.getValue().hashCode());
      }
  }
  
  
  
  1.4       +5 -2      
jakarta-commons/chain/src/java/org/apache/commons/chain/web/servlet/ServletApplicationScopeMap.java
  
  Index: ServletApplicationScopeMap.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/chain/src/java/org/apache/commons/chain/web/servlet/ServletApplicationScopeMap.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ServletApplicationScopeMap.java   25 Feb 2004 00:01:04 -0000      1.3
  +++ ServletApplicationScopeMap.java   10 Sep 2004 22:43:20 -0000      1.4
  @@ -25,6 +25,7 @@
   import java.util.Map;
   import java.util.Set;
   import javax.servlet.ServletContext;
  +import org.apache.commons.chain.web.MapEntry;
   
   
   /**
  @@ -77,8 +78,10 @@
       public Set entrySet() {
           Set set = new HashSet();
           Enumeration keys = context.getAttributeNames();
  +        String key;
           while (keys.hasMoreElements()) {
  -            set.add(context.getAttribute((String) keys.nextElement()));
  +            key = (String)keys.nextElement();
  +            set.add(new MapEntry(key, context.getAttribute(key), true));
           }
           return (set);
       }
  
  
  
  1.4       +5 -2      
jakarta-commons/chain/src/java/org/apache/commons/chain/web/servlet/ServletHeaderMap.java
  
  Index: ServletHeaderMap.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/chain/src/java/org/apache/commons/chain/web/servlet/ServletHeaderMap.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ServletHeaderMap.java     25 Feb 2004 00:01:04 -0000      1.3
  +++ ServletHeaderMap.java     10 Sep 2004 22:43:20 -0000      1.4
  @@ -25,6 +25,7 @@
   import java.util.Map;
   import java.util.Set;
   import javax.servlet.http.HttpServletRequest;
  +import org.apache.commons.chain.web.MapEntry;
   
   
   /**
  @@ -70,8 +71,10 @@
       public Set entrySet() {
           Set set = new HashSet();
           Enumeration keys = request.getHeaderNames();
  +        String key;
           while (keys.hasMoreElements()) {
  -            set.add(request.getHeader((String) keys.nextElement()));
  +            key = (String) keys.nextElement();
  +            set.add(new MapEntry(key, request.getHeader(key), false));
           }
           return (set);
       }
  
  
  
  1.4       +5 -2      
jakarta-commons/chain/src/java/org/apache/commons/chain/web/servlet/ServletHeaderValuesMap.java
  
  Index: ServletHeaderValuesMap.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/chain/src/java/org/apache/commons/chain/web/servlet/ServletHeaderValuesMap.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ServletHeaderValuesMap.java       25 Feb 2004 00:01:04 -0000      1.3
  +++ ServletHeaderValuesMap.java       10 Sep 2004 22:43:20 -0000      1.4
  @@ -25,6 +25,7 @@
   import java.util.Map;
   import java.util.Set;
   import javax.servlet.http.HttpServletRequest;
  +import org.apache.commons.chain.web.MapEntry;
   
   
   /**
  @@ -84,8 +85,10 @@
       public Set entrySet() {
           Set set = new HashSet();
           Enumeration keys = request.getHeaderNames();
  +        String key;
           while (keys.hasMoreElements()) {
  -            set.add(request.getHeaders((String) keys.nextElement()));
  +            key = (String) keys.nextElement();
  +            set.add(new MapEntry(key, request.getHeaders(key), false));
           }
           return (set);
       }
  
  
  
  1.4       +5 -2      
jakarta-commons/chain/src/java/org/apache/commons/chain/web/servlet/ServletInitParamMap.java
  
  Index: ServletInitParamMap.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/chain/src/java/org/apache/commons/chain/web/servlet/ServletInitParamMap.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ServletInitParamMap.java  25 Feb 2004 00:01:04 -0000      1.3
  +++ ServletInitParamMap.java  10 Sep 2004 22:43:20 -0000      1.4
  @@ -25,6 +25,7 @@
   import java.util.Map;
   import java.util.Set;
   import javax.servlet.ServletContext;
  +import org.apache.commons.chain.web.MapEntry;
   
   
   /**
  @@ -70,8 +71,10 @@
       public Set entrySet() {
           Set set = new HashSet();
           Enumeration keys = context.getInitParameterNames();
  +        String key;
           while (keys.hasMoreElements()) {
  -            set.add(context.getInitParameter((String) keys.nextElement()));
  +            key = (String) keys.nextElement();
  +            set.add(new MapEntry(key, context.getInitParameter(key), false));
           }
           return (set);
       }
  
  
  
  1.4       +5 -2      
jakarta-commons/chain/src/java/org/apache/commons/chain/web/servlet/ServletParamMap.java
  
  Index: ServletParamMap.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/chain/src/java/org/apache/commons/chain/web/servlet/ServletParamMap.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ServletParamMap.java      25 Feb 2004 00:01:04 -0000      1.3
  +++ ServletParamMap.java      10 Sep 2004 22:43:20 -0000      1.4
  @@ -25,6 +25,7 @@
   import java.util.Map;
   import java.util.Set;
   import javax.servlet.http.HttpServletRequest;
  +import org.apache.commons.chain.web.MapEntry;
   
   
   /**
  @@ -70,8 +71,10 @@
       public Set entrySet() {
           Set set = new HashSet();
           Enumeration keys = request.getParameterNames();
  +        String key;
           while (keys.hasMoreElements()) {
  -            set.add(request.getParameter((String) keys.nextElement()));
  +            key = (String)keys.nextElement();
  +            set.add(new MapEntry(key, request.getParameter(key), false));
           }
           return (set);
       }
  
  
  
  1.4       +5 -2      
jakarta-commons/chain/src/java/org/apache/commons/chain/web/servlet/ServletParamValuesMap.java
  
  Index: ServletParamValuesMap.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/chain/src/java/org/apache/commons/chain/web/servlet/ServletParamValuesMap.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ServletParamValuesMap.java        25 Feb 2004 00:01:04 -0000      1.3
  +++ ServletParamValuesMap.java        10 Sep 2004 22:43:20 -0000      1.4
  @@ -25,6 +25,7 @@
   import java.util.Map;
   import java.util.Set;
   import javax.servlet.http.HttpServletRequest;
  +import org.apache.commons.chain.web.MapEntry;
   
   
   /**
  @@ -70,8 +71,10 @@
       public Set entrySet() {
           Set set = new HashSet();
           Enumeration keys = request.getParameterNames();
  +        String key;
           while (keys.hasMoreElements()) {
  -            set.add(request.getParameterValues((String) keys.nextElement()));
  +            key = (String) keys.nextElement();
  +            set.add(new MapEntry(key, request.getParameterValues(key), false));
           }
           return (set);
       }
  
  
  
  1.4       +5 -2      
jakarta-commons/chain/src/java/org/apache/commons/chain/web/servlet/ServletRequestScopeMap.java
  
  Index: ServletRequestScopeMap.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/chain/src/java/org/apache/commons/chain/web/servlet/ServletRequestScopeMap.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ServletRequestScopeMap.java       25 Feb 2004 00:01:04 -0000      1.3
  +++ ServletRequestScopeMap.java       10 Sep 2004 22:43:20 -0000      1.4
  @@ -25,6 +25,7 @@
   import java.util.Map;
   import java.util.Set;
   import javax.servlet.http.HttpServletRequest;
  +import org.apache.commons.chain.web.MapEntry;
   
   
   /**
  @@ -77,8 +78,10 @@
       public Set entrySet() {
           Set set = new HashSet();
           Enumeration keys = request.getAttributeNames();
  +        String key;
           while (keys.hasMoreElements()) {
  -            set.add(request.getAttribute((String) keys.nextElement()));
  +            key = (String) keys.nextElement();
  +            set.add(new MapEntry(key, request.getAttribute(key), true));
           }
           return (set);
       }
  
  
  
  1.4       +5 -2      
jakarta-commons/chain/src/java/org/apache/commons/chain/web/servlet/ServletSessionScopeMap.java
  
  Index: ServletSessionScopeMap.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/chain/src/java/org/apache/commons/chain/web/servlet/ServletSessionScopeMap.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ServletSessionScopeMap.java       25 Feb 2004 00:01:04 -0000      1.3
  +++ ServletSessionScopeMap.java       10 Sep 2004 22:43:20 -0000      1.4
  @@ -25,6 +25,7 @@
   import java.util.Map;
   import java.util.Set;
   import javax.servlet.http.HttpSession;
  +import org.apache.commons.chain.web.MapEntry;
   
   
   /**
  @@ -77,8 +78,10 @@
       public Set entrySet() {
           Set set = new HashSet();
           Enumeration keys = session.getAttributeNames();
  +        String key;
           while (keys.hasMoreElements()) {
  -            set.add(session.getAttribute((String) keys.nextElement()));
  +            key = (String) keys.nextElement();
  +            set.add(new MapEntry(key, session.getAttribute(key), true));
           }
           return (set);
       }
  
  
  
  1.6       +44 -1     
jakarta-commons/chain/src/test/org/apache/commons/chain/web/servlet/ServletWebContextTestCase.java
  
  Index: ServletWebContextTestCase.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/chain/src/test/org/apache/commons/chain/web/servlet/ServletWebContextTestCase.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- ServletWebContextTestCase.java    25 Feb 2004 00:01:06 -0000      1.5
  +++ ServletWebContextTestCase.java    10 Sep 2004 22:43:20 -0000      1.6
  @@ -29,6 +29,7 @@
   import java.util.HashMap;
   import java.util.Iterator;
   import java.util.Map;
  +import java.util.Set;
   
   
   /**
  @@ -132,6 +133,9 @@
           assertEquals("avalue3", (String) map.get("akey3"));
           assertEquals("avalue4", (String) map.get("akey4"));
   
  +        // Transparency - entrySet()
  +        checkEntrySet(map, true);
  + 
           // Transparency - removal via web object
           scontext.removeAttribute("akey1");
           checkMapSize(map, 3);
  @@ -213,6 +217,9 @@
           assertTrue(map.containsValue("hvalue1"));
           assertTrue(map.containsValue("hvalue2a"));
   
  +        // Transparency - entrySet()
  +        checkEntrySet(map, false);
  + 
           // Unsupported operations on read-only map
           try {
               map.clear();
  @@ -268,6 +275,9 @@
           assertTrue(map.containsValue(values1));
           assertTrue(map.containsValue(values2));
   
  +        // Transparency - entrySet()
  +        checkEntrySet(map, false);
  + 
           // Unsupported operations on read-only map
           try {
               map.clear();
  @@ -315,6 +325,9 @@
           assertTrue(map.containsValue("ivalue2"));
           assertTrue(map.containsValue("ivalue3"));
   
  +        // Transparency - entrySet()
  +        checkEntrySet(map, false);
  + 
           // Unsupported operations on read-only map
           try {
               map.clear();
  @@ -359,6 +372,8 @@
           assertTrue(map.containsValue("pvalue1"));
           assertTrue(map.containsValue("pvalue2a"));
   
  +        checkEntrySet(map, false);
  +
           // Unsupported operations on read-only map
           try {
               map.clear();
  @@ -520,12 +535,15 @@
           assertEquals("rvalue1", (String) map.get("rkey1"));
           assertEquals("rvalue2", (String) map.get("rkey2"));
   
  +        // Transparency - entrySet()
  +        checkEntrySet(map, true);
  + 
           // Transparency - removal via web object
           request.removeAttribute("rkey1");
           checkMapSize(map, 1);
           assertNull(map.get("rkey1"));
   
  -        // Transparency - removal via map
  +       // Transparency - removal via map
           map.remove("rkey2");
           checkMapSize(map, 0);
           assertNull(request.getAttribute("rkey2"));
  @@ -569,6 +587,9 @@
           assertEquals("svalue2", (String) map.get("skey2"));
           assertEquals("svalue3", (String) map.get("skey3"));
   
  +        // Transparency - entrySet()
  +        checkEntrySet(map, true);
  + 
           // Transparency - removal via web object
           session.removeAttribute("skey1");
           checkMapSize(map, 2);
  @@ -632,6 +653,28 @@
           assertEquals(size, map.values().size());
       }
   
  +    // Test to ensure proper entrySet() and are modifiable optionally
  +    protected void checkEntrySet(Map map, boolean modifiable) {
  +        assertTrue(map.size() > 1);
  +        Set entries = map.entrySet();
  +        assertTrue(map.size() == entries.size());
  +        Object o = entries.iterator().next();
  +
  +        assertTrue(o instanceof Map.Entry);
  +
  +        if (!modifiable) {
  +            try {
  +                ((Map.Entry)o).setValue(new Object());
  +                fail("Should have thrown UnsupportedOperationException");
  +            } catch (UnsupportedOperationException e) {
  +                ; // expected result
  +            }
  +        } else {
  +            // Should pass and not throw UnsupportedOperationException
  +            Map.Entry e = (Map.Entry)o;
  +            e.setValue(e.setValue(new Object()));
  +        }    
  +    }    
   
       // Create a new instance of the appropriate Context type for this test case
       protected Context createContext() {
  
  
  

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

Reply via email to