From 899d5cc05461fd772b70a8412cd3752a411c7000 Mon Sep 17 00:00:00 2001 From: Auxilor Date: Wed, 24 May 2023 14:41:15 +0100 Subject: [PATCH] Added caching to literal pattern compilation --- .../core/placeholder/PlayerPlaceholder.java | 3 +- .../placeholder/PlayerStaticPlaceholder.java | 3 +- .../placeholder/PlayerlessPlaceholder.java | 3 +- .../core/placeholder/StaticPlaceholder.java | 3 +- .../SimpleInjectablePlaceholder.java | 3 +- .../templates/SimplePlaceholder.java | 3 +- .../com/willfp/eco/util/PatternUtils.java | 35 +++++++++++++++++++ 7 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 eco-api/src/main/java/com/willfp/eco/util/PatternUtils.java diff --git a/eco-api/src/main/java/com/willfp/eco/core/placeholder/PlayerPlaceholder.java b/eco-api/src/main/java/com/willfp/eco/core/placeholder/PlayerPlaceholder.java index f1d85637..9e8547d9 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/placeholder/PlayerPlaceholder.java +++ b/eco-api/src/main/java/com/willfp/eco/core/placeholder/PlayerPlaceholder.java @@ -2,6 +2,7 @@ package com.willfp.eco.core.placeholder; import com.willfp.eco.core.EcoPlugin; import com.willfp.eco.core.placeholder.context.PlaceholderContext; +import com.willfp.eco.util.PatternUtils; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -40,7 +41,7 @@ public final class PlayerPlaceholder implements RegistrablePlaceholder { @NotNull final String identifier, @NotNull final Function<@NotNull Player, @Nullable String> function) { this.plugin = plugin; - this.pattern = Pattern.compile(identifier, Pattern.LITERAL); + this.pattern = PatternUtils.compileLiteral(identifier); this.function = function; } diff --git a/eco-api/src/main/java/com/willfp/eco/core/placeholder/PlayerStaticPlaceholder.java b/eco-api/src/main/java/com/willfp/eco/core/placeholder/PlayerStaticPlaceholder.java index 75a490cc..a78d0fb0 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/placeholder/PlayerStaticPlaceholder.java +++ b/eco-api/src/main/java/com/willfp/eco/core/placeholder/PlayerStaticPlaceholder.java @@ -1,6 +1,7 @@ package com.willfp.eco.core.placeholder; import com.willfp.eco.core.placeholder.context.PlaceholderContext; +import com.willfp.eco.util.PatternUtils; import com.willfp.eco.util.StringUtils; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -38,7 +39,7 @@ public final class PlayerStaticPlaceholder implements InjectablePlaceholder { public PlayerStaticPlaceholder(@NotNull final String identifier, @NotNull final Function<@NotNull Player, @Nullable String> function) { this.identifier = "%" + identifier + "%"; - this.pattern = Pattern.compile(identifier, Pattern.LITERAL); + this.pattern = PatternUtils.compileLiteral(identifier); this.function = function; } diff --git a/eco-api/src/main/java/com/willfp/eco/core/placeholder/PlayerlessPlaceholder.java b/eco-api/src/main/java/com/willfp/eco/core/placeholder/PlayerlessPlaceholder.java index 9d69d2e4..95d5b7f2 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/placeholder/PlayerlessPlaceholder.java +++ b/eco-api/src/main/java/com/willfp/eco/core/placeholder/PlayerlessPlaceholder.java @@ -2,6 +2,7 @@ package com.willfp.eco.core.placeholder; import com.willfp.eco.core.EcoPlugin; import com.willfp.eco.core.placeholder.context.PlaceholderContext; +import com.willfp.eco.util.PatternUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -39,7 +40,7 @@ public final class PlayerlessPlaceholder implements RegistrablePlaceholder { @NotNull final String identifier, @NotNull final Supplier<@Nullable String> function) { this.plugin = plugin; - this.pattern = Pattern.compile(identifier, Pattern.LITERAL); + this.pattern = PatternUtils.compileLiteral(identifier); this.function = function; } diff --git a/eco-api/src/main/java/com/willfp/eco/core/placeholder/StaticPlaceholder.java b/eco-api/src/main/java/com/willfp/eco/core/placeholder/StaticPlaceholder.java index fb24d13c..90f33382 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/placeholder/StaticPlaceholder.java +++ b/eco-api/src/main/java/com/willfp/eco/core/placeholder/StaticPlaceholder.java @@ -1,6 +1,7 @@ package com.willfp.eco.core.placeholder; import com.willfp.eco.core.placeholder.context.PlaceholderContext; +import com.willfp.eco.util.PatternUtils; import com.willfp.eco.util.StringUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -37,7 +38,7 @@ public final class StaticPlaceholder implements InjectablePlaceholder { public StaticPlaceholder(@NotNull final String identifier, @NotNull final Supplier<@Nullable String> function) { this.identifier = "%" + identifier + "%"; - this.pattern = Pattern.compile(identifier, Pattern.LITERAL); + this.pattern = PatternUtils.compileLiteral(identifier); this.function = function; } diff --git a/eco-api/src/main/java/com/willfp/eco/core/placeholder/templates/SimpleInjectablePlaceholder.java b/eco-api/src/main/java/com/willfp/eco/core/placeholder/templates/SimpleInjectablePlaceholder.java index 2cfba6d0..f5c44a4d 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/placeholder/templates/SimpleInjectablePlaceholder.java +++ b/eco-api/src/main/java/com/willfp/eco/core/placeholder/templates/SimpleInjectablePlaceholder.java @@ -2,6 +2,7 @@ package com.willfp.eco.core.placeholder.templates; import com.willfp.eco.core.placeholder.InjectablePlaceholder; import com.willfp.eco.core.placeholder.context.PlaceholderContext; +import com.willfp.eco.util.PatternUtils; import org.jetbrains.annotations.NotNull; import java.util.Objects; @@ -28,7 +29,7 @@ public abstract class SimpleInjectablePlaceholder implements InjectablePlacehold */ protected SimpleInjectablePlaceholder(@NotNull final String identifier) { this.identifier = identifier; - this.pattern = Pattern.compile(identifier, Pattern.LITERAL); + this.pattern = PatternUtils.compileLiteral(identifier); } @Override diff --git a/eco-api/src/main/java/com/willfp/eco/core/placeholder/templates/SimplePlaceholder.java b/eco-api/src/main/java/com/willfp/eco/core/placeholder/templates/SimplePlaceholder.java index 05659d54..ba1b0600 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/placeholder/templates/SimplePlaceholder.java +++ b/eco-api/src/main/java/com/willfp/eco/core/placeholder/templates/SimplePlaceholder.java @@ -3,6 +3,7 @@ package com.willfp.eco.core.placeholder.templates; import com.willfp.eco.core.EcoPlugin; import com.willfp.eco.core.placeholder.RegistrablePlaceholder; import com.willfp.eco.core.placeholder.context.PlaceholderContext; +import com.willfp.eco.util.PatternUtils; import org.jetbrains.annotations.NotNull; import java.util.Objects; @@ -37,7 +38,7 @@ public abstract class SimplePlaceholder implements RegistrablePlaceholder { @NotNull final String identifier) { this.plugin = plugin; this.identifier = identifier; - this.pattern = Pattern.compile(identifier, Pattern.LITERAL); + this.pattern = PatternUtils.compileLiteral(identifier); } @Override diff --git a/eco-api/src/main/java/com/willfp/eco/util/PatternUtils.java b/eco-api/src/main/java/com/willfp/eco/util/PatternUtils.java new file mode 100644 index 00000000..1eccedba --- /dev/null +++ b/eco-api/src/main/java/com/willfp/eco/util/PatternUtils.java @@ -0,0 +1,35 @@ +package com.willfp.eco.util; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import org.jetbrains.annotations.NotNull; + +import java.util.concurrent.TimeUnit; +import java.util.regex.Pattern; + +/** + * Utilities / API methods for patterns. + */ +public final class PatternUtils { + /** + * Cache of compiled literal patterns. + */ + private static final Cache LITERAL_PATTERN_CACHE = Caffeine.newBuilder() + .expireAfterAccess(1, TimeUnit.MINUTES) + .build(); + + /** + * Compile a literal pattern. + * + * @param pattern The pattern. + * @return The compiled pattern. + */ + @NotNull + public static Pattern compileLiteral(@NotNull final String pattern) { + return LITERAL_PATTERN_CACHE.get(pattern, (it) -> Pattern.compile(it, Pattern.LITERAL)); + } + + private PatternUtils() { + throw new UnsupportedOperationException("This is a utility class and cannot be instantiated"); + } +}