/*
 * This class autogenerated by com.mchange.v2.c3p0.codegen.BeangenDataSourceGenerator.
 * Tue Jan 09 11:50:58 EST 2018
 * DO NOT HAND EDIT!
 */

package com.mchange.v2.c3p0.impl;

import com.mchange.v2.c3p0.C3P0Registry;
import com.mchange.v2.c3p0.ConnectionCustomizer;
import com.mchange.v2.c3p0.cfg.C3P0Config;
import com.mchange.v2.c3p0.impl.C3P0ImplUtils;
import com.mchange.v2.naming.JavaBeanObjectFactory;
import com.mchange.v2.naming.JavaBeanReferenceMaker;
import com.mchange.v2.naming.ReferenceIndirector;
import com.mchange.v2.naming.ReferenceMaker;
import com.mchange.v2.ser.IndirectlySerialized;
import com.mchange.v2.ser.Indirector;
import com.mchange.v2.ser.SerializableUtils;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
import java.beans.VetoableChangeSupport;
import java.io.IOException;
import java.io.NotSerializableException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.logging.Logger;
import javax.naming.NamingException;
import javax.naming.Reference;
import javax.naming.Referenceable;
import javax.sql.DataSource;
import javax.sql.PooledConnection;

/**
 * This class was generated by com.mchange.v2.c3p0.codegen.BeangenDataSourceGenerator.
 */
public abstract class WrapperConnectionPoolDataSourceBase extends IdentityTokenResolvable implements Referenceable, Serializable
{
	protected PropertyChangeSupport pcs = new PropertyChangeSupport( this );
	
	protected PropertyChangeSupport getPropertyChangeSupport()
	{ return pcs; }
	protected VetoableChangeSupport vcs = new VetoableChangeSupport( this );
	
	protected VetoableChangeSupport getVetoableChangeSupport()
	{ return vcs; }
	private int acquireIncrement = C3P0Config.initializeIntPropertyVar("acquireIncrement", C3P0Defaults.acquireIncrement());
	private int acquireRetryAttempts = C3P0Config.initializeIntPropertyVar("acquireRetryAttempts", C3P0Defaults.acquireRetryAttempts());
	private int acquireRetryDelay = C3P0Config.initializeIntPropertyVar("acquireRetryDelay", C3P0Defaults.acquireRetryDelay());
	private boolean autoCommitOnClose = C3P0Config.initializeBooleanPropertyVar("autoCommitOnClose", C3P0Defaults.autoCommitOnClose());
	private String automaticTestTable = C3P0Config.initializeStringPropertyVar("automaticTestTable", C3P0Defaults.automaticTestTable());
	private boolean breakAfterAcquireFailure = C3P0Config.initializeBooleanPropertyVar("breakAfterAcquireFailure", C3P0Defaults.breakAfterAcquireFailure());
	private int checkoutTimeout = C3P0Config.initializeIntPropertyVar("checkoutTimeout", C3P0Defaults.checkoutTimeout());
	private String connectionCustomizerClassName = C3P0Config.initializeStringPropertyVar("connectionCustomizerClassName", C3P0Defaults.connectionCustomizerClassName());
	private String connectionTesterClassName = C3P0Config.initializeStringPropertyVar("connectionTesterClassName", C3P0Defaults.connectionTesterClassName());
	private String contextClassLoaderSource = C3P0Config.initializeStringPropertyVar("contextClassLoaderSource", C3P0Defaults.contextClassLoaderSource());
	private boolean debugUnreturnedConnectionStackTraces = C3P0Config.initializeBooleanPropertyVar("debugUnreturnedConnectionStackTraces", C3P0Defaults.debugUnreturnedConnectionStackTraces());
	private String factoryClassLocation = C3P0Config.initializeStringPropertyVar("factoryClassLocation", C3P0Defaults.factoryClassLocation());
	private boolean forceIgnoreUnresolvedTransactions = C3P0Config.initializeBooleanPropertyVar("forceIgnoreUnresolvedTransactions", C3P0Defaults.forceIgnoreUnresolvedTransactions());
	private boolean forceSynchronousCheckins = C3P0Config.initializeBooleanPropertyVar("forceSynchronousCheckins", C3P0Defaults.forceSynchronousCheckins());
	private volatile String identityToken;
	private int idleConnectionTestPeriod = C3P0Config.initializeIntPropertyVar("idleConnectionTestPeriod", C3P0Defaults.idleConnectionTestPeriod());
	private int initialPoolSize = C3P0Config.initializeIntPropertyVar("initialPoolSize", C3P0Defaults.initialPoolSize());
	private int maxAdministrativeTaskTime = C3P0Config.initializeIntPropertyVar("maxAdministrativeTaskTime", C3P0Defaults.maxAdministrativeTaskTime());
	private int maxConnectionAge = C3P0Config.initializeIntPropertyVar("maxConnectionAge", C3P0Defaults.maxConnectionAge());
	private int maxIdleTime = C3P0Config.initializeIntPropertyVar("maxIdleTime", C3P0Defaults.maxIdleTime());
	private int maxIdleTimeExcessConnections = C3P0Config.initializeIntPropertyVar("maxIdleTimeExcessConnections", C3P0Defaults.maxIdleTimeExcessConnections());
	private int maxPoolSize = C3P0Config.initializeIntPropertyVar("maxPoolSize", C3P0Defaults.maxPoolSize());
	private int maxStatements = C3P0Config.initializeIntPropertyVar("maxStatements", C3P0Defaults.maxStatements());
	private int maxStatementsPerConnection = C3P0Config.initializeIntPropertyVar("maxStatementsPerConnection", C3P0Defaults.maxStatementsPerConnection());
	private int minPoolSize = C3P0Config.initializeIntPropertyVar("minPoolSize", C3P0Defaults.minPoolSize());
	private DataSource nestedDataSource;
	private String overrideDefaultPassword = C3P0Config.initializeStringPropertyVar("overrideDefaultPassword", C3P0Defaults.overrideDefaultPassword());
	private String overrideDefaultUser = C3P0Config.initializeStringPropertyVar("overrideDefaultUser", C3P0Defaults.overrideDefaultUser());
	private String preferredTestQuery = C3P0Config.initializeStringPropertyVar("preferredTestQuery", C3P0Defaults.preferredTestQuery());
	private boolean privilegeSpawnedThreads = C3P0Config.initializeBooleanPropertyVar("privilegeSpawnedThreads", C3P0Defaults.privilegeSpawnedThreads());
	private int propertyCycle = C3P0Config.initializeIntPropertyVar("propertyCycle", C3P0Defaults.propertyCycle());
	private int statementCacheNumDeferredCloseThreads = C3P0Config.initializeIntPropertyVar("statementCacheNumDeferredCloseThreads", C3P0Defaults.statementCacheNumDeferredCloseThreads());
	private boolean testConnectionOnCheckin = C3P0Config.initializeBooleanPropertyVar("testConnectionOnCheckin", C3P0Defaults.testConnectionOnCheckin());
	private boolean testConnectionOnCheckout = C3P0Config.initializeBooleanPropertyVar("testConnectionOnCheckout", C3P0Defaults.testConnectionOnCheckout());
	private int unreturnedConnectionTimeout = C3P0Config.initializeIntPropertyVar("unreturnedConnectionTimeout", C3P0Defaults.unreturnedConnectionTimeout());
	private String userOverridesAsString = C3P0Config.initializeUserOverridesAsString();
	private boolean usesTraditionalReflectiveProxies = C3P0Config.initializeBooleanPropertyVar("usesTraditionalReflectiveProxies", C3P0Defaults.usesTraditionalReflectiveProxies());
	
	public synchronized int getAcquireIncrement()
	{ return acquireIncrement; }
	
	public synchronized void setAcquireIncrement( int acquireIncrement )
	{
		this.acquireIncrement = acquireIncrement;
	}
	
	public synchronized int getAcquireRetryAttempts()
	{ return acquireRetryAttempts; }
	
	public synchronized void setAcquireRetryAttempts( int acquireRetryAttempts )
	{
		this.acquireRetryAttempts = acquireRetryAttempts;
	}
	
	public synchronized int getAcquireRetryDelay()
	{ return acquireRetryDelay; }
	
	public synchronized void setAcquireRetryDelay( int acquireRetryDelay )
	{
		this.acquireRetryDelay = acquireRetryDelay;
	}
	
	public synchronized boolean isAutoCommitOnClose()
	{ return autoCommitOnClose; }
	
	public synchronized void setAutoCommitOnClose( boolean autoCommitOnClose )
	{
		this.autoCommitOnClose = autoCommitOnClose;
	}
	
	public synchronized String getAutomaticTestTable()
	{ return automaticTestTable; }
	
	public synchronized void setAutomaticTestTable( String automaticTestTable )
	{
		this.automaticTestTable = automaticTestTable;
	}
	
	public synchronized boolean isBreakAfterAcquireFailure()
	{ return breakAfterAcquireFailure; }
	
	public synchronized void setBreakAfterAcquireFailure( boolean breakAfterAcquireFailure )
	{
		this.breakAfterAcquireFailure = breakAfterAcquireFailure;
	}
	
	public synchronized int getCheckoutTimeout()
	{ return checkoutTimeout; }
	
	public synchronized void setCheckoutTimeout( int checkoutTimeout )
	{
		this.checkoutTimeout = checkoutTimeout;
	}
	
	public synchronized String getConnectionCustomizerClassName()
	{ return connectionCustomizerClassName; }
	
	public synchronized void setConnectionCustomizerClassName( String connectionCustomizerClassName )
	{
		this.connectionCustomizerClassName = connectionCustomizerClassName;
	}
	
	public synchronized String getConnectionTesterClassName()
	{ return connectionTesterClassName; }
	
	public synchronized void setConnectionTesterClassName( String connectionTesterClassName ) throws PropertyVetoException
	{
		String oldVal = this.connectionTesterClassName;
		if ( ! eqOrBothNull( oldVal, connectionTesterClassName ) )
			vcs.fireVetoableChange( "connectionTesterClassName", oldVal, connectionTesterClassName );
		this.connectionTesterClassName = connectionTesterClassName;
	}
	
	public synchronized String getContextClassLoaderSource()
	{ return contextClassLoaderSource; }
	
	public synchronized void setContextClassLoaderSource( String contextClassLoaderSource )
	{
		this.contextClassLoaderSource = contextClassLoaderSource;
	}
	
	public synchronized boolean isDebugUnreturnedConnectionStackTraces()
	{ return debugUnreturnedConnectionStackTraces; }
	
	public synchronized void setDebugUnreturnedConnectionStackTraces( boolean debugUnreturnedConnectionStackTraces )
	{
		this.debugUnreturnedConnectionStackTraces = debugUnreturnedConnectionStackTraces;
	}
	
	public synchronized String getFactoryClassLocation()
	{ return factoryClassLocation; }
	
	public synchronized void setFactoryClassLocation( String factoryClassLocation )
	{
		this.factoryClassLocation = factoryClassLocation;
	}
	
	public synchronized boolean isForceIgnoreUnresolvedTransactions()
	{ return forceIgnoreUnresolvedTransactions; }
	
	public synchronized void setForceIgnoreUnresolvedTransactions( boolean forceIgnoreUnresolvedTransactions )
	{
		this.forceIgnoreUnresolvedTransactions = forceIgnoreUnresolvedTransactions;
	}
	
	public synchronized boolean isForceSynchronousCheckins()
	{ return forceSynchronousCheckins; }
	
	public synchronized void setForceSynchronousCheckins( boolean forceSynchronousCheckins )
	{
		this.forceSynchronousCheckins = forceSynchronousCheckins;
	}
	
	public String getIdentityToken()
	{ return identityToken; }
	
	public void setIdentityToken( String identityToken )
	{
		String oldVal = this.identityToken;
		this.identityToken = identityToken;
		if ( ! eqOrBothNull( oldVal, identityToken ) )
			pcs.firePropertyChange( "identityToken", oldVal, identityToken );
	}
	
	public synchronized int getIdleConnectionTestPeriod()
	{ return idleConnectionTestPeriod; }
	
	public synchronized void setIdleConnectionTestPeriod( int idleConnectionTestPeriod )
	{
		this.idleConnectionTestPeriod = idleConnectionTestPeriod;
	}
	
	public synchronized int getInitialPoolSize()
	{ return initialPoolSize; }
	
	public synchronized void setInitialPoolSize( int initialPoolSize )
	{
		this.initialPoolSize = initialPoolSize;
	}
	
	public synchronized int getMaxAdministrativeTaskTime()
	{ return maxAdministrativeTaskTime; }
	
	public synchronized void setMaxAdministrativeTaskTime( int maxAdministrativeTaskTime )
	{
		this.maxAdministrativeTaskTime = maxAdministrativeTaskTime;
	}
	
	public synchronized int getMaxConnectionAge()
	{ return maxConnectionAge; }
	
	public synchronized void setMaxConnectionAge( int maxConnectionAge )
	{
		this.maxConnectionAge = maxConnectionAge;
	}
	
	public synchronized int getMaxIdleTime()
	{ return maxIdleTime; }
	
	public synchronized void setMaxIdleTime( int maxIdleTime )
	{
		this.maxIdleTime = maxIdleTime;
	}
	
	public synchronized int getMaxIdleTimeExcessConnections()
	{ return maxIdleTimeExcessConnections; }
	
	public synchronized void setMaxIdleTimeExcessConnections( int maxIdleTimeExcessConnections )
	{
		this.maxIdleTimeExcessConnections = maxIdleTimeExcessConnections;
	}
	
	public synchronized int getMaxPoolSize()
	{ return maxPoolSize; }
	
	public synchronized void setMaxPoolSize( int maxPoolSize )
	{
		this.maxPoolSize = maxPoolSize;
	}
	
	public synchronized int getMaxStatements()
	{ return maxStatements; }
	
	public synchronized void setMaxStatements( int maxStatements )
	{
		this.maxStatements = maxStatements;
	}
	
	public synchronized int getMaxStatementsPerConnection()
	{ return maxStatementsPerConnection; }
	
	public synchronized void setMaxStatementsPerConnection( int maxStatementsPerConnection )
	{
		this.maxStatementsPerConnection = maxStatementsPerConnection;
	}
	
	public synchronized int getMinPoolSize()
	{ return minPoolSize; }
	
	public synchronized void setMinPoolSize( int minPoolSize )
	{
		this.minPoolSize = minPoolSize;
	}
	
	public synchronized DataSource getNestedDataSource()
	{ return nestedDataSource; }
	
	public synchronized void setNestedDataSource( DataSource nestedDataSource )
	{
		DataSource oldVal = this.nestedDataSource;
		this.nestedDataSource = nestedDataSource;
		if ( ! eqOrBothNull( oldVal, nestedDataSource ) )
			pcs.firePropertyChange( "nestedDataSource", oldVal, nestedDataSource );
	}
	
	public synchronized String getOverrideDefaultPassword()
	{ return overrideDefaultPassword; }
	
	public synchronized void setOverrideDefaultPassword( String overrideDefaultPassword )
	{
		this.overrideDefaultPassword = overrideDefaultPassword;
	}
	
	public synchronized String getOverrideDefaultUser()
	{ return overrideDefaultUser; }
	
	public synchronized void setOverrideDefaultUser( String overrideDefaultUser )
	{
		this.overrideDefaultUser = overrideDefaultUser;
	}
	
	public synchronized String getPreferredTestQuery()
	{ return preferredTestQuery; }
	
	public synchronized void setPreferredTestQuery( String preferredTestQuery )
	{
		this.preferredTestQuery = preferredTestQuery;
	}
	
	public synchronized boolean isPrivilegeSpawnedThreads()
	{ return privilegeSpawnedThreads; }
	
	public synchronized void setPrivilegeSpawnedThreads( boolean privilegeSpawnedThreads )
	{
		this.privilegeSpawnedThreads = privilegeSpawnedThreads;
	}
	
	public synchronized int getPropertyCycle()
	{ return propertyCycle; }
	
	public synchronized void setPropertyCycle( int propertyCycle )
	{
		this.propertyCycle = propertyCycle;
	}
	
	public synchronized int getStatementCacheNumDeferredCloseThreads()
	{ return statementCacheNumDeferredCloseThreads; }
	
	public synchronized void setStatementCacheNumDeferredCloseThreads( int statementCacheNumDeferredCloseThreads )
	{
		this.statementCacheNumDeferredCloseThreads = statementCacheNumDeferredCloseThreads;
	}
	
	public synchronized boolean isTestConnectionOnCheckin()
	{ return testConnectionOnCheckin; }
	
	public synchronized void setTestConnectionOnCheckin( boolean testConnectionOnCheckin )
	{
		this.testConnectionOnCheckin = testConnectionOnCheckin;
	}
	
	public synchronized boolean isTestConnectionOnCheckout()
	{ return testConnectionOnCheckout; }
	
	public synchronized void setTestConnectionOnCheckout( boolean testConnectionOnCheckout )
	{
		this.testConnectionOnCheckout = testConnectionOnCheckout;
	}
	
	public synchronized int getUnreturnedConnectionTimeout()
	{ return unreturnedConnectionTimeout; }
	
	public synchronized void setUnreturnedConnectionTimeout( int unreturnedConnectionTimeout )
	{
		this.unreturnedConnectionTimeout = unreturnedConnectionTimeout;
	}
	
	public synchronized String getUserOverridesAsString()
	{ return userOverridesAsString; }
	
	public synchronized void setUserOverridesAsString( String userOverridesAsString ) throws PropertyVetoException
	{
		String oldVal = this.userOverridesAsString;
		if ( ! eqOrBothNull( oldVal, userOverridesAsString ) )
			vcs.fireVetoableChange( "userOverridesAsString", oldVal, userOverridesAsString );
		this.userOverridesAsString = userOverridesAsString;
	}
	
	public synchronized boolean isUsesTraditionalReflectiveProxies()
	{ return usesTraditionalReflectiveProxies; }
	
	public synchronized void setUsesTraditionalReflectiveProxies( boolean usesTraditionalReflectiveProxies )
	{
		this.usesTraditionalReflectiveProxies = usesTraditionalReflectiveProxies;
	}
	
	public void addPropertyChangeListener( PropertyChangeListener pcl )
	{ pcs.addPropertyChangeListener( pcl ); }
	
	public void addPropertyChangeListener( String propName, PropertyChangeListener pcl )
	{ pcs.addPropertyChangeListener( propName, pcl ); }
	
	public void removePropertyChangeListener( PropertyChangeListener pcl )
	{ pcs.removePropertyChangeListener( pcl ); }
	
	public void removePropertyChangeListener( String propName, PropertyChangeListener pcl )
	{ pcs.removePropertyChangeListener( propName, pcl ); }
	
	public PropertyChangeListener[] getPropertyChangeListeners()
	{ return pcs.getPropertyChangeListeners(); }
	
	public void addVetoableChangeListener( VetoableChangeListener vcl )
	{ vcs.addVetoableChangeListener( vcl ); }
	
	public void removeVetoableChangeListener( VetoableChangeListener vcl )
	{ vcs.removeVetoableChangeListener( vcl ); }
	
	public VetoableChangeListener[] getVetoableChangeListeners()
	{ return vcs.getVetoableChangeListeners(); }
	private boolean eqOrBothNull( Object a, Object b )
	{
		return
			a == b ||
			(a != null && a.equals(b));
	}
	
	private static final long serialVersionUID = 1;
	private static final short VERSION = 0x0001;
	
	private void writeObject( ObjectOutputStream oos ) throws IOException
	{
		oos.writeShort( VERSION );
		oos.writeInt(acquireIncrement);
		oos.writeInt(acquireRetryAttempts);
		oos.writeInt(acquireRetryDelay);
		oos.writeBoolean(autoCommitOnClose);
		oos.writeObject( automaticTestTable );
		oos.writeBoolean(breakAfterAcquireFailure);
		oos.writeInt(checkoutTimeout);
		oos.writeObject( connectionCustomizerClassName );
		oos.writeObject( connectionTesterClassName );
		oos.writeObject( contextClassLoaderSource );
		oos.writeBoolean(debugUnreturnedConnectionStackTraces);
		oos.writeObject( factoryClassLocation );
		oos.writeBoolean(forceIgnoreUnresolvedTransactions);
		oos.writeBoolean(forceSynchronousCheckins);
		oos.writeObject( identityToken );
		oos.writeInt(idleConnectionTestPeriod);
		oos.writeInt(initialPoolSize);
		oos.writeInt(maxAdministrativeTaskTime);
		oos.writeInt(maxConnectionAge);
		oos.writeInt(maxIdleTime);
		oos.writeInt(maxIdleTimeExcessConnections);
		oos.writeInt(maxPoolSize);
		oos.writeInt(maxStatements);
		oos.writeInt(maxStatementsPerConnection);
		oos.writeInt(minPoolSize);
		try
		{
			//test serialize
			SerializableUtils.toByteArray(nestedDataSource);
			oos.writeObject( nestedDataSource );
		}
		catch (NotSerializableException nse)
		{
			com.mchange.v2.log.MLog.getLogger( this.getClass() ).log(com.mchange.v2.log.MLevel.FINE, "Direct serialization provoked a NotSerializableException! Trying indirect.", nse);
			try
			{
				Indirector indirector = new com.mchange.v2.naming.ReferenceIndirector();
				oos.writeObject( indirector.indirectForm( nestedDataSource ) );
			}
			catch (IOException indirectionIOException)
			{ throw indirectionIOException; }
			catch (Exception indirectionOtherException)
			{ throw new IOException("Problem indirectly serializing nestedDataSource: " + indirectionOtherException.toString() ); }
		}
		oos.writeObject( overrideDefaultPassword );
		oos.writeObject( overrideDefaultUser );
		oos.writeObject( preferredTestQuery );
		oos.writeBoolean(privilegeSpawnedThreads);
		oos.writeInt(propertyCycle);
		oos.writeInt(statementCacheNumDeferredCloseThreads);
		oos.writeBoolean(testConnectionOnCheckin);
		oos.writeBoolean(testConnectionOnCheckout);
		oos.writeInt(unreturnedConnectionTimeout);
		oos.writeObject( userOverridesAsString );
		oos.writeBoolean(usesTraditionalReflectiveProxies);
	}
	
	private void readObject( ObjectInputStream ois ) throws IOException, ClassNotFoundException
	{
		short version = ois.readShort();
		switch (version)
		{
			case VERSION:
				this.acquireIncrement = ois.readInt();
				this.acquireRetryAttempts = ois.readInt();
				this.acquireRetryDelay = ois.readInt();
				this.autoCommitOnClose = ois.readBoolean();
				this.automaticTestTable = (String) ois.readObject();
				this.breakAfterAcquireFailure = ois.readBoolean();
				this.checkoutTimeout = ois.readInt();
				this.connectionCustomizerClassName = (String) ois.readObject();
				this.connectionTesterClassName = (String) ois.readObject();
				this.contextClassLoaderSource = (String) ois.readObject();
				this.debugUnreturnedConnectionStackTraces = ois.readBoolean();
				this.factoryClassLocation = (String) ois.readObject();
				this.forceIgnoreUnresolvedTransactions = ois.readBoolean();
				this.forceSynchronousCheckins = ois.readBoolean();
				this.identityToken = (String) ois.readObject();
				this.idleConnectionTestPeriod = ois.readInt();
				this.initialPoolSize = ois.readInt();
				this.maxAdministrativeTaskTime = ois.readInt();
				this.maxConnectionAge = ois.readInt();
				this.maxIdleTime = ois.readInt();
				this.maxIdleTimeExcessConnections = ois.readInt();
				this.maxPoolSize = ois.readInt();
				this.maxStatements = ois.readInt();
				this.maxStatementsPerConnection = ois.readInt();
				this.minPoolSize = ois.readInt();
				// we create an artificial scope so that we can use the name o for all indirectly serialized objects.
				{
					Object o = ois.readObject();
					if (o instanceof IndirectlySerialized) o = ((IndirectlySerialized) o).getObject();
					this.nestedDataSource = (DataSource) o;
				}
				this.overrideDefaultPassword = (String) ois.readObject();
				this.overrideDefaultUser = (String) ois.readObject();
				this.preferredTestQuery = (String) ois.readObject();
				this.privilegeSpawnedThreads = ois.readBoolean();
				this.propertyCycle = ois.readInt();
				this.statementCacheNumDeferredCloseThreads = ois.readInt();
				this.testConnectionOnCheckin = ois.readBoolean();
				this.testConnectionOnCheckout = ois.readBoolean();
				this.unreturnedConnectionTimeout = ois.readInt();
				this.userOverridesAsString = (String) ois.readObject();
				this.usesTraditionalReflectiveProxies = ois.readBoolean();
				this.pcs = new PropertyChangeSupport( this );
				this.vcs = new VetoableChangeSupport( this );
				break;
			default:
				throw new IOException("Unsupported Serialized Version: " + version);
		}
	}
	
	// JDK7 add-on
	public Logger getParentLogger() throws SQLFeatureNotSupportedException
	{ return C3P0ImplUtils.PARENT_LOGGER;}
	
	public String toString()
	{
		StringBuffer sb = new StringBuffer();
		sb.append( super.toString() );
		sb.append(" [ ");
		sb.append( "acquireIncrement -> " + acquireIncrement );
		sb.append( ", ");
		sb.append( "acquireRetryAttempts -> " + acquireRetryAttempts );
		sb.append( ", ");
		sb.append( "acquireRetryDelay -> " + acquireRetryDelay );
		sb.append( ", ");
		sb.append( "autoCommitOnClose -> " + autoCommitOnClose );
		sb.append( ", ");
		sb.append( "automaticTestTable -> " + automaticTestTable );
		sb.append( ", ");
		sb.append( "breakAfterAcquireFailure -> " + breakAfterAcquireFailure );
		sb.append( ", ");
		sb.append( "checkoutTimeout -> " + checkoutTimeout );
		sb.append( ", ");
		sb.append( "connectionCustomizerClassName -> " + connectionCustomizerClassName );
		sb.append( ", ");
		sb.append( "connectionTesterClassName -> " + connectionTesterClassName );
		sb.append( ", ");
		sb.append( "contextClassLoaderSource -> " + contextClassLoaderSource );
		sb.append( ", ");
		sb.append( "debugUnreturnedConnectionStackTraces -> " + debugUnreturnedConnectionStackTraces );
		sb.append( ", ");
		sb.append( "factoryClassLocation -> " + factoryClassLocation );
		sb.append( ", ");
		sb.append( "forceIgnoreUnresolvedTransactions -> " + forceIgnoreUnresolvedTransactions );
		sb.append( ", ");
		sb.append( "forceSynchronousCheckins -> " + forceSynchronousCheckins );
		sb.append( ", ");
		sb.append( "identityToken -> " + identityToken );
		sb.append( ", ");
		sb.append( "idleConnectionTestPeriod -> " + idleConnectionTestPeriod );
		sb.append( ", ");
		sb.append( "initialPoolSize -> " + initialPoolSize );
		sb.append( ", ");
		sb.append( "maxAdministrativeTaskTime -> " + maxAdministrativeTaskTime );
		sb.append( ", ");
		sb.append( "maxConnectionAge -> " + maxConnectionAge );
		sb.append( ", ");
		sb.append( "maxIdleTime -> " + maxIdleTime );
		sb.append( ", ");
		sb.append( "maxIdleTimeExcessConnections -> " + maxIdleTimeExcessConnections );
		sb.append( ", ");
		sb.append( "maxPoolSize -> " + maxPoolSize );
		sb.append( ", ");
		sb.append( "maxStatements -> " + maxStatements );
		sb.append( ", ");
		sb.append( "maxStatementsPerConnection -> " + maxStatementsPerConnection );
		sb.append( ", ");
		sb.append( "minPoolSize -> " + minPoolSize );
		sb.append( ", ");
		sb.append( "nestedDataSource -> " + nestedDataSource );
		sb.append( ", ");
		sb.append( "preferredTestQuery -> " + preferredTestQuery );
		sb.append( ", ");
		sb.append( "privilegeSpawnedThreads -> " + privilegeSpawnedThreads );
		sb.append( ", ");
		sb.append( "propertyCycle -> " + propertyCycle );
		sb.append( ", ");
		sb.append( "statementCacheNumDeferredCloseThreads -> " + statementCacheNumDeferredCloseThreads );
		sb.append( ", ");
		sb.append( "testConnectionOnCheckin -> " + testConnectionOnCheckin );
		sb.append( ", ");
		sb.append( "testConnectionOnCheckout -> " + testConnectionOnCheckout );
		sb.append( ", ");
		sb.append( "unreturnedConnectionTimeout -> " + unreturnedConnectionTimeout );
		sb.append( ", ");
		sb.append( "usesTraditionalReflectiveProxies -> " + usesTraditionalReflectiveProxies );
		
		String extraToStringInfo = this.extraToStringInfo();
		if (extraToStringInfo != null)
			sb.append( extraToStringInfo );
		sb.append(" ]");
		return sb.toString();
	}
	
	protected String extraToStringInfo()
	{ return null; }
	
	final static JavaBeanReferenceMaker referenceMaker = new com.mchange.v2.naming.JavaBeanReferenceMaker();
	
	static
	{
		referenceMaker.setFactoryClassName( "com.mchange.v2.c3p0.impl.C3P0JavaBeanObjectFactory" );
		referenceMaker.addReferenceProperty("acquireIncrement");
		referenceMaker.addReferenceProperty("acquireRetryAttempts");
		referenceMaker.addReferenceProperty("acquireRetryDelay");
		referenceMaker.addReferenceProperty("autoCommitOnClose");
		referenceMaker.addReferenceProperty("automaticTestTable");
		referenceMaker.addReferenceProperty("breakAfterAcquireFailure");
		referenceMaker.addReferenceProperty("checkoutTimeout");
		referenceMaker.addReferenceProperty("connectionCustomizerClassName");
		referenceMaker.addReferenceProperty("connectionTesterClassName");
		referenceMaker.addReferenceProperty("contextClassLoaderSource");
		referenceMaker.addReferenceProperty("debugUnreturnedConnectionStackTraces");
		referenceMaker.addReferenceProperty("factoryClassLocation");
		referenceMaker.addReferenceProperty("forceIgnoreUnresolvedTransactions");
		referenceMaker.addReferenceProperty("forceSynchronousCheckins");
		referenceMaker.addReferenceProperty("identityToken");
		referenceMaker.addReferenceProperty("idleConnectionTestPeriod");
		referenceMaker.addReferenceProperty("initialPoolSize");
		referenceMaker.addReferenceProperty("maxAdministrativeTaskTime");
		referenceMaker.addReferenceProperty("maxConnectionAge");
		referenceMaker.addReferenceProperty("maxIdleTime");
		referenceMaker.addReferenceProperty("maxIdleTimeExcessConnections");
		referenceMaker.addReferenceProperty("maxPoolSize");
		referenceMaker.addReferenceProperty("maxStatements");
		referenceMaker.addReferenceProperty("maxStatementsPerConnection");
		referenceMaker.addReferenceProperty("minPoolSize");
		referenceMaker.addReferenceProperty("nestedDataSource");
		referenceMaker.addReferenceProperty("overrideDefaultPassword");
		referenceMaker.addReferenceProperty("overrideDefaultUser");
		referenceMaker.addReferenceProperty("preferredTestQuery");
		referenceMaker.addReferenceProperty("privilegeSpawnedThreads");
		referenceMaker.addReferenceProperty("propertyCycle");
		referenceMaker.addReferenceProperty("statementCacheNumDeferredCloseThreads");
		referenceMaker.addReferenceProperty("testConnectionOnCheckin");
		referenceMaker.addReferenceProperty("testConnectionOnCheckout");
		referenceMaker.addReferenceProperty("unreturnedConnectionTimeout");
		referenceMaker.addReferenceProperty("userOverridesAsString");
		referenceMaker.addReferenceProperty("usesTraditionalReflectiveProxies");
	}
	
	public Reference getReference() throws NamingException
	{
		return referenceMaker.createReference( this );
	}
	
	private WrapperConnectionPoolDataSourceBase()
	{}
	
	public WrapperConnectionPoolDataSourceBase( boolean autoregister )
	{
		if (autoregister)
		{
			this.identityToken = C3P0ImplUtils.allocateIdentityToken( this );
			C3P0Registry.reregister( this );
		}
	}
	
	protected abstract PooledConnection getPooledConnection( ConnectionCustomizer cc, String idt) throws SQLException;
	protected abstract PooledConnection getPooledConnection(String user, String password, ConnectionCustomizer cc, String idt) throws SQLException;
}
