// Copyright (c) 1999, 2000 Oracle Corporation package oracle.jbo.common.ampool; import java.util.Vector; import java.util.Hashtable; import javax.naming.*; import oracle.jbo.*; /** ** This class provides the default implementation of the ApplicationPool interface. ** ** View definition of ApplicationPool ** View Implementation of ApplicationPoolImpl **
** @author Juan Oropeza **/ public class ApplicationPoolImpl extends Object implements ApplicationPool { static final String IS_CHECKED_OUT = "Yes"; static final String IS_NOT_CHECKED_OUT = "No"; Hashtable env; String poolName; Vector instances = new Vector(10); Context initialContext; ApplicationModuleHome home; Hashtable userData; String sConnectString; String sApplicationModule; Hashtable instanceInfo = new Hashtable(10); /** * Constructor */ public ApplicationPoolImpl() { } public void initialize(String sPoolName , String sApplicationModule, String sConnectString, Hashtable env) throws Exception { this.poolName = sPoolName; this.env = env; this.sConnectString = sConnectString; this.sApplicationModule = sApplicationModule; initialContext = new InitialContext(env); home = (ApplicationModuleHome) initialContext.lookup(sApplicationModule); } public String getApplicationModuleClass() { return this.sApplicationModule; } public String getConnectString() { return this.sConnectString; } public Hashtable getEnvironment() { return this.env; } public synchronized void checkin(ApplicationModule instance) { setAvailable(instance , true); } public boolean isAvailable(ApplicationModule instance) { Object obj = instanceInfo.get(instance.toString()); if(obj != null && obj.toString().equalsIgnoreCase(this.IS_CHECKED_OUT)) return false; return true; } public void setAvailable(ApplicationModule instance, boolean bSet) { if(bSet) { instanceInfo.put(instance.toString(),this.IS_NOT_CHECKED_OUT); } else { instanceInfo.put(instance.toString(),this.IS_CHECKED_OUT); } } public synchronized ApplicationModule createNewInstance() { // create a new instance using the connect info ApplicationModule am = home.create(); am.getTransaction().connect(this.sConnectString); instanceInfo.put(am.toString(),this.IS_NOT_CHECKED_OUT); // add instance to collection instances.addElement(am); return am; } public synchronized ApplicationModule checkout() { ApplicationModule available = null; ApplicationModule current = null; for(int i = 0 ; i < instances.size(); i ++) { current = (ApplicationModule)instances.elementAt(i); if(isAvailable(current)) { setAvailable(current , false); available = current; return available; } } if(available == null) { available = createNewInstance(); setAvailable(available, false); } return available; } public synchronized void releaseInstances() { int nSize = instances.size(); for(int i = 0; i < nSize; i++) { ApplicationModule instance = (ApplicationModule)instances.elementAt(i); instance.remove(); } for(int i = nSize - 1; i >= 0; i--) { instances.removeElementAt(i); } instanceInfo.clear(); } public synchronized int getInstanceCount() { return instances.size(); } public synchronized ApplicationModule getInstance(int nIndex) { return (ApplicationModule)instances.elementAt(nIndex); } public synchronized String getPoolName() { return poolName; } /** ** returns the User Data hashtable. This is a generic container for ** any settings the user would like to associate with this application instance. **/ public Hashtable getUserData() { return userData; } /** ** Replaces the userData with the new Hashtable. **/ public void setUserData(Hashtable data) { this.userData = data; } }