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

reschke pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 115f294968 OAK-11753: Remove usage of Guava base.CaseFormat (#2336)
115f294968 is described below

commit 115f294968ac589a0eb138a3f68b3afabd74b2ef
Author: Julian Reschke <resc...@apache.org>
AuthorDate: Wed Jul 2 21:19:11 2025 +0200

    OAK-11753: Remove usage of Guava base.CaseFormat (#2336)
---
 .../index/elastic/index/ElasticCustomAnalyzer.java |  3 +--
 .../index/ElasticCustomAnalyzerMappings.java       |  3 +--
 .../index/elastic/index/ElasticIndexHelper.java    | 22 ++++++++++++++++++++++
 .../elastic/index/ElasticIndexHelperTest.java      | 19 +++++++++++++++++++
 4 files changed, 43 insertions(+), 4 deletions(-)

diff --git 
a/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticCustomAnalyzer.java
 
b/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticCustomAnalyzer.java
index 78eb71460b..95d5c22ebc 100644
--- 
a/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticCustomAnalyzer.java
+++ 
b/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticCustomAnalyzer.java
@@ -24,7 +24,6 @@ import 
co.elastic.clients.elasticsearch._types.analysis.TokenFilterDefinition;
 import co.elastic.clients.elasticsearch._types.analysis.TokenizerDefinition;
 import co.elastic.clients.elasticsearch.indices.IndexSettingsAnalysis;
 import co.elastic.clients.json.JsonData;
-import org.apache.jackrabbit.guava.common.base.CaseFormat;
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.oak.api.Blob;
 import org.apache.jackrabbit.oak.api.PropertyState;
@@ -350,7 +349,7 @@ public class ElasticCustomAnalyzer {
         // and take the last part
         String name = anlClassTokens[anlClassTokens.length - 1];
         // all options in elastic are in snake case
-        name = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, name);
+        name = ElasticIndexHelper.convertUpperCamelToLowerUnderscore(name);
         // if it ends with analyzer we need to get rid of it
         if (name.endsWith("_analyzer")) {
             name = name.substring(0, name.length() - "_analyzer".length());
diff --git 
a/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticCustomAnalyzerMappings.java
 
b/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticCustomAnalyzerMappings.java
index 640c85e9c9..24d580c180 100644
--- 
a/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticCustomAnalyzerMappings.java
+++ 
b/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticCustomAnalyzerMappings.java
@@ -16,7 +16,6 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.elastic.index;
 
-import org.apache.jackrabbit.guava.common.base.CaseFormat;
 import org.apache.lucene.analysis.AbstractAnalysisFactory;
 import org.apache.lucene.analysis.charfilter.MappingCharFilterFactory;
 import org.apache.lucene.analysis.cjk.CJKBigramFilterFactory;
@@ -233,7 +232,7 @@ public class ElasticCustomAnalyzerMappings {
         LUCENE_ELASTIC_TRANSFORMERS.put(AbstractAnalysisFactory.class, 
luceneParams ->
                 luceneParams.entrySet().stream()
                         .collect(Collectors.toMap(
-                                entry -> 
CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, entry.getKey()),
+                                entry -> 
ElasticIndexHelper.convertUpperCamelToLowerUnderscore(entry.getKey()),
                                 Map.Entry::getValue, // keep the original value
                                 (oldValue, newValue) -> oldValue, // in case 
of duplicate keys, keep the old value
                                 LinkedHashMap::new // preserve the original 
order
diff --git 
a/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticIndexHelper.java
 
b/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticIndexHelper.java
index f7f40c0450..fe484d7b1f 100644
--- 
a/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticIndexHelper.java
+++ 
b/oak-search-elastic/src/main/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticIndexHelper.java
@@ -408,6 +408,28 @@ class ElasticIndexHelper {
         return typeMapping.properties();
     }
 
+    /**
+     * Convert a String from (upper case) CamelCase to lowercase underscore
+     * @param string
+     * @return converted string (best effort)
+     */
+    protected static String convertUpperCamelToLowerUnderscore(String string) {
+        StringBuilder result = new StringBuilder();
+        for (char c : string.toCharArray()) {
+            // start?
+            if (result.length() == 0) {
+                result.append(Character.toLowerCase(c));
+            } else {
+                if (Character.isUpperCase(c)) {
+                    result.append('_');
+                }
+                result.append(Character.toLowerCase(c));
+            }
+        }
+
+        return result.toString();
+    }
+
     // 
https://discuss.elastic.co/t/reusing-internal-implementation-to-transform-json-mapping-to-es-mapping/300597/3
 
     /**
diff --git 
a/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticIndexHelperTest.java
 
b/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticIndexHelperTest.java
index 02b28fb016..0186f459ef 100644
--- 
a/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticIndexHelperTest.java
+++ 
b/oak-search-elastic/src/test/java/org/apache/jackrabbit/oak/plugins/index/elastic/index/ElasticIndexHelperTest.java
@@ -36,6 +36,7 @@ import org.jetbrains.annotations.NotNull;
 import org.junit.Test;
 
 import java.util.Map;
+import java.util.function.Function;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.notNullValue;
@@ -392,4 +393,22 @@ public class ElasticIndexHelperTest {
         assertThat(status._kind(), is(Property.Kind.Keyword));
     }
 
+    private void testCamelConversion(Function<String, String> f) {
+        assertEquals("foo_bar", f.apply("FooBar"));
+        assertEquals("foo_bar", f.apply("fooBar"));
+        assertEquals("foo _bar", f.apply("foo Bar"));
+        assertEquals("foo _bar", f.apply("Foo Bar"));
+        assertEquals("f_o_o__b_a_r", f.apply("FOO_BAR"));
+        assertEquals("foo__bar", f.apply("Foo_Bar"));
+        assertEquals("foo_bar ", f.apply("FooBar "));
+        assertEquals(" _foo_bar", f.apply(" FooBar"));
+        assertEquals(" _foo_bar", f.apply(" FooBar"));
+    }
+
+
+    // verify that convertUpperCamelToLowerUnderscore does what it's supposed 
to do (see OAK-11753)
+    @Test
+    public void testCamelConversionOurs() {
+        
testCamelConversion(ElasticIndexHelper::convertUpperCamelToLowerUnderscore);
+    }
 }

Reply via email to