diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java index b74f6596dfa..989693d502b 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java @@ -1105,12 +1105,9 @@ private void export(BeanUtilsBean beanUtils, Stack nested, BufferedWrite stream = stream.filter((Map.Entry entry)-> filterOn.isAssignableFrom(entry.getClass())); } stream.forEach(entry -> { - if (entry.getValue() != null) { - // nested by name - nested.push(String.valueOf(entry.getKey())); - export(beanUtils, nested, bufferedWriter, entry.getValue()); - nested.pop(); - } + nested.push(String.valueOf(entry.getKey())); + export(beanUtils, nested, bufferedWriter, entry.getValue()); + nested.pop(); }); } } else if (isComplexConfigObject(value)) { @@ -1169,8 +1166,8 @@ private void export(BeanUtilsBean beanUtils, Stack nested, BufferedWrite } }); } else { - // string form works ok otherwise - exportKeyValue(nested, bufferedWriter, String.valueOf(value)); + // string form works ok otherwise, however we want an empty string for null to match properties syntax + exportKeyValue(nested, bufferedWriter, value == null ? "" : String.valueOf(value)); } } @@ -1190,6 +1187,9 @@ private void exportKeyValue(Stack nested, BufferedWriter bufferedWriter, } private boolean isComplexConfigObject(Object value) { + if (value == null) { + return false; + } return !(value instanceof SimpleString || value instanceof Enum) && value.getClass().getPackage().getName().contains("artemis"); } diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java index 8987868d028..44cfd5be838 100644 --- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java +++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java @@ -32,11 +32,13 @@ import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileOutputStream; +import java.io.InputStream; import java.io.PrintWriter; import java.io.StringReader; import java.lang.invoke.MethodHandles; import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -3040,8 +3042,26 @@ public void testExportInvalidPropertyOnAcceptor() throws Exception { // useKQueue here would generate a hashMap Value null, what would break the exportAsProperties. configuration.addAcceptorConfiguration("test", "tcp://0.0.0.0:61616?useKQueue"); + + assertTrue(configuration.getAcceptorConfigurations().stream().findFirst().get().getCombinedParams().containsKey("useKQueue")); + // org.apache.activemq.artemis.utils.uri.URISchema.parseQuery generated the null on trimming the value + assertEquals(null, configuration.getAcceptorConfigurations().stream().findFirst().get().getCombinedParams().get("useKQueue")); + File fileOutput = new File(getTestDirfile(), "broker.properties"); assertDoesNotThrow(() -> configuration.exportAsProperties(fileOutput)); + Properties properties = new Properties(); + try (InputStream inStream = Files.newInputStream(fileOutput.toPath())) { + properties.load(inStream); + } + assertFalse(properties.isEmpty()); + assertTrue(properties.containsKey("acceptorConfigurations.test.params.useKQueue")); + assertEquals("", properties.get("acceptorConfigurations.test.params.useKQueue")); + + // a null value is not an option for properties + properties.put("networCheckNIC", ""); + configuration.parsePrefixedProperties(properties, null); + assertEquals(1, configuration.getAcceptorConfigurations().size()); + assertEquals("", configuration.getAcceptorConfigurations().stream().findFirst().get().getCombinedParams().get("useKQueue")); } /**