package org.jboss.resource.adapter.jms;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.Set;
import javax.jms.ConnectionMetaData;
import javax.resource.ResourceException;
import javax.resource.spi.ConnectionManager;
import javax.resource.spi.ConnectionRequestInfo;
import javax.resource.spi.ManagedConnection;
import javax.resource.spi.ManagedConnectionFactory;
import javax.security.auth.Subject;
import org.jboss.jms.jndi.JMSProviderAdapter;
import org.jboss.logging.Logger;
public class JmsManagedConnectionFactory implements ManagedConnectionFactory
{
private static final Logger log = Logger.getLogger(JmsManagedConnection.class);
private JmsMCFProperties mcfProperties = new JmsMCFProperties();
private boolean strict = true;
private JMSProviderAdapter adapter;
public JmsManagedConnectionFactory()
{
}
public Object createConnectionFactory() throws ResourceException
{
return createConnectionFactory(null);
}
public Object createConnectionFactory(ConnectionManager cxManager) throws ResourceException
{
Object cf = new JmsConnectionFactoryImpl(this, cxManager);
if (log.isTraceEnabled())
{
log.trace("Created connection factory: " + cf + ", using connection manager: " + cxManager);
}
return cf;
}
public ManagedConnection createManagedConnection(Subject subject, ConnectionRequestInfo info)
throws ResourceException
{
boolean trace = log.isTraceEnabled();
info = getInfo(info);
if (trace)
log.trace("connection request info: " + info);
JmsCred cred = JmsCred.getJmsCred(this, subject, info);
if (trace)
log.trace("jms credentials: " + cred);
JmsManagedConnection mc = new JmsManagedConnection(this, info, cred.name, cred.pwd);
if (trace)
log.trace("created new managed connection: " + mc);
return mc;
}
public ManagedConnection matchManagedConnections(Set connectionSet, Subject subject, ConnectionRequestInfo info)
throws ResourceException
{
boolean trace = log.isTraceEnabled();
info = getInfo(info);
JmsCred cred = JmsCred.getJmsCred(this, subject, info);
if (trace)
log.trace("Looking for connection matching credentials: " + cred);
Iterator connections = connectionSet.iterator();
while (connections.hasNext())
{
Object obj = connections.next();
if (obj instanceof JmsManagedConnection)
{
JmsManagedConnection mc = (JmsManagedConnection) obj;
ManagedConnectionFactory mcf = mc.getManagedConnectionFactory();
if ((mc.getUserName() == null || (mc.getUserName() != null && mc.getUserName().equals(cred.name)))
&& mcf.equals(this))
{
if (info.equals(mc.getInfo()))
{
if (trace)
log.trace("Found matching connection: " + mc);
return mc;
}
}
}
}
if (trace)
log.trace("No matching connection was found");
return null;
}
public void setLogWriter(PrintWriter out) throws ResourceException
{
}
public PrintWriter getLogWriter() throws ResourceException
{
return null;
}
public boolean equals(Object obj)
{
if (obj == null)
return false;
if (obj instanceof JmsManagedConnectionFactory)
{
return mcfProperties.equals(((JmsManagedConnectionFactory) obj).getProperties());
}
else
{
return false;
}
}
public int hashCode()
{
return mcfProperties.hashCode();
}
public void setJmsProviderAdapterJNDI(String jndi)
{
mcfProperties.setProviderJNDI(jndi);
}
public String getJmsProviderAdapterJNDI()
{
return mcfProperties.getProviderJNDI();
}
public void setUserName(String userName)
{
mcfProperties.setUserName(userName);
}
public String getUserName()
{
return mcfProperties.getUserName();
}
public void setPassword(String password)
{
mcfProperties.setPassword(password);
}
public String getPassword()
{
return mcfProperties.getPassword();
}
public String getClientID()
{
return mcfProperties.getClientID();
}
public void setClientID(final String clientID)
{
mcfProperties.setClientID(clientID);
}
public boolean isStrict()
{
return strict;
}
public void setStrict(boolean strict)
{
this.strict = strict;
}
public void setStrict(Boolean strict)
{
this.strict = strict.booleanValue();
}
public void setSessionDefaultType(String type) throws ResourceException
{
mcfProperties.setSessionDefaultType(type);
}
public String getSessionDefaultType()
{
return mcfProperties.getSessionDefaultType();
}
public void setJmsProviderAdapter(final JMSProviderAdapter adapter)
{
this.adapter = adapter;
}
public JMSProviderAdapter getJmsProviderAdapter()
{
return adapter;
}
private ConnectionRequestInfo getInfo(ConnectionRequestInfo info)
{
if (info == null)
{
return new JmsConnectionRequestInfo(mcfProperties);
}
else
{
((JmsConnectionRequestInfo) info).setDefaults(mcfProperties);
return info;
}
}
public ConnectionMetaData getMetaData()
{
return new JmsConnectionMetaData();
}
protected JmsMCFProperties getProperties()
{
return mcfProperties;
}
}