http://git-wip-us.apache.org/repos/asf/activemq-6/blob/034adfbf/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRABundle.java ---------------------------------------------------------------------- diff --git a/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRABundle.java b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRABundle.java new file mode 100644 index 0000000..42953b2 --- /dev/null +++ b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRABundle.java @@ -0,0 +1,70 @@ +/* + * Copyright 2005-2014 Red Hat, Inc. + * Red Hat 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.activemq.ra; + + +import org.apache.activemq.api.core.ActiveMQIllegalStateException; +import org.jboss.logging.annotations.Cause; +import org.jboss.logging.annotations.Message; +import org.jboss.logging.annotations.MessageBundle; +import org.jboss.logging.Messages; + +import javax.jms.JMSException; +import javax.jms.JMSRuntimeException; +import javax.resource.NotSupportedException; + +/** + * @author <a href="mailto:andy.tay...@jboss.org">Andy Taylor</a> + * 3/12/12 + * + * Logger Code 15 + * + * each message id must be 6 digits long starting with 15, the 3rd digit should be 9 + * + * so 159000 to 159999 + */ +@MessageBundle(projectCode = "AMQ") +public interface ActiveMQRABundle +{ + /** Error message for strict behaviour */ + String ISE = "This method is not applicable inside the application server. See the JEE spec, e.g. JEE 7 Section 6.7"; + + ActiveMQRABundle BUNDLE = Messages.getBundle(ActiveMQRABundle.class); + + @Message(id = 159000, value = "Error decoding password using codec instance", format = Message.Format.MESSAGE_FORMAT) + ActiveMQIllegalStateException errorDecodingPassword(@Cause Exception e); + + @Message(id = 159001, value = "MDB cannot be deployed as it has no Activation Spec. Please provide an Activation!", format = Message.Format.MESSAGE_FORMAT) + NotSupportedException noActivationSpec(); + + @Message(id = 159002, value = "Please provide a destination for the MDB", format = Message.Format.MESSAGE_FORMAT) + IllegalArgumentException noDestinationName(); + + @Message(id = 159003, value = ISE, format = Message.Format.MESSAGE_FORMAT) + JMSRuntimeException illegalJEEMethod(); + + @Message(id = 159004, value = "Invalid Session Mode SESSION_TRANSACTED", format = Message.Format.MESSAGE_FORMAT) + JMSRuntimeException invalidSessionTransactedModeRuntime(); + + @Message(id = 159005, value = "Invalid Session Mode CLIENT_ACKNOWLEDGE", format = Message.Format.MESSAGE_FORMAT) + JMSRuntimeException invalidClientAcknowledgeModeRuntime(); + + @Message(id = 159006, value = "Invalid Session Mode {0}", format = Message.Format.MESSAGE_FORMAT) + JMSRuntimeException invalidAcknowledgeMode(int sessionMode); + + @Message(id = 159007, value = "Invalid Session Mode SESSION_TRANSACTED", format = Message.Format.MESSAGE_FORMAT) + JMSException invalidSessionTransactedMode(); + + @Message(id = 159008, value = "Invalid Session Mode CLIENT_ACKNOWLEDGE", format = Message.Format.MESSAGE_FORMAT) + JMSException invalidClientAcknowledgeMode(); +}
http://git-wip-us.apache.org/repos/asf/activemq-6/blob/034adfbf/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRABytesMessage.java ---------------------------------------------------------------------- diff --git a/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRABytesMessage.java b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRABytesMessage.java new file mode 100644 index 0000000..c4a24c7 --- /dev/null +++ b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRABytesMessage.java @@ -0,0 +1,455 @@ +/* + * Copyright 2005-2014 Red Hat, Inc. + * Red Hat 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.activemq.ra; + +import java.util.Arrays; + +import javax.jms.BytesMessage; +import javax.jms.JMSException; + + +/** + * A wrapper for a message + * + * @author <a href="mailto:adr...@jboss.com">Adrian Brock</a> + * @author <a href="mailto:jesper.peder...@jboss.org">Jesper Pedersen</a> + */ +public class ActiveMQRABytesMessage extends ActiveMQRAMessage implements BytesMessage +{ + /** Whether trace is enabled */ + private static boolean trace = ActiveMQRALogger.LOGGER.isTraceEnabled(); + + /** + * Create a new wrapper + * @param message the message + * @param session the session + */ + public ActiveMQRABytesMessage(final BytesMessage message, final ActiveMQRASession session) + { + super(message, session); + + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("constructor(" + message + ", " + session + ")"); + } + } + + /** + * Get body length + * @return The value + * @exception JMSException Thrown if an error occurs + */ + public long getBodyLength() throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("getBodyLength()"); + } + + return ((BytesMessage)message).getBodyLength(); + } + + /** + * Read + * @return The value + * @exception JMSException Thrown if an error occurs + */ + public boolean readBoolean() throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("readBoolean()"); + } + + return ((BytesMessage)message).readBoolean(); + } + + /** + * Read + * @return The value + * @exception JMSException Thrown if an error occurs + */ + public byte readByte() throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("readByte()"); + } + + return ((BytesMessage)message).readByte(); + } + + /** + * Read + * @param value The value + * @param length The length + * @return The result + * @exception JMSException Thrown if an error occurs + */ + public int readBytes(final byte[] value, final int length) throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("readBytes(" + Arrays.toString(value) + ", " + length + ")"); + } + + return ((BytesMessage)message).readBytes(value, length); + } + + /** + * Read + * @param value The value + * @return The result + * @exception JMSException Thrown if an error occurs + */ + public int readBytes(final byte[] value) throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("readBytes(" + Arrays.toString(value) + ")"); + } + + return ((BytesMessage)message).readBytes(value); + } + + /** + * Read + * @return The value + * @exception JMSException Thrown if an error occurs + */ + public char readChar() throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("readChar()"); + } + + return ((BytesMessage)message).readChar(); + } + + /** + * Read + * @return The value + * @exception JMSException Thrown if an error occurs + */ + public double readDouble() throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("readDouble()"); + } + + return ((BytesMessage)message).readDouble(); + } + + /** + * Read + * @return The value + * @exception JMSException Thrown if an error occurs + */ + public float readFloat() throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("readFloat()"); + } + + return ((BytesMessage)message).readFloat(); + } + + /** + * Read + * @return The value + * @exception JMSException Thrown if an error occurs + */ + public int readInt() throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("readInt()"); + } + + return ((BytesMessage)message).readInt(); + } + + /** + * Read + * @return The value + * @exception JMSException Thrown if an error occurs + */ + public long readLong() throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("readLong()"); + } + + return ((BytesMessage)message).readLong(); + } + + /** + * Read + * @return The value + * @exception JMSException Thrown if an error occurs + */ + public short readShort() throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("readShort()"); + } + + return ((BytesMessage)message).readShort(); + } + + /** + * Read + * @return The value + * @exception JMSException Thrown if an error occurs + */ + public int readUnsignedByte() throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("readUnsignedByte()"); + } + + return ((BytesMessage)message).readUnsignedByte(); + } + + /** + * Read + * @return The value + * @exception JMSException Thrown if an error occurs + */ + public int readUnsignedShort() throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("readUnsignedShort()"); + } + + return ((BytesMessage)message).readUnsignedShort(); + } + + /** + * Read + * @return The value + * @exception JMSException Thrown if an error occurs + */ + public String readUTF() throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("readUTF()"); + } + + return ((BytesMessage)message).readUTF(); + } + + /** + * Reset + * @exception JMSException Thrown if an error occurs + */ + public void reset() throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("reset()"); + } + + ((BytesMessage)message).reset(); + } + + /** + * Write + * @param value The value + * @exception JMSException Thrown if an error occurs + */ + public void writeBoolean(final boolean value) throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("writeBoolean(" + value + ")"); + } + + ((BytesMessage)message).writeBoolean(value); + } + + /** + * Write + * @param value The value + * @exception JMSException Thrown if an error occurs + */ + public void writeByte(final byte value) throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("writeByte(" + value + ")"); + } + + ((BytesMessage)message).writeByte(value); + } + + /** + * Write + * @param value The value + * @param offset The offset + * @param length The length + * @exception JMSException Thrown if an error occurs + */ + public void writeBytes(final byte[] value, final int offset, final int length) throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("writeBytes(" + Arrays.toString(value) + ", " + offset + ", " + length + ")"); + } + + ((BytesMessage)message).writeBytes(value, offset, length); + } + + /** + * Write + * @param value The value + * @exception JMSException Thrown if an error occurs + */ + public void writeBytes(final byte[] value) throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("writeBytes(" + Arrays.toString(value) + ")"); + } + + ((BytesMessage)message).writeBytes(value); + } + + /** + * Write + * @param value The value + * @exception JMSException Thrown if an error occurs + */ + public void writeChar(final char value) throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("writeChar(" + value + ")"); + } + + ((BytesMessage)message).writeChar(value); + } + + /** + * Write + * @param value The value + * @exception JMSException Thrown if an error occurs + */ + public void writeDouble(final double value) throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("writeDouble(" + value + ")"); + } + + ((BytesMessage)message).writeDouble(value); + } + + /** + * Write + * @param value The value + * @exception JMSException Thrown if an error occurs + */ + public void writeFloat(final float value) throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("writeFloat(" + value + ")"); + } + + ((BytesMessage)message).writeFloat(value); + } + + /** + * Write + * @param value The value + * @exception JMSException Thrown if an error occurs + */ + public void writeInt(final int value) throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("writeInt(" + value + ")"); + } + + ((BytesMessage)message).writeInt(value); + } + + /** + * Write + * @param value The value + * @exception JMSException Thrown if an error occurs + */ + public void writeLong(final long value) throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("writeLong(" + value + ")"); + } + + ((BytesMessage)message).writeLong(value); + } + + /** + * Write + * @param value The value + * @exception JMSException Thrown if an error occurs + */ + public void writeObject(final Object value) throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("writeObject(" + value + ")"); + } + + ((BytesMessage)message).writeObject(value); + } + + /** + * Write + * @param value The value + * @exception JMSException Thrown if an error occurs + */ + public void writeShort(final short value) throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("writeShort(" + value + ")"); + } + + ((BytesMessage)message).writeShort(value); + } + + /** + * Write + * @param value The value + * @exception JMSException Thrown if an error occurs + */ + public void writeUTF(final String value) throws JMSException + { + if (ActiveMQRABytesMessage.trace) + { + ActiveMQRALogger.LOGGER.trace("writeUTF(" + value + ")"); + } + + ((BytesMessage)message).writeUTF(value); + } +} http://git-wip-us.apache.org/repos/asf/activemq-6/blob/034adfbf/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAConnectionFactory.java ---------------------------------------------------------------------- diff --git a/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAConnectionFactory.java b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAConnectionFactory.java new file mode 100644 index 0000000..0c1869e --- /dev/null +++ b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAConnectionFactory.java @@ -0,0 +1,65 @@ +/* + * Copyright 2005-2014 Red Hat, Inc. + * Red Hat 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.activemq.ra; + +import javax.jms.XAQueueConnectionFactory; +import javax.jms.XATopicConnectionFactory; +import javax.resource.Referenceable; +import javax.resource.ResourceException; +import java.io.Serializable; + +import org.apache.activemq.jms.client.ActiveMQConnectionFactory; + +/** + * An aggregate interface for the JMS connection factories + * + * @author <a href="mailto:adr...@jboss.com">Adrian Brock</a> + * @author <a href="mailto:jesper.peder...@jboss.com">Jesper Pedersen</a> + */ +public interface ActiveMQRAConnectionFactory extends XAQueueConnectionFactory, + XATopicConnectionFactory, Serializable, Referenceable +{ + /** + * Connection factory capable of handling connections + */ + int CONNECTION = 0; + + /** + * Connection factory capable of handling queues + */ + int QUEUE_CONNECTION = 1; + + /** + * Connection factory capable of handling topics + */ + int TOPIC_CONNECTION = 2; + + /** + * Connection factory capable of handling XA connections + */ + int XA_CONNECTION = 3; + + /** + * Connection factory capable of handling XA queues + */ + int XA_QUEUE_CONNECTION = 4; + + /** + * Connection factory capable of handling XA topics + */ + int XA_TOPIC_CONNECTION = 5; + + ActiveMQConnectionFactory getDefaultFactory() throws ResourceException; + + ActiveMQResourceAdapter getResourceAdapter(); +} http://git-wip-us.apache.org/repos/asf/activemq-6/blob/034adfbf/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAConnectionFactoryImpl.java ---------------------------------------------------------------------- diff --git a/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAConnectionFactoryImpl.java b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAConnectionFactoryImpl.java new file mode 100644 index 0000000..b0d6d00 --- /dev/null +++ b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAConnectionFactoryImpl.java @@ -0,0 +1,570 @@ +/* + * Copyright 2005-2014 Red Hat, Inc. + * Red Hat 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.activemq.ra; + +import javax.jms.Connection; +import javax.jms.JMSContext; +import javax.jms.JMSException; +import javax.jms.JMSRuntimeException; +import javax.jms.JMSSecurityException; +import javax.jms.JMSSecurityRuntimeException; +import javax.jms.QueueConnection; +import javax.jms.Session; +import javax.jms.TopicConnection; +import javax.jms.XAConnection; +import javax.jms.XAJMSContext; +import javax.jms.XAQueueConnection; +import javax.jms.XATopicConnection; +import javax.naming.NamingException; +import javax.naming.Reference; +import javax.resource.ResourceException; +import javax.resource.spi.ConnectionManager; + +import org.apache.activemq.jms.client.ActiveMQConnectionFactory; +import org.apache.activemq.jms.referenceable.ConnectionFactoryObjectFactory; +import org.apache.activemq.jms.referenceable.SerializableObjectRefAddr; + +/** + * The connection factory + * + * @author <a href="mailto:adr...@jboss.com">Adrian Brock</a> + * @author <a href="mailto:jesper.peder...@jboss.org">Jesper Pedersen</a> + */ +public class ActiveMQRAConnectionFactoryImpl implements ActiveMQRAConnectionFactory +{ + /** + * Serial version UID + */ + static final long serialVersionUID = 7981708919479859360L; + private static boolean trace = ActiveMQRALogger.LOGGER.isTraceEnabled(); + + /** + * The managed connection factory + */ + private final ActiveMQRAManagedConnectionFactory mcf; + + /** + * The connection manager + */ + private ConnectionManager cm; + + /** + * Naming reference + */ + private Reference reference; + + /** + * Constructor + * + * @param mcf The managed connection factory + * @param cm The connection manager + */ + public ActiveMQRAConnectionFactoryImpl(final ActiveMQRAManagedConnectionFactory mcf, final ConnectionManager cm) + { + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("constructor(" + mcf + ", " + cm + ")"); + } + + this.mcf = mcf; + + if (cm == null) + { + // This is standalone usage, no appserver + this.cm = new ActiveMQRAConnectionManager(); + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("Created new ConnectionManager=" + this.cm); + } + } + else + { + this.cm = cm; + } + + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("Using ManagedConnectionFactory=" + mcf + ", ConnectionManager=" + cm); + } + } + + /** + * Set the reference + * + * @param reference The reference + */ + public void setReference(final Reference reference) + { + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("setReference(" + reference + ")"); + } + + this.reference = reference; + } + + /** + * Get the reference + * + * @return The reference + */ + public Reference getReference() + { + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("getReference()"); + } + if (reference == null) + { + try + { + reference = new Reference(this.getClass().getCanonicalName(), + new SerializableObjectRefAddr("ActiveMQ-CF", this), + ConnectionFactoryObjectFactory.class.getCanonicalName(), + null); + } + catch (NamingException e) + { + ActiveMQRALogger.LOGGER.errorCreatingReference(e); + } + } + + return reference; + + } + + /** + * Create a queue connection + * + * @return The connection + * @throws JMSException Thrown if the operation fails + */ + public QueueConnection createQueueConnection() throws JMSException + { + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("createQueueConnection()"); + } + + ActiveMQRASessionFactoryImpl s = new ActiveMQRASessionFactoryImpl(mcf, + cm, + getResourceAdapter().getTM(), + ActiveMQRAConnectionFactory.QUEUE_CONNECTION); + + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("Created queue connection: " + s); + } + + return s; + } + + /** + * Create a queue connection + * + * @param userName The user name + * @param password The password + * @return The connection + * @throws JMSException Thrown if the operation fails + */ + public QueueConnection createQueueConnection(final String userName, final String password) throws JMSException + { + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("createQueueConnection(" + userName + ", ****)"); + } + + ActiveMQRASessionFactoryImpl s = new ActiveMQRASessionFactoryImpl(mcf, + cm, + getResourceAdapter().getTM(), + ActiveMQRAConnectionFactory.QUEUE_CONNECTION); + s.setUserName(userName); + s.setPassword(password); + + validateUser(s); + + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("Created queue connection: " + s); + } + + return s; + } + + /** + * Create a topic connection + * + * @return The connection + * @throws JMSException Thrown if the operation fails + */ + public TopicConnection createTopicConnection() throws JMSException + { + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("createTopicConnection()"); + } + + ActiveMQRASessionFactoryImpl s = new ActiveMQRASessionFactoryImpl(mcf, + cm, + getResourceAdapter().getTM(), + ActiveMQRAConnectionFactory.TOPIC_CONNECTION); + + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("Created topic connection: " + s); + } + + return s; + } + + /** + * Create a topic connection + * + * @param userName The user name + * @param password The password + * @return The connection + * @throws JMSException Thrown if the operation fails + */ + public TopicConnection createTopicConnection(final String userName, final String password) throws JMSException + { + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("createTopicConnection(" + userName + ", ****)"); + } + + ActiveMQRASessionFactoryImpl s = new ActiveMQRASessionFactoryImpl(mcf, + cm, + getResourceAdapter().getTM(), + ActiveMQRAConnectionFactory.TOPIC_CONNECTION); + s.setUserName(userName); + s.setPassword(password); + validateUser(s); + + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("Created topic connection: " + s); + } + + return s; + } + + /** + * Create a connection + * + * @return The connection + * @throws JMSException Thrown if the operation fails + */ + public Connection createConnection() throws JMSException + { + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("createConnection()"); + } + + ActiveMQRASessionFactoryImpl s = new ActiveMQRASessionFactoryImpl(mcf, cm, getResourceAdapter().getTM(), ActiveMQRAConnectionFactory.CONNECTION); + + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("Created connection: " + s); + } + + return s; + } + + /** + * Create a connection + * + * @param userName The user name + * @param password The password + * @return The connection + * @throws JMSException Thrown if the operation fails + */ + public Connection createConnection(final String userName, final String password) throws JMSException + { + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("createConnection(" + userName + ", ****)"); + } + + ActiveMQRASessionFactoryImpl s = new ActiveMQRASessionFactoryImpl(mcf, cm, getResourceAdapter().getTM(), ActiveMQRAConnectionFactory.CONNECTION); + s.setUserName(userName); + s.setPassword(password); + + validateUser(s); + + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("Created connection: " + s); + } + + return s; + } + + /** + * Create a XA queue connection + * + * @return The connection + * @throws JMSException Thrown if the operation fails + */ + public XAQueueConnection createXAQueueConnection() throws JMSException + { + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("createXAQueueConnection()"); + } + + ActiveMQRASessionFactoryImpl s = new ActiveMQRASessionFactoryImpl(mcf, + cm, + getResourceAdapter().getTM(), + ActiveMQRAConnectionFactory.XA_QUEUE_CONNECTION); + + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("Created queue connection: " + s); + } + + return s; + } + + /** + * Create a XA queue connection + * + * @param userName The user name + * @param password The password + * @return The connection + * @throws JMSException Thrown if the operation fails + */ + public XAQueueConnection createXAQueueConnection(final String userName, final String password) throws JMSException + { + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("createXAQueueConnection(" + userName + ", ****)"); + } + + ActiveMQRASessionFactoryImpl s = new ActiveMQRASessionFactoryImpl(mcf, + cm, + getResourceAdapter().getTM(), + ActiveMQRAConnectionFactory.XA_QUEUE_CONNECTION); + s.setUserName(userName); + s.setPassword(password); + validateUser(s); + + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("Created queue connection: " + s); + } + + return s; + } + + /** + * Create a XA topic connection + * + * @return The connection + * @throws JMSException Thrown if the operation fails + */ + public XATopicConnection createXATopicConnection() throws JMSException + { + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("createXATopicConnection()"); + } + + ActiveMQRASessionFactoryImpl s = new ActiveMQRASessionFactoryImpl(mcf, + cm, + getResourceAdapter().getTM(), + ActiveMQRAConnectionFactory.XA_TOPIC_CONNECTION); + + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("Created topic connection: " + s); + } + + return s; + } + + /** + * Create a XA topic connection + * + * @param userName The user name + * @param password The password + * @return The connection + * @throws JMSException Thrown if the operation fails + */ + public XATopicConnection createXATopicConnection(final String userName, final String password) throws JMSException + { + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("createXATopicConnection(" + userName + ", ****)"); + } + + ActiveMQRASessionFactoryImpl s = new ActiveMQRASessionFactoryImpl(mcf, + cm, + getResourceAdapter().getTM(), + ActiveMQRAConnectionFactory.XA_TOPIC_CONNECTION); + s.setUserName(userName); + s.setPassword(password); + validateUser(s); + + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("Created topic connection: " + s); + } + + return s; + } + + /** + * Create a XA connection + * + * @return The connection + * @throws JMSException Thrown if the operation fails + */ + public XAConnection createXAConnection() throws JMSException + { + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("createXAConnection()"); + } + + ActiveMQRASessionFactoryImpl s = new ActiveMQRASessionFactoryImpl(mcf, cm, getResourceAdapter().getTM(), ActiveMQRAConnectionFactory.XA_CONNECTION); + + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("Created connection: " + s); + } + + return s; + } + + /** + * Create a XA connection + * + * @param userName The user name + * @param password The password + * @return The connection + * @throws JMSException Thrown if the operation fails + */ + public XAConnection createXAConnection(final String userName, final String password) throws JMSException + { + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("createXAConnection(" + userName + ", ****)"); + } + + ActiveMQRASessionFactoryImpl s = new ActiveMQRASessionFactoryImpl(mcf, cm, getResourceAdapter().getTM(), ActiveMQRAConnectionFactory.XA_CONNECTION); + s.setUserName(userName); + s.setPassword(password); + validateUser(s); + + if (ActiveMQRAConnectionFactoryImpl.trace) + { + ActiveMQRALogger.LOGGER.trace("Created connection: " + s); + } + + return s; + } + + @Override + public JMSContext createContext() + { + return createContext(null, null); + } + + @Override + public JMSContext createContext(String userName, String password) + { + return createContext(userName, password, Session.AUTO_ACKNOWLEDGE); + } + + @Override + public JMSContext createContext(String userName, String password, int sessionMode) + { + @SuppressWarnings("resource") + ActiveMQRASessionFactoryImpl conn = new ActiveMQRASessionFactoryImpl(mcf, cm, getResourceAdapter().getTM(), ActiveMQRAConnectionFactory.CONNECTION); + conn.setUserName(userName); + conn.setPassword(password); + try + { + validateUser(conn); + } + catch (JMSSecurityException e) + { + JMSSecurityRuntimeException e2 = new JMSSecurityRuntimeException(e.getMessage()); + e2.initCause(e); + throw e2; + } + catch (JMSException e) + { + JMSRuntimeException e2 = new JMSRuntimeException(e.getMessage()); + e2.initCause(e); + throw e2; + } + return conn.createContext(sessionMode); + } + + @Override + public JMSContext createContext(int sessionMode) + { + return createContext(null, null, sessionMode); + } + + @Override + public XAJMSContext createXAContext() + { + return createXAContext(null, null); + } + + @Override + public XAJMSContext createXAContext(String userName, String password) + { + ActiveMQRASessionFactoryImpl conn = new ActiveMQRASessionFactoryImpl(mcf, cm, getResourceAdapter().getTM(), ActiveMQRAConnectionFactory.XA_CONNECTION); + conn.setUserName(userName); + conn.setPassword(password); + try + { + validateUser(conn); + } + catch (JMSSecurityException e) + { + JMSSecurityRuntimeException e2 = new JMSSecurityRuntimeException(e.getMessage()); + e2.initCause(e); + throw e2; + } + catch (JMSException e) + { + JMSRuntimeException e2 = new JMSRuntimeException(e.getMessage()); + e2.initCause(e); + throw e2; + } + return conn.createXAContext(); + } + + private void validateUser(ActiveMQRASessionFactoryImpl s) throws JMSException + { + Session session = s.createSession(); + session.close(); + } + + @Override + public ActiveMQConnectionFactory getDefaultFactory() throws ResourceException + { + return ((ActiveMQResourceAdapter) mcf.getResourceAdapter()).getDefaultActiveMQConnectionFactory(); + } + + @Override + public ActiveMQResourceAdapter getResourceAdapter() + { + return (ActiveMQResourceAdapter) mcf.getResourceAdapter(); + } +} http://git-wip-us.apache.org/repos/asf/activemq-6/blob/034adfbf/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAConnectionManager.java ---------------------------------------------------------------------- diff --git a/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAConnectionManager.java b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAConnectionManager.java new file mode 100644 index 0000000..d41d9c7 --- /dev/null +++ b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAConnectionManager.java @@ -0,0 +1,90 @@ +/* + * Copyright 2005-2014 Red Hat, Inc. + * Red Hat 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.activemq.ra; + +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 org.apache.activemq.utils.ConcurrentHashSet; + + +/** + * The connection manager used in non-managed environments. + * + * @author <a href="mailto:adr...@jboss.com">Adrian Brock</a> + * @author <a href="mailto:jesper.peder...@jboss.org">Jesper Pedersen</a> + */ +public class ActiveMQRAConnectionManager implements ConnectionManager +{ + /** Serial version UID */ + static final long serialVersionUID = 4409118162975011014L; + /** Trace enabled */ + private static boolean trace = ActiveMQRALogger.LOGGER.isTraceEnabled(); + + /** + * Constructor + */ + public ActiveMQRAConnectionManager() + { + if (ActiveMQRAConnectionManager.trace) + { + ActiveMQRALogger.LOGGER.trace("constructor()"); + } + } + + ConcurrentHashSet<ManagedConnection> connections = new ConcurrentHashSet<>(); + + /** + * Allocates a connection + * @param mcf The managed connection factory + * @param cxRequestInfo The connection request information + * @return The connection + * @exception ResourceException Thrown if there is a problem obtaining the connection + */ + public Object allocateConnection(final ManagedConnectionFactory mcf, final ConnectionRequestInfo cxRequestInfo) throws ResourceException + { + if (ActiveMQRAConnectionManager.trace) + { + ActiveMQRALogger.LOGGER.trace("allocateConnection(" + mcf + ", " + cxRequestInfo + ")"); + } + + ManagedConnection mc = mcf.createManagedConnection(null, cxRequestInfo); + Object c = mc.getConnection(null, cxRequestInfo); + + if (ActiveMQRAConnectionManager.trace) + { + ActiveMQRALogger.LOGGER.trace("Allocated connection: " + c + ", with managed connection: " + mc); + } + + connections.add(mc); + return c; + } + + public void stop() + { + for (ManagedConnection conn : connections) + { + try + { + conn.destroy(); + } + catch (Throwable e) + { + + } + } + } +} http://git-wip-us.apache.org/repos/asf/activemq-6/blob/034adfbf/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAConnectionMetaData.java ---------------------------------------------------------------------- diff --git a/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAConnectionMetaData.java b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAConnectionMetaData.java new file mode 100644 index 0000000..a2dbe98 --- /dev/null +++ b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAConnectionMetaData.java @@ -0,0 +1,153 @@ +/* + * Copyright 2005-2014 Red Hat, Inc. + * Red Hat 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.activemq.ra; + +import java.util.Enumeration; +import java.util.Vector; + +import javax.jms.ConnectionMetaData; + + +/** + * This class implements javax.jms.ConnectionMetaData + * + * @author <a href="mailto:adr...@jboss.org">Adrian Brock</a> + * @author <a href="mailto:jesper.peder...@jboss.org">Jesper Pedersen</a> + */ +public class ActiveMQRAConnectionMetaData implements ConnectionMetaData +{ + /** Trace enabled */ + private static boolean trace = ActiveMQRALogger.LOGGER.isTraceEnabled(); + + /** + * Constructor + */ + public ActiveMQRAConnectionMetaData() + { + if (ActiveMQRAConnectionMetaData.trace) + { + ActiveMQRALogger.LOGGER.trace("constructor()"); + } + } + + /** + * Get the JMS version + * @return The version + */ + public String getJMSVersion() + { + if (ActiveMQRAConnectionMetaData.trace) + { + ActiveMQRALogger.LOGGER.trace("getJMSVersion()"); + } + + return "2.0"; + } + + /** + * Get the JMS major version + * @return The major version + */ + public int getJMSMajorVersion() + { + if (ActiveMQRAConnectionMetaData.trace) + { + ActiveMQRALogger.LOGGER.trace("getJMSMajorVersion()"); + } + + return 2; + } + + /** + * Get the JMS minor version + * @return The minor version + */ + public int getJMSMinorVersion() + { + if (ActiveMQRAConnectionMetaData.trace) + { + ActiveMQRALogger.LOGGER.trace("getJMSMinorVersion()"); + } + + return 0; + } + + /** + * Get the JMS provider name + * @return The name + */ + public String getJMSProviderName() + { + if (ActiveMQRAConnectionMetaData.trace) + { + ActiveMQRALogger.LOGGER.trace("getJMSProviderName()"); + } + + return "ActiveMQ"; + } + + /** + * Get the provider version + * @return The version + */ + public String getProviderVersion() + { + if (ActiveMQRAConnectionMetaData.trace) + { + ActiveMQRALogger.LOGGER.trace("getJMSProviderName()"); + } + + return "2.4"; + } + + /** + * Get the provider major version + * @return The version + */ + public int getProviderMajorVersion() + { + if (ActiveMQRAConnectionMetaData.trace) + { + ActiveMQRALogger.LOGGER.trace("getProviderMajorVersion()"); + } + + return 2; + } + + /** + * Get the provider minor version + * @return The version + */ + public int getProviderMinorVersion() + { + if (ActiveMQRAConnectionMetaData.trace) + { + ActiveMQRALogger.LOGGER.trace("getProviderMinorVersion()"); + } + + return 4; + } + + /** + * Get the JMS XPropertyNames + * @return The names + */ + public Enumeration<Object> getJMSXPropertyNames() + { + Vector<Object> v = new Vector<Object>(); + v.add("JMSXGroupID"); + v.add("JMSXGroupSeq"); + v.add("JMSXDeliveryCount"); + return v.elements(); + } +} http://git-wip-us.apache.org/repos/asf/activemq-6/blob/034adfbf/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAConnectionRequestInfo.java ---------------------------------------------------------------------- diff --git a/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAConnectionRequestInfo.java b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAConnectionRequestInfo.java new file mode 100644 index 0000000..9a37a5d --- /dev/null +++ b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAConnectionRequestInfo.java @@ -0,0 +1,306 @@ +/* + * Copyright 2005-2014 Red Hat, Inc. + * Red Hat 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.activemq.ra; + +import javax.jms.Session; +import javax.resource.spi.ConnectionRequestInfo; + + +/** + * Connection request information + * + * @author <a href="mailto:adr...@jboss.com">Adrian Brock</a> + * @author <a href="mailto:jesper.peder...@jboss.org">Jesper Pedersen</a> + * @author <a href="mailto:andy.tay...@jboss.org">Andy Taylor</a> + */ +public class ActiveMQRAConnectionRequestInfo implements ConnectionRequestInfo +{ + /** Trace enabled */ + private static boolean trace = ActiveMQRALogger.LOGGER.isTraceEnabled(); + + /** The user name */ + private String userName; + + /** The password */ + private String password; + + /** The client id */ + private String clientID; + + /** The type */ + private final int type; + + /** Use transactions */ + private final boolean transacted; + + /** The acknowledge mode */ + private final int acknowledgeMode; + + /** + * Constructor + * @param prop The resource adapter properties + * @param type The connection type + */ + public ActiveMQRAConnectionRequestInfo(final ActiveMQRAProperties prop, final int type) + { + if (ActiveMQRAConnectionRequestInfo.trace) + { + ActiveMQRALogger.LOGGER.trace("constructor(" + prop + ")"); + } + + userName = prop.getUserName(); + password = prop.getPassword(); + clientID = prop.getClientID(); + this.type = type; + transacted = true; + acknowledgeMode = Session.AUTO_ACKNOWLEDGE; + } + + /** + * Constructor + * @param transacted Use transactions + * @param acknowledgeMode The acknowledge mode + * @param type The connection type + */ + public ActiveMQRAConnectionRequestInfo(final boolean transacted, final int acknowledgeMode, final int type) + { + if (ActiveMQRAConnectionRequestInfo.trace) + { + ActiveMQRALogger.LOGGER.trace("constructor(" + transacted + + ", " + + acknowledgeMode + + ", " + + type + + ")"); + } + + this.transacted = transacted; + this.acknowledgeMode = acknowledgeMode; + this.type = type; + } + + /** + * Fill in default values if they are missing + * @param prop The resource adapter properties + */ + public void setDefaults(final ActiveMQRAProperties prop) + { + if (ActiveMQRAConnectionRequestInfo.trace) + { + ActiveMQRALogger.LOGGER.trace("setDefaults(" + prop + ")"); + } + + if (userName == null) + { + userName = prop.getUserName(); + } + if (password == null) + { + password = prop.getPassword(); + } + if (clientID == null) + { + clientID = prop.getClientID(); + } + } + + /** + * Get the user name + * @return The value + */ + public String getUserName() + { + if (ActiveMQRAConnectionRequestInfo.trace) + { + ActiveMQRALogger.LOGGER.trace("getUserName()"); + } + + return userName; + } + + /** + * Set the user name + * @param userName The value + */ + public void setUserName(final String userName) + { + if (ActiveMQRAConnectionRequestInfo.trace) + { + ActiveMQRALogger.LOGGER.trace("setUserName(" + userName + ")"); + } + + this.userName = userName; + } + + /** + * Get the password + * @return The value + */ + public String getPassword() + { + if (ActiveMQRAConnectionRequestInfo.trace) + { + ActiveMQRALogger.LOGGER.trace("getPassword()"); + } + + return password; + } + + /** + * Set the password + * @param password The value + */ + public void setPassword(final String password) + { + if (ActiveMQRAConnectionRequestInfo.trace) + { + ActiveMQRALogger.LOGGER.trace("setPassword(****)"); + } + + this.password = password; + } + + /** + * Get the client id + * @return The value + */ + public String getClientID() + { + if (ActiveMQRAConnectionRequestInfo.trace) + { + ActiveMQRALogger.LOGGER.trace("getClientID()"); + } + + return clientID; + } + + /** + * Set the client id + * @param clientID The value + */ + public void setClientID(final String clientID) + { + if (ActiveMQRAConnectionRequestInfo.trace) + { + ActiveMQRALogger.LOGGER.trace("setClientID(" + clientID + ")"); + } + + this.clientID = clientID; + } + + /** + * Get the connection type + * @return The type + */ + public int getType() + { + if (ActiveMQRAConnectionRequestInfo.trace) + { + ActiveMQRALogger.LOGGER.trace("getType()"); + } + + return type; + } + + /** + * Use transactions + * @return True if transacted; otherwise false + */ + public boolean isTransacted() + { + if (ActiveMQRAConnectionRequestInfo.trace) + { + ActiveMQRALogger.LOGGER.trace("isTransacted() " + transacted); + } + + return transacted; + } + + /** + * Get the acknowledge mode + * @return The mode + */ + public int getAcknowledgeMode() + { + if (ActiveMQRAConnectionRequestInfo.trace) + { + ActiveMQRALogger.LOGGER.trace("getAcknowledgeMode()"); + } + + return acknowledgeMode; + } + + /** + * 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 (ActiveMQRAConnectionRequestInfo.trace) + { + ActiveMQRALogger.LOGGER.trace("equals(" + obj + ")"); + } + + if (obj == null) + { + return false; + } + + if (obj instanceof ActiveMQRAConnectionRequestInfo) + { + ActiveMQRAConnectionRequestInfo you = (ActiveMQRAConnectionRequestInfo)obj; + return ActiveMQRaUtils.compare(userName, you.getUserName()) && ActiveMQRaUtils.compare(password, you.getPassword()) && + ActiveMQRaUtils.compare(clientID, you.getClientID()) && + type == you.getType() && + transacted == you.isTransacted() && + acknowledgeMode == you.getAcknowledgeMode(); + } + else + { + return false; + } + } + + /** + * Return the hash code for the object + * @return The hash code + */ + @Override + public int hashCode() + { + if (ActiveMQRAConnectionRequestInfo.trace) + { + ActiveMQRALogger.LOGGER.trace("hashCode()"); + } + + int hash = 7; + + hash += 31 * hash + (userName != null ? userName.hashCode() : 0); + hash += 31 * hash + (password != null ? password.hashCode() : 0); + hash += 31 * hash + Integer.valueOf(type).hashCode(); + hash += 31 * hash + (transacted ? 1 : 0); + hash += 31 * hash + Integer.valueOf(acknowledgeMode).hashCode(); + + return hash; + } + + @Override + public String toString() + { + return "ActiveMQRAConnectionRequestInfo[type=" + type + + ", transacted=" + transacted + ", acknowledgeMode=" + acknowledgeMode + + ", clientID=" + clientID + ", userName=" + userName + ", password=****]"; + } +} http://git-wip-us.apache.org/repos/asf/activemq-6/blob/034adfbf/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRACredential.java ---------------------------------------------------------------------- diff --git a/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRACredential.java b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRACredential.java new file mode 100644 index 0000000..69fee4b --- /dev/null +++ b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRACredential.java @@ -0,0 +1,241 @@ +/* + * Copyright 2005-2014 Red Hat, Inc. + * Red Hat 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.activemq.ra; + +import java.io.Serializable; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.util.Set; + +import javax.resource.spi.ConnectionRequestInfo; +import javax.resource.spi.ManagedConnectionFactory; +import javax.resource.spi.SecurityException; +import javax.resource.spi.security.PasswordCredential; +import javax.security.auth.Subject; + + +/** + * Credential information + * + * @author <a href="mailto:adr...@jboss.com">Adrian Brock</a> + * @author <a href="mailto:jesper.peder...@jboss.org">Jesper Pedersen</a> + * @version $Revision: 71554 $ + */ +public class ActiveMQRACredential implements Serializable +{ + /** Serial version UID */ + static final long serialVersionUID = 210476602237497193L; + + private static boolean trace = ActiveMQRALogger.LOGGER.isTraceEnabled(); + + /** The user name */ + private String userName; + + /** The password */ + private String password; + + /** + * Private constructor + */ + private ActiveMQRACredential() + { + if (ActiveMQRACredential.trace) + { + ActiveMQRALogger.LOGGER.trace("constructor()"); + } + } + + /** + * Get the user name + * @return The value + */ + public String getUserName() + { + if (ActiveMQRACredential.trace) + { + ActiveMQRALogger.LOGGER.trace("getUserName()"); + } + + return userName; + } + + /** + * Set the user name + * @param userName The value + */ + private void setUserName(final String userName) + { + if (ActiveMQRACredential.trace) + { + ActiveMQRALogger.LOGGER.trace("setUserName(" + userName + ")"); + } + + this.userName = userName; + } + + /** + * Get the password + * @return The value + */ + public String getPassword() + { + if (ActiveMQRACredential.trace) + { + ActiveMQRALogger.LOGGER.trace("getPassword()"); + } + + return password; + } + + /** + * Set the password + * @param password The value + */ + private void setPassword(final String password) + { + if (ActiveMQRACredential.trace) + { + ActiveMQRALogger.LOGGER.trace("setPassword(****)"); + } + + this.password = password; + } + + /** + * Get credentials + * @param mcf The managed connection factory + * @param subject The subject + * @param info The connection request info + * @return The credentials + * @exception SecurityException Thrown if the credentials can't be retrieved + */ + public static ActiveMQRACredential getCredential(final ManagedConnectionFactory mcf, + final Subject subject, + final ConnectionRequestInfo info) throws SecurityException + { + if (ActiveMQRACredential.trace) + { + ActiveMQRALogger.LOGGER.trace("getCredential(" + mcf + ", " + subject + ", " + info + ")"); + } + + ActiveMQRACredential jc = new ActiveMQRACredential(); + if (subject == null && info != null) + { + jc.setUserName(((ActiveMQRAConnectionRequestInfo)info).getUserName()); + jc.setPassword(((ActiveMQRAConnectionRequestInfo)info).getPassword()); + } + else if (subject != null) + { + PasswordCredential pwdc = GetCredentialAction.getCredential(subject, mcf); + + if (pwdc == null) + { + throw new SecurityException("No password credentials found"); + } + + jc.setUserName(pwdc.getUserName()); + jc.setPassword(new String(pwdc.getPassword())); + } + else + { + throw new SecurityException("No Subject or ConnectionRequestInfo set, could not get credentials"); + } + + return jc; + } + + /** + * String representation + * @return The representation + */ + @Override + public String toString() + { + if (ActiveMQRACredential.trace) + { + ActiveMQRALogger.LOGGER.trace("toString()"); + } + + return super.toString() + "{ username=" + userName + ", password=**** }"; + } + + /** + * Privileged class to get credentials + */ + private static class GetCredentialAction implements PrivilegedAction<PasswordCredential> + { + /** The subject */ + private final Subject subject; + + /** The managed connection factory */ + private final ManagedConnectionFactory mcf; + + /** + * Constructor + * @param subject The subject + * @param mcf The managed connection factory + */ + GetCredentialAction(final Subject subject, final ManagedConnectionFactory mcf) + { + if (ActiveMQRACredential.trace) + { + ActiveMQRALogger.LOGGER.trace("constructor(" + subject + ", " + mcf + ")"); + } + + this.subject = subject; + this.mcf = mcf; + } + + /** + * Run + * @return The credential + */ + public PasswordCredential run() + { + if (ActiveMQRACredential.trace) + { + ActiveMQRALogger.LOGGER.trace("run()"); + } + + Set<PasswordCredential> creds = subject.getPrivateCredentials(PasswordCredential.class); + PasswordCredential pwdc = null; + + for (PasswordCredential curCred : creds) + { + if (curCred.getManagedConnectionFactory().equals(mcf)) + { + pwdc = curCred; + break; + } + } + return pwdc; + } + + /** + * Get credentials + * @param subject The subject + * @param mcf The managed connection factory + * @return The credential + */ + static PasswordCredential getCredential(final Subject subject, final ManagedConnectionFactory mcf) + { + if (ActiveMQRACredential.trace) + { + ActiveMQRALogger.LOGGER.trace("getCredential(" + subject + ", " + mcf + ")"); + } + + GetCredentialAction action = new GetCredentialAction(subject, mcf); + return AccessController.doPrivileged(action); + } + } +} http://git-wip-us.apache.org/repos/asf/activemq-6/blob/034adfbf/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAJMSContext.java ---------------------------------------------------------------------- diff --git a/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAJMSContext.java b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAJMSContext.java new file mode 100644 index 0000000..b02e623 --- /dev/null +++ b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAJMSContext.java @@ -0,0 +1,57 @@ +/* + * Copyright 2005-2014 Red Hat, Inc. + * Red Hat 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.activemq.ra; + +import org.apache.activemq.jms.client.ActiveMQConnectionForContext; +import org.apache.activemq.jms.client.ActiveMQJMSContext; +import org.apache.activemq.jms.client.ThreadAwareContext; + +import javax.jms.ExceptionListener; +import javax.jms.JMSContext; + +public class ActiveMQRAJMSContext extends ActiveMQJMSContext +{ + public ActiveMQRAJMSContext(ActiveMQConnectionForContext connection, int ackMode, ThreadAwareContext threadAwareContext) + { + super(connection, ackMode, threadAwareContext); + } + + public ActiveMQRAJMSContext(ActiveMQConnectionForContext connection, ThreadAwareContext threadAwareContext) + { + super(connection, threadAwareContext); + } + + @Override + public JMSContext createContext(int sessionMode) + { + throw ActiveMQRABundle.BUNDLE.illegalJEEMethod(); + } + + @Override + public void stop() + { + throw ActiveMQRABundle.BUNDLE.illegalJEEMethod(); + } + + @Override + public void setClientID(String clientID) + { + throw ActiveMQRABundle.BUNDLE.illegalJEEMethod(); + } + + @Override + public void setExceptionListener(ExceptionListener listener) + { + throw ActiveMQRABundle.BUNDLE.illegalJEEMethod(); + } +} http://git-wip-us.apache.org/repos/asf/activemq-6/blob/034adfbf/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRALocalTransaction.java ---------------------------------------------------------------------- diff --git a/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRALocalTransaction.java b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRALocalTransaction.java new file mode 100644 index 0000000..8de68ee --- /dev/null +++ b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRALocalTransaction.java @@ -0,0 +1,121 @@ +/* + * Copyright 2005-2014 Red Hat, Inc. + * Red Hat 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.activemq.ra; + +import javax.jms.JMSException; +import javax.resource.ResourceException; +import javax.resource.spi.LocalTransaction; + + +/** + * JMS Local transaction + * + * @author <a href="mailto:adr...@jboss.com">Adrian Brock</a> + * @author <a href="mailto:jesper.peder...@jboss.org">Jesper Pedersen</a> + */ +public class ActiveMQRALocalTransaction implements LocalTransaction +{ + /** Trace enabled */ + private static boolean trace = ActiveMQRALogger.LOGGER.isTraceEnabled(); + + /** The managed connection */ + private final ActiveMQRAManagedConnection mc; + + /** + * Constructor + * @param mc The managed connection + */ + public ActiveMQRALocalTransaction(final ActiveMQRAManagedConnection mc) + { + if (ActiveMQRALocalTransaction.trace) + { + ActiveMQRALogger.LOGGER.trace("constructor(" + mc + ")"); + } + + this.mc = mc; + } + + /** + * Begin + * @exception ResourceException Thrown if the operation fails + */ + public void begin() throws ResourceException + { + if (ActiveMQRALocalTransaction.trace) + { + ActiveMQRALogger.LOGGER.trace("begin()"); + } + + // mc.setInManagedTx(true); + } + + /** + * Commit + * @exception ResourceException Thrown if the operation fails + */ + public void commit() throws ResourceException + { + if (ActiveMQRALocalTransaction.trace) + { + ActiveMQRALogger.LOGGER.trace("commit()"); + } + + mc.lock(); + try + { + if (mc.getSession().getTransacted()) + { + mc.getSession().commit(); + } + } + catch (JMSException e) + { + throw new ResourceException("Could not commit LocalTransaction", e); + } + finally + { + //mc.setInManagedTx(false); + mc.unlock(); + } + } + + /** + * Rollback + * @exception ResourceException Thrown if the operation fails + */ + public void rollback() throws ResourceException + { + if (ActiveMQRALocalTransaction.trace) + { + ActiveMQRALogger.LOGGER.trace("rollback()"); + } + + mc.lock(); + try + { + if (mc.getSession().getTransacted()) + { + mc.getSession().rollback(); + } + } + catch (JMSException ex) + { + throw new ResourceException("Could not rollback LocalTransaction", ex); + } + finally + { + //mc.setInManagedTx(false); + mc.unlock(); + } + } +} http://git-wip-us.apache.org/repos/asf/activemq-6/blob/034adfbf/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRALogger.java ---------------------------------------------------------------------- diff --git a/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRALogger.java b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRALogger.java new file mode 100644 index 0000000..8c0cf18 --- /dev/null +++ b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRALogger.java @@ -0,0 +1,122 @@ +/* + * Copyright 2005-2014 Red Hat, Inc. + * Red Hat 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.activemq.ra; + +import org.apache.activemq.ra.inflow.ActiveMQActivationSpec; +import org.jboss.logging.BasicLogger; +import org.jboss.logging.Logger; +import org.jboss.logging.annotations.Cause; +import org.jboss.logging.annotations.LogMessage; +import org.jboss.logging.annotations.Message; +import org.jboss.logging.annotations.MessageLogger; + +/** + * Logger Code 15 + * <p/> + * each message id must be 6 digits long starting with 15, the 3rd digit donates + * the level so + * <p/> + * <pre> + * INF0 1 + * WARN 2 + * DEBUG 3 + * ERROR 4 + * TRACE 5 + * FATAL 6 + * </pre> + * <p/> + * so an INFO message would be 151000 to 151999 + * + * @author <a href="mailto:andy.tay...@jboss.org">Andy Taylor</a> 3/15/12 + */ +@MessageLogger(projectCode = "AMQ") +public interface ActiveMQRALogger extends BasicLogger +{ + /** + * The default logger. + */ + ActiveMQRALogger LOGGER = Logger.getMessageLogger(ActiveMQRALogger.class, ActiveMQRALogger.class.getPackage().getName()); + + @LogMessage(level = Logger.Level.INFO) + @Message(id = 151000, value = "awaiting topic/queue creation {0}", format = Message.Format.MESSAGE_FORMAT) + void awaitingTopicQueueCreation(String destination); + + @LogMessage(level = Logger.Level.INFO) + @Message(id = 151001, value = "Attempting to reconnect {0}", format = Message.Format.MESSAGE_FORMAT) + void attemptingReconnect(ActiveMQActivationSpec spec); + + @LogMessage(level = Logger.Level.INFO) + @Message(id = 151002, value = "Reconnected with ActiveMQ", format = Message.Format.MESSAGE_FORMAT) + void reconnected(); + + @LogMessage(level = Logger.Level.INFO) + @Message(id = 151003, value = "ActiveMQ resource adaptor stopped", format = Message.Format.MESSAGE_FORMAT) + void raStopped(); + + @LogMessage(level = Logger.Level.INFO) + @Message(id = 151004, value = "Instantiating {0} \"{1}\" directly since UseJNDI=false.", format = Message.Format.MESSAGE_FORMAT) + void instantiatingDestination(String destinationType, String destination); + + @LogMessage(level = Logger.Level.INFO) + @Message(id = 151005, value = "awaiting ActiveMQ Server availability", format = Message.Format.MESSAGE_FORMAT) + void awaitingJMSServerCreation(); + + @LogMessage(level = Logger.Level.WARN) + @Message(id = 152000, value = "It wasn''t possible to lookup for a Transaction Manager through the configured properties TransactionManagerLocatorClass and TransactionManagerLocatorMethod\nActiveMQ Resource Adapter won''t be able to set and verify transaction timeouts in certain cases.", format = Message.Format.MESSAGE_FORMAT) + void noTXLocator(); + + @LogMessage(level = Logger.Level.WARN) + @Message(id = 152001, value = "problem resetting ActiveMQ xa session after failure", format = Message.Format.MESSAGE_FORMAT) + void problemResettingXASession(); + + @LogMessage(level = Logger.Level.WARN) + @Message(id = 152002, value = "Unable to roll local transaction back", format = Message.Format.MESSAGE_FORMAT) + void unableToRollbackTX(); + + @LogMessage(level = Logger.Level.WARN) + @Message(id = 152003, value = "unable to reset session after failure", format = Message.Format.MESSAGE_FORMAT) + void unableToResetSession(); + + @LogMessage(level = Logger.Level.WARN) + @Message(id = 152004, value = "Handling JMS exception failure", format = Message.Format.MESSAGE_FORMAT) + void handlingJMSFailure(@Cause Exception e); + + @LogMessage(level = Logger.Level.WARN) + @Message(id = 152005, value = "Failure in ActiveMQ activation {0}", format = Message.Format.MESSAGE_FORMAT) + void failureInActivation(@Cause Throwable t, ActiveMQActivationSpec spec); + + @LogMessage(level = Logger.Level.WARN) + @Message(id = 152006, value = "Unable to call after delivery", format = Message.Format.MESSAGE_FORMAT) + void unableToCallAfterDelivery(@Cause Exception e); + + @LogMessage(level = Logger.Level.ERROR) + @Message(id = 154000, value = "Error while creating object Reference.", format = Message.Format.MESSAGE_FORMAT) + void errorCreatingReference(@Cause Exception e); + + @LogMessage(level = Logger.Level.ERROR) + @Message(id = 154001, value = "Unable to stop ActiveMQ resource adapter.", format = Message.Format.MESSAGE_FORMAT) + void errorStoppingRA(@Cause Exception e); + + @LogMessage(level = Logger.Level.ERROR) + @Message(id = 154003, value = "Unable to reconnect {0}", format = Message.Format.MESSAGE_FORMAT) + void errorReconnecting(@Cause Throwable t, ActiveMQActivationSpec spec); + + @LogMessage(level = Logger.Level.ERROR) + @Message(id = 154004, value = "Failed to deliver message", format = Message.Format.MESSAGE_FORMAT) + void errorDeliveringMessage(@Cause Throwable t); + + @LogMessage(level = Logger.Level.DEBUG) + @Message(id = 153001, value = "using different ActiveMQRAConnectionFactory", format = Message.Format.MESSAGE_FORMAT) + void warnDifferentConnectionfactory(); +} http://git-wip-us.apache.org/repos/asf/activemq-6/blob/034adfbf/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAMCFProperties.java ---------------------------------------------------------------------- diff --git a/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAMCFProperties.java b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAMCFProperties.java new file mode 100644 index 0000000..13db7a6 --- /dev/null +++ b/activemq-ra/src/main/java/org/apache/activemq/ra/ActiveMQRAMCFProperties.java @@ -0,0 +1,204 @@ +/* + * Copyright 2005-2014 Red Hat, Inc. + * Red Hat 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.activemq.ra; + +import java.io.Serializable; + +import javax.jms.Queue; +import javax.jms.Topic; + + +/** + * The MCF default properties - these are set in the <tx-connection-factory> at the jms-ds.xml + * + * @author <a href="mailto:adr...@jboss.com">Adrian Brock</a> + * @author <a href="mailto:jesper.peder...@jboss.org">Jesper Pedersen</a> + * @author <a href="mailto:clebert.suco...@jboss.org">Clebert Suconic</a> + * @author <a href="mailto:andy.tay...@jboss.org">Andy Taylor</a> + */ +public class ActiveMQRAMCFProperties extends ConnectionFactoryProperties implements Serializable +{ + /** + * Serial version UID + */ + static final long serialVersionUID = -5951352236582886862L; + /** + * Trace enabled + */ + private static boolean trace = ActiveMQRALogger.LOGGER.isTraceEnabled(); + + /** + * The queue type + */ + private static final String QUEUE_TYPE = Queue.class.getName(); + + /** + * The topic type + */ + private static final String TOPIC_TYPE = Topic.class.getName(); + + + private String strConnectorClassName; + + public String strConnectionParameters; + + /** + * The connection type + */ + private int type = ActiveMQRAConnectionFactory.CONNECTION; + + /** + * Use tryLock + */ + private Integer useTryLock; + + /** + * Constructor + */ + public ActiveMQRAMCFProperties() + { + if (ActiveMQRAMCFProperties.trace) + { + ActiveMQRALogger.LOGGER.trace("constructor()"); + } + + useTryLock = null; + } + + /** + * Get the connection type + * + * @return The type + */ + public int getType() + { + if (ActiveMQRAMCFProperties.trace) + { + ActiveMQRALogger.LOGGER.trace("getType()"); + } + + return type; + } + + public String getConnectorClassName() + { + return strConnectorClassName; + } + + public void setConnectorClassName(final String connectorClassName) + { + if (ActiveMQRAMCFProperties.trace) + { + ActiveMQRALogger.LOGGER.trace("setConnectorClassName(" + connectorClassName + ")"); + } + + strConnectorClassName = connectorClassName; + + setParsedConnectorClassNames(ActiveMQRaUtils.parseConnectorConnectorConfig(connectorClassName)); + } + /** + * @return the connectionParameters + */ + public String getStrConnectionParameters() + { + return strConnectionParameters; + } + + public void setConnectionParameters(final String configuration) + { + strConnectionParameters = configuration; + setParsedConnectionParameters(ActiveMQRaUtils.parseConfig(configuration)); + } + + /** + * Set the default session type. + * + * @param defaultType either javax.jms.Topic or javax.jms.Queue + */ + public void setSessionDefaultType(final String defaultType) + { + if (ActiveMQRAMCFProperties.trace) + { + ActiveMQRALogger.LOGGER.trace("setSessionDefaultType(" + type + ")"); + } + + if (defaultType.equals(ActiveMQRAMCFProperties.QUEUE_TYPE)) + { + type = ActiveMQRAConnectionFactory.QUEUE_CONNECTION; + } + else if (defaultType.equals(ActiveMQRAMCFProperties.TOPIC_TYPE)) + { + type = ActiveMQRAConnectionFactory.TOPIC_CONNECTION; + } + else + { + type = ActiveMQRAConnectionFactory.CONNECTION; + } + } + + /** + * Get the default session type. + * + * @return The default session type + */ + public String getSessionDefaultType() + { + if (ActiveMQRAMCFProperties.trace) + { + ActiveMQRALogger.LOGGER.trace("getSessionDefaultType()"); + } + + if (type == ActiveMQRAConnectionFactory.CONNECTION) + { + return "BOTH"; + } + else if (type == ActiveMQRAConnectionFactory.QUEUE_CONNECTION) + { + return ActiveMQRAMCFProperties.TOPIC_TYPE; + } + else + { + return ActiveMQRAMCFProperties.QUEUE_TYPE; + } + } + + /** + * Get the useTryLock. + * + * @return the useTryLock. + */ + public Integer getUseTryLock() + { + if (ActiveMQRAMCFProperties.trace) + { + ActiveMQRALogger.LOGGER.trace("getUseTryLock()"); + } + + return useTryLock; + } + + /** + * Set the useTryLock. + * + * @param useTryLock the useTryLock. + */ + public void setUseTryLock(final Integer useTryLock) + { + if (ActiveMQRAMCFProperties.trace) + { + ActiveMQRALogger.LOGGER.trace("setUseTryLock(" + useTryLock + ")"); + } + + this.useTryLock = useTryLock; + } +}