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 85e21296e95..50d2ee9e224 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 @@ -1049,12 +1049,13 @@ private void writeProperties(FileWriter writer) throws Exception { } } - final Set ignored = Set.of( + static final Set defaultIgnoredForExportProperties = Set.of( // we report errors through the status, it should not typically be set "status", // we cannot import a map> property and this feature is only applied by the xml parser "securityRoleNameMappings", - // another xml ism using a deprecated config object + // using a deprecated config object + "queueConfigurations", "queueConfigs", "encodeSize", // duplicates @@ -1072,6 +1073,19 @@ private void writeProperties(FileWriter writer) throws Exception { // and connectionElements need to be split "connectionElements" ); + + static Map> ignoredByType = Map.of( + CoreAddressConfiguration.class, Set.of("queueConfigurations") + ); + + static boolean isIgnored(Class clazz, PropertyDescriptor descriptor) { + Set ignoredByTypeSet = ignoredByType.get(clazz); + if (ignoredByTypeSet != null) { + return ignoredByTypeSet.contains(descriptor.getName()); + } + return defaultIgnoredForExportProperties.contains(descriptor.getName()); + } + private void export(BeanUtilsBean beanUtils, Stack nested, BufferedWriter bufferedWriter, Object value) { if (value instanceof Collection collection) { @@ -1141,7 +1155,7 @@ private void export(BeanUtilsBean beanUtils, Stack nested, BufferedWrite // recursive export via accessors Arrays.stream(beanUtils.getPropertyUtils().getPropertyDescriptors(value)).filter(propertyDescriptor -> { - if (ignored.contains(propertyDescriptor.getName())) { + if (isIgnored(value.getClass(), propertyDescriptor)) { return false; } final Method descriptorReadMethod = propertyDescriptor.getReadMethod(); 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 94b0d234adc..d70a786a0d5 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 @@ -16,6 +16,7 @@ */ package org.apache.activemq.artemis.core.config.impl; + import static org.apache.activemq.artemis.core.config.impl.ConfigurationImpl.REDACTED; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -60,11 +61,13 @@ import org.apache.activemq.artemis.ArtemisConstants; import org.apache.activemq.artemis.api.config.ActiveMQDefaultConfiguration; +import org.apache.activemq.artemis.api.core.QueueConfiguration; import org.apache.activemq.artemis.api.core.RoutingType; import org.apache.activemq.artemis.api.core.SimpleString; import org.apache.activemq.artemis.api.core.TransportConfiguration; import org.apache.activemq.artemis.core.config.Configuration; import org.apache.activemq.artemis.core.config.ConfigurationUtils; +import org.apache.activemq.artemis.core.config.CoreAddressConfiguration; import org.apache.activemq.artemis.core.config.HAPolicyConfiguration; import org.apache.activemq.artemis.core.config.LockCoordinatorConfiguration; import org.apache.activemq.artemis.core.config.ScaleDownConfiguration; @@ -3067,6 +3070,47 @@ public void testExportInvalidPropertyOnAcceptor() throws Exception { assertEquals("", configuration.getAcceptorConfigurations().stream().findFirst().get().getCombinedParams().get("useKQueue")); } + @Test + public void testDeprecatedConfigsAreNotExportedAsProperties() throws Exception { + ConfigurationImpl configuration = new ConfigurationImpl(); + configuration.addQueueConfiguration(QueueConfiguration.of("shouldNotBeHere")); + + configuration.addAddressConfiguration(new CoreAddressConfiguration().setName("test").addQueueConfiguration(QueueConfiguration.of("test").setAddress("test").setRoutingType(RoutingType.ANYCAST)).addRoutingType(RoutingType.ANYCAST)); + + CoreAddressConfiguration carAddress = new CoreAddressConfiguration(); + carAddress.setName("CarOrders"); + carAddress.addRoutingType(RoutingType.MULTICAST); + + carAddress.addQueueConfiguration(QueueConfiguration.of("tires").setRoutingType(RoutingType.MULTICAST)); + carAddress.addQueueConfiguration(QueueConfiguration.of("batteries").setRoutingType(RoutingType.MULTICAST)); + configuration.addAddressConfiguration(carAddress); + + 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); + } + + AtomicBoolean foundTires = new AtomicBoolean(false); + AtomicBoolean foundBatteries = new AtomicBoolean(false); + assertFalse(properties.isEmpty()); + properties.forEach((a, b) -> { + assertFalse(String.valueOf(a).contains("queueConfigurations")); + assertFalse(String.valueOf(b).contains("shouldNotBeHere")); + if (String.valueOf(b).equals("batteries")) { + foundBatteries.set(true); + } + if (String.valueOf(b).equals("tires")) { + foundTires.set(true); + } + }); + assertTrue(foundBatteries.get()); + assertTrue(foundTires.get()); + assertTrue(properties.containsKey("addressConfigurations.test.name")); + assertTrue(properties.containsKey("addressConfigurations.test.queueConfigs.test.name")); + } + /** * Verifies the lock coordinator configuration parsing and export process: *
    diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java index 43cf9d1896b..4dead4742a9 100644 --- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java +++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java @@ -185,6 +185,10 @@ public void testFileConfiguration() { } private void validateFullConfig(Configuration configInstance) { + validateFullConfig(configInstance, false); + } + + private void validateFullConfig(Configuration configInstance, boolean fromProperties) { // Check they match the values from the test file assertEquals("SomeNameForUseOnTheApplicationServer", configInstance.getName()); assertFalse(configInstance.isPersistenceEnabled()); @@ -610,20 +614,22 @@ private void validateFullConfig(Configuration configInstance) { assertEquals(104, configInstance.getResourceLimitSettings().get("myUser").getMaxSessions()); assertEquals(13, configInstance.getResourceLimitSettings().get("myUser").getMaxQueues()); - assertEquals(2, configInstance.getQueueConfigs().size()); - - assertEquals("queue1", configInstance.getQueueConfigs().get(0).getName().toString()); - assertEquals("address1", configInstance.getQueueConfigs().get(0).getAddress().toString()); - assertEquals("color='red'", configInstance.getQueueConfigs().get(0).getFilterString().toString()); - assertNotNull(configInstance.getQueueConfigs().get(0).isDurable()); - assertFalse(configInstance.getQueueConfigs().get(0).isDurable()); - - assertEquals("queue2", configInstance.getQueueConfigs().get(1).getName().toString()); - assertEquals("address2", configInstance.getQueueConfigs().get(1).getAddress().toString()); - assertEquals("color='blue'", configInstance.getQueueConfigs().get(1).getFilterString().toString()); - assertNotNull(configInstance.getQueueConfigs().get(1).isDurable()); - assertFalse(configInstance.getQueueConfigs().get(1).isDurable()); - + if (!fromProperties) { + // we don't export deprecated entries + assertEquals(2, configInstance.getQueueConfigs().size()); + + assertEquals("queue1", configInstance.getQueueConfigs().get(0).getName().toString()); + assertEquals("address1", configInstance.getQueueConfigs().get(0).getAddress().toString()); + assertEquals("color='red'", configInstance.getQueueConfigs().get(0).getFilterString().toString()); + assertNotNull(configInstance.getQueueConfigs().get(0).isDurable()); + assertFalse(configInstance.getQueueConfigs().get(0).isDurable()); + + assertEquals("queue2", configInstance.getQueueConfigs().get(1).getName().toString()); + assertEquals("address2", configInstance.getQueueConfigs().get(1).getAddress().toString()); + assertEquals("color='blue'", configInstance.getQueueConfigs().get(1).getFilterString().toString()); + assertNotNull(configInstance.getQueueConfigs().get(1).isDurable()); + assertFalse(configInstance.getQueueConfigs().get(1).isDurable()); + } verifyAddresses(); Map> roles = configInstance.getSecurityRoles(); @@ -1048,7 +1054,7 @@ public void testExportImportFromProperties() throws Exception { assertTrue(REDACTED.equals(configuration.getClusterPassword())); configuration.setClusterPassword("Wombat"); - validateFullConfig(configuration); + validateFullConfig(configuration, true); } private Configuration createConfiguration(String filename) throws Exception {