001 package org.maltparser.core.pool;
002
003 import java.util.ArrayList;
004
005 import org.maltparser.core.exception.MaltChainedException;
006
007 public 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 }