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.collections.bidimap;
018    
019    import java.util.Collection;
020    import java.util.Map;
021    import java.util.Set;
022    
023    import org.apache.commons.collections.BidiMap;
024    import org.apache.commons.collections.MapIterator;
025    import org.apache.commons.collections.OrderedBidiMap;
026    import org.apache.commons.collections.OrderedMapIterator;
027    import org.apache.commons.collections.Unmodifiable;
028    import org.apache.commons.collections.collection.UnmodifiableCollection;
029    import org.apache.commons.collections.iterators.UnmodifiableOrderedMapIterator;
030    import org.apache.commons.collections.map.UnmodifiableEntrySet;
031    import org.apache.commons.collections.set.UnmodifiableSet;
032    
033    /**
034     * Decorates another <code>OrderedBidiMap</code> to ensure it can't be altered.
035     *
036     * @since Commons Collections 3.0
037     * @version $Revision: 646777 $ $Date: 2008-04-10 13:33:15 +0100 (Thu, 10 Apr 2008) $
038     * 
039     * @author Stephen Colebourne
040     */
041    public final class UnmodifiableOrderedBidiMap
042            extends AbstractOrderedBidiMapDecorator implements Unmodifiable {
043        
044        /** The inverse unmodifiable map */
045        private UnmodifiableOrderedBidiMap inverse;
046    
047        /**
048         * Factory method to create an unmodifiable map.
049         * <p>
050         * If the map passed in is already unmodifiable, it is returned.
051         * 
052         * @param map  the map to decorate, must not be null
053         * @return an unmodifiable OrderedBidiMap
054         * @throws IllegalArgumentException if map is null
055         */
056        public static OrderedBidiMap decorate(OrderedBidiMap map) {
057            if (map instanceof Unmodifiable) {
058                return map;
059            }
060            return new UnmodifiableOrderedBidiMap(map);
061        }
062    
063        //-----------------------------------------------------------------------
064        /**
065         * Constructor that wraps (not copies).
066         * 
067         * @param map  the map to decorate, must not be null
068         * @throws IllegalArgumentException if map is null
069         */
070        private UnmodifiableOrderedBidiMap(OrderedBidiMap map) {
071            super(map);
072        }
073    
074        //-----------------------------------------------------------------------
075        public void clear() {
076            throw new UnsupportedOperationException();
077        }
078    
079        public Object put(Object key, Object value) {
080            throw new UnsupportedOperationException();
081        }
082    
083        public void putAll(Map mapToCopy) {
084            throw new UnsupportedOperationException();
085        }
086    
087        public Object remove(Object key) {
088            throw new UnsupportedOperationException();
089        }
090    
091        public Set entrySet() {
092            Set set = super.entrySet();
093            return UnmodifiableEntrySet.decorate(set);
094        }
095    
096        public Set keySet() {
097            Set set = super.keySet();
098            return UnmodifiableSet.decorate(set);
099        }
100    
101        public Collection values() {
102            Collection coll = super.values();
103            return UnmodifiableCollection.decorate(coll);
104        }
105    
106        //-----------------------------------------------------------------------
107        public Object removeValue(Object value) {
108            throw new UnsupportedOperationException();
109        }
110    
111        public MapIterator mapIterator() {
112            return orderedMapIterator();
113        }
114    
115        public BidiMap inverseBidiMap() {
116            return inverseOrderedBidiMap();
117        }
118        
119        //-----------------------------------------------------------------------
120        public OrderedMapIterator orderedMapIterator() {
121            OrderedMapIterator it = getOrderedBidiMap().orderedMapIterator();
122            return UnmodifiableOrderedMapIterator.decorate(it);
123        }
124    
125        public OrderedBidiMap inverseOrderedBidiMap() {
126            if (inverse == null) {
127                inverse = new UnmodifiableOrderedBidiMap(getOrderedBidiMap().inverseOrderedBidiMap());
128                inverse.inverse = this;
129            }
130            return inverse;
131        }
132    
133    }