summaryrefslogtreecommitdiff
path: root/qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRAManagedConnectionFactory.java
diff options
context:
space:
mode:
Diffstat (limited to 'qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRAManagedConnectionFactory.java')
-rw-r--r--qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRAManagedConnectionFactory.java623
1 files changed, 623 insertions, 0 deletions
diff --git a/qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRAManagedConnectionFactory.java b/qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRAManagedConnectionFactory.java
new file mode 100644
index 0000000000..377a0c6253
--- /dev/null
+++ b/qpid/java/jca/src/main/java/org/apache/qpid/ra/QpidRAManagedConnectionFactory.java
@@ -0,0 +1,623 @@
+/*
+ *
+ * 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.hashCode();
+
+ 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);
+ }
+}