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

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git


The following commit(s) were added to refs/heads/master by this push:
     new 7536d45ada [UPDATE] Update OpenSearch driver (fixes minor CVEs and 
drop code)
7536d45ada is described below

commit 7536d45ada1d3b7ba83cd2020ba862f294125c6d
Author: Benoit TELLIER <[email protected]>
AuthorDate: Thu Jan 25 08:49:48 2024 +0100

    [UPDATE] Update OpenSearch driver (fixes minor CVEs and drop code)
---
 backends-common/opensearch/pom.xml                 |   4 +-
 .../james/backends/opensearch/ClientProvider.java  |   2 +-
 .../opensearch/json/JsonpDeserializerBase.java     | 397 ---------------------
 .../backends/opensearch/json/JsonpMapperBase.java  | 102 ------
 .../james/backends/opensearch/json/JsonpUtils.java | 207 -----------
 .../json/UnexpectedJsonEventException.java         |  40 ---
 .../json/jackson/JacksonJsonProvider.java          | 298 ----------------
 .../json/jackson/JacksonJsonpGenerator.java        | 374 -------------------
 .../json/jackson/JacksonJsonpLocation.java         |  54 ---
 .../json/jackson/JacksonJsonpMapper.java           | 123 -------
 .../json/jackson/JacksonJsonpParser.java           | 313 ----------------
 .../opensearch/json/jackson/JacksonUtils.java      |  43 ---
 .../opensearch/json/jackson/JsonValueParser.java   | 108 ------
 .../backends/opensearch/json/package-info.java     |  29 --
 14 files changed, 3 insertions(+), 2091 deletions(-)

diff --git a/backends-common/opensearch/pom.xml 
b/backends-common/opensearch/pom.xml
index c78ac542f5..0c769f6e20 100644
--- a/backends-common/opensearch/pom.xml
+++ b/backends-common/opensearch/pom.xml
@@ -83,12 +83,12 @@
         <dependency>
             <groupId>org.opensearch.client</groupId>
             <artifactId>opensearch-java</artifactId>
-            <version>2.6.0</version>
+            <version>2.8.1</version>
         </dependency>
         <dependency>
             <groupId>org.opensearch.client</groupId>
             <artifactId>opensearch-rest-client</artifactId>
-            <version>2.8.0</version>
+            <version>2.11.1</version>
         </dependency>
         <dependency>
             <groupId>org.slf4j</groupId>
diff --git 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/ClientProvider.java
 
b/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/ClientProvider.java
index d253fc6d6b..105a7bf2e2 100644
--- 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/ClientProvider.java
+++ 
b/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/ClientProvider.java
@@ -44,9 +44,9 @@ import org.apache.http.impl.client.BasicCredentialsProvider;
 import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
 import org.apache.http.ssl.SSLContextBuilder;
 import org.apache.http.ssl.TrustStrategy;
-import org.apache.james.backends.opensearch.json.jackson.JacksonJsonpMapper;
 import org.apache.james.util.concurrent.NamedThreadFactory;
 import org.opensearch.client.RestClient;
+import org.opensearch.client.json.jackson.JacksonJsonpMapper;
 import org.opensearch.client.opensearch.OpenSearchAsyncClient;
 import org.opensearch.client.transport.rest_client.RestClientTransport;
 import org.slf4j.Logger;
diff --git 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/JsonpDeserializerBase.java
 
b/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/JsonpDeserializerBase.java
deleted file mode 100644
index c790e4ab2c..0000000000
--- 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/JsonpDeserializerBase.java
+++ /dev/null
@@ -1,397 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.backends.opensearch.json;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.opensearch.client.json.JsonpDeserializer;
-import org.opensearch.client.json.JsonpMapper;
-
-import jakarta.json.JsonNumber;
-import jakarta.json.JsonValue;
-import jakarta.json.stream.JsonParser;
-import jakarta.json.stream.JsonParser.Event;
-import jakarta.json.stream.JsonParsingException;
-
-/**
- * Base class for {@link JsonpDeserializer} implementations that accept a set 
of JSON events known at instanciation time.
- */
-public abstract class JsonpDeserializerBase<V> implements JsonpDeserializer<V> 
{
-
-    private final EnumSet<Event> acceptedEvents;
-    private final EnumSet<Event> nativeEvents;
-
-    protected JsonpDeserializerBase(EnumSet<Event> acceptedEvents) {
-        this(acceptedEvents, acceptedEvents);
-    }
-
-    protected JsonpDeserializerBase(EnumSet<Event> acceptedEvents, 
EnumSet<Event> nativeEvents) {
-        this.acceptedEvents = acceptedEvents;
-        this.nativeEvents = nativeEvents;
-    }
-
-    /** Combines accepted events from a number of deserializers */
-    protected static EnumSet<Event> allAcceptedEvents(JsonpDeserializer<?>... 
deserializers) {
-        EnumSet<Event> result = EnumSet.noneOf(Event.class);
-        for (JsonpDeserializer<?> deserializer: deserializers) {
-
-            EnumSet<Event> set = deserializer.acceptedEvents();
-            // Disabled for now. Only happens with the experimental Union2 and 
is caused by string and number
-            // parsers leniency. Need to be replaced with a check on a 
preferred event type.
-            //if (!Collections.disjoint(result, set)) {
-            //    throw new IllegalArgumentException("Deserializer accepted 
events are not disjoint");
-            //}
-
-            result.addAll(set);
-        }
-        return result;
-    }
-
-    @Override
-    public EnumSet<Event> nativeEvents() {
-        return nativeEvents;
-    }
-
-    /**
-     * The JSON events this deserializer accepts as a starting point
-     */
-    public final EnumSet<Event> acceptedEvents() {
-        return acceptedEvents;
-    }
-
-    /**
-     * Convenience method for {@code acceptedEvents.contains(event)}
-     */
-    public final boolean accepts(Event event) {
-        return acceptedEvents.contains(event);
-    }
-
-    
//---------------------------------------------------------------------------------------------
-
-    //----- Builtin types
-
-    static final JsonpDeserializer<String> STRING =
-        // String parsing is lenient and accepts any other primitive type
-        new JsonpDeserializerBase<String>(EnumSet.of(
-                Event.KEY_NAME, Event.VALUE_STRING, Event.VALUE_NUMBER,
-                Event.VALUE_FALSE, Event.VALUE_TRUE
-            ),
-            EnumSet.of(Event.VALUE_STRING)
-        ) {
-            @Override
-            public String deserialize(JsonParser parser, JsonpMapper mapper, 
Event event) {
-                if (event == Event.VALUE_TRUE) {
-                    return "true";
-                }
-                if (event == Event.VALUE_FALSE) {
-                    return "false";
-                }
-                return parser.getString(); // also accepts numbers
-            }
-        };
-
-    static final JsonpDeserializer<Integer> INTEGER =
-        new JsonpDeserializerBase<Integer>(
-            EnumSet.of(Event.VALUE_NUMBER, Event.VALUE_STRING),
-            EnumSet.of(Event.VALUE_NUMBER)
-        ) {
-            @Override
-            public Integer deserialize(JsonParser parser, JsonpMapper mapper, 
Event event) {
-                if (event == Event.VALUE_STRING) {
-                    return Integer.valueOf(parser.getString());
-                }
-                return parser.getInt();
-            }
-        };
-
-    static final JsonpDeserializer<Boolean> BOOLEAN =
-        new JsonpDeserializerBase<Boolean>(
-            EnumSet.of(Event.VALUE_FALSE, Event.VALUE_TRUE, 
Event.VALUE_STRING),
-            EnumSet.of(Event.VALUE_FALSE, Event.VALUE_TRUE)
-        ) {
-            @Override
-            public Boolean deserialize(JsonParser parser, JsonpMapper mapper, 
Event event) {
-                if (event == Event.VALUE_STRING) {
-                    return Boolean.parseBoolean(parser.getString());
-                } else {
-                    return event == Event.VALUE_TRUE;
-                }
-            }
-        };
-
-    static final JsonpDeserializer<Long> LONG =
-        new JsonpDeserializerBase<Long>(
-            EnumSet.of(Event.VALUE_NUMBER, Event.VALUE_STRING),
-            EnumSet.of(Event.VALUE_NUMBER)
-        ) {
-            @Override
-            public Long deserialize(JsonParser parser, JsonpMapper mapper, 
Event event) {
-                if (event == Event.VALUE_STRING) {
-                    return Long.valueOf(parser.getString());
-                }
-                return parser.getLong();
-            }
-        };
-
-    static final JsonpDeserializer<Float> FLOAT =
-        new JsonpDeserializerBase<Float>(
-            EnumSet.of(Event.VALUE_NUMBER, Event.VALUE_STRING),
-            EnumSet.of(Event.VALUE_NUMBER)
-
-        ) {
-            @Override
-            public Float deserialize(JsonParser parser, JsonpMapper mapper, 
Event event) {
-                if (event == Event.VALUE_STRING) {
-                    return Float.valueOf(parser.getString());
-                }
-                return parser.getBigDecimal().floatValue();
-            }
-        };
-
-    static final JsonpDeserializer<Double> DOUBLE =
-        new JsonpDeserializerBase<Double>(
-            EnumSet.of(Event.VALUE_NUMBER, Event.VALUE_STRING),
-            EnumSet.of(Event.VALUE_NUMBER)
-        ) {
-            @Override
-            public Double deserialize(JsonParser parser, JsonpMapper mapper, 
Event event) {
-                if (event == Event.VALUE_STRING) {
-                    return Double.valueOf(parser.getString());
-                }
-                return parser.getBigDecimal().doubleValue();
-            }
-        };
-
-    static final class DoubleOrNullDeserializer extends 
JsonpDeserializerBase<Double> {
-        static final EnumSet<Event> nativeEvents = 
EnumSet.of(Event.VALUE_NUMBER, Event.VALUE_NULL);
-        static final EnumSet<Event> acceptedEvents = 
EnumSet.of(Event.VALUE_STRING, Event.VALUE_NUMBER, Event.VALUE_NULL);
-        private final double defaultValue;
-
-        DoubleOrNullDeserializer(double defaultValue) {
-            super(acceptedEvents, nativeEvents);
-            this.defaultValue = defaultValue;
-        }
-
-        @Override
-        public Double deserialize(JsonParser parser, JsonpMapper mapper, Event 
event) {
-            if (event == Event.VALUE_NULL) {
-                return defaultValue;
-            }
-            if (event == Event.VALUE_STRING) {
-                return Double.valueOf(parser.getString());
-            }
-            return parser.getBigDecimal().doubleValue();
-        }
-    }
-
-    static final class IntOrNullDeserializer extends 
JsonpDeserializerBase<Integer> {
-        static final EnumSet<Event> nativeEvents = 
EnumSet.of(Event.VALUE_NUMBER, Event.VALUE_NULL);
-        static final EnumSet<Event> acceptedEvents = 
EnumSet.of(Event.VALUE_STRING, Event.VALUE_NUMBER, Event.VALUE_NULL);
-        private final int defaultValue;
-
-        IntOrNullDeserializer(int defaultValue) {
-            super(acceptedEvents, nativeEvents);
-            this.defaultValue = defaultValue;
-        }
-
-        @Override
-        public Integer deserialize(JsonParser parser, JsonpMapper mapper, 
Event event) {
-            if (event == Event.VALUE_NULL) {
-                return defaultValue;
-            }
-            if (event == Event.VALUE_STRING) {
-                return Integer.valueOf(parser.getString());
-            }
-            return parser.getInt();
-        }
-    }
-
-    static final class StringOrNullDeserializer extends 
JsonpDeserializerBase<String> {
-        static final EnumSet<Event> nativeEvents = 
EnumSet.of(Event.VALUE_STRING, Event.VALUE_NULL);
-        static final EnumSet<Event> acceptedEvents = 
EnumSet.of(Event.KEY_NAME, Event.VALUE_STRING,
-            Event.VALUE_NUMBER, Event.VALUE_FALSE, Event.VALUE_TRUE, 
Event.VALUE_NULL);
-
-        StringOrNullDeserializer() {
-            super(acceptedEvents, nativeEvents);
-        }
-
-        @Override
-        public String deserialize(JsonParser parser, JsonpMapper mapper, Event 
event) {
-            if (event == Event.VALUE_NULL) {
-                return null;
-            }
-            if (event == Event.VALUE_TRUE) {
-                return "true";
-            }
-            if (event == Event.VALUE_FALSE) {
-                return "false";
-            }
-            return parser.getString();
-        }
-    }
-
-    static final JsonpDeserializer<Double> DOUBLE_OR_NAN =
-        new JsonpDeserializerBase<Double>(
-            EnumSet.of(Event.VALUE_NUMBER, Event.VALUE_STRING, 
Event.VALUE_NULL),
-            EnumSet.of(Event.VALUE_NUMBER, Event.VALUE_NULL)
-        ) {
-            @Override
-            public Double deserialize(JsonParser parser, JsonpMapper mapper, 
Event event) {
-                if (event == Event.VALUE_NULL) {
-                    return Double.NaN;
-                }
-                if (event == Event.VALUE_STRING) {
-                    return Double.valueOf(parser.getString());
-                }
-                return parser.getBigDecimal().doubleValue();
-            }
-        };
-
-    static final JsonpDeserializer<Number> NUMBER =
-        new JsonpDeserializerBase<Number>(
-            EnumSet.of(Event.VALUE_NUMBER, Event.VALUE_STRING),
-            EnumSet.of(Event.VALUE_NUMBER)
-        ) {
-            @Override
-            public Number deserialize(JsonParser parser, JsonpMapper mapper, 
Event event) {
-                if (event == Event.VALUE_STRING) {
-                    return Double.valueOf(parser.getString());
-                }
-                return ((JsonNumber)parser.getValue()).numberValue();
-            }
-        };
-
-    static final JsonpDeserializer<JsonValue> JSON_VALUE =
-        new JsonpDeserializerBase<JsonValue>(
-            EnumSet.allOf(Event.class)
-        ) {
-            @Override
-            public JsonValue deserialize(JsonParser parser, JsonpMapper 
mapper, Event event) {
-                return parser.getValue();
-            }
-        };
-
-    static final JsonpDeserializer<Void> VOID = new 
JsonpDeserializerBase<Void>(
-        EnumSet.noneOf(Event.class)
-    ) {
-        @Override
-        public Void deserialize(JsonParser parser, JsonpMapper mapper) {
-            throw new JsonParsingException("Void types should not have any 
value", parser.getLocation());
-        }
-
-        @Override
-        public Void deserialize(JsonParser parser, JsonpMapper mapper, Event 
event) {
-            return deserialize(parser, mapper);
-        }
-    };
-
-    //----- Collections
-
-    static class ArrayDeserializer<T> implements JsonpDeserializer<List<T>> {
-        private final JsonpDeserializer<T> itemDeserializer;
-        private EnumSet<Event> acceptedEvents;
-        private static final EnumSet<Event> nativeEvents = 
EnumSet.of(Event.START_ARRAY);
-
-        protected ArrayDeserializer(JsonpDeserializer<T> itemDeserializer) {
-            this.itemDeserializer = itemDeserializer;
-        }
-
-        @Override
-        public EnumSet<Event> nativeEvents() {
-            return nativeEvents;
-        }
-
-        @Override
-        public EnumSet<Event> acceptedEvents() {
-            // Accepted events is computed lazily
-            // no need for double-checked lock, we don't care about computing 
it several times
-            if (acceptedEvents == null) {
-                acceptedEvents = EnumSet.of(Event.START_ARRAY);
-                acceptedEvents.addAll(itemDeserializer.acceptedEvents());
-            }
-            return acceptedEvents;
-        }
-
-        @Override
-        public List<T> deserialize(JsonParser parser, JsonpMapper mapper, 
Event event) {
-            if (event == Event.START_ARRAY) {
-                List<T> result = new ArrayList<>();
-                while ((event = parser.next()) != Event.END_ARRAY) {
-                    JsonpUtils.ensureAccepts(itemDeserializer, parser, event);
-                    result.add(itemDeserializer.deserialize(parser, mapper, 
event));
-                }
-                return result;
-            } else {
-                // Single-value mode
-                JsonpUtils.ensureAccepts(itemDeserializer, parser, event);
-                return 
Collections.singletonList(itemDeserializer.deserialize(parser, mapper, event));
-            }
-        }
-    }
-
-    static class StringMapDeserializer<T> extends 
JsonpDeserializerBase<Map<String, T>> {
-        private final JsonpDeserializer<T> itemDeserializer;
-
-        protected StringMapDeserializer(JsonpDeserializer<T> itemDeserializer) 
{
-            super(EnumSet.of(Event.START_OBJECT));
-            this.itemDeserializer = itemDeserializer;
-        }
-
-        @Override
-        public Map<String, T> deserialize(JsonParser parser, JsonpMapper 
mapper, Event event) {
-            Map<String, T> result = new HashMap<>();
-            while ((event = parser.next()) != Event.END_OBJECT) {
-                JsonpUtils.expectEvent(parser, Event.KEY_NAME, event);
-                String key = parser.getString();
-                T value = itemDeserializer.deserialize(parser, mapper);
-                result.put(key, value);
-            }
-            return result;
-        }
-    }
-
-    static class EnumMapDeserializer<K, V> extends 
JsonpDeserializerBase<Map<K, V>> {
-        private final JsonpDeserializer<K> keyDeserializer;
-        private final JsonpDeserializer<V> valueDeserializer;
-
-        protected EnumMapDeserializer(JsonpDeserializer<K> keyDeserializer, 
JsonpDeserializer<V> valueDeserializer) {
-            super(EnumSet.of(Event.START_OBJECT));
-            this.keyDeserializer = keyDeserializer;
-            this.valueDeserializer = valueDeserializer;
-        }
-
-        @Override
-        public Map<K, V> deserialize(JsonParser parser, JsonpMapper mapper, 
Event event) {
-            Map<K, V> result = new HashMap<>();
-            while ((event = parser.next()) != Event.END_OBJECT) {
-                JsonpUtils.expectEvent(parser, Event.KEY_NAME, event);
-                K key = keyDeserializer.deserialize(parser, mapper, event);
-                V value = valueDeserializer.deserialize(parser, mapper);
-                result.put(key, value);
-            }
-            return result;
-        }
-    }
-}
diff --git 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/JsonpMapperBase.java
 
b/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/JsonpMapperBase.java
deleted file mode 100644
index 5a710795b8..0000000000
--- 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/JsonpMapperBase.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.backends.opensearch.json;
-
-import java.lang.reflect.Field;
-
-import javax.annotation.Nullable;
-
-import org.opensearch.client.json.JsonpDeserializable;
-import org.opensearch.client.json.JsonpDeserializer;
-import org.opensearch.client.json.JsonpMapper;
-import org.opensearch.client.json.JsonpSerializable;
-import org.opensearch.client.json.JsonpSerializer;
-
-import jakarta.json.JsonValue;
-import jakarta.json.stream.JsonGenerator;
-import jakarta.json.stream.JsonParser;
-
-public abstract class JsonpMapperBase implements JsonpMapper {
-
-    /** Get a serializer when none of the builtin ones are applicable */
-    protected abstract <T> JsonpDeserializer<T> 
getDefaultDeserializer(Class<T> clazz);
-
-    @Override
-    public <T> T deserialize(JsonParser parser, Class<T> clazz) {
-        JsonpDeserializer<T> deserializer = findDeserializer(clazz);
-        if (deserializer != null) {
-            return deserializer.deserialize(parser, this);
-        }
-
-        return getDefaultDeserializer(clazz).deserialize(parser, this);
-    }
-
-    @Nullable
-    @SuppressWarnings("unchecked")
-    public static <T> JsonpDeserializer<T> findDeserializer(Class<T> clazz) {
-        JsonpDeserializable annotation = 
clazz.getAnnotation(JsonpDeserializable.class);
-        if (annotation != null) {
-            try {
-                Field field = clazz.getDeclaredField(annotation.field());
-                return (JsonpDeserializer<T>)field.get(null);
-            } catch (Exception e) {
-                throw new RuntimeException("No deserializer found in '" + 
clazz.getName() + "." + annotation.field() + "'");
-            }
-        }
-
-        return null;
-    }
-
-    @Nullable
-    @SuppressWarnings("unchecked")
-    public static <T> JsonpSerializer<T> findSerializer(T value) {
-        Class<?> valueClass = value.getClass();
-        if (JsonpSerializable.class.isAssignableFrom(valueClass)) {
-            return (JsonpSerializer<T>) JsonpSerializableSerializer.INSTANCE;
-        }
-
-        if (JsonValue.class.isAssignableFrom(valueClass)) {
-            return (JsonpSerializer<T>) JsonpValueSerializer.INSTANCE;
-        }
-
-        return null;
-    }
-
-    protected static class JsonpSerializableSerializer<T extends 
JsonpSerializable> implements JsonpSerializer<T> {
-        @Override
-        public void serialize(T value, JsonGenerator generator, JsonpMapper 
mapper) {
-            value.serialize(generator, mapper);
-        }
-
-        protected static final JsonpSerializer<?> INSTANCE = new 
JsonpSerializableSerializer<>();
-
-    }
-
-    protected static class JsonpValueSerializer implements 
JsonpSerializer<JsonValue> {
-        @Override
-        public void serialize(JsonValue value, JsonGenerator generator, 
JsonpMapper mapper) {
-            generator.write(value);
-        }
-
-        protected static final JsonpSerializer<?> INSTANCE = new 
JsonpValueSerializer();
-
-    }
-
-}
diff --git 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/JsonpUtils.java
 
b/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/JsonpUtils.java
deleted file mode 100644
index 5694a5cbee..0000000000
--- 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/JsonpUtils.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.backends.opensearch.json;
-
-import java.io.StringReader;
-import java.util.AbstractMap;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-import javax.annotation.Nullable;
-
-import org.opensearch.client.json.JsonpDeserializer;
-import org.opensearch.client.json.JsonpMapper;
-import org.opensearch.client.json.JsonpSerializable;
-import org.opensearch.client.json.JsonpSerializer;
-import org.opensearch.client.util.ObjectBuilder;
-
-import jakarta.json.JsonObject;
-import jakarta.json.JsonString;
-import jakarta.json.JsonValue;
-import jakarta.json.stream.JsonGenerator;
-import jakarta.json.stream.JsonParser;
-import jakarta.json.stream.JsonParser.Event;
-import jakarta.json.stream.JsonParsingException;
-
-public class JsonpUtils {
-
-    /**
-     * Advances the parser to the next event and checks that this even is the 
expected one.
-     *
-     * @return the expected event
-     *
-     * @throws jakarta.json.JsonException if an i/o error occurs (IOException 
would be cause of JsonException)
-     * @throws JsonParsingException if the event is not the expected one, or 
if the parser encounters invalid
-     *         JSON when advancing to next state.
-     * @throws java.util.NoSuchElementException if there are no more parsing 
states.
-     */
-    public static Event expectNextEvent(JsonParser parser, Event expected) {
-        Event event = parser.next();
-        expectEvent(parser, expected, event);
-        return event;
-    }
-
-    public static void expectEvent(JsonParser parser, Event expected, Event 
event) {
-        if (event != expected) {
-            throw new UnexpectedJsonEventException(parser, event, expected);
-        }
-    }
-
-    public static String expectKeyName(JsonParser parser, Event event) {
-        JsonpUtils.expectEvent(parser, Event.KEY_NAME, event);
-        return parser.getString();
-    }
-
-    public static void ensureAccepts(JsonpDeserializer<?> deserializer, 
JsonParser parser, Event event) {
-        if (!deserializer.acceptedEvents().contains(event)) {
-            throw new UnexpectedJsonEventException(parser, event, 
deserializer.acceptedEvents());
-        }
-    }
-
-    /**
-     * Skip the value at the next position of the parser.
-     */
-    public static void skipValue(JsonParser parser) {
-        skipValue(parser, parser.next());
-    }
-
-    /**
-     * Skip the value at the current position of the parser.
-     */
-    public static void skipValue(JsonParser parser, Event event) {
-        switch (event) {
-            case START_OBJECT:
-                parser.skipObject();
-                break;
-
-            case START_ARRAY:
-                parser.skipArray();
-                break;
-
-            default:
-                // Not a structure, no additional skipping needed
-                break;
-        }
-    }
-
-    public static <T> T buildVariant(JsonParser parser, ObjectBuilder<T> 
builder) {
-        if (builder == null) {
-            throw new JsonParsingException("No variant found", 
parser.getLocation());
-        }
-        return builder.build();
-    }
-
-    public static <T> void serialize(T value, JsonGenerator generator, 
@Nullable JsonpSerializer<T> serializer, JsonpMapper mapper) {
-        if (serializer != null) {
-            serializer.serialize(value, generator, mapper);
-        } else if (value instanceof JsonpSerializable) {
-            ((JsonpSerializable) value).serialize(generator, mapper);
-        } else {
-            mapper.serialize(value, generator);
-        }
-    }
-
-    /**
-     * Looks ahead a field value in the Json object from the upcoming object 
in a parser, which should be on the
-     * START_OBJECT event.
-     *
-     * Returns a pair containing that value and a parser that should be used 
to actually parse the object
-     * (the object has been consumed from the original one).
-     */
-    public static Map.Entry<String, JsonParser> lookAheadFieldValue(
-        String name, String defaultValue, JsonParser parser, JsonpMapper mapper
-    ) {
-        // FIXME: need a buffering parser wrapper so that we don't roundtrip 
through a JsonObject and a String
-        // FIXME: resulting parser should return locations that are offset 
with the original parser's location
-        JsonObject object = parser.getObject();
-        String result = object.getString(name, null);
-
-        if (result == null) {
-            result = defaultValue;
-        }
-
-        if (result == null) {
-            throw new JsonParsingException("Property '" + name + "' not 
found", parser.getLocation());
-        }
-
-        return new AbstractMap.SimpleImmutableEntry<>(result, 
objectParser(object, mapper));
-    }
-
-    /**
-     * Create a parser that traverses a JSON object
-     */
-    public static JsonParser objectParser(JsonObject object, JsonpMapper 
mapper) {
-        // FIXME: we should have used createParser(object), but this doesn't 
work as it creates a
-        // org.glassfish.json.JsonStructureParser that doesn't implement the 
JsonP 1.0.1 features, in particular
-        // parser.getObject(). So deserializing recursive internally-tagged 
union would fail with UnsupportedOperationException
-        // While glassfish has this issue or until we write our own, we 
roundtrip through a string.
-
-        String strObject = object.toString();
-        return mapper.jsonProvider().createParser(new StringReader(strObject));
-    }
-
-    public static String toString(JsonValue value) {
-        switch (value.getValueType()) {
-            case OBJECT:
-                throw new IllegalArgumentException("Json objects cannot be 
used as string");
-
-            case ARRAY:
-                return value.asJsonArray().stream()
-                    .map(JsonpUtils::toString)
-                    .collect(Collectors.joining(","));
-
-            case STRING:
-                return ((JsonString)value).getString();
-
-            case TRUE:
-                return "true";
-
-            case FALSE:
-                return "false";
-
-            case NULL:
-                return "null";
-
-            case NUMBER:
-                return value.toString();
-
-            default:
-                throw new IllegalArgumentException("Unknown JSON value type: 
'" + value + "'");
-        }
-    }
-
-    public static void serializeDoubleOrNull(JsonGenerator generator, double 
value, double defaultValue) {
-        // Only output null if the default value isn't finite, which cannot be 
represented as JSON
-        if (value == defaultValue && !Double.isFinite(defaultValue)) {
-            generator.writeNull();
-        } else {
-            generator.write(value);
-        }
-    }
-
-    public static void serializeIntOrNull(JsonGenerator generator, int value, 
int defaultValue) {
-        // Only output null if the default value isn't finite, which cannot be 
represented as JSON
-        if (value == defaultValue && defaultValue == Integer.MAX_VALUE || 
defaultValue == Integer.MIN_VALUE) {
-            generator.writeNull();
-        } else {
-            generator.write(value);
-        }
-    }
-}
diff --git 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/UnexpectedJsonEventException.java
 
b/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/UnexpectedJsonEventException.java
deleted file mode 100644
index faf7d5fe85..0000000000
--- 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/UnexpectedJsonEventException.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.backends.opensearch.json;
-
-import java.util.EnumSet;
-
-import jakarta.json.stream.JsonParser;
-import jakarta.json.stream.JsonParser.Event;
-import jakarta.json.stream.JsonParsingException;
-
-public class UnexpectedJsonEventException extends JsonParsingException {
-    public UnexpectedJsonEventException(JsonParser parser, Event event) {
-        super("Unexpected JSON event '" + event + "'", parser.getLocation());
-    }
-
-    public UnexpectedJsonEventException(JsonParser parser, Event event, Event 
expected) {
-        super("Unexpected JSON event '" + event + "' instead of '" + expected 
+ "'", parser.getLocation());
-    }
-
-    public UnexpectedJsonEventException(JsonParser parser, Event event, 
EnumSet<Event> expected) {
-        super("Unexpected JSON event '" + event + "' instead of '" + expected 
+ "'", parser.getLocation());
-    }
-}
diff --git 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/jackson/JacksonJsonProvider.java
 
b/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/jackson/JacksonJsonProvider.java
deleted file mode 100644
index e7d128977f..0000000000
--- 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/jackson/JacksonJsonProvider.java
+++ /dev/null
@@ -1,298 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.backends.opensearch.json.jackson;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.Writer;
-import java.nio.charset.Charset;
-import java.util.Collections;
-import java.util.Map;
-
-import com.fasterxml.jackson.core.JsonFactory;
-
-import jakarta.json.JsonArray;
-import jakarta.json.JsonArrayBuilder;
-import jakarta.json.JsonBuilderFactory;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonObjectBuilder;
-import jakarta.json.JsonReader;
-import jakarta.json.JsonReaderFactory;
-import jakarta.json.JsonWriter;
-import jakarta.json.JsonWriterFactory;
-import jakarta.json.spi.JsonProvider;
-import jakarta.json.stream.JsonGenerator;
-import jakarta.json.stream.JsonGeneratorFactory;
-import jakarta.json.stream.JsonParser;
-import jakarta.json.stream.JsonParserFactory;
-
-/**
- * A partial implementation of JSONP's SPI on top of Jackson.
- */
-public class JacksonJsonProvider extends JsonProvider {
-
-    private final JsonFactory jsonFactory;
-
-    public JacksonJsonProvider(JsonFactory jsonFactory) {
-        this.jsonFactory = jsonFactory;
-    }
-
-    public JacksonJsonProvider() {
-        this(new JsonFactory());
-    }
-
-    /**
-     * Return the underlying Jackson {@link JsonFactory}.
-     */
-    public JsonFactory jacksonJsonFactory() {
-        return this.jsonFactory;
-    }
-
-    
//---------------------------------------------------------------------------------------------
-    // Parser
-
-    private final ParserFactory defaultParserFactory = new ParserFactory(null);
-
-    @Override
-    public JsonParserFactory createParserFactory(Map<String, ?> config) {
-        if (config == null || config.isEmpty()) {
-            return defaultParserFactory;
-        } else {
-            // TODO: handle specific configuration
-            return defaultParserFactory;
-        }
-    }
-
-    @Override
-    public JsonParser createParser(Reader reader) {
-        return defaultParserFactory.createParser(reader);
-    }
-
-    @Override
-    public JsonParser createParser(InputStream in) {
-        return defaultParserFactory.createParser(in);
-    }
-
-    private class ParserFactory implements JsonParserFactory {
-
-        private final Map<String, ?> config;
-
-        ParserFactory(Map<String, ?> config) {
-            this.config = config == null ? Collections.emptyMap() : config;
-        }
-
-        @Override
-        public JsonParser createParser(Reader reader) {
-            try {
-                return new 
JacksonJsonpParser(jsonFactory.createParser(reader));
-            } catch (IOException ioe) {
-                throw JacksonUtils.convertException(ioe);
-            }
-        }
-
-        @Override
-        public JsonParser createParser(InputStream in) {
-            try {
-                return new JacksonJsonpParser(jsonFactory.createParser(in));
-            } catch (IOException ioe) {
-                throw JacksonUtils.convertException(ioe);
-            }
-        }
-
-        @Override
-        public JsonParser createParser(InputStream in, Charset charset) {
-            try {
-                return new JacksonJsonpParser(jsonFactory.createParser(new 
InputStreamReader(in, charset)));
-            } catch (IOException ioe) {
-                throw JacksonUtils.convertException(ioe);
-            }
-        }
-
-        /**
-         * Not implemented.
-         */
-        @Override
-        public JsonParser createParser(JsonObject obj) {
-            return 
JsonProvider.provider().createParserFactory(null).createParser(obj);
-        }
-
-        /**
-         * Not implemented.
-         */
-        @Override
-        public JsonParser createParser(JsonArray array) {
-            return 
JsonProvider.provider().createParserFactory(null).createParser(array);
-        }
-
-        /**
-         * Not implemented.
-         */
-        @Override
-        public Map<String, ?> getConfigInUse() {
-            return config;
-        }
-    }
-
-    
//---------------------------------------------------------------------------------------------
-    // Generator
-
-    private final JsonGeneratorFactory defaultGeneratorFactory = new 
GeneratorFactory(null);
-
-    @Override
-    public JsonGeneratorFactory createGeneratorFactory(Map<String, ?> config) {
-        if (config == null || config.isEmpty()) {
-            return defaultGeneratorFactory;
-        } else {
-            // TODO: handle specific configuration
-            return defaultGeneratorFactory;
-        }
-    }
-
-    @Override
-    public JsonGenerator createGenerator(Writer writer) {
-        return defaultGeneratorFactory.createGenerator(writer);
-    }
-
-    @Override
-    public JsonGenerator createGenerator(OutputStream out) {
-        return defaultGeneratorFactory.createGenerator(out);
-    }
-
-    private class GeneratorFactory implements JsonGeneratorFactory {
-
-        private final Map<String, ?> config;
-
-        GeneratorFactory(Map<String, ?> config) {
-            this.config = config == null ? Collections.emptyMap() : config;
-        }
-
-        @Override
-        public JsonGenerator createGenerator(Writer writer) {
-            try {
-                return new 
JacksonJsonpGenerator(jsonFactory.createGenerator(writer));
-            } catch (IOException ioe) {
-                throw JacksonUtils.convertException(ioe);
-            }
-        }
-
-        @Override
-        public JsonGenerator createGenerator(OutputStream out) {
-            try {
-                return new 
JacksonJsonpGenerator(jsonFactory.createGenerator(out));
-            } catch (IOException ioe) {
-                throw JacksonUtils.convertException(ioe);
-            }
-        }
-
-        @Override
-        public JsonGenerator createGenerator(OutputStream out, Charset 
charset) {
-            try {
-                return new 
JacksonJsonpGenerator(jsonFactory.createGenerator(new OutputStreamWriter(out, 
charset)));
-            } catch (IOException ioe) {
-                throw JacksonUtils.convertException(ioe);
-            }
-
-        }
-
-        @Override
-        public Map<String, ?> getConfigInUse() {
-            return config;
-        }
-    }
-
-    
//---------------------------------------------------------------------------------------------
-    // Unsupported operations
-
-    /**
-     * Not implemented.
-     */
-    @Override
-    public JsonReader createReader(Reader reader) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Not implemented.
-     */
-    @Override
-    public JsonReader createReader(InputStream in) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Not implemented.
-     */
-    @Override
-    public JsonWriter createWriter(Writer writer) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Not implemented.
-     */
-    @Override
-    public JsonWriter createWriter(OutputStream out) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Not implemented.
-     */
-    @Override
-    public JsonWriterFactory createWriterFactory(Map<String, ?> config) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Not implemented.
-     */
-    @Override
-    public JsonReaderFactory createReaderFactory(Map<String, ?> config) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Not implemented.
-     */
-    @Override
-    public JsonObjectBuilder createObjectBuilder() {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Not implemented.
-     */
-    @Override
-    public JsonArrayBuilder createArrayBuilder() {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Not implemented.
-     */
-    @Override
-    public JsonBuilderFactory createBuilderFactory(Map<String, ?> config) {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/jackson/JacksonJsonpGenerator.java
 
b/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/jackson/JacksonJsonpGenerator.java
deleted file mode 100644
index c8758d11d8..0000000000
--- 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/jackson/JacksonJsonpGenerator.java
+++ /dev/null
@@ -1,374 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.backends.opensearch.json.jackson;
-
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.Map;
-
-import com.fasterxml.jackson.core.JsonStreamContext;
-
-import jakarta.json.JsonNumber;
-import jakarta.json.JsonString;
-import jakarta.json.JsonValue;
-import jakarta.json.stream.JsonGenerationException;
-import jakarta.json.stream.JsonGenerator;
-
-/**
- * A JSONP generator implementation on top of Jackson.
- */
-public class JacksonJsonpGenerator implements JsonGenerator {
-
-    private final com.fasterxml.jackson.core.JsonGenerator generator;
-
-    public JacksonJsonpGenerator(com.fasterxml.jackson.core.JsonGenerator 
generator) {
-        this.generator = generator;
-    }
-
-    /**
-     * Returns the underlying Jackson generator.
-     */
-    public com.fasterxml.jackson.core.JsonGenerator jacksonGenerator() {
-        return generator;
-    }
-
-    @Override
-    public JsonGenerator writeStartObject() {
-        try {
-            generator.writeStartObject();
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator writeStartObject(String name) {
-        try {
-            generator.writeFieldName(name);
-            generator.writeStartObject();
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator writeStartArray() {
-        try {
-            generator.writeStartArray();
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator writeStartArray(String name) {
-        try {
-            generator.writeFieldName(name);
-            generator.writeStartArray();
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator writeKey(String name) {
-        try {
-            generator.writeFieldName(name);
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(String name, JsonValue value) {
-        try {
-            generator.writeFieldName(name);
-            writeValue(value);
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(String name, String value) {
-        try {
-            generator.writeFieldName(name);
-            generator.writeString(value);
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(String name, BigInteger value) {
-        try {
-            generator.writeFieldName(name);
-            generator.writeNumber(value);
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(String name, BigDecimal value) {
-        try {
-            generator.writeFieldName(name);
-            generator.writeNumber(value);
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(String name, int value) {
-        try {
-            generator.writeFieldName(name);
-            generator.writeNumber(value);
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(String name, long value) {
-        try {
-            generator.writeFieldName(name);
-            generator.writeNumber(value);
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(String name, double value) {
-        try {
-            generator.writeFieldName(name);
-            generator.writeNumber(value);
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(String name, boolean value) {
-        try {
-            generator.writeFieldName(name);
-            generator.writeBooleanField(name, value);
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator writeNull(String name) {
-        try {
-            generator.writeFieldName(name);
-            generator.writeNull();
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator writeEnd() {
-        try {
-            JsonStreamContext ctx = generator.getOutputContext();
-            if (ctx.inObject()) {
-                generator.writeEndObject();
-            } else if (ctx.inArray()) {
-                generator.writeEndArray();
-            } else {
-                throw new JsonGenerationException("Unexpected context: '" + 
ctx.typeDesc() + "'");
-            }
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(JsonValue value) {
-        try {
-            writeValue(value);
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(String value) {
-        try {
-            generator.writeString(value);
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(BigDecimal value) {
-        try {
-            generator.writeNumber(value);
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(BigInteger value) {
-        try {
-            generator.writeNumber(value);
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(int value) {
-        try {
-            generator.writeNumber(value);
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(long value) {
-        try {
-            generator.writeNumber(value);
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(double value) {
-        try {
-            generator.writeNumber(value);
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(boolean value) {
-        try {
-            generator.writeBoolean(value);
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator writeNull() {
-        try {
-            generator.writeNull();
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-        return this;
-    }
-
-    @Override
-    public void close() {
-        try {
-            generator.close();
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-    }
-
-    @Override
-    public void flush() {
-        try {
-            generator.flush();
-        } catch (IOException e) {
-            throw JacksonUtils.convertException(e);
-        }
-    }
-
-    private void writeValue(JsonValue value) throws IOException {
-        switch (value.getValueType()) {
-            case OBJECT:
-                generator.writeStartObject();
-                for (Map.Entry<String, JsonValue> entry: 
value.asJsonObject().entrySet()) {
-                    generator.writeFieldName(entry.getKey());
-                    writeValue(entry.getValue());
-                }
-                generator.writeEndObject();
-                break;
-
-            case ARRAY:
-                generator.writeStartArray();
-                for (JsonValue item: value.asJsonArray()) {
-                    writeValue(item);
-                }
-                generator.writeEndArray();
-                break;
-
-            case STRING:
-                generator.writeString(((JsonString)value).getString());
-                break;
-
-            case FALSE:
-                generator.writeBoolean(false);
-                break;
-
-            case TRUE:
-                generator.writeBoolean(true);
-                break;
-
-            case NULL:
-                generator.writeNull();
-                break;
-
-            case NUMBER:
-                JsonNumber n = (JsonNumber) value;
-                if (n.isIntegral()) {
-                    generator.writeNumber(n.longValue());
-                } else {
-                    generator.writeNumber(n.doubleValue());
-                }
-                break;
-        }
-    }
-}
diff --git 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/jackson/JacksonJsonpLocation.java
 
b/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/jackson/JacksonJsonpLocation.java
deleted file mode 100644
index 132f40365e..0000000000
--- 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/jackson/JacksonJsonpLocation.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.backends.opensearch.json.jackson;
-
-import jakarta.json.stream.JsonLocation;
-
-/**
- * Translate a Jackson location to a JSONP location.
- */
-public class JacksonJsonpLocation implements JsonLocation {
-
-    private final com.fasterxml.jackson.core.JsonLocation location;
-
-    JacksonJsonpLocation(com.fasterxml.jackson.core.JsonLocation location) {
-        this.location = location;
-    }
-
-    JacksonJsonpLocation(com.fasterxml.jackson.core.JsonParser parser) {
-        this(parser.getTokenLocation());
-    }
-
-    @Override
-    public long getLineNumber() {
-        return location.getLineNr();
-    }
-
-    @Override
-    public long getColumnNumber() {
-        return location.getColumnNr();
-    }
-
-    @Override
-    public long getStreamOffset() {
-        long charOffset = location.getCharOffset();
-        return charOffset == -1 ? location.getByteOffset() : charOffset;
-    }
-}
diff --git 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/jackson/JacksonJsonpMapper.java
 
b/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/jackson/JacksonJsonpMapper.java
deleted file mode 100644
index 692b0e937c..0000000000
--- 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/jackson/JacksonJsonpMapper.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.backends.opensearch.json.jackson;
-
-import java.io.IOException;
-import java.util.EnumSet;
-
-import org.apache.james.backends.opensearch.json.JsonpDeserializerBase;
-import org.apache.james.backends.opensearch.json.JsonpMapperBase;
-import org.opensearch.client.json.JsonpDeserializer;
-import org.opensearch.client.json.JsonpMapper;
-import org.opensearch.client.json.JsonpSerializer;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.core.JsonFactory;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
-
-import jakarta.json.spi.JsonProvider;
-import jakarta.json.stream.JsonGenerator;
-import jakarta.json.stream.JsonParser;
-
-public class JacksonJsonpMapper extends JsonpMapperBase {
-
-    private final JacksonJsonProvider provider;
-    private final ObjectMapper objectMapper;
-
-    public JacksonJsonpMapper(ObjectMapper objectMapper) {
-        this(objectMapper, new JsonFactory());
-    }
-
-    public JacksonJsonpMapper(ObjectMapper objectMapper, JsonFactory 
jsonFactory) {
-        this.provider = new JacksonJsonProvider(jsonFactory);
-        this.objectMapper = objectMapper
-            .configure(SerializationFeature.INDENT_OUTPUT, false)
-            .setSerializationInclusion(JsonInclude.Include.NON_NULL);
-    }
-
-    public JacksonJsonpMapper() {
-        this(new ObjectMapper());
-    }
-
-    /**
-     * Returns the underlying Jackson mapper.
-     */
-    public ObjectMapper objectMapper() {
-        return this.objectMapper;
-    }
-
-    @Override
-    public JsonProvider jsonProvider() {
-        return provider;
-    }
-
-    @Override
-    protected  <T> JsonpDeserializer<T> getDefaultDeserializer(Class<T> clazz) 
{
-        return new JacksonValueParser<>(clazz);
-    }
-
-    @Override
-    public <T> void serialize(T value, JsonGenerator generator) {
-
-        if (!(generator instanceof JacksonJsonpGenerator)) {
-            throw new IllegalArgumentException("Jackson's ObjectMapper can 
only be used with the JacksonJsonpProvider");
-        }
-
-        JsonpSerializer<T> serializer = findSerializer(value);
-        if (serializer != null) {
-            serializer.serialize(value, generator, this);
-            return;
-        }
-
-        com.fasterxml.jackson.core.JsonGenerator jkGenerator = 
((JacksonJsonpGenerator)generator).jacksonGenerator();
-        try {
-            objectMapper.writeValue(jkGenerator, value);
-        } catch (IOException ioe) {
-            throw JacksonUtils.convertException(ioe);
-        }
-    }
-
-    private class JacksonValueParser<T> extends JsonpDeserializerBase<T> {
-
-        private final Class<T> clazz;
-
-        protected JacksonValueParser(Class<T> clazz) {
-            super(EnumSet.allOf(JsonParser.Event.class));
-            this.clazz = clazz;
-        }
-
-        @Override
-        public T deserialize(JsonParser parser, JsonpMapper mapper, 
JsonParser.Event event) {
-
-            if (!(parser instanceof JacksonJsonpParser)) {
-                throw new IllegalArgumentException("Jackson's ObjectMapper can 
only be used with the JacksonJsonpProvider");
-            }
-
-            com.fasterxml.jackson.core.JsonParser jkParser = 
((JacksonJsonpParser)parser).jacksonParser();
-
-            try {
-                return objectMapper.readValue(jkParser, clazz);
-            } catch (IOException ioe) {
-                throw JacksonUtils.convertException(ioe);
-            }
-        }
-    }
-}
diff --git 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/jackson/JacksonJsonpParser.java
 
b/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/jackson/JacksonJsonpParser.java
deleted file mode 100644
index b1dcacccb2..0000000000
--- 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/jackson/JacksonJsonpParser.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.backends.opensearch.json.jackson;
-
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.util.EnumMap;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.stream.Stream;
-
-import com.fasterxml.jackson.core.JsonToken;
-
-import jakarta.json.JsonArray;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonValue;
-import jakarta.json.stream.JsonLocation;
-import jakarta.json.stream.JsonParser;
-import jakarta.json.stream.JsonParsingException;
-
-/**
- * A JSONP parser implementation on top of Jackson.
- * <p>
- * <b>Warning:</b> this implementation isn't fully compliant with the JSONP 
specification: calling {@link #hasNext()}
- * moves forward the underlying Jackson parser as Jackson doesn't provide an 
equivalent method. This means no value
- * getter method (e.g. {@link #getInt()} or {@link #getString()} should be 
called until the next call to {@link #next()}.
- * Such calls will throw an {@code IllegalStateException}.
- */
-public class JacksonJsonpParser implements JsonParser {
-
-    private final com.fasterxml.jackson.core.JsonParser parser;
-
-    private boolean hasNextWasCalled = false;
-
-    private static final EnumMap<JsonToken, Event> tokenToEvent;
-
-    static {
-        tokenToEvent = new EnumMap<>(JsonToken.class);
-        tokenToEvent.put(JsonToken.END_ARRAY, Event.END_ARRAY);
-        tokenToEvent.put(JsonToken.END_OBJECT, Event.END_OBJECT);
-        tokenToEvent.put(JsonToken.FIELD_NAME, Event.KEY_NAME);
-        tokenToEvent.put(JsonToken.START_ARRAY, Event.START_ARRAY);
-        tokenToEvent.put(JsonToken.START_OBJECT, Event.START_OBJECT);
-        tokenToEvent.put(JsonToken.VALUE_FALSE, Event.VALUE_FALSE);
-        tokenToEvent.put(JsonToken.VALUE_NULL, Event.VALUE_NULL);
-        tokenToEvent.put(JsonToken.VALUE_NUMBER_FLOAT, Event.VALUE_NUMBER);
-        tokenToEvent.put(JsonToken.VALUE_NUMBER_INT, Event.VALUE_NUMBER);
-        tokenToEvent.put(JsonToken.VALUE_STRING, Event.VALUE_STRING);
-        tokenToEvent.put(JsonToken.VALUE_TRUE, Event.VALUE_TRUE);
-
-        // No equivalent for
-        // - VALUE_EMBEDDED_OBJECT
-        // - NOT_AVAILABLE
-    }
-
-    public JacksonJsonpParser(com.fasterxml.jackson.core.JsonParser parser) {
-        this.parser = parser;
-    }
-
-    /**
-     * Returns the underlying Jackson parser.
-     */
-    public com.fasterxml.jackson.core.JsonParser jacksonParser() {
-        return this.parser;
-    }
-
-    private JsonParsingException convertException(IOException ioe) {
-        return new JsonParsingException("Jackson exception: " + 
ioe.getMessage(), ioe, getLocation());
-    }
-
-    private JsonToken fetchNextToken() {
-        try {
-            return parser.nextToken();
-        } catch (IOException e) {
-            throw convertException(e);
-        }
-    }
-
-    private void ensureTokenIsCurrent() {
-        if (hasNextWasCalled) {
-            throw new IllegalStateException("Cannot get event data as parser 
as already been moved to the next event");
-        }
-    }
-
-    @Override
-    public boolean hasNext() {
-        if (hasNextWasCalled) {
-            return parser.currentToken() != null;
-        } else {
-            hasNextWasCalled = true;
-            return fetchNextToken() != null;
-        }
-    }
-
-    @Override
-    public Event next() {
-        JsonToken token;
-        if (hasNextWasCalled) {
-            token = parser.getCurrentToken();
-            hasNextWasCalled = false;
-        } else {
-            token = fetchNextToken();
-        }
-
-        if (token == null) {
-            throw new NoSuchElementException();
-        }
-
-        Event result = tokenToEvent.get(token);
-        if (result == null) {
-            throw new JsonParsingException("Unsupported Jackson event type '" 
+ token + "'", getLocation());
-        }
-
-        return result;
-    }
-
-    @Override
-    public String getString() {
-        ensureTokenIsCurrent();
-        try {
-            return parser.getValueAsString();
-        } catch (IOException e) {
-            throw convertException(e);
-        }
-    }
-
-    @Override
-    public boolean isIntegralNumber() {
-        ensureTokenIsCurrent();
-        return parser.isExpectedNumberIntToken();
-    }
-
-    @Override
-    public int getInt() {
-        ensureTokenIsCurrent();
-        try {
-            return parser.getIntValue();
-        } catch (IOException e) {
-            throw convertException(e);
-        }
-    }
-
-    @Override
-    public long getLong() {
-        ensureTokenIsCurrent();
-        try {
-            return parser.getLongValue();
-        } catch (IOException e) {
-            throw convertException(e);
-        }
-    }
-
-    @Override
-    public BigDecimal getBigDecimal() {
-        ensureTokenIsCurrent();
-        try {
-            return parser.getDecimalValue();
-        } catch (IOException e) {
-            throw convertException(e);
-        }
-    }
-
-    @Override
-    public JsonLocation getLocation() {
-        return new JacksonJsonpLocation(parser.getCurrentLocation());
-    }
-
-    @Override
-    public void close() {
-        try {
-            parser.close();
-        } catch (IOException e) {
-            throw convertException(e);
-        }
-    }
-
-    private JsonValueParser valueParser;
-
-    @Override
-    public JsonObject getObject() {
-        ensureTokenIsCurrent();
-        if (parser.currentToken() != JsonToken.START_OBJECT) {
-            throw new IllegalStateException("Unexpected event '" + 
parser.currentToken() +
-                "' at " + parser.getTokenLocation());
-        }
-        if (valueParser == null) {
-            valueParser = new JsonValueParser();
-        }
-        try {
-            return valueParser.parseObject(parser);
-        } catch (IOException e) {
-            throw convertException(e);
-        }
-    }
-
-    @Override
-    public JsonArray getArray() {
-        ensureTokenIsCurrent();
-        if (valueParser == null) {
-            valueParser = new JsonValueParser();
-        }
-        if (parser.currentToken() != JsonToken.START_ARRAY) {
-            throw new IllegalStateException("Unexpected event '" + 
parser.currentToken() +
-                "' at " + parser.getTokenLocation());
-        }
-        try {
-            return valueParser.parseArray(parser);
-        } catch (IOException e) {
-            throw convertException(e);
-        }
-    }
-
-    @Override
-    public JsonValue getValue() {
-        ensureTokenIsCurrent();
-        if (valueParser == null) {
-            valueParser = new JsonValueParser();
-        }
-        try {
-            return valueParser.parseValue(parser);
-        } catch (IOException e) {
-            throw convertException(e);
-        }
-    }
-
-    @Override
-    public void skipObject() {
-        ensureTokenIsCurrent();
-        if (parser.currentToken() != JsonToken.START_OBJECT) {
-            return;
-        }
-
-        try {
-            int depth = 1;
-            JsonToken token;
-            do {
-                token = parser.nextToken();
-                switch (token) {
-                    case START_OBJECT:
-                        depth++;
-                        break;
-                    case END_OBJECT:
-                        depth--;
-                        break;
-                }
-            } while (!(token == JsonToken.END_OBJECT && depth == 0));
-        } catch (IOException e) {
-            throw convertException(e);
-        }
-    }
-
-    @Override
-    public void skipArray() {
-        ensureTokenIsCurrent();
-        if (parser.currentToken() != JsonToken.START_ARRAY) {
-            return;
-        }
-
-        try {
-            int depth = 1;
-            JsonToken token;
-            do {
-                token = parser.nextToken();
-                switch (token) {
-                    case START_ARRAY:
-                        depth++;
-                        break;
-                    case END_ARRAY:
-                        depth--;
-                        break;
-                }
-            } while (!(token == JsonToken.END_ARRAY && depth == 0));
-        } catch (IOException e) {
-            throw convertException(e);
-        }
-    }
-
-    @Override
-    public Stream<Map.Entry<String, JsonValue>> getObjectStream() {
-        return getObject().entrySet().stream();
-    }
-
-    @Override
-    public Stream<JsonValue> getArrayStream() {
-        return getArray().stream();
-    }
-
-    /**
-     * Not implemented.
-     */
-    @Override
-    public Stream<JsonValue> getValueStream() {
-        return JsonParser.super.getValueStream();
-    }
-}
-
diff --git 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/jackson/JacksonUtils.java
 
b/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/jackson/JacksonUtils.java
deleted file mode 100644
index d5e7782395..0000000000
--- 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/jackson/JacksonUtils.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.backends.opensearch.json.jackson;
-
-import java.io.IOException;
-
-import com.fasterxml.jackson.core.JsonParseException;
-
-import jakarta.json.JsonException;
-import jakarta.json.stream.JsonGenerationException;
-import jakarta.json.stream.JsonParsingException;
-
-class JacksonUtils {
-    public static JsonException convertException(IOException ioe) {
-        if (ioe instanceof com.fasterxml.jackson.core.JsonGenerationException) 
{
-            return new JsonGenerationException(ioe.getMessage(), ioe);
-
-        } else if (ioe instanceof JsonParseException) {
-            JsonParseException jpe = (JsonParseException) ioe;
-            return new JsonParsingException(ioe.getMessage(), jpe, new 
JacksonJsonpLocation(jpe.getLocation()));
-
-        } else {
-            return new JsonException("Jackson exception", ioe);
-        }
-    }
-}
diff --git 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/jackson/JsonValueParser.java
 
b/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/jackson/JsonValueParser.java
deleted file mode 100644
index a66bbd3edb..0000000000
--- 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/jackson/JsonValueParser.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.backends.opensearch.json.jackson;
-
-import java.io.IOException;
-
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.core.JsonToken;
-
-import jakarta.json.JsonArray;
-import jakarta.json.JsonArrayBuilder;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonObjectBuilder;
-import jakarta.json.JsonValue;
-import jakarta.json.spi.JsonProvider;
-import jakarta.json.stream.JsonParsingException;
-
-/**
- * Reads a Jsonp value/object/array from a Jackson parser. The parser's 
current token should be the start of the
- * object (e.g. START_OBJECT, VALUE_NUMBER, etc).
- */
-class JsonValueParser {
-    private static final JsonProvider provider = JsonProvider.provider();
-
-    public JsonObject parseObject(JsonParser parser) throws IOException {
-
-        JsonObjectBuilder ob = provider.createObjectBuilder();
-
-        JsonToken token;
-        while ((token = parser.nextToken()) != JsonToken.END_OBJECT) {
-            if (token != JsonToken.FIELD_NAME) {
-                throw new JsonParsingException("Expected a property name", new 
JacksonJsonpLocation(parser));
-            }
-            String name = parser.getCurrentName();
-            parser.nextToken();
-            ob.add(name, parseValue(parser));
-        }
-        return ob.build();
-    }
-
-    public JsonArray parseArray(JsonParser parser) throws IOException {
-        JsonArrayBuilder ab = provider.createArrayBuilder();
-
-        while (parser.nextToken() != JsonToken.END_ARRAY) {
-            ab.add(parseValue(parser));
-        }
-        return ab.build();
-    }
-
-    public JsonValue parseValue(JsonParser parser) throws IOException {
-        switch (parser.currentToken()) {
-            case START_OBJECT:
-                return parseObject(parser);
-
-            case START_ARRAY:
-                return parseArray(parser);
-
-            case VALUE_TRUE:
-                return JsonValue.TRUE;
-
-            case VALUE_FALSE:
-                return JsonValue.FALSE;
-
-            case VALUE_NULL:
-                return JsonValue.NULL;
-
-            case VALUE_STRING:
-                return provider.createValue(parser.getText());
-
-            case VALUE_NUMBER_FLOAT:
-            case VALUE_NUMBER_INT:
-                switch (parser.getNumberType()) {
-                    case INT:
-                        return provider.createValue(parser.getIntValue());
-                    case LONG:
-                        return provider.createValue(parser.getLongValue());
-                    case FLOAT:
-                    case DOUBLE:
-                        return provider.createValue(parser.getDoubleValue());
-                    case BIG_DECIMAL:
-                        return provider.createValue(parser.getDecimalValue());
-                    case BIG_INTEGER:
-                        return 
provider.createValue(parser.getBigIntegerValue());
-                }
-
-            default:
-                throw new JsonParsingException("Unexpected token '" + 
parser.currentToken() + "'", new JacksonJsonpLocation(parser));
-
-        }
-    }
-}
diff --git 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/package-info.java
 
b/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/package-info.java
deleted file mode 100644
index db5d3f4c13..0000000000
--- 
a/backends-common/opensearch/src/main/java/org/apache/james/backends/opensearch/json/package-info.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.james.backends.opensearch.json;
-
-/**
- * See {@link https://github.com/opensearch-project/opensearch-java/issues/292}
- *
- * The Jackson related code was copied from {@link 
https://github.com/opensearch-project/opensearch-java} in order to get rid of a 
SPI lookup for each deserialized request,
- * that was happening on the event loop.
- *
- * The only modified class is {@link jackson.JsonValueParser} where the SPI 
lookup was made static.
- */
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to