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:07 UTC
(commons-codec) 04/04: Add BeiderMorseEncoder.Builder.
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"));