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 091c439073 ARTEMIS-5332 add exportConfigAsProperties operation to
server control
091c439073 is described below
commit 091c4390735ee5928a96df1433b05e0849194bbe
Author: Gary Tully <[email protected]>
AuthorDate: Wed Feb 26 18:01:46 2025 +0000
ARTEMIS-5332 add exportConfigAsProperties operation to server control
---
.../apache/activemq/artemis/logs/AuditLogger.java | 7 +
.../FluentPropertyBeanIntrospectorWithIgnores.java | 26 +-
.../api/core/management/ActiveMQServerControl.java | 3 +
.../FederationAddressPolicyConfiguration.java | 3 +
.../FederationQueuePolicyConfiguration.java | 3 +
.../artemis/core/config/Configuration.java | 4 +-
.../AMQPBrokerConnectConfiguration.java | 9 +-
.../AMQPBrokerConnectionElement.java | 2 +-
.../AMQPFederationAddressPolicyElement.java | 3 +
.../AMQPFederationQueuePolicyElement.java | 3 +
.../AMQPPeerBrokerConnectionElement.java | 25 ++
.../AMQPReceiverBrokerConnectionElement.java | 26 ++
.../AMQPSenderBrokerConnectionElement.java | 25 ++
.../core/config/impl/ConfigurationImpl.java | 255 +++++++++++-
.../management/impl/ActiveMQServerControlImpl.java | 19 +-
.../core/settings/impl/AddressSettings.java | 4 +-
.../core/config/impl/ConfigurationImplTest.java | 153 ++++++-
.../core/config/impl/FileConfigurationTest.java | 463 +++++++++++----------
.../resources/ConfigurationTest-full-config.xml | 6 +-
...ConfigurationTest-xinclude-config-acceptors.xml | 4 +-
...rationTest-xinclude-schema-config-acceptors.xml | 4 +-
docs/user-manual/management.adoc | 6 +
.../management/ActiveMQServerControlTest.java | 21 +
.../ActiveMQServerControlUsingCoreTest.java | 5 +
24 files changed, 818 insertions(+), 261 deletions(-)
diff --git
a/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
b/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
index 32b1600add..4b0c1773d0 100644
---
a/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
+++
b/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
@@ -2859,4 +2859,11 @@ public interface AuditLogger {
@LogMessage(id = 601797, value = "User {} is getting total session count on
target resource: {}", level = LogMessage.Level.INFO)
void getTotalSessionCount(String user, Object source);
+
+ static void exportConfigAsProperties(Object source) {
+ BASE_LOGGER.exportConfigAsProperties(getCaller(), source);
+ }
+
+ @LogMessage(id = 601798, value = "User {} is exporting configuration as
properties on target resource: {}", level = LogMessage.Level.INFO)
+ void exportConfigAsProperties(String user, Object source);
}
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 4ab1c4bad5..31ff14d378 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
@@ -36,13 +36,13 @@ public class FluentPropertyBeanIntrospectorWithIgnores
extends FluentPropertyBea
private static ConcurrentHashSet<Pair<String, String>> ignores = new
ConcurrentHashSet<>();
- public static void addIgnore(String className, String propertyName) {
- logger.trace("Adding ignore on {}/{}", className, propertyName);
- ignores.add(new Pair<>(className, propertyName));
+ public static void addIgnore(String className, String methodName) {
+ logger.trace("Adding ignore on {}/{}", className, methodName);
+ ignores.add(new Pair<>(className, methodName));
}
- public static boolean isIgnored(String className, String propertyName) {
- return ignores.contains(new Pair<>(className, propertyName));
+ public static boolean isIgnored(String className, String methodName) {
+ return ignores.contains(new Pair<>(className, methodName));
}
@Override
@@ -72,6 +72,15 @@ public class FluentPropertyBeanIntrospectorWithIgnores
extends FluentPropertyBea
if (pd != null) {
readMethod = pd.getReadMethod();
}
+ if (readMethod == null) {
+ try {
+ if (writeMethod != null && writeMethod.getParameterTypes().length
== 1 && writeMethod.getParameterTypes()[0].equals(Boolean.class)) {
+ // is methods with Boolean return are not valid bean accessors
but our fluent classes use them
+ readMethod = icontext.getTargetClass().getMethod("is" +
capitalise(propertyName), null);
+ }
+ } catch (NoSuchMethodException ignored) {
+ }
+ }
try {
PropertyDescriptor withFluentWrite =
createFluentPropertyDescriptor(readMethod, writeMethod, propertyName);
icontext.addPropertyDescriptor(withFluentWrite);
@@ -80,6 +89,13 @@ public class FluentPropertyBeanIntrospectorWithIgnores
extends FluentPropertyBea
}
}
+ private String capitalise(String name) {
+ if (name.length() > 1) {
+ return name.substring(0, 1).toUpperCase() + name.substring(1);
+ }
+ return name;
+ }
+
private PropertyDescriptor createFluentPropertyDescriptor(Method
readMethod, Method writeMethod, String propertyName) throws
IntrospectionException {
return new PropertyDescriptor(propertyName, readMethod, writeMethod);
}
diff --git
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ActiveMQServerControl.java
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ActiveMQServerControl.java
index 3b41e6b2ed..307ec0af2d 100644
---
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ActiveMQServerControl.java
+++
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ActiveMQServerControl.java
@@ -2090,5 +2090,8 @@ public interface ActiveMQServerControl {
@Attribute(desc = AUTHORIZATION_FAILURE_COUNT)
long getAuthorizationFailureCount();
+
+ @Operation(desc = "Export the broker configuration as properties", impact =
MBeanOperationInfo.ACTION)
+ void exportConfigAsProperties() throws Exception;
}
diff --git
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/config/federation/FederationAddressPolicyConfiguration.java
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/config/federation/FederationAddressPolicyConfiguration.java
index fd6aa3bb6d..16f2c13e3f 100644
---
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/config/federation/FederationAddressPolicyConfiguration.java
+++
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/config/federation/FederationAddressPolicyConfiguration.java
@@ -177,6 +177,9 @@ public class FederationAddressPolicyConfiguration
implements FederationPolicy<Fe
private String name;
public String getName() {
+ if (name == null) {
+ return addressMatch;
+ }
return name;
}
diff --git
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/config/federation/FederationQueuePolicyConfiguration.java
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/config/federation/FederationQueuePolicyConfiguration.java
index 6b93de81f4..116d405a87 100644
---
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/config/federation/FederationQueuePolicyConfiguration.java
+++
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/config/federation/FederationQueuePolicyConfiguration.java
@@ -139,6 +139,9 @@ public class FederationQueuePolicyConfiguration implements
FederationPolicy<Fede
private String name;
public String getName() {
+ if (name == null) {
+ return addressMatch + queueMatch;
+ }
return name;
}
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
index 501ae3b53e..9dde060a20 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
@@ -1198,7 +1198,7 @@ public interface Configuration {
Configuration setMaskPassword(Boolean maskPassword);
/**
- * If passwords are masked. True means the passwords are masked.enableda
+ * If passwords are masked. True means the passwords are masked.
*/
Boolean isMaskPassword();
@@ -1504,4 +1504,6 @@ public interface Configuration {
Configuration setMirrorAckManagerWarnUnacked(boolean warnUnacked);
boolean isMirrorAckManagerWarnUnacked();
+
+ void exportAsProperties(File to) throws Exception;
}
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 009f9c198f..527c024025 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
@@ -83,8 +83,7 @@ public class AMQPBrokerConnectConfiguration extends
BrokerConnectConfiguration {
return connectionElements;
}
- public AMQPBrokerConnectConfiguration addPeer(AMQPBrokerConnectionElement
element) {
- element.setType(AMQPBrokerConnectionAddressType.PEER);
+ public AMQPBrokerConnectConfiguration
addPeer(AMQPPeerBrokerConnectionElement element) {
return addElement(element);
}
@@ -92,8 +91,7 @@ public class AMQPBrokerConnectConfiguration extends
BrokerConnectConfiguration {
return connectionElements;
}
- public AMQPBrokerConnectConfiguration addSender(AMQPBrokerConnectionElement
element) {
- element.setType(AMQPBrokerConnectionAddressType.SENDER);
+ public AMQPBrokerConnectConfiguration
addSender(AMQPSenderBrokerConnectionElement element) {
return addElement(element);
}
@@ -101,8 +99,7 @@ public class AMQPBrokerConnectConfiguration extends
BrokerConnectConfiguration {
return connectionElements;
}
- public AMQPBrokerConnectConfiguration
addReceiver(AMQPBrokerConnectionElement element) {
- element.setType(AMQPBrokerConnectionAddressType.RECEIVER);
+ public AMQPBrokerConnectConfiguration
addReceiver(AMQPReceiverBrokerConnectionElement element) {
return addElement(element);
}
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/amqpBrokerConnectivity/AMQPBrokerConnectionElement.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/amqpBrokerConnectivity/AMQPBrokerConnectionElement.java
index b237f074a4..ead5773933 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/amqpBrokerConnectivity/AMQPBrokerConnectionElement.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/amqpBrokerConnectivity/AMQPBrokerConnectionElement.java
@@ -27,7 +27,7 @@ public class AMQPBrokerConnectionElement implements
Serializable {
private static final long serialVersionUID = 3653295602796835937L;
- String name;
+ String name = "default";
SimpleString matchAddress;
SimpleString queueName;
AMQPBrokerConnectionAddressType type;
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/amqpBrokerConnectivity/AMQPFederationAddressPolicyElement.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/amqpBrokerConnectivity/AMQPFederationAddressPolicyElement.java
index 71c30b21e5..139102c0bd 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/amqpBrokerConnectivity/AMQPFederationAddressPolicyElement.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/amqpBrokerConnectivity/AMQPFederationAddressPolicyElement.java
@@ -210,6 +210,9 @@ public final class AMQPFederationAddressPolicyElement
implements Serializable {
private String addressMatch;
public String getName() {
+ if (name == null) {
+ return addressMatch;
+ }
return name;
}
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/amqpBrokerConnectivity/AMQPFederationQueuePolicyElement.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/amqpBrokerConnectivity/AMQPFederationQueuePolicyElement.java
index e790bd946c..7b42dff02d 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/amqpBrokerConnectivity/AMQPFederationQueuePolicyElement.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/amqpBrokerConnectivity/AMQPFederationQueuePolicyElement.java
@@ -179,6 +179,9 @@ public final class AMQPFederationQueuePolicyElement
implements Serializable {
private String queueMatch;
public String getName() {
+ if (name == null) {
+ return addressMatch + queueMatch;
+ }
return name;
}
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/amqpBrokerConnectivity/AMQPPeerBrokerConnectionElement.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/amqpBrokerConnectivity/AMQPPeerBrokerConnectionElement.java
new file mode 100644
index 0000000000..1929f72dc5
--- /dev/null
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/amqpBrokerConnectivity/AMQPPeerBrokerConnectionElement.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq.artemis.core.config.amqpBrokerConnectivity;
+
+public class AMQPPeerBrokerConnectionElement extends
AMQPBrokerConnectionElement {
+ private static final long serialVersionUID = -5021968319469459695L;
+
+ public AMQPPeerBrokerConnectionElement() {
+ this.setType(AMQPBrokerConnectionAddressType.PEER);
+ }
+}
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/amqpBrokerConnectivity/AMQPReceiverBrokerConnectionElement.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/amqpBrokerConnectivity/AMQPReceiverBrokerConnectionElement.java
new file mode 100644
index 0000000000..466b66a4a0
--- /dev/null
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/amqpBrokerConnectivity/AMQPReceiverBrokerConnectionElement.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq.artemis.core.config.amqpBrokerConnectivity;
+
+public class AMQPReceiverBrokerConnectionElement extends
AMQPBrokerConnectionElement {
+
+ private static final long serialVersionUID = 5257427388207911228L;
+
+ public AMQPReceiverBrokerConnectionElement() {
+ this.setType(AMQPBrokerConnectionAddressType.RECEIVER);
+ }
+}
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/amqpBrokerConnectivity/AMQPSenderBrokerConnectionElement.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/amqpBrokerConnectivity/AMQPSenderBrokerConnectionElement.java
new file mode 100644
index 0000000000..82bf0d31e2
--- /dev/null
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/amqpBrokerConnectivity/AMQPSenderBrokerConnectionElement.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq.artemis.core.config.amqpBrokerConnectivity;
+
+public class AMQPSenderBrokerConnectionElement extends
AMQPBrokerConnectionElement {
+ private static final long serialVersionUID = -7213161391886866563L;
+
+ public AMQPSenderBrokerConnectionElement() {
+ this.setType(AMQPBrokerConnectionAddressType.SENDER);
+ }
+}
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 9564365569..1bc8e2b3cf 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
@@ -19,10 +19,12 @@ package org.apache.activemq.artemis.core.config.impl;
import java.beans.IndexedPropertyDescriptor;
import java.beans.PropertyDescriptor;
import java.io.BufferedReader;
+import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileReader;
+import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
@@ -42,21 +44,27 @@ import java.security.PrivilegedExceptionAction;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
+import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.Stack;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
import java.util.zip.Adler32;
import java.util.zip.Checksum;
import org.apache.activemq.artemis.api.config.ActiveMQDefaultConfiguration;
+import org.apache.activemq.artemis.api.core.BroadcastEndpointFactory;
import org.apache.activemq.artemis.api.core.BroadcastGroupConfiguration;
import org.apache.activemq.artemis.api.core.DiscoveryGroupConfiguration;
import org.apache.activemq.artemis.api.core.JsonUtil;
@@ -78,7 +86,13 @@ import
org.apache.activemq.artemis.core.config.MetricsConfiguration;
import org.apache.activemq.artemis.core.config.StoreConfiguration;
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.AMQPBrokerConnectionAddressType;
+import
org.apache.activemq.artemis.core.config.amqpBrokerConnectivity.AMQPBrokerConnectionElement;
import
org.apache.activemq.artemis.core.config.amqpBrokerConnectivity.AMQPFederationBrokerPlugin;
+import
org.apache.activemq.artemis.core.config.brokerConnectivity.BrokerConnectConfiguration;
+import
org.apache.activemq.artemis.core.config.federation.FederationAddressPolicyConfiguration;
+import org.apache.activemq.artemis.core.config.federation.FederationPolicy;
+import
org.apache.activemq.artemis.core.config.federation.FederationQueuePolicyConfiguration;
import org.apache.activemq.artemis.core.config.ha.ColocatedPolicyConfiguration;
import org.apache.activemq.artemis.core.config.ha.LiveOnlyPolicyConfiguration;
import org.apache.activemq.artemis.core.config.ha.ReplicaPolicyConfiguration;
@@ -125,6 +139,7 @@ import
org.apache.activemq.artemis.utils.PasswordMaskingUtil;
import org.apache.activemq.artemis.utils.XMLUtil;
import org.apache.activemq.artemis.utils.critical.CriticalAnalyzerPolicy;
import org.apache.activemq.artemis.utils.uri.BeanSupport;
+import
org.apache.activemq.artemis.utils.uri.FluentPropertyBeanIntrospectorWithIgnores;
import org.apache.commons.beanutils.BeanUtilsBean;
import org.apache.commons.beanutils.ConvertUtilsBean;
import org.apache.commons.beanutils.Converter;
@@ -137,6 +152,8 @@ import org.apache.commons.beanutils.expression.Resolver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import static
org.apache.activemq.artemis.utils.PasswordMaskingUtil.isEncMasked;
+
public class ConfigurationImpl implements Configuration, Serializable {
private static final Logger logger =
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@@ -145,6 +162,8 @@ public class ConfigurationImpl implements Configuration,
Serializable {
public static final String PROPERTY_CLASS_SUFFIX = ".class";
+ public static final String REDACTED = "**redacted**";
+
private static final long serialVersionUID = 4077088945050267843L;
private String name = "localhost";
@@ -451,6 +470,7 @@ public class ConfigurationImpl implements Configuration,
Serializable {
private File artemisInstance;
private transient JsonObject jsonStatus =
JsonLoader.createObjectBuilder().build();
private transient Checksum transientChecksum = null;
+ private final Set<String> keysToRedact = new HashSet<>();
private JsonObject getJsonStatus() {
if (jsonStatus == null) {
@@ -548,10 +568,6 @@ public class ConfigurationImpl implements Configuration,
Serializable {
return brokerPropertiesRemoveValue;
}
- public void setBrokerPropertiesRemoveValue(String
brokerPropertiesRemoveValue) {
- this.brokerPropertiesRemoveValue = brokerPropertiesRemoveValue;
- }
-
@Override
public Configuration parseProperties(String fileUrlToProperties) throws
Exception {
// system property overrides location of file(s)
@@ -579,7 +595,7 @@ public class ConfigurationImpl implements Configuration,
Serializable {
return this;
}
- private void parseFileProperties(File file) throws Exception {
+ public void parseFileProperties(File file) throws Exception {
InsertionOrderedProperties brokerProperties = new
InsertionOrderedProperties();
try (FileReader fileReader = new FileReader(file);
BufferedReader reader = new BufferedReader(fileReader)) {
@@ -621,9 +637,13 @@ public class ConfigurationImpl implements Configuration,
Serializable {
checksum.update(value.getBytes(StandardCharsets.UTF_8));
value = XMLUtil.replaceSystemPropsInString(value);
- value = PasswordMaskingUtil.resolveMask(isMaskPassword(), value,
getPasswordCodec());
key = XMLUtil.replaceSystemPropsInString(key);
- logger.debug("Property config, {}={}", key, value);
+ final boolean masked = isEncMasked(value);
+ if (masked) {
+ value = PasswordMaskingUtil.resolveMask(null, value,
getPasswordCodec());
+ keysToRedact.add(key);
+ }
+ logger.debug("Property config, {}={}", key, (masked ||
shouldRedact(key)) ? REDACTED : value);
beanProperties.put(key, value);
}
alder32Hash = checksum.getValue();
@@ -919,7 +939,7 @@ public class ConfigurationImpl implements Configuration,
Serializable {
logger.trace("populate: bean: {} with {}", this, beanProperties);
- Map<String, String> errors = new HashMap<>();
+ Map<String, String> errors = new LinkedHashMap<>();
// Loop through the property name/value pairs to be set
for (final Map.Entry<String, ? extends Object> entry :
beanProperties.entrySet()) {
// Identify the property name and value(s) to be assigned
@@ -945,6 +965,209 @@ public class ConfigurationImpl implements Configuration,
Serializable {
updateApplyStatus(propsId, errors);
}
+ @Override
+ public void exportAsProperties(File file) throws Exception {
+ try (FileWriter writer = new FileWriter(file, StandardCharsets.UTF_8)) {
+ writeProperties(writer);
+ }
+ }
+
+ private void writeProperties(FileWriter writer) throws Exception {
+ final BeanUtilsBean beanUtilsBean = BeanUtilsBean.getInstance();
+ beanUtilsBean.getPropertyUtils().addBeanIntrospector(new
FluentPropertyBeanIntrospectorWithIgnores());
+
+ try (BufferedWriter bufferedWriter = new BufferedWriter(writer)) {
+ export(beanUtilsBean, new Stack<String>(), bufferedWriter, this);
+ }
+ }
+
+ final Set<String> ignored = Set.of(
+ // we report errors through the status, it should not typically be set
+ "status",
+ // we cannot import a map<string,set<string>> property and this feature
is only applied by the xml parser
+ "securityRoleNameMappings",
+ // another xml ism using a deprecated config object
+ "queueConfigs",
+ "encodeSize",
+ // duplicates
+ "federationPolicyMap", // core federation
+ "policySets",
+ "AMQPConnection",
+ "AMQPConnectionConfigurations",
+ "combinedParams",
+ "type",
+ // AMQPBrokerConnectConfiguration
+ // needs uri first
+ "uri",
+ // this relation breaks recursion
+ "parent",
+ // and connectionElements need to be split
+ "connectionElements"
+ );
+ private void export(BeanUtilsBean beanUtils, Stack<String> nested,
BufferedWriter bufferedWriter, Object value) {
+
+ if (value instanceof Collection collection) {
+ if (!collection.isEmpty()) {
+ // collection of strings, as a comma list
+ if (collection.stream().findFirst().orElseThrow() instanceof
String) {
+ exportKeyValue(nested, bufferedWriter, (String)
collection.stream().collect(Collectors.joining(",")));
+ } else if (collection instanceof EnumSet enumSet) {
+ exportKeyValue(nested, bufferedWriter, (String)
enumSet.stream().map(Object::toString).collect(Collectors.joining(",")));
+ } else {
+
+ Stream stream = collection.stream();
+ if (collection.stream().findFirst().orElseThrow() instanceof
AMQPBrokerConnectionElement amqpBrokerConnectionElement) {
+ // filter type from the shared underlying collection
+ String collectionName = nested.peek();
+ AMQPBrokerConnectionAddressType subsetType =
AMQPBrokerConnectionAddressType.valueOf(collectionName.substring(0,
collectionName.length() - 1).toUpperCase(Locale.ENGLISH));
+ stream = stream.filter((Object connectionElement)->
subsetType == ((AMQPBrokerConnectionElement)connectionElement).getType());
+ }
+ // output nested by name
+ stream.forEach((Consumer<Object>) o -> {
+ nested.push(extractName(o));
+ export(beanUtils, nested, bufferedWriter, o);
+ nested.pop();
+ });
+ }
+ }
+ } else if (value instanceof Map map) {
+ if (!map.isEmpty()) {
+ // possibly filter
+ Stream<Map.Entry<?, ?>> stream = map.entrySet().stream();
+ if (map.values().stream().findFirst().orElseThrow() instanceof
FederationPolicy) {
+ // filter type from the shared underlying collection
+ final Class filterOn = "addressPolicies".equals(nested.peek())
? FederationAddressPolicyConfiguration.class :
FederationQueuePolicyConfiguration.class;
+ stream = stream.filter((Map.Entry<?, ?> entry)->
filterOn.isAssignableFrom(entry.getClass()));
+ }
+ stream.forEach(entry -> {
+ // nested by name
+ nested.push(entry.getKey().toString());
+ export(beanUtils, nested, bufferedWriter, entry.getValue());
+ nested.pop();
+ });
+ }
+ } else if (isComplexConfigObject(value)) {
+
+ // these need constructor properties or .class values or particular
attributes as first entry
+ if (value instanceof BrokerConnectConfiguration
brokerConnectConfiguration) {
+ nested.push("uri"); // is in the ignored list so won't get
duplicated
+ exportKeyValue(nested, bufferedWriter,
brokerConnectConfiguration.getUri());
+ nested.pop();
+ } else if (value instanceof AMQPBrokerConnectionElement
connectionElement) {
+ nested.push("type"); // is in the ignored list so won't get
duplicated
+ exportKeyValue(nested, bufferedWriter,
connectionElement.getType().toString());
+ nested.pop();
+ } else if (value instanceof HAPolicyConfiguration
haPolicyConfiguration) {
+ exportKeyValue(nested, bufferedWriter,
haPolicyConfiguration.getType().toString());
+ } else if (value instanceof StoreConfiguration storeConfiguration) {
+ exportKeyValue(nested, bufferedWriter,
storeConfiguration.getStoreType().toString());
+ } else if (value instanceof NamedPropertyConfiguration
namedPropertyConfiguration) {
+ exportKeyValue(nested, bufferedWriter,
namedPropertyConfiguration.getName());
+ } else if (value instanceof BroadcastEndpointFactory
broadcastEndpointFactory) {
+ exportKeyValue(nested, bufferedWriter,
broadcastEndpointFactory.getClass().getCanonicalName() + ".class");
+ } else if (value instanceof ActiveMQMetricsPlugin plugin) {
+ exportKeyValue(nested, bufferedWriter,
plugin.getClass().getCanonicalName() + ".class");
+ nested.push("init");
+ exportKeyValue(nested, bufferedWriter, "");
+ nested.pop();
+ }
+ // recursive export via accessors
+
Arrays.stream(beanUtils.getPropertyUtils().getPropertyDescriptors(value)).filter(propertyDescriptor
-> {
+
+ if (ignored.contains(propertyDescriptor.getName())) {
+ return false;
+ }
+ final Method descriptorReadMethod =
propertyDescriptor.getReadMethod();
+ if (descriptorReadMethod == null) {
+ return false;
+ }
+ Method descriptorWriteMethod = propertyDescriptor.getWriteMethod();
+ if (descriptorWriteMethod == null) {
+ // we can write to a returned simple map or collection ok
+ final Class type = propertyDescriptor.getPropertyType();
+ return Map.class.isAssignableFrom(type) ||
Collection.class.isAssignableFrom(type);
+ }
+ return true;
+ }).sorted((a, b) ->
String.CASE_INSENSITIVE_ORDER.compare(a.getName(),
b.getName())).forEach(propertyDescriptor -> {
+ Object attributeValue = null;
+ try {
+ attributeValue =
propertyDescriptor.getReadMethod().invoke(value, null);
+ } catch (Exception e) {
+ throw new RuntimeException("accessing: " +
propertyDescriptor.getName() + "@" + nested, e);
+ }
+ if (attributeValue != null) {
+ nested.push(propertyDescriptor.getName());
+ export(beanUtils, nested, bufferedWriter, attributeValue);
+ nested.pop();
+ }
+ });
+ } else {
+ // string form works ok otherwise
+ exportKeyValue(nested, bufferedWriter, value.toString());
+ }
+ }
+
+ private void exportKeyValue(Stack<String> nested, BufferedWriter
bufferedWriter, String value) {
+ String key = writeKeyEquals(nested, bufferedWriter);
+
+ try {
+ if (shouldRedact(key)) {
+ bufferedWriter.write(REDACTED);
+ } else {
+ bufferedWriter.write(value);
+ }
+ bufferedWriter.newLine();
+ } catch (IOException e) {
+ throw new RuntimeException("error accessing: " + nested, e);
+ }
+ }
+
+ private boolean isComplexConfigObject(Object value) {
+ return !(value instanceof SimpleString || value instanceof Enum<?>) &&
value.getClass().getPackage().getName().contains("artemis");
+ }
+
+ private boolean shouldRedact(String name) {
+ return name.toUpperCase(Locale.ENGLISH).contains("PASSWORD") ||
keysToRedact.contains(name);
+ }
+
+ private String writeKeyEquals(Stack<String> nested, BufferedWriter
bufferedWriter) {
+
+ String key =
nested.stream().sequential().map(ConfigurationImpl::quote).collect(Collectors.joining("."));
+ try {
+ bufferedWriter.write(key);
+ bufferedWriter.write("=");
+ } catch (IOException e) {
+ throw new RuntimeException("error accessing: " + nested, e);
+ }
+ return key;
+ }
+
+ public static String quote(String s) {
+ String escaped = s.replace("=", "\\\\=").replace(":", "\\\\:");
+ if (s.contains(".")) {
+ escaped = "\"" + escaped + "\"";
+ }
+ return escaped;
+ }
+
+ String extractName(Object o) {
+ if (o instanceof String s) {
+ return s;
+ }
+ try {
+ Method m = o.getClass().getMethod("getName", null);
+ if (m != null) {
+ Object nameVal = m.invoke(o, null);
+ if (nameVal == null) {
+ return "name-attribute-must-be-set-for-properties-key-export";
+ }
+ return nameVal.toString();
+ }
+ } catch (Exception expectedAndWillDefaultToStringForm) {
+ }
+ return String.valueOf(o);
+ }
+
protected static boolean isClassProperty(String property) {
return property.endsWith(PROPERTY_CLASS_SUFFIX);
}
@@ -1460,6 +1683,7 @@ public class ConfigurationImpl implements Configuration,
Serializable {
}
@Override
+ @Deprecated
public ConfigurationImpl addQueueConfiguration(final CoreQueueConfiguration
config) {
coreQueueConfigurations.add(config);
return this;
@@ -3566,6 +3790,8 @@ public class ConfigurationImpl implements Configuration,
Serializable {
// or strategies becomes strategy etc.
addPropertyNameBuilder.append(collectionPropertyName, 1,
collectionPropertyName.length() - 3);
addPropertyNameBuilder.append('y');
+ } else if (collectionPropertyName.endsWith("Map")) {
+ addPropertyNameBuilder.append(collectionPropertyName, 1,
collectionPropertyName.length() - 3);
} else {
addPropertyNameBuilder.append(collectionPropertyName, 1,
collectionPropertyName.length() - 1);
}
@@ -3580,7 +3806,18 @@ public class ConfigurationImpl implements Configuration,
Serializable {
// has a String key
&& String.class.equals(method.getParameterTypes()[0])
// but not initialised from a String form (eg: uri)
- &&
!String.class.equals(method.getParameterTypes()[1])))).sorted((method1,
method2) -> method2.getParameterCount() -
method1.getParameterCount()).findFirst().orElse(null);
+ &&
!String.class.equals(method.getParameterTypes()[1])))).sorted((method1,
method2) -> {
+ int result = method2.getParameterCount() -
method1.getParameterCount();
+ if (result == 0) {
+ // choose non deprecated
+ if (method1.getDeclaredAnnotation(Deprecated.class) ==
null) {
+ result = 1;
+ } else {
+ result = -1;
+ }
+ }
+ return result;
+ }).findFirst().orElse(null);
if (candidate == null) {
throw new IllegalArgumentException("failed to locate add method
for collection property " + addPropertyName);
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
index 50532aecde..56a21d9825 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
@@ -157,7 +157,8 @@ import org.slf4j.LoggerFactory;
public class ActiveMQServerControlImpl extends AbstractControl implements
ActiveMQServerControl, NotificationEmitter,
org.apache.activemq.artemis.core.server.management.NotificationListener {
private static final Logger logger =
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-
+ public static final String CONFIG_AS_PROPERTIES_FILE =
"broker_config_as_properties.txt";
+ public static final String TMP_DIR_SYSTEM_PROPERTY = "java.io.tmpdir";
private final PostOffice postOffice;
@@ -4746,6 +4747,22 @@ public class ActiveMQServerControlImpl extends
AbstractControl implements Active
return server.getSecurityStore().getAuthorizationFailureCount();
}
+ @Override
+ public void exportConfigAsProperties() throws Exception {
+ if (AuditLogger.isBaseLoggingEnabled()) {
+ AuditLogger.exportConfigAsProperties(this.server);
+ }
+
+ try (AutoCloseable lock = server.managementLock()) {
+ if (System.getProperty(TMP_DIR_SYSTEM_PROPERTY) == null) {
+ throw new IllegalStateException(TMP_DIR_SYSTEM_PROPERTY + " system
property must be set");
+ } else {
+ File exportFileInTmp = new
File(System.getProperty(TMP_DIR_SYSTEM_PROPERTY), CONFIG_AS_PROPERTIES_FILE);
+ this.server.getConfiguration().exportAsProperties(exportFileInTmp);
+ }
+ }
+ }
+
public ActiveMQServer getServer() {
return server;
}
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/settings/impl/AddressSettings.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/settings/impl/AddressSettings.java
index 948ebf522f..1f8d050032 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/settings/impl/AddressSettings.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/settings/impl/AddressSettings.java
@@ -1272,7 +1272,7 @@ public class AddressSettings implements
Mergeable<AddressSettings>, Serializable
return idCacheSize;
}
- public AddressSettings setIDCacheSize(int idCacheSize) {
+ public AddressSettings setIDCacheSize(Integer idCacheSize) {
this.idCacheSize = idCacheSize;
return this;
}
@@ -1281,7 +1281,7 @@ public class AddressSettings implements
Mergeable<AddressSettings>, Serializable
return initialQueueBufferSize;
}
- public AddressSettings setInitialQueueBufferSize(int
initialQueueBufferSize) {
+ public AddressSettings setInitialQueueBufferSize(Integer
initialQueueBufferSize) {
this.initialQueueBufferSize = initialQueueBufferSize;
return this;
}
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 9e019323ae..32830ebe1a 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
@@ -16,15 +16,18 @@
*/
package org.apache.activemq.artemis.core.config.impl;
+import static
org.apache.activemq.artemis.core.config.impl.ConfigurationImpl.REDACTED;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
+import java.beans.PropertyDescriptor;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
@@ -104,6 +107,8 @@ import org.apache.activemq.artemis.utils.JsonLoader;
import org.apache.activemq.artemis.utils.RandomUtil;
import org.apache.activemq.artemis.utils.actors.ArtemisExecutor;
import org.apache.activemq.artemis.utils.critical.CriticalAnalyzerPolicy;
+import
org.apache.activemq.artemis.utils.uri.FluentPropertyBeanIntrospectorWithIgnores;
+import org.apache.commons.beanutils.BeanUtilsBean;
import org.apache.commons.lang3.ClassUtils;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
@@ -362,7 +367,7 @@ public class ConfigurationImplTest extends
AbstractConfigurationTestBase {
ConfigurationImpl configuration = new ConfigurationImpl();
Properties insertionOrderedProperties = new
ConfigurationImpl.InsertionOrderedProperties();
- insertionOrderedProperties.put("AMQPConnections.target.uri",
"localhost:61617");
+ insertionOrderedProperties.put("AMQPConnections.target.uri",
"tcp://localhost:61617");
insertionOrderedProperties.put("AMQPConnections.target.retryInterval",
55);
insertionOrderedProperties.put("AMQPConnections.target.reconnectAttempts", -2);
insertionOrderedProperties.put("AMQPConnections.target.user", "admin");
@@ -385,7 +390,7 @@ public class ConfigurationImplTest extends
AbstractConfigurationTestBase {
assertEquals(1, configuration.getAMQPConnections().size());
AMQPBrokerConnectConfiguration connectConfiguration =
configuration.getAMQPConnections().get(0);
assertEquals("target", connectConfiguration.getName());
- assertEquals("localhost:61617", connectConfiguration.getUri());
+ assertEquals("tcp://localhost:61617", connectConfiguration.getUri());
assertEquals(55, connectConfiguration.getRetryInterval());
assertEquals(-2, connectConfiguration.getReconnectAttempts());
assertEquals("admin", connectConfiguration.getUser());
@@ -403,6 +408,14 @@ public class ConfigurationImplTest extends
AbstractConfigurationTestBase {
assertEquals("foo",
amqpMirrorBrokerConnectionElement.getAddressFilter());
assertFalse(amqpMirrorBrokerConnectionElement.getProperties().isEmpty());
assertEquals("b",
amqpMirrorBrokerConnectionElement.getProperties().get("a"));
+
+ File exported = new File(getTestDirfile(),
"broker_config_as_properties_export.txt");
+ configuration.exportAsProperties(exported);
+
+ ConfigurationImpl loadFromExport = new ConfigurationImpl();
+ loadFromExport.parseFileProperties(exported);
+
+ assertTrue(loadFromExport.getStatus().contains("\"errors\":[]"));
}
@Test
@@ -421,7 +434,7 @@ public class ConfigurationImplTest extends
AbstractConfigurationTestBase {
final String policyType = local ? "localAddressPolicies" :
"remoteAddressPolicies";
final Properties insertionOrderedProperties = new
ConfigurationImpl.InsertionOrderedProperties();
- insertionOrderedProperties.put("AMQPConnections.target.uri",
"localhost:61617");
+ insertionOrderedProperties.put("AMQPConnections.target.uri",
"tcp://localhost:61617");
insertionOrderedProperties.put("AMQPConnections.target.retryInterval",
55);
insertionOrderedProperties.put("AMQPConnections.target.reconnectAttempts", -2);
insertionOrderedProperties.put("AMQPConnections.target.user", "admin");
@@ -447,7 +460,7 @@ public class ConfigurationImplTest extends
AbstractConfigurationTestBase {
assertEquals(1, configuration.getAMQPConnections().size());
AMQPBrokerConnectConfiguration connectConfiguration =
configuration.getAMQPConnections().get(0);
assertEquals("target", connectConfiguration.getName());
- assertEquals("localhost:61617", connectConfiguration.getUri());
+ assertEquals("tcp://localhost:61617", connectConfiguration.getUri());
assertEquals(55, connectConfiguration.getRetryInterval());
assertEquals(-2, connectConfiguration.getReconnectAttempts());
assertEquals("admin", connectConfiguration.getUser());
@@ -528,6 +541,14 @@ public class ConfigurationImplTest extends
AbstractConfigurationTestBase {
assertEquals(0,
amqpFederationBrokerConnectionElement.getLocalQueuePolicies().size());
assertEquals(0,
amqpFederationBrokerConnectionElement.getRemoteQueuePolicies().size());
+
+ File exported = new File(getTestDirfile(),
"broker_config_as_properties_export.txt");
+ configuration.exportAsProperties(exported);
+
+ ConfigurationImpl loadFromExport = new ConfigurationImpl();
+ loadFromExport.parseFileProperties(exported);
+
+ assertTrue(loadFromExport.getStatus().contains("\"errors\":[]"));
}
@Test
@@ -546,7 +567,7 @@ public class ConfigurationImplTest extends
AbstractConfigurationTestBase {
final String policyType = local ? "localQueuePolicies" :
"remoteQueuePolicies";
final Properties insertionOrderedProperties = new
ConfigurationImpl.InsertionOrderedProperties();
- insertionOrderedProperties.put("AMQPConnections.target.uri",
"localhost:61617");
+ insertionOrderedProperties.put("AMQPConnections.target.uri",
"tcp://localhost:61617");
insertionOrderedProperties.put("AMQPConnections.target.retryInterval",
55);
insertionOrderedProperties.put("AMQPConnections.target.reconnectAttempts", -2);
insertionOrderedProperties.put("AMQPConnections.target.user", "admin");
@@ -572,7 +593,7 @@ public class ConfigurationImplTest extends
AbstractConfigurationTestBase {
assertEquals(1, configuration.getAMQPConnections().size());
AMQPBrokerConnectConfiguration connectConfiguration =
configuration.getAMQPConnections().get(0);
assertEquals("target", connectConfiguration.getName());
- assertEquals("localhost:61617", connectConfiguration.getUri());
+ assertEquals("tcp://localhost:61617", connectConfiguration.getUri());
assertEquals(55, connectConfiguration.getRetryInterval());
assertEquals(-2, connectConfiguration.getReconnectAttempts());
assertEquals("admin", connectConfiguration.getUser());
@@ -656,6 +677,14 @@ public class ConfigurationImplTest extends
AbstractConfigurationTestBase {
assertEquals(0,
amqpFederationBrokerConnectionElement.getLocalAddressPolicies().size());
assertEquals(0,
amqpFederationBrokerConnectionElement.getRemoteAddressPolicies().size());
+
+ File exported = new File(getTestDirfile(),
"broker_config_as_properties_export.txt");
+ configuration.exportAsProperties(exported);
+
+ ConfigurationImpl loadFromExport = new ConfigurationImpl();
+ loadFromExport.parseFileProperties(exported);
+
+ assertTrue(loadFromExport.getStatus().contains("\"errors\":[]"));
}
@Test
@@ -1016,6 +1045,45 @@ public class ConfigurationImplTest extends
AbstractConfigurationTestBase {
assertEquals("secureexample",
configuration.getFederationConfigurations().get(0).getCredentials().getPassword());
}
+ @Test
+ public void testExportWithNonPasswordEnc() throws Exception {
+ ConfigurationImpl configuration = new ConfigurationImpl();
+
+ Properties properties = new
ConfigurationImpl.InsertionOrderedProperties();
+ properties.put("name", "ENC(2a7c211d21c295cdbcde3589c205decb)");
+
+ properties.put("AMQPConnections.target.uri",
"tcp://amq-dc1-tls-amqp-svc.dc1.svc.cluster.local:5673?clientFailureCheckPeriod=30000&connectionTTL=60000&sslEnabled=true&verifyHost=false&trustStorePath=/remote-cluster-truststore/client.ts");
+
properties.put("AMQPConnections.target.transportConfigurations.target.params.enc",
"ENC(2a7c211d21c295cdbcde3589c205decb)");
+
+ configuration.parsePrefixedProperties(properties, null);
+
+ assertTrue(configuration.getStatus().contains("\"errors\":[]"),
configuration.getStatus());
+
+ assertEquals("secureexample", configuration.getName());
+ assertEquals("secureexample",
configuration.getAMQPConnections().get(0).getTransportConfigurations().get(0).getParams().get("enc"));
+
+ File exported = new File(getTestDirfile(),
"broker_config_as_properties_export.txt");
+ configuration.exportAsProperties(exported);
+
+ ConfigurationImpl loadFromExport = new ConfigurationImpl();
+ loadFromExport.parseFileProperties(exported);
+
+ assertTrue(loadFromExport.getStatus().contains("\"errors\":[]"));
+
+ assertEquals(REDACTED, loadFromExport.getName());
+ assertEquals(REDACTED,
loadFromExport.getAMQPConnections().get(0).getTransportConfigurations().get(0).getParams().get("enc"));
+
+ ConfigurationImpl configurationCopy = (ConfigurationImpl)
loadFromExport.copy();
+ configurationCopy.exportAsProperties(exported);
+
+ ConfigurationImpl loadFromExportCopy = new ConfigurationImpl();
+ loadFromExportCopy.parseFileProperties(exported);
+
+ assertTrue(loadFromExportCopy.getStatus().contains("\"errors\":[]"));
+
+ assertEquals(REDACTED, loadFromExportCopy.getName());
+ assertEquals(REDACTED,
loadFromExportCopy.getAMQPConnections().get(0).getTransportConfigurations().get(0).getParams().get("enc"));
+ }
@Test
public void testAMQPBrokerConnectionMix() throws Throwable {
@@ -1043,6 +1111,12 @@ public class ConfigurationImplTest extends
AbstractConfigurationTestBase {
fail("unexpected amqp broker connection configuration: " +
amqpBrokerConnectConfiguration.getName());
}
}
+
+ File exported = new File(getTestDirfile(),
"broker_config_as_properties_export.txt");
+ configuration.exportAsProperties(exported);
+ ConfigurationImpl loadFromExport = new ConfigurationImpl();
+ loadFromExport.parseFileProperties(exported);
+ assertTrue(loadFromExport.getStatus().contains("\"errors\":[]"));
}
@Test
@@ -1177,12 +1251,13 @@ public class ConfigurationImplTest extends
AbstractConfigurationTestBase {
public void testAddressViaProperties() throws Throwable {
ConfigurationImpl configuration = new ConfigurationImpl();
- Properties properties = new Properties();
-
+ Properties properties = new
ConfigurationImpl.InsertionOrderedProperties();
+ properties.put("addressConfigurations.\"LB.TEST\".name", "LB.TEST");
properties.put("addressConfigurations.\"LB.TEST\".queueConfigs.\"LB.TEST\".routingType",
"ANYCAST");
properties.put("addressConfigurations.\"LB.TEST\".queueConfigs.\"LB.TEST\".durable",
"false");
configuration.parsePrefixedProperties(properties, null);
+ assertTrue(configuration.getStatus().contains("\"errors\":[]"));
assertEquals(1, configuration.getAddressConfigurations().size());
assertEquals(1,
configuration.getAddressConfigurations().get(0).getQueueConfigs().size());
@@ -1355,9 +1430,12 @@ public class ConfigurationImplTest extends
AbstractConfigurationTestBase {
properties.put("addressSettings.NeedToSet.defaultExclusiveQueue",
"true");
properties.put("addressSettings.NeedToSet.defaultMaxConsumers", 10);
properties.put("addressSettings.NeedToSet.iDCacheSize", 10);
+ properties.put("addressSettings.NeedToSet.noExpiry", true);
configuration.parsePrefixedProperties(properties, null);
+ assertTrue(configuration.getStatus().contains("\"errors\":[]"),
configuration.getStatus());
+
assertEquals(4, configuration.getAddressSettings().size());
assertEquals(SimpleString.of("sharedExpiry"),
configuration.getAddressSettings().get("#").getExpiryAddress());
assertEquals(SimpleString.of("important"),
configuration.getAddressSettings().get("NeedToTrackExpired").getExpiryAddress());
@@ -1421,6 +1499,7 @@ public class ConfigurationImplTest extends
AbstractConfigurationTestBase {
assertTrue(configuration.getAddressSettings().get("NeedToSet").isDefaultExclusiveQueue());
assertEquals(Integer.valueOf(10),
configuration.getAddressSettings().get("NeedToSet").getDefaultMaxConsumers());
assertEquals(Integer.valueOf(10),
configuration.getAddressSettings().get("NeedToSet").getIDCacheSize());
+
assertTrue(configuration.getAddressSettings().get("NeedToSet").isNoExpiry());
}
@Test
@@ -1715,6 +1794,23 @@ public class ConfigurationImplTest extends
AbstractConfigurationTestBase {
assertFalse(role.isCreateAddress());
}
+ @Test
+ public void testSecurityRoleMappingsViaPropertiesNotSupported() throws
Exception {
+ ConfigurationImpl configuration = new ConfigurationImpl();
+ Properties properties = new Properties();
+
+ properties.put("securityRoleNameMappings.amq", "myrole4");
+
+ configuration.parsePrefixedProperties(properties, null);
+
+ assertTrue(configuration.getStatus().contains("\"errors\":[]"),
configuration.getStatus());
+
+ Exception expected = assertThrows(ClassCastException.class, ()-> {
+
configuration.getSecurityRoleNameMappings().get("amq").contains("myrole4");
+ });
+ assertTrue(expected.toString().contains("Set"));
+ }
+
@Test
public void testRoleAugmentViaProperties() throws Exception {
@@ -2481,6 +2577,27 @@ public class ConfigurationImplTest extends
AbstractConfigurationTestBase {
assertEquals(4321, configuration.getGlobalMaxSize());
}
+ @Test
+ public void testTypeMatchFluentDescriptor() throws Exception {
+ BeanUtilsBean beanUtilsBean = BeanUtilsBean.getInstance();
+ beanUtilsBean.getPropertyUtils().addBeanIntrospector(new
FluentPropertyBeanIntrospectorWithIgnores());
+ PropertyDescriptor propertyDescriptor =
beanUtilsBean.getPropertyUtils().getPropertyDescriptor(new DummyConfig(),
"aBooleanProperty");
+
+ assertNotNull(propertyDescriptor);
+ assertNotNull(propertyDescriptor.getReadMethod());
+
+ propertyDescriptor =
beanUtilsBean.getPropertyUtils().getPropertyDescriptor(new DummyConfig(),
"IDCacheSize");
+
+ assertNotNull(propertyDescriptor);
+ assertNotNull(propertyDescriptor.getReadMethod());
+ assertNotNull(propertyDescriptor.getWriteMethod());
+
+ // legacy access to a setter for this
+ propertyDescriptor =
beanUtilsBean.getPropertyUtils().getPropertyDescriptor(new DummyConfig(),
"iDCacheSize");
+ assertNotNull(propertyDescriptor);
+ assertNotNull(propertyDescriptor.getWriteMethod());
+ }
+
@Test
public void testConfigWithMultipleNullDescendantChildren() throws Throwable
{
String dummyPropertyPrefix = "dummy.";
@@ -2515,6 +2632,8 @@ public class ConfigurationImplTest extends
AbstractConfigurationTestBase {
public static class DummyConfig {
private int intProperty;
+ private int idCacheSize;
+ private Boolean aBooleanProperty;
private DummyConfig childConfig;
@@ -2527,6 +2646,24 @@ public class ConfigurationImplTest extends
AbstractConfigurationTestBase {
return this;
}
+ public Boolean isABooleanProperty() {
+ return aBooleanProperty;
+ }
+
+ public DummyConfig setABooleanProperty(Boolean booleanProperty) {
+ this.aBooleanProperty = booleanProperty;
+ return this;
+ }
+
+ public Integer getIDCacheSize() {
+ return idCacheSize;
+ }
+
+ public DummyConfig setIDCacheSize(Integer idCacheSize) {
+ this.idCacheSize = idCacheSize;
+ return this;
+ }
+
public DummyConfig getChildConfig() {
return childConfig;
}
diff --git
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
index c8ff820215..be2c322ae4 100644
---
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
+++
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
@@ -16,6 +16,7 @@
*/
package org.apache.activemq.artemis.core.config.impl;
+import static
org.apache.activemq.artemis.core.config.impl.ConfigurationImpl.REDACTED;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
@@ -179,89 +180,93 @@ public class FileConfigurationTest extends
AbstractConfigurationTestBase {
@TestTemplate
public void testFileConfiguration() {
+ validateFullConfig(conf);
+ }
+
+ private void validateFullConfig(Configuration configInstance) {
// Check they match the values from the test file
- assertEquals("SomeNameForUseOnTheApplicationServer", conf.getName());
- assertFalse(conf.isPersistenceEnabled());
- assertTrue(conf.isClustered());
- assertEquals(12345, conf.getScheduledThreadPoolMaxSize());
- assertEquals(54321, conf.getThreadPoolMaxSize());
- assertFalse(conf.isSecurityEnabled());
- assertEquals(5423, conf.getSecurityInvalidationInterval());
- assertEquals(333, conf.getAuthenticationCacheSize());
- assertEquals(444, conf.getAuthorizationCacheSize());
- assertTrue(conf.isWildcardRoutingEnabled());
- assertEquals(SimpleString.of("Giraffe"), conf.getManagementAddress());
- assertEquals(SimpleString.of("Whatever"),
conf.getManagementNotificationAddress());
- assertEquals("Frog", conf.getClusterUser());
- assertEquals("Wombat", conf.getClusterPassword());
- assertFalse(conf.isJMXManagementEnabled());
- assertEquals("gro.qtenroh", conf.getJMXDomain());
- assertTrue(conf.isMessageCounterEnabled());
- assertEquals(5, conf.getMessageCounterMaxDayHistory());
- assertEquals(123456, conf.getMessageCounterSamplePeriod());
- assertEquals(12345, conf.getConnectionTTLOverride());
- assertEquals(98765, conf.getTransactionTimeout());
- assertEquals(56789, conf.getTransactionTimeoutScanPeriod());
- assertEquals(10111213, conf.getMessageExpiryScanPeriod());
- assertEquals(25000, conf.getAddressQueueScanPeriod());
- assertEquals(127, conf.getIDCacheSize());
- assertTrue(conf.isPersistIDCache());
- assertEquals(Integer.valueOf(777), conf.getJournalDeviceBlockSize());
- assertTrue(conf.isPersistDeliveryCountBeforeDelivery());
- assertEquals("pagingdir", conf.getPagingDirectory());
- assertEquals("somedir", conf.getBindingsDirectory());
- assertFalse(conf.isCreateBindingsDir());
- assertTrue(conf.isAmqpUseCoreSubscriptionNaming());
- assertFalse(conf.isSuppressSessionNotifications());
- assertEquals("()", conf.getLiteralMatchMarkers());
-
- assertEquals(17, conf.getPageMaxConcurrentIO(), "max concurrent io");
- assertTrue(conf.isReadWholePage());
- assertEquals("somedir2", conf.getJournalDirectory());
- assertEquals("history", conf.getJournalRetentionDirectory());
- assertEquals(10L * 1024L * 1024L * 1024L,
conf.getJournalRetentionMaxBytes());
- assertEquals(TimeUnit.DAYS.toMillis(365),
conf.getJournalRetentionPeriod());
- assertFalse(conf.isCreateJournalDir());
- assertEquals(JournalType.NIO, conf.getJournalType());
- assertEquals(10000, conf.getJournalBufferSize_NIO());
- assertEquals(1000, conf.getJournalBufferTimeout_NIO());
- assertEquals(56546, conf.getJournalMaxIO_NIO());
- assertEquals(9876, conf.getJournalFileOpenTimeout());
-
- assertFalse(conf.isJournalSyncTransactional());
- assertTrue(conf.isJournalSyncNonTransactional());
- assertEquals(12345678, conf.getJournalFileSize());
- assertEquals(100, conf.getJournalMinFiles());
- assertEquals(123, conf.getJournalCompactMinFiles());
- assertEquals(33, conf.getJournalCompactPercentage());
- assertEquals(7654, conf.getJournalLockAcquisitionTimeout());
- assertTrue(conf.isGracefulShutdownEnabled());
- assertEquals(12345, conf.getGracefulShutdownTimeout());
- assertTrue(conf.isPopulateValidatedUser());
- assertFalse(conf.isRejectEmptyValidatedUser());
- assertEquals(123456, conf.getMqttSessionScanInterval());
- assertEquals(567890, conf.getMqttSessionStatePersistenceTimeout());
- assertEquals(98765, conf.getConnectionTtlCheckInterval());
- assertEquals(1234567, conf.getConfigurationFileRefreshPeriod());
- assertEquals("TEMP", conf.getTemporaryQueueNamespace());
-
- assertEquals("127.0.0.1", conf.getNetworkCheckList());
- assertEquals("some-nick", conf.getNetworkCheckNIC());
- assertEquals(123, conf.getNetworkCheckPeriod());
- assertEquals(321, conf.getNetworkCheckTimeout());
- assertEquals("ping-four", conf.getNetworkCheckPingCommand());
- assertEquals("ping-six", conf.getNetworkCheckPing6Command());
-
- assertEquals("largemessagesdir", conf.getLargeMessagesDirectory());
- assertEquals(95, conf.getMemoryWarningThreshold());
-
- assertEquals(2, conf.getIncomingInterceptorClassNames().size());
-
assertTrue(conf.getIncomingInterceptorClassNames().contains("org.apache.activemq.artemis.tests.unit.core.config.impl.TestInterceptor1"));
-
assertTrue(conf.getIncomingInterceptorClassNames().contains("org.apache.activemq.artemis.tests.unit.core.config.impl.TestInterceptor2"));
-
- assertEquals(2, conf.getConnectorConfigurations().size());
-
- TransportConfiguration tc =
conf.getConnectorConfigurations().get("connector1");
+ assertEquals("SomeNameForUseOnTheApplicationServer",
configInstance.getName());
+ assertFalse(configInstance.isPersistenceEnabled());
+ assertTrue(configInstance.isClustered());
+ assertEquals(12345, configInstance.getScheduledThreadPoolMaxSize());
+ assertEquals(54321, configInstance.getThreadPoolMaxSize());
+ assertFalse(configInstance.isSecurityEnabled());
+ assertEquals(5423, configInstance.getSecurityInvalidationInterval());
+ assertEquals(333, configInstance.getAuthenticationCacheSize());
+ assertEquals(444, configInstance.getAuthorizationCacheSize());
+ assertTrue(configInstance.isWildcardRoutingEnabled());
+ assertEquals(SimpleString.of("Giraffe"),
configInstance.getManagementAddress());
+ assertEquals(SimpleString.of("Whatever"),
configInstance.getManagementNotificationAddress());
+ assertEquals("Frog", configInstance.getClusterUser());
+ assertEquals("Wombat", configInstance.getClusterPassword());
+ assertFalse(configInstance.isJMXManagementEnabled());
+ assertEquals("gro.qtenroh", configInstance.getJMXDomain());
+ assertTrue(configInstance.isMessageCounterEnabled());
+ assertEquals(5, configInstance.getMessageCounterMaxDayHistory());
+ assertEquals(123456, configInstance.getMessageCounterSamplePeriod());
+ assertEquals(12345, configInstance.getConnectionTTLOverride());
+ assertEquals(98765, configInstance.getTransactionTimeout());
+ assertEquals(56789, configInstance.getTransactionTimeoutScanPeriod());
+ assertEquals(10111213, configInstance.getMessageExpiryScanPeriod());
+ assertEquals(25000, configInstance.getAddressQueueScanPeriod());
+ assertEquals(127, configInstance.getIDCacheSize());
+ assertTrue(configInstance.isPersistIDCache());
+ assertEquals(Integer.valueOf(777),
configInstance.getJournalDeviceBlockSize());
+ assertTrue(configInstance.isPersistDeliveryCountBeforeDelivery());
+ assertEquals("pagingdir", configInstance.getPagingDirectory());
+ assertEquals("somedir", configInstance.getBindingsDirectory());
+ assertFalse(configInstance.isCreateBindingsDir());
+ assertTrue(configInstance.isAmqpUseCoreSubscriptionNaming());
+ assertFalse(configInstance.isSuppressSessionNotifications());
+ assertEquals("()", configInstance.getLiteralMatchMarkers());
+
+ assertEquals(17, configInstance.getPageMaxConcurrentIO(), "max
concurrent io");
+ assertTrue(configInstance.isReadWholePage());
+ assertEquals("somedir2", configInstance.getJournalDirectory());
+ assertEquals("history", configInstance.getJournalRetentionDirectory());
+ assertEquals(10L * 1024L * 1024L * 1024L,
configInstance.getJournalRetentionMaxBytes());
+ assertEquals(TimeUnit.DAYS.toMillis(365),
configInstance.getJournalRetentionPeriod());
+ assertFalse(configInstance.isCreateJournalDir());
+ assertEquals(JournalType.NIO, configInstance.getJournalType());
+ assertEquals(10000, configInstance.getJournalBufferSize_NIO());
+ assertEquals(1000, configInstance.getJournalBufferTimeout_NIO());
+ assertEquals(56546, configInstance.getJournalMaxIO_NIO());
+ assertEquals(9876, configInstance.getJournalFileOpenTimeout());
+
+ assertFalse(configInstance.isJournalSyncTransactional());
+ assertTrue(configInstance.isJournalSyncNonTransactional());
+ assertEquals(12345678, configInstance.getJournalFileSize());
+ assertEquals(100, configInstance.getJournalMinFiles());
+ assertEquals(123, configInstance.getJournalCompactMinFiles());
+ assertEquals(33, configInstance.getJournalCompactPercentage());
+ assertEquals(7654, configInstance.getJournalLockAcquisitionTimeout());
+ assertTrue(configInstance.isGracefulShutdownEnabled());
+ assertEquals(12345, configInstance.getGracefulShutdownTimeout());
+ assertTrue(configInstance.isPopulateValidatedUser());
+ assertFalse(configInstance.isRejectEmptyValidatedUser());
+ assertEquals(123456, configInstance.getMqttSessionScanInterval());
+ assertEquals(567890,
configInstance.getMqttSessionStatePersistenceTimeout());
+ assertEquals(98765, configInstance.getConnectionTtlCheckInterval());
+ assertEquals(1234567,
configInstance.getConfigurationFileRefreshPeriod());
+ assertEquals("TEMP", configInstance.getTemporaryQueueNamespace());
+
+ assertEquals("127.0.0.1", configInstance.getNetworkCheckList());
+ assertEquals("some-nick", configInstance.getNetworkCheckNIC());
+ assertEquals(123, configInstance.getNetworkCheckPeriod());
+ assertEquals(321, configInstance.getNetworkCheckTimeout());
+ assertEquals("ping-four", configInstance.getNetworkCheckPingCommand());
+ assertEquals("ping-six", configInstance.getNetworkCheckPing6Command());
+
+ assertEquals("largemessagesdir",
configInstance.getLargeMessagesDirectory());
+ assertEquals(95, configInstance.getMemoryWarningThreshold());
+
+ assertEquals(2,
configInstance.getIncomingInterceptorClassNames().size());
+
assertTrue(configInstance.getIncomingInterceptorClassNames().contains("org.apache.activemq.artemis.tests.unit.core.config.impl.TestInterceptor1"));
+
assertTrue(configInstance.getIncomingInterceptorClassNames().contains("org.apache.activemq.artemis.tests.unit.core.config.impl.TestInterceptor2"));
+
+ assertEquals(2, configInstance.getConnectorConfigurations().size());
+
+ TransportConfiguration tc =
configInstance.getConnectorConfigurations().get("connector1");
assertNotNull(tc);
assertEquals("org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnectorFactory",
tc.getFactoryClassName());
assertEquals("mylocal", tc.getParams().get("localAddress"));
@@ -269,13 +274,13 @@ public class FileConfigurationTest extends
AbstractConfigurationTestBase {
assertEquals("localhost1", tc.getParams().get("host"));
assertEquals("5678", tc.getParams().get("port"));
- tc = conf.getConnectorConfigurations().get("connector2");
+ tc = configInstance.getConnectorConfigurations().get("connector2");
assertNotNull(tc);
assertEquals("org.apache.activemq.artemis.core.remoting.impl.invm.InVMConnectorFactory",
tc.getFactoryClassName());
assertEquals("5", tc.getParams().get("serverId"));
- assertEquals(2, conf.getAcceptorConfigurations().size());
- for (TransportConfiguration ac : conf.getAcceptorConfigurations()) {
+ assertEquals(2, configInstance.getAcceptorConfigurations().size());
+ for (TransportConfiguration ac :
configInstance.getAcceptorConfigurations()) {
if
(ac.getFactoryClassName().equals("org.apache.activemq.artemis.core.remoting.impl.netty.NettyAcceptorFactory"))
{
assertEquals("456", ac.getParams().get("tcpNoDelay"));
assertEquals("44", ac.getParams().get("connectionTtl"));
@@ -287,8 +292,8 @@ public class FileConfigurationTest extends
AbstractConfigurationTestBase {
}
}
- assertEquals(2, conf.getBroadcastGroupConfigurations().size());
- for (BroadcastGroupConfiguration bc :
conf.getBroadcastGroupConfigurations()) {
+ assertEquals(2, configInstance.getBroadcastGroupConfigurations().size());
+ for (BroadcastGroupConfiguration bc :
configInstance.getBroadcastGroupConfigurations()) {
UDPBroadcastEndpointFactory udpBc = (UDPBroadcastEndpointFactory)
bc.getEndpointFactory();
if (bc.getName().equals("bg1")) {
assertEquals("bg1", bc.getName());
@@ -307,23 +312,23 @@ public class FileConfigurationTest extends
AbstractConfigurationTestBase {
}
}
- assertEquals(2, conf.getDiscoveryGroupConfigurations().size());
- DiscoveryGroupConfiguration dc =
conf.getDiscoveryGroupConfigurations().get("dg1");
+ assertEquals(2, configInstance.getDiscoveryGroupConfigurations().size());
+ DiscoveryGroupConfiguration dc =
configInstance.getDiscoveryGroupConfigurations().get("dg1");
assertEquals("dg1", dc.getName());
assertEquals("192.168.0.120", ((UDPBroadcastEndpointFactory)
dc.getBroadcastEndpointFactory()).getGroupAddress());
assertEquals("172.16.8.10", ((UDPBroadcastEndpointFactory)
dc.getBroadcastEndpointFactory()).getLocalBindAddress());
assertEquals(11999, ((UDPBroadcastEndpointFactory)
dc.getBroadcastEndpointFactory()).getGroupPort());
assertEquals(12345, dc.getRefreshTimeout());
- dc = conf.getDiscoveryGroupConfigurations().get("dg2");
+ dc = configInstance.getDiscoveryGroupConfigurations().get("dg2");
assertEquals("dg2", dc.getName());
assertEquals("192.168.0.121", ((UDPBroadcastEndpointFactory)
dc.getBroadcastEndpointFactory()).getGroupAddress());
assertEquals("172.16.8.11", ((UDPBroadcastEndpointFactory)
dc.getBroadcastEndpointFactory()).getLocalBindAddress());
assertEquals(12999, ((UDPBroadcastEndpointFactory)
dc.getBroadcastEndpointFactory()).getGroupPort());
assertEquals(23456, dc.getRefreshTimeout());
- assertEquals(3, conf.getDivertConfigurations().size());
- for (DivertConfiguration dic : conf.getDivertConfigurations()) {
+ assertEquals(3, configInstance.getDivertConfigurations().size());
+ for (DivertConfiguration dic : configInstance.getDivertConfigurations())
{
if (dic.getName().equals("divert1")) {
assertEquals("divert1", dic.getName());
assertEquals("routing-name1", dic.getRoutingName());
@@ -348,8 +353,8 @@ public class FileConfigurationTest extends
AbstractConfigurationTestBase {
}
}
- assertEquals(6, conf.getConnectionRouters().size());
- for (ConnectionRouterConfiguration bc : conf.getConnectionRouters()) {
+ assertEquals(6, configInstance.getConnectionRouters().size());
+ for (ConnectionRouterConfiguration bc :
configInstance.getConnectionRouters()) {
if (bc.getName().equals("simple-local")) {
assertEquals(KeyType.CLIENT_ID, bc.getKeyType());
assertNotNull(bc.getLocalTargetFilter());
@@ -400,8 +405,8 @@ public class FileConfigurationTest extends
AbstractConfigurationTestBase {
}
}
- assertEquals(4, conf.getBridgeConfigurations().size());
- for (BridgeConfiguration bc : conf.getBridgeConfigurations()) {
+ assertEquals(4, configInstance.getBridgeConfigurations().size());
+ for (BridgeConfiguration bc : configInstance.getBridgeConfigurations()) {
if (bc.getName().equals("bridge1")) {
assertEquals("bridge1", bc.getName());
assertEquals("queue1", bc.getQueueName());
@@ -442,9 +447,9 @@ public class FileConfigurationTest extends
AbstractConfigurationTestBase {
}
}
- assertEquals(3, conf.getClusterConfigurations().size());
+ assertEquals(3, configInstance.getClusterConfigurations().size());
- HAPolicyConfiguration pc = conf.getHAPolicyConfiguration();
+ HAPolicyConfiguration pc = configInstance.getHAPolicyConfiguration();
assertNotNull(pc);
assertInstanceOf(PrimaryOnlyPolicyConfiguration.class, pc);
PrimaryOnlyPolicyConfiguration lopc = (PrimaryOnlyPolicyConfiguration)
pc;
@@ -453,7 +458,7 @@ public class FileConfigurationTest extends
AbstractConfigurationTestBase {
assertEquals("dg1",
lopc.getScaleDownConfiguration().getDiscoveryGroup());
assertEquals(33, lopc.getScaleDownConfiguration().getCommitInterval());
- for (ClusterConnectionConfiguration ccc :
conf.getClusterConfigurations()) {
+ for (ClusterConnectionConfiguration ccc :
configInstance.getClusterConfigurations()) {
if (ccc.getName().equals("cluster-connection3")) {
assertEquals(MessageLoadBalancingType.OFF_WITH_REDISTRIBUTION,
ccc.getMessageLoadBalancingType());
assertEquals(ActiveMQDefaultConfiguration.getDefaultClusterCallTimeout(),
ccc.getCallTimeout());
@@ -495,125 +500,125 @@ public class FileConfigurationTest extends
AbstractConfigurationTestBase {
}
}
- assertEquals(2, conf.getAddressSettings().size());
-
- assertNotNull(conf.getAddressSettings().get("a1"));
- assertNotNull(conf.getAddressSettings().get("a2"));
-
- assertEquals("a1.1",
conf.getAddressSettings().get("a1").getDeadLetterAddress().toString());
- assertEquals(AddressSettings.DEFAULT_AUTO_CREATE_DEAD_LETTER_RESOURCES,
conf.getAddressSettings().get("a1").isAutoCreateDeadLetterResources());
- assertEquals(AddressSettings.DEFAULT_DEAD_LETTER_QUEUE_PREFIX,
conf.getAddressSettings().get("a1").getDeadLetterQueuePrefix());
- assertEquals(AddressSettings.DEFAULT_DEAD_LETTER_QUEUE_SUFFIX,
conf.getAddressSettings().get("a1").getDeadLetterQueueSuffix());
- assertEquals("a1.2",
conf.getAddressSettings().get("a1").getExpiryAddress().toString());
- assertEquals(1L, (long)
conf.getAddressSettings().get("a1").getExpiryDelay());
- assertEquals(2L, (long)
conf.getAddressSettings().get("a1").getMinExpiryDelay());
- assertEquals(3L, (long)
conf.getAddressSettings().get("a1").getMaxExpiryDelay());
- assertTrue(conf.getAddressSettings().get("a1").isNoExpiry());
- assertEquals(AddressSettings.DEFAULT_AUTO_CREATE_EXPIRY_RESOURCES,
conf.getAddressSettings().get("a1").isAutoCreateExpiryResources());
- assertEquals(AddressSettings.DEFAULT_EXPIRY_QUEUE_PREFIX,
conf.getAddressSettings().get("a1").getExpiryQueuePrefix());
- assertEquals(AddressSettings.DEFAULT_EXPIRY_QUEUE_SUFFIX,
conf.getAddressSettings().get("a1").getExpiryQueueSuffix());
- assertEquals(1,
conf.getAddressSettings().get("a1").getRedeliveryDelay());
- assertEquals(0.5,
conf.getAddressSettings().get("a1").getRedeliveryCollisionAvoidanceFactor(), 0);
- assertEquals(856686592L,
conf.getAddressSettings().get("a1").getMaxSizeBytes());
- assertEquals(817381738L,
conf.getAddressSettings().get("a1").getPageSizeBytes());
- assertEquals(10,
conf.getAddressSettings().get("a1").getPageCacheMaxSize());
- assertEquals(4,
conf.getAddressSettings().get("a1").getMessageCounterHistoryDayLimit());
- assertEquals(10,
conf.getAddressSettings().get("a1").getSlowConsumerThreshold());
- assertEquals(SlowConsumerThresholdMeasurementUnit.MESSAGES_PER_HOUR,
conf.getAddressSettings().get("a1").getSlowConsumerThresholdMeasurementUnit());
- assertEquals(5,
conf.getAddressSettings().get("a1").getSlowConsumerCheckPeriod());
- assertEquals(SlowConsumerPolicy.NOTIFY,
conf.getAddressSettings().get("a1").getSlowConsumerPolicy());
- assertTrue(conf.getAddressSettings().get("a1").isAutoCreateJmsQueues());
- assertTrue(conf.getAddressSettings().get("a1").isAutoDeleteJmsQueues());
- assertTrue(conf.getAddressSettings().get("a1").isAutoCreateJmsTopics());
- assertTrue(conf.getAddressSettings().get("a1").isAutoDeleteJmsTopics());
- assertEquals(0,
conf.getAddressSettings().get("a1").getAutoDeleteQueuesDelay());
-
assertFalse(conf.getAddressSettings().get("a1").getAutoDeleteQueuesSkipUsageCheck());
- assertEquals(0,
conf.getAddressSettings().get("a1").getAutoDeleteAddressesDelay());
-
assertFalse(conf.getAddressSettings().get("a1").isAutoDeleteAddressesSkipUsageCheck());
-
assertNotNull(conf.getAddressSettings().get("a1").isDefaultPurgeOnNoConsumers());
-
assertFalse(conf.getAddressSettings().get("a1").isDefaultPurgeOnNoConsumers());
- assertEquals(Integer.valueOf(5),
conf.getAddressSettings().get("a1").getDefaultMaxConsumers());
- assertEquals(RoutingType.ANYCAST,
conf.getAddressSettings().get("a1").getDefaultQueueRoutingType());
- assertEquals(RoutingType.MULTICAST,
conf.getAddressSettings().get("a1").getDefaultAddressRoutingType());
- assertEquals(3,
conf.getAddressSettings().get("a1").getDefaultRingSize());
- assertEquals(0,
conf.getAddressSettings().get("a1").getRetroactiveMessageCount());
- assertTrue(conf.getAddressSettings().get("a1").isEnableMetrics());
-
assertTrue(conf.getAddressSettings().get("a1").isEnableIngressTimestamp());
- assertNull(conf.getAddressSettings().get("a1").getIDCacheSize());
-
assertNull(conf.getAddressSettings().get("a1").getInitialQueueBufferSize());
-
- assertEquals("a2.1",
conf.getAddressSettings().get("a2").getDeadLetterAddress().toString());
-
assertTrue(conf.getAddressSettings().get("a2").isAutoCreateDeadLetterResources());
- assertEquals("",
conf.getAddressSettings().get("a2").getDeadLetterQueuePrefix().toString());
- assertEquals(".DLQ",
conf.getAddressSettings().get("a2").getDeadLetterQueueSuffix().toString());
- assertEquals("a2.2",
conf.getAddressSettings().get("a2").getExpiryAddress().toString());
- assertEquals(-1L, (long)
conf.getAddressSettings().get("a2").getExpiryDelay());
- assertEquals(-1L, (long)
conf.getAddressSettings().get("a2").getMinExpiryDelay());
- assertEquals(-1L, (long)
conf.getAddressSettings().get("a2").getMaxExpiryDelay());
- assertFalse(conf.getAddressSettings().get("a2").isNoExpiry());
-
assertTrue(conf.getAddressSettings().get("a2").isAutoCreateDeadLetterResources());
- assertEquals("",
conf.getAddressSettings().get("a2").getExpiryQueuePrefix().toString());
- assertEquals(".EXP",
conf.getAddressSettings().get("a2").getExpiryQueueSuffix().toString());
- assertEquals(5,
conf.getAddressSettings().get("a2").getRedeliveryDelay());
- assertEquals(0.0,
conf.getAddressSettings().get("a2").getRedeliveryCollisionAvoidanceFactor(), 0);
- assertEquals(932489234928324L,
conf.getAddressSettings().get("a2").getMaxSizeBytes());
- assertEquals(712671626L,
conf.getAddressSettings().get("a2").getPageSizeBytes());
- assertEquals(20,
conf.getAddressSettings().get("a2").getPageCacheMaxSize());
- assertEquals(8,
conf.getAddressSettings().get("a2").getMessageCounterHistoryDayLimit());
- assertEquals(20,
conf.getAddressSettings().get("a2").getSlowConsumerThreshold());
- assertEquals(SlowConsumerThresholdMeasurementUnit.MESSAGES_PER_DAY,
conf.getAddressSettings().get("a2").getSlowConsumerThresholdMeasurementUnit());
- assertEquals(15,
conf.getAddressSettings().get("a2").getSlowConsumerCheckPeriod());
- assertEquals(SlowConsumerPolicy.KILL,
conf.getAddressSettings().get("a2").getSlowConsumerPolicy());
- assertFalse(conf.getAddressSettings().get("a2").isAutoCreateJmsQueues());
- assertFalse(conf.getAddressSettings().get("a2").isAutoDeleteJmsQueues());
- assertFalse(conf.getAddressSettings().get("a2").isAutoCreateJmsTopics());
- assertFalse(conf.getAddressSettings().get("a2").isAutoDeleteJmsTopics());
- assertEquals(500,
conf.getAddressSettings().get("a2").getAutoDeleteQueuesDelay());
-
assertTrue(conf.getAddressSettings().get("a2").getAutoDeleteQueuesSkipUsageCheck());
- assertEquals(1000,
conf.getAddressSettings().get("a2").getAutoDeleteAddressesDelay());
-
assertTrue(conf.getAddressSettings().get("a2").isAutoDeleteAddressesSkipUsageCheck());
-
assertNotNull(conf.getAddressSettings().get("a2").isDefaultPurgeOnNoConsumers());
-
assertTrue(conf.getAddressSettings().get("a2").isDefaultPurgeOnNoConsumers());
- assertEquals(Integer.valueOf(15),
conf.getAddressSettings().get("a2").getDefaultMaxConsumers());
- assertEquals(RoutingType.MULTICAST,
conf.getAddressSettings().get("a2").getDefaultQueueRoutingType());
- assertEquals(RoutingType.ANYCAST,
conf.getAddressSettings().get("a2").getDefaultAddressRoutingType());
- assertEquals(10000,
conf.getAddressSettings().get("a2").getDefaultConsumerWindowSize());
- assertEquals(-1,
conf.getAddressSettings().get("a2").getDefaultRingSize());
- assertEquals(10,
conf.getAddressSettings().get("a2").getRetroactiveMessageCount());
- assertFalse(conf.getAddressSettings().get("a2").isEnableMetrics());
-
assertFalse(conf.getAddressSettings().get("a2").isEnableIngressTimestamp());
- assertEquals(Integer.valueOf(500),
conf.getAddressSettings().get("a2").getIDCacheSize());
- assertEquals(Integer.valueOf(128),
conf.getAddressSettings().get("a2").getInitialQueueBufferSize());
-
- assertEquals(111, conf.getMirrorAckManagerQueueAttempts());
- assertTrue(conf.isMirrorAckManagerWarnUnacked());
- assertEquals(222, conf.getMirrorAckManagerPageAttempts());
- assertEquals(333, conf.getMirrorAckManagerRetryDelay());
- assertTrue(conf.isMirrorPageTransaction());
-
- assertTrue(conf.getResourceLimitSettings().containsKey("myUser"));
+ assertEquals(2, configInstance.getAddressSettings().size());
+
+ assertNotNull(configInstance.getAddressSettings().get("a1"));
+ assertNotNull(configInstance.getAddressSettings().get("a2"));
+
+ assertEquals("a1.1",
configInstance.getAddressSettings().get("a1").getDeadLetterAddress().toString());
+ assertEquals(AddressSettings.DEFAULT_AUTO_CREATE_DEAD_LETTER_RESOURCES,
configInstance.getAddressSettings().get("a1").isAutoCreateDeadLetterResources());
+ assertEquals(AddressSettings.DEFAULT_DEAD_LETTER_QUEUE_PREFIX,
configInstance.getAddressSettings().get("a1").getDeadLetterQueuePrefix());
+ assertEquals(AddressSettings.DEFAULT_DEAD_LETTER_QUEUE_SUFFIX,
configInstance.getAddressSettings().get("a1").getDeadLetterQueueSuffix());
+ assertEquals("a1.2",
configInstance.getAddressSettings().get("a1").getExpiryAddress().toString());
+ assertEquals(1L, (long)
configInstance.getAddressSettings().get("a1").getExpiryDelay());
+ assertEquals(2L, (long)
configInstance.getAddressSettings().get("a1").getMinExpiryDelay());
+ assertEquals(3L, (long)
configInstance.getAddressSettings().get("a1").getMaxExpiryDelay());
+ assertTrue(configInstance.getAddressSettings().get("a1").isNoExpiry());
+ assertEquals(AddressSettings.DEFAULT_AUTO_CREATE_EXPIRY_RESOURCES,
configInstance.getAddressSettings().get("a1").isAutoCreateExpiryResources());
+ assertEquals(AddressSettings.DEFAULT_EXPIRY_QUEUE_PREFIX,
configInstance.getAddressSettings().get("a1").getExpiryQueuePrefix());
+ assertEquals(AddressSettings.DEFAULT_EXPIRY_QUEUE_SUFFIX,
configInstance.getAddressSettings().get("a1").getExpiryQueueSuffix());
+ assertEquals(1,
configInstance.getAddressSettings().get("a1").getRedeliveryDelay());
+ assertEquals(0.5,
configInstance.getAddressSettings().get("a1").getRedeliveryCollisionAvoidanceFactor(),
0);
+ assertEquals(856686592L,
configInstance.getAddressSettings().get("a1").getMaxSizeBytes());
+ assertEquals(817381738L,
configInstance.getAddressSettings().get("a1").getPageSizeBytes());
+ assertEquals(10,
configInstance.getAddressSettings().get("a1").getPageCacheMaxSize());
+ assertEquals(4,
configInstance.getAddressSettings().get("a1").getMessageCounterHistoryDayLimit());
+ assertEquals(10,
configInstance.getAddressSettings().get("a1").getSlowConsumerThreshold());
+ assertEquals(SlowConsumerThresholdMeasurementUnit.MESSAGES_PER_HOUR,
configInstance.getAddressSettings().get("a1").getSlowConsumerThresholdMeasurementUnit());
+ assertEquals(5,
configInstance.getAddressSettings().get("a1").getSlowConsumerCheckPeriod());
+ assertEquals(SlowConsumerPolicy.NOTIFY,
configInstance.getAddressSettings().get("a1").getSlowConsumerPolicy());
+
assertTrue(configInstance.getAddressSettings().get("a1").isAutoCreateJmsQueues());
+
assertTrue(configInstance.getAddressSettings().get("a1").isAutoDeleteJmsQueues());
+
assertTrue(configInstance.getAddressSettings().get("a1").isAutoCreateJmsTopics());
+
assertTrue(configInstance.getAddressSettings().get("a1").isAutoDeleteJmsTopics());
+ assertEquals(0,
configInstance.getAddressSettings().get("a1").getAutoDeleteQueuesDelay());
+
assertFalse(configInstance.getAddressSettings().get("a1").getAutoDeleteQueuesSkipUsageCheck());
+ assertEquals(0,
configInstance.getAddressSettings().get("a1").getAutoDeleteAddressesDelay());
+
assertFalse(configInstance.getAddressSettings().get("a1").isAutoDeleteAddressesSkipUsageCheck());
+
assertNotNull(configInstance.getAddressSettings().get("a1").isDefaultPurgeOnNoConsumers());
+
assertFalse(configInstance.getAddressSettings().get("a1").isDefaultPurgeOnNoConsumers());
+ assertEquals(Integer.valueOf(5),
configInstance.getAddressSettings().get("a1").getDefaultMaxConsumers());
+ assertEquals(RoutingType.ANYCAST,
configInstance.getAddressSettings().get("a1").getDefaultQueueRoutingType());
+ assertEquals(RoutingType.MULTICAST,
configInstance.getAddressSettings().get("a1").getDefaultAddressRoutingType());
+ assertEquals(3,
configInstance.getAddressSettings().get("a1").getDefaultRingSize());
+ assertEquals(0,
configInstance.getAddressSettings().get("a1").getRetroactiveMessageCount());
+
assertTrue(configInstance.getAddressSettings().get("a1").isEnableMetrics());
+
assertTrue(configInstance.getAddressSettings().get("a1").isEnableIngressTimestamp());
+
assertNull(configInstance.getAddressSettings().get("a1").getIDCacheSize());
+
assertNull(configInstance.getAddressSettings().get("a1").getInitialQueueBufferSize());
+
+ assertEquals("a2.1",
configInstance.getAddressSettings().get("a2").getDeadLetterAddress().toString());
+
assertTrue(configInstance.getAddressSettings().get("a2").isAutoCreateDeadLetterResources());
+ assertEquals("",
configInstance.getAddressSettings().get("a2").getDeadLetterQueuePrefix().toString());
+ assertEquals(".DLQ",
configInstance.getAddressSettings().get("a2").getDeadLetterQueueSuffix().toString());
+ assertEquals("a2.2",
configInstance.getAddressSettings().get("a2").getExpiryAddress().toString());
+ assertEquals(-1L, (long)
configInstance.getAddressSettings().get("a2").getExpiryDelay());
+ assertEquals(-1L, (long)
configInstance.getAddressSettings().get("a2").getMinExpiryDelay());
+ assertEquals(-1L, (long)
configInstance.getAddressSettings().get("a2").getMaxExpiryDelay());
+ assertFalse(configInstance.getAddressSettings().get("a2").isNoExpiry());
+
assertTrue(configInstance.getAddressSettings().get("a2").isAutoCreateDeadLetterResources());
+ assertEquals("",
configInstance.getAddressSettings().get("a2").getExpiryQueuePrefix().toString());
+ assertEquals(".EXP",
configInstance.getAddressSettings().get("a2").getExpiryQueueSuffix().toString());
+ assertEquals(5,
configInstance.getAddressSettings().get("a2").getRedeliveryDelay());
+ assertEquals(0.0,
configInstance.getAddressSettings().get("a2").getRedeliveryCollisionAvoidanceFactor(),
0);
+ assertEquals(932489234928324L,
configInstance.getAddressSettings().get("a2").getMaxSizeBytes());
+ assertEquals(712671626L,
configInstance.getAddressSettings().get("a2").getPageSizeBytes());
+ assertEquals(20,
configInstance.getAddressSettings().get("a2").getPageCacheMaxSize());
+ assertEquals(8,
configInstance.getAddressSettings().get("a2").getMessageCounterHistoryDayLimit());
+ assertEquals(20,
configInstance.getAddressSettings().get("a2").getSlowConsumerThreshold());
+ assertEquals(SlowConsumerThresholdMeasurementUnit.MESSAGES_PER_DAY,
configInstance.getAddressSettings().get("a2").getSlowConsumerThresholdMeasurementUnit());
+ assertEquals(15,
configInstance.getAddressSettings().get("a2").getSlowConsumerCheckPeriod());
+ assertEquals(SlowConsumerPolicy.KILL,
configInstance.getAddressSettings().get("a2").getSlowConsumerPolicy());
+
assertFalse(configInstance.getAddressSettings().get("a2").isAutoCreateJmsQueues());
+
assertFalse(configInstance.getAddressSettings().get("a2").isAutoDeleteJmsQueues());
+
assertFalse(configInstance.getAddressSettings().get("a2").isAutoCreateJmsTopics());
+
assertFalse(configInstance.getAddressSettings().get("a2").isAutoDeleteJmsTopics());
+ assertEquals(500,
configInstance.getAddressSettings().get("a2").getAutoDeleteQueuesDelay());
+
assertTrue(configInstance.getAddressSettings().get("a2").getAutoDeleteQueuesSkipUsageCheck());
+ assertEquals(1000,
configInstance.getAddressSettings().get("a2").getAutoDeleteAddressesDelay());
+
assertTrue(configInstance.getAddressSettings().get("a2").isAutoDeleteAddressesSkipUsageCheck());
+
assertNotNull(configInstance.getAddressSettings().get("a2").isDefaultPurgeOnNoConsumers());
+
assertTrue(configInstance.getAddressSettings().get("a2").isDefaultPurgeOnNoConsumers());
+ assertEquals(Integer.valueOf(15),
configInstance.getAddressSettings().get("a2").getDefaultMaxConsumers());
+ assertEquals(RoutingType.MULTICAST,
configInstance.getAddressSettings().get("a2").getDefaultQueueRoutingType());
+ assertEquals(RoutingType.ANYCAST,
configInstance.getAddressSettings().get("a2").getDefaultAddressRoutingType());
+ assertEquals(10000,
configInstance.getAddressSettings().get("a2").getDefaultConsumerWindowSize());
+ assertEquals(-1,
configInstance.getAddressSettings().get("a2").getDefaultRingSize());
+ assertEquals(10,
configInstance.getAddressSettings().get("a2").getRetroactiveMessageCount());
+
assertFalse(configInstance.getAddressSettings().get("a2").isEnableMetrics());
+
assertFalse(configInstance.getAddressSettings().get("a2").isEnableIngressTimestamp());
+ assertEquals(Integer.valueOf(500),
configInstance.getAddressSettings().get("a2").getIDCacheSize());
+ assertEquals(Integer.valueOf(128),
configInstance.getAddressSettings().get("a2").getInitialQueueBufferSize());
+
+ assertEquals(111, configInstance.getMirrorAckManagerQueueAttempts());
+ assertTrue(configInstance.isMirrorAckManagerWarnUnacked());
+ assertEquals(222, configInstance.getMirrorAckManagerPageAttempts());
+ assertEquals(333, configInstance.getMirrorAckManagerRetryDelay());
+ assertTrue(configInstance.isMirrorPageTransaction());
+
+
assertTrue(configInstance.getResourceLimitSettings().containsKey("myUser"));
// continue testing deprecated method
- assertEquals(104,
conf.getResourceLimitSettings().get("myUser").getMaxConnections());
- assertEquals(104,
conf.getResourceLimitSettings().get("myUser").getMaxSessions());
- assertEquals(13,
conf.getResourceLimitSettings().get("myUser").getMaxQueues());
+ assertEquals(104,
configInstance.getResourceLimitSettings().get("myUser").getMaxConnections());
+ assertEquals(104,
configInstance.getResourceLimitSettings().get("myUser").getMaxSessions());
+ assertEquals(13,
configInstance.getResourceLimitSettings().get("myUser").getMaxQueues());
- assertEquals(2, conf.getQueueConfigs().size());
+ assertEquals(2, configInstance.getQueueConfigs().size());
- assertEquals("queue1",
conf.getQueueConfigs().get(0).getName().toString());
- assertEquals("address1",
conf.getQueueConfigs().get(0).getAddress().toString());
- assertEquals("color='red'",
conf.getQueueConfigs().get(0).getFilterString().toString());
- assertNotNull(conf.getQueueConfigs().get(0).isDurable());
- assertFalse(conf.getQueueConfigs().get(0).isDurable());
+ assertEquals("queue1",
configInstance.getQueueConfigs().get(0).getName().toString());
+ assertEquals("address1",
configInstance.getQueueConfigs().get(0).getAddress().toString());
+ assertEquals("color='red'",
configInstance.getQueueConfigs().get(0).getFilterString().toString());
+ assertNotNull(configInstance.getQueueConfigs().get(0).isDurable());
+ assertFalse(configInstance.getQueueConfigs().get(0).isDurable());
- assertEquals("queue2",
conf.getQueueConfigs().get(1).getName().toString());
- assertEquals("address2",
conf.getQueueConfigs().get(1).getAddress().toString());
- assertEquals("color='blue'",
conf.getQueueConfigs().get(1).getFilterString().toString());
- assertNotNull(conf.getQueueConfigs().get(1).isDurable());
- assertFalse(conf.getQueueConfigs().get(1).isDurable());
+ assertEquals("queue2",
configInstance.getQueueConfigs().get(1).getName().toString());
+ assertEquals("address2",
configInstance.getQueueConfigs().get(1).getAddress().toString());
+ assertEquals("color='blue'",
configInstance.getQueueConfigs().get(1).getFilterString().toString());
+ assertNotNull(configInstance.getQueueConfigs().get(1).isDurable());
+ assertFalse(configInstance.getQueueConfigs().get(1).isDurable());
verifyAddresses();
- Map<String, Set<Role>> roles = conf.getSecurityRoles();
+ Map<String, Set<Role>> roles = configInstance.getSecurityRoles();
assertEquals(2, roles.size());
@@ -640,26 +645,26 @@ public class FileConfigurationTest extends
AbstractConfigurationTestBase {
assertFalse(a2Role.isCreateNonDurableQueue());
assertTrue(a2Role.isDeleteNonDurableQueue());
assertFalse(a2Role.isManage());
- assertEquals(1234567, conf.getGlobalMaxSize());
- assertEquals(37, conf.getMaxDiskUsage());
- assertEquals(123, conf.getDiskScanPeriod());
+ assertEquals(1234567, configInstance.getGlobalMaxSize());
+ assertEquals(37, configInstance.getMaxDiskUsage());
+ assertEquals(123, configInstance.getDiskScanPeriod());
- assertEquals(333, conf.getCriticalAnalyzerCheckPeriod());
- assertEquals(777, conf.getCriticalAnalyzerTimeout());
- assertFalse(conf.isCriticalAnalyzer());
- assertEquals(CriticalAnalyzerPolicy.HALT,
conf.getCriticalAnalyzerPolicy());
+ assertEquals(333, configInstance.getCriticalAnalyzerCheckPeriod());
+ assertEquals(777, configInstance.getCriticalAnalyzerTimeout());
+ assertFalse(configInstance.isCriticalAnalyzer());
+ assertEquals(CriticalAnalyzerPolicy.HALT,
configInstance.getCriticalAnalyzerPolicy());
- assertFalse(conf.isJournalDatasync());
+ assertFalse(configInstance.isJournalDatasync());
// keep test for backwards compatibility
- ActiveMQMetricsPlugin metricsPlugin = conf.getMetricsPlugin();
+ ActiveMQMetricsPlugin metricsPlugin = configInstance.getMetricsPlugin();
assertInstanceOf(SimpleMetricsPlugin.class, metricsPlugin);
Map<String, String> options = ((SimpleMetricsPlugin)
metricsPlugin).getOptions();
assertEquals("x", options.get("foo"));
assertEquals("y", options.get("bar"));
assertEquals("z", options.get("baz"));
- MetricsConfiguration metricsConfiguration =
conf.getMetricsConfiguration();
+ MetricsConfiguration metricsConfiguration =
configInstance.getMetricsConfiguration();
assertInstanceOf(SimpleMetricsPlugin.class,
metricsConfiguration.getPlugin());
options = ((SimpleMetricsPlugin) metricsPlugin).getOptions();
assertEquals("x", options.get("foo"));
@@ -1020,6 +1025,22 @@ public class FileConfigurationTest extends
AbstractConfigurationTestBase {
doSetConnectionRoutersPolicyConfigurationTestImpl(new
FileConfiguration());
}
+ @TestTemplate()
+ public void testExportImportFromProperties() throws Exception {
+ File exported = new File(getTestDirfile(),
"broker_config_as_properties_export.txt");
+
+ conf.exportAsProperties(exported);
+
+ ConfigurationImpl configuration = new FileConfiguration();
+ configuration.parseFileProperties(exported);
+
+ assertTrue(configuration.getStatus().contains("\"errors\":[]"));
+
+ assertTrue(REDACTED.equals(configuration.getClusterPassword()));
+ configuration.setClusterPassword("Wombat");
+ validateFullConfig(configuration);
+ }
+
private Configuration createConfiguration(String filename) throws Exception
{
FileConfiguration fc = new FileConfiguration();
FileDeploymentManager deploymentManager = new
FileDeploymentManager(filename);
diff --git
a/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
b/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
index 543b2e96ef..db79760739 100644
--- a/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
+++ b/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
@@ -90,13 +90,13 @@
<connector name="connector2">vm://5</connector>
</connectors>
<acceptors>
- <acceptor>
+ <acceptor name="tcp">
tcp://0.0.0.0:61616?
tcpNoDelay=456;
connectionTtl=44;
connectionsAllowed=${ninetyTwoProp}
</acceptor>
- <acceptor>vm://0?e1=z1;e2=567;connectionsAllowed=87</acceptor>
+ <acceptor
name="vm">vm://0?e1=z1;e2=567;connectionsAllowed=87</acceptor>
</acceptors>
<broadcast-groups>
<broadcast-group name="bg1">
@@ -654,7 +654,7 @@
</resource-limit-setting>
</resource-limit-settings>
<connector-services>
- <connector-service>
+ <connector-service name="foo">
<factory-class>org.foo</factory-class>
</connector-service>
</connector-services>
diff --git
a/artemis-server/src/test/resources/ConfigurationTest-xinclude-config-acceptors.xml
b/artemis-server/src/test/resources/ConfigurationTest-xinclude-config-acceptors.xml
index 9ebad5712f..26e1636142 100644
---
a/artemis-server/src/test/resources/ConfigurationTest-xinclude-config-acceptors.xml
+++
b/artemis-server/src/test/resources/ConfigurationTest-xinclude-config-acceptors.xml
@@ -15,6 +15,6 @@
limitations under the License.
-->
<acceptors xmlns="urn:activemq:core">
-
<acceptor>tcp://0.0.0.0:61616?tcpNoDelay=456;connectionTtl=44;connectionsAllowed=${ninetyTwoProp}</acceptor>
- <acceptor>vm://0?e1=z1;e2=567;connectionsAllowed=87</acceptor>
+ <acceptor
name="tcp">tcp://0.0.0.0:61616?tcpNoDelay=456;connectionTtl=44;connectionsAllowed=${ninetyTwoProp}</acceptor>
+ <acceptor name="vm">vm://0?e1=z1;e2=567;connectionsAllowed=87</acceptor>
</acceptors>
\ No newline at end of file
diff --git
a/artemis-server/src/test/resources/ConfigurationTest-xinclude-schema-config-acceptors.xml
b/artemis-server/src/test/resources/ConfigurationTest-xinclude-schema-config-acceptors.xml
index 9ebad5712f..26e1636142 100644
---
a/artemis-server/src/test/resources/ConfigurationTest-xinclude-schema-config-acceptors.xml
+++
b/artemis-server/src/test/resources/ConfigurationTest-xinclude-schema-config-acceptors.xml
@@ -15,6 +15,6 @@
limitations under the License.
-->
<acceptors xmlns="urn:activemq:core">
-
<acceptor>tcp://0.0.0.0:61616?tcpNoDelay=456;connectionTtl=44;connectionsAllowed=${ninetyTwoProp}</acceptor>
- <acceptor>vm://0?e1=z1;e2=567;connectionsAllowed=87</acceptor>
+ <acceptor
name="tcp">tcp://0.0.0.0:61616?tcpNoDelay=456;connectionTtl=44;connectionsAllowed=${ninetyTwoProp}</acceptor>
+ <acceptor name="vm">vm://0?e1=z1;e2=567;connectionsAllowed=87</acceptor>
</acceptors>
\ No newline at end of file
diff --git a/docs/user-manual/management.adoc b/docs/user-manual/management.adoc
index c08e51d44f..b5244b5384 100644
--- a/docs/user-manual/management.adoc
+++ b/docs/user-manual/management.adoc
@@ -86,6 +86,12 @@ To do this use the `forceFailover()` operation.
Since this method actually stops the server you will probably receive some
sort of error depending on which management service you use to call it.
====
+* The effective configuration of the broker core can be exported as properties
using `exportConfigAsProperties()`. This operation will write a file to the
broker's tmp dir called `broker_config_as_properties.txt`. The content can
provide an entry point for using
xref:configuration-index.adoc#broker-properties[brokerProperties].
+
+[NOTE]
+====
+The broker's tmp dir is configured via the system property `java.io.tmpdir`.
The default value, set via the launch scripts, is `$ARTEMIS_INSTANCE/tmp`.
+====
=== Address Management
diff --git
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java
index cbca87d0be..1581f30008 100644
---
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java
+++
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java
@@ -26,6 +26,8 @@ import javax.jms.Topic;
import javax.jms.TopicSubscriber;
import javax.transaction.xa.XAResource;
import javax.transaction.xa.Xid;
+import java.io.File;
+import java.io.FileReader;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Field;
import java.nio.ByteBuffer;
@@ -39,6 +41,7 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Properties;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CountDownLatch;
@@ -83,6 +86,7 @@ import org.apache.activemq.artemis.core.config.Configuration;
import org.apache.activemq.artemis.core.config.DivertConfiguration;
import
org.apache.activemq.artemis.core.config.brokerConnectivity.BrokerConnectConfiguration;
import org.apache.activemq.artemis.core.config.impl.SecurityConfiguration;
+import
org.apache.activemq.artemis.core.management.impl.ActiveMQServerControlImpl;
import org.apache.activemq.artemis.core.management.impl.view.ConnectionField;
import org.apache.activemq.artemis.core.management.impl.view.ConsumerField;
import org.apache.activemq.artemis.core.management.impl.view.ProducerField;
@@ -138,6 +142,7 @@ import org.junit.jupiter.api.extension.ExtendWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import static
org.apache.activemq.artemis.core.management.impl.ActiveMQServerControlImpl.TMP_DIR_SYSTEM_PROPERTY;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
@@ -380,6 +385,22 @@ public class ActiveMQServerControlTest extends
ManagementTestBase {
assertEquals(1, serverControl.getAuthorizationFailureCount());
}
+ @TestTemplate
+ public void testExportAsProperties() throws Exception {
+
+ ActiveMQServerControl serverControl = createManagementControl();
+
+ serverControl.exportConfigAsProperties();
+
+ File out = new File(System.getProperty(TMP_DIR_SYSTEM_PROPERTY),
ActiveMQServerControlImpl.CONFIG_AS_PROPERTIES_FILE);
+ assertTrue(out.exists());
+ try (FileReader reader = new FileReader(out)) {
+ Properties properties = new Properties();
+ properties.load(reader);
+ assertEquals(properties.getProperty("name"), serverControl.getName());
+ }
+ }
+
@TestTemplate
public void testGetConnectors() throws Exception {
ActiveMQServerControl serverControl = createManagementControl();
diff --git
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlUsingCoreTest.java
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlUsingCoreTest.java
index 1260cd7bb0..4464cac8f9 100644
---
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlUsingCoreTest.java
+++
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlUsingCoreTest.java
@@ -1856,6 +1856,11 @@ public class ActiveMQServerControlUsingCoreTest extends
ActiveMQServerControlTes
public long getAuthorizationFailureCount() {
return (long)
proxy.retrieveAttributeValue("authorizationFailureCount");
}
+
+ @Override
+ public void exportConfigAsProperties() throws Exception {
+ proxy.invokeOperation("exportConfigAsProperties");
+ }
};
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information, visit: https://activemq.apache.org/contact