    001package com.hammurapi.common;
    002
    003import java.util.Collection;
    004import java.util.Iterator;
    005import java.util.concurrent.atomic.AtomicBoolean;
    006
    007public class FreezeableCollection<E> implements Collection<E> {
    008
    009        private Collection<E> master;
    010        private AtomicBoolean freezed = new AtomicBoolean(false);
    011
    012        public FreezeableCollection(Collection<E> master) {
    013                this.master = master;
    014        }
    015
    016        public int size() {
    017                return master.size();
    018        }
    019
    020        public boolean isEmpty() {
    021                return master.isEmpty();
    022        }
    023
    024        public boolean contains(Object o) {
    025                return master.contains(o);
    026        }
    027
    028        public Iterator<E> iterator() {
    029                return new Iterator<E>() {
    030                        Iterator<E> masterIterator = master.iterator();
    031
    032                        @Override
    033                        public boolean hasNext() {
    034                                return masterIterator.hasNext();
    035                        }
    036
    037                        @Override
    038                        public E next() {
    039                                return masterIterator.next();
    040                        }
    041
    042                        @Override
    043                        public void remove() {
    044                                checkFrozen();
    045                                masterIterator.remove();
    046                        }
    047
    048                };
    049
    050        }
    051
    052        public Object[] toArray() {
    053                return master.toArray();
    054        }
    055
    056        public <T> T[] toArray(T[] a) {
    057                return master.toArray(a);
    058        }
    059
    060        public boolean add(E e) {
    061                checkFrozen();
    062                return master.add(e);
    063        }
    064
    065        public boolean remove(Object o) {
    066                checkFrozen();
    067                return master.remove(o);
    068        }
    069
    070        public boolean containsAll(Collection<?> c) {
    071                return master.containsAll(c);
    072        }
    073
    074        public boolean addAll(Collection<? extends E> c) {
    075                checkFrozen();
    076                return master.addAll(c);
    077        }
    078
    079        public boolean removeAll(Collection<?> c) {
    080                checkFrozen();
    081                return master.removeAll(c);
    082        }
    083
    084        public boolean retainAll(Collection<?> c) {
    085                checkFrozen();
    086                return master.retainAll(c);
    087        }
    088
    089        public void clear() {
    090                checkFrozen();
    091                master.clear();
    092        }
    093
    094        public boolean equals(Object o) {
    095                return master.equals(o);
    096        }
    097
    098        public int hashCode() {
    099                return master.hashCode();
    100        }
    101
    102        /**
    103         * Freezes collection making it unmodifiable.
    104         */
    105        public void freeze() {
    106                freezed.set(true);
    107        }
    108
    109        private void checkFrozen() {
    110                if (freezed.get()) {
    111                        IllegalStateException th = new IllegalStateException("Collection is frozen, no modifications are allowed");
    112                        th.printStackTrace();
    113                        throw th;
    114                }
    115        }
    116
    117}