This is an automated email from the ASF dual-hosted git repository. garydgregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-codec.git
commit 897df72adef639bbf965ae4271be757e8b794195 Author: Gary Gregory <[email protected]> AuthorDate: Fri Aug 7 13:29:57 2026 -0400 Add BeiderMorseEncoder.Builder. --- src/changes/changes.xml | 1 + .../codec/language/bm/BeiderMorseEncoder.java | 54 ++++++++++++++++++++-- .../codec/language/bm/BeiderMorseEncoderTest.java | 23 ++++++++- 3 files changed, 73 insertions(+), 5 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index bf6ce8d8..3326a5b5 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -51,6 +51,7 @@ The <action> type attribute can be add,update,fix,remove. <action type="fix" dev="ggregory" due-to="Yu Bao, Gary Gregory">Allocate a single MessageDigest and use it in Sha2Crypt.sha2Crypt(byte[], String, String, int, String)..</action> <!-- ADD --> <action type="add" dev="ggregory" due-to="Gary Gregory">Add and use PhoneticEngine.Builder and deprecate old constructors.</action> + <action type="add" dev="ggregory" due-to="Gary Gregory">Add BeiderMorseEncoder.Builder and deprecate old constructor.</action> <!-- UPDATE --> </release> <release version="1.22.1" date="2026-07-27" description="This is a feature and maintenance release. Java 8 or later is required."> diff --git a/src/main/java/org/apache/commons/codec/language/bm/BeiderMorseEncoder.java b/src/main/java/org/apache/commons/codec/language/bm/BeiderMorseEncoder.java index 1c2da755..40a9548a 100644 --- a/src/main/java/org/apache/commons/codec/language/bm/BeiderMorseEncoder.java +++ b/src/main/java/org/apache/commons/codec/language/bm/BeiderMorseEncoder.java @@ -71,19 +71,67 @@ import org.apache.commons.codec.StringEncoder; * @since 1.6 */ public class BeiderMorseEncoder implements StringEncoder { - // Implementation note: This class is a spring-friendly facade to PhoneticEngine. It allows read/write configuration - // of an immutable PhoneticEngine instance that will be delegated to for the actual encoding. - // a cached object + /** + * Creates a new builder for a Beider-Morse encoder. + * + * @since 1.23.0 + */ + public static final class Builder { + + private PhoneticEngine engine = PhoneticEngine.builder().get(); + + private Builder() { + // empty. + } + + /** + * Gets a new Beider-Morse encoder with the current configuration. + * + * @return a new Beider-Morse encoder with the current configuration. + */ + public BeiderMorseEncoder get() { + return new BeiderMorseEncoder(this); + } + + /** + * Sets the phonetic engine to use. + * + * @param engine the phonetic engine to use. + * @return this builder, for chaining. + */ + public Builder setPhoneticEngine(final PhoneticEngine engine) { + this.engine = engine != null ? engine : PhoneticEngine.builder().get(); + return this; + } + } + + /** + * Creates a new builder for a BeiderMorseEncoder. + * + * @return a new builder for a BeiderMorseEncoder. + * @since 1.23.0 + */ + public static Builder builder() { + return new Builder(); + } + + /** A cached object. */ private PhoneticEngine engine = PhoneticEngine.builder().get(); /** * Constructs a new instance. + * + * @deprecated Use {@link #builder()} to create a new instance. */ public BeiderMorseEncoder() { // empty } + private BeiderMorseEncoder(final Builder builder) { + engine = builder.engine; + } + @Override public Object encode(final Object source) throws EncoderException { if (!(source instanceof String)) { diff --git a/src/test/java/org/apache/commons/codec/language/bm/BeiderMorseEncoderTest.java b/src/test/java/org/apache/commons/codec/language/bm/BeiderMorseEncoderTest.java index 56cfe3cf..e42bb27c 100644 --- a/src/test/java/org/apache/commons/codec/language/bm/BeiderMorseEncoderTest.java +++ b/src/test/java/org/apache/commons/codec/language/bm/BeiderMorseEncoderTest.java @@ -25,16 +25,20 @@ import static org.junit.jupiter.api.Assertions.assertTimeout; import static org.junit.jupiter.api.Assertions.assertTrue; import java.time.Duration; +import java.util.Random; import java.util.regex.Pattern; import org.apache.commons.codec.AbstractStringEncoderTest; import org.apache.commons.codec.EncoderException; import org.apache.commons.codec.StringEncoder; import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; /** - * Tests BeiderMorseEncoder. + * Tests {@link BeiderMorseEncoder}. */ class BeiderMorseEncoderTest extends AbstractStringEncoderTest<StringEncoder> { @@ -113,13 +117,28 @@ class BeiderMorseEncoderTest extends AbstractStringEncoderTest<StringEncoder> { * Tests https://issues.apache.org/jira/browse/CODEC-125?focusedCommentId=13071566&page=com.atlassian.jira.plugin.system.issuetabpanels: * comment-tabpanel#comment-13071566 * - * @throws EncoderException for some failure scenarios */ + * @throws EncoderException for some failure scenarios. + */ @Test void testEncodeGna() throws EncoderException { final BeiderMorseEncoder bmpm = createGenericApproxEncoder(); bmpm.encode("gna"); } + @Disabled("For performance testing.") + @ParameterizedTest + @ValueSource(ints = { 2000, 8000, 16000, 32000 }) + void testEncodeLarge(final int target) throws EncoderException { + final String[] units = { "a", "e", "i", "o", "u", "ai", "ei", "ou", "au", "ie", "tsch", "sch", "zh", "kh", "ye", "yo" }; + final Random r = new Random(1); + final BeiderMorseEncoder enc = new BeiderMorseEncoder(); // default GENERIC/APPROX, maxPhonemes=20 + final StringBuilder sb = new StringBuilder(); + while (sb.length() < target) { + sb.append(units[r.nextInt(units.length)]); // one long token, no spaces + } + assertTrue(enc.encode(sb.toString()).length() > 0); + } + @Test void testInvalidLangIllegalArgumentException() { assertThrows(IllegalArgumentException.class, () -> Rule.getInstance(NameType.GENERIC, RuleType.APPROX, "noSuchLanguage"));
