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 625bdfce6e ARTEMIS-4699 properties config don't try and imply the 
factoryClassName of a transport config object, fix up fluent builder and 
improve mirror usability
625bdfce6e is described below

commit 625bdfce6e80f802fa7aef4344b94fcf34055f3d
Author: Gary Tully <[email protected]>
AuthorDate: Mon Mar 25 16:52:44 2024 +0000

    ARTEMIS-4699 properties config don't try and imply the factoryClassName of 
a transport config object, fix up fluent builder and improve mirror usability
---
 .../FluentPropertyBeanIntrospectorWithIgnores.java |  46 ++++---
 .../artemis/api/core/TransportConfiguration.java   |   2 +-
 .../artemis/ActiveMQImageExamplesTest.java         |   2 +-
 .../AMQPBrokerConnectConfiguration.java            |  36 ++++++
 .../core/config/impl/ConfigurationImpl.java        |  20 +--
 .../core/config/impl/ConfigurationImplTest.java    | 134 ++++++++++++++++++---
 6 files changed, 197 insertions(+), 43 deletions(-)

diff --git 
a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/uri/FluentPropertyBeanIntrospectorWithIgnores.java
 
b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/uri/FluentPropertyBeanIntrospectorWithIgnores.java
index 2c7ed6cd34..4ab1c4bad5 100644
--- 
a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/uri/FluentPropertyBeanIntrospectorWithIgnores.java
+++ 
b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/uri/FluentPropertyBeanIntrospectorWithIgnores.java
@@ -48,14 +48,19 @@ public class FluentPropertyBeanIntrospectorWithIgnores 
extends FluentPropertyBea
    @Override
    public void introspect(IntrospectionContext icontext) throws 
IntrospectionException {
       for (Method m : icontext.getTargetClass().getMethods()) {
-         if (m.getName().startsWith(getWriteMethodPrefix())) {
-            if (isIgnored(icontext.getTargetClass().getName(), m.getName())) {
-               logger.trace("{} Ignored for {}", m.getName(), 
icontext.getTargetClass().getName());
+         final String methodName = m.getName();
+         if (methodName.startsWith(getWriteMethodPrefix()) && 
!methodName.equals(getWriteMethodPrefix())) {
+            if (isIgnored(icontext.getTargetClass().getName(), methodName)) {
+               logger.trace("{} Ignored for {}", methodName, 
icontext.getTargetClass().getName());
                continue;
             }
 
-            introspect(icontext, m, propertyName(m));
-            introspect(icontext, m, defaultPropertyName(m));
+            final String propertyName = propertyName(methodName);
+            introspect(icontext, m, propertyName);
+            final String defaultPropertyName = defaultPropertyName(methodName);
+            if (!defaultPropertyName.equals(propertyName)) {
+               introspect(icontext, m, defaultPropertyName);
+            }
          }
       }
    }
@@ -63,31 +68,32 @@ public class FluentPropertyBeanIntrospectorWithIgnores 
extends FluentPropertyBea
    private void introspect(IntrospectionContext icontext, Method writeMethod, 
String propertyName) {
       PropertyDescriptor pd = icontext.getPropertyDescriptor(propertyName);
 
+      Method readMethod = null;
+      if (pd != null) {
+         readMethod = pd.getReadMethod();
+      }
       try {
-         if (pd == null) {
-            
icontext.addPropertyDescriptor(createFluentPropertyDescritor(writeMethod, 
propertyName));
-         } else if (pd.getWriteMethod() == null) {
-            pd.setWriteMethod(writeMethod);
-         }
+         PropertyDescriptor withFluentWrite = 
createFluentPropertyDescriptor(readMethod, writeMethod, propertyName);
+         icontext.addPropertyDescriptor(withFluentWrite);
       } catch (IntrospectionException e) {
-         logger.trace("error for property named {}", propertyName, e);
+         logger.trace("error on add fluent descriptor for property named {}", 
propertyName, e);
       }
    }
 
-   private PropertyDescriptor createFluentPropertyDescritor(Method 
writeMethod, String propertyName) throws IntrospectionException {
-      return new PropertyDescriptor(propertyName, null, writeMethod);
+   private PropertyDescriptor createFluentPropertyDescriptor(Method 
readMethod, Method writeMethod, String propertyName) throws 
IntrospectionException {
+      return new PropertyDescriptor(propertyName, readMethod, writeMethod);
    }
 
-   private String propertyName(final Method m) {
-      String methodName = 
m.getName().substring(getWriteMethodPrefix().length());
-      return (methodName.length() > 1) ? 
Character.toLowerCase(methodName.charAt(0)) +
-         methodName.substring(1) : methodName.toLowerCase(Locale.ENGLISH);
+   private String propertyName(final String methodName) {
+      String propName = methodName.substring(getWriteMethodPrefix().length());
+      return (propName.length() > 1) ? 
Character.toLowerCase(propName.charAt(0)) +
+         propName.substring(1) : propName.toLowerCase(Locale.ENGLISH);
    }
 
-   private String defaultPropertyName(final Method m) {
-      final String methodName = m.getName().substring(
+   private String defaultPropertyName(final String methodName) {
+      final String propertyName = methodName.substring(
          getWriteMethodPrefix().length());
-      return (methodName.length() > 1) ? Introspector.decapitalize(methodName) 
: methodName
+      return (propertyName.length() > 1) ? 
Introspector.decapitalize(propertyName) : propertyName
          .toLowerCase(Locale.ENGLISH);
    }
 }
diff --git 
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/TransportConfiguration.java
 
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/TransportConfiguration.java
index c668a3468d..67d7469f40 100644
--- 
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/TransportConfiguration.java
+++ 
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/TransportConfiguration.java
@@ -53,7 +53,7 @@ public class TransportConfiguration implements Serializable {
 
    private String name;
 
-   private String factoryClassName;
+   private String factoryClassName = "null";
 
    private Map<String, Object> params;
 
diff --git 
a/artemis-image/src/test/java/org/apache/activemq/artemis/ActiveMQImageExamplesTest.java
 
b/artemis-image/src/test/java/org/apache/activemq/artemis/ActiveMQImageExamplesTest.java
index 4a205845c1..e95c99b69c 100644
--- 
a/artemis-image/src/test/java/org/apache/activemq/artemis/ActiveMQImageExamplesTest.java
+++ 
b/artemis-image/src/test/java/org/apache/activemq/artemis/ActiveMQImageExamplesTest.java
@@ -46,7 +46,7 @@ public class ActiveMQImageExamplesTest {
 
       EmbeddedActiveMQ server = new EmbeddedActiveMQ();
       // look for properties files to augment configuration
-      
server.setPropertiesResourcePath("./src/main/resources/,./examples/amqp_sasl_scram_test__etc/");
+      
server.setPropertiesResourcePath("./src/main/jib/config/,./examples/amqp_sasl_scram_test__etc/");
       server.setConfiguration(configuration);
 
       server.start();
diff --git 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/amqpBrokerConnectivity/AMQPBrokerConnectConfiguration.java
 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/amqpBrokerConnectivity/AMQPBrokerConnectConfiguration.java
index 3bf03e61fd..009f9c198f 100644
--- 
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/amqpBrokerConnectivity/AMQPBrokerConnectConfiguration.java
+++ 
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/amqpBrokerConnectivity/AMQPBrokerConnectConfiguration.java
@@ -75,6 +75,42 @@ public class AMQPBrokerConnectConfiguration extends 
BrokerConnectConfiguration {
       return connectionElements;
    }
 
+   public AMQPBrokerConnectConfiguration 
addMirror(AMQPMirrorBrokerConnectionElement amqpMirrorBrokerConnectionElement) {
+      return addElement(amqpMirrorBrokerConnectionElement);
+   }
+
+   public List<AMQPBrokerConnectionElement> getMirrors() {
+      return connectionElements;
+   }
+
+   public AMQPBrokerConnectConfiguration addPeer(AMQPBrokerConnectionElement 
element) {
+      element.setType(AMQPBrokerConnectionAddressType.PEER);
+      return addElement(element);
+   }
+
+   public List<AMQPBrokerConnectionElement> getPeers() {
+      return connectionElements;
+   }
+
+   public AMQPBrokerConnectConfiguration addSender(AMQPBrokerConnectionElement 
element) {
+      element.setType(AMQPBrokerConnectionAddressType.SENDER);
+      return addElement(element);
+   }
+
+   public List<AMQPBrokerConnectionElement> getSenders() {
+      return connectionElements;
+   }
+
+   public AMQPBrokerConnectConfiguration 
addReceiver(AMQPBrokerConnectionElement element) {
+      element.setType(AMQPBrokerConnectionAddressType.RECEIVER);
+      return addElement(element);
+   }
+
+   public List<AMQPBrokerConnectionElement> getReceivers() {
+      return connectionElements;
+   }
+
+
    @Override
    public void parseURI() throws Exception {
       ConnectorTransportConfigurationParser parser = new 
ConnectorTransportConfigurationParser(false);
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 fd65a73ef4..785cecce78 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
@@ -90,8 +90,6 @@ import 
org.apache.activemq.artemis.core.config.ha.SharedStorePrimaryPolicyConfig
 import 
org.apache.activemq.artemis.core.config.routing.ConnectionRouterConfiguration;
 import 
org.apache.activemq.artemis.core.config.routing.NamedPropertyConfiguration;
 import 
org.apache.activemq.artemis.core.config.storage.DatabaseStorageConfiguration;
-import 
org.apache.activemq.artemis.core.remoting.impl.invm.InVMConnectorFactory;
-import 
org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnectorFactory;
 import org.apache.activemq.artemis.core.security.Role;
 import org.apache.activemq.artemis.core.server.ActiveMQMessageBundle;
 import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
@@ -500,6 +498,15 @@ public class ConfigurationImpl implements Configuration, 
Serializable {
       return this;
    }
 
+   // from properties, as milli
+   public void setJournalRetentionPeriod(long periodMillis) {
+      if (periodMillis <= 0) {
+         this.journalRetentionPeriod = -1;
+      } else {
+         this.journalRetentionPeriod = periodMillis;
+      }
+   }
+
    @Override
    public long getJournalRetentionMaxBytes() {
       return journalRetentionMaxBytes;
@@ -666,6 +673,9 @@ public class ConfigurationImpl implements Configuration, 
Serializable {
                      String nextName = resolver.next(name);
                      Object nextTarget = 
getPropertyUtils().getProperty(target, nextName);
                      if (nextTarget == null) {
+                        if (resolver.isMapped(nextName)) {
+                           throw new InvocationTargetException(null, "Entry 
does not exist in: " + resolver.getProperty(name) + " for mapped key: " + 
resolver.getKey(name));
+                        }
                         nextTarget = initProperty(target, nextName);
                      }
                      target = nextTarget;
@@ -937,7 +947,7 @@ public class ConfigurationImpl implements Configuration, 
Serializable {
 
    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.getLocalizedMessage());
+      errors.put(entry.toString(), oops.toString());
    }
 
    private synchronized void updateApplyStatus(String propsId, HashMap<String, 
String> errors) {
@@ -3539,10 +3549,6 @@ public class ConfigurationImpl implements Configuration, 
Serializable {
                // for maps a name attribute is not mandatory
             }
 
-            // this is always going to be a little hacky b/c our config is not 
natively property friendly
-            if (instance instanceof TransportConfiguration) {
-               beanUtilsBean.setProperty(instance, "factoryClassName", 
"invm".equals(name) ? InVMConnectorFactory.class.getName() : 
NettyConnectorFactory.class.getName());
-            }
             return instance;
 
          } catch (Exception e) {
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 52419e3f4a..2cbf1a516d 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
@@ -23,6 +23,7 @@ import java.io.PrintWriter;
 import java.lang.reflect.Method;
 import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.Map;
 import java.util.Properties;
@@ -30,6 +31,7 @@ import java.util.Random;
 import java.util.Set;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Predicate;
@@ -786,18 +788,20 @@ public class ConfigurationImplTest extends ServerTestBase 
{
       insertionOrderedProperties.put("AMQPConnections.target.user", "admin");
       insertionOrderedProperties.put("AMQPConnections.target.password", 
"password");
       insertionOrderedProperties.put("AMQPConnections.target.autostart", 
"false");
-      
insertionOrderedProperties.put("AMQPConnections.target.connectionElements.mirror.type",
 "MIRROR");
-      
insertionOrderedProperties.put("AMQPConnections.target.connectionElements.mirror.messageAcknowledgements",
 "true");
-      
insertionOrderedProperties.put("AMQPConnections.target.connectionElements.mirror.queueCreation",
 "true");
-      
insertionOrderedProperties.put("AMQPConnections.target.connectionElements.mirror.queueRemoval",
 "true");
-      
insertionOrderedProperties.put("AMQPConnections.target.connectionElements.mirror.addressFilter",
 "foo");
-      
insertionOrderedProperties.put("AMQPConnections.target.connectionElements.mirror.properties.a",
 "b");
+      
insertionOrderedProperties.put("AMQPConnections.target.mirrors.mirror.type", 
"MIRROR");
+      
insertionOrderedProperties.put("AMQPConnections.target.mirrors.mirror.messageAcknowledgements",
 "true");
+      
insertionOrderedProperties.put("AMQPConnections.target.mirrors.mirror.queueCreation",
 "true");
+      
insertionOrderedProperties.put("AMQPConnections.target.mirrors.mirror.queueRemoval",
 "true");
+      
insertionOrderedProperties.put("AMQPConnections.target.mirrors.mirror.addressFilter",
 "foo");
+      
insertionOrderedProperties.put("AMQPConnections.target.mirrors.mirror.properties.a",
 "b");
       if (sync) {
-         
insertionOrderedProperties.put("AMQPConnections.target.connectionElements.mirror.sync",
 "true");
+         
insertionOrderedProperties.put("AMQPConnections.target.mirrors.mirror.sync", 
"true");
       } // else we just use the default that is false
 
       configuration.parsePrefixedProperties(insertionOrderedProperties, null);
 
+      Assert.assertTrue(configuration.getStatus(), 
configuration.getStatus().contains("\"errors\":[]"));
+
       Assert.assertEquals(1, configuration.getAMQPConnections().size());
       AMQPBrokerConnectConfiguration connectConfiguration = 
configuration.getAMQPConnections().get(0);
       Assert.assertEquals("target", connectConfiguration.getName());
@@ -983,6 +987,8 @@ public class ConfigurationImplTest extends ServerTestBase {
 
       configuration.parsePrefixedProperties(insertionOrderedProperties, null);
 
+      Assert.assertTrue(configuration.getStatus(), 
configuration.getStatus().contains("\"errors\":[]"));
+
       Assert.assertEquals(1, configuration.getAMQPConnections().size());
       AMQPBrokerConnectConfiguration connectConfiguration = 
configuration.getAMQPConnections().get(0);
       Assert.assertEquals("target", connectConfiguration.getName());
@@ -1115,6 +1121,12 @@ public class ConfigurationImplTest extends 
ServerTestBase {
       Assert.assertEquals("c", 
configuration.getBridgeConfigurations().get(0).getStaticConnectors().get(1));
 
       Assert.assertEquals(ComponentConfigurationRoutingType.STRIP, 
configuration.getBridgeConfigurations().get(0).getRoutingType());
+
+      properties = new ConfigurationImpl.InsertionOrderedProperties();
+      // validate out of bound is trapped as error
+      properties.put("bridgeConfigurations.b1.staticConnectors[5]", "d");
+      configuration.parsePrefixedProperties(properties, null);
+      Assert.assertTrue(configuration.getStatus(), 
configuration.getStatus().contains("IndexOutOfBoundsException"));
    }
 
    @Test
@@ -1414,18 +1426,80 @@ public class ConfigurationImplTest extends 
ServerTestBase {
       Assert.assertEquals("secureexample", 
configuration.getFederationConfigurations().get(0).getCredentials().getPassword());
    }
 
+
+   @Test
+   public void testAMQPBrokerConnectionMix() throws Throwable {
+      ConfigurationImpl configuration = new ConfigurationImpl();
+
+      Properties properties = new 
ConfigurationImpl.InsertionOrderedProperties();
+
+      properties.put("AMQPConnections.brokerA.uri", "tcp://brokerA:5672");
+      properties.put("AMQPConnections.brokerB.uri", "tcp://brokerB:5672");
+
+      properties.put("AMQPConnections.brokerA.federations.abc.type", 
AMQPBrokerConnectionAddressType.FEDERATION.toString());
+      properties.put("AMQPConnections.brokerB.mirrors.mirror.type", 
AMQPBrokerConnectionAddressType.MIRROR.toString());
+
+      configuration.parsePrefixedProperties(properties, null);
+
+      Assert.assertTrue(configuration.getStatus(), 
configuration.getStatus().contains("\"errors\":[]"));
+
+      Assert.assertEquals(2, configuration.getAMQPConnection().size());
+      for (AMQPBrokerConnectConfiguration amqpBrokerConnectConfiguration : 
configuration.getAMQPConnection()) {
+         if ("brokerB".equals(amqpBrokerConnectConfiguration.getName())) {
+            Assert.assertEquals(AMQPBrokerConnectionAddressType.MIRROR, 
amqpBrokerConnectConfiguration.getConnectionElements().get(0).getType());
+         } else if 
("brokerA".equals(amqpBrokerConnectConfiguration.getName())) {
+            Assert.assertEquals(AMQPBrokerConnectionAddressType.FEDERATION, 
amqpBrokerConnectConfiguration.getConnectionElements().get(0).getType());
+         } else {
+            fail("unexpected amqp broker connection configuration: " + 
amqpBrokerConnectConfiguration.getName());
+         }
+      }
+   }
+
+   @Test
+   public void testAMQPBrokerConnectionTypes() throws Throwable {
+      ConfigurationImpl configuration = new ConfigurationImpl();
+
+      Properties properties = new 
ConfigurationImpl.InsertionOrderedProperties();
+
+      properties.put("AMQPConnections.brokerA.uri", "tcp://brokerA:5672");
+
+      // they all need a unique name as they share a collection
+      properties.put("AMQPConnections.brokerA.federations.a.type", 
AMQPBrokerConnectionAddressType.FEDERATION.toString());
+      properties.put("AMQPConnections.brokerA.mirrors.b.type", 
AMQPBrokerConnectionAddressType.MIRROR.toString());
+      properties.put("AMQPConnections.brokerA.peers.c.type", 
AMQPBrokerConnectionAddressType.PEER.toString());
+      properties.put("AMQPConnections.brokerA.senders.d.type", 
AMQPBrokerConnectionAddressType.SENDER.toString());
+      properties.put("AMQPConnections.brokerA.receivers.e.type", 
AMQPBrokerConnectionAddressType.RECEIVER.toString());
+
+      configuration.parsePrefixedProperties(properties, null);
+
+      Assert.assertTrue(configuration.getStatus(), 
configuration.getStatus().contains("\"errors\":[]"));
+
+      Assert.assertEquals(1, configuration.getAMQPConnection().size());
+
+      Set<AMQPBrokerConnectionAddressType> typesToFind = new HashSet<>();
+      for (AMQPBrokerConnectionAddressType t : 
AMQPBrokerConnectionAddressType.values()) {
+         typesToFind.add(t);
+      }
+      for (AMQPBrokerConnectionElement amqpBrokerConnectConfiguration : 
configuration.getAMQPConnection().get(0).getConnectionElements()) {
+         typesToFind.remove(amqpBrokerConnectConfiguration.getType());
+      }
+      assertTrue(typesToFind.isEmpty());
+   }
+
    @Test
    public void testSetNestedPropertyOnCollections() throws Throwable {
       ConfigurationImpl configuration = new ConfigurationImpl();
 
-      Properties properties = new Properties();
+      Properties properties = new 
ConfigurationImpl.InsertionOrderedProperties();
       properties.put("connectionRouters.joe.localTargetFilter", "LF");
       properties.put("connectionRouters.joe.keyFilter", "TF");
       properties.put("connectionRouters.joe.keyType", "SOURCE_IP");
 
+      properties.put("acceptorConfigurations.tcp.factoryClassName", 
NETTY_ACCEPTOR_FACTORY);
       properties.put("acceptorConfigurations.tcp.params.HOST", "LOCALHOST");
       properties.put("acceptorConfigurations.tcp.params.PORT", "61616");
 
+      properties.put("acceptorConfigurations.invm.factoryClassName", 
INVM_ACCEPTOR_FACTORY);
       properties.put("acceptorConfigurations.invm.params.ID", "0");
 
       //   <amqp-connection uri="tcp://HOST:PORT" name="other-server" 
retry-interval="100" reconnect-attempts="-1" user="john" password="doe">
@@ -1437,13 +1511,15 @@ public class ConfigurationImplTest extends 
ServerTestBase {
 
       //   <amqp-connection uri="tcp://brokerB:5672" name="brokerB"> <mirror/> 
</amqp-connection>
       properties.put("AMQPConnections.brokerB.uri", "tcp://brokerB:5672");
-      properties.put("AMQPConnections.brokerB.type", 
AMQPBrokerConnectionAddressType.MIRROR.toString());
+      properties.put("AMQPConnections.brokerB.connectionElements.mirror.type", 
AMQPBrokerConnectionAddressType.MIRROR.toString());
       
properties.put("AMQPConnections.brokerB.connectionElements.mirror.mirrorSNF", 
"mirrorSNFQueue");
 
       properties.put("resourceLimitSettings.joe.maxConnections", "100");
 
       configuration.parsePrefixedProperties(properties, null);
 
+      Assert.assertTrue(configuration.getStatus(), 
configuration.getStatus().contains("\"errors\":[]"));
+
       Assert.assertEquals(1, configuration.getConnectionRouters().size());
       Assert.assertEquals("LF", 
configuration.getConnectionRouters().get(0).getLocalTargetFilter());
       Assert.assertEquals("TF", 
configuration.getConnectionRouters().get(0).getKeyFilter());
@@ -1454,9 +1530,11 @@ public class ConfigurationImplTest extends 
ServerTestBase {
       for (TransportConfiguration acceptor : 
configuration.getAcceptorConfigurations()) {
          if ("tcp".equals(acceptor.getName())) {
             Assert.assertEquals("61616", acceptor.getParams().get("PORT"));
+            Assert.assertEquals(NETTY_ACCEPTOR_FACTORY, 
acceptor.getFactoryClassName());
          }
          if ("invm".equals(acceptor.getName())) {
             Assert.assertEquals("0", acceptor.getParams().get("ID"));
+            Assert.assertEquals(INVM_ACCEPTOR_FACTORY, 
acceptor.getFactoryClassName());
          }
       }
 
@@ -1480,19 +1558,22 @@ public class ConfigurationImplTest extends 
ServerTestBase {
    public void 
testSetNestedPropertyOnExistingCollectionEntryViaMappedNotation() throws 
Throwable {
       ConfigurationImpl configuration = new ConfigurationImpl();
 
-      Properties properties = new Properties();
+      Properties properties = new 
ConfigurationImpl.InsertionOrderedProperties();
       properties.put("connectionRouters.joe.localTargetFilter", "LF");
       // does not exist, ignored
       properties.put("connectionRouters(bob).keyFilter", "TF");
 
-      // apply twice b/c there is no guarantee of order, this may be a problem
       configuration.parsePrefixedProperties(properties, null);
+      Assert.assertFalse(configuration.getStatus().contains("\"errors\":[]"));
+      Assert.assertTrue(configuration.getStatus().contains("does not exist"));
+      Assert.assertTrue(configuration.getStatus().contains("mapped key: bob"));
 
       properties = new Properties();
       // update existing
       properties.put("connectionRouters(joe).keyFilter", "TF");
 
       configuration.parsePrefixedProperties(properties, null);
+      Assert.assertTrue(configuration.getStatus().contains("\"errors\":[]"));
 
       Assert.assertEquals(1, configuration.getConnectionRouters().size());
       Assert.assertEquals("LF", 
configuration.getConnectionRouters().get(0).getLocalTargetFilter());
@@ -1586,6 +1667,8 @@ public class ConfigurationImplTest extends ServerTestBase 
{
 
       configuration.parsePrefixedProperties(properties, null);
 
+      Assert.assertTrue(configuration.getStatus(), 
configuration.getStatus().contains("\"errors\":[]"));
+
       Assert.assertEquals(2, configuration.getAcceptorConfigurations().size());
 
       TransportConfiguration artemisTransportConfiguration = 
configuration.getAcceptorConfigurations().stream().filter(
@@ -1601,6 +1684,13 @@ public class ConfigurationImplTest extends 
ServerTestBase {
          transportConfiguration -> 
transportConfiguration.getName().equals("new")).findFirst().get();
       
Assert.assertTrue(newTransportConfiguration.getExtraParams().containsKey("supportAdvisory"));
       Assert.assertEquals("true", 
newTransportConfiguration.getExtraParams().get("supportAdvisory"));
+      Assert.assertEquals("null", 
newTransportConfiguration.getFactoryClassName());
+
+      // update with correct factoryClassName
+      properties.put("acceptorConfigurations.new.factoryClassName", 
NETTY_ACCEPTOR_FACTORY);
+      configuration.parsePrefixedProperties(properties, null);
+      Assert.assertTrue(configuration.getStatus(), 
configuration.getStatus().contains("\"errors\":[]"));
+      Assert.assertEquals(NETTY_ACCEPTOR_FACTORY, 
newTransportConfiguration.getFactoryClassName());
    }
 
 
@@ -2104,6 +2194,19 @@ public class ConfigurationImplTest extends 
ServerTestBase {
       Assert.assertEquals(25 * 1024, configuration.getGlobalMaxSize());
    }
 
+   @Test
+   public void journalRetentionPeriod() throws Throwable {
+      ConfigurationImpl configuration = new ConfigurationImpl();
+
+      Properties properties = new Properties();
+      properties.put("journalRetentionPeriod", TimeUnit.DAYS.toMillis(1));
+
+      configuration.parsePrefixedProperties(properties, null);
+
+      Assert.assertTrue(configuration.getStatus(), 
configuration.getStatus().contains("\"errors\":[]"));
+      Assert.assertEquals(TimeUnit.DAYS.toMillis(1), 
configuration.getJournalRetentionPeriod());
+   }
+
    @Test
    public void testSystemPropValueReplaced() throws Exception {
       ConfigurationImpl configuration = new ConfigurationImpl();
@@ -2215,7 +2318,7 @@ public class ConfigurationImplTest extends ServerTestBase 
{
    public void testEnumConversion() throws Exception {
       ConfigurationImpl configuration = new ConfigurationImpl();
       Properties properties = new Properties();
-      properties.put("clusterConfiguration.cc.name", "cc");
+      properties.put("clusterConfigurations.cc.name", "cc");
       properties.put("clusterConfigurations.cc.messageLoadBalancingType", 
"OFF_WITH_REDISTRIBUTION");
       properties.put("criticalAnalyzerPolicy", "SHUTDOWN");
 
@@ -2433,13 +2536,15 @@ public class ConfigurationImplTest extends 
ServerTestBase {
       // verify invalid map errors out
       insertionOrderedProperties = new 
ConfigurationImpl.InsertionOrderedProperties();
 
-      // possible to change any attribute, but plugins only registered on start
+      // 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");
 
       configuration.parsePrefixedProperties(insertionOrderedProperties, null);
 
+      // verify error
       Assert.assertFalse(configuration.getStatus().contains("\"errors\":[]"));
       Assert.assertTrue(configuration.getStatus().contains("LOG_ALL_EVENTS"));
+      Assert.assertTrue(configuration.getStatus().contains("Unknown property 
'name'"));
    }
 
    @Test
@@ -2461,13 +2566,14 @@ public class ConfigurationImplTest extends 
ServerTestBase {
       // verify invalid map errors out
       insertionOrderedProperties = new 
ConfigurationImpl.InsertionOrderedProperties();
 
-      // possible to change any attribute, but plugins only registered on start
+      // impossible to change any attribute unless there is a name attribute, 
but plugins only registered on start
       
insertionOrderedProperties.put("securitySettingPlugins.\"org.apache.activemq.artemis.core.server.impl.LegacyLDAPSecuritySettingPlugin.class\".init",
 "initialContextFactory");
 
       configuration.parsePrefixedProperties(insertionOrderedProperties, null);
 
       Assert.assertFalse(configuration.getStatus().contains("\"errors\":[]"));
       
Assert.assertTrue(configuration.getStatus().contains("initialContextFactory"));
+      Assert.assertTrue(configuration.getStatus().contains("Unknown property 
'name'"));
    }
 
    /**

Reply via email to