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

Reply via email to