001 /*--------------------------------------------------------------------------+
002 $Id: UnmodifiableMap.java 26283 2010-02-18 11:18:57Z juergens $
003 | |
004 | Copyright 2005-2010 Technische Universitaet Muenchen |
005 | |
006 | Licensed under the Apache License, Version 2.0 (the "License"); |
007 | you may not use this file except in compliance with the License. |
008 | You may obtain a copy of the License at |
009 | |
010 | http://www.apache.org/licenses/LICENSE-2.0 |
011 | |
012 | Unless required by applicable law or agreed to in writing, software |
013 | distributed under the License is distributed on an "AS IS" BASIS, |
014 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
015 | See the License for the specific language governing permissions and |
016 | limitations under the License. |
017 +--------------------------------------------------------------------------*/
018 package edu.tum.cs.commons.collections;
019
020 import java.io.Serializable;
021 import java.util.Collections;
022 import java.util.Map;
023
024 /**
025 * This is a wrapper for a {@link Map} prohibiting all calls which would modify
026 * its contents. As the construction of this class is performed in constant time
027 * it is prefered over copying the map (which takes linear time). Using this
028 * class is also preferred to using the <code>unmodifiableX()</code> in class
029 * {@link Collections} as they return the collection base type that does not
030 * signal, that the object ist unmodifiable. Using the classes in this package
031 * makes unmodifiability more explicit.
032 * <p>
033 * All prohibited methods throw an {@link UnsupportedOperationException}. The
034 * class is nearly the same as the one returned by
035 * {@link Collections#unmodifiableMap(Map)}, but by making it a public class we
036 * can make the return value of some methods more explicit.
037 * <p>
038 * This map is serializable if the wrapped map is serializable.
039 *
040 * @author Benjamin Hummel
041 * @author $Author: juergens $
042 *
043 * @version $Revision: 26283 $
044 * @levd.rating GREEN Hash: 4BC4212A490EEF9A14859C79C22B8A4D
045 */
046 public class UnmodifiableMap<K, V> implements Map<K, V>, Serializable {
047
048 /** The underlying map. */
049 private final Map<K, V> m;
050
051 /**
052 * Creates a new unmodifiable map from another map. All modifications to the
053 * underlying map will directly be visible in this wrapper.
054 */
055 public UnmodifiableMap(Map<K, V> m) {
056 if (m == null) {
057 throw new IllegalArgumentException(
058 "Underlying map may not be null!");
059 }
060 this.m = m;
061 }
062
063 /** {@inheritDoc} */
064 public boolean isEmpty() {
065 return m.isEmpty();
066 }
067
068 /** {@inheritDoc} */
069 public int size() {
070 return m.size();
071 }
072
073 /** {@inheritDoc} */
074 public boolean containsKey(Object key) {
075 return m.containsKey(key);
076 }
077
078 /** {@inheritDoc} */
079 public boolean containsValue(Object value) {
080 return m.containsValue(value);
081 }
082
083 /** {@inheritDoc} */
084 public V get(Object key) {
085 return m.get(key);
086 }
087
088 /** {@inheritDoc} */
089 public UnmodifiableSet<K> keySet() {
090 return new UnmodifiableSet<K>(m.keySet());
091 }
092
093 /** {@inheritDoc} */
094 public UnmodifiableCollection<V> values() {
095 return new UnmodifiableCollection<V>(m.values());
096 }
097
098 /** {@inheritDoc} */
099 public UnmodifiableSet<java.util.Map.Entry<K, V>> entrySet() {
100 return new UnmodifiableSet<java.util.Map.Entry<K, V>>(m.entrySet());
101 }
102
103 /**
104 * Operation is not supported.
105 *
106 * @throws UnsupportedOperationException
107 */
108 public void clear() {
109 throw new UnsupportedOperationException();
110 }
111
112 /**
113 * Operation is not supported.
114 *
115 * @throws UnsupportedOperationException
116 */
117 public V put(K arg0, V arg1) {
118 throw new UnsupportedOperationException();
119 }
120
121 /**
122 * Operation is not supported.
123 *
124 * @throws UnsupportedOperationException
125 */
126 public void putAll(Map<? extends K, ? extends V> arg0) {
127 throw new UnsupportedOperationException();
128 }
129
130 /**
131 * Operation is not supported.
132 *
133 * @throws UnsupportedOperationException
134 */
135 public V remove(Object arg0) {
136 throw new UnsupportedOperationException();
137 }
138
139 /**
140 * Returns a string representation of this map.
141 */
142 @Override
143 public String toString() {
144 return m.toString();
145 }
146 }