diff --git a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/messages/ConnectionAbstract.java b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/messages/ConnectionAbstract.java index d463566657..e01f987b5e 100644 --- a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/messages/ConnectionAbstract.java +++ b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/messages/ConnectionAbstract.java @@ -163,8 +163,7 @@ public class ConnectionAbstract extends InputAbstract { } catch (JMSSecurityException e) { // if a security exception will get the user and password through an input context.err.println("Connection failed::" + e.getMessage()); - userPassword(); - cf = new JmsConnectionFactory(user, password, brokerURL); + cf = new JmsConnectionFactory(inputUser(user), inputPassword(password), brokerURL); if (clientID != null) { cf.setClientID(clientID); } @@ -172,9 +171,7 @@ public class ConnectionAbstract extends InputAbstract { } catch (JMSException e) { // if a connection exception will ask for the URL, user and password context.err.println("Connection failed::" + e.getMessage()); - brokerURL = input("--url", "Type in the broker URL for a retry (e.g. tcp://localhost:61616)", brokerURL); - userPassword(); - cf = new JmsConnectionFactory(user, password, brokerURL); + cf = new JmsConnectionFactory(inputUser(user), inputPassword(password), inputBrokerURL(brokerURL)); if (clientID != null) { cf.setClientID(clientID); } @@ -204,8 +201,7 @@ public class ConnectionAbstract extends InputAbstract { if (context != null) { context.err.println("Connection failed::" + e.getMessage()); } - userPassword(); - cf = new ActiveMQConnectionFactory(brokerURL, user, password); + cf = new ActiveMQConnectionFactory(brokerURL, inputUser(user), inputPassword(password)); if (clientID != null) { cf.setClientID(clientID); } @@ -215,9 +211,7 @@ public class ConnectionAbstract extends InputAbstract { if (context != null) { context.err.println("Connection failed::" + e.getMessage()); } - brokerURL = input("--url", "Type in the broker URL for a retry (e.g. tcp://localhost:61616)", brokerURL); - userPassword(); - cf = new ActiveMQConnectionFactory(brokerURL, user, password); + cf = new ActiveMQConnectionFactory(inputBrokerURL(brokerURL), inputUser(user), inputPassword(password)); if (clientID != null) { cf.setClientID(clientID); } @@ -225,13 +219,21 @@ public class ConnectionAbstract extends InputAbstract { } } - private void userPassword() { + private String inputBrokerURL(String defaultValue) { + return input("--url", "Type in the broker URL for a retry (e.g. tcp://localhost:61616)", defaultValue); + } + + private String inputUser(String user) { if (user == null) { user = input("--user", "Type the username for a retry", null); } + return user; + } + + private String inputPassword(String password) { if (password == null) { password = inputPassword("--password", "Type the password for a retry", null); } + return password; } - } diff --git a/artemis-cli/src/test/java/org/apache/activemq/cli/test/ArtemisTest.java b/artemis-cli/src/test/java/org/apache/activemq/cli/test/ArtemisTest.java index 745dce07d6..cdaa19686e 100644 --- a/artemis-cli/src/test/java/org/apache/activemq/cli/test/ArtemisTest.java +++ b/artemis-cli/src/test/java/org/apache/activemq/cli/test/ArtemisTest.java @@ -40,6 +40,7 @@ import java.io.BufferedWriter; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.nio.file.Files; @@ -1266,6 +1267,37 @@ public class ArtemisTest extends CliTestBase { testSimpleRun("server"); } + @Test + public void testOperationRetry() throws Exception { + File instanceFolder = temporaryFolder.newFolder("server"); + setupAuth(instanceFolder); + Run.setEmbedded(true); + Artemis.main("create", instanceFolder.getAbsolutePath(), "--verbose", "--force", "--silent", "--no-web", "--queues", "q1", "--no-autotune", "--require-login", "--default-port", "61616"); + System.setProperty("artemis.instance", instanceFolder.getAbsolutePath()); + + try { + Artemis.internalExecute("run"); + InputStream in = new ByteArrayInputStream("admin\n".getBytes()); + ActionContext context = new ActionContext(in, System.out, System.err); + + /* + * This operation should fail the first time and then prompt the user to re-enter the username which + * it will read from the InputStream in the ActionContext. It can't read the password since it's using + * System.console.readPassword() for that. + */ + assertEquals(Integer.valueOf(100), Artemis.internalExecute(null, null, new String[] {"producer", "--destination", "queue://q1", "--message-count", "100", "--password", "admin"}, context)); + + /* + * This is the same as above except it will prompt the user to re-enter both the URL and the username. + */ + in = new ByteArrayInputStream("tcp://localhost:61616\nadmin\n".getBytes()); + context = new ActionContext(in, System.out, System.err); + assertEquals(Integer.valueOf(100), Artemis.internalExecute(null, null, new String[] {"producer", "--destination", "queue://q1", "--message-count", "100", "--password", "admin", "--url", "tcp://badhost:11111"}, context)); + } finally { + stopServer(); + } + } + @Test public void testWeirdCharacter() throws Exception { testSimpleRun("test%26%26x86_6");