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); + } }