Skip to content

Commit 73e1650

Browse files
authored
Merge pull request #3318 from Multiverse/fix/match-invalid-regex
Properly handle error from invalid regex string in matcher
2 parents 0e2a27b + 800709c commit 73e1650

5 files changed

Lines changed: 51 additions & 20 deletions

File tree

src/main/java/org/mvplugins/multiverse/core/utils/matcher/ExactStringMatcher.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.mvplugins.multiverse.core.utils.matcher;
22

33
import org.jetbrains.annotations.ApiStatus;
4+
import org.jetbrains.annotations.NotNull;
5+
import org.jetbrains.annotations.Nullable;
46

57
import java.util.Collection;
68
import java.util.HashSet;
@@ -34,7 +36,7 @@ public ExactStringMatcher() {
3436
* @since 5.2
3537
*/
3638
@ApiStatus.AvailableSince("5.2")
37-
public ExactStringMatcher(String exactMatch) {
39+
public ExactStringMatcher(@NotNull String exactMatch) {
3840
this.exactMatches = new HashSet<>();
3941
this.exactMatches.add(exactMatch);
4042
}
@@ -47,7 +49,7 @@ public ExactStringMatcher(String exactMatch) {
4749
* @since 5.2
4850
*/
4951
@ApiStatus.AvailableSince("5.2")
50-
public ExactStringMatcher(Collection<String> exactMatches) {
52+
public ExactStringMatcher(@NotNull Collection<String> exactMatches) {
5153
this.exactMatches = new HashSet<>(exactMatches);
5254
}
5355

@@ -59,15 +61,15 @@ public ExactStringMatcher(Collection<String> exactMatches) {
5961
* @since 5.2
6062
*/
6163
@ApiStatus.AvailableSince("5.2")
62-
public void addExactMatch(String value) {
64+
public void addExactMatch(@NotNull String value) {
6365
this.exactMatches.add(value);
6466
}
6567

6668
/**
6769
* {@inheritDoc}
6870
*/
6971
@Override
70-
public boolean matches(String value) {
72+
public boolean matches(@Nullable String value) {
7173
return exactMatches.contains(value);
7274
}
7375
}

src/main/java/org/mvplugins/multiverse/core/utils/matcher/MatcherGroup.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import com.dumptruckman.minecraft.util.Logging;
44
import org.jetbrains.annotations.ApiStatus;
5+
import org.jetbrains.annotations.NotNull;
6+
import org.jetbrains.annotations.Nullable;
57

68
import java.util.ArrayList;
79
import java.util.Collection;
@@ -38,7 +40,7 @@ public MatcherGroup() {
3840
* @since 5.2
3941
*/
4042
@ApiStatus.AvailableSince("5.2")
41-
public MatcherGroup(Collection<String> matchStrings) {
43+
public MatcherGroup(@NotNull Collection<String> matchStrings) {
4244
this();
4345
for (String matchString : matchStrings) {
4446
addMatcher(matchString);
@@ -53,15 +55,18 @@ public MatcherGroup(Collection<String> matchStrings) {
5355
* @since 5.2
5456
*/
5557
@ApiStatus.AvailableSince("5.2")
56-
public void addMatcher(String matchString) {
58+
public void addMatcher(@Nullable String matchString) {
59+
if (matchString == null || matchString.isEmpty()) {
60+
return;
61+
}
5762
if (isExact(matchString)) {
5863
exactMatcher.addExactMatch(matchString);
5964
} else {
6065
stringMatchers.add(StringMatcher.fromString(matchString));
6166
}
6267
}
6368

64-
private boolean isExact(String matcherString) {
69+
private boolean isExact(@NotNull String matcherString) {
6570
return !matcherString.contains("*") && !matcherString.startsWith("r=");
6671
}
6772

@@ -73,15 +78,15 @@ private boolean isExact(String matcherString) {
7378
* @since 5.2
7479
*/
7580
@ApiStatus.AvailableSince("5.2")
76-
public void addMatcher(StringMatcher matcher) {
81+
public void addMatcher(@NotNull StringMatcher matcher) {
7782
stringMatchers.add(matcher);
7883
}
7984

8085
/**
8186
* {@inheritDoc}
8287
*/
8388
@Override
84-
public boolean matches(String value) {
89+
public boolean matches(@Nullable String value) {
8590
if (exactMatcher.matches(value)) {
8691
return true;
8792
}

src/main/java/org/mvplugins/multiverse/core/utils/matcher/RegexStringMatcher.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package org.mvplugins.multiverse.core.utils.matcher;
22

3+
import com.dumptruckman.minecraft.util.Logging;
4+
import io.vavr.control.Try;
35
import org.jetbrains.annotations.ApiStatus;
6+
import org.jetbrains.annotations.NotNull;
7+
import org.jetbrains.annotations.Nullable;
48

59
import java.util.regex.Pattern;
610

@@ -12,8 +16,8 @@
1216
*/
1317
@ApiStatus.AvailableSince("5.2")
1418
public class RegexStringMatcher implements StringMatcher {
15-
private final String regexString;
16-
private final Pattern regexPattern;
19+
private final @NotNull String regexString;
20+
private final @Nullable Pattern regexPattern;
1721

1822
/**
1923
* Creates a new RegexStringMatcher with a regex string. 'r=' prefix will be stripped if present.
@@ -23,7 +27,7 @@ public class RegexStringMatcher implements StringMatcher {
2327
* @since 5.2
2428
*/
2529
@ApiStatus.AvailableSince("5.2")
26-
public RegexStringMatcher(String regexString) {
30+
public RegexStringMatcher(@NotNull String regexString) {
2731
this.regexString = regexString;
2832
this.regexPattern = compileRegex(regexString);
2933
}
@@ -32,14 +36,22 @@ private Pattern compileRegex(String regexString) {
3236
if (regexString.startsWith("r=")) {
3337
regexString = regexString.substring(2);
3438
}
35-
return Pattern.compile(regexString);
39+
40+
String finalRegexString = regexString;
41+
return Try.of(() -> Pattern.compile(finalRegexString))
42+
.onFailure(ex -> Logging.warning("Failed to compile regex '%s': %s",
43+
finalRegexString, ex.getMessage()))
44+
.getOrNull();
3645
}
3746

3847
/**
3948
* {@inheritDoc}
4049
*/
4150
@Override
42-
public boolean matches(String value) {
51+
public boolean matches(@Nullable String value) {
52+
if (regexPattern == null || value == null) {
53+
return false;
54+
}
4355
return regexPattern.matcher(value).matches();
4456
}
4557
}

src/main/java/org/mvplugins/multiverse/core/utils/matcher/StringMatcher.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.mvplugins.multiverse.core.utils.matcher;
22

33
import org.jetbrains.annotations.ApiStatus;
4+
import org.jetbrains.annotations.NotNull;
5+
import org.jetbrains.annotations.Nullable;
46

57
import java.util.List;
68
import java.util.stream.Collectors;
@@ -26,7 +28,7 @@ public interface StringMatcher {
2628
* @since 5.2
2729
*/
2830
@ApiStatus.AvailableSince("5.2")
29-
static StringMatcher fromString(String matcherString) {
31+
static @NotNull StringMatcher fromString(@NotNull String matcherString) {
3032
if (matcherString.startsWith("r=")) {
3133
return new RegexStringMatcher(matcherString);
3234
} else if (matcherString.contains("*")) {
@@ -45,7 +47,7 @@ static StringMatcher fromString(String matcherString) {
4547
* @since 5.2
4648
*/
4749
@ApiStatus.AvailableSince("5.2")
48-
boolean matches(String value);
50+
boolean matches(@Nullable String value);
4951

5052
/**
5153
* Filters a list of strings, returning only those that match the pattern defined by this StringMatcher.
@@ -57,7 +59,7 @@ static StringMatcher fromString(String matcherString) {
5759
* @since 5.2
5860
*/
5961
@ApiStatus.AvailableSince("5.2")
60-
default List<String> filter(List<String> values) {
62+
default @NotNull List<String> filter(@NotNull List<String> values) {
6163
return values.stream()
6264
.filter(this::matches)
6365
.collect(Collectors.toList());

src/main/java/org/mvplugins/multiverse/core/utils/matcher/WildcardStringMatcher.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package org.mvplugins.multiverse.core.utils.matcher;
22

3+
import com.dumptruckman.minecraft.util.Logging;
4+
import io.vavr.control.Try;
35
import org.jetbrains.annotations.ApiStatus;
6+
import org.jetbrains.annotations.NotNull;
7+
import org.jetbrains.annotations.Nullable;
48

59
import java.util.regex.Pattern;
610

@@ -25,16 +29,22 @@ public class WildcardStringMatcher implements StringMatcher {
2529
* @param wildcard the wildcard string to match against.
2630
*/
2731
@ApiStatus.AvailableSince("5.2")
28-
public WildcardStringMatcher(String wildcard) {
32+
public WildcardStringMatcher(@NotNull String wildcard) {
2933
this.wildcard = wildcard;
30-
this.pattern = Pattern.compile(("\\Q" + wildcard + "\\E").replace("*", "\\E.*\\Q"));
34+
this.pattern = Try.of(() -> Pattern.compile(("\\Q" + wildcard + "\\E").replace("*", "\\E.*\\Q")))
35+
.onFailure(ex -> Logging.warning("Failed to compile wildcard '%s': %s",
36+
wildcard, ex.getMessage()))
37+
.getOrNull();
3138
}
3239

3340
/**
3441
* {@inheritDoc}
3542
*/
3643
@Override
37-
public boolean matches(String value) {
44+
public boolean matches(@Nullable String value) {
45+
if (pattern == null || value == null) {
46+
return false;
47+
}
3848
return pattern.matcher(value).matches();
3949
}
4050
}

0 commit comments

Comments
 (0)