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

thomasm pushed a commit to branch OAK-12110-b
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git

commit 03bc983a345a1f6e083c52e5e07770cf47334061
Author: Thomas Mueller <[email protected]>
AuthorDate: Wed Feb 25 10:25:06 2026 +0100

    OAK-12010 Simplified index management
---
 .../oak/plugins/index/diff/DiffIndex.java          |  2 +-
 .../oak/plugins/index/diff/DiffIndexMerger.java    | 60 +++++++++++-----------
 .../oak/plugins/index/diff/JsonNodeUpdater.java    | 15 +++---
 3 files changed, 38 insertions(+), 39 deletions(-)

diff --git 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/diff/DiffIndex.java
 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/diff/DiffIndex.java
index 6f72a65b5a..abf83d6f98 100644
--- 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/diff/DiffIndex.java
+++ 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/diff/DiffIndex.java
@@ -114,7 +114,7 @@ public class DiffIndex {
                 diffs.getChildren().put("/oak:index/" + diffIndex, diffObj);
             } catch (Exception e) {
                 String message = "Error parsing " + diffIndex;
-                merger.logWarn("{}: {}", message, e.getMessage());
+                merger.logAndCollectWarn("{}: {}", message, e.getMessage());
             }
             if (!diffIndexDefinition.hasProperty("info")) {
                 diffIndexDefinition.setProperty("info", "This diff is 
automatically merged with other indexes. See 
https://oak-indexing.github.io/oakTools/simplified.html";);
diff --git 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/diff/DiffIndexMerger.java
 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/diff/DiffIndexMerger.java
index e3a81b17ff..ca2e31f854 100644
--- 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/diff/DiffIndexMerger.java
+++ 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/diff/DiffIndexMerger.java
@@ -49,56 +49,56 @@ import org.slf4j.LoggerFactory;
  */
 public class DiffIndexMerger {
 
-    private final static Logger LOG = 
LoggerFactory.getLogger(DiffIndexMerger.class);
+    private static final Logger LOG = 
LoggerFactory.getLogger(DiffIndexMerger.class);
 
-    public final static String DIFF_INDEX = "diff.index";
-    public final static String DIFF_INDEX_OPTIMIZER = "diff.index.optimizer";
+    public static final String DIFF_INDEX = "diff.index";
+    public static final String DIFF_INDEX_OPTIMIZER = "diff.index.optimizer";
 
-    public final static String LAST_PROCESSED = ":lastProcessed";
-    public final static String MERGE_CHECKSUM = "mergeChecksum";
+    public static final String LAST_PROCESSED = ":lastProcessed";
+    public static final String MERGE_CHECKSUM = "mergeChecksum";
 
-    private final static String MERGE_INFO = "This index was auto-merged. See 
also https://oak-indexing.github.io/oakTools/simplified.html";;
+    private static final String MERGE_INFO = "This index was auto-merged. See 
also https://oak-indexing.github.io/oakTools/simplified.html";;
 
     // the list of unsupported included paths, e.g. "/apps,/libs"
     // by default all paths are supported
-    private final static String[] UNSUPPORTED_INCLUDED_PATHS = 
System.getProperty(
+    private static final String[] UNSUPPORTED_INCLUDED_PATHS = 
System.getProperty(
             "oak.diffIndex.unsupportedPaths", "").split(",");
 
     // in case a custom index is removed, whether a dummy index is created
-    private final static boolean DELETE_CREATES_DUMMY = Boolean.getBoolean(
+    private static final boolean DELETE_CREATES_DUMMY = Boolean.getBoolean(
             "oak.diffIndex.deleteCreatesDummy");
 
     // in case a customization was removed, create a copy of the OOTB index
-    private final static boolean DELETE_COPIES_OOTB = Boolean.getBoolean(
+    private static final boolean DELETE_COPIES_OOTB = Boolean.getBoolean(
             "oak.diffIndex.deleteCopiesOOTB");
 
     // whether to log at info level
-    private final static boolean LOG_AT_INFO_LEVEL = Boolean.getBoolean(
+    private static final boolean LOG_AT_INFO_LEVEL = Boolean.getBoolean(
             "oak.diffIndex.logAtInfoLevel");
 
     // the set of top-level properties that is not allowed to be added to an 
existing index
-    private final static Set<String> 
REJECTED_TOP_LEVEL_PROPS_FOR_EXISTING_INDEX = Set.of(
+    private static final Set<String> 
REJECTED_TOP_LEVEL_PROPS_FOR_EXISTING_INDEX = Set.of(
             "selectionPolicy", "valueRegex", "queryFilterRegex", 
"includedPaths", "excludedPaths", "queryPaths");
 
     // the set of child properties that is not allowed to be added if the 
property is already indexed
     // eg. the "name" property may not need to be set if the existing property 
doesn't have it yet (eg. a function-based index),
     // or the "function" property may not need to be set unless if it already 
exists (eg. a name-based index)
-    private final static Set<String> REJECTED_ADDING_TO_EXISTING_PROPERTY = 
Set.of(
+    private static final Set<String> REJECTED_ADDING_TO_EXISTING_PROPERTY = 
Set.of(
             "isRegexp", "index", "function", "name");
 
     // set of properties that are allowed to be changed if the property 
already exists
-    private final static Set<String> ALLOW_CHANGING_IN_EXISTING_PROPERTY = 
Set.of(
+    private static final Set<String> ALLOW_CHANGING_IN_EXISTING_PROPERTY = 
Set.of(
             "boost", "weight");
 
     // set of properties that allow multi-valued string that might be merged
-    private final static Set<String> MERGE_MULTI_VALUES_STRINGS = Set.of(
+    private static final Set<String> MERGE_MULTI_VALUES_STRINGS = Set.of(
             "includedPaths", "queryPaths", "tags");
 
     // maximum number of warnings to keep
-    private final static int MAX_WARNINGS = 100;
+    private static final int MAX_WARNINGS = 100;
 
     // maximum total size of warnings (1 MB)
-    private final static int MAX_WARNINGS_SIZE = 1024 * 1024;
+    private static final int MAX_WARNINGS_SIZE = 1024 * 1024;
 
     private String[] unsupportedIncludedPaths;
     private boolean deleteCreatesDummyIndex;
@@ -196,7 +196,7 @@ public class DiffIndexMerger {
             String key = e.getKey();
             JsonObject value = e.getValue();
             if (key.startsWith("/oak:index/")) {
-                logWarn("The key should contain just the index name, without 
the '/oak:index' prefix, for key: {}", key);
+                logAndCollectWarn("The key should contain just the index name, 
without the '/oak:index' prefix, for key: {}", key);
                 key = key.substring("/oak:index/".length());
             }
             log("Processing {}", key);
@@ -234,7 +234,7 @@ public class DiffIndexMerger {
             JsonObject jcrContent = file.getChildren().get("jcr:content");
             if (jcrContent == null) {
                 String message = "jcr:content child node is missing in 
diff.json";
-                logWarn(message);
+                logAndCollectWarn(message);
                 return message;
             }
             String jcrData = JsonNodeUpdater.oakStringValue(jcrContent, 
"jcr:data");
@@ -242,7 +242,7 @@ public class DiffIndexMerger {
                 diff = JsonObject.fromJson(jcrData, true);
             } catch (Exception e) {
                 String message = "Illegal Json, ignoring: " + e.getMessage();
-                logWarn("Illegal Json, ignoring: {}", jcrData, e);
+                logAndCollectWarn("Illegal Json, ignoring: {}", jcrData, e);
                 return message;
             }
         } else {
@@ -383,7 +383,7 @@ public class DiffIndexMerger {
             } else {
                 includedPaths = JsonNodeUpdater.oakStringArrayValue(indexDiff, 
"includedPaths");
                 if (includesUnsupportedPaths(includedPaths)) {
-                    logWarn("New custom index {} is not supported because it 
contains an unsupported path ({})",
+                    logAndCollectWarn("New custom index {} is not supported 
because it contains an unsupported path ({})",
                             indexName, 
Arrays.toString(unsupportedIncludedPaths));
                     return false;
                 }
@@ -391,7 +391,7 @@ public class DiffIndexMerger {
         } else {
             includedPaths = 
JsonNodeUpdater.oakStringArrayValue(latestProductIndex, "includedPaths");
             if (includesUnsupportedPaths(includedPaths)) {
-                logWarn("Customizing index {} is not supported because it 
contains an unsupported path ({})",
+                logAndCollectWarn("Customizing index {} is not supported 
because it contains an unsupported path ({})",
                         latestProductKey, 
Arrays.toString(unsupportedIncludedPaths));
                 return false;
             }
@@ -433,8 +433,8 @@ public class DiffIndexMerger {
                 // (even if checksums do not match: checksums might be missing 
or manipulated)
                 log("Latest index matches");
                 if (latestMergeChecksum != null && 
!latestMergeChecksum.equals(mergeChecksum)) {
-                    logWarn("Indexes do match, but checksums do not. Possibly 
checksum was changed: {} vs {}", latestMergeChecksum, mergeChecksum);
-                    logWarn("Index: {}, latest: {}\nmerged: {}", indexName, 
latestDef, mergedDef);
+                    logAndCollectWarn("Indexes do match, but checksums do not. 
Possibly checksum was changed: {} vs {}", latestMergeChecksum, mergeChecksum);
+                    logAndCollectWarn("Index: {}, latest: {}\nmerged: {}", 
indexName, latestDef, mergedDef);
                 }
                 return false;
             }
@@ -442,8 +442,8 @@ public class DiffIndexMerger {
                 // checksum matches, but data does not match
                 // could be eg. due to numbers formatting issues (-0.0 vs 0.0, 
0.001 vs 1e-3)
                 // but unexpected because we do not normally have such cases
-                logWarn("Indexes do not match, but checksums match. Possible 
normalization issue.");
-                logWarn("Index: {}, latest: {}\nmerged: {}", indexName, 
latestDef, mergedDef);
+                logAndCollectWarn("Indexes do not match, but checksums match. 
Possible normalization issue.");
+                logAndCollectWarn("Index: {}, latest: {}\nmerged: {}", 
indexName, latestDef, mergedDef);
                 // if checksums match, we consider it a match
                 return false;
             }
@@ -733,12 +733,12 @@ public class DiffIndexMerger {
                         && !target.getProperties().containsKey(p)) {
                     // at the top level, some properties (eg. selectionPolicy) 
are not allowed to be added
                     // to an existing index
-                    logWarn("{}: Ignoring new top-level property {} at {} for 
existing index", indexName, p, pathForLogging);
+                    logAndCollectWarn("{}: Ignoring new top-level property {} 
at {} for existing index", indexName, p, pathForLogging);
                     continue;
                 }
                 if (REJECTED_ADDING_TO_EXISTING_PROPERTY.contains(p) && 
!target.getProperties().containsKey(p)) {
                     // some properties are not allowed to be added if the node 
already exists
-                    logWarn("{}: Ignoring new property \"{}\" at {} for 
existing child", indexName, p, pathForLogging);
+                    logAndCollectWarn("{}: Ignoring new property \"{}\" at {} 
for existing child", indexName, p, pathForLogging);
                     continue;
                 }
             }
@@ -755,7 +755,7 @@ public class DiffIndexMerger {
                     // which is not allowed)
                     TreeSet<String> oldSet = 
JsonNodeUpdater.getStringSet(target.getProperties().get(p));
                     TreeSet<String> newSet = 
JsonNodeUpdater.getStringSet(diff.getProperties().get(p));
-                    TreeSet<String> mergedSet = new TreeSet<String>(oldSet);
+                    TreeSet<String> mergedSet = new TreeSet<>(oldSet);
                     mergedSet.addAll(newSet);
                     JsopBuilder buff = new JsopBuilder().array();
                     for(String v : mergedSet) {
@@ -763,7 +763,7 @@ public class DiffIndexMerger {
                     }
                     target.getProperties().put(p, buff.endArray().toString());
                 } else {
-                    logWarn("{}: Ignoring existing property \"{}\" at {}", 
indexName, p, pathForLogging);
+                    logAndCollectWarn("{}: Ignoring existing property \"{}\" 
at {}", indexName, p, pathForLogging);
                 }
             } else {
                 target.getProperties().put(p, diff.getProperties().get(p));
@@ -929,7 +929,7 @@ public class DiffIndexMerger {
      * @param format the log message format
      * @param arguments the log message arguments
      */
-    public void logWarn(String format, Object... arguments) {
+    public void logAndCollectWarn(String format, Object... arguments) {
         String message = 
org.slf4j.helpers.MessageFormatter.arrayFormat(format, arguments).getMessage();
         LOG.warn(message);
         synchronized (warnings) {
diff --git 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/diff/JsonNodeUpdater.java
 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/diff/JsonNodeUpdater.java
index 99e7a74452..4a0d3eee31 100644
--- 
a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/diff/JsonNodeUpdater.java
+++ 
b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/diff/JsonNodeUpdater.java
@@ -16,18 +16,18 @@
  */
 package org.apache.jackrabbit.oak.plugins.index.diff;
 
-import java.util.Map.Entry;
-import java.util.TreeSet;
+import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
+
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Base64;
+import java.util.Map.Entry;
+import java.util.TreeSet;
 import java.util.UUID;
 
-import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
 import org.apache.jackrabbit.oak.api.Blob;
-import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.commons.PathUtils;
@@ -71,11 +71,10 @@ public class JsonNodeUpdater {
      * @param targetPath the target path (relative to the builder) where the 
node(s) is/are replaced
      * @param nodeType the node type of the new node (eg. "nt:unstructured")
      * @param jsonString the json string with the node data
-     * @throws CommitFailedException if storing the nodes failed
      * @throws IOException if storing a blob failed
      */
-    public static void addOrReplace(NodeBuilder builder, NodeStore nodeStore, 
String targetPath, 
-            String nodeType, String jsonString) throws CommitFailedException, 
IOException {
+    public static void addOrReplace(NodeBuilder builder, NodeStore nodeStore, 
String targetPath,
+            String nodeType, String jsonString) throws IOException {
         LOG.info("Storing {}: {}", targetPath, jsonString);
         if (nodeType.contains("/")) {
             throw new IllegalStateException("Illegal node type: " + nodeType);
@@ -250,7 +249,7 @@ public class JsonNodeUpdater {
     /**
      * Parse a raw JSON value and convert it to a set of strings. Also 
supported is a single string value.
      * Everything else (numbers, booleans, etc.) is not supported and returns 
null.
-     * 
+     *
      * @param value the raw JSON value
      * @return a set of strings or null
      */

Reply via email to