diff --git a/java-client/src/main/java/co/elastic/clients/json/JsonpUtils.java b/java-client/src/main/java/co/elastic/clients/json/JsonpUtils.java index efec74d70..c10019943 100644 --- a/java-client/src/main/java/co/elastic/clients/json/JsonpUtils.java +++ b/java-client/src/main/java/co/elastic/clients/json/JsonpUtils.java @@ -42,12 +42,24 @@ public class JsonpUtils { + private static JsonProvider systemJsonProvider = null; + /** * Get a JsonProvider instance. This method first calls the standard `JsonProvider.provider()` that is based on - * the current thread's context classloader, and in case of failure tries to find a provider in other classloaders. + * the current thread's context classloader, and in case of failure tries to find a provider in other classloaders. The + * value is cached for subsequent calls. */ - @AllowForbiddenApis("Implementation of the JsonProvider lookup") public static JsonProvider provider() { + JsonProvider result = systemJsonProvider; + if (result == null) { + result = findProvider(); + systemJsonProvider = result; + } + return result; + } + + @AllowForbiddenApis("Implementation of the JsonProvider lookup") + static JsonProvider findProvider() { RuntimeException exception; try { return JsonProvider.provider(); diff --git a/java-client/src/test/java/co/elastic/clients/json/JsonpUtilsTest.java b/java-client/src/test/java/co/elastic/clients/json/JsonpUtilsTest.java index 893a593cd..c7db13643 100644 --- a/java-client/src/test/java/co/elastic/clients/json/JsonpUtilsTest.java +++ b/java-client/src/test/java/co/elastic/clients/json/JsonpUtilsTest.java @@ -69,6 +69,16 @@ public Enumeration getResources(String name) { } } + @Test + @AllowForbiddenApis("Testing JsonpUtil.provider()") + public void testProviderCache() { + // A new provider at each call + assertNotSame(JsonpUtils.findProvider(), JsonpUtils.findProvider()); + + // Result is cached + assertSame(JsonpUtils.provider(), JsonpUtils.provider()); + } + @Test public void testObjectToString() { // Test that we call toString() on application classes.