This is an automated email from the ASF dual-hosted git repository.

mmerli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/master by this push:
     new 30069db47bc [improve] Use Google re2/j library for user provided 
regexes (#22829)
30069db47bc is described below

commit 30069db47bc84494a1dd62abc0b5fc0d416c856e
Author: Matteo Merli <mme...@apache.org>
AuthorDate: Tue Jun 4 07:18:23 2024 -0700

    [improve] Use Google re2/j library for user provided regexes (#22829)
    
    Co-authored-by: Lari Hotari <lhot...@users.noreply.github.com>
---
 distribution/shell/src/assemble/LICENSE.bin.txt    |  1 +
 pom.xml                                            |  7 +++++++
 .../apache/pulsar/broker/service/ServerCnx.java    |  2 +-
 .../pulsar/broker/service/TopicListService.java    |  2 +-
 .../broker/service/TopicListServiceTest.java       |  2 +-
 .../broker/service/TopicListWatcherTest.java       |  2 +-
 .../impl/PatternTopicsConsumerImplAuthTest.java    |  2 +-
 .../client/impl/PatternTopicsConsumerImplTest.java | 24 +++++++++++-----------
 .../impl/PatternMultiTopicsConsumerImpl.java       |  2 +-
 .../pulsar/client/impl/PulsarClientImpl.java       |  6 ++++--
 .../pulsar/client/impl/TopicListWatcher.java       |  2 +-
 .../impl/PatternMultiTopicsConsumerImplTest.java   |  2 +-
 .../pulsar/client/impl/TopicListWatcherTest.java   |  2 +-
 pulsar-common/pom.xml                              |  5 +++++
 .../org/apache/pulsar/PulsarVersion.java           |  4 ++--
 .../org/apache/pulsar/common/topics/TopicList.java |  3 ++-
 .../apache/pulsar/common/topics/TopicListTest.java |  2 +-
 .../pulsar/testclient/LoadSimulationClient.java    | 12 +++++++----
 18 files changed, 51 insertions(+), 31 deletions(-)

diff --git a/distribution/shell/src/assemble/LICENSE.bin.txt 
b/distribution/shell/src/assemble/LICENSE.bin.txt
index 0049f7f8ef3..5c3b051cfdd 100644
--- a/distribution/shell/src/assemble/LICENSE.bin.txt
+++ b/distribution/shell/src/assemble/LICENSE.bin.txt
@@ -417,6 +417,7 @@ The Apache Software License, Version 2.0
   * Apache Avro
     - avro-1.11.3.jar
     - avro-protobuf-1.11.3.jar
+ * RE2j -- re2j-1.7.jar
 
 BSD 3-clause "New" or "Revised" License
  * JSR305 -- jsr305-3.0.2.jar -- ../licenses/LICENSE-JSR305.txt
diff --git a/pom.xml b/pom.xml
index 79b6a40804a..de385c97059 100644
--- a/pom.xml
+++ b/pom.xml
@@ -265,6 +265,7 @@ flexible messaging model and an intuitive client 
API.</description>
     
<opentelemetry.instrumentation.alpha.version>${opentelemetry.instrumentation.version}-alpha</opentelemetry.instrumentation.alpha.version>
     <opentelemetry.semconv.version>1.25.0-alpha</opentelemetry.semconv.version>
     <picocli.version>4.7.5</picocli.version>
+    <re2j.version>1.7</re2j.version>
     <failsafe.version>3.3.2</failsafe.version>
 
     <!-- test dependencies -->
@@ -656,6 +657,12 @@ flexible messaging model and an intuitive client 
API.</description>
         <version>${bookkeeper.version}</version>
       </dependency>
 
+      <dependency>
+        <groupId>com.google.re2j</groupId>
+        <artifactId>re2j</artifactId>
+        <version>${re2j.version}</version>
+      </dependency>
+
       <dependency>
         <groupId>org.rocksdb</groupId>
         <artifactId>rocksdbjni</artifactId>
diff --git 
a/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/ServerCnx.java 
b/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/ServerCnx.java
index 926ca13c05a..26a00c00b5a 100644
--- 
a/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/ServerCnx.java
+++ 
b/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/ServerCnx.java
@@ -33,6 +33,7 @@ import static 
org.apache.pulsar.common.protocol.Commands.newCloseConsumer;
 import static 
org.apache.pulsar.common.protocol.Commands.newLookupErrorResponse;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Strings;
+import com.google.re2j.Pattern;
 import io.netty.buffer.ByteBuf;
 import io.netty.channel.ChannelHandler;
 import io.netty.channel.ChannelHandlerContext;
@@ -59,7 +60,6 @@ import java.util.concurrent.CompletionStage;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
-import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import javax.naming.AuthenticationException;
 import javax.net.ssl.SSLSession;
diff --git 
a/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/TopicListService.java
 
b/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/TopicListService.java
index b18286ee062..e04d07460a2 100644
--- 
a/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/TopicListService.java
+++ 
b/pulsar-broker/src/main/java/org/apache/pulsar/broker/service/TopicListService.java
@@ -18,13 +18,13 @@
  */
 package org.apache.pulsar.broker.service;
 
+import com.google.re2j.Pattern;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.Semaphore;
 import java.util.function.BiConsumer;
-import java.util.regex.Pattern;
 import org.apache.pulsar.broker.PulsarService;
 import org.apache.pulsar.broker.namespace.NamespaceService;
 import org.apache.pulsar.broker.resources.TopicResources;
diff --git 
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/TopicListServiceTest.java
 
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/TopicListServiceTest.java
index 2b0b852a273..069794ec504 100644
--- 
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/TopicListServiceTest.java
+++ 
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/TopicListServiceTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.pulsar.broker.service;
 
+import com.google.re2j.Pattern;
 import org.apache.pulsar.broker.PulsarServerException;
 import org.apache.pulsar.broker.PulsarService;
 import org.apache.pulsar.broker.namespace.NamespaceService;
@@ -43,7 +44,6 @@ import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.Semaphore;
-import java.util.regex.Pattern;
 
 public class TopicListServiceTest {
 
diff --git 
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/TopicListWatcherTest.java
 
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/TopicListWatcherTest.java
index c232675779f..641b1bd4e74 100644
--- 
a/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/TopicListWatcherTest.java
+++ 
b/pulsar-broker/src/test/java/org/apache/pulsar/broker/service/TopicListWatcherTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.pulsar.broker.service;
 
+import com.google.re2j.Pattern;
 import org.apache.pulsar.common.topics.TopicList;
 import org.apache.pulsar.metadata.api.NotificationType;
 import static org.mockito.Mockito.mock;
@@ -29,7 +30,6 @@ import org.testng.annotations.Test;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import java.util.regex.Pattern;
 
 public class TopicListWatcherTest {
 
diff --git 
a/pulsar-broker/src/test/java/org/apache/pulsar/client/impl/PatternTopicsConsumerImplAuthTest.java
 
b/pulsar-broker/src/test/java/org/apache/pulsar/client/impl/PatternTopicsConsumerImplAuthTest.java
index a3759c56821..15cfb2f5654 100644
--- 
a/pulsar-broker/src/test/java/org/apache/pulsar/client/impl/PatternTopicsConsumerImplAuthTest.java
+++ 
b/pulsar-broker/src/test/java/org/apache/pulsar/client/impl/PatternTopicsConsumerImplAuthTest.java
@@ -204,7 +204,7 @@ public class PatternTopicsConsumerImplAuthTest extends 
ProducerConsumerBase {
         
assertTrue(consumer.getTopic().startsWith(PatternMultiTopicsConsumerImpl.DUMMY_TOPIC_NAME_PREFIX));
 
         // 4. verify consumer
-        assertSame(pattern, ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPattern());
+        assertSame(pattern.pattern(), ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPattern().pattern());
         List<String> topics = ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPartitions();
         List<ConsumerImpl<byte[]>> consumers = 
((PatternMultiTopicsConsumerImpl<byte[]>) consumer).getConsumers();
 
diff --git 
a/pulsar-broker/src/test/java/org/apache/pulsar/client/impl/PatternTopicsConsumerImplTest.java
 
b/pulsar-broker/src/test/java/org/apache/pulsar/client/impl/PatternTopicsConsumerImplTest.java
index 94d78e418ab..c5504a0c02a 100644
--- 
a/pulsar-broker/src/test/java/org/apache/pulsar/client/impl/PatternTopicsConsumerImplTest.java
+++ 
b/pulsar-broker/src/test/java/org/apache/pulsar/client/impl/PatternTopicsConsumerImplTest.java
@@ -227,7 +227,7 @@ public class PatternTopicsConsumerImplTest extends 
ProducerConsumerBase {
         });
 
         // 4. verify consumer get methods, to get right number of partitions 
and topics.
-        assertSame(pattern, ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPattern());
+        assertSame(pattern.pattern(), ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPattern().pattern());
         List<String> topics = ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPartitions();
         List<ConsumerImpl<byte[]>> consumers = 
((PatternMultiTopicsConsumerImpl<byte[]>) consumer).getConsumers();
 
@@ -310,7 +310,7 @@ public class PatternTopicsConsumerImplTest extends 
ProducerConsumerBase {
         });
 
         // 4. verify consumer get methods, to get right number of partitions 
and topics.
-        assertSame(pattern, ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPattern());
+        assertSame(pattern.pattern(), ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPattern().pattern());
         List<String> topics = ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPartitions();
         List<ConsumerImpl<byte[]>> consumers = 
((PatternMultiTopicsConsumerImpl<byte[]>) consumer).getConsumers();
 
@@ -393,7 +393,7 @@ public class PatternTopicsConsumerImplTest extends 
ProducerConsumerBase {
         });
 
         // 4. verify consumer get methods, to get right number of partitions 
and topics.
-        assertSame(pattern, ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPattern());
+        assertSame(pattern.pattern(), ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPattern().pattern());
         List<String> topics = ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPartitions();
         List<ConsumerImpl<byte[]>> consumers = 
((PatternMultiTopicsConsumerImpl<byte[]>) consumer).getConsumers();
 
@@ -490,7 +490,7 @@ public class PatternTopicsConsumerImplTest extends 
ProducerConsumerBase {
         });
 
         // 4. verify consumer get methods, to get right number of partitions 
and topics.
-        assertSame(pattern, ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPattern());
+        assertSame(pattern.pattern(), ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPattern().pattern());
         List<String> topics = ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPartitions();
         List<ConsumerImpl<byte[]>> consumers = 
((PatternMultiTopicsConsumerImpl<byte[]>) consumer).getConsumers();
 
@@ -566,7 +566,7 @@ public class PatternTopicsConsumerImplTest extends 
ProducerConsumerBase {
         });
 
         // 3. verify consumer get methods, to get 5 number of partitions and 
topics.
-        assertSame(pattern, ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPattern());
+        assertSame(pattern.pattern(), ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPattern().pattern());
         assertEquals(((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPartitions().size(), 5);
         assertEquals(((PatternMultiTopicsConsumerImpl<?>) 
consumer).getConsumers().size(), 5);
         assertEquals(((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPartitionedTopics().size(), 2);
@@ -595,7 +595,7 @@ public class PatternTopicsConsumerImplTest extends 
ProducerConsumerBase {
 
         // 6. verify consumer get methods, to get number of partitions and 
topics, value 6=1+2+3.
         Awaitility.await().untilAsserted(() -> {
-            assertSame(pattern, ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPattern());
+            assertSame(pattern.pattern(), ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPattern().pattern());
             assertEquals(((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPartitions().size(), 6);
             assertEquals(((PatternMultiTopicsConsumerImpl<?>) 
consumer).getConsumers().size(), 6);
             assertEquals(((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPartitionedTopics().size(), 2);
@@ -667,7 +667,7 @@ public class PatternTopicsConsumerImplTest extends 
ProducerConsumerBase {
 
         // 2. verify consumer get methods. There is no need to trigger 
discovery, because the broker will push the
         // changes to update(CommandWatchTopicUpdate).
-        assertSame(pattern, ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPattern());
+        assertSame(pattern.pattern(), ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPattern().pattern());
         Awaitility.await().untilAsserted(() -> {
             assertEquals(((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPartitions().size(), 4);
             assertEquals(((PatternMultiTopicsConsumerImpl<?>) 
consumer).getConsumers().size(), 4);
@@ -728,7 +728,7 @@ public class PatternTopicsConsumerImplTest extends 
ProducerConsumerBase {
         }
 
         // 2. verify consumer can subscribe the topic.
-        assertSame(pattern, ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPattern());
+        assertSame(pattern.pattern(), ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPattern().pattern());
         Awaitility.await().untilAsserted(() -> {
             assertEquals(((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPartitions().size(), 1);
             assertEquals(((PatternMultiTopicsConsumerImpl<?>) 
consumer).getConsumers().size(), 1);
@@ -786,7 +786,7 @@ public class PatternTopicsConsumerImplTest extends 
ProducerConsumerBase {
 
         // 2. verify consumer can subscribe the topic.
         // Since the minimum value of `patternAutoDiscoveryPeriod` is 60s, we 
set the test timeout to a triple value.
-        assertSame(pattern, ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPattern());
+        assertSame(pattern.pattern(), ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPattern().pattern());
         Awaitility.await().atMost(Duration.ofMinutes(3)).untilAsserted(() -> {
             assertEquals(((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPartitions().size(), 1);
             assertEquals(((PatternMultiTopicsConsumerImpl<?>) 
consumer).getConsumers().size(), 1);
@@ -883,7 +883,7 @@ public class PatternTopicsConsumerImplTest extends 
ProducerConsumerBase {
         assertTrue(consumer instanceof PatternMultiTopicsConsumerImpl);
 
         // 4. verify consumer get methods, to get 6 number of partitions and 
topics: 6=1+2+3
-        assertSame(pattern, ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPattern());
+        assertSame(pattern.pattern(), ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPattern().pattern());
         assertEquals(((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPartitions().size(), 6);
         assertEquals(((PatternMultiTopicsConsumerImpl<?>) 
consumer).getConsumers().size(), 6);
         assertEquals(((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPartitionedTopics().size(), 2);
@@ -999,7 +999,7 @@ public class PatternTopicsConsumerImplTest extends 
ProducerConsumerBase {
         assertTrue(consumer instanceof PatternMultiTopicsConsumerImpl);
 
         // 4. verify consumer get methods, to get 0 number of partitions and 
topics: 6=1+2+3
-        assertSame(pattern, ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPattern());
+        assertSame(pattern.pattern(), ((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPattern().pattern());
         assertEquals(((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPartitions().size(), 6);
         assertEquals(((PatternMultiTopicsConsumerImpl<?>) 
consumer).getConsumers().size(), 6);
         assertEquals(((PatternMultiTopicsConsumerImpl<?>) 
consumer).getPartitionedTopics().size(), 2);
@@ -1092,7 +1092,7 @@ public class PatternTopicsConsumerImplTest extends 
ProducerConsumerBase {
         PatternMultiTopicsConsumerImpl<String> consumerImpl = 
(PatternMultiTopicsConsumerImpl<String>) consumer;
 
         // 4. verify consumer get methods
-        assertSame(consumerImpl.getPattern(), pattern);
+        assertSame(consumerImpl.getPattern().pattern(), pattern.pattern());
         assertEquals(consumerImpl.getPartitionedTopics().size(), 0);
 
         producer1.send("msg-1");
diff --git 
a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/PatternMultiTopicsConsumerImpl.java
 
b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/PatternMultiTopicsConsumerImpl.java
index ec7ff7930c0..ffca79dfa43 100644
--- 
a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/PatternMultiTopicsConsumerImpl.java
+++ 
b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/PatternMultiTopicsConsumerImpl.java
@@ -21,6 +21,7 @@ package org.apache.pulsar.client.impl;
 import static com.google.common.base.Preconditions.checkArgument;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.Lists;
+import com.google.re2j.Pattern;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import io.netty.util.Timeout;
 import io.netty.util.TimerTask;
@@ -32,7 +33,6 @@ import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import org.apache.pulsar.client.api.Consumer;
 import org.apache.pulsar.client.api.Schema;
diff --git 
a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/PulsarClientImpl.java
 
b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/PulsarClientImpl.java
index 8aa16ef0e5f..e8107efe98e 100644
--- 
a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/PulsarClientImpl.java
+++ 
b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/PulsarClientImpl.java
@@ -23,6 +23,7 @@ import com.google.common.annotations.VisibleForTesting;
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
+import com.google.re2j.Pattern;
 import io.netty.channel.EventLoopGroup;
 import io.netty.util.HashedWheelTimer;
 import io.netty.util.Timer;
@@ -577,6 +578,7 @@ public class PulsarClientImpl implements PulsarClient {
         Mode subscriptionMode = 
convertRegexSubscriptionMode(conf.getRegexSubscriptionMode());
         TopicName destination = TopicName.get(regex);
         NamespaceName namespaceName = destination.getNamespaceObject();
+        Pattern pattern = Pattern.compile(conf.getTopicsPattern().pattern());
 
         CompletableFuture<Consumer<T>> consumerSubscribedFuture = new 
CompletableFuture<>();
         lookup.getTopicsUnderNamespace(namespaceName, subscriptionMode, regex, 
null)
@@ -592,10 +594,10 @@ public class PulsarClientImpl implements PulsarClient {
 
                 List<String> topicsList = getTopicsResult.getTopics();
                 if (!getTopicsResult.isFiltered()) {
-                   topicsList = 
TopicList.filterTopics(getTopicsResult.getTopics(), conf.getTopicsPattern());
+                   topicsList = 
TopicList.filterTopics(getTopicsResult.getTopics(), pattern);
                 }
                 conf.getTopicNames().addAll(topicsList);
-                ConsumerBase<T> consumer = new 
PatternMultiTopicsConsumerImpl<>(conf.getTopicsPattern(),
+                ConsumerBase<T> consumer = new 
PatternMultiTopicsConsumerImpl<>(pattern,
                         getTopicsResult.getTopicsHash(),
                         PulsarClientImpl.this,
                         conf,
diff --git 
a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/TopicListWatcher.java
 
b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/TopicListWatcher.java
index 4e635e0d2e8..15922d1180c 100644
--- 
a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/TopicListWatcher.java
+++ 
b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/TopicListWatcher.java
@@ -18,6 +18,7 @@
  */
 package org.apache.pulsar.client.impl;
 
+import com.google.re2j.Pattern;
 import io.netty.channel.ChannelHandlerContext;
 import java.util.List;
 import java.util.concurrent.CompletableFuture;
@@ -25,7 +26,6 @@ import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLongFieldUpdater;
 import java.util.concurrent.atomic.AtomicReference;
-import java.util.regex.Pattern;
 import org.apache.pulsar.client.api.PulsarClientException;
 import org.apache.pulsar.common.api.proto.BaseCommand;
 import org.apache.pulsar.common.api.proto.CommandWatchTopicUpdate;
diff --git 
a/pulsar-client/src/test/java/org/apache/pulsar/client/impl/PatternMultiTopicsConsumerImplTest.java
 
b/pulsar-client/src/test/java/org/apache/pulsar/client/impl/PatternMultiTopicsConsumerImplTest.java
index 5baca24cf8a..116a69b63e4 100644
--- 
a/pulsar-client/src/test/java/org/apache/pulsar/client/impl/PatternMultiTopicsConsumerImplTest.java
+++ 
b/pulsar-client/src/test/java/org/apache/pulsar/client/impl/PatternMultiTopicsConsumerImplTest.java
@@ -24,6 +24,7 @@ import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 import com.google.common.collect.Sets;
+import com.google.re2j.Pattern;
 import org.apache.pulsar.common.lookup.GetTopicsResult;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
@@ -32,7 +33,6 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.concurrent.CompletableFuture;
 import java.util.function.Consumer;
-import java.util.regex.Pattern;
 
 public class PatternMultiTopicsConsumerImplTest {
 
diff --git 
a/pulsar-client/src/test/java/org/apache/pulsar/client/impl/TopicListWatcherTest.java
 
b/pulsar-client/src/test/java/org/apache/pulsar/client/impl/TopicListWatcherTest.java
index 7e9fd601d4f..74a71f3da85 100644
--- 
a/pulsar-client/src/test/java/org/apache/pulsar/client/impl/TopicListWatcherTest.java
+++ 
b/pulsar-client/src/test/java/org/apache/pulsar/client/impl/TopicListWatcherTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.pulsar.client.impl;
 
+import com.google.re2j.Pattern;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.util.HashedWheelTimer;
 import io.netty.util.Timer;
@@ -41,7 +42,6 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 import java.util.Collections;
 import java.util.concurrent.CompletableFuture;
-import java.util.regex.Pattern;
 
 public class TopicListWatcherTest {
 
diff --git a/pulsar-common/pom.xml b/pulsar-common/pom.xml
index 31f425e8b41..cdc30dac289 100644
--- a/pulsar-common/pom.xml
+++ b/pulsar-common/pom.xml
@@ -238,6 +238,11 @@
       <artifactId>gson</artifactId>
     </dependency>
 
+    <dependency>
+      <groupId>com.google.re2j</groupId>
+      <artifactId>re2j</artifactId>
+    </dependency>
+
     <dependency>
       <groupId>org.awaitility</groupId>
       <artifactId>awaitility</artifactId>
diff --git 
a/pulsar-common/src/main/java-templates/org/apache/pulsar/PulsarVersion.java 
b/pulsar-common/src/main/java-templates/org/apache/pulsar/PulsarVersion.java
index 119e46b9536..c597dd327f6 100644
--- a/pulsar-common/src/main/java-templates/org/apache/pulsar/PulsarVersion.java
+++ b/pulsar-common/src/main/java-templates/org/apache/pulsar/PulsarVersion.java
@@ -18,8 +18,8 @@
  */
 package org.apache.pulsar;
 
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import com.google.re2j.Matcher;
+import com.google.re2j.Pattern;
 
 public class PulsarVersion {
 
diff --git 
a/pulsar-common/src/main/java/org/apache/pulsar/common/topics/TopicList.java 
b/pulsar-common/src/main/java/org/apache/pulsar/common/topics/TopicList.java
index 4c0a8d500b7..e8a485b844d 100644
--- a/pulsar-common/src/main/java/org/apache/pulsar/common/topics/TopicList.java
+++ b/pulsar-common/src/main/java/org/apache/pulsar/common/topics/TopicList.java
@@ -19,12 +19,12 @@
 package org.apache.pulsar.common.topics;
 
 import com.google.common.hash.Hashing;
+import com.google.re2j.Pattern;
 import java.nio.charset.StandardCharsets;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import lombok.experimental.UtilityClass;
 import org.apache.pulsar.common.naming.SystemTopicNames;
@@ -47,6 +47,7 @@ public class TopicList {
     }
     public static List<String> filterTopics(List<String> original, Pattern 
topicsPattern) {
 
+
         final Pattern shortenedTopicsPattern = 
Pattern.compile(removeTopicDomainScheme(topicsPattern.toString()));
 
         return original.stream()
diff --git 
a/pulsar-common/src/test/java/org/apache/pulsar/common/topics/TopicListTest.java
 
b/pulsar-common/src/test/java/org/apache/pulsar/common/topics/TopicListTest.java
index 9069dd6dcc7..a83ef2ac8c7 100644
--- 
a/pulsar-common/src/test/java/org/apache/pulsar/common/topics/TopicListTest.java
+++ 
b/pulsar-common/src/test/java/org/apache/pulsar/common/topics/TopicListTest.java
@@ -19,12 +19,12 @@
 package org.apache.pulsar.common.topics;
 
 import com.google.common.collect.Lists;
+import com.google.re2j.Pattern;
 import org.testng.annotations.Test;
 
 import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
-import java.util.regex.Pattern;
 import java.util.stream.Stream;
 
 import static org.testng.Assert.assertEquals;
diff --git 
a/pulsar-testclient/src/main/java/org/apache/pulsar/testclient/LoadSimulationClient.java
 
b/pulsar-testclient/src/main/java/org/apache/pulsar/testclient/LoadSimulationClient.java
index c58de64056a..115733d5ecd 100644
--- 
a/pulsar-testclient/src/main/java/org/apache/pulsar/testclient/LoadSimulationClient.java
+++ 
b/pulsar-testclient/src/main/java/org/apache/pulsar/testclient/LoadSimulationClient.java
@@ -19,6 +19,7 @@
 package org.apache.pulsar.testclient;
 
 import com.google.common.util.concurrent.RateLimiter;
+import com.google.re2j.Pattern;
 import io.netty.util.concurrent.DefaultThreadFactory;
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
@@ -269,11 +270,14 @@ public class LoadSimulationClient extends CmdBase{
             tradeConf.size = inputStream.readInt();
             tradeConf.rate = inputStream.readDouble();
             // See if a topic belongs to this tenant and group using this 
regex.
-            final String groupRegex = ".*://" + tradeConf.tenant + "/.*/" + 
tradeConf.group + "-.*/.*";
+            final Pattern groupRegex =
+                    Pattern.compile(".*://" + tradeConf.tenant + "/.*/" + 
tradeConf.group + "-.*/.*");
+
             for (Map.Entry<String, TradeUnit> entry : 
topicsToTradeUnits.entrySet()) {
                 final String topic = entry.getKey();
                 final TradeUnit unit = entry.getValue();
-                if (topic.matches(groupRegex)) {
+
+                if (groupRegex.matcher(topic).matches()) {
                     unit.change(tradeConf);
                 }
             }
@@ -282,11 +286,11 @@ public class LoadSimulationClient extends CmdBase{
             // Stop all topics belonging to a group.
             decodeGroupOptions(tradeConf, inputStream);
             // See if a topic belongs to this tenant and group using this 
regex.
-            final String regex = ".*://" + tradeConf.tenant + "/.*/" + 
tradeConf.group + "-.*/.*";
+            final Pattern regex = Pattern.compile(".*://" + tradeConf.tenant + 
"/.*/" + tradeConf.group + "-.*/.*");
             for (Map.Entry<String, TradeUnit> entry : 
topicsToTradeUnits.entrySet()) {
                 final String topic = entry.getKey();
                 final TradeUnit unit = entry.getValue();
-                if (topic.matches(regex)) {
+                if (regex.matcher(topic).matches()) {
                     unit.stop.set(true);
                 }
             }

Reply via email to