/*
* Weblounge: Web Content Management System
* Copyright (c) 2003 - 2011 The Weblounge Team
* http://entwinemedia.com/weblounge
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package ch.entwine.weblounge.common.impl.site;
import ch.entwine.weblounge.common.site.Action;
import org.apache.commons.pool.impl.GenericObjectPool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Object pool for {@link Action} instances.
*/
public final class ActionPool extends GenericObjectPool<Action> {
/** Logging facility */
private static final Logger logger = LoggerFactory.getLogger(ActionPool.class);
/** The action name */
private String actionName = null;
/** The last reported limit */
private int reportedLimit = 0;
/**
* Creates a new pool which will manage {@link Action} instances that are
* created according to <code>configuration</code>.
*
* @param action
* the action
*/
public ActionPool(Action action) {
super(new ActionPoolFactory(action), -1);
if (action == null)
throw new IllegalArgumentException("Action configuration must not be null");
actionName = action.toString();
setTestOnBorrow(false);
setTestOnReturn(false);
}
/**
* {@inheritDoc}
*
* @see org.apache.commons.pool.impl.GenericObjectPool#borrowObject()
*/
@Override
public Action borrowObject() throws Exception {
Action action = super.borrowObject();
logger.debug("Received request to borrow action '{}', {} remaining", action.getIdentifier(), this.getNumIdle());
if (getNumActive() > reportedLimit + 10) {
reportedLimit += 10;
logger.debug("Action pool '{}' grew above {}", new Object[] {
action,
reportedLimit }
);
} else {
logger.debug("Action pool '{}' has {} members active, {} idle", new Object[] {
action,
this.getNumActive(),
this.getNumIdle() });
}
return action;
}
/**
* {@inheritDoc}
*
* @see org.apache.commons.pool.impl.GenericObjectPool#returnObject(java.lang.Object)
*/
@Override
public void returnObject(Action action) throws Exception {
super.returnObject(action);
logger.debug("Borrowed action '{}' returned to pool", action.getIdentifier());
logger.debug("Action pool '{}' has {} members active, {} idle", new Object[] {
action.getIdentifier(),
this.getNumActive(),
this.getNumIdle() });
if (getNumActive() < reportedLimit - 10) {
reportedLimit -= 10;
logger.debug("Action pool '{}' dropped below {}", new Object[] {
action,
reportedLimit }
);
} else {
logger.debug("Action pool '{}' has {} members active, {} idle", new Object[] {
action,
this.getNumActive(),
this.getNumIdle() });
}
}
/**
* {@inheritDoc}
*
* @see org.apache.commons.pool.impl.GenericObjectPool#invalidateObject(java.lang.Object)
*/
@Override
public void invalidateObject(Action obj) throws Exception {
Action action = super.borrowObject();
logger.debug("Invalidating action '{}'", action.getIdentifier());
super.invalidateObject(obj);
}
/**
* {@inheritDoc}
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "action pool [" + actionName + "]";
}
}