This is an automated email from the ASF dual-hosted git repository. robbie pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/qpid-jms.git
The following commit(s) were added to refs/heads/main by this push: new 531a48e QPIDJMS-542: allow setting URI used for default connection factories via the context provider url property. 531a48e is described below commit 531a48eb4edfb609df6a054d999296e6b65ce53f Author: Robbie Gemmell <rob...@apache.org> AuthorDate: Mon Jun 28 14:36:02 2021 +0100 QPIDJMS-542: allow setting URI used for default connection factories via the context provider url property. Alternative impl with tests based in part on those from Michael Andre Pearce <michael.andre.pea...@me.com> in PR. This closes #41. --- .../qpid/jms/jndi/JmsInitialContextFactory.java | 23 ++++++++++- .../jms/jndi/JmsInitialContextFactoryTest.java | 47 ++++++++++++++++++++++ 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/qpid-jms-client/src/main/java/org/apache/qpid/jms/jndi/JmsInitialContextFactory.java b/qpid-jms-client/src/main/java/org/apache/qpid/jms/jndi/JmsInitialContextFactory.java index e55970c..a5d4e83 100644 --- a/qpid-jms-client/src/main/java/org/apache/qpid/jms/jndi/JmsInitialContextFactory.java +++ b/qpid-jms-client/src/main/java/org/apache/qpid/jms/jndi/JmsInitialContextFactory.java @@ -16,10 +16,13 @@ */ package org.apache.qpid.jms.jndi; +import static org.apache.qpid.jms.JmsConnectionFactory.REMOTE_URI_PROP; + import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; import java.net.MalformedURLException; +import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.Collections; @@ -40,6 +43,7 @@ import javax.naming.spi.InitialContextFactory; import org.apache.qpid.jms.JmsConnectionFactory; import org.apache.qpid.jms.JmsQueue; import org.apache.qpid.jms.JmsTopic; +import org.apache.qpid.jms.provider.ProviderFactory; import org.apache.qpid.jms.util.VariableExpansion; public class JmsInitialContextFactory implements InitialContextFactory { @@ -61,7 +65,6 @@ public class JmsInitialContextFactory implements InitialContextFactory { Hashtable<Object, Object> environmentCopy = new Hashtable<Object, Object>(); environmentCopy.putAll(environment); - // Check for an *optional* properties file use to augment the environment String location = null; if (environmentCopy.containsKey(Context.PROVIDER_URL)) { location = (String) environment.get(Context.PROVIDER_URL); @@ -69,8 +72,24 @@ public class JmsInitialContextFactory implements InitialContextFactory { location = System.getProperty(Context.PROVIDER_URL); } + // If present, check if PROVIDER_URL is a client URI, by seeing if we find a factory for it. + // If we do, set it as the URI to be used for the default connection factories. + boolean providerUri = false; + if (location != null) { + try { + String expanded = expand(location, environmentCopy); + if (ProviderFactory.findProviderFactory(new URI(expanded)) != null) { + environmentCopy.put(CONNECTION_FACTORY_DEFAULT_KEY_PREFIX + REMOTE_URI_PROP, expanded); + providerUri = true; + } + } catch (IOException | URISyntaxException e) { + // Not a valid URI or didnt find a client factory for it. + } + } + try { - if (location != null) { + // If it wasnt a client URI, check for *optional* properties file to augment given environment + if (!providerUri && location != null) { BufferedInputStream inputStream; try { diff --git a/qpid-jms-client/src/test/java/org/apache/qpid/jms/jndi/JmsInitialContextFactoryTest.java b/qpid-jms-client/src/test/java/org/apache/qpid/jms/jndi/JmsInitialContextFactoryTest.java index ee7bf74..e67a284 100644 --- a/qpid-jms-client/src/test/java/org/apache/qpid/jms/jndi/JmsInitialContextFactoryTest.java +++ b/qpid-jms-client/src/test/java/org/apache/qpid/jms/jndi/JmsInitialContextFactoryTest.java @@ -616,4 +616,51 @@ public class JmsInitialContextFactoryTest extends QpidJmsTestCase { assertEquals("Unexpected name for returned queue", variableValue, ((JmsTopic) o).getTopicName()); } + + @Test + public void testVariableExpansionWhenDefaultFactoryUriSetViaProviderURL() throws NamingException { + String variable = "myTestHostnameVariable"; + String hostValue = "myTestHostnameValue"; + + setTestSystemProperty(variable, hostValue); + + doSetDefaultFactoryUriViaProviderURLTestImpl("amqp://${"+ variable +"}:5672", "amqp://"+ hostValue +":5672"); + doSetDefaultFactoryUriViaProviderURLTestImpl("amqps://${" + variable +"}:5672", "amqps://" + hostValue +":5672"); + doSetDefaultFactoryUriViaProviderURLTestImpl("failover:(amqp://${"+ variable +"}1:5672,amqp://${"+ variable +"}2:5672)", + "failover:(amqp://"+ hostValue +"1:5672,amqp://"+ hostValue +"2:5672)"); + doSetDefaultFactoryUriViaProviderURLTestImpl("failover:(amqps://${"+ variable +"}1:5672,amqps://${"+ variable +"}2:5672)", + "failover:(amqps://"+ hostValue +"1:5672,amqps://"+ hostValue +"2:5672)"); + } + + private void doSetDefaultFactoryUriViaProviderURLTestImpl(String providerUrl, String expectedUrl) throws NamingException { + Properties env = new Properties(); + env.setProperty(Context.INITIAL_CONTEXT_FACTORY, JmsInitialContextFactory.class.getName()); + env.setProperty(Context.PROVIDER_URL, providerUrl); + + Context context = createInitialContext(env); + + ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("ConnectionFactory"); + ConnectionFactory queueConnectionFactory = (ConnectionFactory) context.lookup("QueueConnectionFactory"); + ConnectionFactory topicConnectionFactory = (ConnectionFactory) context.lookup("TopicConnectionFactory"); + + assertTrue(connectionFactory instanceof JmsConnectionFactory); + assertTrue(queueConnectionFactory instanceof JmsConnectionFactory); + assertTrue(topicConnectionFactory instanceof JmsConnectionFactory); + + assertEquals(expectedUrl, ((JmsConnectionFactory) connectionFactory).getRemoteURI()); + assertEquals(expectedUrl, ((JmsConnectionFactory) queueConnectionFactory).getRemoteURI()); + assertEquals(expectedUrl, ((JmsConnectionFactory) topicConnectionFactory).getRemoteURI()); + } + + private void doSetDefaultFactoryUriViaProviderURLTestImpl(String providerUrl) throws NamingException { + doSetDefaultFactoryUriViaProviderURLTestImpl(providerUrl, providerUrl); + } + + @Test + public void testProvidingDefaultFactoryRemoteUriViaProviderURL() throws NamingException { + doSetDefaultFactoryUriViaProviderURLTestImpl("amqp://host1:5672"); + doSetDefaultFactoryUriViaProviderURLTestImpl("amqps://host1:5672"); + doSetDefaultFactoryUriViaProviderURLTestImpl("failover:(amqp://host1:5672,amqp://host2:5672)"); + doSetDefaultFactoryUriViaProviderURLTestImpl("failover:(amqps://host1:5672,amqps://host2:5672)"); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org