diff --git a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/uri/BeanSupport.java b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/uri/BeanSupport.java index 70b36aba4c..94a589d970 100644 --- a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/uri/BeanSupport.java +++ b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/uri/BeanSupport.java @@ -19,12 +19,14 @@ package org.apache.activemq.artemis.utils.uri; import java.beans.PropertyDescriptor; import java.io.UnsupportedEncodingException; +import java.lang.reflect.InvocationTargetException; import java.net.URI; import java.net.URLDecoder; import java.net.URLEncoder; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Properties; import java.util.Set; import org.apache.commons.beanutils.BeanUtilsBean; @@ -69,6 +71,38 @@ public class BeanSupport { return obj; } + public static

P setProperties(P bean, Properties properties) + throws IllegalAccessException, NoSuchMethodException, InvocationTargetException { + synchronized (beanUtils) { + PropertyDescriptor[] descriptors = beanUtils.getPropertyUtils().getPropertyDescriptors(bean); + for (PropertyDescriptor descriptor : descriptors) { + if (descriptor.getReadMethod() != null && isWriteable(descriptor, null)) { + String value = properties.getProperty(descriptor.getName()); + if (value != null) { + beanUtils.setProperty(bean, descriptor.getName(), value); + } + } + } + } + return bean; + } + + public static

Properties getProperties(P bean, Properties properties) + throws IllegalAccessException, NoSuchMethodException, InvocationTargetException { + synchronized (beanUtils) { + PropertyDescriptor[] descriptors = beanUtils.getPropertyUtils().getPropertyDescriptors(bean); + for (PropertyDescriptor descriptor : descriptors) { + if (descriptor.getReadMethod() != null && isWriteable(descriptor, null)) { + String value = beanUtils.getProperty(bean, descriptor.getName()); + if (value != null) { + properties.put(descriptor.getName(), value); + } + } + } + } + return properties; + } + public static void setData(URI uri, HashMap properties, Set allowableProperties, diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQConnectionFactory.java b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQConnectionFactory.java index ba5359a797..bb729f69cd 100644 --- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQConnectionFactory.java +++ b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQConnectionFactory.java @@ -30,17 +30,17 @@ import javax.jms.XAConnectionFactory; import javax.jms.XAJMSContext; import javax.jms.XAQueueConnection; import javax.jms.XATopicConnection; -import javax.naming.NamingException; -import javax.naming.Reference; -import javax.naming.Referenceable; +import javax.naming.Context; import java.io.Externalizable; import java.io.IOException; import java.io.InvalidObjectException; import java.io.ObjectInput; import java.io.ObjectOutput; +import java.lang.reflect.InvocationTargetException; import java.net.URI; import java.security.AccessController; import java.security.PrivilegedAction; +import java.util.Properties; import org.apache.activemq.artemis.api.core.DiscoveryGroupConfiguration; import org.apache.activemq.artemis.api.core.TransportConfiguration; @@ -51,18 +51,18 @@ import org.apache.activemq.artemis.api.core.client.ServerLocator; import org.apache.activemq.artemis.api.jms.ActiveMQJMSConstants; import org.apache.activemq.artemis.api.jms.JMSFactoryType; import org.apache.activemq.artemis.core.client.impl.ServerLocatorImpl; -import org.apache.activemq.artemis.jms.referenceable.ConnectionFactoryObjectFactory; -import org.apache.activemq.artemis.jms.referenceable.SerializableObjectRefAddr; +import org.apache.activemq.artemis.jndi.JNDIStorable; import org.apache.activemq.artemis.spi.core.remoting.ClientProtocolManagerFactory; import org.apache.activemq.artemis.uri.ConnectionFactoryParser; import org.apache.activemq.artemis.uri.ServerLocatorParser; import org.apache.activemq.artemis.utils.ClassloadingUtil; +import org.apache.activemq.artemis.utils.uri.BeanSupport; /** *

ActiveMQ Artemis implementation of a JMS ConnectionFactory.

*

This connection factory will use defaults defined by {@link DefaultConnectionProperties}. */ -public class ActiveMQConnectionFactory implements ConnectionFactoryOptions, Externalizable, Referenceable, ConnectionFactory, XAConnectionFactory, AutoCloseable { +public class ActiveMQConnectionFactory extends JNDIStorable implements ConnectionFactoryOptions, Externalizable, ConnectionFactory, XAConnectionFactory, AutoCloseable { private static final long serialVersionUID = -7554006056207377105L; @@ -206,10 +206,14 @@ public class ActiveMQConnectionFactory implements ConnectionFactoryOptions, Exte this(DefaultConnectionProperties.DEFAULT_BROKER_URL); } - public ActiveMQConnectionFactory(String url) { + public ActiveMQConnectionFactory(String brokerURL) { + setBrokerURL(brokerURL); + } + + private void setBrokerURL(String brokerURL) { ConnectionFactoryParser cfParser = new ConnectionFactoryParser(); try { - URI uri = cfParser.expandURI(url); + URI uri = cfParser.expandURI(brokerURL); serverLocator = ServerLocatorImpl.newLocator(uri); cfParser.populateObject(uri, this); } catch (Exception e) { @@ -380,8 +384,36 @@ public class ActiveMQConnectionFactory implements ConnectionFactoryOptions, Exte } @Override - public Reference getReference() throws NamingException { - return new Reference(this.getClass().getCanonicalName(), new SerializableObjectRefAddr("ActiveMQ-CF", this), ConnectionFactoryObjectFactory.class.getCanonicalName(), null); + protected void buildFromProperties(Properties props) { + String url = props.getProperty(Context.PROVIDER_URL); + if (url == null || url.isEmpty()) { + url = props.getProperty("brokerURL"); + } + if (url != null && url.length() > 0) { + setBrokerURL(url); + } + if (url == null || url.isEmpty()) { + throw new IllegalArgumentException(Context.PROVIDER_URL + " or " + "brokerURL is required"); + } + try { + BeanSupport.setProperties(this, props); + } catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { + throw new RuntimeException(e); + } + } + + @Override + protected void populateProperties(Properties props) { + try { + URI uri = toURI(); + if (uri != null) { + props.put(Context.PROVIDER_URL, uri.toASCIIString()); + props.put("brokerURL", uri.toASCIIString()); + } + BeanSupport.getProperties(this, props); + } catch (IOException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { + throw new RuntimeException(e); + } } public boolean isHA() { diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQDestination.java b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQDestination.java index c0ab4b9e95..d374265a27 100644 --- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQDestination.java +++ b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQDestination.java @@ -19,21 +19,18 @@ package org.apache.activemq.artemis.jms.client; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.JMSRuntimeException; -import javax.naming.NamingException; -import javax.naming.Reference; -import javax.naming.Referenceable; import java.io.Serializable; +import java.util.Properties; import java.util.UUID; import org.apache.activemq.artemis.api.core.Pair; import org.apache.activemq.artemis.api.core.SimpleString; -import org.apache.activemq.artemis.jms.referenceable.DestinationObjectFactory; -import org.apache.activemq.artemis.jms.referenceable.SerializableObjectRefAddr; +import org.apache.activemq.artemis.jndi.JNDIStorable; /** * ActiveMQ Artemis implementation of a JMS Destination. */ -public class ActiveMQDestination implements Destination, Serializable, Referenceable { +public class ActiveMQDestination extends JNDIStorable implements Destination, Serializable { // Constants ----------------------------------------------------- // Static -------------------------------------------------------- @@ -78,27 +75,27 @@ public class ActiveMQDestination implements Destination, Serializable, Reference case TEMP_TOPIC: return new ActiveMQTopic(name, true); case DESTINATION: - return new ActiveMQDestination(name, name, TYPE.DESTINATION, null); + return new ActiveMQDestination(name, TYPE.DESTINATION, null); default: throw new IllegalArgumentException("Invalid default destination type: " + defaultType); } } - public static Destination fromPrefixedName(final String address) { - if (address.startsWith(ActiveMQDestination.QUEUE_QUALIFIED_PREFIX)) { - String name = address.substring(ActiveMQDestination.QUEUE_QUALIFIED_PREFIX.length()); - return createQueue(name); - } else if (address.startsWith(ActiveMQDestination.TOPIC_QUALIFIED_PREFIX)) { - String name = address.substring(ActiveMQDestination.TOPIC_QUALIFIED_PREFIX.length()); - return createTopic(name); - } else if (address.startsWith(ActiveMQDestination.TEMP_QUEUE_QUALIFED_PREFIX)) { - String name = address.substring(ActiveMQDestination.TEMP_QUEUE_QUALIFED_PREFIX.length()); - return new ActiveMQTemporaryQueue(name, name, null); - } else if (address.startsWith(ActiveMQDestination.TEMP_TOPIC_QUALIFED_PREFIX)) { - String name = address.substring(ActiveMQDestination.TEMP_TOPIC_QUALIFED_PREFIX.length()); - return new ActiveMQTemporaryTopic(name, name, null); + public static Destination fromPrefixedName(final String name) { + if (name.startsWith(ActiveMQDestination.QUEUE_QUALIFIED_PREFIX)) { + String address = name.substring(ActiveMQDestination.QUEUE_QUALIFIED_PREFIX.length()); + return createQueue(address); + } else if (name.startsWith(ActiveMQDestination.TOPIC_QUALIFIED_PREFIX)) { + String address = name.substring(ActiveMQDestination.TOPIC_QUALIFIED_PREFIX.length()); + return createTopic(address); + } else if (name.startsWith(ActiveMQDestination.TEMP_QUEUE_QUALIFED_PREFIX)) { + String address = name.substring(ActiveMQDestination.TEMP_QUEUE_QUALIFED_PREFIX.length()); + return new ActiveMQTemporaryQueue(address, null); + } else if (name.startsWith(ActiveMQDestination.TEMP_TOPIC_QUALIFED_PREFIX)) { + String address = name.substring(ActiveMQDestination.TEMP_TOPIC_QUALIFED_PREFIX.length()); + return new ActiveMQTemporaryTopic(address, null); } else { - return new ActiveMQDestination(address, address, TYPE.DESTINATION, null); + return new ActiveMQDestination(name, TYPE.DESTINATION, null); } } @@ -191,58 +188,48 @@ public class ActiveMQDestination implements Destination, Serializable, Reference return new SimpleString(TOPIC_QUALIFIED_PREFIX + name); } - public static ActiveMQQueue createQueue(final String name) { - return new ActiveMQQueue(name); + public static ActiveMQQueue createQueue(final String address) { + return new ActiveMQQueue(address); } - public static ActiveMQTopic createTopic(final String name) { - return new ActiveMQTopic(name); + public static ActiveMQTopic createTopic(final String address) { + return new ActiveMQTopic(address); } - public static ActiveMQTemporaryQueue createTemporaryQueue(final String name, final ActiveMQSession session) { - return new ActiveMQTemporaryQueue(name, name, session); + public static ActiveMQTemporaryQueue createTemporaryQueue(final String address, final ActiveMQSession session) { + return new ActiveMQTemporaryQueue(address, session); } - public static ActiveMQTemporaryQueue createTemporaryQueue(final String name) { - return createTemporaryQueue(name, null); + public static ActiveMQTemporaryQueue createTemporaryQueue(final String address) { + return createTemporaryQueue(address, null); } public static ActiveMQTemporaryQueue createTemporaryQueue(final ActiveMQSession session) { - String name = UUID.randomUUID().toString(); + String address = UUID.randomUUID().toString(); - return createTemporaryQueue(name, session); + return createTemporaryQueue(address, session); } public static ActiveMQTemporaryTopic createTemporaryTopic(final ActiveMQSession session) { - String name = UUID.randomUUID().toString(); + String address = UUID.randomUUID().toString(); - return createTemporaryTopic(name, session); + return createTemporaryTopic(address, session); } - public static ActiveMQTemporaryTopic createTemporaryTopic(String name, final ActiveMQSession session) { - return new ActiveMQTemporaryTopic(name, name, session); + public static ActiveMQTemporaryTopic createTemporaryTopic(String address, final ActiveMQSession session) { + return new ActiveMQTemporaryTopic(address, session); } - public static ActiveMQTemporaryTopic createTemporaryTopic(String name) { - return createTemporaryTopic(name, null); + public static ActiveMQTemporaryTopic createTemporaryTopic(String address) { + return createTemporaryTopic(address, null); } // Attributes ---------------------------------------------------- - /** - * The JMS name - */ - protected final String name; - /** * The core address */ - private final String address; - - /** - * SimpleString version of address - */ - private final SimpleString simpleAddress; + private SimpleString simpleAddress; private final TYPE type; @@ -251,25 +238,34 @@ public class ActiveMQDestination implements Destination, Serializable, Reference // Constructors -------------------------------------------------- protected ActiveMQDestination(final String address, - final String name, final TYPE type, final ActiveMQSession session) { - this.address = address; - - this.name = name; - - simpleAddress = new SimpleString(address); + this.simpleAddress = SimpleString.toSimpleString(address); this.type = type; this.session = session; } - // Referenceable implementation --------------------------------------- + protected ActiveMQDestination(final SimpleString address, + final TYPE type, + final ActiveMQSession session) { + this.simpleAddress = address; - @Override - public Reference getReference() throws NamingException { - return new Reference(this.getClass().getCanonicalName(), new SerializableObjectRefAddr("ActiveMQ-DEST", this), DestinationObjectFactory.class.getCanonicalName(), null); + this.type = type; + + this.session = session; + } + + public void setAddress(String address) { + setSimpleAddress(SimpleString.toSimpleString(address)); + } + + public void setSimpleAddress(SimpleString address) { + if (address == null) { + throw new IllegalArgumentException("address cannot be null"); + } + this.simpleAddress = address; } public void delete() throws JMSException { @@ -293,7 +289,7 @@ public class ActiveMQDestination implements Destination, Serializable, Reference // Public -------------------------------------------------------- public String getAddress() { - return address; + return simpleAddress.toString(); } public SimpleString getSimpleAddress() { @@ -301,7 +297,7 @@ public class ActiveMQDestination implements Destination, Serializable, Reference } public String getName() { - return name; + return simpleAddress.toString(); } public boolean isTemporary() { @@ -324,12 +320,22 @@ public class ActiveMQDestination implements Destination, Serializable, Reference ActiveMQDestination that = (ActiveMQDestination) o; - return address.equals(that.address); + return simpleAddress.equals(that.simpleAddress); } @Override public int hashCode() { - return address.hashCode(); + return simpleAddress.hashCode(); + } + + @Override + protected void buildFromProperties(Properties props) { + setAddress(props.getProperty("address")); + } + + @Override + protected void populateProperties(Properties props) { + props.put("address", getAddress()); } // Package protected --------------------------------------------- diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQQueue.java b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQQueue.java index 2f9a47b001..2deefa974b 100644 --- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQQueue.java +++ b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQQueue.java @@ -18,8 +18,6 @@ package org.apache.activemq.artemis.jms.client; import javax.jms.Queue; -import org.apache.activemq.artemis.api.core.SimpleString; - /** * ActiveMQ Artemis implementation of a JMS Queue. *
@@ -32,35 +30,30 @@ public class ActiveMQQueue extends ActiveMQDestination implements Queue { // Static -------------------------------------------------------- - public static SimpleString createAddressFromName(final String name) { - return new SimpleString(name); - } - // Attributes ---------------------------------------------------- // Constructors -------------------------------------------------- - - public ActiveMQQueue(final String name) { - super(name, name, TYPE.QUEUE, null); + public ActiveMQQueue() { + this(null); } - public ActiveMQQueue(final String name, boolean temporary) { - super(name, name, temporary ? TYPE.TEMP_QUEUE : TYPE.QUEUE, null); + public ActiveMQQueue(final String address) { + super(address, TYPE.QUEUE, null); + } + + public ActiveMQQueue(final String address, boolean temporary) { + super(address, temporary ? TYPE.TEMP_QUEUE : TYPE.QUEUE, null); } /** * @param address - * @param name * @param temporary * @param session */ - public ActiveMQQueue(String address, String name, boolean temporary, ActiveMQSession session) { - super(address, name, temporary ? TYPE.TEMP_QUEUE : TYPE.QUEUE, session); + public ActiveMQQueue(String address, boolean temporary, ActiveMQSession session) { + super(address, temporary ? TYPE.TEMP_QUEUE : TYPE.QUEUE, session); } - public ActiveMQQueue(final String address, final String name) { - super(address, name, TYPE.QUEUE, null); - } // Queue implementation ------------------------------------------ @@ -68,12 +61,12 @@ public class ActiveMQQueue extends ActiveMQDestination implements Queue { @Override public String getQueueName() { - return name; + return getAddress(); } @Override public String toString() { - return "ActiveMQQueue[" + name + "]"; + return "ActiveMQQueue[" + getAddress() + "]"; } @Override diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQTemporaryQueue.java b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQTemporaryQueue.java index 88a822ade7..b79c36adf8 100644 --- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQTemporaryQueue.java +++ b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQTemporaryQueue.java @@ -37,19 +37,21 @@ public class ActiveMQTemporaryQueue extends ActiveMQQueue implements TemporaryQu // TemporaryQueue implementation ------------------------------------------ // Public -------------------------------------------------------- + public ActiveMQTemporaryQueue() { + this(null, null); + } /** * @param address - * @param name * @param session */ - public ActiveMQTemporaryQueue(String address, String name, ActiveMQSession session) { - super(address, name, true, session); + public ActiveMQTemporaryQueue(String address, ActiveMQSession session) { + super(address, true, session); } @Override public String toString() { - return "ActiveMQTemporaryQueue[" + name + "]"; + return "ActiveMQTemporaryQueue[" + getAddress() + "]"; } @Override diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQTemporaryTopic.java b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQTemporaryTopic.java index 98b5ba6c36..457663d1a7 100644 --- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQTemporaryTopic.java +++ b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQTemporaryTopic.java @@ -29,9 +29,12 @@ public class ActiveMQTemporaryTopic extends ActiveMQTopic implements TemporaryTo // Static -------------------------------------------------------- // Constructors -------------------------------------------------- + public ActiveMQTemporaryTopic() { + this(null, null); + } - protected ActiveMQTemporaryTopic(final String address, final String name, final ActiveMQSession session) { - super(address, name, true, session); + public ActiveMQTemporaryTopic(final String address, final ActiveMQSession session) { + super(address, true, session); } // Public -------------------------------------------------------- diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQTopic.java b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQTopic.java index 94bdd25552..e22e67b65b 100644 --- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQTopic.java +++ b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQTopic.java @@ -18,8 +18,6 @@ package org.apache.activemq.artemis.jms.client; import javax.jms.Topic; -import org.apache.activemq.artemis.api.core.SimpleString; - /** * ActiveMQ Artemis implementation of a JMS Topic. *
@@ -31,44 +29,42 @@ public class ActiveMQTopic extends ActiveMQDestination implements Topic { private static final long serialVersionUID = 7873614001276404156L; // Static -------------------------------------------------------- - public static SimpleString createAddressFromName(final String name) { - return new SimpleString(name); - } - // Attributes ---------------------------------------------------- // Constructors -------------------------------------------------- - - public ActiveMQTopic(final String name) { - this(name, false); + public ActiveMQTopic() { + this(null); } - public ActiveMQTopic(final String name, boolean temporary) { - super(name, name, TYPE.TOPIC, null); + public ActiveMQTopic(final String address) { + this(address, false); + } + + public ActiveMQTopic(final String address, boolean temporary) { + super(address, TYPE.TOPIC, null); } /** * @param address - * @param name * @param temporary * @param session */ - protected ActiveMQTopic(String address, String name, boolean temporary, ActiveMQSession session) { - super(address, name, temporary ? TYPE.TEMP_TOPIC : TYPE.TOPIC, session); + protected ActiveMQTopic(String address, boolean temporary, ActiveMQSession session) { + super(address, temporary ? TYPE.TEMP_TOPIC : TYPE.TOPIC, session); } // Topic implementation ------------------------------------------ @Override public String getTopicName() { - return name; + return getName(); } // Public -------------------------------------------------------- @Override public String toString() { - return "ActiveMQTopic[" + name + "]"; + return "ActiveMQTopic[" + getName() + "]"; } @Override diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jndi/JNDIReferenceFactory.java b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jndi/JNDIReferenceFactory.java index c22676013b..0b4b0c2677 100644 --- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jndi/JNDIReferenceFactory.java +++ b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jndi/JNDIReferenceFactory.java @@ -19,14 +19,13 @@ package org.apache.activemq.artemis.jndi; import javax.naming.Context; import javax.naming.Name; import javax.naming.NamingException; -import javax.naming.RefAddr; import javax.naming.Reference; import javax.naming.StringRefAddr; import javax.naming.spi.ObjectFactory; import java.util.Enumeration; -import java.util.HashMap; import java.util.Hashtable; -import java.util.Map; +import java.util.Properties; + /** * Converts objects implementing JNDIStorable into a property fields so they can be @@ -63,12 +62,7 @@ public class JNDIReferenceFactory implements ObjectFactory { Class theClass = loadClass(this, reference.getClassName()); if (JNDIStorable.class.isAssignableFrom(theClass)) { JNDIStorable store = (JNDIStorable) theClass.newInstance(); - Map properties = new HashMap<>(); - for (Enumeration iter = reference.getAll(); iter.hasMoreElements();) { - StringRefAddr addr = (StringRefAddr) iter.nextElement(); - properties.put(addr.getType(), (addr.getContent() == null) ? "" : addr.getContent().toString()); - } - store.setProperties(properties); + store.setProperties(getProperties(reference)); result = store; } } else { @@ -77,6 +71,15 @@ public class JNDIReferenceFactory implements ObjectFactory { return result; } + public static Properties getProperties(Reference reference) { + Properties properties = new Properties(); + for (Enumeration iter = reference.getAll(); iter.hasMoreElements();) { + StringRefAddr addr = (StringRefAddr)iter.nextElement(); + properties.put(addr.getType(), (addr.getContent() == null) ? "" : addr.getContent()); + } + return properties; + } + /** * Create a Reference instance from a JNDIStorable object * @@ -92,10 +95,10 @@ public class JNDIReferenceFactory implements ObjectFactory { public static Reference createReference(String instanceClassName, JNDIStorable po) throws NamingException { Reference result = new Reference(instanceClassName, JNDIReferenceFactory.class.getName(), null); try { - Map props = po.getProperties(); - for (Map.Entry entry : props.entrySet()) { - StringRefAddr addr = new StringRefAddr(entry.getKey(), entry.getValue()); - result.add(addr); + Properties props = po.getProperties(); + for (Enumeration iter = props.propertyNames(); iter.hasMoreElements();) { + String key = (String)iter.nextElement(); + result.add(new StringRefAddr(key, props.getProperty(key))); } } catch (Exception e) { throw new NamingException(e.getMessage()); diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jndi/JNDIStorable.java b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jndi/JNDIStorable.java index 2c26b0a738..b25dcf24a6 100644 --- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jndi/JNDIStorable.java +++ b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jndi/JNDIStorable.java @@ -16,32 +16,27 @@ */ package org.apache.activemq.artemis.jndi; -import javax.naming.NamingException; -import javax.naming.Reference; -import javax.naming.Referenceable; -import java.io.Externalizable; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; -import java.util.LinkedHashMap; -import java.util.Map; +import java.util.Properties; + +import javax.naming.NamingException; +import javax.naming.Reference; +import javax.naming.Referenceable; /** * Facilitates objects to be stored in JNDI as properties - * - * @since 1.0 */ -public abstract class JNDIStorable implements Referenceable, Externalizable { +public abstract class JNDIStorable implements Referenceable { /** * Set the properties that will represent the instance in JNDI * * @param props * The properties to use when building the new isntance. - * - * @return a new, unmodifiable, map containing any unused properties, or empty if none were. */ - protected abstract Map buildFromProperties(Map props); + protected abstract void buildFromProperties(Properties props); /** * Initialize the instance from properties stored in JNDI @@ -49,7 +44,7 @@ public abstract class JNDIStorable implements Referenceable, Externalizable { * @param props * The properties to use when initializing the new instance. */ - protected abstract void populateProperties(Map props); + protected abstract void populateProperties(Properties props); /** * set the properties for this instance as retrieved from JNDI @@ -59,8 +54,8 @@ public abstract class JNDIStorable implements Referenceable, Externalizable { * * @return a new, unmodifiable, map containing any unused properties, or empty if none were. */ - public synchronized Map setProperties(Map props) { - return buildFromProperties(props); + synchronized void setProperties(Properties props) { + buildFromProperties(props); } /** @@ -68,8 +63,8 @@ public abstract class JNDIStorable implements Referenceable, Externalizable { * * @return the properties */ - public synchronized Map getProperties() { - Map properties = new LinkedHashMap<>(); + synchronized Properties getProperties() { + Properties properties = new Properties(); populateProperties(properties); return properties; } @@ -87,30 +82,29 @@ public abstract class JNDIStorable implements Referenceable, Externalizable { } /** - * @see Externalizable#readExternal(ObjectInput) + * Method for class's implementing externalizable to delegate to if not custom implementing. + * + * @param in + * @throws IOException + * @throws ClassNotFoundException + * @see java.io.Externalizable#readExternal(java.io.ObjectInput) */ - @SuppressWarnings("unchecked") - @Override - public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { - Map props = (Map) in.readObject(); + public void readObject(ObjectInput in) throws IOException, ClassNotFoundException { + Properties props = (Properties)in.readObject(); if (props != null) { setProperties(props); } } /** - * @see Externalizable#writeExternal(ObjectOutput) + * Method for class's implementing externalizable to delegate to if not custom implementing. + * + * @param out + * @throws IOException + * @see java.io.Externalizable#writeExternal(java.io.ObjectOutput) */ - @Override - public void writeExternal(ObjectOutput out) throws IOException { + public void writeObject(ObjectOutput out) throws IOException { out.writeObject(getProperties()); } - protected String getProperty(Map map, String key, String defaultValue) { - String value = map.get(key); - if (value != null) { - return value; - } - return defaultValue; - } -} +} \ No newline at end of file diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerDestination.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerDestination.java index cee9ee5ed5..5a2f55bb67 100644 --- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerDestination.java +++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerDestination.java @@ -19,6 +19,7 @@ package org.apache.activemq.artemis.protocol.amqp.converter.jms; import javax.jms.JMSException; import javax.jms.Queue; +import org.apache.activemq.artemis.api.core.SimpleString; import org.apache.activemq.artemis.jms.client.ActiveMQDestination; /** @@ -27,8 +28,12 @@ import org.apache.activemq.artemis.jms.client.ActiveMQDestination; */ public class ServerDestination extends ActiveMQDestination implements Queue { - public ServerDestination(String name) { - super(name, name, TYPE.DESTINATION, null); + public ServerDestination(String address) { + super(address, TYPE.DESTINATION, null); + } + + public ServerDestination(SimpleString address) { + super(address, TYPE.DESTINATION, null); } @Override diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSMessage.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSMessage.java index 5962e39b63..b070591c42 100644 --- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSMessage.java +++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSMessage.java @@ -139,7 +139,7 @@ public class ServerJMSMessage implements Message { public final Destination getJMSReplyTo() throws JMSException { SimpleString reply = MessageUtil.getJMSReplyTo(message); if (reply != null) { - return new ServerDestination(reply.toString()); + return new ServerDestination(reply); } else { return null; } @@ -148,7 +148,6 @@ public class ServerJMSMessage implements Message { @Override public final void setJMSReplyTo(Destination replyTo) throws JMSException { MessageUtil.setJMSReplyTo(message, replyTo == null ? null : ((ActiveMQDestination) replyTo).getSimpleAddress()); - } @Override @@ -158,7 +157,7 @@ public class ServerJMSMessage implements Message { if (sdest == null) { return null; } else { - return new ServerDestination(sdest.toString()); + return new ServerDestination(sdest); } } diff --git a/artemis-ra/src/main/java/org/apache/activemq/artemis/jms/referenceable/ConnectionFactoryObjectFactory.java b/artemis-ra/src/main/java/org/apache/activemq/artemis/jms/referenceable/ConnectionFactoryObjectFactory.java new file mode 100644 index 0000000000..4c7a68afa7 --- /dev/null +++ b/artemis-ra/src/main/java/org/apache/activemq/artemis/jms/referenceable/ConnectionFactoryObjectFactory.java @@ -0,0 +1,25 @@ +/* + * 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.activemq.artemis.jms.referenceable; + +/** + * Done for back compatibility with the package/class move. + * + * Should be removed on next major version change. + */ +public class ConnectionFactoryObjectFactory extends org.apache.activemq.artemis.ra.referenceable.ActiveMQRAConnectionFactoryObjectFactory { +} diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/referenceable/DestinationObjectFactory.java b/artemis-ra/src/main/java/org/apache/activemq/artemis/jms/referenceable/SerializableObjectRefAddr.java similarity index 50% rename from artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/referenceable/DestinationObjectFactory.java rename to artemis-ra/src/main/java/org/apache/activemq/artemis/jms/referenceable/SerializableObjectRefAddr.java index 896e81561f..92aaf9e9b9 100644 --- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/referenceable/DestinationObjectFactory.java +++ b/artemis-ra/src/main/java/org/apache/activemq/artemis/jms/referenceable/SerializableObjectRefAddr.java @@ -6,7 +6,7 @@ * (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 + * 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, @@ -16,29 +16,16 @@ */ package org.apache.activemq.artemis.jms.referenceable; -import javax.naming.Context; -import javax.naming.Name; -import javax.naming.Reference; -import javax.naming.spi.ObjectFactory; -import java.util.Hashtable; +import javax.naming.NamingException; /** - * A DestinationObjectFactory. + * Done for back compatibility with the package/class move. * - * Given a Reference - reconstructs an ActiveMQDestination + * Should be removed on next major version change. */ -public class DestinationObjectFactory implements ObjectFactory { +public class SerializableObjectRefAddr extends org.apache.activemq.artemis.ra.referenceable.SerializableObjectRefAddr { - @Override - public Object getObjectInstance(final Object ref, - final Name name, - final Context ctx, - final Hashtable props) throws Exception { - Reference r = (Reference) ref; - - byte[] bytes = (byte[]) r.get("ActiveMQ-DEST").getContent(); - - // Deserialize - return SerializableObjectRefAddr.deserialize(bytes); + public SerializableObjectRefAddr(final String type, final Object content) throws NamingException { + super(type, content); } -} +} \ No newline at end of file diff --git a/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRAConnectionFactoryImpl.java b/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRAConnectionFactoryImpl.java index faf111e16b..e3c4c9d7aa 100644 --- a/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRAConnectionFactoryImpl.java +++ b/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/ActiveMQRAConnectionFactoryImpl.java @@ -35,8 +35,8 @@ import javax.resource.ResourceException; import javax.resource.spi.ConnectionManager; import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory; -import org.apache.activemq.artemis.jms.referenceable.ConnectionFactoryObjectFactory; -import org.apache.activemq.artemis.jms.referenceable.SerializableObjectRefAddr; +import org.apache.activemq.artemis.ra.referenceable.ActiveMQRAConnectionFactoryObjectFactory; +import org.apache.activemq.artemis.ra.referenceable.SerializableObjectRefAddr; /** * The connection factory @@ -118,7 +118,7 @@ public class ActiveMQRAConnectionFactoryImpl implements ActiveMQRAConnectionFact } if (reference == null) { try { - reference = new Reference(this.getClass().getCanonicalName(), new SerializableObjectRefAddr("ActiveMQ-CF", this), ConnectionFactoryObjectFactory.class.getCanonicalName(), null); + reference = new Reference(this.getClass().getCanonicalName(), new SerializableObjectRefAddr("ActiveMQ-CF", this), ActiveMQRAConnectionFactoryObjectFactory.class.getCanonicalName(), null); } catch (NamingException e) { ActiveMQRALogger.LOGGER.errorCreatingReference(e); } diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/referenceable/ConnectionFactoryObjectFactory.java b/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/referenceable/ActiveMQRAConnectionFactoryObjectFactory.java similarity index 91% rename from artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/referenceable/ConnectionFactoryObjectFactory.java rename to artemis-ra/src/main/java/org/apache/activemq/artemis/ra/referenceable/ActiveMQRAConnectionFactoryObjectFactory.java index ad125f06cb..ab4e99d194 100644 --- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/referenceable/ConnectionFactoryObjectFactory.java +++ b/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/referenceable/ActiveMQRAConnectionFactoryObjectFactory.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.activemq.artemis.jms.referenceable; +package org.apache.activemq.artemis.ra.referenceable; import javax.naming.Context; import javax.naming.Name; @@ -27,7 +27,7 @@ import java.util.Hashtable; * * Given a reference - reconstructs an ActiveMQRAConnectionFactory */ -public class ConnectionFactoryObjectFactory implements ObjectFactory { +public class ActiveMQRAConnectionFactoryObjectFactory implements ObjectFactory { @Override public Object getObjectInstance(final Object ref, diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/referenceable/SerializableObjectRefAddr.java b/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/referenceable/SerializableObjectRefAddr.java similarity index 97% rename from artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/referenceable/SerializableObjectRefAddr.java rename to artemis-ra/src/main/java/org/apache/activemq/artemis/ra/referenceable/SerializableObjectRefAddr.java index 09c971d5c1..b4fce9fcd4 100644 --- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/referenceable/SerializableObjectRefAddr.java +++ b/artemis-ra/src/main/java/org/apache/activemq/artemis/ra/referenceable/SerializableObjectRefAddr.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.activemq.artemis.jms.referenceable; +package org.apache.activemq.artemis.ra.referenceable; import javax.naming.NamingException; import javax.naming.RefAddr; diff --git a/docs/user-manual/en/SUMMARY.md b/docs/user-manual/en/SUMMARY.md index 1a2f5311f6..ba488f359d 100644 --- a/docs/user-manual/en/SUMMARY.md +++ b/docs/user-manual/en/SUMMARY.md @@ -56,6 +56,7 @@ * [REST Interface](rest.md) * [Embedding Apache ActiveMQ Artemis](embedding-activemq.md) * [Apache Karaf](karaf.md) +* [Apache Tomcat](tomcat.md) * [Spring Integration](spring-integration.md) * [CDI Integration](cdi-integration.md) * [Intercepting Operations](intercepting-operations.md) diff --git a/docs/user-manual/en/tomcat.md b/docs/user-manual/en/tomcat.md new file mode 100644 index 0000000000..ac6befa228 --- /dev/null +++ b/docs/user-manual/en/tomcat.md @@ -0,0 +1,39 @@ +# Apache ActiveMQ Artemis - Apache Tomcat Support + + +##Apache Tomcat resource context client configuration + +Apache ActiveMQ Artemis provides support for configuring the client, in the tomcat resource context.xml of Tomcat container. + +This is very similar to the way this is done in ActiveMQ 5.x so anyone migrating should find this familiar. +Please note though the connection url and properties that can be set for ActiveMQ Artemis are different please see [Migration Documentation](https://activemq.apache.org/artemis/migration/) + +#### Example of Connection Factory +```` + + ... + + ... + +```` + +#### Example of Destination (Queue and Topic) + +```` + + ... + + ... + + ... + +```` + +#### Example Tomcat App + +A sample tomcat app with the container context configured as an example can be seen here: + +/examples/features/sub-modules/tomcat \ No newline at end of file diff --git a/examples/features/sub-modules/pom.xml b/examples/features/sub-modules/pom.xml index ce20c0455d..bb6aeaa243 100644 --- a/examples/features/sub-modules/pom.xml +++ b/examples/features/sub-modules/pom.xml @@ -50,7 +50,8 @@ under the License. release artemis-ra-rar - inter-broker-bridge + inter-broker-bridge + tomcat diff --git a/examples/features/sub-modules/tomcat/README b/examples/features/sub-modules/tomcat/README new file mode 100644 index 0000000000..dfc84624c7 --- /dev/null +++ b/examples/features/sub-modules/tomcat/README @@ -0,0 +1,21 @@ +# Apache ActiveMQ Artemis Tomcat Integration JNDI Resources Sample + +This is a Sample Tomcat application showing JNDI resource in tomcat context.xml for ConnectionFactory +and Destination for Apache ActiveMQ Artemis. + +The sample context.xml used by the tomcat in this example can be found under: +/src/tomcat7-maven-plugin/resources/context.xml + +To run + +start Apache ActiveMQ Artemis on port 61616 + +then + +mvn clean install tomcat7:exec-war + +then to send message + +http://localhost:8080/tomcat-sample/send + +this will cause a "hello world" message to send, and the consumer should consume and output it to sysout. \ No newline at end of file diff --git a/examples/features/sub-modules/tomcat/pom.xml b/examples/features/sub-modules/tomcat/pom.xml new file mode 100644 index 0000000000..8773f3be26 --- /dev/null +++ b/examples/features/sub-modules/tomcat/pom.xml @@ -0,0 +1,127 @@ + + + + 4.0.0 + + + org.apache.activemq.examples.modules + broker-modules + 2.5.0-SNAPSHOT + + + + artemis-tomcat-jndi-resources-sample + war + Artemis Tomcat JNDI Resources Example + + + UTF-8 + ${project.baseUri} + 1.6 + + 3.0-alpha-1 + + + + + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-webmvc + ${spring.version} + + + org.springframework + spring-jms + ${spring.version} + + + + + org.apache.activemq + artemis-jms-client + ${project.version} + + + + javax.servlet + servlet-api + ${servlet-api.version} + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + ${java.version} + ${java.version} + + + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.1 + + + ${project.basedir}\src\tomcat7-maven-plugin\resources\context.xml + + + + tomcat-war-exec + + exec-war + + package + + + + + org.apache.activemq.examples.modules + artemis-tomcat-jndi-resources-sample + ${project.version} + war + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/features/sub-modules/tomcat/src/main/java/org/apache/activemq/artemis/example/tomcat/sample/SendMessageController.java b/examples/features/sub-modules/tomcat/src/main/java/org/apache/activemq/artemis/example/tomcat/sample/SendMessageController.java new file mode 100644 index 0000000000..eb36179bdd --- /dev/null +++ b/examples/features/sub-modules/tomcat/src/main/java/org/apache/activemq/artemis/example/tomcat/sample/SendMessageController.java @@ -0,0 +1,48 @@ +/** + * 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.activemq.artemis.example.tomcat.sample; + +import javax.jms.JMSException; +import javax.jms.Message; +import javax.jms.Session; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jms.core.JmsTemplate; +import org.springframework.jms.core.MessageCreator; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class SendMessageController { + + @Autowired + private JmsTemplate jmsTemplate; + + + @RequestMapping("/send") + public @ResponseBody String send(@RequestParam(value="text", defaultValue="hello world") final String text) { + jmsTemplate.send(new MessageCreator() { + @Override + public Message createMessage(Session session) throws JMSException { + return session.createTextMessage(text); + } + }); + return "sent: " + text; + } +} \ No newline at end of file diff --git a/examples/features/sub-modules/tomcat/src/main/java/org/apache/activemq/artemis/example/tomcat/sample/SystemOutPrintLnMessageListener.java b/examples/features/sub-modules/tomcat/src/main/java/org/apache/activemq/artemis/example/tomcat/sample/SystemOutPrintLnMessageListener.java new file mode 100644 index 0000000000..1f57c13743 --- /dev/null +++ b/examples/features/sub-modules/tomcat/src/main/java/org/apache/activemq/artemis/example/tomcat/sample/SystemOutPrintLnMessageListener.java @@ -0,0 +1,28 @@ +/** + * 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.activemq.artemis.example.tomcat.sample; + +import javax.jms.Message; +import javax.jms.MessageListener; + + +public class SystemOutPrintLnMessageListener implements MessageListener { + @Override + public void onMessage(Message message) { + System.out.println(message); + } +} diff --git a/examples/features/sub-modules/tomcat/src/main/webapp/WEB-INF/application-context.xml b/examples/features/sub-modules/tomcat/src/main/webapp/WEB-INF/application-context.xml new file mode 100644 index 0000000000..ffd4728b17 --- /dev/null +++ b/examples/features/sub-modules/tomcat/src/main/webapp/WEB-INF/application-context.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/features/sub-modules/tomcat/src/main/webapp/WEB-INF/dispatcher-servlet.xml b/examples/features/sub-modules/tomcat/src/main/webapp/WEB-INF/dispatcher-servlet.xml new file mode 100644 index 0000000000..b1da14dc81 --- /dev/null +++ b/examples/features/sub-modules/tomcat/src/main/webapp/WEB-INF/dispatcher-servlet.xml @@ -0,0 +1,28 @@ + + + + + + + \ No newline at end of file diff --git a/examples/features/sub-modules/tomcat/src/main/webapp/WEB-INF/web.xml b/examples/features/sub-modules/tomcat/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..974c3e461b --- /dev/null +++ b/examples/features/sub-modules/tomcat/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,41 @@ + + + + + + + org.springframework.web.context.ContextLoaderListener + + + + + contextConfigLocation + WEB-INF/application-context.xml + + + + dispatcher + org.springframework.web.servlet.DispatcherServlet + + + + dispatcher + /* + + + + \ No newline at end of file diff --git a/examples/features/sub-modules/tomcat/src/tomcat7-maven-plugin/resources/context.xml b/examples/features/sub-modules/tomcat/src/tomcat7-maven-plugin/resources/context.xml new file mode 100644 index 0000000000..9e78ccaa2b --- /dev/null +++ b/examples/features/sub-modules/tomcat/src/tomcat7-maven-plugin/resources/context.xml @@ -0,0 +1,28 @@ + + + + + + + \ No newline at end of file diff --git a/tests/jms-tests/src/test/java/org/apache/activemq/artemis/jms/tests/ReferenceableTest.java b/tests/jms-tests/src/test/java/org/apache/activemq/artemis/jms/tests/ReferenceableTest.java index 2cebf045d9..1795193bf0 100644 --- a/tests/jms-tests/src/test/java/org/apache/activemq/artemis/jms/tests/ReferenceableTest.java +++ b/tests/jms-tests/src/test/java/org/apache/activemq/artemis/jms/tests/ReferenceableTest.java @@ -25,6 +25,7 @@ import javax.jms.Session; import javax.jms.TextMessage; import javax.naming.Reference; import javax.naming.Referenceable; +import javax.naming.spi.ObjectFactory; import java.io.Serializable; import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory; @@ -32,8 +33,6 @@ import org.apache.activemq.artemis.jms.client.ActiveMQDestination; import org.apache.activemq.artemis.jms.client.ActiveMQJMSConnectionFactory; import org.apache.activemq.artemis.jms.client.ActiveMQQueue; import org.apache.activemq.artemis.jms.client.ActiveMQTopic; -import org.apache.activemq.artemis.jms.referenceable.ConnectionFactoryObjectFactory; -import org.apache.activemq.artemis.jms.referenceable.DestinationObjectFactory; import org.apache.activemq.artemis.jms.tests.util.ProxyAssertSupport; import org.junit.Test; @@ -81,7 +80,7 @@ public class ReferenceableTest extends JMSTestCase { Class factoryClass = Class.forName(factoryName); - ConnectionFactoryObjectFactory factory = (ConnectionFactoryObjectFactory) factoryClass.newInstance(); + ObjectFactory factory = (ObjectFactory) factoryClass.newInstance(); Object instance = factory.getObjectInstance(cfRef, null, null, null); @@ -100,7 +99,7 @@ public class ReferenceableTest extends JMSTestCase { Class factoryClass = Class.forName(factoryName); - DestinationObjectFactory factory = (DestinationObjectFactory) factoryClass.newInstance(); + ObjectFactory factory = (ObjectFactory) factoryClass.newInstance(); Object instance = factory.getObjectInstance(queueRef, null, null, null); @@ -121,7 +120,7 @@ public class ReferenceableTest extends JMSTestCase { Class factoryClass = Class.forName(factoryName); - DestinationObjectFactory factory = (DestinationObjectFactory) factoryClass.newInstance(); + ObjectFactory factory = (ObjectFactory) factoryClass.newInstance(); Object instance = factory.getObjectInstance(topicRef, null, null, null); diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/jms/jndi/ObjectFactoryTest.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/jms/jndi/ObjectFactoryTest.java new file mode 100644 index 0000000000..9ceebfdf14 --- /dev/null +++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/jms/jndi/ObjectFactoryTest.java @@ -0,0 +1,138 @@ +/** + * 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.activemq.artemis.tests.unit.jms.jndi; + +import static org.junit.Assert.assertEquals; + +import javax.naming.Reference; + +import org.apache.activemq.artemis.api.jms.ActiveMQJMSClient; +import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory; +import org.apache.activemq.artemis.jms.client.ActiveMQDestination; +import org.apache.activemq.artemis.jndi.JNDIReferenceFactory; +import org.apache.activemq.artemis.utils.RandomUtil; + +import org.junit.Assert; +import org.junit.Test; + +public class ObjectFactoryTest { + + @Test(timeout = 1000) + public void testConnectionFactory() throws Exception { + // Create sample connection factory + ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("vm://0"); + + String clientID = RandomUtil.randomString(); + String user = RandomUtil.randomString(); + String password = RandomUtil.randomString(); + long clientFailureCheckPeriod = RandomUtil.randomPositiveLong(); + long connectionTTL = RandomUtil.randomPositiveLong(); + long callTimeout = RandomUtil.randomPositiveLong(); + int minLargeMessageSize = RandomUtil.randomPositiveInt(); + int consumerWindowSize = RandomUtil.randomPositiveInt(); + int consumerMaxRate = RandomUtil.randomPositiveInt(); + int confirmationWindowSize = RandomUtil.randomPositiveInt(); + int producerMaxRate = RandomUtil.randomPositiveInt(); + boolean blockOnAcknowledge = RandomUtil.randomBoolean(); + boolean blockOnDurableSend = RandomUtil.randomBoolean(); + boolean blockOnNonDurableSend = RandomUtil.randomBoolean(); + boolean autoGroup = RandomUtil.randomBoolean(); + boolean preAcknowledge = RandomUtil.randomBoolean(); + String loadBalancingPolicyClassName = RandomUtil.randomString(); + boolean useGlobalPools = RandomUtil.randomBoolean(); + int scheduledThreadPoolMaxSize = RandomUtil.randomPositiveInt(); + int threadPoolMaxSize = RandomUtil.randomPositiveInt(); + long retryInterval = RandomUtil.randomPositiveLong(); + double retryIntervalMultiplier = RandomUtil.randomDouble(); + int reconnectAttempts = RandomUtil.randomPositiveInt(); + factory.setClientID(clientID); + factory.setUser(user); + factory.setPassword(password); + factory.setClientFailureCheckPeriod(clientFailureCheckPeriod); + factory.setConnectionTTL(connectionTTL); + factory.setCallTimeout(callTimeout); + factory.setMinLargeMessageSize(minLargeMessageSize); + factory.setConsumerWindowSize(consumerWindowSize); + factory.setConsumerMaxRate(consumerMaxRate); + factory.setConfirmationWindowSize(confirmationWindowSize); + factory.setProducerMaxRate(producerMaxRate); + factory.setBlockOnAcknowledge(blockOnAcknowledge); + factory.setBlockOnDurableSend(blockOnDurableSend); + factory.setBlockOnNonDurableSend(blockOnNonDurableSend); + factory.setAutoGroup(autoGroup); + factory.setPreAcknowledge(preAcknowledge); + factory.setConnectionLoadBalancingPolicyClassName(loadBalancingPolicyClassName); + factory.setUseGlobalPools(useGlobalPools); + factory.setScheduledThreadPoolMaxSize(scheduledThreadPoolMaxSize); + factory.setThreadPoolMaxSize(threadPoolMaxSize); + factory.setRetryInterval(retryInterval); + factory.setRetryIntervalMultiplier(retryIntervalMultiplier); + factory.setReconnectAttempts(reconnectAttempts); + + + // Create reference + Reference ref = JNDIReferenceFactory.createReference(factory.getClass().getName(), factory); + + // Get object created based on reference + ActiveMQConnectionFactory temp; + JNDIReferenceFactory refFactory = new JNDIReferenceFactory(); + temp = (ActiveMQConnectionFactory)refFactory.getObjectInstance(ref, null, null, null); + + // Check settings + Assert.assertEquals(clientID, temp.getClientID()); + Assert.assertEquals(user, temp.getUser()); + Assert.assertEquals(password, temp.getPassword()); + Assert.assertEquals(clientFailureCheckPeriod, temp.getClientFailureCheckPeriod()); + Assert.assertEquals(connectionTTL, temp.getConnectionTTL()); + Assert.assertEquals(callTimeout, temp.getCallTimeout()); + Assert.assertEquals(minLargeMessageSize, temp.getMinLargeMessageSize()); + Assert.assertEquals(consumerWindowSize, temp.getConsumerWindowSize()); + Assert.assertEquals(consumerMaxRate, temp.getConsumerMaxRate()); + Assert.assertEquals(confirmationWindowSize, temp.getConfirmationWindowSize()); + Assert.assertEquals(producerMaxRate, temp.getProducerMaxRate()); + Assert.assertEquals(blockOnAcknowledge, temp.isBlockOnAcknowledge()); + Assert.assertEquals(blockOnDurableSend, temp.isBlockOnDurableSend()); + Assert.assertEquals(blockOnNonDurableSend, temp.isBlockOnNonDurableSend()); + Assert.assertEquals(autoGroup, temp.isAutoGroup()); + Assert.assertEquals(preAcknowledge, temp.isPreAcknowledge()); + Assert.assertEquals(loadBalancingPolicyClassName, temp.getConnectionLoadBalancingPolicyClassName()); + Assert.assertEquals(useGlobalPools, temp.isUseGlobalPools()); + Assert.assertEquals(scheduledThreadPoolMaxSize, temp.getScheduledThreadPoolMaxSize()); + Assert.assertEquals(threadPoolMaxSize, temp.getThreadPoolMaxSize()); + Assert.assertEquals(retryInterval, temp.getRetryInterval()); + Assert.assertEquals(retryIntervalMultiplier, temp.getRetryIntervalMultiplier(), 0.0001); + Assert.assertEquals(reconnectAttempts, temp.getReconnectAttempts()); + + } + + @Test(timeout = 1000) + public void testDestination() throws Exception { + // Create sample destination + ActiveMQDestination dest = (ActiveMQDestination) ActiveMQJMSClient.createQueue(RandomUtil.randomString()); + + // Create reference + Reference ref = JNDIReferenceFactory.createReference(dest.getClass().getName(), dest); + + // Get object created based on reference + ActiveMQDestination temp; + JNDIReferenceFactory refFactory = new JNDIReferenceFactory(); + temp = (ActiveMQDestination)refFactory.getObjectInstance(ref, null, null, null); + + // Check settings + assertEquals(dest.getAddress(), temp.getAddress()); + } +} \ No newline at end of file diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/jms/jndi/StringRefAddrReferenceTest.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/jms/jndi/StringRefAddrReferenceTest.java new file mode 100644 index 0000000000..bbfbaf9fc1 --- /dev/null +++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/jms/jndi/StringRefAddrReferenceTest.java @@ -0,0 +1,119 @@ +/** + * 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.activemq.artemis.tests.unit.jms.jndi; + +import static org.junit.Assert.assertEquals; + +import javax.naming.Reference; +import javax.naming.StringRefAddr; +import javax.naming.spi.ObjectFactory; +import java.util.Enumeration; +import java.util.Properties; + +import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory; +import org.apache.activemq.artemis.jms.client.ActiveMQQueue; +import org.apache.activemq.artemis.jms.client.ActiveMQTopic; +import org.apache.activemq.artemis.jndi.JNDIReferenceFactory; +import org.junit.Test; + +/** + * Test to simulate JNDI references created using String properties in containers such as Apache Tomcat. + */ +public class StringRefAddrReferenceTest { + + private static final String FACTORY = "factory"; + private static final String TYPE = "type"; + + @Test(timeout = 10000) + public void testActiveMQQueueFromPropertiesJNDI() throws Exception { + Properties properties = new Properties(); + properties.setProperty(TYPE, ActiveMQQueue.class.getName()); + properties.setProperty(FACTORY, JNDIReferenceFactory.class.getName()); + + String address = "foo.bar.queue"; + + properties.setProperty("address", address); + + Reference reference = from(properties); + ActiveMQQueue object = getObject(reference, ActiveMQQueue.class); + + assertEquals(address, object.getAddress()); + + } + + @Test(timeout = 10000) + public void testActiveMQTopicFromPropertiesJNDI() throws Exception { + Properties properties = new Properties(); + properties.setProperty(TYPE, ActiveMQTopic.class.getName()); + properties.setProperty(FACTORY, JNDIReferenceFactory.class.getName()); + + String address = "foo.bar.topic"; + + properties.setProperty("address", address); + + Reference reference = from(properties); + ActiveMQTopic object = getObject(reference, ActiveMQTopic.class); + + assertEquals(address, object.getAddress()); + + } + + @Test(timeout = 10000) + public void testActiveMQConnectionFactoryFromPropertiesJNDI() throws Exception { + Properties properties = new Properties(); + properties.setProperty(TYPE, ActiveMQConnectionFactory.class.getName()); + properties.setProperty(FACTORY, JNDIReferenceFactory.class.getName()); + + String brokerURL = "vm://0"; + String connectionTTL = "1000"; + String preAcknowledge = "true"; + + properties.setProperty("brokerURL", brokerURL); + properties.setProperty("connectionTTL", connectionTTL); + properties.setProperty("preAcknowledge", preAcknowledge); + + Reference reference = from(properties); + ActiveMQConnectionFactory object = getObject(reference, ActiveMQConnectionFactory.class); + + assertEquals(Long.parseLong(connectionTTL), object.getConnectionTTL()); + assertEquals(Boolean.parseBoolean(preAcknowledge), object.isPreAcknowledge()); + + } + + private T getObject(Reference reference, Class tClass) throws Exception { + String factoryName = reference.getFactoryClassName(); + Class factoryClass = Class.forName(factoryName); + ObjectFactory factory = (ObjectFactory) factoryClass.newInstance(); + Object o = factory.getObjectInstance(reference, null, null, null); + if (tClass.isAssignableFrom(tClass)) { + return tClass.cast(o); + } else { + throw new IllegalStateException("Expected class, " + tClass.getName()); + } + } + + public Reference from(Properties properties) { + String type = (String) properties.remove("type"); + String factory = (String) properties.remove("factory"); + Reference result = new Reference(type, factory, null); + for (Enumeration iter = properties.propertyNames(); iter.hasMoreElements();) { + String key = (String)iter.nextElement(); + result.add(new StringRefAddr(key, properties.getProperty(key))); + } + return result; + } +} diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/ra/ConnectionFactoryPropertiesTest.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/ra/ConnectionFactoryPropertiesTest.java index b3ed958e5c..3901e1b43f 100644 --- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/ra/ConnectionFactoryPropertiesTest.java +++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/ra/ConnectionFactoryPropertiesTest.java @@ -43,6 +43,9 @@ public class ConnectionFactoryPropertiesTest extends ActiveMQTestBase { UNSUPPORTED_CF_PROPERTIES.add("discoveryGroupName"); UNSUPPORTED_CF_PROPERTIES.add("incomingInterceptorList"); UNSUPPORTED_CF_PROPERTIES.add("outgoingInterceptorList"); + UNSUPPORTED_CF_PROPERTIES.add("user"); + UNSUPPORTED_CF_PROPERTIES.add("userName"); + UNSUPPORTED_CF_PROPERTIES.add("password"); UNSUPPORTED_RA_PROPERTIES = new TreeSet<>(); UNSUPPORTED_RA_PROPERTIES.add("HA"); @@ -62,6 +65,7 @@ public class ConnectionFactoryPropertiesTest extends ActiveMQTestBase { UNSUPPORTED_RA_PROPERTIES.add("useMaskedPassword"); UNSUPPORTED_RA_PROPERTIES.add("useAutoRecovery"); UNSUPPORTED_RA_PROPERTIES.add("useLocalTx"); + UNSUPPORTED_RA_PROPERTIES.add("user"); UNSUPPORTED_RA_PROPERTIES.add("userName"); UNSUPPORTED_RA_PROPERTIES.add("jgroupsChannelLocatorClass"); UNSUPPORTED_RA_PROPERTIES.add("jgroupsChannelRefName"); diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/jms/referenceable/DestinationObjectFactoryTest.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/ra/referenceable/DestinationObjectFactoryTest.java similarity index 88% rename from tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/jms/referenceable/DestinationObjectFactoryTest.java rename to tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/ra/referenceable/DestinationObjectFactoryTest.java index 7bbbf31c75..fedcfd90e7 100644 --- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/jms/referenceable/DestinationObjectFactoryTest.java +++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/ra/referenceable/DestinationObjectFactoryTest.java @@ -14,13 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.activemq.artemis.tests.unit.jms.referenceable; +package org.apache.activemq.artemis.tests.unit.ra.referenceable; import javax.naming.Reference; +import javax.naming.spi.ObjectFactory; import org.apache.activemq.artemis.api.jms.ActiveMQJMSClient; import org.apache.activemq.artemis.jms.client.ActiveMQDestination; -import org.apache.activemq.artemis.jms.referenceable.DestinationObjectFactory; import org.apache.activemq.artemis.tests.util.ActiveMQTestBase; import org.apache.activemq.artemis.utils.RandomUtil; import org.junit.Assert; @@ -41,8 +41,9 @@ public class DestinationObjectFactoryTest extends ActiveMQTestBase { public void testReference() throws Exception { ActiveMQDestination queue = (ActiveMQDestination) ActiveMQJMSClient.createQueue(RandomUtil.randomString()); Reference reference = queue.getReference(); - - DestinationObjectFactory factory = new DestinationObjectFactory(); + String factoryName = reference.getFactoryClassName(); + Class factoryClass = Class.forName(factoryName); + ObjectFactory factory = (ObjectFactory) factoryClass.newInstance(); Object object = factory.getObjectInstance(reference, null, null, null); Assert.assertNotNull(object); Assert.assertTrue(object instanceof ActiveMQDestination);