blob: 8744a9deec893280ee12ef6bb4f6aa609784e27f [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.qpid.ra;
import java.io.PrintWriter;
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.resource.spi.ResourceAdapter;
import javax.resource.spi.ResourceAdapterAssociation;
import javax.security.auth.Subject;
import org.apache.qpid.client.AMQConnectionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Qpid ManagedConectionFactory
*
*/
public class QpidRAManagedConnectionFactory implements ManagedConnectionFactory, ResourceAdapterAssociation
{
/**
* Serial version UID
*/
private static final long serialVersionUID = -8798804592247643959L;
/**
* The logger
*/
private static final Logger _log = LoggerFactory.getLogger(QpidRAManagedConnectionFactory.class);
/**
* The resource adapter
*/
private QpidResourceAdapter _ra;
/**
* Connection manager
*/
private ConnectionManager _cm;
/**
* The managed connection factory properties
*/
private final QpidRAMCFProperties _mcfProperties;
/**
* Connection Factory used if properties are set
*/
private AMQConnectionFactory _connectionFactory;
/**
* Constructor
*/
public QpidRAManagedConnectionFactory()
{
if (_log.isTraceEnabled())
{
_log.trace("constructor()");
}
_ra = null;
_cm = null;
_mcfProperties = new QpidRAMCFProperties();
}
/**
* Creates a Connection Factory instance
*
* @return javax.resource.cci.ConnectionFactory instance
* @throws ResourceException Thrown if a connection factory cant be created
*/
public Object createConnectionFactory() throws ResourceException
{
if (_log.isTraceEnabled())
{
_log.trace("createConnectionFactory()");
}
return createConnectionFactory(new QpidRAConnectionManager());
}
/**
* Creates a Connection Factory instance
*
* @param cxManager The connection manager
* @return javax.resource.cci.ConnectionFactory instance
* @throws ResourceException Thrown if a connection factory cant be created
*/
public Object createConnectionFactory(final ConnectionManager cxManager) throws ResourceException
{
if (_log.isTraceEnabled())
{
_log.trace("createConnectionFactory(" + cxManager + ")");
}
_cm = cxManager;
QpidRAConnectionFactory cf = new QpidRAConnectionFactoryImpl(this, _cm);
if (_log.isTraceEnabled())
{
_log.trace("Created connection factory: " + cf +
", using connection manager: " +
_cm);
}
return cf;
}
/**
* Creates a new physical connection to the underlying EIS resource manager.
*
* @param subject Caller's security information
* @param cxRequestInfo Additional resource adapter specific connection request information
* @return The managed connection
* @throws ResourceException Thrown if a managed connection cant be created
*/
public ManagedConnection createManagedConnection(final Subject subject, final ConnectionRequestInfo cxRequestInfo) throws ResourceException
{
if (_log.isTraceEnabled())
{
_log.trace("createManagedConnection(" + subject + ", " + cxRequestInfo + ")");
}
QpidRAConnectionRequestInfo cri = getCRI((QpidRAConnectionRequestInfo)cxRequestInfo);
QpidRACredential credential = QpidRACredential.getCredential(this, subject, cri);
if (_log.isTraceEnabled())
{
_log.trace("jms credential: " + credential);
}
QpidRAManagedConnection mc = new QpidRAManagedConnection(this,
cri,
_ra.getTM(),
credential.getUserName(),
credential.getPassword());
if (_log.isTraceEnabled())
{
_log.trace("created new managed connection: " + mc);
}
return mc;
}
/**
* Returns a matched connection from the candidate set of connections.
*
* @param connectionSet The candidate connection set
* @param subject Caller's security information
* @param cxRequestInfo Additional resource adapter specific connection request information
* @return The managed connection
* @throws ResourceException Thrown if no managed connection can be found
*/
@SuppressWarnings("rawtypes")
public ManagedConnection matchManagedConnections(final Set connectionSet,
final Subject subject,
final ConnectionRequestInfo cxRequestInfo) throws ResourceException
{
if (_log.isTraceEnabled())
{
_log.trace("matchManagedConnections(" + connectionSet +
", " +
subject +
", " +
cxRequestInfo +
")");
}
QpidRAConnectionRequestInfo cri = getCRI((QpidRAConnectionRequestInfo)cxRequestInfo);
QpidRACredential credential = QpidRACredential.getCredential(this, subject, cri);
if (_log.isTraceEnabled())
{
_log.trace("Looking for connection matching credentials: " + credential);
}
for (final Object obj : connectionSet)
{
if (obj instanceof QpidRAManagedConnection)
{
QpidRAManagedConnection mc = (QpidRAManagedConnection)obj;
ManagedConnectionFactory mcf = mc.getManagedConnectionFactory();
if ((mc.getUserName() == null || mc.getUserName() != null && mc.getUserName()
.equals(credential.getUserName())) && mcf.equals(this))
{
if (cri.equals(mc.getCRI()))
{
if (_log.isTraceEnabled())
{
_log.trace("Found matching connection: " + mc);
}
return mc;
}
}
}
}
if (_log.isTraceEnabled())
{
_log.trace("No matching connection was found");
}
return null;
}
/**
* Set the log writer -- NOT SUPPORTED
*
* @param out The writer
* @throws ResourceException Thrown if the writer cant be set
*/
public void setLogWriter(final PrintWriter out) throws ResourceException
{
if (_log.isTraceEnabled())
{
_log.trace("setLogWriter(" + out + ")");
}
}
/**
* Get the log writer -- NOT SUPPORTED
*
* @return The writer
* @throws ResourceException Thrown if the writer cant be retrieved
*/
public PrintWriter getLogWriter() throws ResourceException
{
if (_log.isTraceEnabled())
{
_log.trace("getLogWriter()");
}
return null;
}
/**
* Get the resource adapter
*
* @return The resource adapter
*/
public ResourceAdapter getResourceAdapter()
{
if (_log.isTraceEnabled())
{
_log.trace("getResourceAdapter()");
}
return _ra;
}
/**
* Set the resource adapter
*
* @param ra The resource adapter
* @throws ResourceException Thrown if incorrect resource adapter
*/
public void setResourceAdapter(final ResourceAdapter ra) throws ResourceException
{
if (_log.isTraceEnabled())
{
_log.trace("setResourceAdapter(" + ra + ")");
}
if (!(ra instanceof QpidResourceAdapter))
{
throw new ResourceException("Resource adapter is " + ra);
}
this._ra = (QpidResourceAdapter)ra;
}
/**
* Indicates whether some other object is "equal to" this one.
*
* @param obj Object with which to compare
* @return True if this object is the same as the obj argument; false otherwise.
*/
@Override
public boolean equals(final Object obj)
{
if (obj instanceof QpidRAManagedConnectionFactory)
{
QpidRAManagedConnectionFactory other = (QpidRAManagedConnectionFactory)obj;
return _mcfProperties.equals(other.getProperties()) && _ra.equals(other.getResourceAdapter());
}
else
{
return false;
}
}
/**
* Return the hash code for the object
*
* @return The hash code
*/
@Override
public int hashCode()
{
int hash = _mcfProperties.hashCode();
hash += 31 * ((_ra != null) ? _ra.hashCode() : 1);
return hash;
}
/**
* Get the default session type
*
* @return The value
*/
public String getSessionDefaultType()
{
if (_log.isTraceEnabled())
{
_log.trace("getSessionDefaultType()");
}
return _mcfProperties.getSessionDefaultType();
}
/**
* Set the default session type
*
* @param type either javax.jms.Topic or javax.jms.Queue
*/
public void setSessionDefaultType(final String type)
{
if (_log.isTraceEnabled())
{
_log.trace("setSessionDefaultType(" + type + ")");
}
_mcfProperties.setSessionDefaultType(type);
}
public String getClientId()
{
return _mcfProperties.getClientId();
}
public void setClientId(final String clientID)
{
_mcfProperties.setClientId(clientID);
}
public String getConnectionURL()
{
return _mcfProperties.getConnectionURL() ;
}
public void setConnectionURL(final String connectionURL)
{
_mcfProperties.setConnectionURL(connectionURL);
}
public String getPassword()
{
if (_log.isTraceEnabled())
{
_log.trace("getDefaultPassword()");
}
return _mcfProperties.getPassword();
}
public void setPassword(final String defaultPassword)
{
if (_log.isTraceEnabled())
{
_log.trace("setDefaultPassword(" + defaultPassword + ")");
}
_mcfProperties.setPassword(defaultPassword);
}
public String getUserName()
{
if (_log.isTraceEnabled())
{
_log.trace("getDefaultUsername()");
}
return _mcfProperties.getUserName();
}
public void setUserName(final String defaultUsername)
{
if (_log.isTraceEnabled())
{
_log.trace("setDefaultUsername(" + defaultUsername + ")");
}
_mcfProperties.setUserName(defaultUsername);
}
public String getHost()
{
if (_log.isTraceEnabled())
{
_log.trace("getHost()");
}
return _mcfProperties.getHost();
}
public void setHost(final String host)
{
if (_log.isTraceEnabled())
{
_log.trace("setHost(" + host + ")");
}
_mcfProperties.setHost(host);
}
public Integer getPort()
{
if (_log.isTraceEnabled())
{
_log.trace("getPort()");
}
return _mcfProperties.getPort();
}
public void setPort(final Integer port)
{
if (_log.isTraceEnabled())
{
_log.trace("setPort(" + port + ")");
}
_mcfProperties.setPort(port);
}
public String getPath()
{
if (_log.isTraceEnabled())
{
_log.trace("getPath()");
}
return _mcfProperties.getPath();
}
public void setPath(final String path)
{
if (_log.isTraceEnabled())
{
_log.trace("setPath(" + path + ")");
}
_mcfProperties.setPath(path);
}
/**
* Get the useTryLock.
*
* @return the useTryLock.
*/
public Integer getUseTryLock()
{
if (_log.isTraceEnabled())
{
_log.trace("getUseTryLock()");
}
return _mcfProperties.getUseTryLock();
}
/**
* Set the useTryLock.
*
* @param useTryLock the useTryLock.
*/
public void setUseTryLock(final Integer useTryLock)
{
if (_log.isTraceEnabled())
{
_log.trace("setUseTryLock(" + useTryLock + ")");
}
_mcfProperties.setUseTryLock(useTryLock);
}
/**
* Get the connection metadata
*
* @return The metadata
*/
public ConnectionMetaData getMetaData()
{
if (_log.isTraceEnabled())
{
_log.trace("getMetadata()");
}
return new QpidRAConnectionMetaData();
}
/**
* Get the default connection factory
*
* @return The factory
*/
protected synchronized AMQConnectionFactory getDefaultAMQConnectionFactory() throws ResourceException
{
if (_connectionFactory == null)
{
try
{
_connectionFactory = _ra.createAMQConnectionFactory(_mcfProperties);
}
catch (final QpidRAException qpidrae)
{
throw new ResourceException("Unexpected exception creating the connection factory", qpidrae) ;
}
}
return _connectionFactory;
}
/**
* Get a clean connection factory
*
* @return The factory
*/
protected AMQConnectionFactory getCleanAMQConnectionFactory() throws ResourceException
{
try
{
return _ra.createAMQConnectionFactory(_mcfProperties);
}
catch (final QpidRAException qpidrae)
{
throw new ResourceException("Unexpected exception creating the connection factory", qpidrae) ;
}
}
/**
* Get the managed connection factory properties
*
* @return The properties
*/
protected QpidRAMCFProperties getProperties()
{
if (_log.isTraceEnabled())
{
_log.trace("getProperties()");
}
return _mcfProperties;
}
/**
* Get a connection request info instance
*
* @param info The instance that should be updated; may be <code>null</code>
* @return The instance
* @throws ResourceException
*/
private QpidRAConnectionRequestInfo getCRI(final QpidRAConnectionRequestInfo info)
throws ResourceException
{
if (_log.isTraceEnabled())
{
_log.trace("getCRI(" + info + ")");
}
if (info == null)
{
// Create a default one
return new QpidRAConnectionRequestInfo(_ra, _mcfProperties.getType());
}
else
{
// Fill the one with any defaults
info.setDefaults(_ra);
return info;
}
}
public Boolean getUseLocalTx()
{
if (_log.isTraceEnabled())
{
_log.trace("getUseLocalTx()");
}
return _mcfProperties.isUseLocalTx();
}
public void setUseLocalTx(final Boolean localTx)
{
if (_log.isTraceEnabled())
{
_log.trace("setUseLocalTx(" + localTx + ")");
}
_mcfProperties.setUseLocalTx(localTx);
}
}