From a26720c1988a6a5dd6e6a44484c8b47320bc76a5 Mon Sep 17 00:00:00 2001 From: mandlil <138015259+mandlil@users.noreply.github.com> Date: Mon, 7 Oct 2024 10:13:03 +0000 Subject: [PATCH] Optimized the alphanumeric check by avoiding the use of regex (#3642) * Optimized the alphanumeric check by avoiding the use of regex * re-format the code lines * Update MultiFileModeFileNameProvider.java --- .../source/MultiFileModeFileNameProvider.java | 22 ++++++++++++++++--- .../MultiFileModeFileNameProviderTest.java | 11 ++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/java/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProvider.java b/java/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProvider.java index 0d9adb5ee..c8a3270a6 100644 --- a/java/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProvider.java +++ b/java/libphonenumber/src/com/google/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProvider.java @@ -16,7 +16,6 @@ package com.google.i18n.phonenumbers.metadata.source; -import java.util.regex.Pattern; /** * {@link PhoneMetadataFileNameProvider} implementation which appends key as a suffix to the @@ -25,7 +24,6 @@ import java.util.regex.Pattern; public final class MultiFileModeFileNameProvider implements PhoneMetadataFileNameProvider { private final String phoneMetadataFileNamePrefix; - private static final Pattern ALPHANUMERIC = Pattern.compile("^[\\p{L}\\p{N}]+$"); public MultiFileModeFileNameProvider(String phoneMetadataFileNameBase) { this.phoneMetadataFileNamePrefix = phoneMetadataFileNameBase + "_"; @@ -34,9 +32,27 @@ public final class MultiFileModeFileNameProvider implements PhoneMetadataFileNam @Override public String getFor(Object key) { String keyAsString = key.toString(); - if (!ALPHANUMERIC.matcher(keyAsString).matches()) { + if (!isAlphanumeric(keyAsString)) { throw new IllegalArgumentException("Invalid key: " + keyAsString); } return phoneMetadataFileNamePrefix + key; } + + private boolean isAlphanumeric(String key) { + if (key == null || key.length() == 0) { + return false; + } + // String#length doesn't actually return the number of + // code points in the String, it returns the number + // of char values. + int size = key.length(); + for (int charIdx = 0; charIdx < size; ) { + final int codePoint = key.codePointAt(charIdx); + if (!Character.isLetterOrDigit(codePoint)) { + return false; + } + charIdx += Character.charCount(codePoint); + } + return true; + } } diff --git a/java/libphonenumber/test/com/google/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProviderTest.java b/java/libphonenumber/test/com/google/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProviderTest.java index c7ad7ddcd..f3fb03af7 100644 --- a/java/libphonenumber/test/com/google/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProviderTest.java +++ b/java/libphonenumber/test/com/google/i18n/phonenumbers/metadata/source/MultiFileModeFileNameProviderTest.java @@ -42,4 +42,15 @@ public final class MultiFileModeFileNameProviderTest extends TestCase { } }); } + + public void getFor_shouldThrowExceptionForEmptyKey() { + assertThrows( + IllegalArgumentException.class, + new ThrowingRunnable() { + @Override + public void run() { + metadataFileNameProvider.getFor(""); + } + }); + } }