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"));

Reply via email to