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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]
For further information, visit: https://activemq.apache.org/contact


Reply via email to