diff --git a/artemis-jms-server/src/main/java/org/apache/activemq/artemis/jms/server/impl/JMSServerManagerImpl.java b/artemis-jms-server/src/main/java/org/apache/activemq/artemis/jms/server/impl/JMSServerManagerImpl.java index 115f194a6a9..9f092183779 100644 --- a/artemis-jms-server/src/main/java/org/apache/activemq/artemis/jms/server/impl/JMSServerManagerImpl.java +++ b/artemis-jms-server/src/main/java/org/apache/activemq/artemis/jms/server/impl/JMSServerManagerImpl.java @@ -783,7 +783,7 @@ public synchronized boolean destroyTopic(final String name) throws Exception { @Override public synchronized boolean destroyTopic(final String name, final boolean removeConsumers) throws Exception { checkInitialised(); - AddressControl addressControl = (AddressControl) server.getManagementService().getResource(ResourceNames.ADDRESS + name); + AddressControl addressControl = server.getManagementService().getAddressControl(ResourceNames.ADDRESS + name); if (addressControl != null) { for (String queueName : addressControl.getAllQueueNames()) { Binding binding = server.getPostOffice().getBinding(SimpleString.of(queueName)); diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/connect/bridge/AMQPBridgeManagementSupport.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/connect/bridge/AMQPBridgeManagementSupport.java index 9b8344a50d9..ff2353483e5 100644 --- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/connect/bridge/AMQPBridgeManagementSupport.java +++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/connect/bridge/AMQPBridgeManagementSupport.java @@ -109,8 +109,9 @@ public static void registerBridgeManager(AMQPBridgeManager bridge) throws Except final ManagementService management = server.getManagementService(); final AMQPBridgeManagerControlType control = new AMQPBridgeManagerControlType(server, bridge); + management.registerInJMX(getBridgeManagerObjectName(management, brokerConnectionName, bridgeName), control); - management.registerInRegistry(getBridgeManagerResourceName(brokerConnectionName, bridgeName), control); + management.registerAMQPControl(getBridgeManagerResourceName(brokerConnectionName, bridgeName), control); } /** @@ -128,7 +129,7 @@ public static void unregisterBridgeManager(AMQPBridgeManager bridge) throws Exce final ManagementService management = server.getManagementService(); management.unregisterFromJMX(getBridgeManagerObjectName(management, brokerConnectionName, bridgeName)); - management.unregisterFromRegistry(getBridgeManagerResourceName(brokerConnectionName, bridgeName)); + management.unRegisterAMQPControl(getBridgeManagerResourceName(brokerConnectionName, bridgeName)); } public static String getBridgeManagerResourceName(String brokerConnectionName, String bridgeName) { @@ -160,7 +161,7 @@ public static void registerBridgePolicyManager(AMQPBridgePolicyManager manager) final String policyName = manager.getPolicyName(); management.registerInJMX(getBridgePolicyManagerObjectName(management, brokerConnectionName, bridgeName, manager.getPolicyType().toString(), policyName), control); - management.registerInRegistry(getBridgePolicyManagerResourceName(brokerConnectionName, bridgeName, policyName), control); + management.registerAMQPControl(getBridgePolicyManagerResourceName(brokerConnectionName, bridgeName, policyName), control); } /** @@ -180,7 +181,7 @@ public static void unregisterBridgePolicyManager(AMQPBridgePolicyManager manager final String policyName = manager.getPolicyName(); management.unregisterFromJMX(getBridgePolicyManagerObjectName(management, brokerConnectionName, bridgeName, manager.getPolicyType().toString(), policyName)); - management.unregisterFromRegistry(getBridgePolicyManagerResourceName(brokerConnectionName, bridgeName, policyName)); + management.unRegisterAMQPControl(getBridgePolicyManagerResourceName(brokerConnectionName, bridgeName, policyName)); } public static String getBridgePolicyManagerResourceName(String brokerConnectionName, String bridgeName, String policyName) { @@ -216,10 +217,10 @@ public static void registerBridgeReceiver(AMQPBridgeReceiver receiver) throws Ex if (receiver.getRole() == ReceiverRole.ADDRESS_RECEIVER) { management.registerInJMX(getBridgeAddressReceiverObjectName(management, brokerConnectionName, bridgeName, manager.getPolicyType().toString(), policyName, receiver.getReceiverInfo().getLocalAddress()), control); - management.registerInRegistry(getBridgeAddressReceiverResourceName(brokerConnectionName, bridgeName, policyName, receiver.getReceiverInfo().getLocalAddress()), control); + management.registerAMQPControl(getBridgeAddressReceiverResourceName(brokerConnectionName, bridgeName, policyName, receiver.getReceiverInfo().getLocalAddress()), control); } else { management.registerInJMX(getBridgeQueueReceiverObjectName(management, brokerConnectionName, bridgeName, manager.getPolicyType().toString(), policyName, receiver.getReceiverInfo().getLocalFqqn()), control); - management.registerInRegistry(getBridgeQueueReceiverResourceName(brokerConnectionName, bridgeName, policyName, receiver.getReceiverInfo().getLocalFqqn()), control); + management.registerAMQPControl(getBridgeQueueReceiverResourceName(brokerConnectionName, bridgeName, policyName, receiver.getReceiverInfo().getLocalFqqn()), control); } } @@ -242,10 +243,10 @@ public static void unregisterBridgeReceiver(AMQPBridgeReceiver receiver) throws if (receiver.getRole() == ReceiverRole.ADDRESS_RECEIVER) { management.unregisterFromJMX(getBridgeAddressReceiverObjectName(management, brokerConnectionName, bridgeName, manager.getPolicyType().toString(), policyName, receiver.getReceiverInfo().getLocalAddress())); - management.unregisterFromRegistry(getBridgeAddressReceiverResourceName(brokerConnectionName, bridgeName, policyName, receiver.getReceiverInfo().getLocalAddress())); + management.unRegisterAMQPControl(getBridgeAddressReceiverResourceName(brokerConnectionName, bridgeName, policyName, receiver.getReceiverInfo().getLocalAddress())); } else { management.unregisterFromJMX(getBridgeQueueReceiverObjectName(management, brokerConnectionName, bridgeName, manager.getPolicyType().toString(), policyName, receiver.getReceiverInfo().getLocalFqqn())); - management.unregisterFromRegistry(getBridgeQueueReceiverResourceName(brokerConnectionName, bridgeName, policyName, receiver.getReceiverInfo().getLocalFqqn())); + management.unRegisterAMQPControl(getBridgeQueueReceiverResourceName(brokerConnectionName, bridgeName, policyName, receiver.getReceiverInfo().getLocalFqqn())); } } @@ -299,12 +300,12 @@ public static void registerBridgeSender(AMQPBridgeToSenderController sender) thr final String address = control.getAddress(); management.registerInJMX(getBridgeAddressSenderObjectName(management, brokerConnectionName, bridgeName, manager.getPolicyType().toString(), policyName, address), control); - management.registerInRegistry(getBridgeAddressSenderResourceName(brokerConnectionName, bridgeName, policyName, address), control); + management.registerAMQPControl(getBridgeAddressSenderResourceName(brokerConnectionName, bridgeName, policyName, address), control); } else { final String fqqn = control.getFqqn(); management.registerInJMX(getBridgeQueueSenderObjectName(management, brokerConnectionName, bridgeName, manager.getPolicyType().toString(), policyName, fqqn), control); - management.registerInRegistry(getBridgeQueueSenderResourceName(brokerConnectionName, bridgeName, policyName, fqqn), control); + management.registerAMQPControl(getBridgeQueueSenderResourceName(brokerConnectionName, bridgeName, policyName, fqqn), control); } } @@ -329,12 +330,12 @@ public static void unregisterBridgeSender(AMQPBridgeToSenderController sender) t final String address = sender.getServerConsumer().getQueueAddress().toString(); management.unregisterFromJMX(getBridgeAddressSenderObjectName(management, brokerConnectionName, bridgeName, manager.getPolicyType().toString(), policyName, address)); - management.unregisterFromRegistry(getBridgeAddressSenderResourceName(brokerConnectionName, bridgeName, policyName, address)); + management.unRegisterAMQPControl(getBridgeAddressSenderResourceName(brokerConnectionName, bridgeName, policyName, address)); } else { final String fqqn = CompositeAddress.toFullyQualified(sender.getServerConsumer().getQueueAddress().toString(), sender.getServerConsumer().getQueueName().toString()); management.unregisterFromJMX(getBridgeQueueSenderObjectName(management, brokerConnectionName, bridgeName, manager.getPolicyType().toString(), policyName, fqqn)); - management.unregisterFromRegistry(getBridgeQueueSenderResourceName(brokerConnectionName, bridgeName, policyName, fqqn)); + management.unRegisterAMQPControl(getBridgeQueueSenderResourceName(brokerConnectionName, bridgeName, policyName, fqqn)); } } diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/connect/federation/AMQPFederationManagementSupport.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/connect/federation/AMQPFederationManagementSupport.java index 6413182f3c8..a59f9161a7f 100644 --- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/connect/federation/AMQPFederationManagementSupport.java +++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/connect/federation/AMQPFederationManagementSupport.java @@ -136,7 +136,7 @@ public static void registerFederationSource(AMQPFederationSource federation) thr final AMQPFederationSourceControlType control = new AMQPFederationSourceControlType(server, federation); management.registerInJMX(getFederationSourceObjectName(management, brokerConnectionName, federationName), control); - management.registerInRegistry(getFederationSourceResourceName(brokerConnectionName, federationName), control); + management.registerAMQPControl(getFederationSourceResourceName(brokerConnectionName, federationName), control); } /** @@ -152,7 +152,7 @@ public static void unregisterFederationSource(AMQPFederationSource federation) t final ManagementService management = server.getManagementService(); management.unregisterFromJMX(getFederationSourceObjectName(management, brokerConnectionName, federationName)); - management.unregisterFromRegistry(getFederationSourceResourceName(brokerConnectionName, federationName)); + management.unRegisterAMQPControl(getFederationSourceResourceName(brokerConnectionName, federationName)); } public static String getFederationSourceResourceName(String brokerConnectionName, String federationName) { @@ -179,7 +179,7 @@ public static void registerFederationTarget(String remoteNodeId, String brokerCo final AMQPFederationTargetControlType control = new AMQPFederationTargetControlType(server, federation); management.registerInJMX(getFederationTargetObjectName(management, remoteNodeId, brokerConnectionName, federationName), control); - management.registerInRegistry(getFederationTargetResourceName(remoteNodeId, brokerConnectionName, federationName), control); + management.registerAMQPControl(getFederationTargetResourceName(remoteNodeId, brokerConnectionName, federationName), control); } /** @@ -194,7 +194,7 @@ public static void unregisterFederationTarget(String remoteNodeId, String broker final ManagementService management = server.getManagementService(); management.unregisterFromJMX(getFederationTargetObjectName(management, remoteNodeId, brokerConnectionName, federationName)); - management.unregisterFromRegistry(getFederationTargetResourceName(remoteNodeId, brokerConnectionName, federationName)); + management.unRegisterAMQPControl(getFederationTargetResourceName(remoteNodeId, brokerConnectionName, federationName)); } public static String getFederationTargetResourceName(String remoteNodeId, String brokerConnectionName, String federationName) { @@ -226,7 +226,7 @@ public static void registerLocalPolicyOnSource(String brokerConnectionName, AMQP final String policyName = manager.getPolicyName(); management.registerInJMX(getFederationSourcePolicyObjectName(management, brokerConnectionName, federationName, manager.getPolicyType().toString(), policyName), control); - management.registerInRegistry(getFederationSourcePolicyResourceName(brokerConnectionName, federationName, policyName), control); + management.registerAMQPControl(getFederationSourcePolicyResourceName(brokerConnectionName, federationName, policyName), control); } /** @@ -244,7 +244,7 @@ public static void unregisterLocalPolicyOnSource(String brokerConnectionName, AM final String policyName = manager.getPolicyName(); management.unregisterFromJMX(getFederationSourcePolicyObjectName(management, brokerConnectionName, federationName, manager.getPolicyType().toString(), policyName)); - management.unregisterFromRegistry(getFederationSourcePolicyResourceName(brokerConnectionName, federationName, policyName)); + management.unRegisterAMQPControl(getFederationSourcePolicyResourceName(brokerConnectionName, federationName, policyName)); } /** @@ -263,7 +263,7 @@ public static void registerRemotePolicyOnSource(String brokerConnectionName, AMQ final String policyName = manager.getPolicyName(); management.registerInJMX(getFederationSourcePolicyObjectName(management, brokerConnectionName, federationName, manager.getPolicyType().toString(), policyName), control); - management.registerInRegistry(getFederationSourcePolicyResourceName(brokerConnectionName, federationName, policyName), control); + management.registerAMQPControl(getFederationSourcePolicyResourceName(brokerConnectionName, federationName, policyName), control); } /** @@ -281,7 +281,7 @@ public static void unregisterRemotePolicyOnSource(String brokerConnectionName, A final String policyName = manager.getPolicyName(); management.unregisterFromJMX(getFederationSourcePolicyObjectName(management, brokerConnectionName, federationName, manager.getPolicyType().toString(), policyName)); - management.unregisterFromRegistry(getFederationSourcePolicyResourceName(brokerConnectionName, federationName, policyName)); + management.unRegisterAMQPControl(getFederationSourcePolicyResourceName(brokerConnectionName, federationName, policyName)); } public static String getFederationSourcePolicyResourceName(String brokerConnectionName, String federationName, String policyName) { @@ -314,7 +314,7 @@ public static void registerLocalPolicyOnTarget(String remoteNodeId, String broke final String policyName = manager.getPolicyName(); management.registerInJMX(getFederationTargetPolicyObjectName(management, remoteNodeId, brokerConnectionName, federationName, manager.getPolicyType().toString(), policyName), control); - management.registerInRegistry(getFederationTargetPolicyResourceName(remoteNodeId, brokerConnectionName, federationName, policyName), control); + management.registerAMQPControl(getFederationTargetPolicyResourceName(remoteNodeId, brokerConnectionName, federationName, policyName), control); } /** @@ -333,7 +333,7 @@ public static void unregisterLocalPolicyOnTarget(String remoteNodeId, String bro final String policyName = manager.getPolicyName(); management.unregisterFromJMX(getFederationTargetPolicyObjectName(management, remoteNodeId, brokerConnectionName, federationName, manager.getPolicyType().toString(), policyName)); - management.unregisterFromRegistry(getFederationTargetPolicyResourceName(remoteNodeId, brokerConnectionName, federationName, policyName)); + management.unRegisterAMQPControl(getFederationTargetPolicyResourceName(remoteNodeId, brokerConnectionName, federationName, policyName)); } /** @@ -353,7 +353,7 @@ public static void registerRemotePolicyOnTarget(String remoteNodeId, String brok final String policyName = manager.getPolicyName(); management.registerInJMX(getFederationTargetPolicyObjectName(management, remoteNodeId, brokerConnectionName, federationName, manager.getPolicyType().toString(), policyName), control); - management.registerInRegistry(getFederationTargetPolicyResourceName(remoteNodeId, brokerConnectionName, federationName, policyName), control); + management.registerAMQPControl(getFederationTargetPolicyResourceName(remoteNodeId, brokerConnectionName, federationName, policyName), control); } /** @@ -372,7 +372,7 @@ public static void unregisterRemotePolicyOnTarget(String remoteNodeId, String br final String policyName = manager.getPolicyName(); management.unregisterFromJMX(getFederationTargetPolicyObjectName(management, remoteNodeId, brokerConnectionName, federationName, manager.getPolicyType().toString(), policyName)); - management.unregisterFromRegistry(getFederationTargetPolicyResourceName(remoteNodeId, brokerConnectionName, federationName, policyName)); + management.unRegisterAMQPControl(getFederationTargetPolicyResourceName(remoteNodeId, brokerConnectionName, federationName, policyName)); } public static String getFederationTargetPolicyResourceName(String remoteNodeId, String brokerConnectionName, String federationName, String policyName) { @@ -408,10 +408,10 @@ public static void registerFederationSourceConsumer(String brokerConnectionName, if (consumer.getRole() == FederationConsumerInfo.Role.ADDRESS_CONSUMER) { management.registerInJMX(getFederationSourceAddressConsumerObjectName(management, brokerConnectionName, federationName, manager.getPolicyType().toString(), policyName, consumer.getConsumerInfo().getAddress()), control); - management.registerInRegistry(getFederationSourceAddressConsumerResourceName(brokerConnectionName, federationName, policyName, consumer.getConsumerInfo().getAddress()), control); + management.registerAMQPControl(getFederationSourceAddressConsumerResourceName(brokerConnectionName, federationName, policyName, consumer.getConsumerInfo().getAddress()), control); } else { management.registerInJMX(getFederationSourceQueueConsumerObjectName(management, brokerConnectionName, federationName, manager.getPolicyType().toString(), policyName, consumer.getConsumerInfo().getFqqn()), control); - management.registerInRegistry(getFederationSourceQueueConsumerResourceName(brokerConnectionName, federationName, policyName, consumer.getConsumerInfo().getFqqn()), control); + management.registerAMQPControl(getFederationSourceQueueConsumerResourceName(brokerConnectionName, federationName, policyName, consumer.getConsumerInfo().getFqqn()), control); } } @@ -432,10 +432,10 @@ public static void unregisterFederationSourceConsumer(String brokerConnectionNam if (consumer.getRole() == FederationConsumerInfo.Role.ADDRESS_CONSUMER) { management.unregisterFromJMX(getFederationSourceAddressConsumerObjectName(management, brokerConnectionName, federationName, manager.getPolicyType().toString(), policyName, consumer.getConsumerInfo().getAddress())); - management.unregisterFromRegistry(getFederationSourceAddressConsumerResourceName(brokerConnectionName, federationName, policyName, consumer.getConsumerInfo().getAddress())); + management.unRegisterAMQPControl(getFederationSourceAddressConsumerResourceName(brokerConnectionName, federationName, policyName, consumer.getConsumerInfo().getAddress())); } else { management.unregisterFromJMX(getFederationSourceQueueConsumerObjectName(management, brokerConnectionName, federationName, manager.getPolicyType().toString(), policyName, consumer.getConsumerInfo().getFqqn())); - management.unregisterFromRegistry(getFederationSourceQueueConsumerResourceName(brokerConnectionName, federationName, policyName, consumer.getConsumerInfo().getFqqn())); + management.unRegisterAMQPControl(getFederationSourceQueueConsumerResourceName(brokerConnectionName, federationName, policyName, consumer.getConsumerInfo().getFqqn())); } } @@ -459,12 +459,12 @@ public static void registerFederationSourceProducer(String brokerConnectionName, final String address = control.getAddress(); management.registerInJMX(getFederationSourceAddressProducerObjectName(management, brokerConnectionName, federationName, manager.getPolicyType().toString(), policyName, address), control); - management.registerInRegistry(getFederationSourceAddressProducerResourceName(brokerConnectionName, federationName, policyName, address), control); + management.registerAMQPControl(getFederationSourceAddressProducerResourceName(brokerConnectionName, federationName, policyName, address), control); } else { final String fqqn = control.getFqqn(); management.registerInJMX(getFederationSourceQueueProducerObjectName(management, brokerConnectionName, federationName, manager.getPolicyType().toString(), policyName, fqqn), control); - management.registerInRegistry(getFederationSourceQueueProducerResourceName(brokerConnectionName, federationName, policyName, fqqn), control); + management.registerAMQPControl(getFederationSourceQueueProducerResourceName(brokerConnectionName, federationName, policyName, fqqn), control); } } @@ -487,12 +487,12 @@ public static void unregisterFederationSourceProducer(String brokerConnectionNam final String address = sender.getServerConsumer().getQueueAddress().toString(); management.unregisterFromJMX(getFederationSourceAddressProducerObjectName(management, brokerConnectionName, federationName, manager.getPolicyType().toString(), policyName, address)); - management.unregisterFromRegistry(getFederationSourceAddressProducerResourceName(brokerConnectionName, federationName, policyName, address)); + management.unRegisterAMQPControl(getFederationSourceAddressProducerResourceName(brokerConnectionName, federationName, policyName, address)); } else { final String fqqn = CompositeAddress.toFullyQualified(sender.getServerConsumer().getQueueAddress().toString(), sender.getServerConsumer().getQueueName().toString()); management.unregisterFromJMX(getFederationSourceQueueProducerObjectName(management, brokerConnectionName, federationName, manager.getPolicyType().toString(), policyName, fqqn)); - management.unregisterFromRegistry(getFederationSourceQueueProducerResourceName(brokerConnectionName, federationName, policyName, fqqn)); + management.unRegisterAMQPControl(getFederationSourceQueueProducerResourceName(brokerConnectionName, federationName, policyName, fqqn)); } } @@ -570,10 +570,10 @@ public static void registerFederationTargetConsumer(String remoteNodeId, String if (consumer.getRole() == FederationConsumerInfo.Role.ADDRESS_CONSUMER) { management.registerInJMX(getFederationTargetAddressConsumerObjectName(management, remoteNodeId, brokerConnectionName, federationName, manager.getPolicyType().toString(), policyName, consumer.getConsumerInfo().getAddress()), control); - management.registerInRegistry(getFederationTargetAddressConsumerResourceName(remoteNodeId, brokerConnectionName, federationName, policyName, consumer.getConsumerInfo().getAddress()), control); + management.registerAMQPControl(getFederationTargetAddressConsumerResourceName(remoteNodeId, brokerConnectionName, federationName, policyName, consumer.getConsumerInfo().getAddress()), control); } else { management.registerInJMX(getFederationTargetQueueConsumerObjectName(management, remoteNodeId, brokerConnectionName, federationName, manager.getPolicyType().toString(), policyName, consumer.getConsumerInfo().getFqqn()), control); - management.registerInRegistry(getFederationTargetQueueConsumerResourceName(remoteNodeId, brokerConnectionName, federationName, policyName, consumer.getConsumerInfo().getFqqn()), control); + management.registerAMQPControl(getFederationTargetQueueConsumerResourceName(remoteNodeId, brokerConnectionName, federationName, policyName, consumer.getConsumerInfo().getFqqn()), control); } } @@ -594,10 +594,10 @@ public static void unregisterFederationTargetConsumer(String remoteNodeId, Strin if (consumer.getRole() == FederationConsumerInfo.Role.ADDRESS_CONSUMER) { management.unregisterFromJMX(getFederationTargetAddressConsumerObjectName(management, remoteNodeId, brokerConnectionName, federationName, manager.getPolicyType().toString(), policyName, consumer.getConsumerInfo().getAddress())); - management.unregisterFromRegistry(getFederationTargetAddressConsumerResourceName(remoteNodeId, brokerConnectionName, federationName, policyName, consumer.getConsumerInfo().getAddress())); + management.unRegisterAMQPControl(getFederationTargetAddressConsumerResourceName(remoteNodeId, brokerConnectionName, federationName, policyName, consumer.getConsumerInfo().getAddress())); } else { management.unregisterFromJMX(getFederationTargetQueueConsumerObjectName(management, remoteNodeId, brokerConnectionName, federationName, manager.getPolicyType().toString(), policyName, consumer.getConsumerInfo().getFqqn())); - management.unregisterFromRegistry(getFederationTargetQueueConsumerResourceName(remoteNodeId, brokerConnectionName, federationName, policyName, consumer.getConsumerInfo().getFqqn())); + management.unRegisterAMQPControl(getFederationTargetQueueConsumerResourceName(remoteNodeId, brokerConnectionName, federationName, policyName, consumer.getConsumerInfo().getFqqn())); } } @@ -621,12 +621,12 @@ public static void registerFederationTargetProducer(String remoteNodeId, String final String address = control.getAddress(); management.registerInJMX(getFederationTargetAddressProducerObjectName(management, remoteNodeId, brokerConnectionName, federationName, manager.getPolicyType().toString(), policyName, address), control); - management.registerInRegistry(getFederationTargetAddressProducerResourceName(remoteNodeId, brokerConnectionName, federationName, policyName, address), control); + management.registerAMQPControl(getFederationTargetAddressProducerResourceName(remoteNodeId, brokerConnectionName, federationName, policyName, address), control); } else { final String fqqn = control.getFqqn(); management.registerInJMX(getFederationTargetQueueProducerObjectName(management, remoteNodeId, brokerConnectionName, federationName, manager.getPolicyType().toString(), policyName, fqqn), control); - management.registerInRegistry(getFederationTargetQueueProducerResourceName(remoteNodeId, brokerConnectionName, federationName, policyName, fqqn), control); + management.registerAMQPControl(getFederationTargetQueueProducerResourceName(remoteNodeId, brokerConnectionName, federationName, policyName, fqqn), control); } } @@ -649,12 +649,12 @@ public static void unregisterFederationTargetProducer(String remoteNodeId, Strin final String address = sender.getServerConsumer().getQueueAddress().toString(); management.unregisterFromJMX(getFederationTargetAddressProducerObjectName(management, remoteNodeId, brokerConnectionName, federationName, manager.getPolicyType().toString(), policyName, address)); - management.unregisterFromRegistry(getFederationTargetAddressProducerResourceName(remoteNodeId, brokerConnectionName, federationName, policyName, address)); + management.unRegisterAMQPControl(getFederationTargetAddressProducerResourceName(remoteNodeId, brokerConnectionName, federationName, policyName, address)); } else { final String fqqn = CompositeAddress.toFullyQualified(sender.getServerConsumer().getQueueAddress().toString(), sender.getServerConsumer().getQueueName().toString()); management.unregisterFromJMX(getFederationTargetQueueProducerObjectName(management, remoteNodeId, brokerConnectionName, federationName, manager.getPolicyType().toString(), policyName, fqqn)); - management.unregisterFromRegistry(getFederationTargetQueueProducerResourceName(remoteNodeId, brokerConnectionName, federationName, policyName, fqqn)); + management.unRegisterAMQPControl(getFederationTargetQueueProducerResourceName(remoteNodeId, brokerConnectionName, federationName, policyName, fqqn)); } } 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 c5cde06c830..5317af3a2ad 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 @@ -1457,8 +1457,8 @@ public int getQueueCount() { clearIO(); try { - Object[] queueControls = server.getManagementService().getResources(QueueControl.class); - return queueControls.length; + List queueControls = server.getManagementService().getQueueControls(null); + return queueControls.size(); } finally { blockOnIO(); } @@ -1478,10 +1478,10 @@ public String[] getQueueNames(String routingType) { clearIO(); try { - Object[] queueControls = server.getManagementService().getResources(QueueControl.class); + List queueControls = server.getManagementService().getQueueControls(null); List names = new ArrayList<>(); - for (int i = 0; i < queueControls.length; i++) { - QueueControl queueControl = (QueueControl) queueControls[i]; + for (int i = 0; i < queueControls.size(); i++) { + QueueControl queueControl = (QueueControl) queueControls.get(i); if (routingType != null && routingType.length() > 1 && queueControl.getRoutingType().equals(routingType.toUpperCase())) { names.add(queueControl.getName()); } else if (routingType == null || routingType.isEmpty()) { @@ -1571,8 +1571,8 @@ public int getAddressCount() { clearIO(); try { - Object[] addresses = server.getManagementService().getResources(AddressControl.class); - return addresses.length; + List addresses = server.getManagementService().getAddressControls(null); + return addresses.size(); } finally { blockOnIO(); } @@ -1587,10 +1587,10 @@ public String[] getAddressNames() { clearIO(); try { - Object[] addresses = server.getManagementService().getResources(AddressControl.class); - String[] names = new String[addresses.length]; - for (int i = 0; i < addresses.length; i++) { - AddressControl address = (AddressControl) addresses[i]; + List addresses = server.getManagementService().getAddressControls(null); + String[] names = new String[addresses.size()]; + for (int i = 0; i < addresses.size(); i++) { + AddressControl address = (AddressControl) addresses.get(i); names[i] = address.getAddress(); } return names; @@ -2608,14 +2608,9 @@ public String listAddresses(String options, int page, int pageSize) throws Excep checkStarted(); clearIO(); try { - List addresses = new ArrayList<>(); - Object[] qs = server.getManagementService().getResources(AddressControl.class); - for (int i = 0; i < qs.length; i++) { - addresses.add((AddressControl) qs[i]); - } AddressView view = new AddressView(server); - view.setCollection(addresses); view.setOptions(options); + view.setCollection(server.getManagementService().getAddressControls(view.getPredicate())); return view.getResultsAsJson(page, pageSize); } finally { blockOnIO(); @@ -2631,15 +2626,10 @@ public String listQueues(String options, int page, int pageSize) throws Exceptio clearIO(); try { - List queues = new ArrayList<>(); - Object[] qs = server.getManagementService().getResources(QueueControl.class); - for (int i = 0; i < qs.length; i++) { - queues.add((QueueControl) qs[i]); - } QueueView view = new QueueView(server); - view.setCollection(queues); view.setOptions(options); - return view.getResultsAsJson(page, pageSize); + view.setCollection(server.getManagementService().getQueueControls(view.getPredicate())); + return view.AsJson(page, pageSize); } finally { blockOnIO(); } @@ -3640,10 +3630,10 @@ public String[] getDivertNames() { clearIO(); try { - Object[] diverts = server.getManagementService().getResources(DivertControl.class); - String[] names = new String[diverts.length]; - for (int i = 0; i < diverts.length; i++) { - DivertControl divert = (DivertControl) diverts[i]; + List diverts = server.getManagementService().getDivertControls(); + String[] names = new String[diverts.size()]; + for (int i = 0; i < diverts.size(); i++) { + DivertControl divert = diverts.get(i); names[i] = divert.getUniqueName(); } @@ -3789,10 +3779,10 @@ public String[] getBridgeNames() { clearIO(); try { - Object[] bridges = server.getManagementService().getResources(BridgeControl.class); - String[] names = new String[bridges.length]; - for (int i = 0; i < bridges.length; i++) { - BridgeControl bridge = (BridgeControl) bridges[i]; + List bridges = server.getManagementService().getBridgeControls(); + String[] names = new String[bridges.size()]; + for (int i = 0; i < bridges.size(); i++) { + BridgeControl bridge = bridges.get(i); names[i] = bridge.getName(); } diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ActiveMQAbstractView.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ActiveMQAbstractView.java index 3aa2bf09a7c..00c55267132 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ActiveMQAbstractView.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ActiveMQAbstractView.java @@ -16,9 +16,8 @@ */ package org.apache.activemq.artemis.core.management.impl.view; -import org.apache.activemq.artemis.json.JsonArrayBuilder; -import org.apache.activemq.artemis.json.JsonObject; -import org.apache.activemq.artemis.json.JsonObjectBuilder; +import org.apache.activemq.artemis.core.management.impl.view.predicate.PredicateFilterPart; + import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -30,13 +29,20 @@ import org.apache.activemq.artemis.api.core.JsonUtil; import org.apache.activemq.artemis.core.management.impl.view.predicate.ActiveMQFilterPredicate; +import org.apache.activemq.artemis.json.JsonArray; +import org.apache.activemq.artemis.json.JsonArrayBuilder; +import org.apache.activemq.artemis.json.JsonObject; +import org.apache.activemq.artemis.json.JsonObjectBuilder; +import org.apache.activemq.artemis.json.JsonValue; import org.apache.activemq.artemis.utils.JsonLoader; -public abstract class ActiveMQAbstractView { +public abstract class ActiveMQAbstractView> { // use this for values which couldn't be retrieved (e.g. an exception was thrown) protected static final String N_A = "n/a"; + private static final String FILTER_ARRAY_FIELD = "searchFilters"; + private static final String FILTER_FIELD = "field"; private static final String FILTER_OPERATION = "operation"; @@ -58,7 +64,7 @@ public abstract class ActiveMQAbstractView { protected Collection collection; - protected ActiveMQFilterPredicate predicate; + protected ActiveMQFilterPredicate predicate; protected String sortField; @@ -73,6 +79,11 @@ public void setCollection(Collection collection) { this.collection = collection; } + public List filter() { + List collect = collection.stream().filter(getPredicate()).collect(Collectors.toList()); + return collect; + } + public String getResultsAsJson(int page, int pageSize) { JsonObjectBuilder obj = JsonLoader.createObjectBuilder(); JsonArrayBuilder array = JsonLoader.createArrayBuilder(); @@ -89,6 +100,21 @@ public String getResultsAsJson(int page, int pageSize) { return obj.build().toString(); } + public String AsJson(int page, int pageSize) { + JsonObjectBuilder obj = JsonLoader.createObjectBuilder(); + JsonArrayBuilder array = JsonLoader.createArrayBuilder(); + for (T element : getPagedResult(page, pageSize)) { + JsonObjectBuilder jsonObjectBuilder = toJson(element); + //toJson() may return a null + if (jsonObjectBuilder != null) { + array.add(jsonObjectBuilder); + } + } + obj.add("data", array); + obj.add("count", collection.size()); + return obj.build().toString(); + } + public List getPagedResult(int page, int pageSize) { List builder = new ArrayList<>(); final int start; @@ -144,9 +170,7 @@ public void setOptions(String options) { json = JsonUtil.readJsonObject(options); } if (predicate != null) { - predicate.setField(json.getString(FILTER_FIELD)); - predicate.setOperation(json.getString(FILTER_OPERATION)); - predicate.setValue(json.getString(FILTER_VALUE)); + predicate.addFilterParts(createFilterPredicates(json)); if ((json.containsKey(SORT_COLUMN) || json.containsKey(SORT_FIELD)) && json.containsKey(SORT_ORDER)) { if (json.containsKey(SORT_COLUMN)) { this.sortField = json.getString(SORT_COLUMN); @@ -158,6 +182,19 @@ public void setOptions(String options) { } } + private List createFilterPredicates(JsonObject json) { + ArrayList predicates = new ArrayList<>(); + JsonArray jsonArray = json.getJsonArray(FILTER_ARRAY_FIELD); + if (jsonArray == null) { + predicates.add(predicate.createFilterPart(json.getString(FILTER_FIELD), json.getString(FILTER_OPERATION), json.getString(FILTER_VALUE))); + } else { + for (JsonValue jsonValue : jsonArray) { + predicates.add(predicate.createFilterPart(((JsonObject)jsonValue).getString(FILTER_FIELD), ((JsonObject)jsonValue).getString(FILTER_OPERATION), ((JsonObject)jsonValue).getString(FILTER_VALUE))); + } + } + return predicates; + } + public abstract Class getClassT(); public abstract JsonObjectBuilder toJson(T obj); diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/AddressView.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/AddressView.java index 34635dfe6f7..f6f6cd8d579 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/AddressView.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/AddressView.java @@ -17,12 +17,13 @@ package org.apache.activemq.artemis.core.management.impl.view; import org.apache.activemq.artemis.api.core.management.AddressControl; +import org.apache.activemq.artemis.core.management.impl.view.predicate.AddressPredicateFilterPart; import org.apache.activemq.artemis.json.JsonObjectBuilder; import org.apache.activemq.artemis.core.management.impl.view.predicate.AddressFilterPredicate; import org.apache.activemq.artemis.core.server.ActiveMQServer; import org.apache.activemq.artemis.utils.JsonLoader; -public class AddressView extends ActiveMQAbstractView { +public class AddressView extends ActiveMQAbstractView { private static final String defaultSortField = AddressField.ID.getName(); @@ -31,7 +32,7 @@ public class AddressView extends ActiveMQAbstractView { public AddressView(ActiveMQServer server) { super(); this.server = server; - this.predicate = new AddressFilterPredicate(server); + this.predicate = new AddressFilterPredicate(); } @Override diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ConnectionView.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ConnectionView.java index 3a1fc012000..f16508bf1ce 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ConnectionView.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ConnectionView.java @@ -22,6 +22,7 @@ import java.util.Set; import java.util.TreeSet; +import org.apache.activemq.artemis.core.management.impl.view.predicate.ConnectionPredicateFilterPart; import org.apache.activemq.artemis.core.management.impl.view.predicate.ConnectionFilterPredicate; import org.apache.activemq.artemis.core.remoting.impl.netty.NettyServerConnection; import org.apache.activemq.artemis.core.server.ActiveMQServer; @@ -31,7 +32,7 @@ import org.apache.activemq.artemis.utils.JsonLoader; import org.apache.activemq.artemis.utils.StringUtil; -public class ConnectionView extends ActiveMQAbstractView { +public class ConnectionView extends ActiveMQAbstractView { private static final String defaultSortField = ConnectionField.CONNECTION_ID.getName(); diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ConsumerView.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ConsumerView.java index 3768c9568f3..2cca2617d71 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ConsumerView.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ConsumerView.java @@ -19,6 +19,7 @@ import java.util.Date; import org.apache.activemq.artemis.core.management.impl.ActiveMQServerControlImpl; +import org.apache.activemq.artemis.core.management.impl.view.predicate.ConsumerPredicateFilterPart; import org.apache.activemq.artemis.core.management.impl.view.predicate.ConsumerFilterPredicate; import org.apache.activemq.artemis.core.server.ActiveMQServer; import org.apache.activemq.artemis.core.server.ServerConsumer; @@ -26,7 +27,7 @@ import org.apache.activemq.artemis.json.JsonObjectBuilder; import org.apache.activemq.artemis.utils.JsonLoader; -public class ConsumerView extends ActiveMQAbstractView { +public class ConsumerView extends ActiveMQAbstractView { public static final String CONSUMER_STATUS_OK = "OK"; public static final String CONSUMER_STATUS_ORPHANED = "Orphaned"; diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ProducerView.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ProducerView.java index b08e6076f80..71df507b32e 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ProducerView.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/ProducerView.java @@ -18,6 +18,7 @@ import java.util.Objects; +import org.apache.activemq.artemis.core.management.impl.view.predicate.ProducerPredicateFilterPart; import org.apache.activemq.artemis.core.management.impl.view.predicate.ProducerFilterPredicate; import org.apache.activemq.artemis.core.server.ActiveMQServer; import org.apache.activemq.artemis.core.server.ServerProducer; @@ -25,7 +26,7 @@ import org.apache.activemq.artemis.json.JsonObjectBuilder; import org.apache.activemq.artemis.utils.JsonLoader; -public class ProducerView extends ActiveMQAbstractView { +public class ProducerView extends ActiveMQAbstractView { private static final String defaultSortField = ProducerField.CREATION_TIME.getName(); diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/QueueView.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/QueueView.java index 80e20014f59..e3d74f4e289 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/QueueView.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/QueueView.java @@ -16,6 +16,7 @@ */ package org.apache.activemq.artemis.core.management.impl.view; +import org.apache.activemq.artemis.core.management.impl.view.predicate.QueuePredicateFilterPart; import org.apache.activemq.artemis.json.JsonObjectBuilder; import org.apache.activemq.artemis.api.core.SimpleString; import org.apache.activemq.artemis.api.core.management.QueueControl; @@ -24,7 +25,7 @@ import org.apache.activemq.artemis.core.server.Queue; import org.apache.activemq.artemis.utils.JsonLoader; -public class QueueView extends ActiveMQAbstractView { +public class QueueView extends ActiveMQAbstractView { private static final String defaultSortField = QueueField.NAME.getName(); diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/SessionView.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/SessionView.java index c9c5369fcde..60205cbb74e 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/SessionView.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/SessionView.java @@ -16,6 +16,7 @@ */ package org.apache.activemq.artemis.core.management.impl.view; +import org.apache.activemq.artemis.core.management.impl.view.predicate.SessionPredicateFilterPart; import org.apache.activemq.artemis.json.JsonObjectBuilder; import java.util.Date; import java.util.Objects; @@ -24,7 +25,7 @@ import org.apache.activemq.artemis.core.server.ServerSession; import org.apache.activemq.artemis.utils.JsonLoader; -public class SessionView extends ActiveMQAbstractView { +public class SessionView extends ActiveMQAbstractView { private static final String defaultSortField = SessionField.ID.getName(); diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ActiveMQFilterPredicate.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ActiveMQFilterPredicate.java index c9a680bbd9a..a4b91cce657 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ActiveMQFilterPredicate.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ActiveMQFilterPredicate.java @@ -16,170 +16,44 @@ */ package org.apache.activemq.artemis.core.management.impl.view.predicate; -import java.util.Collection; +import java.util.ArrayList; +import java.util.List; import java.util.function.Predicate; - -public class ActiveMQFilterPredicate implements Predicate { +public abstract class ActiveMQFilterPredicate> implements Predicate { public enum Operation { CONTAINS, NOT_CONTAINS, EQUALS, NOT_EQUALS, GREATER_THAN, LESS_THAN; } - protected String field; - - protected String value; - - protected Operation operation; + private final List filterParts = new ArrayList<>(); public ActiveMQFilterPredicate() { } @Override public boolean test(T input) { - return true; - } - - public String getField() { - return field; - } - - public void setField(String field) { - this.field = field; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - - public Operation getOperation() { - return operation; - } - - public void setOperation(String operation) { - if (operation != null && !operation.isBlank()) { - this.operation = Operation.valueOf(operation); - } - } - - public boolean matches(Object field) { - if (operation != null) { - return switch (operation) { - case EQUALS -> equals(field, value); - case NOT_EQUALS -> !equals(field, value); - case CONTAINS -> contains(field, value); - case NOT_CONTAINS -> !contains(field, value); - case GREATER_THAN -> false; - case LESS_THAN -> false; - }; - } - return true; - } - - public boolean matchAny(Collection objects) { - for (Object o : objects) { - if (matches(o)) - return true; - } - return false; - } - - public boolean matches(long field) { - long longValue; - if (operation != null) { - - try { - longValue = Long.parseLong(value); - } catch (NumberFormatException ex) { - //cannot compare - if (operation == Operation.NOT_EQUALS || operation == Operation.NOT_CONTAINS) { - return true; - } else { - return false; + if (filterParts.isEmpty()) + return true; + try { + boolean matches = true; + for (V filterPart : filterParts) { + matches = filter(input, filterPart); + if (!matches) { + return matches; } } - - return switch (operation) { - case EQUALS -> field == longValue; - case NOT_EQUALS -> field != longValue; - case CONTAINS -> false; - case NOT_CONTAINS -> true; - case LESS_THAN -> field < longValue; - case GREATER_THAN -> field > longValue; - }; + return matches; + } catch (Exception e) { + return true; } - return true; } - public boolean matches(int field) { - int intValue; - if (operation != null) { - - try { - intValue = Integer.parseInt(value); - } catch (NumberFormatException ex) { - //cannot compare - if (operation == Operation.NOT_EQUALS || operation == Operation.NOT_CONTAINS) { - return true; - } else { - return false; - } - } - - return switch (operation) { - case EQUALS -> field == intValue; - case NOT_EQUALS -> field != intValue; - case CONTAINS -> false; - case NOT_CONTAINS -> true; - case LESS_THAN -> field < intValue; - case GREATER_THAN -> field > intValue; - }; - } - return true; + public void addFilterParts(List filterParts) { + this.filterParts.addAll(filterParts); } - public boolean matches(float field) { - float floatValue; - if (operation != null) { + protected abstract boolean filter(T input, V filterPart) throws Exception; - try { - floatValue = Float.parseFloat(value); - } catch (NumberFormatException ex) { - //cannot compare - if (operation == Operation.NOT_EQUALS || operation == Operation.NOT_CONTAINS) { - return true; - } else { - return false; - } - } - - return switch (operation) { - case EQUALS -> field == floatValue; - case NOT_EQUALS -> field != floatValue; - case CONTAINS -> false; - case NOT_CONTAINS -> true; - case LESS_THAN -> field < floatValue; - case GREATER_THAN -> field > floatValue; - }; - } - return true; - } - - private boolean equals(Object field, Object value) { - if (field == null) { - return (value == null || value.equals("")); - } - return field.toString().equals(value); - } - - private boolean contains(Object field, Object value) { - if (field == null) { - return (value == null || value.equals("")); - } - return field.toString().contains(value.toString()); - } + public abstract V createFilterPart(String field, String operation, String value); } diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/AddressFilterPredicate.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/AddressFilterPredicate.java index af0077a009c..c0cccdc7872 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/AddressFilterPredicate.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/AddressFilterPredicate.java @@ -16,66 +16,20 @@ */ package org.apache.activemq.artemis.core.management.impl.view.predicate; -import java.util.Arrays; - import org.apache.activemq.artemis.api.core.management.AddressControl; -import org.apache.activemq.artemis.core.management.impl.view.AddressField; -import org.apache.activemq.artemis.core.server.ActiveMQServer; - -public class AddressFilterPredicate extends ActiveMQFilterPredicate { - - private AddressField f; - private final ActiveMQServer server; - - public AddressFilterPredicate(ActiveMQServer server) { +public class AddressFilterPredicate extends ActiveMQFilterPredicate { + public AddressFilterPredicate() { super(); - this.server = server; } @Override - public boolean test(AddressControl address) { - if (f == null) - return true; - try { - return switch (f) { - case ID -> matches(address.getId()); - case NAME -> matches(address.getAddress()); - case ROUTING_TYPES -> matchAny(Arrays.asList(address.getRoutingTypes())); - case QUEUE_COUNT -> matches(address.getQueueCount()); - case INTERNAL -> matches(address.isInternal()); - case TEMPORARY -> matches(address.isTemporary()); - case AUTO_CREATED -> matches(address.isAutoCreated()); - case PAUSED -> matches(address.isPaused()); - case CURRENT_DUPLICATE_ID_CACHE_SIZE -> matches(address.getCurrentDuplicateIdCacheSize()); - case RETROACTIVE_RESOURCE -> matches(address.isRetroactiveResource()); - case UNROUTED_MESSAGE_COUNT -> matches(address.getUnRoutedMessageCount()); - case ROUTED_MESSAGE_COUNT -> matches(address.getRoutedMessageCount()); - case MESSAGE_COUNT -> matches(address.getMessageCount()); - case NUMBER_OF_BYTES_PER_PAGE -> matches(address.getNumberOfBytesPerPage()); - case ADDRESS_LIMIT_PERCENT -> matches(address.getAddressLimitPercent()); - case PAGING -> matches(address.isPaging()); - case NUMBER_OF_PAGES -> matches(address.getNumberOfPages()); - case ADDRESS_SIZE -> matches(address.getAddressSize()); - case MAX_PAGE_READ_BYTES -> matches(address.getMaxPageReadBytes()); - case MAX_PAGE_READ_MESSAGES -> matches(address.getMaxPageReadMessages()); - case PREFETCH_PAGE_BYTES -> matches(address.getPrefetchPageBytes()); - case PREFETCH_PAGE_MESSAGES -> matches(address.getPrefetchPageBytes()); - }; - } catch (Exception e) { - return false; - } + protected boolean filter(AddressControl address, AddressPredicateFilterPart filterPart) throws Exception { + return filterPart.filterPart(address); } @Override - public void setField(String field) { - if (field != null && !field.isEmpty()) { - this.f = AddressField.valueOfName(field); - - //for backward compatibility - if (this.f == null) { - this.f = AddressField.valueOf(field); - } - } + public AddressPredicateFilterPart createFilterPart(String field, String operation, String value) { + return new AddressPredicateFilterPart(this, field, operation, value); } } diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/AddressPredicateFilterPart.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/AddressPredicateFilterPart.java new file mode 100644 index 00000000000..2898e06d7e6 --- /dev/null +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/AddressPredicateFilterPart.java @@ -0,0 +1,69 @@ +/* + * 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.management.impl.view.predicate; + +import org.apache.activemq.artemis.api.core.management.AddressControl; +import org.apache.activemq.artemis.core.management.impl.view.AddressField; + +import java.util.Arrays; + +public class AddressPredicateFilterPart extends PredicateFilterPart { + private final AddressFilterPredicate addressFilterPredicate; + private AddressField f; + + public AddressPredicateFilterPart(AddressFilterPredicate addressFilterPredicate, String field, String operation, String value) { + super(operation, value); + this.addressFilterPredicate = addressFilterPredicate; + if (field != null && !field.isEmpty()) { + f = AddressField.valueOfName(field); + + //for backward compatibility + if (f == null) { + f = AddressField.valueOf(field); + } + + } + } + + @Override + public boolean filterPart(AddressControl address) throws Exception { + return switch (f) { + case ID -> matchesLong(address.getId()); + case NAME -> matches(address.getAddress()); + case ROUTING_TYPES -> matchAny(Arrays.asList(address.getRoutingTypes())); + case QUEUE_COUNT -> matchesLong(address.getQueueCount()); + case INTERNAL -> matches(address.isInternal()); + case TEMPORARY -> matches(address.isTemporary()); + case AUTO_CREATED -> matches(address.isAutoCreated()); + case PAUSED -> matches(address.isPaused()); + case CURRENT_DUPLICATE_ID_CACHE_SIZE -> matchesLong(address.getCurrentDuplicateIdCacheSize()); + case RETROACTIVE_RESOURCE -> matches(address.isRetroactiveResource()); + case UNROUTED_MESSAGE_COUNT -> matchesLong(address.getUnRoutedMessageCount()); + case ROUTED_MESSAGE_COUNT -> matchesLong(address.getRoutedMessageCount()); + case MESSAGE_COUNT -> matchesLong(address.getMessageCount()); + case NUMBER_OF_BYTES_PER_PAGE -> matchesLong(address.getNumberOfBytesPerPage()); + case ADDRESS_LIMIT_PERCENT -> matchesLong(address.getAddressLimitPercent()); + case PAGING -> matches(address.isPaging()); + case NUMBER_OF_PAGES -> matchesLong(address.getNumberOfPages()); + case ADDRESS_SIZE -> matchesLong(address.getAddressSize()); + case MAX_PAGE_READ_BYTES -> matchesLong(address.getMaxPageReadBytes()); + case MAX_PAGE_READ_MESSAGES -> matchesLong(address.getMaxPageReadMessages()); + case PREFETCH_PAGE_BYTES -> matchesLong(address.getPrefetchPageBytes()); + case PREFETCH_PAGE_MESSAGES -> matchesLong(address.getPrefetchPageBytes()); + }; + } +} diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConnectionFilterPredicate.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConnectionFilterPredicate.java index b997353d07e..9b6c486f1cf 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConnectionFilterPredicate.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConnectionFilterPredicate.java @@ -16,21 +16,10 @@ */ package org.apache.activemq.artemis.core.management.impl.view.predicate; -import java.util.HashSet; -import java.util.List; -import java.util.Objects; -import java.util.Set; -import java.util.function.Function; - -import org.apache.activemq.artemis.core.management.impl.view.ConnectionField; -import org.apache.activemq.artemis.core.remoting.impl.netty.NettyServerConnection; import org.apache.activemq.artemis.core.server.ActiveMQServer; -import org.apache.activemq.artemis.core.server.ServerSession; import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection; -public class ConnectionFilterPredicate extends ActiveMQFilterPredicate { - - private ConnectionField f; +public class ConnectionFilterPredicate extends ActiveMQFilterPredicate { private ActiveMQServer server; @@ -39,46 +28,12 @@ public ConnectionFilterPredicate(ActiveMQServer server) { } @Override - public boolean test(RemotingConnection connection) { - // Using switch over enum vs string comparison is better for perf. - if (f == null) - return true; - return switch (f) { - case CONNECTION_ID -> matches(connection.getID()); - case CLIENT_ID -> matches(connection.getClientID()); - case USERS -> matchAny(collectFromSessions(connection.getID().toString(), s -> s.getUsername())); - case PROTOCOL -> matches(connection.getProtocolName()); - case SESSION_COUNT -> matches(server.getSessions(connection.getID().toString()).size()); - case REMOTE_ADDRESS -> matches(connection.getTransportConnection().getRemoteAddress()); - case LOCAL_ADDRESS -> matches(connection.getTransportConnection().getLocalAddress()); - case SESSION_ID -> matchAny(server.getSessions(connection.getID().toString())); - case CREATION_TIME -> matches(connection.getCreationTime()); - case IMPLEMENTATION -> matches(connection.getClass().getSimpleName()); - case PROXY_ADDRESS -> matches(NettyServerConnection.getProxyAddress(connection.getTransportConnection())); - case PROXY_PROTOCOL_VERSION -> matches(NettyServerConnection.getProxyProtocolVersion(connection.getTransportConnection())); - }; - } - - Set collectFromSessions(String connectionId, Function getter) { - List sessions = server.getSessions(connectionId); - Set sessionAttributes = new HashSet<>(); - for (ServerSession session : sessions) { - String value = getter.apply(session); - String string = Objects.requireNonNullElse(value, ""); - sessionAttributes.add(string); - } - return sessionAttributes; + protected boolean filter(RemotingConnection input, ConnectionPredicateFilterPart filterPart) throws Exception { + return filterPart.filterPart(input); } @Override - public void setField(String field) { - if (field != null && !field.isEmpty()) { - this.f = ConnectionField.valueOfName(field); - - //for backward compatibility - if (this.f == null) { - this.f = ConnectionField.valueOf(field); - } - } + public ConnectionPredicateFilterPart createFilterPart(String field, String operation, String value) { + return new ConnectionPredicateFilterPart(server, field, operation, value); } } diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConnectionPredicateFilterPart.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConnectionPredicateFilterPart.java new file mode 100644 index 00000000000..47a352258e8 --- /dev/null +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConnectionPredicateFilterPart.java @@ -0,0 +1,78 @@ +/* + * 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.management.impl.view.predicate; + +import org.apache.activemq.artemis.core.management.impl.view.ConnectionField; +import org.apache.activemq.artemis.core.remoting.impl.netty.NettyServerConnection; +import org.apache.activemq.artemis.core.server.ActiveMQServer; +import org.apache.activemq.artemis.core.server.ServerSession; +import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection; + +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.function.Function; + +public class ConnectionPredicateFilterPart extends PredicateFilterPart { + private final ActiveMQServer server; + + private ConnectionField f; + + public ConnectionPredicateFilterPart(ActiveMQServer server, String field, String operation, String value) { + super(operation, value); + this.server = server; + if (field != null && !field.isEmpty()) { + this.f = ConnectionField.valueOfName(field); + + //for backward compatibility + if (this.f == null) { + this.f = ConnectionField.valueOf(field); + } + } + } + + @Override + public boolean filterPart(RemotingConnection connection) throws Exception { + return switch (f) { + case CONNECTION_ID -> matches(connection.getID()); + case CLIENT_ID -> matches(connection.getClientID()); + case USERS -> matchAny(collectFromSessions(connection.getID().toString(), s -> s.getUsername())); + case PROTOCOL -> matches(connection.getProtocolName()); + case SESSION_COUNT -> matchesLong(server.getSessions(connection.getID().toString()).size()); + case REMOTE_ADDRESS -> matches(connection.getTransportConnection().getRemoteAddress()); + case LOCAL_ADDRESS -> matches(connection.getTransportConnection().getLocalAddress()); + case SESSION_ID -> matchAny(server.getSessions(connection.getID().toString())); + case CREATION_TIME -> matchesLong(connection.getCreationTime()); + case IMPLEMENTATION -> matches(connection.getClass().getSimpleName()); + case PROXY_ADDRESS -> matches(NettyServerConnection.getProxyAddress(connection.getTransportConnection())); + case PROXY_PROTOCOL_VERSION -> matches(NettyServerConnection.getProxyProtocolVersion(connection.getTransportConnection())); + }; + } + + Set collectFromSessions(String connectionId, Function getter) { + List sessions = server.getSessions(connectionId); + Set sessionAttributes = new HashSet<>(); + for (ServerSession session : sessions) { + String value = getter.apply(session); + String string = Objects.requireNonNullElse(value, ""); + sessionAttributes.add(string); + } + return sessionAttributes; + } + +} diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConsumerFilterPredicate.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConsumerFilterPredicate.java index 8872a01700f..216e2075eaf 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConsumerFilterPredicate.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConsumerFilterPredicate.java @@ -16,13 +16,10 @@ */ package org.apache.activemq.artemis.core.management.impl.view.predicate; -import org.apache.activemq.artemis.core.management.impl.view.ConsumerField; import org.apache.activemq.artemis.core.server.ActiveMQServer; import org.apache.activemq.artemis.core.server.ServerConsumer; -public class ConsumerFilterPredicate extends ActiveMQFilterPredicate { - - private ConsumerField f; +public class ConsumerFilterPredicate extends ActiveMQFilterPredicate { private final ActiveMQServer server; @@ -32,45 +29,12 @@ public ConsumerFilterPredicate(ActiveMQServer server) { } @Override - public boolean test(ServerConsumer consumer) { - // Using switch over enum vs string comparison is better for perf. - if (f == null) - return true; - return switch (f) { - case ID -> matches(consumer.getSequentialID()); - case SESSION -> matches(consumer.getSessionID()); - case USER -> matches(server.getSessionByID(consumer.getSessionID()).getUsername()); - case VALIDATED_USER -> matches(server.getSessionByID(consumer.getSessionID()).getValidatedUser()); - case ADDRESS -> matches(consumer.getQueue().getAddress()); - case QUEUE -> matches(consumer.getQueue().getName()); - case FILTER -> matches(consumer.getFilterString()); - case PROTOCOL -> - matches(server.getSessionByID(consumer.getSessionID()).getRemotingConnection().getProtocolName()); - case CLIENT_ID -> - matches(server.getSessionByID(consumer.getSessionID()).getRemotingConnection().getClientID()); - case LOCAL_ADDRESS -> - matches(server.getSessionByID(consumer.getSessionID()).getRemotingConnection().getTransportConnection().getLocalAddress()); - case REMOTE_ADDRESS -> - matches(server.getSessionByID(consumer.getSessionID()).getRemotingConnection().getTransportConnection().getRemoteAddress()); - case MESSAGES_IN_TRANSIT -> matches(consumer.getMessagesInTransit()); - case MESSAGES_IN_TRANSIT_SIZE -> matches(consumer.getMessagesInTransitSize()); - case MESSAGES_DELIVERED -> matches(consumer.getDeliveringMessages()); - case MESSAGES_DELIVERED_SIZE -> matches(consumer.getMessagesDeliveredSize()); - case MESSAGES_ACKNOWLEDGED -> matches(consumer.getMessagesAcknowledged()); - case MESSAGES_ACKNOWLEDGED_AWAITING_COMMIT -> matches(consumer.getMessagesAcknowledgedAwaitingCommit()); - default -> true; - }; + protected boolean filter(ServerConsumer consumer, ConsumerPredicateFilterPart filterPart) throws Exception { + return filterPart.filterPart(consumer); } @Override - public void setField(String field) { - if (field != null && !field.isEmpty()) { - this.f = ConsumerField.valueOfName(field); - - //for backward compatibility - if (this.f == null) { - this.f = ConsumerField.valueOf(field); - } - } + public ConsumerPredicateFilterPart createFilterPart(String field, String operation, String value) { + return new ConsumerPredicateFilterPart(server, field, operation, value); } } diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConsumerPredicateFilterPart.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConsumerPredicateFilterPart.java new file mode 100644 index 00000000000..7492981f12f --- /dev/null +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConsumerPredicateFilterPart.java @@ -0,0 +1,65 @@ +/* + * 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.management.impl.view.predicate; + +import org.apache.activemq.artemis.core.management.impl.view.ConsumerField; +import org.apache.activemq.artemis.core.server.ActiveMQServer; +import org.apache.activemq.artemis.core.server.ServerConsumer; + +public class ConsumerPredicateFilterPart extends PredicateFilterPart { + + private final ActiveMQServer server; + + private ConsumerField f; + + public ConsumerPredicateFilterPart(ActiveMQServer server, String field, String operation, String value) { + super(operation, value); + this.server = server; + if (field != null && !field.isEmpty()) { + this.f = ConsumerField.valueOfName(field); + + //for backward compatibility + if (this.f == null) { + this.f = ConsumerField.valueOf(field); + } + } + } + + @Override + public boolean filterPart(ServerConsumer consumer) throws Exception { + return switch (f) { + case ID -> matchesLong(consumer.getSequentialID()); + case SESSION -> matches(consumer.getSessionID()); + case USER -> matches(server.getSessionByID(consumer.getSessionID()).getUsername()); + case VALIDATED_USER -> matches(server.getSessionByID(consumer.getSessionID()).getValidatedUser()); + case ADDRESS -> matches(consumer.getQueue().getAddress()); + case QUEUE -> matches(consumer.getQueue().getName()); + case FILTER -> matches(consumer.getFilterString()); + case PROTOCOL -> matches(server.getSessionByID(consumer.getSessionID()).getRemotingConnection().getProtocolName()); + case CLIENT_ID -> matches(server.getSessionByID(consumer.getSessionID()).getRemotingConnection().getClientID()); + case LOCAL_ADDRESS -> matches(server.getSessionByID(consumer.getSessionID()).getRemotingConnection().getTransportConnection().getLocalAddress()); + case REMOTE_ADDRESS -> matches(server.getSessionByID(consumer.getSessionID()).getRemotingConnection().getTransportConnection().getRemoteAddress()); + case MESSAGES_IN_TRANSIT -> matchesLong(consumer.getMessagesInTransit()); + case MESSAGES_IN_TRANSIT_SIZE -> matchesLong(consumer.getMessagesInTransitSize()); + case MESSAGES_DELIVERED -> matches(consumer.getDeliveringMessages()); + case MESSAGES_DELIVERED_SIZE -> matchesLong(consumer.getMessagesDeliveredSize()); + case MESSAGES_ACKNOWLEDGED -> matchesLong(consumer.getMessagesAcknowledged()); + case MESSAGES_ACKNOWLEDGED_AWAITING_COMMIT -> matchesLong(consumer.getMessagesAcknowledgedAwaitingCommit()); + default -> true; + }; + } +} diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/PredicateFilterPart.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/PredicateFilterPart.java new file mode 100644 index 00000000000..298b47f8215 --- /dev/null +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/PredicateFilterPart.java @@ -0,0 +1,171 @@ +/* + * 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.management.impl.view.predicate; + +import java.util.Collection; + +public class PredicateFilterPart { + + private final String value; + + private final String operation; + + private final ActiveMQFilterPredicate.Operation filterOperation; + + public PredicateFilterPart(String operation, String value) { + this.value = value; + this.operation = operation; + if (operation != null && !operation.isBlank()) { + this.filterOperation = ActiveMQFilterPredicate.Operation.valueOf(operation); + } else { + filterOperation = null; + } + } + + public String getOperation() { + return operation; + } + + public String getValue() { + return value; + } + + public ActiveMQFilterPredicate.Operation getFilterOperation() { + return filterOperation; + } + + public boolean filterPart(T input) throws Exception { + return true; + } + public boolean matchesLong(long field) { + long longValue; + if (operation != null) { + + try { + longValue = Long.parseLong(value); + } catch (NumberFormatException ex) { + //cannot compare + if (filterOperation == ActiveMQFilterPredicate.Operation.NOT_EQUALS || filterOperation == ActiveMQFilterPredicate.Operation.NOT_CONTAINS) { + return true; + } else { + return false; + } + } + + return switch (filterOperation) { + case EQUALS -> field == longValue; + case NOT_EQUALS -> field != longValue; + case CONTAINS -> false; + case NOT_CONTAINS -> true; + case LESS_THAN -> field < longValue; + case GREATER_THAN -> field > longValue; + }; + } + return true; + } + + public boolean matches(Object field) { + if (filterOperation != null) { + return switch (filterOperation) { + case EQUALS -> equals(field, value); + case NOT_EQUALS -> !equals(field, value); + case CONTAINS -> contains(field, value); + case NOT_CONTAINS -> !contains(field, value); + case GREATER_THAN -> false; + case LESS_THAN -> false; + }; + } + return true; + } + + + public boolean matchesInt(int field) { + int intValue; + if (filterOperation != null) { + + try { + intValue = Integer.parseInt(value); + } catch (NumberFormatException ex) { + //cannot compare + if (filterOperation == ActiveMQFilterPredicate.Operation.NOT_EQUALS || filterOperation == ActiveMQFilterPredicate.Operation.NOT_CONTAINS) { + return true; + } else { + return false; + } + } + + return switch (filterOperation) { + case EQUALS -> field == intValue; + case NOT_EQUALS -> field != intValue; + case CONTAINS -> false; + case NOT_CONTAINS -> true; + case LESS_THAN -> field < intValue; + case GREATER_THAN -> field > intValue; + }; + } + return true; + } + + + public boolean matchesFloat(float field) { + float floatValue; + if (operation != null) { + + try { + floatValue = Float.parseFloat(value); + } catch (NumberFormatException ex) { + //cannot compare + if (filterOperation == ActiveMQFilterPredicate.Operation.NOT_EQUALS || filterOperation == ActiveMQFilterPredicate.Operation.NOT_CONTAINS) { + return true; + } else { + return false; + } + } + + return switch (filterOperation) { + case EQUALS -> field == floatValue; + case NOT_EQUALS -> field != floatValue; + case CONTAINS -> false; + case NOT_CONTAINS -> true; + case LESS_THAN -> field < floatValue; + case GREATER_THAN -> field > floatValue; + }; + } + return true; + } + public boolean matchAny(Collection objects) { + for (Object o : objects) { + if (matches(o)) + return true; + } + return false; + } + + private boolean equals(Object field, Object value) { + if (field == null) { + return (value == null || value.equals("")); + } + return field.toString().equals(value); + } + + private boolean contains(Object field, Object value) { + if (field == null) { + return (value == null || value.equals("")); + } + return field.toString().contains(value.toString()); + } +} diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ProducerFilterPredicate.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ProducerFilterPredicate.java index 6552e734fe1..5669469c6d8 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ProducerFilterPredicate.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ProducerFilterPredicate.java @@ -16,13 +16,10 @@ */ package org.apache.activemq.artemis.core.management.impl.view.predicate; -import org.apache.activemq.artemis.core.management.impl.view.ProducerField; import org.apache.activemq.artemis.core.server.ActiveMQServer; import org.apache.activemq.artemis.core.server.ServerProducer; -public class ProducerFilterPredicate extends ActiveMQFilterPredicate { - - private ProducerField f; +public class ProducerFilterPredicate extends ActiveMQFilterPredicate { private final ActiveMQServer server; @@ -32,38 +29,12 @@ public ProducerFilterPredicate(ActiveMQServer server) { } @Override - public boolean test(ServerProducer producer) { - // Using switch over enum vs string comparison is better for perf. - if (f == null) - return true; - return switch (f) { - case ID -> matches(producer.getID()); - case CONNECTION_ID -> matches(producer.getConnectionID()); - case SESSION -> matches(producer.getSessionID()); - case USER -> matches(server.getSessionByID(producer.getSessionID()).getUsername()); - case VALIDATED_USER -> matches(server.getSessionByID(producer.getSessionID()).getValidatedUser()); - case ADDRESS -> - matches(producer.getAddress() != null ? producer.getAddress() : server.getSessionByID(producer.getSessionID()).getDefaultAddress()); - case PROTOCOL -> matches(producer.getProtocol()); - case CLIENT_ID -> - matches(server.getSessionByID(producer.getSessionID()).getRemotingConnection().getClientID()); - case LOCAL_ADDRESS -> - matches(server.getSessionByID(producer.getSessionID()).getRemotingConnection().getTransportConnection().getLocalAddress()); - case REMOTE_ADDRESS -> - matches(server.getSessionByID(producer.getSessionID()).getRemotingConnection().getTransportConnection().getRemoteAddress()); - default -> true; - }; + protected boolean filter(ServerProducer producer, ProducerPredicateFilterPart filterPart) throws Exception { + return filterPart.filterPart(producer); } @Override - public void setField(String field) { - if (field != null && !field.isEmpty()) { - this.f = ProducerField.valueOfName(field); - - //for backward compatibility - if (this.f == null) { - this.f = ProducerField.valueOf(field); - } - } + public ProducerPredicateFilterPart createFilterPart(String field, String operation, String value) { + return new ProducerPredicateFilterPart(server, field, operation, value); } } diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ProducerPredicateFilterPart.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ProducerPredicateFilterPart.java new file mode 100644 index 00000000000..35aa06794d5 --- /dev/null +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ProducerPredicateFilterPart.java @@ -0,0 +1,58 @@ +/* + * 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.management.impl.view.predicate; + +import org.apache.activemq.artemis.core.management.impl.view.ProducerField; +import org.apache.activemq.artemis.core.server.ActiveMQServer; +import org.apache.activemq.artemis.core.server.ServerProducer; + +public class ProducerPredicateFilterPart extends PredicateFilterPart { + + private final ActiveMQServer server; + + private ProducerField f; + + public ProducerPredicateFilterPart(ActiveMQServer server, String field, String operation, String value) { + super(operation, value); + this.server = server; + if (field != null && !field.isEmpty()) { + this.f = ProducerField.valueOfName(field); + + //for backward compatibility + if (this.f == null) { + this.f = ProducerField.valueOf(field); + } + } + } + + @Override + public boolean filterPart(ServerProducer producer) throws Exception { + return switch (f) { + case ID -> matchesLong(producer.getID()); + case CONNECTION_ID -> matches(producer.getConnectionID()); + case SESSION -> matches(producer.getSessionID()); + case USER -> matches(server.getSessionByID(producer.getSessionID()).getUsername()); + case VALIDATED_USER -> matches(server.getSessionByID(producer.getSessionID()).getValidatedUser()); + case ADDRESS -> matches(producer.getAddress() != null ? producer.getAddress() : server.getSessionByID(producer.getSessionID()).getDefaultAddress()); + case PROTOCOL -> matches(producer.getProtocol()); + case CLIENT_ID -> matches(server.getSessionByID(producer.getSessionID()).getRemotingConnection().getClientID()); + case LOCAL_ADDRESS -> matches(server.getSessionByID(producer.getSessionID()).getRemotingConnection().getTransportConnection().getLocalAddress()); + case REMOTE_ADDRESS -> matches(server.getSessionByID(producer.getSessionID()).getRemotingConnection().getTransportConnection().getRemoteAddress()); + default -> true; + }; + } +} diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/QueueFilterPredicate.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/QueueFilterPredicate.java index 87314db48ce..0d846e3a085 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/QueueFilterPredicate.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/QueueFilterPredicate.java @@ -16,14 +16,11 @@ */ package org.apache.activemq.artemis.core.management.impl.view.predicate; -import org.apache.activemq.artemis.api.core.SimpleString; import org.apache.activemq.artemis.api.core.management.QueueControl; import org.apache.activemq.artemis.core.management.impl.view.QueueField; import org.apache.activemq.artemis.core.server.ActiveMQServer; -import org.apache.activemq.artemis.core.server.Consumer; -import org.apache.activemq.artemis.core.server.Queue; -public class QueueFilterPredicate extends ActiveMQFilterPredicate { +public class QueueFilterPredicate extends ActiveMQFilterPredicate { private QueueField f; @@ -35,58 +32,12 @@ public QueueFilterPredicate(ActiveMQServer server) { } @Override - public boolean test(QueueControl queue) { - if (f == null) - return true; - try { - return switch (f) { - case ID -> matches(queue.getID()); - case NAME -> matches(queue.getName()); - case CONSUMER_ID -> { - Queue q = server.locateQueue(SimpleString.of(queue.getName())); - for (Consumer consumer : q.getConsumers()) { - if (matches(consumer.sequentialID())) - yield true; - } - yield false; - } - case MAX_CONSUMERS -> matches(queue.getMaxConsumers()); - case ADDRESS -> matches(queue.getAddress()); - case FILTER -> matches(queue.getFilter()); - case MESSAGE_COUNT -> matches(queue.getMessageCount()); - case CONSUMER_COUNT -> matches(queue.getConsumerCount()); - case DELIVERING_COUNT -> matches(queue.getDeliveringCount()); - case MESSAGES_ADDED -> matches(queue.getMessagesAdded()); - case MESSAGES_ACKED -> matches(queue.getMessagesAcknowledged()); - case MESSAGES_EXPIRED -> matches(queue.getMessagesExpired()); - case ROUTING_TYPE -> matches(queue.getRoutingType()); - case AUTO_CREATED -> matches(server.locateQueue(SimpleString.of(queue.getName())).isAutoCreated()); - case DURABLE -> matches(queue.isDurable()); - case PAUSED -> matches(queue.isPaused()); - case TEMPORARY -> matches(queue.isTemporary()); - case PURGE_ON_NO_CONSUMERS -> matches(queue.isPurgeOnNoConsumers()); - case MESSAGES_KILLED -> matches(queue.getMessagesKilled()); - case EXCLUSIVE -> matches(queue.isExclusive()); - case LAST_VALUE -> matches(queue.isLastValue()); - case SCHEDULED_COUNT -> matches(queue.getScheduledCount()); - case USER -> matches(queue.getUser()); - case INTERNAL_QUEUE -> matches(queue.isInternalQueue()); - default -> true; - }; - } catch (Exception e) { - return true; - } + protected boolean filter(QueueControl queue, QueuePredicateFilterPart filterPart) throws Exception { + return filterPart.filterPart(queue); } @Override - public void setField(String field) { - if (field != null && !field.isEmpty()) { - this.f = QueueField.valueOfName(field); - - //for backward compatibility - if (this.f == null) { - this.f = QueueField.valueOf(field); - } - } + public QueuePredicateFilterPart createFilterPart(String field, String operation, String value) { + return new QueuePredicateFilterPart(server, field, operation, value); } } diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/QueuePredicateFilterPart.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/QueuePredicateFilterPart.java new file mode 100644 index 00000000000..abb7d4a3a7b --- /dev/null +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/QueuePredicateFilterPart.java @@ -0,0 +1,80 @@ +/* + * 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.management.impl.view.predicate; + +import org.apache.activemq.artemis.api.core.SimpleString; +import org.apache.activemq.artemis.api.core.management.QueueControl; +import org.apache.activemq.artemis.core.management.impl.view.QueueField; +import org.apache.activemq.artemis.core.server.ActiveMQServer; +import org.apache.activemq.artemis.core.server.Consumer; +import org.apache.activemq.artemis.core.server.Queue; + +public class QueuePredicateFilterPart extends PredicateFilterPart { + private final ActiveMQServer server; + private QueueField f; + + public QueuePredicateFilterPart(ActiveMQServer server, String field, String operation, String value) { + super(operation, value); + this.server = server; + if (field != null && !field.isEmpty()) { + f = QueueField.valueOfName(field); + + //for backward compatibility + if (f == null) { + f = QueueField.valueOf(field); + } + } + } + + @Override + public boolean filterPart(QueueControl queue) { + return switch (f) { + case ID -> matchesLong(queue.getID()); + case NAME -> matches(queue.getName()); + case CONSUMER_ID -> { + Queue q = server.locateQueue(SimpleString.of(queue.getName())); + for (Consumer consumer : q.getConsumers()) { + if (matchesLong(consumer.sequentialID())) + yield true; + } + yield false; + } + case MAX_CONSUMERS -> matchesInt(queue.getMaxConsumers()); + case ADDRESS -> matches(queue.getAddress()); + case FILTER -> matches(queue.getFilter()); + case MESSAGE_COUNT -> matchesLong(queue.getMessageCount()); + case CONSUMER_COUNT -> matchesInt(queue.getConsumerCount()); + case DELIVERING_COUNT -> matchesInt(queue.getDeliveringCount()); + case MESSAGES_ADDED -> matchesLong(queue.getMessagesAdded()); + case MESSAGES_ACKED -> matchesLong(queue.getMessagesAcknowledged()); + case MESSAGES_EXPIRED -> matchesLong(queue.getMessagesExpired()); + case ROUTING_TYPE -> matches(queue.getRoutingType()); + case AUTO_CREATED -> matches(server.locateQueue(SimpleString.of(queue.getName())).isAutoCreated()); + case DURABLE -> matches(queue.isDurable()); + case PAUSED -> matches(queue.isPaused()); + case TEMPORARY -> matches(queue.isTemporary()); + case PURGE_ON_NO_CONSUMERS -> matches(queue.isPurgeOnNoConsumers()); + case MESSAGES_KILLED -> matchesLong(queue.getMessagesKilled()); + case EXCLUSIVE -> matches(queue.isExclusive()); + case LAST_VALUE -> matches(queue.isLastValue()); + case SCHEDULED_COUNT -> matchesLong(queue.getScheduledCount()); + case USER -> matches(queue.getUser()); + case INTERNAL_QUEUE -> matches(queue.isInternalQueue()); + default -> true; + }; + } +} diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/SessionFilterPredicate.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/SessionFilterPredicate.java index 50a40ae6f9b..d95b9eb2f35 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/SessionFilterPredicate.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/SessionFilterPredicate.java @@ -16,44 +16,21 @@ */ package org.apache.activemq.artemis.core.management.impl.view.predicate; -import org.apache.activemq.artemis.core.management.impl.view.SessionField; import org.apache.activemq.artemis.core.server.ServerSession; -public class SessionFilterPredicate extends ActiveMQFilterPredicate { - - private SessionField f; +public class SessionFilterPredicate extends ActiveMQFilterPredicate { public SessionFilterPredicate() { super(); } @Override - public boolean test(ServerSession session) { - // Using switch over enum vs string comparison is better for perf. - if (f == null) - return true; - return switch (f) { - case ID -> matches(session.getName()); - case CONNECTION_ID -> matches(session.getConnectionID()); - case CONSUMER_COUNT -> matches(session.getServerConsumers().size()); - case PRODUCER_COUNT -> matches(session.getServerProducers().size()); - case PROTOCOL -> matches(session.getRemotingConnection().getProtocolName()); - case CLIENT_ID -> matches(session.getRemotingConnection().getClientID()); - case LOCAL_ADDRESS -> matches(session.getRemotingConnection().getTransportConnection().getLocalAddress()); - case REMOTE_ADDRESS -> matches(session.getRemotingConnection().getTransportConnection().getRemoteAddress()); - default -> true; - }; + public SessionPredicateFilterPart createFilterPart(String field, String operation, String value) { + return new SessionPredicateFilterPart(field, operation, value); } @Override - public void setField(String field) { - if (field != null && !field.isEmpty()) { - this.f = SessionField.valueOfName(field); - - //for backward compatibility - if (this.f == null) { - this.f = SessionField.valueOf(field); - } - } + protected boolean filter(ServerSession session, SessionPredicateFilterPart filterPart) throws Exception { + return filterPart.filterPart(session); } } diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/SessionPredicateFilterPart.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/SessionPredicateFilterPart.java new file mode 100644 index 00000000000..0cc5c4b8df7 --- /dev/null +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/SessionPredicateFilterPart.java @@ -0,0 +1,52 @@ +/* + * 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.management.impl.view.predicate; + +import org.apache.activemq.artemis.core.management.impl.view.SessionField; +import org.apache.activemq.artemis.core.server.ServerSession; + +public class SessionPredicateFilterPart extends PredicateFilterPart { + + private SessionField f; + + public SessionPredicateFilterPart(String field, String operation, String value) { + super(operation, value); + if (field != null && !field.isEmpty()) { + f = SessionField.valueOfName(field); + + //for backward compatibility + if (f == null) { + f = SessionField.valueOf(field); + } + } + } + + @Override + public boolean filterPart(ServerSession session) throws Exception { + return switch (f) { + case ID -> matches(session.getName()); + case CONNECTION_ID -> matches(session.getConnectionID()); + case CONSUMER_COUNT -> matchesLong(session.getServerConsumers().size()); + case PRODUCER_COUNT -> matchesLong(session.getServerProducers().size()); + case PROTOCOL -> matches(session.getRemotingConnection().getProtocolName()); + case CLIENT_ID -> matches(session.getRemotingConnection().getClientID()); + case LOCAL_ADDRESS -> matches(session.getRemotingConnection().getTransportConnection().getLocalAddress()); + case REMOTE_ADDRESS -> matches(session.getRemotingConnection().getTransportConnection().getRemoteAddress()); + default -> true; + }; + } +} diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/impl/RemotingServiceImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/impl/RemotingServiceImpl.java index c4ec118c1c8..e75ab19afec 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/impl/RemotingServiceImpl.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/impl/RemotingServiceImpl.java @@ -1072,9 +1072,9 @@ private void addAcceptorStoreReloadCallback(String acceptorName, URL storeURL, S server.getReloadManager().addCallback(storeURL, (uri) -> { // preference for Control to capture consistent audit logging if (managementService != null) { - Object targetControl = managementService.getResource(ResourceNames.ACCEPTOR + acceptorName); - if (targetControl instanceof AcceptorControl acceptorControl) { - acceptorControl.reload(); + AcceptorControl targetControl = managementService.getAcceptorControl(ResourceNames.ACCEPTOR + acceptorName); + if (targetControl != null) { + targetControl.reload(); } } }); diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementService.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementService.java index 8ad304fe80f..f681df67fbe 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementService.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementService.java @@ -16,8 +16,10 @@ */ package org.apache.activemq.artemis.core.server.management; +import java.util.List; import java.util.Set; import java.util.concurrent.ScheduledExecutorService; +import java.util.function.Predicate; import javax.management.ObjectName; @@ -27,8 +29,12 @@ import org.apache.activemq.artemis.api.core.RoutingType; import org.apache.activemq.artemis.api.core.SimpleString; import org.apache.activemq.artemis.api.core.TransportConfiguration; +import org.apache.activemq.artemis.api.core.management.AcceptorControl; import org.apache.activemq.artemis.api.core.management.AddressControl; +import org.apache.activemq.artemis.api.core.management.BridgeControl; +import org.apache.activemq.artemis.api.core.management.DivertControl; import org.apache.activemq.artemis.api.core.management.ObjectNameBuilder; +import org.apache.activemq.artemis.api.core.management.QueueControl; import org.apache.activemq.artemis.core.config.ClusterConnectionConfiguration; import org.apache.activemq.artemis.core.config.Configuration; import org.apache.activemq.artemis.core.management.impl.ActiveMQServerControlImpl; @@ -92,8 +98,6 @@ ActiveMQServerControlImpl registerServer(PostOffice postOffice, void unregisterFromJMX(ObjectName objectName) throws Exception; - void registerInRegistry(String resourceName, Object managedResource); - void unregisterFromRegistry(String resourceName); void registerAddress(AddressInfo addressInfo) throws Exception; @@ -159,4 +163,19 @@ void registerBroadcastGroup(BroadcastGroup broadcastGroup, Object invokeOperation(String resourceName, String operation, Object[] params, SecurityAuth auth) throws Exception; + List getQueueControls(Predicate predicate); + + List getAddressControls(Predicate predicate); + + AddressControl getAddressControl(String resourceName); + + AcceptorControl getAcceptorControl(String resourceName); + + void registerAMQPControl(String amqpResourceName, Object control); + + void unRegisterAMQPControl(String amqpResourceName); + + List getDivertControls(); + + List getBridgeControls(); } diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ControlRegistries.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ControlRegistries.java new file mode 100644 index 00000000000..e0316ebc915 --- /dev/null +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ControlRegistries.java @@ -0,0 +1,338 @@ +/* + * 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.server.management.impl; + + +import org.apache.activemq.artemis.api.core.management.AcceptorControl; +import org.apache.activemq.artemis.api.core.management.ActiveMQServerControl; +import org.apache.activemq.artemis.api.core.management.AddressControl; +import org.apache.activemq.artemis.api.core.management.BaseBroadcastGroupControl; +import org.apache.activemq.artemis.api.core.management.BridgeControl; +import org.apache.activemq.artemis.api.core.management.BrokerConnectionControl; +import org.apache.activemq.artemis.api.core.management.ClusterConnectionControl; +import org.apache.activemq.artemis.api.core.management.ConnectionRouterControl; +import org.apache.activemq.artemis.api.core.management.DivertControl; +import org.apache.activemq.artemis.api.core.management.QueueControl; +import org.apache.activemq.artemis.api.core.management.RemoteBrokerConnectionControl; +import org.apache.activemq.artemis.api.core.management.ResourceNames; +import org.apache.activemq.artemis.core.management.impl.ActiveMQServerControlImpl; +import org.apache.activemq.artemis.core.server.management.HawtioSecurityControl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.invoke.MethodHandles; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Predicate; +import java.util.stream.Collectors; + + +public class ControlRegistries { + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + public final Map serverControls; + // we keep a second map just for queues for quick searching when many exist + public final Map queueControls; + + // we keep a second map just for queues for quick searching when many exist + public final Map addressControls; + + public final Map accepterControls; + + public final Map broadcastGroupControls; + + public final Map brokerConnectionControls; + + public final Map remoteBrokerConnectionControls; + + public final Map bridgeControls; + + public final Map clusterConnectionControl; + + public final Map connectionRouterControls; + + public final Map hawtioSecurityControls; + + public final Map amqpControls; + + public final Map divertControls; + + public ControlRegistries() { + serverControls = new ConcurrentHashMap<>(); + queueControls = new ConcurrentHashMap<>(); + addressControls = new ConcurrentHashMap<>(); + accepterControls = new ConcurrentHashMap<>(); + broadcastGroupControls = new ConcurrentHashMap<>(); + brokerConnectionControls = new ConcurrentHashMap<>(); + remoteBrokerConnectionControls = new ConcurrentHashMap<>(); + bridgeControls = new ConcurrentHashMap<>(); + clusterConnectionControl = new ConcurrentHashMap<>(); + connectionRouterControls = new ConcurrentHashMap<>(); + hawtioSecurityControls = new ConcurrentHashMap<>(); + amqpControls = new ConcurrentHashMap<>(); + divertControls = new ConcurrentHashMap<>(); + } + + public void unregisterQueueControls(final String resourceName) { + queueControls.remove(resourceName); + } + + public void registerQueueControls(final String resourceName, final QueueControl queueControl) { + queueControls.put(resourceName, queueControl); + } + + public void unregisterAddressControls(final String resourceName) { + addressControls.remove(resourceName); + } + + public void registerAddressControls(final String resourceName, final AddressControl addressControl) { + addressControls.put(resourceName, addressControl); + } + + public void registerAcceptor(String resourceName, AcceptorControl acceptorControl) { + accepterControls.put(resourceName, acceptorControl); + } + + public List getQueueControls(Predicate predicate) { + if (predicate == null) { + return queueControls.values().stream().toList(); + } + return queueControls.values().stream().filter(predicate).collect(Collectors.toList()); + } + + public List getAddressControls(Predicate predicate) { + if (predicate == null) { + return addressControls.values().stream().toList(); + } + return addressControls.values().stream().filter(predicate).collect(Collectors.toList()); + } + + public Set getAcceptorNames() { + return accepterControls.keySet(); + } + + public void unregisterAcceptorControls(String resourceName) { + accepterControls.remove(resourceName); + } + + public void registerBroadcastGroupControls(String resourceName, BaseBroadcastGroupControl control) { + broadcastGroupControls.put(resourceName, control); + } + + public void unRegisterBroadcastGroupControls(String resourceName) { + broadcastGroupControls.remove(resourceName); + } + + public void registerBrokerConnectionControl(String resourceName, BrokerConnectionControl control) { + brokerConnectionControls.put(resourceName, control); + } + + public void unRegisterBrokerConnectionControl(String resourceName) { + brokerConnectionControls.remove(resourceName); + } + + public void registerRemoteBrokerConnectionControl(String resourceName, RemoteBrokerConnectionControl control) { + remoteBrokerConnectionControls.put(resourceName, control); + } + + public void unRegisterRemoteBrokerConnectionControl(String resourceName) { + remoteBrokerConnectionControls.remove(resourceName); + } + + public void registerBridgeControl(String resourceName, BridgeControl control) { + bridgeControls.put(resourceName, control); + } + + public void unRegisterBridgeControl(String resourceName) { + bridgeControls.remove(resourceName); + } + + public void registerClusterConnectionControl(String resourceName, ClusterConnectionControl control) { + clusterConnectionControl.put(resourceName, control); + } + + public void unRegisterClusterConnectionControl(String resourceName) { + clusterConnectionControl.remove(resourceName); + } + + public void registerConnectionRouterControl(String resourceName, ConnectionRouterControl connectionRouterControl) { + connectionRouterControls.put(resourceName, connectionRouterControl); + } + + public void unRegisterConnectionRouterControl(String resourceName) { + connectionRouterControls.remove(resourceName); + } + + public void registerHawtioSecurityControl(String resourceName, HawtioSecurityControl control) { + hawtioSecurityControls.put(resourceName, control); + } + + public void unRegisterHawtioSecurityControl(String resourceName) { + hawtioSecurityControls.remove(resourceName); + } + + public AddressControl getAddressControl(String resourceName) { + return addressControls.get(resourceName); + } + + public AcceptorControl getAcceptorControl(String resourceName) { + return accepterControls.get(resourceName); + } + + public void registerAMQPControl(String amqpResourceName, Object control) { + amqpControls.put(amqpResourceName, control); + } + + public void unRegisterAMQPControl(String amqpResourceName) { + amqpControls.remove(amqpResourceName); + } + + public void registerBroker(String resourceName, ActiveMQServerControlImpl messagingServerControl) { + serverControls.put(resourceName, messagingServerControl); + } + + public void unRegisterBroker(String resourceName) { + serverControls.remove(resourceName); + } + + public void registerDivertControl(String resourceName, DivertControl divertControl) { + Object replaced = divertControls.put(resourceName, divertControl); + String addendum = ""; + if (replaced != null) { + addendum = ". Replaced: " + replaced; + } + logger.debug("Registered in management: {} as {}{}", resourceName, divertControl, addendum); + } + + public void unRegisterDivertControl(String resourceName) { + Object removed = divertControls.remove(resourceName); + if (removed != null) { + logger.debug("Unregistered from management: {} as {}", resourceName, removed); + } else { + logger.debug("Attempted to unregister {} from management, but it was not registered."); + } + } + + public void clear() { + //todo + } + + public Object get(String resourceName) { + String resourceNamePrefix = resourceName; + int idx = resourceName.indexOf("."); + if (idx > 0) { + resourceNamePrefix = resourceName.substring(0, idx + 1); + } + + switch (resourceNamePrefix) { + case ResourceNames.BROKER: return serverControls.get(resourceName); + case ResourceNames.ADDRESS: return addressControls.get(resourceName); + case ResourceNames.QUEUE: return queueControls.get(resourceName); + case ResourceNames.ACCEPTOR: return accepterControls.get(resourceName); + case ResourceNames.BROADCAST_GROUP: return broadcastGroupControls.get(resourceName); + case ResourceNames.BROKER_CONNECTION: return brokerConnectionControls.get(resourceName); + case ResourceNames.REMOTE_BROKER_CONNECTION: return remoteBrokerConnectionControls.get(resourceName); + case ResourceNames.BRIDGE: return bridgeControls.get(resourceName); + case ResourceNames.CORE_CLUSTER_CONNECTION: return clusterConnectionControl.get(resourceName); + case ResourceNames.CONNECTION_ROUTER: return connectionRouterControls.get(resourceName); + case ResourceNames.MANAGEMENT_SECURITY: return hawtioSecurityControls.get(resourceName); + case ResourceNames.DIVERT: return divertControls.get(resourceName); + default: { + if (amqpControls.containsKey(resourceName)) { + return amqpControls.get(resourceName); + } + return null; + } + } + } + + public Object legacyGetResource(String resourceName) { + Object resource = serverControls.get(resourceName); + if (resource == null) + resource = addressControls.get(resourceName); + if (resource == null) + resource = queueControls.get(resourceName); + if (resource == null) + resource = accepterControls.get(resourceName); + if (resource == null) + resource = broadcastGroupControls.get(resourceName); + if (resource == null) + resource = brokerConnectionControls.get(resourceName); + if (resource == null) + resource = remoteBrokerConnectionControls.get(resourceName); + if (resource == null) + resource = bridgeControls.get(resourceName); + if (resource == null) + resource = clusterConnectionControl.get(resourceName); + if (resource == null) + resource = connectionRouterControls.get(resourceName); + if (resource == null) + resource = hawtioSecurityControls.get(resourceName); + if (resource == null) + resource = divertControls.get(resourceName); + if (resource == null) + resource = amqpControls.get(resourceName); + + return resource; + } + + public List getDivertControls() { + return divertControls.values().stream().toList(); + } + + public List getBridgeControls() { + return bridgeControls.values().stream().toList(); + } + + public Set unRegisterAll() { + Set names = new HashSet<>(); + names.addAll(unregisterMap(serverControls)); + names.addAll(unregisterMap(addressControls)); + names.addAll(unregisterMap(queueControls)); + names.addAll(unregisterMap(accepterControls)); + names.addAll(unregisterMap(broadcastGroupControls)); + names.addAll(unregisterMap(brokerConnectionControls)); + names.addAll(unregisterMap(remoteBrokerConnectionControls)); + names.addAll(unregisterMap(bridgeControls)); + names.addAll(unregisterMap(clusterConnectionControl)); + names.addAll(unregisterMap(connectionRouterControls)); + names.addAll(unregisterMap(hawtioSecurityControls)); + names.addAll(unregisterMap(amqpControls)); + return names; + } + + private Collection unregisterMap(Map registry) { + Set resourceNames = new HashSet<>(registry.keySet()); + for (String resourceName : resourceNames) { + unregisterFromRegistry(resourceName, registry); + } + return resourceNames; + } + + private void unregisterFromRegistry(final String resourceName, final Map registry) { + Object removed = registry.remove(resourceName); + if (removed != null) { + logger.debug("Unregistered from management: {} as {}", resourceName, removed); + } else { + logger.debug("Attempted to unregister {} from management, but it was not registered."); + } + } +} diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java index 561b9818d5d..040ea1646d9 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java @@ -29,11 +29,10 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledExecutorService; +import java.util.function.Predicate; import java.util.regex.Pattern; import io.micrometer.core.instrument.Tag; @@ -132,7 +131,7 @@ public class ManagementServiceImpl implements ManagementService { private final boolean jmxManagementEnabled; - private final Map registry; + ControlRegistries registries = new ControlRegistries(); private final NotificationBroadcasterSupport broadcaster; @@ -180,8 +179,6 @@ public ManagementServiceImpl(final MBeanServer mbeanServer, final Configuration messageCounterEnabled = configuration.isMessageCounterEnabled(); managementAddress = configuration.getManagementAddress(); managementNotificationAddress = configuration.getManagementNotificationAddress(); - - registry = new ConcurrentHashMap<>(); broadcaster = new NotificationBroadcasterSupport(); notificationsEnabled = true; objectNameBuilder = ObjectNameBuilder.create(configuration.getJMXDomain(), configuration.getName(), configuration.isJMXUseBrokerName()); @@ -236,7 +233,7 @@ public ActiveMQServerControlImpl registerServer(final PostOffice postOffice, messagingServerControl = new ActiveMQServerControlImpl(postOffice, configuration, resourceManager, remotingService, messagingServer, messageCounterManager, storageManager1, broadcaster); ObjectName objectName = objectNameBuilder.getActiveMQServerObjectName(); registerInJMX(objectName, messagingServerControl); - registerInRegistry(ResourceNames.BROKER, messagingServerControl); + registries.registerBroker(ResourceNames.BROKER, messagingServerControl); registerBrokerMeters(); return messagingServerControl; @@ -266,7 +263,7 @@ private void registerBrokerMeters() { @Override public void unregisterServer() throws Exception { unregisterFromJMX(objectNameBuilder.getActiveMQServerObjectName()); - unregisterFromRegistry(ResourceNames.BROKER); + registries.unRegisterBroker(ResourceNames.BROKER); if (messagingServer != null) { unregisterMeters(ResourceNames.BROKER + "." + messagingServer.getConfiguration().getName()); } @@ -276,7 +273,7 @@ public void unregisterServer() throws Exception { public void registerAddress(AddressInfo addressInfo) throws Exception { AddressControlImpl addressControl = new AddressControlImpl(addressInfo, messagingServer, pagingManager, storageManager, securityRepository, securityStore, this); registerInJMX(objectNameBuilder.getAddressObjectName(addressInfo.getName()), addressControl); - registerInRegistry(ResourceNames.ADDRESS + addressInfo.getName(), addressControl); + registries.registerAddressControls(ResourceNames.ADDRESS + addressInfo.getName(), addressControl); registerAddressMeters(addressInfo, addressControl); } @@ -299,7 +296,7 @@ public void registerAddressMeters(AddressInfo addressInfo, AddressControl addres @Override public void unregisterAddress(final SimpleString address) throws Exception { unregisterFromJMX(objectNameBuilder.getAddressObjectName(address)); - unregisterFromRegistry(ResourceNames.ADDRESS + address); + registries.unregisterAddressControls(ResourceNames.ADDRESS + address); unregisterMeters(ResourceNames.ADDRESS + address); } @@ -312,20 +309,50 @@ public void registerQueue(final Queue queue, final SimpleString address, final S messageCounterManager.registerMessageCounter(queue.getName().toString(), counter); } registerInJMX(objectNameBuilder.getQueueObjectName(address, queue.getName(), queue.getRoutingType()), queueControl); - registerInRegistry(ResourceNames.QUEUE + queue.getName(), queueControl); + registries.registerQueueControls(ResourceNames.QUEUE + queue.getName(), queueControl); registerQueueMeters(queue); } @Override public void unregisterQueue(final SimpleString name, final SimpleString address, RoutingType routingType) throws Exception { unregisterFromJMX(objectNameBuilder.getQueueObjectName(address, name, routingType)); - unregisterFromRegistry(ResourceNames.QUEUE + name); + registries.unregisterQueueControls(ResourceNames.QUEUE + name); unregisterMeters(ResourceNames.QUEUE + name); if (messageCounterManager != null) { messageCounterManager.unregisterMessageCounter(name.toString()); } } + @Override + public List getQueueControls(Predicate predicate) { + return registries.getQueueControls(predicate); + } + + @Override + public List getAddressControls(Predicate predicate) { + return registries.getAddressControls(predicate); + } + + @Override + public AddressControl getAddressControl(String resourceName) { + return registries.getAddressControl(resourceName); + } + + @Override + public AcceptorControl getAcceptorControl(String resourceName) { + return registries.getAcceptorControl(resourceName); + } + + @Override + public void registerAMQPControl(String amqpResourceName, Object control) { + registries.registerAMQPControl(amqpResourceName, control); + } + + @Override + public void unRegisterAMQPControl(String amqpResourceName) { + registries.unRegisterAMQPControl(amqpResourceName); + } + private void registerQueueMeters(final Queue queue) { if (messagingServer != null) { // messagingServer could be null on certain unit tests where metrics are not relevant MetricsManager metricsManager = messagingServer.getMetricsManager(); @@ -369,25 +396,25 @@ private void unregisterMeters(final String name) { public void registerDivert(final Divert divert) throws Exception { DivertControl divertControl = new DivertControlImpl(divert, storageManager, messagingServer.getInternalNamingPrefix()); registerInJMX(objectNameBuilder.getDivertObjectName(divert.getUniqueName().toString(), divert.getAddress().toString()), divertControl); - registerInRegistry(ResourceNames.DIVERT + divert.getUniqueName(), divertControl); + registries.registerDivertControl(ResourceNames.DIVERT + divert.getUniqueName(), divertControl); } @Override public void unregisterDivert(final SimpleString name, final SimpleString address) throws Exception { unregisterFromJMX(objectNameBuilder.getDivertObjectName(name.toString(), address.toString())); - unregisterFromRegistry(ResourceNames.DIVERT + name); + registries.unRegisterDivertControl(ResourceNames.DIVERT + name); } @Override public void registerAcceptor(final Acceptor acceptor, final TransportConfiguration configuration) throws Exception { AcceptorControl control = new AcceptorControlImpl(acceptor, storageManager, configuration); registerInJMX(objectNameBuilder.getAcceptorObjectName(configuration.getName()), control); - registerInRegistry(ResourceNames.ACCEPTOR + configuration.getName(), control); + registries.registerAcceptor(ResourceNames.ACCEPTOR + configuration.getName(), control); } @Override public void unregisterAcceptors() { - for (String resourceName : new HashSet<>(registry.keySet())) { + for (String resourceName : new HashSet<>(registries.getAcceptorNames())) { if (resourceName.startsWith(ResourceNames.ACCEPTOR)) { String name = resourceName.substring(ResourceNames.ACCEPTOR.length()); try { @@ -402,7 +429,7 @@ public void unregisterAcceptors() { @Override public void unregisterAcceptor(final String name) throws Exception { unregisterFromJMX(objectNameBuilder.getAcceptorObjectName(name)); - unregisterFromRegistry(ResourceNames.ACCEPTOR + name); + registries.unregisterAcceptorControls(ResourceNames.ACCEPTOR + name); } @Override @@ -420,26 +447,26 @@ public void registerBroadcastGroup(final BroadcastGroup broadcastGroup, final Br control = new BaseBroadcastGroupControlImpl(broadcastGroup, storageManager, configuration); } registerInJMX(objectNameBuilder.getBroadcastGroupObjectName(configuration.getName()), control); - registerInRegistry(ResourceNames.BROADCAST_GROUP + configuration.getName(), control); + registries.registerBroadcastGroupControls(ResourceNames.BROADCAST_GROUP + configuration.getName(), control); } @Override public void unregisterBroadcastGroup(final String name) throws Exception { unregisterFromJMX(objectNameBuilder.getBroadcastGroupObjectName(name)); - unregisterFromRegistry(ResourceNames.BROADCAST_GROUP + name); + registries.unRegisterBroadcastGroupControls(ResourceNames.BROADCAST_GROUP + name); } @Override public void registerBrokerConnection(BrokerConnection brokerConnection) throws Exception { BrokerConnectionControl control = new BrokerConnectionControlImpl(brokerConnection, storageManager); registerInJMX(objectNameBuilder.getBrokerConnectionObjectName(brokerConnection.getName()), control); - registerInRegistry(ResourceNames.BROKER_CONNECTION + brokerConnection.getName(), control); + registries.registerBrokerConnectionControl(ResourceNames.BROKER_CONNECTION + brokerConnection.getName(), control); } @Override public void unregisterBrokerConnection(String name) throws Exception { unregisterFromJMX(objectNameBuilder.getBrokerConnectionObjectName(name)); - unregisterFromRegistry(ResourceNames.BROKER_CONNECTION + name); + registries.unRegisterBrokerConnectionControl(ResourceNames.BROKER_CONNECTION + name); } @Override @@ -460,13 +487,13 @@ public void registerRemoteBrokerConnection(RemoteBrokerConnection brokerConnecti RemoteBrokerConnectionControl control = new RemoteBrokerConnectionControlImpl(brokerConnection, storageManager); registerInJMX(objectNameBuilder.getRemoteBrokerConnectionObjectName(nodeId, name), control); - registerInRegistry(ResourceNames.REMOTE_BROKER_CONNECTION + nodeId + "." + name, control); + registries.registerRemoteBrokerConnectionControl(ResourceNames.REMOTE_BROKER_CONNECTION + nodeId + "." + name, control); } @Override public void unregisterRemoteBrokerConnection(String nodeId, String name) throws Exception { unregisterFromJMX(objectNameBuilder.getRemoteBrokerConnectionObjectName(nodeId, name)); - unregisterFromRegistry(ResourceNames.REMOTE_BROKER_CONNECTION + nodeId + "." + name); + registries.unRegisterRemoteBrokerConnectionControl(ResourceNames.REMOTE_BROKER_CONNECTION + nodeId + "." + name); } @Override @@ -474,52 +501,52 @@ public void registerBridge(final Bridge bridge) throws Exception { bridge.setNotificationService(this); BridgeControl control = new BridgeControlImpl(bridge, storageManager); registerInJMX(objectNameBuilder.getBridgeObjectName(bridge.getConfiguration().getName()), control); - registerInRegistry(ResourceNames.BRIDGE + bridge.getName(), control); + registries.registerBridgeControl(ResourceNames.BRIDGE + bridge.getName(), control); } @Override public void unregisterBridge(final String name) throws Exception { unregisterFromJMX(objectNameBuilder.getBridgeObjectName(name)); - unregisterFromRegistry(ResourceNames.BRIDGE + name); + registries.unRegisterBridgeControl(ResourceNames.BRIDGE + name); } @Override public void registerCluster(final ClusterConnection cluster, final ClusterConnectionConfiguration configuration) throws Exception { ClusterConnectionControl control = new ClusterConnectionControlImpl(cluster, storageManager, configuration); registerInJMX(objectNameBuilder.getClusterConnectionObjectName(configuration.getName()), control); - registerInRegistry(ResourceNames.CORE_CLUSTER_CONNECTION + configuration.getName(), control); + registries.registerClusterConnectionControl(ResourceNames.CORE_CLUSTER_CONNECTION + configuration.getName(), control); } @Override public void unregisterCluster(final String name) throws Exception { unregisterFromJMX(objectNameBuilder.getClusterConnectionObjectName(name)); - unregisterFromRegistry(ResourceNames.CORE_CLUSTER_CONNECTION + name); + registries.unRegisterClusterConnectionControl(ResourceNames.CORE_CLUSTER_CONNECTION + name); } @Override public void registerConnectionRouter(final ConnectionRouter router) throws Exception { ConnectionRouterControl connectionRouterControl = new ConnectionRouterControlImpl(router, storageManager); registerInJMX(objectNameBuilder.getConnectionRouterObjectName(router.getName()), connectionRouterControl); - registerInRegistry(ResourceNames.CONNECTION_ROUTER + router.getName(), connectionRouterControl); + registries.registerConnectionRouterControl(ResourceNames.CONNECTION_ROUTER + router.getName(), connectionRouterControl); } @Override public void unregisterConnectionRouter(final String name) throws Exception { unregisterFromJMX(objectNameBuilder.getConnectionRouterObjectName(name)); - unregisterFromRegistry(ResourceNames.CONNECTION_ROUTER + name); + registries.unRegisterConnectionRouterControl(ResourceNames.CONNECTION_ROUTER + name); } @Override public void registerHawtioSecurity(GuardInvocationHandler guard) throws Exception { HawtioSecurityControl control = new HawtioSecurityControlImpl(guard, storageManager); registerInJMX(objectNameBuilder.getSecurityObjectName(), control); - registerInRegistry(ResourceNames.MANAGEMENT_SECURITY, control); + registries.registerHawtioSecurityControl(ResourceNames.MANAGEMENT_SECURITY, control); } @Override public void unregisterHawtioSecurity() throws Exception { unregisterFromJMX(objectNameBuilder.getSecurityObjectName()); - unregisterFromRegistry(ResourceNames.MANAGEMENT_SECURITY); + registries.unRegisterHawtioSecurityControl(ResourceNames.MANAGEMENT_SECURITY); } @Override @@ -607,20 +634,36 @@ protected CheckType permissionForInvoke(String method) { return CheckType.EDIT; } + // This is only used by tests and left to avoid massive refactoring @Override public Object getResource(final String resourceName) { - return registry.get(resourceName); + Object resource = registries.get(resourceName); + if (resource == null) { + return registries.legacyGetResource(resourceName); + } + return resource; } @Override public Object[] getResources(final Class resourceType) { - List resources = new ArrayList<>(); + /*List resources = new ArrayList<>(); for (Object entry : new ArrayList<>(registry.values())) { if (resourceType.isAssignableFrom(entry.getClass())) { resources.add(entry); } } - return resources.toArray(new Object[resources.size()]); + return resources.toArray(new Object[resources.size()]);*/ + return null; + } + + @Override + public List getDivertControls() { + return registries.getDivertControls(); + } + + @Override + public List getBridgeControls() { + return registries.getBridgeControls(); } @Override @@ -655,24 +698,14 @@ public void unregisterFromJMX(final ObjectName objectName) throws MBeanRegistrat logger.debug("Unregistered from JMX: {}", objectName); } - @Override - public void registerInRegistry(final String resourceName, final Object managedResource) { - Object replaced = registry.put(resourceName, managedResource); - String addendum = ""; - if (replaced != null) { - addendum = ". Replaced: " + replaced; - } - logger.debug("Registered in management: {} as {}{}", resourceName, managedResource, addendum); - } - @Override public void unregisterFromRegistry(final String resourceName) { - Object removed = registry.remove(resourceName); + /*Object removed = registry.remove(resourceName); if (removed != null) { logger.debug("Unregistered from management: {} as {}", resourceName, removed); } else { logger.debug("Attempted to unregister {} from management, but it was not registered."); - } + }*/ } @Override @@ -734,10 +767,9 @@ public synchronized void stop() throws Exception { started = false; - Set resourceNames = new HashSet<>(registry.keySet()); + Set resourceNames = registries.unRegisterAll();//new HashSet<>(registry.keySet()); for (String resourceName : resourceNames) { - unregisterFromRegistry(resourceName); unregisterMeters(resourceName); } @@ -775,7 +807,7 @@ public synchronized void stop() throws Exception { listeners.clear(); - registry.clear(); + registries.clear(); messagingServer = null; @@ -863,7 +895,10 @@ public void enableNotifications(final boolean enabled) { @Override public Object getAttribute(final String resourceName, final String attribute, SecurityAuth auth) { try { - Object resource = registry.get(resourceName); + Object resource = registries.get(resourceName); + if (resource == null) { + resource = registries.legacyGetResource(resourceName); + } if (resource == null) { throw ActiveMQMessageBundle.BUNDLE.cannotFindResource(resourceName); @@ -897,7 +932,10 @@ public Object invokeOperation(final String resourceName, final String operation, final Object[] params, SecurityAuth auth) throws Exception { - Object resource = registry.get(resourceName); + Object resource = registries.get(resourceName); + if (resource == null) { + resource = registries.legacyGetResource(resourceName); + } if (resource == null) { throw ActiveMQMessageBundle.BUNDLE.cannotFindResource(resourceName); diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/management/impl/view/predicate/PredicateTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/management/impl/view/predicate/PredicateTest.java index bc2c5181f92..e7f7726e711 100644 --- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/management/impl/view/predicate/PredicateTest.java +++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/management/impl/view/predicate/PredicateTest.java @@ -33,74 +33,62 @@ public class PredicateTest { @Test public void testBasePredicateEquals() { String string = RandomUtil.randomUUIDString(); - ActiveMQFilterPredicate predicate = new ActiveMQFilterPredicate<>(); - predicate.setOperation(EQUALS.name()); - predicate.setValue(string); + PredicateFilterPart predicate = new PredicateFilterPart<>(EQUALS.name(), string); assertTrue(predicate.matches(string)); assertFalse(predicate.matches(RandomUtil.randomUUIDString())); - assertFalse(predicate.matches(0L)); - assertFalse(predicate.matches(0f)); - assertFalse(predicate.matches(0)); + assertFalse(predicate.matchesLong(0L)); + assertFalse(predicate.matchesFloat(0f)); + assertFalse(predicate.matchesInt(0)); } @Test public void testBasePredicateNotEquals() { String string = RandomUtil.randomUUIDString(); - ActiveMQFilterPredicate predicate = new ActiveMQFilterPredicate<>(); - predicate.setOperation(NOT_EQUALS.name()); - predicate.setValue(string); + PredicateFilterPart predicate = new PredicateFilterPart<>(NOT_EQUALS.name(), string); assertFalse(predicate.matches(string)); assertTrue(predicate.matches(RandomUtil.randomUUIDString())); - assertTrue(predicate.matches(0L)); - assertTrue(predicate.matches(0f)); - assertTrue(predicate.matches(0)); + assertTrue(predicate.matchesLong(0L)); + assertTrue(predicate.matchesFloat(0f)); + assertTrue(predicate.matchesInt(0)); } @Test public void testBasePredicateContains() { - ActiveMQFilterPredicate predicate = new ActiveMQFilterPredicate<>(); - predicate.setOperation(CONTAINS.name()); - predicate.setValue("12"); + PredicateFilterPart predicate = new PredicateFilterPart<>(CONTAINS.name(), "12"); assertTrue(predicate.matches("0123")); assertFalse(predicate.matches("43")); - assertFalse(predicate.matches(0L)); - assertFalse(predicate.matches(0f)); - assertFalse(predicate.matches(0)); + assertFalse(predicate.matchesLong(0L)); + assertFalse(predicate.matchesFloat(0f)); + assertFalse(predicate.matchesInt(0)); } @Test public void testBasePredicateNotContains() { - ActiveMQFilterPredicate predicate = new ActiveMQFilterPredicate<>(); - predicate.setOperation(NOT_CONTAINS.name()); - predicate.setValue("12"); + PredicateFilterPart predicate = new PredicateFilterPart<>(NOT_CONTAINS.name(), "12"); assertFalse(predicate.matches("0123")); assertTrue(predicate.matches("42")); - assertTrue(predicate.matches(0L)); - assertTrue(predicate.matches(0f)); - assertTrue(predicate.matches(0)); + assertTrue(predicate.matchesLong(0L)); + assertTrue(predicate.matchesFloat(0f)); + assertTrue(predicate.matchesInt(0)); } @Test public void testBasePredicateLessThan() { - ActiveMQFilterPredicate predicate = new ActiveMQFilterPredicate<>(); - predicate.setOperation(LESS_THAN.name()); - predicate.setValue("12"); + PredicateFilterPart predicate = new PredicateFilterPart<>(LESS_THAN.name(), "12"); assertFalse(predicate.matches("foo")); - assertFalse(predicate.matches(42)); - assertTrue(predicate.matches(0L)); - assertTrue(predicate.matches(0f)); - assertTrue(predicate.matches(0)); + assertFalse(predicate.matchesInt(42)); + assertTrue(predicate.matchesLong(0L)); + assertTrue(predicate.matchesFloat(0f)); + assertTrue(predicate.matchesInt(0)); } @Test public void testBasePredicateGreaterThan() { - ActiveMQFilterPredicate predicate = new ActiveMQFilterPredicate<>(); - predicate.setOperation(GREATER_THAN.name()); - predicate.setValue("12"); + PredicateFilterPart predicate = new PredicateFilterPart<>(GREATER_THAN.name(), "12"); assertFalse(predicate.matches("foo")); - assertTrue(predicate.matches(42)); - assertFalse(predicate.matches(0L)); - assertFalse(predicate.matches(0f)); - assertFalse(predicate.matches(0)); + assertTrue(predicate.matchesInt(42)); + assertFalse(predicate.matchesLong(0L)); + assertFalse(predicate.matchesFloat(0f)); + assertFalse(predicate.matchesInt(0)); } } diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/group/impl/ClusteredResetMockTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/group/impl/ClusteredResetMockTest.java index 42a5e17588c..dc6d3f8426c 100644 --- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/group/impl/ClusteredResetMockTest.java +++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/group/impl/ClusteredResetMockTest.java @@ -19,9 +19,11 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import java.util.function.Predicate; import javax.management.ObjectName; @@ -31,9 +33,13 @@ import org.apache.activemq.artemis.api.core.RoutingType; import org.apache.activemq.artemis.api.core.SimpleString; import org.apache.activemq.artemis.api.core.TransportConfiguration; +import org.apache.activemq.artemis.api.core.management.AcceptorControl; import org.apache.activemq.artemis.api.core.management.AddressControl; +import org.apache.activemq.artemis.api.core.management.BridgeControl; +import org.apache.activemq.artemis.api.core.management.DivertControl; import org.apache.activemq.artemis.api.core.management.ManagementHelper; import org.apache.activemq.artemis.api.core.management.ObjectNameBuilder; +import org.apache.activemq.artemis.api.core.management.QueueControl; import org.apache.activemq.artemis.core.config.ClusterConnectionConfiguration; import org.apache.activemq.artemis.core.config.Configuration; import org.apache.activemq.artemis.core.management.impl.ActiveMQServerControlImpl; @@ -228,22 +234,47 @@ public ActiveMQServerControlImpl registerServer(PostOffice postOffice, } @Override - public void unregisterServer() throws Exception { + public AddressControl getAddressControl(String resourceName) { + return null; + } + @Override + public AcceptorControl getAcceptorControl(String resourceName) { + return null; } @Override - public void registerInJMX(ObjectName objectName, Object managedResource) throws Exception { + public void registerAMQPControl(String amqpResourceName, Object control) { } @Override - public void unregisterFromJMX(ObjectName objectName) throws Exception { + public void unRegisterAMQPControl(String amqpResourceName) { + + } + + @Override + public List getDivertControls() { + return List.of(); + } + + @Override + public List getBridgeControls() { + return List.of(); + } + + @Override + public void unregisterServer() throws Exception { } @Override - public void registerInRegistry(String resourceName, Object managedResource) { + public void registerInJMX(ObjectName objectName, Object managedResource) throws Exception { + + } + + @Override + public void unregisterFromJMX(ObjectName objectName) throws Exception { } @@ -379,6 +410,16 @@ public Object invokeOperation(String resourceName, String operation, Object[] pa return null; } + @Override + public List getQueueControls(Predicate predicate) { + return List.of(); + } + + @Override + public List getAddressControls(Predicate predicate) { + return List.of(); + } + @Override public void registerBrokerConnection(BrokerConnection brokerConnection) { diff --git a/tests/artemis-test-support/src/main/java/org/apache/activemq/artemis/tests/util/ActiveMQTestBase.java b/tests/artemis-test-support/src/main/java/org/apache/activemq/artemis/tests/util/ActiveMQTestBase.java index b9fca4bf92c..ca538f4caa7 100644 --- a/tests/artemis-test-support/src/main/java/org/apache/activemq/artemis/tests/util/ActiveMQTestBase.java +++ b/tests/artemis-test-support/src/main/java/org/apache/activemq/artemis/tests/util/ActiveMQTestBase.java @@ -2479,6 +2479,65 @@ public String createJsonFilter(String fieldName, String operationName, String va return jsonFilterObject.toString(); } + public String createJsonFilter(String fieldName, String operationName, String value, boolean legacy) throws Exception { + Map filterMap = new HashMap<>(); + filterMap.put("field", fieldName); + filterMap.put("operation", operationName); + filterMap.put("value", value); + if (legacy) { + JsonObject jsonFilterObject = JsonUtil.toJsonObject(filterMap); + return jsonFilterObject.toString(); + } else { + Map[] filtersArray = new HashMap[1]; + filtersArray[0] = filterMap; + Map filtersMap = new HashMap<>(); + filtersMap.put("searchFilters", filtersArray); + JsonObject jsonFiltersObject = JsonUtil.toJsonObject(filtersMap); + return jsonFiltersObject.toString(); + } + } + + public String createJsonArrayFilter(String fieldName, String operationName, String value, String fieldName2, String operationName2, String value2) throws Exception { + Map filterMap = new HashMap<>(); + filterMap.put("field", fieldName); + filterMap.put("operation", operationName); + filterMap.put("value", value); + Map filterMap2 = new HashMap<>(); + filterMap2.put("field", fieldName2); + filterMap2.put("operation", operationName2); + filterMap2.put("value", value2); + Map[] filtersArray = new HashMap[2]; + filtersArray[0] = filterMap; + filtersArray[1] = filterMap2; + Map filtersMap = new HashMap<>(); + filtersMap.put("searchFilters", filtersArray); + JsonObject jsonFiltersObject = JsonUtil.toJsonObject(filtersMap); + return jsonFiltersObject.toString(); + } + + public String createJsonArrayFilter(String fieldName, String operationName, String value, String fieldName2, String operationName2, String value2, String fieldName3, String operationName3, String value3) throws Exception { + Map filterMap = new HashMap<>(); + filterMap.put("field", fieldName); + filterMap.put("operation", operationName); + filterMap.put("value", value); + Map filterMap2 = new HashMap<>(); + filterMap2.put("field", fieldName2); + filterMap2.put("operation", operationName2); + filterMap2.put("value", value2); + Map filterMap3 = new HashMap<>(); + filterMap3.put("field", fieldName3); + filterMap3.put("operation", operationName3); + filterMap3.put("value", value3); + Map[] filtersArray = new HashMap[3]; + filtersArray[0] = filterMap; + filtersArray[1] = filterMap2; + filtersArray[2] = filterMap3; + Map filtersMap = new HashMap<>(); + filtersMap.put("searchFilters", filtersArray); + JsonObject jsonFiltersObject = JsonUtil.toJsonObject(filtersMap); + return jsonFiltersObject.toString(); + } + protected static ReplicationEndpoint getReplicationEndpoint(ActiveMQServer server) { final Activation activation = server.getActivation(); if (activation instanceof SharedNothingBackupActivation backupActivation) { diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/connect/AMQPFederationServerToServerTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/connect/AMQPFederationServerToServerTest.java index 693799da18a..6faf80eae82 100644 --- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/connect/AMQPFederationServerToServerTest.java +++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/connect/AMQPFederationServerToServerTest.java @@ -59,7 +59,6 @@ import org.apache.activemq.artemis.core.server.ActiveMQServer; import org.apache.activemq.artemis.core.server.ComponentConfigurationRoutingType; import org.apache.activemq.artemis.core.server.impl.AddressInfo; -import org.apache.activemq.artemis.protocol.amqp.connect.federation.AMQPFederationConsumerControlType; import org.apache.activemq.artemis.protocol.amqp.proton.AmqpSupport; import org.apache.activemq.artemis.tests.integration.amqp.AmqpClientTestSupport; import org.apache.activemq.artemis.tests.util.CFUtil; @@ -1702,9 +1701,9 @@ public void testAddressFederationWithRestartReceivesMessagesSentToAddressWhileOf producerR.send(message); server.start(); - + String resourceName = "brokerconnection." + getTestName() + ".federation." + getTestName(); // check federation has reconnected - Wait.assertTrue(() -> server.getManagementService().getResources(AMQPFederationConsumerControlType.class).length == 1); + Wait.assertTrue(() -> server.getManagementService().getResource(resourceName) != null); Wait.assertTrue(() -> server.bindingQuery(SimpleString.of(getTestName()), false).getQueueNames().size() >= 1); Wait.assertTrue(() -> remoteServer.bindingQuery(SimpleString.of(getTestName()), false).getQueueNames().size() >= 1); @@ -1795,9 +1794,9 @@ public void testRemoteAddressFederationWithRestartReceivesMessagesSentToAddressW producerL.send(message); remoteServer.start(); - + String resourceName = "brokerconnection." + getTestName() + ".federation." + getTestName() + ".policy.test-policy.consumer." + getTestName(); // check federation has reconnected - Wait.assertTrue(() -> remoteServer.getManagementService().getResources(AMQPFederationConsumerControlType.class).length == 1); + Wait.assertTrue(() -> remoteServer.getManagementService().getResource(resourceName) != null); Wait.assertTrue(() -> server.bindingQuery(SimpleString.of(getTestName()), false).getQueueNames().size() >= 1); Wait.assertTrue(() -> remoteServer.bindingQuery(SimpleString.of(getTestName()), false).getQueueNames().size() >= 1); diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/bridge/BridgeTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/bridge/BridgeTest.java index 181e6809db7..acd400207aa 100644 --- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/bridge/BridgeTest.java +++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/bridge/BridgeTest.java @@ -58,7 +58,6 @@ import org.apache.activemq.artemis.api.core.client.ClientSession; import org.apache.activemq.artemis.api.core.client.ClientSessionFactory; import org.apache.activemq.artemis.api.core.client.ServerLocator; -import org.apache.activemq.artemis.api.core.management.BridgeControl; import org.apache.activemq.artemis.core.client.impl.ServerLocatorImpl; import org.apache.activemq.artemis.core.config.BridgeConfiguration; import org.apache.activemq.artemis.core.config.Configuration; @@ -2148,10 +2147,10 @@ public void testManagementLeak() throws Exception { .setStaticConnectors(connectors) .setConcurrency(concurrency); server.deployBridge(config); - assertEquals(concurrency, server.getManagementService().getResources(BridgeControl.class).length); + assertEquals(concurrency, server.getManagementService().getBridgeControls().size()); server.destroyBridge(config.getName()); - assertEquals(0, server.getManagementService().getResources(BridgeControl.class).length); + assertEquals(0, server.getManagementService().getBridgeControls().size()); } @TestTemplate 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 439fd45e5a9..df25ddeceee 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 @@ -3644,8 +3644,17 @@ public void testListAllSessionsAsJSONWithJMS() throws Exception { assertNotNull(obj.getJsonObject("metadata").getJsonString(ClientSession.JMS_SESSION_IDENTIFIER_PROPERTY)); } + @TestTemplate + public void testListQueuesLegacyFilter() throws Exception { + testListQueues(true); + } + @TestTemplate public void testListQueues() throws Exception { + testListQueues(false); + } + + public void testListQueues(boolean legacyFilter) throws Exception { SimpleString queueName1 = SimpleString.of("my_queue_one"); SimpleString queueName2 = SimpleString.of("my_queue_two"); SimpleString queueName3 = SimpleString.of("other_queue_three"); @@ -3674,7 +3683,7 @@ public void testListQueues() throws Exception { } //test with filter that matches 2 queues - String filterString = createJsonFilter("name", "CONTAINS", "my_queue"); + String filterString = createJsonFilter("name", "CONTAINS", "my_queue", legacyFilter); String queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); @@ -3686,7 +3695,7 @@ public void testListQueues() throws Exception { assertTrue(array.getJsonObject(1).getString("name").contains("my_queue")); //test with an empty filter - filterString = createJsonFilter("internalQueue", "NOT_CONTAINS", "true"); + filterString = createJsonFilter("internalQueue", "NOT_CONTAINS", "true", legacyFilter); queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); @@ -3731,8 +3740,16 @@ public void testListQueues() throws Exception { assertEquals("false", array.getJsonObject(0).getString("autoDelete"), "autoDelete"); } + @TestTemplate + public void testListQueuesOrderLegacyFilter() throws Exception { + testListQueuesOrder(true); + } + @TestTemplate public void testListQueuesOrder() throws Exception { + testListQueuesOrder(true); + } + public void testListQueuesOrder(boolean legacyFilter) throws Exception { SimpleString queueName1 = SimpleString.of("my_queue_1"); SimpleString queueName2 = SimpleString.of("my_queue_2"); SimpleString queueName3 = SimpleString.of("my_queue_3"); @@ -3764,7 +3781,7 @@ public void testListQueuesOrder() throws Exception { } //test default order - String filterString = createJsonFilter("name", "CONTAINS", "my_queue"); + String filterString = createJsonFilter("name", "CONTAINS", "my_queue", legacyFilter); String queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); JsonObject queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); JsonArray array = (JsonArray) queuesAsJsonObject.get("data"); @@ -3775,7 +3792,7 @@ public void testListQueuesOrder() throws Exception { assertEquals(queueName3.toString(), array.getJsonObject(2).getString("name"), "queue3 default Order"); //test ordered by id desc - filterString = createJsonFilter("name", "CONTAINS", "my_queue", "id", "desc"); + filterString = createJsonFilter("name", "CONTAINS", "my_queue", "id", "desc", legacyFilter); queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); array = (JsonArray) queuesAsJsonObject.get("data"); @@ -3786,7 +3803,7 @@ public void testListQueuesOrder() throws Exception { assertEquals(queueName1.toString(), array.getJsonObject(2).getString("name"), "queue1 ordered by id"); //ordered by address desc - filterString = createJsonFilter("name", "CONTAINS", "my_queue", "address", "desc"); + filterString = createJsonFilter("name", "CONTAINS", "my_queue", "address", "desc", legacyFilter); queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); array = (JsonArray) queuesAsJsonObject.get("data"); @@ -3797,7 +3814,7 @@ public void testListQueuesOrder() throws Exception { assertEquals(queueName1.toString(), array.getJsonObject(2).getString("name"), "queue1 ordered by address"); //ordered by auto create desc - filterString = createJsonFilter("name", "CONTAINS", "my_queue", "autoCreated", "asc"); + filterString = createJsonFilter("name", "CONTAINS", "my_queue", "autoCreated", "asc", legacyFilter); queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); array = (JsonArray) queuesAsJsonObject.get("data"); @@ -3808,7 +3825,7 @@ public void testListQueuesOrder() throws Exception { assertEquals("true", array.getJsonObject(2).getString("autoCreated"), "pos3 ordered by autocreate"); //ordered by filter desc - filterString = createJsonFilter("name", "CONTAINS", "my_queue", "filter", "desc"); + filterString = createJsonFilter("name", "CONTAINS", "my_queue", "filter", "desc", legacyFilter); queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); array = (JsonArray) queuesAsJsonObject.get("data"); @@ -3819,7 +3836,7 @@ public void testListQueuesOrder() throws Exception { assertEquals(queueName3.toString(), array.getJsonObject(2).getString("name"), "queue3 ordered by filter"); //ordered by max consumers asc - filterString = createJsonFilter("name", "CONTAINS", "my_queue", "maxConsumers", "asc"); + filterString = createJsonFilter("name", "CONTAINS", "my_queue", "maxConsumers", "asc", legacyFilter); queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); array = (JsonArray) queuesAsJsonObject.get("data"); @@ -3831,7 +3848,7 @@ public void testListQueuesOrder() throws Exception { //ordering between the pages //page 1 - filterString = createJsonFilter("name", "CONTAINS", "my_queue", "address", "desc"); + filterString = createJsonFilter("name", "CONTAINS", "my_queue", "address", "desc", legacyFilter); queuesAsJsonString = serverControl.listQueues(filterString, 1, 1); queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); array = (JsonArray) queuesAsJsonObject.get("data"); @@ -3839,7 +3856,7 @@ public void testListQueuesOrder() throws Exception { assertEquals(queueName3.toString(), array.getJsonObject(0).getString("name"), "queue3 ordered by page"); //page 2 - filterString = createJsonFilter("name", "CONTAINS", "my_queue", "address", "desc"); + filterString = createJsonFilter("name", "CONTAINS", "my_queue", "address", "desc", legacyFilter); queuesAsJsonString = serverControl.listQueues(filterString, 2, 1); queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); array = (JsonArray) queuesAsJsonObject.get("data"); @@ -3847,7 +3864,7 @@ public void testListQueuesOrder() throws Exception { assertEquals(queueName2.toString(), array.getJsonObject(0).getString("name"), "queue2 ordered by page"); //page 3 - filterString = createJsonFilter("name", "CONTAINS", "my_queue", "address", "desc"); + filterString = createJsonFilter("name", "CONTAINS", "my_queue", "address", "desc", legacyFilter); queuesAsJsonString = serverControl.listQueues(filterString, 3, 1); queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); array = (JsonArray) queuesAsJsonObject.get("data"); @@ -3856,8 +3873,17 @@ public void testListQueuesOrder() throws Exception { } + @TestTemplate + public void testListQueuesNumericFilterLegacyFilter() throws Exception { + testListQueuesNumericFilter(true); + } + @TestTemplate public void testListQueuesNumericFilter() throws Exception { + testListQueuesNumericFilter(false); + } + + public void testListQueuesNumericFilter(boolean legacyFilter) throws Exception { SimpleString queueName1 = SimpleString.of("my_queue_one"); SimpleString queueName2 = SimpleString.of("my_queue_two"); SimpleString queueName3 = SimpleString.of("one_consumer_queue_three"); @@ -3921,7 +3947,7 @@ public void testListQueuesNumericFilter() throws Exception { session.commit(); //test with CONTAINS returns nothing for numeric field - String filterString = createJsonFilter("CONSUMER_COUNT", "CONTAINS", "0"); + String filterString = createJsonFilter("CONSUMER_COUNT", "CONTAINS", "0", legacyFilter); String queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); JsonObject queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); @@ -3929,7 +3955,7 @@ public void testListQueuesNumericFilter() throws Exception { assertEquals(0, array.size(), "number of queues returned from query"); //test with LESS_THAN returns 1 queue - filterString = createJsonFilter("CONSUMER_COUNT", "LESS_THAN", "1"); + filterString = createJsonFilter("CONSUMER_COUNT", "LESS_THAN", "1", legacyFilter); queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); @@ -3938,7 +3964,7 @@ public void testListQueuesNumericFilter() throws Exception { assertEquals(queueName4.toString(), array.getJsonObject(1).getString("name"), "correct queue returned from query"); //test with GREATER_THAN returns 2 queue - filterString = createJsonFilter("CONSUMER_COUNT", "GREATER_THAN", "2"); + filterString = createJsonFilter("CONSUMER_COUNT", "GREATER_THAN", "2", legacyFilter); queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); @@ -3947,7 +3973,7 @@ public void testListQueuesNumericFilter() throws Exception { assertEquals(queueName2.toString(), array.getJsonObject(0).getString("name"), "correct queue returned from query"); //test with GREATER_THAN returns 2 queue - filterString = createJsonFilter("CONSUMER_COUNT", "EQUALS", "3"); + filterString = createJsonFilter("CONSUMER_COUNT", "EQUALS", "3", legacyFilter); queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); @@ -3956,7 +3982,7 @@ public void testListQueuesNumericFilter() throws Exception { assertEquals(queueName2.toString(), array.getJsonObject(0).getString("name"), "correct queue returned from query"); //test with MESSAGE_COUNT returns 2 queue - filterString = createJsonFilter("MESSAGE_COUNT", "GREATER_THAN", "5"); + filterString = createJsonFilter("MESSAGE_COUNT", "GREATER_THAN", "5", legacyFilter); queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); @@ -3965,7 +3991,7 @@ public void testListQueuesNumericFilter() throws Exception { assertEquals(queueName1.toString(), array.getJsonObject(0).getString("name"), "correct queue returned from query"); //test with MESSAGE_ADDED returns 1 queue - filterString = createJsonFilter("MESSAGES_ADDED", "GREATER_THAN", "5"); + filterString = createJsonFilter("MESSAGES_ADDED", "GREATER_THAN", "5", legacyFilter); queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); @@ -3974,7 +4000,7 @@ public void testListQueuesNumericFilter() throws Exception { assertEquals(queueName1.toString(), array.getJsonObject(0).getString("name"), "correct queue returned from query"); //test with DELIVERING_COUNT returns 1 queue - filterString = createJsonFilter("DELIVERING_COUNT", "GREATER_THAN", "5"); + filterString = createJsonFilter("DELIVERING_COUNT", "GREATER_THAN", "5", legacyFilter); queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); @@ -3983,7 +4009,7 @@ public void testListQueuesNumericFilter() throws Exception { assertEquals(queueName1.toString(), array.getJsonObject(0).getString("name"), "correct queue returned from query"); //test with MESSAGE_ACKED returns 1 queue - filterString = createJsonFilter("MESSAGES_ACKED", "GREATER_THAN", "0"); + filterString = createJsonFilter("MESSAGES_ACKED", "GREATER_THAN", "0", legacyFilter); queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); @@ -3992,7 +4018,7 @@ public void testListQueuesNumericFilter() throws Exception { assertEquals(queueName1.toString(), array.getJsonObject(0).getString("name"), "correct queue returned from query"); //test with MAX_CONSUMERS returns 1 queue - filterString = createJsonFilter("MAX_CONSUMERS", "GREATER_THAN", "9"); + filterString = createJsonFilter("MAX_CONSUMERS", "GREATER_THAN", "9", legacyFilter); queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); @@ -4001,7 +4027,7 @@ public void testListQueuesNumericFilter() throws Exception { assertEquals(queueName3.toString(), array.getJsonObject(0).getString("name"), "correct queue returned from query"); //test with MESSAGES_KILLED returns 0 queue - filterString = createJsonFilter("MESSAGES_KILLED", "GREATER_THAN", "0"); + filterString = createJsonFilter("MESSAGES_KILLED", "GREATER_THAN", "0", legacyFilter); queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); @@ -4012,8 +4038,17 @@ public void testListQueuesNumericFilter() throws Exception { } + @TestTemplate + public void testListQueuesNumericFilterInvalidLegacyFilter() throws Exception { + testListQueuesNumericFilterInvalid(true); + } + @TestTemplate public void testListQueuesNumericFilterInvalid() throws Exception { + testListQueuesNumericFilterInvalid(false); + } + + public void testListQueuesNumericFilterInvalid(boolean legacyFilter) throws Exception { SimpleString queueName1 = SimpleString.of("my_queue_one"); SimpleString queueName2 = SimpleString.of("one_consumer_queue_two"); SimpleString queueName3 = SimpleString.of("one_consumer_queue_three"); @@ -4059,7 +4094,7 @@ public void testListQueuesNumericFilterInvalid() throws Exception { ClientConsumer consumer2_q1 = session.createConsumer(queueName1); //test with CONTAINS returns nothing for numeric field - String filterString = createJsonFilter("CONSUMER_COUNT", "CONTAINS", "NOT_NUMBER"); + String filterString = createJsonFilter("CONSUMER_COUNT", "CONTAINS", "NOT_NUMBER", legacyFilter); String queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); JsonObject queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); @@ -4067,7 +4102,7 @@ public void testListQueuesNumericFilterInvalid() throws Exception { assertEquals(0, array.size(), "number of queues returned from query"); //test with LESS_THAN and not a number - filterString = createJsonFilter("CONSUMER_COUNT", "LESS_THAN", "NOT_NUMBER"); + filterString = createJsonFilter("CONSUMER_COUNT", "LESS_THAN", "NOT_NUMBER", legacyFilter); queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); @@ -4075,7 +4110,7 @@ public void testListQueuesNumericFilterInvalid() throws Exception { assertEquals(0, array.size(), "number of queues returned from LESS_THAN query"); //test with GREATER_THAN and not a number - filterString = createJsonFilter("CONSUMER_COUNT", "GREATER_THAN", "NOT_NUMBER"); + filterString = createJsonFilter("CONSUMER_COUNT", "GREATER_THAN", "NOT_NUMBER", legacyFilter); queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); @@ -4083,7 +4118,7 @@ public void testListQueuesNumericFilterInvalid() throws Exception { assertEquals(0, array.size(), "number of queues returned from GREATER_THAN query"); //test with EQUALS and not number - filterString = createJsonFilter("CONSUMER_COUNT", "EQUALS", "NOT_NUMBER"); + filterString = createJsonFilter("CONSUMER_COUNT", "EQUALS", "NOT_NUMBER", legacyFilter); queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); @@ -4091,7 +4126,7 @@ public void testListQueuesNumericFilterInvalid() throws Exception { assertEquals(0, array.size(), "number of queues returned from EQUALS query"); //test with LESS_THAN on string value returns no queue - filterString = createJsonFilter("name", "LESS_THAN", "my_queue"); + filterString = createJsonFilter("name", "LESS_THAN", "my_queue", legacyFilter); queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); @@ -4099,7 +4134,7 @@ public void testListQueuesNumericFilterInvalid() throws Exception { assertEquals(0, array.size(), "number of queues returned from LESS_THAN on non numeric field"); //test with GREATER_THAN on string value returns no queue - filterString = createJsonFilter("name", "GREATER_THAN", "my_queue"); + filterString = createJsonFilter("name", "GREATER_THAN", "my_queue", legacyFilter); queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); @@ -4107,7 +4142,7 @@ public void testListQueuesNumericFilterInvalid() throws Exception { assertEquals(0, array.size(), "number of queues returned from GREATER_THAN on non numeric field"); //test with GREATER_THAN and empty string - filterString = createJsonFilter("CONSUMER_COUNT", "GREATER_THAN", " "); + filterString = createJsonFilter("CONSUMER_COUNT", "GREATER_THAN", " ", legacyFilter); queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); @@ -4115,7 +4150,7 @@ public void testListQueuesNumericFilterInvalid() throws Exception { assertEquals(0, array.size(), "number of queues returned from GREATER_THAN query"); //test with CONSUMER_COUNT against a float value - filterString = createJsonFilter("CONSUMER_COUNT", "GREATER_THAN", "0.12"); + filterString = createJsonFilter("CONSUMER_COUNT", "GREATER_THAN", "0.12", legacyFilter); queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); @@ -4126,6 +4161,97 @@ public void testListQueuesNumericFilterInvalid() throws Exception { } + @TestTemplate + public void testListQueuesMultipleFilters() throws Exception { + SimpleString queueName1 = SimpleString.of("my_queue_one"); + SimpleString queueName2 = SimpleString.of("my_queue_two"); + SimpleString queueName3 = SimpleString.of("my_queue_one_two"); + + ActiveMQServerControl serverControl = createManagementControl(); + + server.addAddressInfo(new AddressInfo(queueName1, RoutingType.ANYCAST)); + if (legacyCreateQueue) { + server.createQueue(queueName1, RoutingType.ANYCAST, queueName1, null, false, false); + } else { + server.createQueue(QueueConfiguration.of(queueName1).setRoutingType(RoutingType.ANYCAST).setDurable(false)); + } + + server.addAddressInfo(new AddressInfo(queueName2, RoutingType.ANYCAST)); + if (legacyCreateQueue) { + server.createQueue(queueName2, RoutingType.ANYCAST, queueName2, null, false, false); + } else { + server.createQueue(QueueConfiguration.of(queueName2).setRoutingType(RoutingType.ANYCAST).setDurable(false)); + } + + server.addAddressInfo(new AddressInfo(queueName3, RoutingType.ANYCAST)); + if (legacyCreateQueue) { + server.createQueue(queueName3, RoutingType.ANYCAST, queueName3, null, true, false); + } else { + server.createQueue(QueueConfiguration.of(queueName3).setRoutingType(RoutingType.ANYCAST).setDurable(true)); + } + + //test with filter that matches 2 queues + String filterString = createJsonFilter("name", "CONTAINS", "my_queue"); + + String queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); + + JsonObject queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); + JsonArray array = (JsonArray) queuesAsJsonObject.get("data"); + + assertEquals(3, array.size(), "number of queues returned from query"); + assertTrue(array.getJsonObject(0).getString("name").contains("my_queue")); + assertTrue(array.getJsonObject(1).getString("name").contains("my_queue")); + assertTrue(array.getJsonObject(2).getString("name").contains("my_queue")); + + //test with an 2 filters + filterString = createJsonArrayFilter("name", "CONTAINS", "my_queue", "name", "CONTAINS", "one"); + + queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); + + queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); + array = (JsonArray) queuesAsJsonObject.get("data"); + + // at least 3 queues or more + assertEquals(2, array.size(), "number of queues returned from query"); + assertTrue(array.getJsonObject(0).getString("name").contains("my_queue")); + assertTrue(array.getJsonObject(1).getString("name").contains("my_queue")); + assertTrue(array.getJsonObject(0).getString("name").contains("one")); + assertTrue(array.getJsonObject(1).getString("name").contains("one")); + filterString = createJsonArrayFilter("name", "CONTAINS", "my_queue", "name", "CONTAINS", "one", "durable", "EQUALS", "true"); + + queuesAsJsonString = serverControl.listQueues(filterString, 1, 50); + + queuesAsJsonObject = JsonUtil.readJsonObject(queuesAsJsonString); + array = (JsonArray) queuesAsJsonObject.get("data"); + + assertEquals(1, array.size(), "number of queues returned from query"); + //check all field names are available + assertNotEquals("", array.getJsonObject(0).getString("name"), "name"); + assertNotEquals("", array.getJsonObject(0).getString("id"), "id"); + assertNotEquals("", array.getJsonObject(0).getString("address"), "address"); + assertEquals("", array.getJsonObject(0).getString("filter"), "filter"); + assertEquals("true", array.getJsonObject(0).getString("durable"), "durable"); + assertEquals("false", array.getJsonObject(0).getString("paused"), "paused"); + assertNotEquals("", array.getJsonObject(0).getString("temporary"), "temporary"); + assertEquals("false", array.getJsonObject(0).getString("purgeOnNoConsumers"), "purgeOnNoConsumers"); + assertNotEquals("", array.getJsonObject(0).getString("consumerCount"), "consumerCount"); + assertEquals("-1", array.getJsonObject(0).getString("maxConsumers"), "maxConsumers"); + assertEquals("false", array.getJsonObject(0).getString("autoCreated"), "autoCreated"); + assertNotEquals("", array.getJsonObject(0).getString("routingType"), "routingType"); + assertEquals("0", array.getJsonObject(0).getString("messagesAdded"), "messagesAdded"); + assertEquals("0", array.getJsonObject(0).getString("messageCount"), "messageCount"); + assertEquals("0", array.getJsonObject(0).getString("messagesAcked"), "messagesAcked"); + assertEquals("0", array.getJsonObject(0).getString("deliveringCount"), "deliveringCount"); + assertEquals("0", array.getJsonObject(0).getString("messagesKilled"), "messagesKilled"); + assertEquals("false", array.getJsonObject(0).getString("exclusive"), "exclusive"); + assertEquals("false", array.getJsonObject(0).getString("lastValue"), "lastValue"); + assertEquals("0", array.getJsonObject(0).getString("scheduledCount"), "scheduledCount"); + assertEquals("false", array.getJsonObject(0).getString("groupRebalance"), "groupRebalance"); + assertEquals("-1", array.getJsonObject(0).getString("groupBuckets"), "groupBuckets"); + assertEquals("", array.getJsonObject(0).getString("groupFirstKey"), "groupFirstKey"); + assertEquals("false", array.getJsonObject(0).getString("autoDelete"), "autoDelete"); + } + @TestTemplate public void testListAddresses() throws Exception { SimpleString queueName1 = SimpleString.of("my_queue_one"); @@ -6464,6 +6590,30 @@ private String createJsonFilter(String fieldName, String operationName, String v return jsonFilterObject.toString(); } + + + + public String createJsonFilter(String fieldName, String operationName, String value, String sortField, String sortOrder, boolean legacyFilter) throws Exception { + Map filterMap = new HashMap<>(); + filterMap.put("field", fieldName); + filterMap.put("operation", operationName); + filterMap.put("value", value); + filterMap.put("sortField", sortField); + filterMap.put("sortOrder", sortOrder); + if (legacyFilter) { + JsonObject jsonFilterObject = JsonUtil.toJsonObject(filterMap); + return jsonFilterObject.toString(); + } else { + Map[] filtersArray = new HashMap[1]; + filtersArray[0] = filterMap; + Map filtersMap = new HashMap<>(); + filtersMap.put("searchFilters", filtersArray); + JsonObject jsonFiltersObject = JsonUtil.toJsonObject(filtersMap); + return jsonFiltersObject.toString(); + } + } + + private void sendMessagesWithPredefinedSize(int numberOfMessages, ClientSession session, ClientProducer producer, diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ManagementServiceImplTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ManagementServiceImplTest.java index 10583ed8c8f..c26abe83a73 100644 --- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ManagementServiceImplTest.java +++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ManagementServiceImplTest.java @@ -46,6 +46,8 @@ import org.apache.activemq.artemis.utils.UUIDGenerator; import org.junit.jupiter.api.Test; +import java.util.List; + public class ManagementServiceImplTest extends ActiveMQTestBase { @Test @@ -148,16 +150,16 @@ public void testGetResources() throws Exception { Queue queue = new FakeQueue(RandomUtil.randomUUIDSimpleString()); managementService.registerQueue(queue, RandomUtil.randomUUIDSimpleString(), new FakeStorageManager()); - Object[] addresses = managementService.getResources(AddressControl.class); - assertEquals(1, addresses.length); - assertInstanceOf(AddressControl.class, addresses[0]); - AddressControl addressControl = (AddressControl) addresses[0]; + List addresses = managementService.getAddressControls(null); + assertEquals(1, addresses.size()); + assertInstanceOf(AddressControl.class, addresses.get(0)); + AddressControl addressControl = (AddressControl) addresses.get(0); assertEquals(address.toString(), addressControl.getAddress()); - Object[] queues = managementService.getResources(QueueControl.class); - assertEquals(1, queues.length); - assertInstanceOf(QueueControl.class, queues[0]); - QueueControl queueControl = (QueueControl) queues[0]; + List queues = managementService.getQueueControls(null); + assertEquals(1, queues.size()); + assertInstanceOf(QueueControl.class, queues.get(0)); + QueueControl queueControl = (QueueControl) queues.get(0); assertEquals(queue.getName().toString(), queueControl.getName()); } diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/openwire/AdvisoryOpenWireTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/openwire/AdvisoryOpenWireTest.java index f378cfa1edd..3f52e5c8343 100644 --- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/openwire/AdvisoryOpenWireTest.java +++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/openwire/AdvisoryOpenWireTest.java @@ -30,6 +30,7 @@ import javax.jms.Session; import javax.jms.TemporaryQueue; import javax.jms.TemporaryTopic; +import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -78,11 +79,11 @@ public void testTempTopicLeak() throws Exception { private AddressControl assertNonNullAddressControl(String match) { AddressControl advisoryAddressControl = null; - Object[] addressResources = server.getManagementService().getResources(AddressControl.class); + List addressResources = server.getManagementService().getAddressControls(null); - for (Object addressResource : addressResources) { - if (((AddressControl) addressResource).getAddress().equals(match)) { - advisoryAddressControl = (AddressControl) addressResource; + for (AddressControl addressResource : addressResources) { + if (addressResource.getAddress().equals(match)) { + advisoryAddressControl = addressResource; } } assertNotNull(advisoryAddressControl, "addressControl for temp advisory");