    001    package org.maltparser.core.pool;
    002
    003    import java.util.HashSet;
    004
    005    import org.maltparser.core.exception.MaltChainedException;
    006
    007
    008    public abstract class ObjectPoolSet<T> extends ObjectPool<T> {
    009            private final HashSet<T> available;
    010            private final HashSet<T> inuse;
    011
    012            public ObjectPoolSet() {
    013                    this(Integer.MAX_VALUE);
    014            }
    015
    016            public ObjectPoolSet(int keepThreshold) {
    017                    super(keepThreshold);
    018                    available = new HashSet<T>();
    019                    inuse = new HashSet<T>();
    020            }
    021
    022            protected abstract T create() throws MaltChainedException;
    023            public abstract void resetObject(T o) throws MaltChainedException;
    024
    025            public synchronized T checkOut() throws MaltChainedException {
    026                    if (available.isEmpty()) {
    027                            T t = create();
    028                            inuse.add(t);
    029                            return t;
    030                    } else {
    031                            for (T t : available) {
    032                                    inuse.add(t);
    033                                    available.remove(t);
    034                                    return t;
    035                            }
    036                    }
    037                    return null;
    038            }
    039
    040            public synchronized void checkIn(T t) throws MaltChainedException {
    041                    resetObject(t);
    042                    inuse.remove(t);
    043                    if (available.size() < keepThreshold) {
    044                            available.add(t);
    045                    }
    046            }
    047
    048            public synchronized void checkInAll() throws MaltChainedException {
    049                    for (T t : inuse) {
    050                            resetObject(t);
    051                            if (available.size() < keepThreshold) {
    052                                    available.add(t);
    053                            }
    054                    }
    055                    inuse.clear();
    056            }
    057
    058            public String toString() {
    059                    final StringBuilder sb = new StringBuilder();
    060                    for (T t : inuse) {
    061                            sb.append(t);
    062                            sb.append(", ");
    063                    }
    064                    return sb.toString();
    065            }
    066    }