001    /**
002     *
003     * Copyright 2005 The Apache Software Foundation
004     *
005     *  Licensed under the Apache License, Version 2.0 (the "License");
006     *  you may not use this file except in compliance with the License.
007     *  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.geronimo.gbean;
018    
019    import java.util.Map;
020    import java.util.Collection;
021    import java.util.Iterator;
022    import java.util.HashMap;
023    import java.util.Set;
024    
025    
026    public class ReferenceMap implements Map, ReferenceCollectionListener {
027        private final ReferenceCollection collection;
028        private final Map map;
029        private final Key key;
030    
031        /**
032         * Constructs the ReferenceMap using a new instance of
033         * HashMap as the internal map.
034         *
035         * @param collection Must be an instance of ReferenceCollection
036         * @param map The map instance to which references will be added/removed
037         * @param key
038         */
039        public ReferenceMap(Collection collection, Map map, Key key) {
040            this.collection = (ReferenceCollection) collection;
041            this.map = map;
042            this.key = key;
043            for (Iterator iterator = this.collection.iterator(); iterator.hasNext();) {
044                Object object = iterator.next();
045                map.put(key.getKey(object), object);
046            }
047            this.collection.addReferenceCollectionListener(this);
048        }
049    
050        /**
051         * Constructs the ReferenceMap using a new instance of
052         * HashMap as the internal map.
053         *
054         * @param collection Must be an instance of ReferenceCollection
055         * @param key
056         */
057        public ReferenceMap(Collection collection, Key key) {
058            this(collection, new HashMap(), key);
059        }
060    
061        public void memberAdded(ReferenceCollectionEvent event) {
062            map.put(key.getKey(event.getMember()), event.getMember());
063        }
064    
065        public void memberRemoved(ReferenceCollectionEvent event) {
066            map.remove(key.getKey(event.getMember()));
067        }
068    
069        public interface Key {
070            public Object getKey(Object object);
071        }
072    
073        public int size() {
074            return map.size();
075        }
076    
077        public boolean isEmpty() {
078            return map.isEmpty();
079        }
080    
081        public boolean containsKey(Object key) {
082            return map.containsKey(key);
083        }
084    
085        public boolean containsValue(Object value) {
086            return map.containsValue(value);
087        }
088    
089        public Object get(Object key) {
090            return map.get(key);
091        }
092    
093        public Object put(Object key, Object value) {
094            return map.put(key, value);
095        }
096    
097        public Object remove(Object key) {
098            return map.remove(key);
099        }
100    
101        public void putAll(Map t) {
102            map.putAll(t);
103        }
104    
105        public void clear() {
106            map.clear();
107        }
108    
109        public Set keySet() {
110            return map.keySet();
111        }
112    
113        public Collection values() {
114            return map.values();
115        }
116    
117        public Set entrySet() {
118            return map.entrySet();
119        }
120    
121        public boolean equals(Object o) {
122            return map.equals(o);
123        }
124    
125        public int hashCode() {
126            return map.hashCode();
127        }
128    }