package example;
import java.io.*;
import java.util.*;
import javax.resource.spi.ManagedConnection;
import javax.resource.spi.ConnectionRequestInfo;
import javax.resource.spi.ConnectionEventListener;
import javax.resource.spi.ConnectionEvent;
import javax.resource.spi.ManagedConnectionMetaData;
import javax.resource.spi.LocalTransaction;
import javax.transaction.xa.XAResource;
import javax.security.auth.Subject;
/**
* ManagedConnectionImpl represents the underlying (SPI) connection to the
* resource. Resin will manage this ManagedConnection in its pool.
*
* The user will see the ConnectionImpl facade and may not even know
* that the ManagedConnectionImpl exists.
*/
public class ManagedConnectionImpl implements ManagedConnection {
private ManagedConnectionFactoryImpl _factory;
// Identifier for the ManagedConnectionImpl
private String _name;
// Resin needs to listen for close events
private ArrayList _listeners = new ArrayList();
/**
* Creates a new ManagedConnection with its id.
* ManagedConnectionFactoryImpl will create the ManagedConnectionImpl
* in response to a Resin request.
*/
ManagedConnectionImpl(String name, ManagedConnectionFactoryImpl factory)
{
_name = name;
_factory = factory;
}
/**
* Creates a new application connection. The application connection
* will be in use until its <code>close()</code> method is called.
* It's <code>close</code> method will call the ConnectionEventListener
* registered with this ManagedConnectionImpl instance.
*
* It is important for the connection's close to be called and for the
* connection to call the close listeners, because Resin needs to
* know when the application is done with the connection and Resin
* can return the ManagedConnection to the pool.
*
* @param subject the subject for the connection
* @param info the connection information for the connection
*
* @return the application-view of the connection
*/
public Object getConnection(Subject subject, ConnectionRequestInfo info)
{
return new ConnectionImpl(_factory.generateConnectionName(), this);
}
/**
* XXX:???
*
* In some cases, Resin can associate an old application connection
* with the ManagedConnection. (I'm not sure when this can happen.)
*
* @param conn the application view of the connection
*/
public void associateConnection(Object conn)
{
}
/**
* Resin will register a listener with the ManagedConnection so it
* will know when a connection closes or has a fatal error.
*
* @param listener Resin's listener to receive notice of a close.
*/
public void addConnectionEventListener(ConnectionEventListener listener)
{
_listeners.add(listener);
}
/**
* Resin can remove it's listener when it removes the managed connection
* from the pool.
*
* @param listener Resin's listener to receive notice of a close.
*/
public void removeConnectionEventListener(ConnectionEventListener listener)
{
_listeners.remove(listener);
}
/**
* Implementation method to allow the <code>ConnectionImpl</code> to
* trigger Resin's listeners when the connection closes.
*
* @param conn the user connection which is closing.
*/
void close(ConnectionImpl conn)
{
ConnectionEvent evt;
evt = new ConnectionEvent(this, ConnectionEvent.CONNECTION_CLOSED);
for (int i = 0; i < _listeners.size(); i++) {
ConnectionEventListener listener;
listener = (ConnectionEventListener) _listeners.get(i);
listener.connectionClosed(evt);
}
}
/**
* This example isn't returning any meta data. In general,
* providing the meta data is nice for the applications.
*/
public ManagedConnectionMetaData getMetaData()
{
return null;
}
/**
* Transaction-aware resources will return the XAResource for the
* managed connection.
*/
public XAResource getXAResource()
{
return null;
}
/**
* Transaction-aware resources will return the LocalTransaction for the
* managed connection. LocalTransaction is a lightweight interface
* for transactions that don't need the full XA transactions.
*/
public LocalTransaction getLocalTransaction()
{
return null;
}
/**
* Called when Resin returns a connection to the idle pool.
*/
public void cleanup()
{
}
/**
* Called when Resin is closing the connection. Any sockets, etc,
* would be closed here.
*/
public void destroy()
{
}
/**
* Logging should use JDK 1.4 java.util.logging.
*/
public PrintWriter getLogWriter()
{
return null;
}
/**
* Logging should use JDK 1.4 java.util.logging.
*/
public void setLogWriter(PrintWriter log)
{
}
public String toString()
{
return "ManagedConnectionImpl[" + _name + "]";
}
}