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