You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2026/08/07 17:30:03 UTC

(commons-codec) branch master updated (4611565f -> 897df72a)

This is an automated email from the ASF dual-hosted git repository.

garydgregory pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/commons-codec.git


    from 4611565f Allocate a single MessageDigest and use it in Sha2Crypt.sha2Crypt(byte[], String, String, int, String).
     new 4f3b1d9b Extract local variable.
     new c27646bd Javadoc
     new 5a0b429a Assign result of requireNonNull.
     new 897df72a Add BeiderMorseEncoder.Builder.

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 src/changes/changes.xml                            |  1 +
 .../codec/language/bm/BeiderMorseEncoder.java      | 54 ++++++++++++++++++++--
 .../commons/codec/language/bm/PhoneticEngine.java  |  8 ++--
 .../codec/language/bm/BeiderMorseEncoderTest.java  | 23 ++++++++-
 4 files changed, 76 insertions(+), 10 deletions(-)


(commons-codec) 02/04: Javadoc

Posted by gg...@apache.org.
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 c27646bd066760a0a2d0a402a99c39f6583e512d
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Thu Aug 6 16:39:01 2026 -0400

    Javadoc
    
    Private class doesn't need @since tag.
---
 src/main/java/org/apache/commons/codec/language/bm/PhoneticEngine.java | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/main/java/org/apache/commons/codec/language/bm/PhoneticEngine.java b/src/main/java/org/apache/commons/codec/language/bm/PhoneticEngine.java
index 18e697e5..ac4b2b35 100644
--- a/src/main/java/org/apache/commons/codec/language/bm/PhoneticEngine.java
+++ b/src/main/java/org/apache/commons/codec/language/bm/PhoneticEngine.java
@@ -235,8 +235,6 @@ public class PhoneticEngine {
      * Although this class is not thread-safe (it has mutable unprotected fields), it is not shared between threads as it is constructed as needed by the
      * calling methods.
      * </p>
-     *
-     * @since 1.6
      */
     private static final class RulesApplication {
 


(commons-codec) 01/04: Extract local variable.

Posted by gg...@apache.org.
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 4f3b1d9bc6b48b9c390b432a93212fadc1fc2bde
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Thu Aug 6 16:36:25 2026 -0400

    Extract local variable.
---
 src/main/java/org/apache/commons/codec/language/bm/PhoneticEngine.java | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/main/java/org/apache/commons/codec/language/bm/PhoneticEngine.java b/src/main/java/org/apache/commons/codec/language/bm/PhoneticEngine.java
index 5e70ecfe..18e697e5 100644
--- a/src/main/java/org/apache/commons/codec/language/bm/PhoneticEngine.java
+++ b/src/main/java/org/apache/commons/codec/language/bm/PhoneticEngine.java
@@ -403,7 +403,8 @@ public class PhoneticEngine {
         phonemeBuilder.getPhonemes().forEach(phoneme -> {
             PhonemeBuilder subBuilder = PhonemeBuilder.empty(phoneme.getLanguages());
             final CharSequence phonemeText = phoneme.getPhonemeText();
-            for (int i = 0; i < phonemeText.length();) {
+            final int length = phonemeText.length();
+            for (int i = 0; i < length;) {
                 final RulesApplication rulesApplication = new RulesApplication(finalRules, phonemeText, subBuilder, i, maxPhonemes).invoke();
                 final boolean found = rulesApplication.isFound();
                 subBuilder = rulesApplication.getPhonemeBuilder();


(commons-codec) 04/04: Add BeiderMorseEncoder.Builder.

Posted by gg...@apache.org.
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 <ga...@gmail.com>
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"));


(commons-codec) 03/04: Assign result of requireNonNull.

Posted by gg...@apache.org.
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 5a0b429ad1f6346bee5d49788ff82e19140cb6ee
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Thu Aug 6 16:39:44 2026 -0400

    Assign result of requireNonNull.
---
 src/main/java/org/apache/commons/codec/language/bm/PhoneticEngine.java | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/src/main/java/org/apache/commons/codec/language/bm/PhoneticEngine.java b/src/main/java/org/apache/commons/codec/language/bm/PhoneticEngine.java
index ac4b2b35..a92771ec 100644
--- a/src/main/java/org/apache/commons/codec/language/bm/PhoneticEngine.java
+++ b/src/main/java/org/apache/commons/codec/language/bm/PhoneticEngine.java
@@ -252,8 +252,7 @@ public class PhoneticEngine {
 
         RulesApplication(final Map<String, List<Rule>> finalRules, final CharSequence input, final PhonemeBuilder phonemeBuilder, final int i,
                 final int maxPhonemes) {
-            Objects.requireNonNull(finalRules, "finalRules");
-            this.finalRules = finalRules;
+            this.finalRules = Objects.requireNonNull(finalRules, "finalRules");
             this.phonemeBuilder = phonemeBuilder;
             this.input = input;
             this.i = i;