diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
index 30e64d6ae41..c75e2dc1e6f 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
@@ -671,19 +671,24 @@ public void parseMainConfig(final Element e, final Configuration config) throws
}
}
+ // Ensure AMQP federation configuration isn't picked up here by core federation
+ // configuration parsing, any AMQP federation configuration would generate empty
+ // Core federation configurations that would not create active federations.
NodeList federations = e.getElementsByTagName("federations");
for (int i = 0; i < federations.getLength(); i++) {
- Element fedNode = (Element) federations.item(i);
- parseFederationsConfiguration(fedNode, config);
- }
+ Element federationElement = (Element) federations.item(i);
- NodeList fedNodes = e.getElementsByTagName("federation");
+ // Handle attributes at the federations level and then add each nested federation.
+ parseFederationsConfiguration(federationElement, config);
- for (int i = 0; i < fedNodes.getLength(); i++) {
- Element fedNode = (Element) fedNodes.item(i);
+ for (int j = 0; j < federationElement.getChildNodes().getLength(); ++j) {
+ Node node = federationElement.getChildNodes().item(j);
- parseFederationConfiguration(fedNode, config);
+ if (node.getNodeName().equalsIgnoreCase("federation")) {
+ parseFederationConfiguration((Element) node, config);
+ }
+ }
}
NodeList gaNodes = e.getElementsByTagName("grouping-handler");
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationParserTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationParserTest.java
index b820fd83b7f..7f85aaf4849 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationParserTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationParserTest.java
@@ -34,6 +34,8 @@
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
+import java.util.function.Function;
+import java.util.stream.Collectors;
import org.apache.activemq.artemis.api.config.ActiveMQDefaultConfiguration;
import org.apache.activemq.artemis.api.core.SimpleString;
@@ -501,6 +503,196 @@ public void testDefaultBridgeProducerWindowSize() throws Exception {
assertEquals(ActiveMQDefaultConfiguration.getDefaultBridgeProducerWindowSize(), bconfig.getProducerWindowSize());
}
+ @Test
+ public void testCoreFederationIgnoresAMQPFederationConfigurations() throws Exception {
+ FileConfigurationParser parser = new FileConfigurationParser();
+ String middlePart = """
+
+
+
+
+
+
+
+
+
+
+
+
+
+ class-another
+
+
+
+
+
+
+
+
+
+ class-name
+
+
+
+ class-another
+
+
+
+
+
+
+ something
+
+
+
+
+
+
+
+
+
+
+
+
+
+ connector1
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ connector1
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+ connector1
+
+
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+ org.foo.FederationTransformer3
+
+
+
+
+
+
+
+ connector1
+
+
+
+
+
+ true
+
+
+
+ connector1
+
+
+
+
+
+
+
+
+ org.foo.FederationTransformer4
+
+
+
+
+ """;
+
+ String configStr = FIRST_PART + middlePart + LAST_PART;
+ ByteArrayInputStream input = new ByteArrayInputStream(configStr.getBytes(StandardCharsets.UTF_8));
+
+ Configuration config = parser.parseMainConfig(input);
+
+ assertEquals(4, config.getFederationConfigurations().size());
+
+ final Map federations =
+ config.getFederationConfigurations().stream()
+ .collect(Collectors.toMap(c -> c.getName(), Function.identity()));
+
+ assertTrue(federations.containsKey("federation1"));
+
+ final FederationConfiguration configuration1 = federations.get("federation1");
+
+ assertEquals(2, configuration1.getUpstreamConfigurations().size());
+ assertEquals(0, configuration1.getDownstreamConfigurations().size());
+ assertEquals(0, configuration1.getTransformerConfigurations().size());
+
+ assertTrue(federations.containsKey("federation2"));
+
+ final FederationConfiguration configuration2 = federations.get("federation2");
+
+ assertEquals(2, configuration2.getUpstreamConfigurations().size());
+ assertEquals(0, configuration2.getDownstreamConfigurations().size());
+ assertEquals(0, configuration2.getTransformerConfigurations().size());
+
+ assertTrue(federations.containsKey("federation3"));
+
+ final FederationConfiguration configuration3 = federations.get("federation3");
+
+ assertEquals(2, configuration3.getUpstreamConfigurations().size());
+ assertEquals(0, configuration3.getDownstreamConfigurations().size());
+ assertEquals(1, configuration3.getTransformerConfigurations().size());
+
+ assertTrue(federations.containsKey("federation4"));
+
+ final FederationConfiguration configuration4 = federations.get("federation4");
+
+ assertEquals(1, configuration4.getUpstreamConfigurations().size());
+ assertEquals(1, configuration4.getDownstreamConfigurations().size());
+ assertEquals(1, configuration4.getTransformerConfigurations().size());
+ }
+
@Test
public void testParsingOverflowPageSize() throws Exception {
testParsingOverFlow("""