/* JFox, the OpenSource J2EE Application Server
 *
 * Copyright (C) 2002 huihoo.org
 * Distributable under GNU LGPL license
 * See the GNU Lesser General Public License for more details.
 */

package org.huihoo.jfox.pool;

import org.huihoo.jfox.system.ComponentSupport;

/**
 * 
 * @author <a href="mailto:young_yy@hotmail.com">Young Yang</a>
 */

public abstract class AbstractIndexedObjectPool extends ComponentSupport implements IndexedObjectPool {
  /**
   * 这个池用来实际的生成和缓存池对象
   */
  protected AbstractObjectPool pool = null;

  protected ObjectFactory factory = null;

  public AbstractIndexedObjectPool(ObjectFactory factory) {
    if(factory == null) throw new NullPointerException("factory is null.");
    this.factory = factory;
  }

  public AbstractIndexedObjectPool(String objectFactoryClassName, String poolableClassName) {
//    super(objectFactoryClassName);
    ClassLoader loader = Thread.currentThread().getContextClassLoader();
    try {
      Class factoryClass = loader.loadClass(objectFactoryClassName);
      factory = (ObjectFactory)factoryClass.getConstructor(new Class[]{java.lang.String.class}).newInstance(new String[]{poolableClassName});
    }
    catch(ClassNotFoundException e){
      logger.fatal("Class " + objectFactoryClassName + " not found!" + e);
    }
    catch(NoSuchMethodException e){
      logger.fatal("No such constructor" + e);
    }
    catch(Exception e){
      logger.fatal("ObjectFactory " + objectFactoryClassName + " instantiator error" + e);
    }
  }

  public void clear() {
    pool.clear();
  }

  public ObjectFactory getObjectFactory() {
    return factory;
  }

  public int getRest() {
    return pool.getRest();
  }

  public int getWorking() {
    return pool.getWorking();
  }

  protected void doInit() throws Exception {
    pool = new SimpleObjectPool(factory);
    pool.init();
  }

  protected void doDestroy() throws Exception {
    pool.destroy();
  }
}