001: // ***************************************************************
002: // * *
003: // * File: SimpleObjectPool.java *
004: // * *
005: // * Copyright (c) 2002 Sun Microsystems, Inc. *
006: // * All rights reserved. *
007: // * *
008: // * *
009: // * Author - alejandro.abdelnur@sun.com *
010: // * *
011: // ***************************************************************
012:
013: package com.sun.portal.common.pool;
014:
015: import java.util.List;
016: import java.util.ArrayList;
017:
018: public class SimpleObjectPool implements Pool {
019: private ObjectManager _objectManager;
020: private List _objectPool;
021: private int _minSize;
022: private int _maxSize;
023: private boolean _overflow;
024: private int _leased;
025: private int _mid;
026: private boolean _destroyed;
027:
028: public SimpleObjectPool(ObjectManager objectManager, int minSize,
029: int maxSize, boolean overflow) {
030: _objectManager = objectManager;
031: _objectPool = new ArrayList(maxSize);
032: _minSize = minSize;
033: _maxSize = maxSize;
034: _mid = (_minSize + _maxSize) / 2 + 1;
035: _overflow = overflow;
036: _leased = 0;
037: _destroyed = false;
038: for (int i = 0; i < _minSize; i++) {
039: _objectPool.add(_objectManager.createObject(null));
040: }
041: }
042:
043: public synchronized Object obtainObject(Object param) {
044: if (_destroyed) {
045: throw new IllegalStateException();
046: }
047: Object o = null;
048: int size = _objectPool.size();
049: if (size > 0) {
050: o = _objectPool.remove(size - 1); // takes the last one to avoid shifting in the arraylist
051: _leased++;
052: } else {
053: if (_leased < _maxSize || _overflow) {
054: o = _objectManager.createObject(param);
055: _leased++;
056: }
057: }
058: return o;
059: }
060:
061: public synchronized void releaseObject(Object o) {
062: _leased--;
063: if (_destroyed) {
064: _objectManager.destroyObject(o);
065: } else {
066: _objectPool.add(o);
067: int size = _objectPool.size();
068: int extra = size - _maxSize;
069: if (extra > 0 && _leased < _mid) {
070: for (int i = 0; i < extra; i++) {
071: o = _objectPool.remove(--size);
072: _objectManager.destroyObject(o);
073: }
074: }
075: }
076: }
077:
078: public int getLeased() {
079: return _leased;
080: }
081:
082: public int getMinSize() {
083: return _minSize;
084: }
085:
086: public int getMaxSize() {
087: return _maxSize;
088: }
089:
090: public void setMaxSize(int maxSize) {
091: if (_destroyed) {
092: throw new IllegalStateException();
093: }
094: _maxSize = maxSize;
095: }
096:
097: public synchronized void destroy() {
098: if (_destroyed) {
099: throw new IllegalStateException();
100: }
101: _destroyed = true;
102: for (int i = 0; i < _objectPool.size(); i++) {
103: Object o = _objectPool.get(i);
104: _objectManager.destroyObject(o);
105: }
106: }
107:
108: public final boolean doesReuseObjects() {
109: return true;
110: }
111:
112: protected void finalize() {
113: if (!_destroyed) {
114: destroy();
115: }
116: }
117:
118: }
|