diff --git a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/DBOption.java b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/DBOption.java
index 11da856bbc..919404b406 100644
--- a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/DBOption.java
+++ b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/DBOption.java
@@ -93,6 +93,12 @@ public class DBOption extends OptionalLocking {
@Option(names = "--jdbc-driver-class-name", description = "JDBC driver classname.")
private String jdbcClassName = ActiveMQDefaultConfiguration.getDefaultDriverClassName();
+ @Option(names = "--jdbc-user", description = "JDBC username.")
+ private String jdbcUser = null;
+
+ @Option(names = "--jdbc-password", description = "JDBC password.")
+ private String jdbcPassword = null;
+
public boolean isJDBC() throws Exception {
parseDBConfig();
return jdbc;
@@ -177,6 +183,23 @@ public class DBOption extends OptionalLocking {
return this;
}
+ public String getJdbcUser() {
+ return jdbcUser;
+ }
+
+ public DBOption setJdbcUser(String jdbcUser) {
+ this.jdbcUser = jdbcUser;
+ return this;
+ }
+
+ public String getJdbcPassword() {
+ return jdbcPassword;
+ }
+
+ public DBOption setJdbcPassword(String jdbcPassword) {
+ this.jdbcPassword = jdbcPassword;
+ return this;
+ }
@Override
public Object execute(ActionContext context) throws Exception {
@@ -217,8 +240,21 @@ public class DBOption extends OptionalLocking {
jdbcLargeMessages = storageConfiguration.getLargeMessageTableName();
jdbcPageStore = storageConfiguration.getPageStoreTableName();
jdbcNodeManager = storageConfiguration.getNodeManagerStoreTableName();
- jdbcURL = storageConfiguration.getJdbcConnectionUrl();
- jdbcClassName = storageConfiguration.getJdbcDriverClassName();
+
+ if (jdbcURL == null || jdbcURL.equals(ActiveMQDefaultConfiguration.getDefaultDatabaseUrl())) {
+ jdbcURL = storageConfiguration.getJdbcConnectionUrl();
+ }
+
+ if (jdbcClassName == null || jdbcClassName.equals(ActiveMQDefaultConfiguration.getDefaultDriverClassName())) {
+ jdbcClassName = storageConfiguration.getJdbcDriverClassName();
+ }
+
+ if (jdbcUser == null) {
+ jdbcUser = storageConfiguration.getJdbcUser();
+ }
+ if (jdbcPassword == null) {
+ jdbcPassword = storageConfiguration.getJdbcPassword();
+ }
}
}
}
@@ -235,6 +271,8 @@ public class DBOption extends OptionalLocking {
storageConfiguration.setLargeMessageTableName(getJdbcLargeMessages());
storageConfiguration.setPageStoreTableName(getJdbcPageStore());
storageConfiguration.setNodeManagerStoreTableName(getJdbcNodeManager());
+ storageConfiguration.setJdbcUser(getJdbcUser());
+ storageConfiguration.setJdbcPassword(getJdbcPassword());
configuration.setStoreConfiguration(storageConfiguration);
} else {
configuration.setBindingsDirectory(getBinding());
diff --git a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/FileUtil.java b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/FileUtil.java
index 191bb1c362..c7fd65c213 100644
--- a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/FileUtil.java
+++ b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/FileUtil.java
@@ -100,4 +100,30 @@ public class FileUtil {
}
});
}
+
+
+ /**
+ * Search and replace strings on a file
+ *
+ * @param file file to be replaced
+ * @param find string expected to match
+ * @param replace string to be replaced
+ * @return true if the replacement was successful
+ * @throws Exception
+ */
+ public static boolean findReplace(File file, String find, String replace) throws Exception {
+ if (!file.exists()) {
+ return false;
+ }
+
+ String original = Files.readString(file.toPath());
+ String newContent = original.replace(find, replace);
+ if (!original.equals(newContent)) {
+ Files.writeString(file.toPath(), newContent);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
}
diff --git a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/file/JDBCSequentialFileFactory.java b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/file/JDBCSequentialFileFactory.java
index 73b82f252f..77791f59f1 100644
--- a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/file/JDBCSequentialFileFactory.java
+++ b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/file/JDBCSequentialFileFactory.java
@@ -74,7 +74,12 @@ public class JDBCSequentialFileFactory implements SequentialFileFactory, ActiveM
try {
this.dbDriver = JDBCFileUtils.getDBFileDriver(connectionProvider, sqlProvider);
} catch (SQLException e) {
- criticalErrorListener.onIOException(e, "Failed to start JDBC Driver", null);
+ logger.warn(e.getMessage(), e);
+ if (criticalErrorListener != null) {
+ criticalErrorListener.onIOException(e, "Failed to start JDBC Driver", null);
+ } else {
+ throw new RuntimeException(e.getMessage(), e);
+ }
}
}
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/JDBCJournalStorageManager.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/JDBCJournalStorageManager.java
index 9d129adb17..f971a271c6 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/JDBCJournalStorageManager.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/JDBCJournalStorageManager.java
@@ -98,7 +98,11 @@ public class JDBCJournalStorageManager extends JournalStorageManager {
largeMessagesFactory.start();
} catch (Exception e) {
logger.warn(e.getMessage(), e);
- criticalErrorListener.onIOException(e, e.getMessage(), null);
+ if (criticalErrorListener != null) {
+ criticalErrorListener.onIOException(e, e.getMessage(), null);
+ } else {
+ throw new RuntimeException(e.getMessage(), e);
+ }
}
}
diff --git a/tests/artemis-test-support/src/main/java/org/apache/activemq/artemis/utils/RealServerTestBase.java b/tests/artemis-test-support/src/main/java/org/apache/activemq/artemis/utils/RealServerTestBase.java
index 81858c11ef..b31981f018 100644
--- a/tests/artemis-test-support/src/main/java/org/apache/activemq/artemis/utils/RealServerTestBase.java
+++ b/tests/artemis-test-support/src/main/java/org/apache/activemq/artemis/utils/RealServerTestBase.java
@@ -31,7 +31,6 @@ import java.io.IOException;
import java.io.OutputStream;
import java.lang.invoke.MethodHandles;
import java.net.MalformedURLException;
-import java.nio.file.Files;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
@@ -62,22 +61,6 @@ public class RealServerTestBase extends ActiveMQTestBase {
public static final String basedir = System.getProperty("basedir");
- /**
- * Search and replace strings on a file
- *
- * @param file file to be replaced
- * @param find string expected to match
- * @param replace string to be replaced
- * @return true if the replacement was successful
- * @throws Exception
- */
- public static boolean findReplace(File file, String find, String replace) throws Exception {
- String original = Files.readString(file.toPath());
- String newContent = original.replace(find, replace);
- Files.writeString(file.toPath(), newContent);
- return !original.equals(newContent);
- }
-
@After
public void after() throws Exception {
// close ServerLocators before killing the server otherwise they'll hang and delay test termination
diff --git a/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/jdbccli/JDBCExportWrongUserTest.java b/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/jdbccli/JDBCExportWrongUserTest.java
new file mode 100644
index 0000000000..1bf8a0d184
--- /dev/null
+++ b/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/jdbccli/JDBCExportWrongUserTest.java
@@ -0,0 +1,79 @@
+/*
+ * 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.smoke.jdbccli;
+
+import java.io.File;
+
+import org.apache.activemq.artemis.cli.commands.tools.DBOption;
+import org.apache.activemq.artemis.core.config.Configuration;
+import org.apache.activemq.artemis.core.config.storage.DatabaseStorageConfiguration;
+import org.apache.activemq.artemis.tests.smoke.common.SmokeTestBase;
+import org.apache.activemq.artemis.utils.FileUtil;
+import org.apache.activemq.artemis.utils.RandomUtil;
+import org.apache.activemq.artemis.utils.cli.helper.HelperCreate;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class JDBCExportWrongUserTest extends SmokeTestBase {
+
+ @Test
+ public void testUserNameAndPasswordCaptured() throws Exception {
+
+ String serverConfigName = "JDBCExportWrongUserTest";
+
+ File server0Location = getFileServerLocation(serverConfigName);
+ deleteDirectory(server0Location);
+
+ runAfter(() -> deleteDirectory(server0Location));
+
+ HelperCreate cliCreateServer = new HelperCreate();
+ cliCreateServer.setUser("admin").setPassword("admin").setAllowAnonymous(true).setNoWeb(true).setArtemisInstance(server0Location).addArgs("--jdbc", "--jdbc-connection-url", "fakeOne");
+ cliCreateServer.createServer();
+
+ File artemisInstance = getFileServerLocation(serverConfigName);
+
+ String user = RandomUtil.randomString();
+ String password = RandomUtil.randomString();
+
+ Assert.assertTrue(FileUtil.findReplace(new File(artemisInstance, "/etc/broker.xml"), "", " " + user + "\n" + " " + password + "\n" + " "));
+
+ {
+ DBOption dbOption = new DBOption();
+ dbOption.setHomeValues(cliCreateServer.getArtemisHome(), artemisInstance, new File(artemisInstance, "/etc"));
+
+ Configuration configuration = dbOption.getParameterConfiguration();
+
+ Assert.assertEquals(user, ((DatabaseStorageConfiguration) configuration.getStoreConfiguration()).getJdbcUser());
+ Assert.assertEquals(password, ((DatabaseStorageConfiguration) configuration.getStoreConfiguration()).getJdbcPassword());
+ Assert.assertEquals(user, dbOption.getJdbcUser());
+ Assert.assertEquals(password, dbOption.getJdbcPassword());
+ }
+
+ {
+ DBOption dbOption = new DBOption();
+ dbOption.setHomeValues(cliCreateServer.getArtemisHome(), artemisInstance, new File(artemisInstance, "/etc"));
+ dbOption.setJdbcUser("myNewUser").setJdbcPassword("myNewPassword").setJdbcClassName("myClass").setJdbcURL("myURL");
+ Configuration config = dbOption.getParameterConfiguration();
+ Assert.assertEquals("myNewUser", ((DatabaseStorageConfiguration) config.getStoreConfiguration()).getJdbcUser());
+ Assert.assertEquals("myNewPassword", ((DatabaseStorageConfiguration) config.getStoreConfiguration()).getJdbcPassword());
+ Assert.assertEquals("myURL", ((DatabaseStorageConfiguration) config.getStoreConfiguration()).getJdbcConnectionUrl());
+ Assert.assertEquals("myClass", ((DatabaseStorageConfiguration) config.getStoreConfiguration()).getJdbcDriverClassName());
+ }
+ }
+
+}
diff --git a/tests/soak-tests/src/test/java/org/apache/activemq/artemis/tests/soak/brokerConnection/mirror/ClusteredMirrorSoakTest.java b/tests/soak-tests/src/test/java/org/apache/activemq/artemis/tests/soak/brokerConnection/mirror/ClusteredMirrorSoakTest.java
index fd92be3380..0964050f0c 100644
--- a/tests/soak-tests/src/test/java/org/apache/activemq/artemis/tests/soak/brokerConnection/mirror/ClusteredMirrorSoakTest.java
+++ b/tests/soak-tests/src/test/java/org/apache/activemq/artemis/tests/soak/brokerConnection/mirror/ClusteredMirrorSoakTest.java
@@ -44,6 +44,7 @@ import org.apache.activemq.artemis.tests.soak.SoakTestBase;
import org.apache.activemq.artemis.tests.util.CFUtil;
import org.apache.activemq.artemis.tests.util.RandomUtil;
import org.apache.activemq.artemis.util.ServerUtil;
+import org.apache.activemq.artemis.utils.FileUtil;
import org.apache.activemq.artemis.utils.Wait;
import org.apache.activemq.artemis.utils.cli.helper.HelperCreate;
import org.junit.Assert;
@@ -111,7 +112,7 @@ public class ClusteredMirrorSoakTest extends SoakTestBase {
File brokerXml = new File(serverLocation, "/etc/broker.xml");
Assert.assertTrue(brokerXml.exists());
// Adding redistribution delay to broker configuration
- Assert.assertTrue(findReplace(brokerXml, "", "\n\n" + " 0 \n"));
+ Assert.assertTrue(FileUtil.findReplace(brokerXml, "", "\n\n" + " 0 \n"));
}
@BeforeClass
diff --git a/tests/soak-tests/src/test/java/org/apache/activemq/artemis/tests/soak/brokerConnection/mirror/InterruptedLargeMessageTest.java b/tests/soak-tests/src/test/java/org/apache/activemq/artemis/tests/soak/brokerConnection/mirror/InterruptedLargeMessageTest.java
index 88fa0098c0..2173258372 100644
--- a/tests/soak-tests/src/test/java/org/apache/activemq/artemis/tests/soak/brokerConnection/mirror/InterruptedLargeMessageTest.java
+++ b/tests/soak-tests/src/test/java/org/apache/activemq/artemis/tests/soak/brokerConnection/mirror/InterruptedLargeMessageTest.java
@@ -41,6 +41,7 @@ import org.apache.activemq.artemis.core.server.impl.AddressInfo;
import org.apache.activemq.artemis.tests.soak.SoakTestBase;
import org.apache.activemq.artemis.tests.util.CFUtil;
import org.apache.activemq.artemis.util.ServerUtil;
+import org.apache.activemq.artemis.utils.FileUtil;
import org.apache.activemq.artemis.utils.Wait;
import org.apache.activemq.artemis.utils.cli.helper.HelperCreate;
import org.junit.Assert;
@@ -123,7 +124,7 @@ public class InterruptedLargeMessageTest extends SoakTestBase {
insert = insertWriter.toString();
}
- Assert.assertTrue(findReplace(new File(getServerLocation(serverName), "./etc/broker.xml"), "", insert));
+ Assert.assertTrue(FileUtil.findReplace(new File(getServerLocation(serverName), "./etc/broker.xml"), "", insert));
}
@BeforeClass