001: /*
002: * Copyright 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.collections.set;
017:
018: import java.io.Serializable;
019: import java.util.Collection;
020: import java.util.Iterator;
021: import java.util.Map;
022: import java.util.Set;
023:
024: /**
025: * Decorates a <code>Map</code> to obtain <code>Set</code> behaviour.
026: * <p>
027: * This class is used to create a <code>Set</code> with the same properties as
028: * the key set of any map. Thus, a ReferenceSet can be created by wrapping a
029: * <code>ReferenceMap</code> in an instance of this class.
030: * <p>
031: * Most map implementation can be used to create a set by passing in dummy values.
032: * Exceptions include <code>BidiMap</code> implementations, as they require unique values.
033: *
034: * @since Commons Collections 3.1
035: * @version $Revision: 357494 $ $Date: 2005-12-18 19:05:31 +0000 (Sun, 18 Dec 2005) $
036: *
037: * @author Stephen Colebourne
038: */
039: public final class MapBackedSet implements Set, Serializable {
040:
041: /** Serialization version */
042: private static final long serialVersionUID = 6723912213766056587L;
043:
044: /** The map being used as the backing store */
045: protected final Map map;
046: /** The dummyValue to use */
047: protected final Object dummyValue;
048:
049: /**
050: * Factory method to create a set from a map.
051: *
052: * @param map the map to decorate, must not be null
053: * @throws IllegalArgumentException if set is null
054: */
055: public static Set decorate(Map map) {
056: return decorate(map, null);
057: }
058:
059: /**
060: * Factory method to create a set from a map.
061: *
062: * @param map the map to decorate, must not be null
063: * @param dummyValue the dummy value to use
064: * @throws IllegalArgumentException if map is null
065: */
066: public static Set decorate(Map map, Object dummyValue) {
067: if (map == null) {
068: throw new IllegalArgumentException(
069: "The map must not be null");
070: }
071: return new MapBackedSet(map, dummyValue);
072: }
073:
074: //-----------------------------------------------------------------------
075: /**
076: * Constructor that wraps (not copies).
077: *
078: * @param map the map to decorate, must not be null
079: * @param dummyValue the dummy value to use
080: * @throws IllegalArgumentException if map is null
081: */
082: private MapBackedSet(Map map, Object dummyValue) {
083: super ();
084: this .map = map;
085: this .dummyValue = dummyValue;
086: }
087:
088: //-----------------------------------------------------------------------
089: public int size() {
090: return map.size();
091: }
092:
093: public boolean isEmpty() {
094: return map.isEmpty();
095: }
096:
097: public Iterator iterator() {
098: return map.keySet().iterator();
099: }
100:
101: public boolean contains(Object obj) {
102: return map.containsKey(obj);
103: }
104:
105: public boolean containsAll(Collection coll) {
106: return map.keySet().containsAll(coll);
107: }
108:
109: public boolean add(Object obj) {
110: int size = map.size();
111: map.put(obj, dummyValue);
112: return (map.size() != size);
113: }
114:
115: public boolean addAll(Collection coll) {
116: int size = map.size();
117: for (Iterator it = coll.iterator(); it.hasNext();) {
118: Object obj = it.next();
119: map.put(obj, dummyValue);
120: }
121: return (map.size() != size);
122: }
123:
124: public boolean remove(Object obj) {
125: int size = map.size();
126: map.remove(obj);
127: return (map.size() != size);
128: }
129:
130: public boolean removeAll(Collection coll) {
131: return map.keySet().removeAll(coll);
132: }
133:
134: public boolean retainAll(Collection coll) {
135: return map.keySet().retainAll(coll);
136: }
137:
138: public void clear() {
139: map.clear();
140: }
141:
142: public Object[] toArray() {
143: return map.keySet().toArray();
144: }
145:
146: public Object[] toArray(Object[] array) {
147: return map.keySet().toArray(array);
148: }
149:
150: public boolean equals(Object obj) {
151: return map.keySet().equals(obj);
152: }
153:
154: public int hashCode() {
155: return map.keySet().hashCode();
156: }
157:
158: }
|