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