package example;
import java.io.*;
import java.util.*;
import javax.resource.*;
import javax.resource.spi.*;
import javax.security.auth.*;
/**
* Implementation of the user's view of the connection. This
* class is entirely customizable.
*
* Normally, it will just be a facade to the underlying managed
* connection.
*/
public class ConnectionImpl {
private String _name;
// Reference to the underlying connection
private ManagedConnectionImpl _mConn;
private volatile boolean _isClosed;
/**
* Create the connection, with a reference to the underlying
* connection.
*/
ConnectionImpl(String name, ManagedConnectionImpl mConn)
{
_name = name;
_mConn = mConn;
}
/**
* Adding a <code>close()</code> method is very important for any
* connection API. It lets Resin know that the user has
* closed the connection and Resin can mark the managed connection
* as idle and reuse it.
*
* It is also important that the connection let the user call
* <code>close()</code>, but only the allow the first <code>close</code>
* to have any effect.
*
* In particular, it would be a mistake to call <code>_mConn.close</code>
* twice since that would tell Resin that the connection had closed
* twice, which might confuse Resin's pool.
*/
public void close()
{
synchronized (this) {
if (_isClosed)
return;
_isClosed = true;
}
ManagedConnectionImpl mConn = _mConn;
_mConn = null;
mConn.close(this);
}
public String toString()
{
return "ConnectionImpl[" + _name + "," + _mConn + "]";
}
public void finalize()
{
close();
}
}