dev@javaserverfaces.java.net

[REVIEW] Additonal ExternalContextImpl changes

From: Ryan Lubke <Ryan.Lubke_at_Sun.COM>
Date: Fri, 20 Jan 2006 09:09:34 -0800


SECTION: Modified Files
----------------------------
M src/com/sun/faces/context/ExternalContextImpl.java
  - Add new abstract Map class extending BaseContextMap
    called StringArrayValuesMap which contains specialized
    methods for equals(), hashCode(), and containsValue().
  - Fixed bug in previous equals() implementation, and
    added additional size check before usage of Arrays
    class.
  - Update RequestHeaderValuesMap and RequestParameterValuesMap
    to extends StringArrayValuesMap


SECTION: Diffs
----------------------------
Index: src/com/sun/faces/context/ExternalContextImpl.java
===================================================================
RCS file: /cvs/javaserverfaces-sources/jsf-ri/src/com/sun/faces/context/ExternalContextImpl.java,v
retrieving revision 1.43
diff -u -r1.43 ExternalContextImpl.java
--- src/com/sun/faces/context/ExternalContextImpl.java 13 Jan 2006 20:31:46 -0000 1.43
+++ src/com/sun/faces/context/ExternalContextImpl.java 20 Jan 2006 17:06:49 -0000
@@ -747,6 +747,71 @@
     }
 }
 
+abstract class StringArrayValuesMap extends BaseContextMap {
+
+ public boolean equals(Object obj) {
+
+ if (obj == null ||
+ !(obj.getClass() == ExternalContextImpl.theUnmodifiableMapClass)) {
+ return false;
+ }
+ Map objMap = (Map) obj;
+
+ if (this.size() != objMap.size()) {
+ return false;
+ }
+ String[] thisKeys = keySet().toArray(new String[this.size()]);
+ String[] objKeys =
+ (String[]) objMap.keySet().toArray(new String[objMap.size()]);
+
+ Arrays.sort(thisKeys);
+ Arrays.sort(objKeys);
+
+ if (!(Arrays.equals(thisKeys, objKeys))) {
+ return false;
+ } else {
+ for (Object key : thisKeys) {
+ Object[] thisVal = (Object[]) this.get(key);
+ Object[] objVal = (Object[]) objMap.get(key);
+ if (!(Arrays.equals(thisVal, objVal))) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+
+ }
+
+ protected int hashCode(Object someObject) {
+ int hashCode = 7 * someObject.hashCode();
+ for (Object o : entrySet()) {
+ Map.Entry entry = (Map.Entry) o;
+ hashCode += entry.getKey().hashCode();
+ hashCode +=
+ (Arrays.hashCode((Object[]) entry.getValue()));
+ }
+ return hashCode;
+ }
+
+ public boolean containsValue(Object value) {
+
+ if (value == null || !value.getClass().isArray()) {
+ return false;
+ }
+
+ Set entrySet = entrySet();
+ for (Object anEntrySet : entrySet) {
+ Map.Entry entry = (Map.Entry) anEntrySet;
+ // values will be arrays
+ if (Arrays.equals((Object[]) value, (Object[]) entry.getValue())) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
+
 class ApplicationMap extends BaseContextMap {
 
     private final ServletContext servletContext;
@@ -1083,7 +1148,7 @@
 
 } // END RequestParameterMap
 
-class RequestParameterValuesMap extends BaseContextMap {
+class RequestParameterValuesMap extends StringArrayValuesMap {
 
     private final ServletRequest request;
 
@@ -1115,59 +1180,10 @@
         return Collections.unmodifiableCollection(super.values());
     }
 
- public boolean equals(Object obj) {
-
- if (obj == null ||
- !(obj.getClass() == ExternalContextImpl.theUnmodifiableMapClass)) {
- return false;
- }
- Map objMap = (Map) obj;
- Set thisKeySet = keySet();
- Set objKeySet = keySet();
-
- if (!thisKeySet.equals(objKeySet)) {
- return false;
- } else {
- for (Object key : thisKeySet) {
- Object[] thisVal = (Object[]) this.get(key);
- Object[] objVal = (Object[]) objMap.get(key);
- if (!(Arrays.equals(thisVal, objVal))) {
- return false;
- }
- }
- }
-
- return true;
-
- }
-
- public int hashCode() {
- int hashCode = 7 * request.hashCode();
- for (Object o : entrySet()) {
- Map.Entry entry = (Map.Entry) o;
- hashCode += entry.getKey().hashCode();
- hashCode +=
- (Arrays.hashCode((Object[]) entry.getValue()));
- }
- return hashCode;
+ public int hashCode() {
+ return hashCode(request);
     }
 
- public boolean containsValue(Object value) {
-
- if (value == null || !value.getClass().isArray()) {
- return false;
- }
-
- Set entrySet = entrySet();
- for (Object anEntrySet : entrySet) {
- Map.Entry entry = (Map.Entry) anEntrySet;
- // values will be arrays
- if (Arrays.equals((Object[]) value, (Object[]) entry.getValue())) {
- return true;
- }
- }
- return false;
- }
 
     // --------------------------------------------- Methods from BaseContextMap
 
@@ -1250,7 +1266,7 @@
 
 } // END RequestHeaderMap
 
-class RequestHeaderValuesMap extends BaseContextMap {
+class RequestHeaderValuesMap extends StringArrayValuesMap {
 
     private final HttpServletRequest request;
 
@@ -1287,58 +1303,10 @@
 
     public Collection values() {
         return Collections.unmodifiableCollection(super.values());
- }
+ }
 
- public boolean equals(Object obj) {
- if (obj == null ||
- !(obj.getClass() == ExternalContextImpl.theUnmodifiableMapClass)) {
- return false;
- }
- Map objMap = (Map) obj;
- Set thisKeySet = keySet();
- Set objKeySet = keySet();
-
- if (!thisKeySet.equals(objKeySet)) {
- return false;
- } else {
- for (Object key : thisKeySet) {
- Object[] thisVal = (Object[]) this.get(key);
- Object[] objVal = (Object[]) objMap.get(key);
- if (!(Arrays.equals(thisVal, objVal))) {
- return false;
- }
- }
- }
-
- return true;
- }
-
-
- public boolean containsValue(Object value) {
- if (value == null || !value.getClass().isArray()) {
- return false;
- }
-
- Set entrySet = entrySet();
- for (Object anEntrySet : entrySet) {
- Map.Entry entry = (Map.Entry) anEntrySet;
- // values will be arrays
- if (Arrays.equals((Object[]) value, (Object[]) entry.getValue())) {
- return true;
- }
- }
- return false;
- }
-
- public int hashCode() {
- int hashCode = 0;
- for (Object o : entrySet()) {
- Map.Entry entry = (Map.Entry) o;
- hashCode += entry.getKey().hashCode();
- hashCode +=
- (Arrays.hashCode((Object[]) entry.getValue()));
- }
- return hashCode;
+ public int hashCode() {
+ return hashCode(request);
     }
 
     // --------------------------------------------- Methods from BaseContextMap