This is an automated email from the ASF dual-hosted git repository. tabish pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/artemis.git
commit d45558bb8cde2d1ae7a3f21237a5ba9b6cb5c401 Author: Andy Taylor <[email protected]> AuthorDate: Fri Feb 6 15:20:25 2026 -0600 ARTEMIS-5782 allow searching on multiple attributes --- .../management/impl/view/ActiveMQAbstractView.java | 53 +++++- .../core/management/impl/view/AddressView.java | 5 +- .../core/management/impl/view/ConnectionView.java | 3 +- .../core/management/impl/view/ConsumerView.java | 3 +- .../core/management/impl/view/ProducerView.java | 3 +- .../core/management/impl/view/QueueView.java | 3 +- .../core/management/impl/view/SessionView.java | 3 +- .../view/predicate/ActiveMQFilterPredicate.java | 164 ++--------------- .../view/predicate/AddressFilterPredicate.java | 58 +----- .../view/predicate/AddressPredicateFilterPart.java | 69 +++++++ .../view/predicate/ConnectionFilterPredicate.java | 55 +----- ...ate.java => ConnectionPredicateFilterPart.java} | 48 +++-- .../view/predicate/ConsumerFilterPredicate.java | 48 +---- ...icate.java => ConsumerPredicateFilterPart.java} | 63 +++---- ...lterPredicate.java => PredicateFilterPart.java} | 114 +++++------- .../view/predicate/ProducerFilterPredicate.java | 39 +--- ...icate.java => ProducerPredicateFilterPart.java} | 49 ++--- .../impl/view/predicate/QueueFilterPredicate.java | 59 +----- .../view/predicate/QueuePredicateFilterPart.java | 80 ++++++++ .../view/predicate/SessionFilterPredicate.java | 33 +--- ...dicate.java => SessionPredicateFilterPart.java} | 35 ++-- .../impl/view/predicate/PredicateTest.java | 64 +++---- .../artemis/tests/util/ActiveMQTestBase.java | 59 ++++++ .../management/ActiveMQServerControlTest.java | 205 ++++++++++++++++++--- 24 files changed, 648 insertions(+), 667 deletions(-) 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 3aa2bf09a7..00c5526713 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 java.util.stream.Collectors; 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<T> { +public abstract class ActiveMQAbstractView<T, V extends PredicateFilterPart<T>> { // 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<T> { protected Collection<T> collection; - protected ActiveMQFilterPredicate<T> predicate; + protected ActiveMQFilterPredicate<T, V> predicate; protected String sortField; @@ -73,6 +79,11 @@ public abstract class ActiveMQAbstractView<T> { this.collection = collection; } + public List<T> filter() { + List<T> 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 abstract class ActiveMQAbstractView<T> { 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<T> getPagedResult(int page, int pageSize) { List<T> builder = new ArrayList<>(); final int start; @@ -144,9 +170,7 @@ public abstract class ActiveMQAbstractView<T> { 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 abstract class ActiveMQAbstractView<T> { } } + private List<V> createFilterPredicates(JsonObject json) { + ArrayList<V> 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 34635dfe6f..f6f6cd8d57 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<AddressControl> { +public class AddressView extends ActiveMQAbstractView<AddressControl, AddressPredicateFilterPart> { private static final String defaultSortField = AddressField.ID.getName(); @@ -31,7 +32,7 @@ public class AddressView extends ActiveMQAbstractView<AddressControl> { 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 3a1fc01200..f16508bf1c 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.Objects; 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.spi.core.protocol.RemotingConnection; import org.apache.activemq.artemis.utils.JsonLoader; import org.apache.activemq.artemis.utils.StringUtil; -public class ConnectionView extends ActiveMQAbstractView<RemotingConnection> { +public class ConnectionView extends ActiveMQAbstractView<RemotingConnection, ConnectionPredicateFilterPart> { 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 a64f30aac9..3f21b5e087 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 @@ package org.apache.activemq.artemis.core.management.impl.view; 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.core.server.ServerSession; import org.apache.activemq.artemis.json.JsonObjectBuilder; import org.apache.activemq.artemis.utils.JsonLoader; -public class ConsumerView extends ActiveMQAbstractView<ServerConsumer> { +public class ConsumerView extends ActiveMQAbstractView<ServerConsumer, ConsumerPredicateFilterPart> { 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 b08e6076f8..71df507b32 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 @@ package org.apache.activemq.artemis.core.management.impl.view; 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.core.server.ServerSession; import org.apache.activemq.artemis.json.JsonObjectBuilder; import org.apache.activemq.artemis.utils.JsonLoader; -public class ProducerView extends ActiveMQAbstractView<ServerProducer> { +public class ProducerView extends ActiveMQAbstractView<ServerProducer, ProducerPredicateFilterPart> { 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 80e20014f5..e3d74f4e28 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.ActiveMQServer; import org.apache.activemq.artemis.core.server.Queue; import org.apache.activemq.artemis.utils.JsonLoader; -public class QueueView extends ActiveMQAbstractView<QueueControl> { +public class QueueView extends ActiveMQAbstractView<QueueControl, QueuePredicateFilterPart> { 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 c9c5369fcd..60205cbb74 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.management.impl.view.predicate.SessionFi import org.apache.activemq.artemis.core.server.ServerSession; import org.apache.activemq.artemis.utils.JsonLoader; -public class SessionView extends ActiveMQAbstractView<ServerSession> { +public class SessionView extends ActiveMQAbstractView<ServerSession, SessionPredicateFilterPart> { 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 c9a680bbd9..a4b91cce65 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<T> implements Predicate<T> { +public abstract class ActiveMQFilterPredicate<T, V extends PredicateFilterPart<T>> implements Predicate<T> { 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<V> 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<V> 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 af0077a009..c0cccdc787 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<AddressControl> { - - private AddressField f; - private final ActiveMQServer server; - - public AddressFilterPredicate(ActiveMQServer server) { +public class AddressFilterPredicate extends ActiveMQFilterPredicate<AddressControl, AddressPredicateFilterPart> { + 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 0000000000..2898e06d7e --- /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<AddressControl> { + 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 b997353d07..9b6c486f1c 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<RemotingConnection> { - - private ConnectionField f; +public class ConnectionFilterPredicate extends ActiveMQFilterPredicate<RemotingConnection, ConnectionPredicateFilterPart> { private ActiveMQServer server; @@ -39,46 +28,12 @@ public class ConnectionFilterPredicate extends ActiveMQFilterPredicate<RemotingC } @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<String> collectFromSessions(String connectionId, Function<ServerSession, String> getter) { - List<ServerSession> sessions = server.getSessions(connectionId); - Set<String> 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/ConnectionFilterPredicate.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConnectionPredicateFilterPart.java similarity index 84% copy from artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConnectionFilterPredicate.java copy to artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConnectionPredicateFilterPart.java index b997353d07..47a352258e 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/ConnectionPredicateFilterPart.java @@ -16,43 +16,48 @@ */ 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<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<RemotingConnection> { + private final ActiveMQServer server; private ConnectionField f; - private ActiveMQServer server; - - public ConnectionFilterPredicate(ActiveMQServer server) { + 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 test(RemotingConnection connection) { - // Using switch over enum vs string comparison is better for perf. - if (f == null) - return true; + 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 -> matches(server.getSessions(connection.getID().toString()).size()); + 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 -> matches(connection.getCreationTime()); + 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())); @@ -70,15 +75,4 @@ public class ConnectionFilterPredicate extends ActiveMQFilterPredicate<RemotingC return sessionAttributes; } - @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); - } - } - } } 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 50f4f573cc..216e2075ea 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<ServerConsumer> { - - private ConsumerField f; +public class ConsumerFilterPredicate extends ActiveMQFilterPredicate<ServerConsumer, ConsumerPredicateFilterPart> { private final ActiveMQServer server; @@ -32,47 +29,12 @@ public class ConsumerFilterPredicate extends ActiveMQFilterPredicate<ServerConsu } @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.getMessagesDelivered()); - case MESSAGES_DELIVERED_SIZE -> matches(consumer.getMessagesDeliveredSize()); - case MESSAGES_ACKNOWLEDGED -> matches(consumer.getMessagesAcknowledged()); - case MESSAGES_ACKNOWLEDGED_AWAITING_COMMIT -> matches(consumer.getMessagesAcknowledgedAwaitingCommit()); - case LAST_ACKNOWLEDGED_TIME -> matches(consumer.getLastAcknowledgedTime()); - case LAST_DELIVERED_TIME -> matches(consumer.getLastDeliveredTime()); - 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/ConsumerFilterPredicate.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConsumerPredicateFilterPart.java similarity index 54% copy from artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConsumerFilterPredicate.java copy to artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ConsumerPredicateFilterPart.java index 50f4f573cc..4f81baa4f6 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/ConsumerPredicateFilterPart.java @@ -20,59 +20,48 @@ 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<ServerConsumer> { - - private ConsumerField f; +public class ConsumerPredicateFilterPart extends PredicateFilterPart<ServerConsumer> { private final ActiveMQServer server; - public ConsumerFilterPredicate(ActiveMQServer server) { - super(); + 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 test(ServerConsumer consumer) { - // Using switch over enum vs string comparison is better for perf. - if (f == null) - return true; + public boolean filterPart(ServerConsumer consumer) throws Exception { return switch (f) { - case ID -> matches(consumer.getSequentialID()); + 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 -> matches(consumer.getMessagesInTransit()); - case MESSAGES_IN_TRANSIT_SIZE -> matches(consumer.getMessagesInTransitSize()); + 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.getMessagesDelivered()); - case MESSAGES_DELIVERED_SIZE -> matches(consumer.getMessagesDeliveredSize()); - case MESSAGES_ACKNOWLEDGED -> matches(consumer.getMessagesAcknowledged()); - case MESSAGES_ACKNOWLEDGED_AWAITING_COMMIT -> matches(consumer.getMessagesAcknowledgedAwaitingCommit()); - case LAST_ACKNOWLEDGED_TIME -> matches(consumer.getLastAcknowledgedTime()); - case LAST_DELIVERED_TIME -> matches(consumer.getLastDeliveredTime()); + case MESSAGES_DELIVERED_SIZE -> matchesLong(consumer.getMessagesDeliveredSize()); + case MESSAGES_ACKNOWLEDGED -> matchesLong(consumer.getMessagesAcknowledged()); + case MESSAGES_ACKNOWLEDGED_AWAITING_COMMIT -> matchesLong(consumer.getMessagesAcknowledgedAwaitingCommit()); + case LAST_ACKNOWLEDGED_TIME -> matchesLong(consumer.getLastAcknowledgedTime()); + case LAST_DELIVERED_TIME -> matchesLong(consumer.getLastDeliveredTime()); default -> true; }; } - - @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); - } - } - } } 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/PredicateFilterPart.java similarity index 73% copy from artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ActiveMQFilterPredicate.java copy to artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/PredicateFilterPart.java index c9a680bbd9..298b47f821 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/PredicateFilterPart.java @@ -17,78 +17,41 @@ package org.apache.activemq.artemis.core.management.impl.view.predicate; import java.util.Collection; -import java.util.function.Predicate; +public class PredicateFilterPart<T> { -public class ActiveMQFilterPredicate<T> implements Predicate<T> { + private final String value; - public enum Operation { - CONTAINS, NOT_CONTAINS, EQUALS, NOT_EQUALS, GREATER_THAN, LESS_THAN; - } - - protected String field; - - protected String value; - - protected Operation operation; + private final String operation; - public ActiveMQFilterPredicate() { - } - - @Override - public boolean test(T input) { - return true; - } + private final ActiveMQFilterPredicate.Operation filterOperation; - public String getField() { - return field; + 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 void setField(String field) { - this.field = field; + public String getOperation() { + return operation; } public String getValue() { return value; } - public void setValue(String value) { - this.value = value; - } - - public Operation getOperation() { - return operation; + public ActiveMQFilterPredicate.Operation getFilterOperation() { + return filterOperation; } - 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; - }; - } + public boolean filterPart(T input) throws Exception { return true; } - - public boolean matchAny(Collection objects) { - for (Object o : objects) { - if (matches(o)) - return true; - } - return false; - } - - public boolean matches(long field) { + public boolean matchesLong(long field) { long longValue; if (operation != null) { @@ -96,14 +59,14 @@ public class ActiveMQFilterPredicate<T> implements Predicate<T> { longValue = Long.parseLong(value); } catch (NumberFormatException ex) { //cannot compare - if (operation == Operation.NOT_EQUALS || operation == Operation.NOT_CONTAINS) { + if (filterOperation == ActiveMQFilterPredicate.Operation.NOT_EQUALS || filterOperation == ActiveMQFilterPredicate.Operation.NOT_CONTAINS) { return true; } else { return false; } } - return switch (operation) { + return switch (filterOperation) { case EQUALS -> field == longValue; case NOT_EQUALS -> field != longValue; case CONTAINS -> false; @@ -115,22 +78,37 @@ public class ActiveMQFilterPredicate<T> implements Predicate<T> { return true; } - public boolean matches(int field) { + 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 (operation != null) { + if (filterOperation != null) { try { intValue = Integer.parseInt(value); } catch (NumberFormatException ex) { //cannot compare - if (operation == Operation.NOT_EQUALS || operation == Operation.NOT_CONTAINS) { + if (filterOperation == ActiveMQFilterPredicate.Operation.NOT_EQUALS || filterOperation == ActiveMQFilterPredicate.Operation.NOT_CONTAINS) { return true; } else { return false; } } - return switch (operation) { + return switch (filterOperation) { case EQUALS -> field == intValue; case NOT_EQUALS -> field != intValue; case CONTAINS -> false; @@ -142,7 +120,8 @@ public class ActiveMQFilterPredicate<T> implements Predicate<T> { return true; } - public boolean matches(float field) { + + public boolean matchesFloat(float field) { float floatValue; if (operation != null) { @@ -150,14 +129,14 @@ public class ActiveMQFilterPredicate<T> implements Predicate<T> { floatValue = Float.parseFloat(value); } catch (NumberFormatException ex) { //cannot compare - if (operation == Operation.NOT_EQUALS || operation == Operation.NOT_CONTAINS) { + if (filterOperation == ActiveMQFilterPredicate.Operation.NOT_EQUALS || filterOperation == ActiveMQFilterPredicate.Operation.NOT_CONTAINS) { return true; } else { return false; } } - return switch (operation) { + return switch (filterOperation) { case EQUALS -> field == floatValue; case NOT_EQUALS -> field != floatValue; case CONTAINS -> false; @@ -168,6 +147,13 @@ public class ActiveMQFilterPredicate<T> implements Predicate<T> { } 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) { 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 6552e734fe..5669469c6d 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<ServerProducer> { - - private ProducerField f; +public class ProducerFilterPredicate extends ActiveMQFilterPredicate<ServerProducer, ProducerPredicateFilterPart> { private final ActiveMQServer server; @@ -32,38 +29,12 @@ public class ProducerFilterPredicate extends ActiveMQFilterPredicate<ServerProdu } @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/ProducerFilterPredicate.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ProducerPredicateFilterPart.java similarity index 63% copy from artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ProducerFilterPredicate.java copy to artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ProducerPredicateFilterPart.java index 6552e734fe..35aa06794d 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/ProducerPredicateFilterPart.java @@ -20,50 +20,39 @@ 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<ServerProducer> { - - private ProducerField f; +public class ProducerPredicateFilterPart extends PredicateFilterPart<ServerProducer> { private final ActiveMQServer server; - public ProducerFilterPredicate(ActiveMQServer server) { - super(); + 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 test(ServerProducer producer) { - // Using switch over enum vs string comparison is better for perf. - if (f == null) - return true; + public boolean filterPart(ServerProducer producer) throws Exception { return switch (f) { - case ID -> matches(producer.getID()); + 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 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()); + 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; }; } - - @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); - } - } - } } 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 87314db48c..0d846e3a08 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<QueueControl> { +public class QueueFilterPredicate extends ActiveMQFilterPredicate<QueueControl, QueuePredicateFilterPart> { private QueueField f; @@ -35,58 +32,12 @@ public class QueueFilterPredicate extends ActiveMQFilterPredicate<QueueControl> } @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 0000000000..abb7d4a3a7 --- /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<QueueControl> { + 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 50a40ae6f9..d95b9eb2f3 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<ServerSession> { - - private SessionField f; +public class SessionFilterPredicate extends ActiveMQFilterPredicate<ServerSession, SessionPredicateFilterPart> { 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/SessionFilterPredicate.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/SessionPredicateFilterPart.java similarity index 72% copy from artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/SessionFilterPredicate.java copy to artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/SessionPredicateFilterPart.java index 50a40ae6f9..0cc5c4b8df 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/SessionPredicateFilterPart.java @@ -19,24 +19,29 @@ 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<ServerSession> { +public class SessionPredicateFilterPart extends PredicateFilterPart<ServerSession> { private SessionField f; - public SessionFilterPredicate() { - super(); + 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 test(ServerSession session) { - // Using switch over enum vs string comparison is better for perf. - if (f == null) - return true; + public boolean filterPart(ServerSession session) throws Exception { 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 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()); @@ -44,16 +49,4 @@ public class SessionFilterPredicate extends ActiveMQFilterPredicate<ServerSessio default -> true; }; } - - @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); - } - } - } } 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 bc2c5181f9..e7f7726e71 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<String> predicate = new ActiveMQFilterPredicate<>(); - predicate.setOperation(EQUALS.name()); - predicate.setValue(string); + PredicateFilterPart<String> 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<String> predicate = new ActiveMQFilterPredicate<>(); - predicate.setOperation(NOT_EQUALS.name()); - predicate.setValue(string); + PredicateFilterPart<String> 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<String> predicate = new ActiveMQFilterPredicate<>(); - predicate.setOperation(CONTAINS.name()); - predicate.setValue("12"); + PredicateFilterPart<String> 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<String> predicate = new ActiveMQFilterPredicate<>(); - predicate.setOperation(NOT_CONTAINS.name()); - predicate.setValue("12"); + PredicateFilterPart<String> 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<Integer> predicate = new ActiveMQFilterPredicate<>(); - predicate.setOperation(LESS_THAN.name()); - predicate.setValue("12"); + PredicateFilterPart<Integer> 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<Integer> predicate = new ActiveMQFilterPredicate<>(); - predicate.setOperation(GREATER_THAN.name()); - predicate.setValue("12"); + PredicateFilterPart<Integer> 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/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 ec04976e66..8fa7e16b7b 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 @@ -2483,6 +2483,65 @@ public abstract class ActiveMQTestBase extends ArtemisTestCase { return jsonFilterObject.toString(); } + public String createJsonFilter(String fieldName, String operationName, String value, boolean legacy) throws Exception { + Map<String, Object> 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<String, Object>[] filtersArray = new HashMap[1]; + filtersArray[0] = filterMap; + Map<String, Object> 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<String, Object> filterMap = new HashMap<>(); + filterMap.put("field", fieldName); + filterMap.put("operation", operationName); + filterMap.put("value", value); + Map<String, Object> filterMap2 = new HashMap<>(); + filterMap2.put("field", fieldName2); + filterMap2.put("operation", operationName2); + filterMap2.put("value", value2); + Map<String, Object>[] filtersArray = new HashMap[2]; + filtersArray[0] = filterMap; + filtersArray[1] = filterMap2; + Map<String, Object> 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<String, Object> filterMap = new HashMap<>(); + filterMap.put("field", fieldName); + filterMap.put("operation", operationName); + filterMap.put("value", value); + Map<String, Object> filterMap2 = new HashMap<>(); + filterMap2.put("field", fieldName2); + filterMap2.put("operation", operationName2); + filterMap2.put("value", value2); + Map<String, Object> filterMap3 = new HashMap<>(); + filterMap3.put("field", fieldName3); + filterMap3.put("operation", operationName3); + filterMap3.put("value", value3); + Map<String, Object>[] filtersArray = new HashMap[3]; + filtersArray[0] = filterMap; + filtersArray[1] = filterMap2; + filtersArray[2] = filterMap3; + Map<String, Object> 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/management/ActiveMQServerControlTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java index 6abdf31631..5bc25a7fa0 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 @@ -3696,8 +3696,17 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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"); @@ -3726,7 +3735,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { } //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); @@ -3738,7 +3747,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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); @@ -3783,8 +3792,16 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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"); @@ -3816,7 +3833,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { } //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"); @@ -3827,7 +3844,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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"); @@ -3838,7 +3855,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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"); @@ -3849,7 +3866,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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"); @@ -3860,7 +3877,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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"); @@ -3871,7 +3888,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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"); @@ -3883,7 +3900,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { //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"); @@ -3891,7 +3908,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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"); @@ -3899,7 +3916,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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"); @@ -3908,8 +3925,17 @@ public class ActiveMQServerControlTest extends ManagementTestBase { } + @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"); @@ -3973,7 +3999,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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); @@ -3981,7 +4007,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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); @@ -3990,7 +4016,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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); @@ -3999,7 +4025,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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); @@ -4008,7 +4034,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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); @@ -4017,7 +4043,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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); @@ -4026,7 +4052,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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); @@ -4035,7 +4061,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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); @@ -4044,7 +4070,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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); @@ -4053,7 +4079,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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); @@ -4064,8 +4090,17 @@ public class ActiveMQServerControlTest extends ManagementTestBase { } + @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"); @@ -4111,7 +4146,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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); @@ -4119,7 +4154,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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); @@ -4127,7 +4162,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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); @@ -4135,7 +4170,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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); @@ -4143,7 +4178,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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); @@ -4151,7 +4186,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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); @@ -4159,7 +4194,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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); @@ -4167,7 +4202,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { 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); @@ -4178,6 +4213,97 @@ public class ActiveMQServerControlTest extends ManagementTestBase { } + @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"); @@ -6584,6 +6710,27 @@ public class ActiveMQServerControlTest extends ManagementTestBase { return jsonFilterObject.toString(); } + public String createJsonFilter(String fieldName, String operationName, String value, String sortField, String sortOrder, boolean legacyFilter) throws Exception { + Map<String, Object> 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<String, Object>[] filtersArray = new HashMap[1]; + filtersArray[0] = filterMap; + Map<String, Object> filtersMap = new HashMap<>(); + filtersMap.put("searchFilters", filtersArray); + JsonObject jsonFiltersObject = JsonUtil.toJsonObject(filtersMap); + return jsonFiltersObject.toString(); + } + } + + private void sendMessagesWithPredefinedSize(int numberOfMessages, ClientSession session, ClientProducer producer, --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
