This is an automated email from the ASF dual-hosted git repository. gtully pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git
commit 2f77ca2abb65f958eac24f309e6f733bf8c6a363 Author: Gary Tully <gary.tu...@gmail.com> AuthorDate: Tue May 7 15:21:15 2024 +0100 ARTEMIS-4763 support .class values for non string attributes, properties config of metrics plugins --- .../core/config/impl/ConfigurationImpl.java | 32 ++++++++++++---------- .../core/server/metrics/ActiveMQMetricsPlugin.java | 4 +++ .../core/config/impl/ConfigurationImplTest.java | 31 ++++++++++++++++++++- 3 files changed, 52 insertions(+), 15 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 b99e7a53ac..a8a0bc212c 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 @@ -75,7 +75,6 @@ import org.apache.activemq.artemis.core.config.FederationConfiguration; import org.apache.activemq.artemis.core.config.HAPolicyConfiguration; import org.apache.activemq.artemis.core.config.MetricsConfiguration; import org.apache.activemq.artemis.core.config.StoreConfiguration; -import org.apache.activemq.artemis.core.config.TransformerConfiguration; import org.apache.activemq.artemis.core.config.WildcardConfiguration; import org.apache.activemq.artemis.core.config.amqpBrokerConnectivity.AMQPBrokerConnectConfiguration; import org.apache.activemq.artemis.core.config.amqpBrokerConnectivity.AMQPFederationBrokerPlugin; @@ -797,7 +796,18 @@ public class ConfigurationImpl implements Configuration, Serializable { } } else { // Value into scalar if (value instanceof String) { - newValue = getConvertUtils().convert((String) value, type); + String possibleDotClassValue = (String)value; + if (type != String.class && possibleDotClassValue.endsWith(DOT_CLASS)) { + final String clazzName = possibleDotClassValue.substring(0, possibleDotClassValue.length() - DOT_CLASS.length()); + try { + Class clazzType = this.getClass().getClassLoader().loadClass(clazzName); + newValue = clazzType.getDeclaredConstructor().newInstance(); + } catch (Exception e) { + throw new InvocationTargetException(e, " for dot class value: " + possibleDotClassValue + ", on: " + bean); + } + } else { + newValue = getConvertUtils().convert(possibleDotClassValue, type); + } } else if (value instanceof String[]) { newValue = getConvertUtils().convert(((String[]) value)[0], type); } else { @@ -834,14 +844,6 @@ public class ConfigurationImpl implements Configuration, Serializable { } }, NamedPropertyConfiguration.class); - beanUtils.getConvertUtils().register(new Converter() { - @Override - public <T> T convert(Class<T> type, Object value) { - TransformerConfiguration instance = new TransformerConfiguration(value.toString()); - return (T) instance; - } - }, TransformerConfiguration.class); - beanUtils.getConvertUtils().register(new Converter() { @Override public <T> T convert(Class<T> type, Object value) { @@ -880,11 +882,13 @@ public class ConfigurationImpl implements Configuration, Serializable { public <T> T convert(Class<T> type, Object value) { Map convertedValue = new HashMap(); for (String entry : value.toString().split(",")) { - String[] kv = entry.split("="); - if (2 != kv.length) { - throw new IllegalArgumentException("map value " + value + " not in k=v format"); + if (!entry.isBlank()) { + String[] kv = entry.split("="); + if (2 != kv.length) { + throw new IllegalArgumentException("map value " + value + " not in k=v format"); + } + convertedValue.put(kv[0], kv[1]); } - convertedValue.put(kv[0], kv[1]); } return (T) convertedValue; } diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/metrics/ActiveMQMetricsPlugin.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/metrics/ActiveMQMetricsPlugin.java index 9497f127d7..f8fcacc20e 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/metrics/ActiveMQMetricsPlugin.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/metrics/ActiveMQMetricsPlugin.java @@ -35,4 +35,8 @@ public interface ActiveMQMetricsPlugin extends Serializable { */ default void registered(ActiveMQServer server) { } + + default void setInit(Map<String, String> options) { + init(options); + } } 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 9a4bb9b8b0..8280afacae 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 @@ -2078,12 +2078,14 @@ public class ConfigurationImplTest extends ServerTestBase { properties.put("divertConfigurations.divert1.routingName", routingName); properties.put("divertConfigurations.divert1.address", address); properties.put("divertConfigurations.divert1.forwardingAddress", forwardAddress); - properties.put("divertConfigurations.divert1.transformerConfiguration", className); + properties.put("divertConfigurations.divert1.transformerConfiguration.className", className); properties.put("divertConfigurations.divert1.transformerConfiguration.properties.a", "va"); properties.put("divertConfigurations.divert1.transformerConfiguration.properties.b", "vb"); configuration.parsePrefixedProperties(properties, null); + Assert.assertTrue(configuration.getStatus(), configuration.getStatus().contains("\"errors\":[]")); + Assert.assertEquals(1, configuration.getDivertConfigurations().size()); Assert.assertEquals(routingName, configuration.getDivertConfigurations().get(0).getRoutingName()); Assert.assertEquals(address, configuration.getDivertConfigurations().get(0).getAddress()); @@ -2590,6 +2592,33 @@ public class ConfigurationImplTest extends ServerTestBase { Assert.assertEquals("netty-.*", ((ConnectionPeriodicExpiryPlugin)(configuration.getBrokerPlugins().get(0))).getAcceptorMatchRegex()); } + @Test + public void testMetricsPluginInit() throws Exception { + + final ConfigurationImpl configuration = new ConfigurationImpl(); + + Properties insertionOrderedProperties = new ConfigurationImpl.InsertionOrderedProperties(); + insertionOrderedProperties.put("metricsConfiguration.plugin","org.apache.activemq.artemis.core.config.impl.FileConfigurationTest.FakeMetricPlugin.class"); + + configuration.parsePrefixedProperties(insertionOrderedProperties, null); + Assert.assertFalse(configuration.getStatus(), configuration.getStatus().contains("\"errors\":[]")); + Assert.assertTrue(configuration.getStatus().contains("NotFound")); + Assert.assertTrue(configuration.getStatus().contains("FakeMetricPlugin")); + + // fix the typo error + insertionOrderedProperties.put("metricsConfiguration.plugin","org.apache.activemq.artemis.core.config.impl.FileConfigurationTest$FakeMetricPlugin.class"); + insertionOrderedProperties.put("metricsConfiguration.plugin.init",""); + insertionOrderedProperties.put("metricsConfiguration.jvmMemory", "false"); + + configuration.parsePrefixedProperties(insertionOrderedProperties, null); + + Assert.assertTrue(configuration.getStatus(), configuration.getStatus().contains("\"errors\":[]")); + + Assert.assertNotNull(configuration.getMetricsConfiguration()); + Assert.assertNotNull(configuration.getMetricsConfiguration().getPlugin()); + Assert.assertNull(configuration.getMetricsConfiguration().getPlugin().getRegistry()); + } + @Test public void testSecuritySettingPluginFromBrokerProperties() throws Exception {