This is an automated email from the ASF dual-hosted git repository.

clebertsuconic pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/artemis.git


The following commit(s) were added to refs/heads/main by this push:
     new bd2ea56ab2 ARTEMIS-5863 use empty string for null values to match 
properties files conventions and retain keys that have null values
bd2ea56ab2 is described below

commit bd2ea56ab2fc81e13cffb79206b60120bb33301d
Author: Gary Tully <[email protected]>
AuthorDate: Thu Jan 29 12:39:26 2026 +0000

    ARTEMIS-5863 use empty string for null values to match properties files 
conventions and retain keys that have null values
---
 .../artemis/core/config/impl/ConfigurationImpl.java  | 16 ++++++++--------
 .../core/config/impl/ConfigurationImplTest.java      | 20 ++++++++++++++++++++
 2 files changed, 28 insertions(+), 8 deletions(-)

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 4bb27eeef8..85e21296e9 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
@@ -1108,12 +1108,9 @@ public class ConfigurationImpl extends 
javax.security.auth.login.Configuration i
                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)) {
@@ -1172,8 +1169,8 @@ public class ConfigurationImpl extends 
javax.security.auth.login.Configuration i
             }
          });
       } 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));
       }
    }
 
@@ -1193,6 +1190,9 @@ public class ConfigurationImpl extends 
javax.security.auth.login.Configuration i
    }
 
    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 7bf060f156..94b0d234ad 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
@@ -34,11 +34,13 @@ import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.FileInputStream;
 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;
@@ -3043,8 +3045,26 @@ public class ConfigurationImplTest extends 
AbstractConfigurationTestBase {
 
       // 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"));
    }
 
    /**


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to