/*
 * This file is part of the QuickServer library 
 * Copyright (C) QuickServer.org
 *
 * Use, modification, copying and distribution of this software is subject to
 * the terms and conditions of the GNU Lesser General Public License. 
 * You should have received a copy of the GNU LGP License along with this 
 * library; if not, you can download a copy from <http://www.quickserver.org/>.
 *
 * For questions, suggestions, bug-reports, enhancement-requests etc.
 * visit http://www.quickserver.org
 *
 */

package org.quickserver.util.pool.thread;

import org.apache.commons.pool.BasePoolableObjectFactory; 

/**
 * A factory for creating {@link org.quickserver.util.pool.thread.ClientThread}
 * instances. 
 * @author Akshathkumar Shetty
 * @since 1.3
 */
public class ThreadObjectFactory extends BasePoolableObjectFactory {
	private ClientPool pool;
	private static int instanceCount = 0;
	private int id = -1;

	public ThreadObjectFactory() {
		super();
		id = ++instanceCount;
	}

	public void setClientPool(ClientPool pool) {
		this.pool = pool;
	}

	//Creates an instance that can be returned by the pool. 
	public Object makeObject() { 
		ClientThread ct = new ClientThread(pool, id);
		ct.start();
        return ct;
	} 

	//Uninitialize an instance to be returned to the pool. 
    public void passivateObject(Object obj) {
		((ClientThread)obj).clean();		
    } 

	//Reinitialize an instance to be returned by the pool. 
    public void activateObject(Object obj) {
	}
	
	//Destroys an instance no longer needed by the pool. 
	public void destroyObject(Object obj) {
		if(obj==null) return;
		Thread thread = (Thread) obj;
        synchronized(thread) {
            thread.interrupt();
        }
		thread = null;
	}

	//Ensures that the instance is safe to be returned by the pool. 
	public boolean validateObject(Object obj) {
		if(obj==null) return false;
		Thread thread = (Thread)obj;
		return thread.isAlive();
	}
}
