You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by gt...@apache.org on 2024/06/18 10:17:50 UTC
(activemq-artemis) branch main updated: ARTEMIS-4818 Improve support for multiple broker plugins from broker properties
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
The following commit(s) were added to refs/heads/main by this push:
new a10694f202 ARTEMIS-4818 Improve support for multiple broker plugins from broker properties
a10694f202 is described below
commit a10694f202583e145e7d06c27488814d8b28b762
Author: Domenico Francesco Bruscino <br...@apache.org>
AuthorDate: Fri Jun 14 13:23:43 2024 +0200
ARTEMIS-4818 Improve support for multiple broker plugins from broker properties
---
.../core/config/impl/ConfigurationImpl.java | 36 ++++++++++++-----
.../core/config/impl/ConfigurationImplTest.java | 45 ++++++++++++++++++----
2 files changed, 65 insertions(+), 16 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 82fc5ce4be..2cddc81389 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
@@ -141,7 +141,7 @@ public class ConfigurationImpl implements Configuration, Serializable {
public static final JournalType DEFAULT_JOURNAL_TYPE = JournalType.ASYNCIO;
- public static final String DOT_CLASS = ".class";
+ public static final String PROPERTY_CLASS_SUFFIX = ".class";
private static final int DEFAULT_JMS_MESSAGE_SIZE = 1864;
@@ -798,8 +798,8 @@ public class ConfigurationImpl implements Configuration, Serializable {
} else { // Value into scalar
if (value instanceof String) {
String possibleDotClassValue = (String)value;
- if (type != String.class && possibleDotClassValue.endsWith(DOT_CLASS)) {
- final String clazzName = possibleDotClassValue.substring(0, possibleDotClassValue.length() - DOT_CLASS.length());
+ if (type != String.class && isClassProperty(possibleDotClassValue)) {
+ final String clazzName = extractPropertyClassName(possibleDotClassValue);
try {
newValue = ClassloadingUtil.getInstanceWithTypeCheck(clazzName, type, this.getClass().getClassLoader());
} catch (Exception e) {
@@ -958,6 +958,15 @@ public class ConfigurationImpl implements Configuration, Serializable {
updateApplyStatus(propsId, errors);
}
+ private static boolean isClassProperty(String property) {
+ return property.endsWith(PROPERTY_CLASS_SUFFIX);
+ }
+
+ private static String extractPropertyClassName(String property) {
+ int propertyClassSuffixIndex = property.indexOf(PROPERTY_CLASS_SUFFIX);
+ return property.substring(0, propertyClassSuffixIndex);
+ }
+
private void trackError(HashMap<String, String> errors, Map.Entry<String,?> entry, Throwable oops) {
logger.debug("failed to populate property entry({}), reason: {}", entry, oops);
errors.put(entry.toString(), oops.toString());
@@ -3489,10 +3498,19 @@ public class ConfigurationImpl implements Configuration, Serializable {
private Object findByNameProperty(String key, Collection collection) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
// locate on name property, may be a SimpleString
- for (Object candidate : collection) {
- Object candidateName = getProperty(candidate, "name");
- if (candidateName != null && key.equals(candidateName.toString())) {
- return candidate;
+ if (isClassProperty(key)) {
+ Object propertyClassName = extractPropertyClassName(key);
+ for (Object candidate : collection) {
+ if (candidate.getClass().getName().equals(propertyClassName)) {
+ return candidate;
+ }
+ }
+ } else {
+ for (Object candidate : collection) {
+ Object candidateName = getProperty(candidate, "name");
+ if (candidateName != null && key.equals(candidateName.toString())) {
+ return candidate;
+ }
}
}
return null;
@@ -3603,8 +3621,8 @@ public class ConfigurationImpl implements Configuration, Serializable {
}
Class type = candidate.getParameterTypes()[candidate.getParameterCount() - 1];
- if (name.indexOf(DOT_CLASS) > 0) {
- final String clazzName = name.substring(0, name.length() - DOT_CLASS.length());
+ if (isClassProperty(name)) {
+ final String clazzName = extractPropertyClassName(name);
instance = ClassloadingUtil.getInstanceWithTypeCheck(clazzName, type, this.getClass().getClassLoader());
} else {
instance = type.getDeclaredConstructor().newInstance();
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 713d2cf1b0..2de1825a83 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
@@ -2116,18 +2116,23 @@ public class ConfigurationImplTest extends AbstractConfigurationTestBase {
assertTrue(configuration.getStatus().contains("\"errors\":[]"));
- // verify invalid map errors out
insertionOrderedProperties = new ConfigurationImpl.InsertionOrderedProperties();
- // impossible to change any attribute unless the plugin has a name attribute, but plugins only registered on start
- insertionOrderedProperties.put("brokerPlugins.\"org.apache.activemq.artemis.core.server.plugin.impl.LoggingActiveMQServerPlugin.class\".init", "LOG_ALL_EVENTS");
+ // change attribute of a plugin without the name attribute, but plugins only registered on start
+ insertionOrderedProperties.put("brokerPlugins.\"org.apache.activemq.artemis.core.server.plugin.impl.LoggingActiveMQServerPlugin.class\".init", "LOG_ALL_EVENTS=false");
configuration.parsePrefixedProperties(insertionOrderedProperties, null);
+ assertEquals(1, configuration.getBrokerPlugins().size());
+ assertFalse(((LoggingActiveMQServerPlugin)(configuration.getBrokerPlugins().get(0))).isLogAll());
+
// verify error
+ insertionOrderedProperties.put("brokerPlugins.\"org.apache.activemq.artemis.core.server.plugin.impl.LoggingActiveMQServerPlugin.class\".init", "LOG_ALL_EVENTS");
+
+ configuration.parsePrefixedProperties(insertionOrderedProperties, null);
+
assertFalse(configuration.getStatus().contains("\"errors\":[]"));
assertTrue(configuration.getStatus().contains("LOG_ALL_EVENTS"));
- assertTrue(configuration.getStatus().contains("Unknown property 'name'"));
}
@Test
@@ -2153,6 +2158,26 @@ public class ConfigurationImplTest extends AbstractConfigurationTestBase {
assertEquals("netty-.*", ((ConnectionPeriodicExpiryPlugin)(configuration.getBrokerPlugins().get(0))).getAcceptorMatchRegex());
}
+ @Test
+ public void testMultiplePlugins() throws Exception {
+ final ConfigurationImpl configuration = new ConfigurationImpl();
+
+ Properties insertionOrderedProperties = new ConfigurationImpl.InsertionOrderedProperties();
+
+ insertionOrderedProperties.put("brokerPlugins.\"org.apache.activemq.artemis.core.server.plugin.impl.LoggingActiveMQServerPlugin.class\".init", "LOG_ALL_EVENTS=true");
+ insertionOrderedProperties.put("brokerPlugins.\"org.apache.activemq.artemis.core.server.plugin.impl.ConnectionPeriodicExpiryPlugin.class\".periodSeconds", "30");
+ insertionOrderedProperties.put("brokerPlugins.\"org.apache.activemq.artemis.core.server.plugin.impl.ConnectionPeriodicExpiryPlugin.class\".accuracyWindowSeconds", "10");
+
+ configuration.parsePrefixedProperties(insertionOrderedProperties, null);
+
+ assertTrue(configuration.getStatus().contains("\"errors\":[]"), configuration.getStatus());
+
+ assertEquals(2, configuration.getBrokerPlugins().size());
+ assertTrue(((LoggingActiveMQServerPlugin)(configuration.getBrokerPlugins().get(0))).isLogAll());
+ assertEquals(30, ((ConnectionPeriodicExpiryPlugin)(configuration.getBrokerPlugins().get(1))).getPeriodSeconds());
+ assertEquals(10, ((ConnectionPeriodicExpiryPlugin)(configuration.getBrokerPlugins().get(1))).getAccuracyWindowSeconds());
+ }
+
@Test
public void testConnectionExpiryPluginInit() throws Exception {
@@ -2215,17 +2240,23 @@ public class ConfigurationImplTest extends AbstractConfigurationTestBase {
assertTrue(configuration.getStatus().contains("\"errors\":[]"));
- // verify invalid map errors out
insertionOrderedProperties = new ConfigurationImpl.InsertionOrderedProperties();
- // impossible to change any attribute unless there is a name attribute, but plugins only registered on start
+ // change attribute of a plugin without the name attribute, but plugins only registered on start
+ insertionOrderedProperties.put("securitySettingPlugins.\"org.apache.activemq.artemis.core.server.impl.LegacyLDAPSecuritySettingPlugin.class\".init", "initialContextFactory=org.eclipse.jetty.jndi.InitialContextFactory");
+
+ configuration.parsePrefixedProperties(insertionOrderedProperties, null);
+
+ assertEquals(1, configuration.getSecuritySettingPlugins().size());
+ assertEquals("org.eclipse.jetty.jndi.InitialContextFactory", ((LegacyLDAPSecuritySettingPlugin)(configuration.getSecuritySettingPlugins().get(0))).getInitialContextFactory());
+
+ // verify error
insertionOrderedProperties.put("securitySettingPlugins.\"org.apache.activemq.artemis.core.server.impl.LegacyLDAPSecuritySettingPlugin.class\".init", "initialContextFactory");
configuration.parsePrefixedProperties(insertionOrderedProperties, null);
assertFalse(configuration.getStatus().contains("\"errors\":[]"));
assertTrue(configuration.getStatus().contains("initialContextFactory"));
- assertTrue(configuration.getStatus().contains("Unknown property 'name'"));
}
/**
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@activemq.apache.org
For additional commands, e-mail: commits-help@activemq.apache.org
For further information, visit: https://activemq.apache.org/contact