001: /*
002: * Copyright 1999-2004 The Apache Software Foundation
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016: package org.apache.commons.chain.web;
017:
018: import java.util.Map;
019:
020: /**
021: * <p>Map.Entry implementation that can be constructed to either be read-only
022: * or not.</p>
023: *
024: * @version $Revision: 155403 $ $Date: 2005-02-26 12:52:46 +0000 (Sat, 26 Feb 2005) $
025: */
026:
027: public class MapEntry implements Map.Entry {
028:
029: /**
030: * <p>The entry key.</p>
031: */
032: private Object key;
033:
034: /**
035: * <p>The entry value.</p>
036: */
037: private Object value;
038:
039: /**
040: * <p>Whether the entry can be modified.</p>
041: */
042: private boolean modifiable = false;
043:
044: /**
045: * <p>Creates a map entry that can either allow modifications or not.</p>
046: *
047: * @param key The entry key
048: * @param value The entry value
049: * @param modifiable Whether the entry should allow modification or not
050: */
051: public MapEntry(Object key, Object value, boolean modifiable) {
052: this .key = key;
053: this .value = value;
054: this .modifiable = modifiable;
055: }
056:
057: /**
058: * <p>Gets the entry key.</p>
059: *
060: * @return The entry key
061: */
062: public Object getKey() {
063: return key;
064: }
065:
066: /**
067: * <p>Gets the entry value.</p>
068: *
069: * @return The entry key
070: */
071: public Object getValue() {
072: return value;
073: }
074:
075: /**
076: * <p>Sets the entry value if the entry can be modified.</p>
077: *
078: * @param val The new value
079: * @return The old entry value
080: * @throws UnsupportedOperationException If the entry cannot be modified
081: */
082: public Object setValue(Object val) {
083: if (modifiable) {
084: Object oldVal = this .value;
085: this .value = val;
086: return oldVal;
087: } else {
088: throw new UnsupportedOperationException();
089: }
090: }
091:
092: /**
093: * <p>Determines if this entry is equal to the passed object.</p>
094: *
095: * @param o The object to test
096: * @return True if equal, else false
097: */
098: public boolean equals(Object o) {
099: if (o != null && o instanceof Map.Entry) {
100: Map.Entry entry = (Map.Entry) o;
101: return (this .getKey() == null ? entry.getKey() == null
102: : this .getKey().equals(entry.getKey()))
103: && (this .getValue() == null ? entry.getValue() == null
104: : this .getValue().equals(entry.getValue()));
105: }
106: return false;
107: }
108:
109: /**
110: * <p>Returns the hashcode for this entry.</p>
111: *
112: * @return The and'ed hashcode of the key and value
113: */
114: public int hashCode() {
115: return (this .getKey() == null ? 0 : this .getKey().hashCode())
116: ^ (this .getValue() == null ? 0 : this.getValue()
117: .hashCode());
118: }
119: }
|