/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.runtime.core.util.pool;
import org.mule.runtime.api.config.PoolingProfile;
import org.mule.runtime.core.api.MuleContext;
import org.mule.runtime.api.exception.MuleException;
import org.mule.runtime.core.api.component.JavaComponent;
import org.mule.runtime.core.api.component.LifecycleAdapter;
import org.mule.runtime.api.lifecycle.Disposable;
import org.mule.runtime.api.lifecycle.Startable;
import org.mule.runtime.api.lifecycle.Stoppable;
import org.mule.runtime.core.api.object.ObjectFactory;
import org.mule.runtime.core.component.PooledJavaComponent;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.commons.pool.PoolableObjectFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* A LifecyleEnabledObjectPool implementation for pooling {@link LifecycleAdapter} instances for implementations of
* {@link JavaComponent} that require {@link LifecycleAdapter} pooling such as {@link PooledJavaComponent}.
*
* @see PooledJavaComponent
*/
public class DefaultLifecycleEnabledObjectPool extends CommonsPoolObjectPool implements LifecyleEnabledObjectPool {
/**
* logger used by this class
*/
protected static final Logger logger = LoggerFactory.getLogger(DefaultLifecycleEnabledObjectPool.class);
protected AtomicBoolean started = new AtomicBoolean(false);
private List items = new LinkedList();
/**
* @param objectFactory The object factory that should be used to create new
* {@link org.mule.runtime.core.api.component.LifecycleAdapter} instance for the pool
* @param poolingProfile The pooling progile ot be used to configure pool
* @param muleContext
*/
public DefaultLifecycleEnabledObjectPool(ObjectFactory objectFactory, PoolingProfile poolingProfile, MuleContext muleContext) {
super(objectFactory, poolingProfile, muleContext);
}
protected PoolableObjectFactory getPooledObjectFactory() {
return new LifecycleEnabledPoolabeObjectFactoryAdapter();
}
public void start() throws MuleException {
started.set(true);
synchronized (items) {
for (Iterator i = items.iterator(); i.hasNext();) {
((Startable) i.next()).start();
}
}
}
public void stop() throws MuleException {
started.set(false);
synchronized (items) {
for (Iterator i = items.iterator(); i.hasNext();) {
((Stoppable) i.next()).stop();
}
}
}
/**
* Wraps org.mule.runtime.core.object.ObjectFactory with commons-pool PoolableObjectFactory
*/
class LifecycleEnabledPoolabeObjectFactoryAdapter implements PoolableObjectFactory {
public void activateObject(Object obj) throws Exception {
// nothing to do
}
public void destroyObject(Object obj) throws Exception {
// Only stop existing objects if they havn't already been stopped
if (started.get() && obj instanceof Stoppable) {
((Stoppable) obj).stop();
}
if (obj instanceof Disposable) {
((Disposable) obj).dispose();
}
synchronized (items) {
items.remove(obj);
}
}
public Object makeObject() throws Exception {
Object object = objectFactory.getInstance(muleContext);
// Only start newly created objects if pool is started
if (started.get() && object instanceof Startable) {
((Startable) object).start();
}
synchronized (items) {
items.add(object);
}
return object;
}
public void passivateObject(Object obj) throws Exception {
// nothing to do
}
public boolean validateObject(Object obj) {
return true;
}
}
}