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

vavrtom pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-broker-j.git


The following commit(s) were added to refs/heads/main by this push:
     new e885aeb91f QPID-8744: [Broker-J] Jackson ObjectMapper instances 
shouldn't be created on each method call (#403)
e885aeb91f is described below

commit e885aeb91f5e546ca3012a5831ad84824dd2e11f
Author: Daniil Kirilyuk <[email protected]>
AuthorDate: Tue Jun 23 09:28:22 2026 +0200

    QPID-8744: [Broker-J] Jackson ObjectMapper instances shouldn't be created 
on each method call (#403)
---
 .../replication/ReplicatedEnvironmentFacade.java   |  7 +++--
 .../berkeleydb/tuple/ConfiguredObjectBinding.java  | 31 +++++++++-------------
 .../server/store/berkeleydb/tuple/MapBinding.java  | 22 +++++++--------
 .../store/berkeleydb/upgrade/UpgradeFrom7To8.java  |  7 +++--
 .../server/model/AbstractConfiguredObject.java     |  5 ++--
 .../server/model/AncestorAttributeResolver.java    |  5 ++--
 .../qpid/server/model/AttributeValueConverter.java | 20 ++++++--------
 .../server/model/ConfiguredObjectTypeRegistry.java |  5 ++--
 .../qpid/server/model/OwnAttributeResolver.java    |  5 ++--
 .../qpid/server/store/JsonFileConfigStore.java     |  6 ++---
 .../store/preferences/JsonFilePreferenceStore.java |  7 +++--
 .../store/jdbc/AbstractJDBCConfigurationStore.java | 18 ++++++-------
 .../store/jdbc/AbstractJDBCPreferenceStore.java    |  8 +++---
 .../management/amqp/ManagementInputConverter.java  |  5 ++--
 .../server/management/plugin/HttpManagement.java   |  4 +--
 .../plugin/servlet/rest/AbstractServlet.java       |  5 ++--
 .../plugin/servlet/rest/QueryServlet.java          |  3 ++-
 .../plugin/servlet/rest/RestServlet.java           | 10 +++----
 18 files changed, 80 insertions(+), 93 deletions(-)

diff --git 
a/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java
 
b/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java
index 57bb5701cd..234e41e746 100644
--- 
a/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java
+++ 
b/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/replication/ReplicatedEnvironmentFacade.java
@@ -136,6 +136,7 @@ public class ReplicatedEnvironmentFacade implements 
EnvironmentFacade, StateChan
     public static final String NO_SYNC_TX_DURABILITY_PROPERTY_NAME = 
"qpid.bdb.ha.noSyncTxDurablity";
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(ReplicatedEnvironmentFacade.class);
+    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
 
     private static final int DEFAULT_MASTER_TRANSFER_TIMEOUT = 1000 * 60;
     private static final int DEFAULT_DB_PING_SOCKET_TIMEOUT = 1000;
@@ -1764,10 +1765,9 @@ public class ReplicatedEnvironmentFacade implements 
EnvironmentFacade, StateChan
             return Collections.emptySet();
         }
 
-        ObjectMapper objectMapper = new ObjectMapper();
         try
         {
-            Map<String, Object> settings = 
objectMapper.readValue(applicationState, Map.class);
+            Map<String, Object> settings = 
OBJECT_MAPPER.readValue(applicationState, Map.class);
             return new HashSet<>((Collection<String>) 
settings.get(PERMITTED_NODE_LIST));
         }
         catch (Exception e)
@@ -1943,10 +1943,9 @@ public class ReplicatedEnvironmentFacade implements 
EnvironmentFacade, StateChan
         HashMap<String, Object> data = new HashMap<>();
         data.put(PERMITTED_NODE_LIST, permittedNodeList);
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        ObjectMapper objectMapper = new ObjectMapper();
         try
         {
-            objectMapper.writeValue(baos, data);
+            OBJECT_MAPPER.writeValue(baos, data);
         }
         catch (Exception e)
         {
diff --git 
a/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/ConfiguredObjectBinding.java
 
b/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/ConfiguredObjectBinding.java
index 2d33abbd9e..22e80e5c80 100644
--- 
a/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/ConfiguredObjectBinding.java
+++ 
b/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/ConfiguredObjectBinding.java
@@ -20,7 +20,6 @@
  */
 package org.apache.qpid.server.store.berkeleydb.tuple;
 
-import java.io.StringWriter;
 import java.util.Map;
 import java.util.UUID;
 
@@ -29,6 +28,7 @@ import com.sleepycat.bind.tuple.TupleInput;
 import com.sleepycat.bind.tuple.TupleOutput;
 
 import tools.jackson.core.JacksonException;
+import tools.jackson.core.type.TypeReference;
 import tools.jackson.databind.ObjectMapper;
 
 import org.apache.qpid.server.model.ConfiguredObjectJacksonModule;
@@ -39,6 +39,8 @@ import 
org.apache.qpid.server.store.berkeleydb.BDBConfiguredObjectRecord;
 public class ConfiguredObjectBinding extends 
TupleBinding<ConfiguredObjectRecord>
 {
     private static final ConfiguredObjectBinding INSTANCE = new 
ConfiguredObjectBinding(null);
+    private static final TypeReference<Map<String,Object>> MAP_TYPE_REFERENCE 
= new TypeReference<>() { };
+    private static final ObjectMapper OBJECT_MAPPER = 
ConfiguredObjectJacksonModule.newObjectMapper(true);
 
     private final UUID _uuid;
 
@@ -53,40 +55,33 @@ public class ConfiguredObjectBinding extends 
TupleBinding<ConfiguredObjectRecord
     }
 
     @Override
-    public BDBConfiguredObjectRecord entryToObject(TupleInput tupleInput)
+    public BDBConfiguredObjectRecord entryToObject(final TupleInput tupleInput)
     {
-        String type = tupleInput.readString();
-        String json = tupleInput.readString();
-        ObjectMapper mapper = new ObjectMapper();
+        final String type = tupleInput.readString();
+        final String json = tupleInput.readString();
         try
         {
-            Map<String,Object> value = mapper.readValue(json, Map.class);
-            BDBConfiguredObjectRecord configuredObject = new 
BDBConfiguredObjectRecord(_uuid, type, value);
-            return configuredObject;
+            final Map<String,Object> value = OBJECT_MAPPER.readValue(json, 
MAP_TYPE_REFERENCE);
+            return new BDBConfiguredObjectRecord(_uuid, type, value);
         }
-        catch (JacksonException e)
+        catch (final JacksonException e)
         {
-            //should never happen
+            // should never happen
             throw new StoreException(e);
         }
-
     }
 
     @Override
-    public void objectToEntry(ConfiguredObjectRecord object, TupleOutput 
tupleOutput)
+    public void objectToEntry(final ConfiguredObjectRecord object, final 
TupleOutput tupleOutput)
     {
         try
         {
-            StringWriter writer = new StringWriter();
-            final ObjectMapper objectMapper = 
ConfiguredObjectJacksonModule.newObjectMapper(true);
-            objectMapper.writeValue(writer, object.getAttributes());
             tupleOutput.writeString(object.getType());
-            tupleOutput.writeString(writer.toString());
+            
tupleOutput.writeString(OBJECT_MAPPER.writeValueAsString(object.getAttributes()));
         }
-        catch (JacksonException e)
+        catch (final JacksonException e)
         {
             throw new StoreException(e);
         }
     }
-
 }
diff --git 
a/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/MapBinding.java
 
b/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/MapBinding.java
index 547302ebeb..3af093537a 100644
--- 
a/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/MapBinding.java
+++ 
b/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/tuple/MapBinding.java
@@ -19,7 +19,6 @@
 
 package org.apache.qpid.server.store.berkeleydb.tuple;
 
-import java.io.StringWriter;
 import java.util.Map;
 
 import com.sleepycat.bind.tuple.TupleBinding;
@@ -27,7 +26,10 @@ import com.sleepycat.bind.tuple.TupleInput;
 import com.sleepycat.bind.tuple.TupleOutput;
 
 import tools.jackson.core.JacksonException;
+import tools.jackson.core.type.TypeReference;
 import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.ObjectReader;
+import tools.jackson.databind.ObjectWriter;
 
 import org.apache.qpid.server.model.ConfiguredObjectJacksonModule;
 import org.apache.qpid.server.store.StoreException;
@@ -35,6 +37,10 @@ import org.apache.qpid.server.store.StoreException;
 public class MapBinding extends TupleBinding<Map<String, Object>>
 {
     private static final MapBinding INSTANCE = new MapBinding();
+    private static final ObjectMapper MAPPER = 
ConfiguredObjectJacksonModule.newObjectMapper(true);
+    private static final TypeReference<Map<String, Object>> MAP_TYPE_REFERENCE 
= new TypeReference<>() { };
+    private static final ObjectReader MAP_READER = 
MAPPER.readerFor(MAP_TYPE_REFERENCE);
+    private static final ObjectWriter MAP_WRITER = 
MAPPER.writerFor(MAP_TYPE_REFERENCE);
 
     public static MapBinding getInstance()
     {
@@ -44,14 +50,11 @@ public class MapBinding extends TupleBinding<Map<String, 
Object>>
     @Override
     public Map<String, Object> entryToObject(final TupleInput input)
     {
-        String json = input.readString();
-        ObjectMapper mapper = 
ConfiguredObjectJacksonModule.newObjectMapper(true);
         try
         {
-            Map<String, Object> value = mapper.readValue(json, Map.class);
-            return value;
+            return MAP_READER.readValue(input.readString());
         }
-        catch (JacksonException e)
+        catch (final JacksonException e)
         {
             //should never happen
             throw new StoreException(e);
@@ -63,12 +66,9 @@ public class MapBinding extends TupleBinding<Map<String, 
Object>>
     {
         try
         {
-            StringWriter writer = new StringWriter();
-            final ObjectMapper objectMapper = 
ConfiguredObjectJacksonModule.newObjectMapper(true);
-            objectMapper.writeValue(writer, map);
-            output.writeString(writer.toString());
+            output.writeString(MAP_WRITER.writeValueAsString(map));
         }
-        catch (JacksonException e)
+        catch (final JacksonException e)
         {
             throw new StoreException(e);
         }
diff --git 
a/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom7To8.java
 
b/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom7To8.java
index 7a1c31396a..708e8f0d37 100644
--- 
a/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom7To8.java
+++ 
b/bdbstore/src/main/java/org/apache/qpid/server/store/berkeleydb/upgrade/UpgradeFrom7To8.java
@@ -58,6 +58,7 @@ import tools.jackson.databind.ObjectMapper;
 
 public class UpgradeFrom7To8 extends AbstractStoreUpgrade
 {
+    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
     private static final TypeReference<HashMap<String, Object>> 
MAP_TYPE_REFERENCE = new TypeReference<>()
     {
     };
@@ -117,8 +118,6 @@ public class UpgradeFrom7To8 extends AbstractStoreUpgrade
             objectsCursor = configuredObjectsDb.openCursor(txn, null);
             DatabaseEntry key = new DatabaseEntry();
             DatabaseEntry value = new DatabaseEntry();
-            ObjectMapper mapper = new ObjectMapper();
-
             while (objectsCursor.getNext(key, value, LockMode.RMW) == 
OperationStatus.SUCCESS)
             {
                 UUID id = UUIDTupleBinding.getInstance().entryToObject(key);
@@ -128,7 +127,7 @@ public class UpgradeFrom7To8 extends AbstractStoreUpgrade
                 Map<String,Object> attributes = null;
                 try
                 {
-                    attributes = mapper.readValue(json, MAP_TYPE_REFERENCE);
+                    attributes = OBJECT_MAPPER.readValue(json, 
MAP_TYPE_REFERENCE);
                 }
                 catch (Exception e)
                 {
@@ -179,7 +178,7 @@ public class UpgradeFrom7To8 extends AbstractStoreUpgrade
                         TupleOutput tupleOutput = new TupleOutput();
                         tupleOutput.writeString(type);
                         StringWriter writer = new StringWriter();
-                        mapper.writeValue(writer,attributes);
+                        OBJECT_MAPPER.writeValue(writer,attributes);
                         tupleOutput.writeString(writer.getBuffer().toString());
                         TupleBinding.outputToEntry(tupleOutput, value);
                         objectsCursor.putCurrent(value);
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
 
b/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
index 36a6462f3f..8d44021498 100644
--- 
a/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
+++ 
b/broker-core/src/main/java/org/apache/qpid/server/model/AbstractConfiguredObject.java
@@ -95,6 +95,8 @@ public abstract class AbstractConfiguredObject<X extends 
ConfiguredObject<X>> im
 {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(AbstractConfiguredObject.class);
 
+    private static final ObjectMapper OBJECT_MAPPER = 
ConfiguredObjectJacksonModule.newObjectMapper(false);
+
     public static final String SECURED_STRING_VALUE = "********";
 
     private static final Map<Class, Object> SECURE_VALUES = 
Map.of(String.class, SECURED_STRING_VALUE,
@@ -1897,10 +1899,9 @@ public abstract class AbstractConfiguredObject<X extends 
ConfiguredObject<X>> im
                 {
                     if(value instanceof Collection || value instanceof Map)
                     {
-                        ObjectMapper mapper = 
ConfiguredObjectJacksonModule.newObjectMapper(false);
                         try(StringWriter stringWriter = new StringWriter())
                         {
-                            mapper.writeValue(stringWriter, value);
+                            OBJECT_MAPPER.writeValue(stringWriter, value);
                             value = 
_encrypter.encrypt(stringWriter.toString());
                         }
                         catch (IOException e)
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/model/AncestorAttributeResolver.java
 
b/broker-core/src/main/java/org/apache/qpid/server/model/AncestorAttributeResolver.java
index 2fcf5c85b0..8b23bfa932 100644
--- 
a/broker-core/src/main/java/org/apache/qpid/server/model/AncestorAttributeResolver.java
+++ 
b/broker-core/src/main/java/org/apache/qpid/server/model/AncestorAttributeResolver.java
@@ -35,14 +35,13 @@ public class AncestorAttributeResolver implements 
Strings.Resolver
 {
 
     public static final String PREFIX = "ancestor:";
+    private static final ObjectMapper OBJECT_MAPPER = 
ConfiguredObjectJacksonModule.newObjectMapper(false);
     private final ThreadLocal<Set<String>> _stack = new ThreadLocal<>();
     private final ConfiguredObject<?> _object;
-    private final ObjectMapper _objectMapper;
 
     public AncestorAttributeResolver(final ConfiguredObject<?> object)
     {
         _object = object;
-        _objectMapper = ConfiguredObjectJacksonModule.newObjectMapper(false);
     }
 
     @Override
@@ -108,7 +107,7 @@ public class AncestorAttributeResolver implements 
Strings.Resolver
                         {
                             StringWriter writer = new StringWriter();
 
-                            _objectMapper.writeValue(writer, returnVal);
+                            OBJECT_MAPPER.writeValue(writer, returnVal);
 
                             returnString = writer.toString();
                         }
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/model/AttributeValueConverter.java
 
b/broker-core/src/main/java/org/apache/qpid/server/model/AttributeValueConverter.java
index 34254dee7c..b702ea0b2c 100644
--- 
a/broker-core/src/main/java/org/apache/qpid/server/model/AttributeValueConverter.java
+++ 
b/broker-core/src/main/java/org/apache/qpid/server/model/AttributeValueConverter.java
@@ -70,6 +70,8 @@ import org.apache.qpid.server.util.Strings;
 
 abstract class AttributeValueConverter<T>
 {
+    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
     static final AttributeValueConverter<String> STRING_CONVERTER = new 
AttributeValueConverter<>()
     {
         @Override
@@ -615,10 +617,9 @@ abstract class AttributeValueConverter<T>
     private static <T> T convertFromJson(final String value, final 
ConfiguredObject object, final Class<T> valueType)
     {
         String interpolated = AbstractConfiguredObject.interpolate(object, 
value);
-        ObjectMapper objectMapper = new ObjectMapper();
         try
         {
-            return objectMapper.readValue(interpolated, valueType);
+            return OBJECT_MAPPER.readValue(interpolated, valueType);
         }
         catch (JacksonException e)
         {
@@ -869,10 +870,9 @@ abstract class AttributeValueConverter<T>
                 if(value instanceof String)
                 {
                     String interpolated = 
AbstractConfiguredObject.interpolate(object, (String) value);
-                    ObjectMapper objectMapper = new ObjectMapper();
                     try
                     {
-                        return convert(objectMapper.readValue(interpolated, 
List.class), object);
+                        return convert(OBJECT_MAPPER.readValue(interpolated, 
List.class), object);
                     }
                     catch (JacksonException e)
                     {
@@ -920,10 +920,9 @@ abstract class AttributeValueConverter<T>
                 if(value instanceof String)
                 {
                     String interpolated = 
AbstractConfiguredObject.interpolate(object, (String) value);
-                    ObjectMapper objectMapper = new ObjectMapper();
                     try
                     {
-                        return convert(objectMapper.readValue(interpolated, 
Set.class), object);
+                        return convert(OBJECT_MAPPER.readValue(interpolated, 
Set.class), object);
                     }
                     catch (JacksonException e)
                     {
@@ -972,10 +971,9 @@ abstract class AttributeValueConverter<T>
                 if(value instanceof String)
                 {
                     String interpolated = 
AbstractConfiguredObject.interpolate(object, (String) value);
-                    ObjectMapper objectMapper = new ObjectMapper();
                     try
                     {
-                        return convert(objectMapper.readValue(interpolated, 
List.class), object);
+                        return convert(OBJECT_MAPPER.readValue(interpolated, 
List.class), object);
                     }
                     catch (JacksonException e)
                     {
@@ -1025,10 +1023,9 @@ abstract class AttributeValueConverter<T>
                 if(value instanceof String)
                 {
                     String interpolated = 
AbstractConfiguredObject.interpolate(object, (String) value);
-                    ObjectMapper objectMapper = new ObjectMapper();
                     try
                     {
-                        return convert(objectMapper.readValue(interpolated, 
Map.class), object);
+                        return convert(OBJECT_MAPPER.readValue(interpolated, 
Map.class), object);
                     }
                     catch (JacksonException e)
                     {
@@ -1413,10 +1410,9 @@ abstract class AttributeValueConverter<T>
                 {
                     return null;
                 }
-                ObjectMapper objectMapper = new ObjectMapper();
                 try
                 {
-                    return convert(objectMapper.readValue(interpolated, 
Map.class), object);
+                    return convert(OBJECT_MAPPER.readValue(interpolated, 
Map.class), object);
                 }
                 catch (JacksonException e)
                 {
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectTypeRegistry.java
 
b/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectTypeRegistry.java
index c086cc86ec..ab215b37a6 100644
--- 
a/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectTypeRegistry.java
+++ 
b/broker-core/src/main/java/org/apache/qpid/server/model/ConfiguredObjectTypeRegistry.java
@@ -52,6 +52,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import tools.jackson.core.JacksonException;
+import tools.jackson.databind.ObjectMapper;
 
 import org.apache.qpid.server.plugin.ConfiguredObjectAttributeInjector;
 import org.apache.qpid.server.plugin.ConfiguredObjectRegistration;
@@ -63,7 +64,7 @@ import org.apache.qpid.server.util.Strings;
 public class ConfiguredObjectTypeRegistry
 {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(ConfiguredObjectTypeRegistry.class);
-
+    private static final ObjectMapper OBJECT_MAPPER = 
ConfiguredObjectJacksonModule.newObjectMapper(false);
     private static final Map<String, Integer> STANDARD_FIRST_FIELDS_ORDER = 
new HashMap<>();
 
     private static final ConcurrentMap<Class<?>, Class<? extends 
ConfiguredObject>> CATEGORY_CACHE =
@@ -1007,7 +1008,7 @@ public class ConfiguredObjectTypeRegistry
                         {
                             try
                             {
-                                stringValue = 
ConfiguredObjectJacksonModule.newObjectMapper(false).writeValueAsString(value);
+                                stringValue = 
OBJECT_MAPPER.writeValueAsString(value);
                             }
                             catch (JacksonException e)
                             {
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/model/OwnAttributeResolver.java
 
b/broker-core/src/main/java/org/apache/qpid/server/model/OwnAttributeResolver.java
index df3e111038..c244fef6e9 100644
--- 
a/broker-core/src/main/java/org/apache/qpid/server/model/OwnAttributeResolver.java
+++ 
b/broker-core/src/main/java/org/apache/qpid/server/model/OwnAttributeResolver.java
@@ -35,14 +35,13 @@ public class OwnAttributeResolver implements 
Strings.Resolver
 {
 
     public static final String PREFIX = "this:";
+    private static final ObjectMapper OBJECT_MAPPER = 
ConfiguredObjectJacksonModule.newObjectMapper(false);
     private final ThreadLocal<Set<String>> _stack = new ThreadLocal<>();
     private final ConfiguredObject<?> _object;
-    private final ObjectMapper _objectMapper;
 
     public OwnAttributeResolver(final ConfiguredObject<?> object)
     {
         _object = object;
-        _objectMapper = ConfiguredObjectJacksonModule.newObjectMapper(false);
     }
 
     @Override
@@ -83,7 +82,7 @@ public class OwnAttributeResolver implements Strings.Resolver
                         {
                             StringWriter writer = new StringWriter();
 
-                            _objectMapper.writeValue(writer, returnVal);
+                            OBJECT_MAPPER.writeValue(writer, returnVal);
 
                             returnString = writer.toString();
                         }
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/store/JsonFileConfigStore.java
 
b/broker-core/src/main/java/org/apache/qpid/server/store/JsonFileConfigStore.java
index 76409a90f1..d66584e4d7 100644
--- 
a/broker-core/src/main/java/org/apache/qpid/server/store/JsonFileConfigStore.java
+++ 
b/broker-core/src/main/java/org/apache/qpid/server/store/JsonFileConfigStore.java
@@ -56,6 +56,8 @@ public class JsonFileConfigStore extends 
AbstractJsonFileStore implements Durabl
 {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(JsonFileConfigStore.class);
 
+    private static final ObjectMapper OBJECT_MAPPER = 
ConfiguredObjectJacksonModule.newObjectMapper(true, 
SerializationFeature.INDENT_OUTPUT);
+
     private static final Comparator<Class<? extends ConfiguredObject>> 
CATEGORY_CLASS_COMPARATOR =
             Comparator.comparing(Class::getSimpleName);
     private static final Comparator<ConfiguredObjectRecord> 
CONFIGURED_OBJECT_RECORD_COMPARATOR = (left, right) ->
@@ -68,7 +70,6 @@ public class JsonFileConfigStore extends 
AbstractJsonFileStore implements Durabl
     private final Map<UUID, ConfiguredObjectRecord> _objectsById = new 
HashMap<>();
     private final Map<String, List<UUID>> _idsByType = new HashMap<>();
     private volatile Class<? extends ConfiguredObject> _rootClass;
-    private final ObjectMapper _objectMapper;
     private volatile Map<String,Class<? extends ConfiguredObject>> 
_classNameMapping;
 
     private ConfiguredObject<?> _parent;
@@ -80,7 +81,6 @@ public class JsonFileConfigStore extends 
AbstractJsonFileStore implements Durabl
     public JsonFileConfigStore(Class<? extends ConfiguredObject> rootClass)
     {
         super();
-        _objectMapper = ConfiguredObjectJacksonModule.newObjectMapper(true, 
SerializationFeature.INDENT_OUTPUT);
         _rootClass = rootClass;
     }
 
@@ -518,7 +518,7 @@ public class JsonFileConfigStore extends 
AbstractJsonFileStore implements Durabl
     @Override
     protected ObjectMapper getSerialisationObjectMapper()
     {
-        return _objectMapper;
+        return OBJECT_MAPPER;
     }
 
     private void assertState(State state)
diff --git 
a/broker-core/src/main/java/org/apache/qpid/server/store/preferences/JsonFilePreferenceStore.java
 
b/broker-core/src/main/java/org/apache/qpid/server/store/preferences/JsonFilePreferenceStore.java
index a6a2774e06..7fc432362d 100644
--- 
a/broker-core/src/main/java/org/apache/qpid/server/store/preferences/JsonFilePreferenceStore.java
+++ 
b/broker-core/src/main/java/org/apache/qpid/server/store/preferences/JsonFilePreferenceStore.java
@@ -39,9 +39,9 @@ import org.apache.qpid.server.store.StoreException;
 public class JsonFilePreferenceStore extends AbstractJsonFileStore implements 
PreferenceStore
 {
     private static final String DEFAULT_FILE_NAME = "userPreferences";
+    private static final ObjectMapper OBJECT_MAPPER = 
ConfiguredObjectJacksonModule.newObjectMapper(true, 
SerializationFeature.INDENT_OUTPUT);
     private final String _storePath;
     private final String _posixFilePermissions;
-    private final ObjectMapper _objectMapper;
     private final Map<UUID, StoredPreferenceRecord> _recordMap;
     private StoreState _storeState = StoreState.CLOSED;
 
@@ -50,7 +50,6 @@ public class JsonFilePreferenceStore extends 
AbstractJsonFileStore implements Pr
         super();
         _storePath = path;
         _posixFilePermissions = posixFilePermissions;
-        _objectMapper = ConfiguredObjectJacksonModule.newObjectMapper(true, 
SerializationFeature.INDENT_OUTPUT);
         _recordMap = new LinkedHashMap<>();
     }
 
@@ -72,7 +71,7 @@ public class JsonFilePreferenceStore extends 
AbstractJsonFileStore implements Pr
             StoreContent storeContent;
             try
             {
-                storeContent = _objectMapper.readValue(getConfigFile(), 
StoreContent.class);
+                storeContent = OBJECT_MAPPER.readValue(getConfigFile(), 
StoreContent.class);
             }
             catch (JacksonException e)
             {
@@ -172,7 +171,7 @@ public class JsonFilePreferenceStore extends 
AbstractJsonFileStore implements Pr
     @Override
     protected ObjectMapper getSerialisationObjectMapper()
     {
-        return _objectMapper;
+        return OBJECT_MAPPER;
     }
 
     private void updateOrCreateInternal(final Collection<PreferenceRecord> 
preferenceRecords)
diff --git 
a/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCConfigurationStore.java
 
b/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCConfigurationStore.java
index bb32d47884..84dfefc641 100644
--- 
a/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCConfigurationStore.java
+++ 
b/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCConfigurationStore.java
@@ -60,6 +60,8 @@ import org.apache.qpid.server.util.Action;
 
 public abstract class AbstractJDBCConfigurationStore implements 
MessageStoreProvider, DurableConfigurationStore
 {
+    private static final ObjectMapper READ_OBJECT_MAPPER = 
ConfiguredObjectJacksonModule.newObjectMapper(true);
+    private static final ObjectMapper WRITE_OBJECT_MAPPER = 
ConfiguredObjectJacksonModule.newObjectMapper(true);
     private final static String CONFIGURATION_VERSION_TABLE_NAME_SUFFIX = 
"QPID_CONFIG_VERSION";
     private final static String VERSION_1_CONFIGURED_OBJECTS_TABLE_NAME_SUFFIX 
= "QPID_CONFIGURED_OBJECTS";
     private final static String 
VERSION_1_CONFIGURED_OBJECT_HIERARCHY_TABLE_NAME_SUFFIX = 
"QPID_CONFIGURED_OBJECT_HIERARCHY";
@@ -178,7 +180,6 @@ public abstract class AbstractJDBCConfigurationStore 
implements MessageStoreProv
     private Collection<ConfiguredObjectRecordImpl> 
doVisitAllConfiguredObjectRecords(ConfiguredObjectRecordHandler handler) throws 
SQLException
     {
         Map<UUID, ConfiguredObjectRecordImpl> configuredObjects = new 
HashMap<>();
-        final ObjectMapper objectMapper = new ObjectMapper();
         try (Connection conn = newAutoCommitConnection())
         {
             PreparedStatement stmt = conn.prepareStatement("SELECT id, 
object_type, attributes FROM " + getConfiguredObjectsTableName());
@@ -194,7 +195,7 @@ public abstract class AbstractJDBCConfigurationStore 
implements MessageStoreProv
                         String attributes = getBlobAsString(rs, 3);
                         final ConfiguredObjectRecordImpl 
configuredObjectRecord =
                                 new 
ConfiguredObjectRecordImpl(UUID.fromString(id), objectType,
-                                                               
objectMapper.readValue(attributes, Map.class));
+                                                               
READ_OBJECT_MAPPER.readValue(attributes, Map.class));
                         configuredObjects.put(configuredObjectRecord.getId(), 
configuredObjectRecord);
 
                     }
@@ -451,7 +452,6 @@ public abstract class AbstractJDBCConfigurationStore 
implements MessageStoreProv
 
             Map<UUID,Map<String,Object>> bindingsToUpdate = new HashMap<>();
             List<UUID> others = new ArrayList<>();
-            final ObjectMapper objectMapper = 
ConfiguredObjectJacksonModule.newObjectMapper(true);
 
             PreparedStatement stmt = connection.prepareStatement("SELECT id, 
object_type, attributes FROM " + getConfiguredObjectsTableName());
             try
@@ -466,7 +466,7 @@ public abstract class AbstractJDBCConfigurationStore 
implements MessageStoreProv
                         {
                             continue;
                         }
-                        Map<String, Object> attributes = 
objectMapper.readValue(getBlobAsString(rs, 3), Map.class);
+                        Map<String, Object> attributes = 
READ_OBJECT_MAPPER.readValue(getBlobAsString(rs, 3), Map.class);
 
                         if (objectType.endsWith("Binding"))
                         {
@@ -540,7 +540,7 @@ public abstract class AbstractJDBCConfigurationStore 
implements MessageStoreProv
                 for(Map.Entry<UUID, Map<String,Object>> bindingEntry : 
bindingsToUpdate.entrySet())
                 {
                     stmt.setString(1, "Binding");
-                    byte[] attributesAsBytes = 
objectMapper.writeValueAsBytes(bindingEntry.getValue());
+                    byte[] attributesAsBytes = 
WRITE_OBJECT_MAPPER.writeValueAsBytes(bindingEntry.getValue());
 
                     ByteArrayInputStream bis = new 
ByteArrayInputStream(attributesAsBytes);
                     stmt.setBinaryStream(2, bis, attributesAsBytes.length);
@@ -816,8 +816,7 @@ public abstract class AbstractJDBCConfigurationStore 
implements MessageStoreProv
                         else
                         {
                             final Map<String, Object> attributes = 
configuredObject.getAttributes();
-                            final ObjectMapper objectMapper = 
ConfiguredObjectJacksonModule.newObjectMapper(true);
-                            byte[] attributesAsBytes = 
objectMapper.writeValueAsBytes(attributes);
+                            byte[] attributesAsBytes = 
WRITE_OBJECT_MAPPER.writeValueAsBytes(attributes);
 
                             ByteArrayInputStream bis = new 
ByteArrayInputStream(attributesAsBytes);
                             insertStmt.setBinaryStream(3, bis, 
attributesAsBytes.length);
@@ -936,7 +935,6 @@ public abstract class AbstractJDBCConfigurationStore 
implements MessageStoreProv
             try (ResultSet rs = stmt.executeQuery())
             {
 
-                final ObjectMapper objectMapper = 
ConfiguredObjectJacksonModule.newObjectMapper(true);
                 if (rs.next())
                 {
                     try (PreparedStatement stmt2 = 
conn.prepareStatement("UPDATE " + getConfiguredObjectsTableName()
@@ -945,7 +943,7 @@ public abstract class AbstractJDBCConfigurationStore 
implements MessageStoreProv
                         stmt2.setString(1, configuredObject.getType());
                         if (configuredObject.getAttributes() != null)
                         {
-                            byte[] attributesAsBytes = 
objectMapper.writeValueAsBytes(
+                            byte[] attributesAsBytes = 
WRITE_OBJECT_MAPPER.writeValueAsBytes(
                                     configuredObject.getAttributes());
                             ByteArrayInputStream bis = new 
ByteArrayInputStream(attributesAsBytes);
                             stmt2.setBinaryStream(2, bis, 
attributesAsBytes.length);
@@ -972,7 +970,7 @@ public abstract class AbstractJDBCConfigurationStore 
implements MessageStoreProv
                         else
                         {
                             final Map<String, Object> attributes = 
configuredObject.getAttributes();
-                            byte[] attributesAsBytes = 
objectMapper.writeValueAsBytes(attributes);
+                            byte[] attributesAsBytes = 
WRITE_OBJECT_MAPPER.writeValueAsBytes(attributes);
                             ByteArrayInputStream bis = new 
ByteArrayInputStream(attributesAsBytes);
                             insertStmt.setBinaryStream(3, bis, 
attributesAsBytes.length);
                         }
diff --git 
a/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCPreferenceStore.java
 
b/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCPreferenceStore.java
index 94a57d8726..fad4864e3e 100644
--- 
a/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCPreferenceStore.java
+++ 
b/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/AbstractJDBCPreferenceStore.java
@@ -53,6 +53,8 @@ import org.apache.qpid.server.util.BaseAction;
 
 public abstract class AbstractJDBCPreferenceStore implements PreferenceStore
 {
+    private static final ObjectMapper READ_OBJECT_MAPPER = new ObjectMapper();
+    private static final ObjectMapper WRITE_OBJECT_MAPPER = 
ConfiguredObjectJacksonModule.newObjectMapper(true);
     private static final String PREFERENCES_VERSION_TABLE_NAME = 
"PREFERENCES_VERSION";
     private static final String PREFERENCES_TABLE_NAME = "PREFERENCES";
 
@@ -368,10 +370,9 @@ public abstract class AbstractJDBCPreferenceStore 
implements PreferenceStore
                                      final Map<String, Object> attributes)
             throws JacksonException, SQLException
     {
-        final ObjectMapper objectMapper = 
ConfiguredObjectJacksonModule.newObjectMapper(true);
         if (attributes != null)
         {
-            byte[] attributesAsBytes = 
objectMapper.writeValueAsBytes(attributes);
+            byte[] attributesAsBytes = 
WRITE_OBJECT_MAPPER.writeValueAsBytes(attributes);
             ByteArrayInputStream bis = new 
ByteArrayInputStream(attributesAsBytes);
             preparedSqlStatement.setBinaryStream(parameterIndex, bis, 
attributesAsBytes.length);
         }
@@ -455,7 +456,6 @@ public abstract class AbstractJDBCPreferenceStore 
implements PreferenceStore
     private Collection<PreferenceRecord> getPreferenceRecords(final Connection 
connection) throws SQLException
     {
         Collection<PreferenceRecord> records = new LinkedHashSet<>();
-        final ObjectMapper objectMapper = new ObjectMapper();
         try (PreparedStatement stmt = 
connection.prepareStatement(String.format(SELECT_FROM_PREFERENCES,
                                                                                
 getPreferencesTableName())))
         {
@@ -465,7 +465,7 @@ public abstract class AbstractJDBCPreferenceStore 
implements PreferenceStore
                 {
                     String id = rs.getString(1);
                     String attributes = getBlobAsString(rs, 2);
-                    final PreferenceRecord preferenceRecord = new 
PreferenceRecordImpl(UUID.fromString(id), objectMapper.readValue(attributes, 
Map.class));
+                    final PreferenceRecord preferenceRecord = new 
PreferenceRecordImpl(UUID.fromString(id), 
READ_OBJECT_MAPPER.readValue(attributes, Map.class));
                     records.add(preferenceRecord);
                 }
             }
diff --git 
a/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementInputConverter.java
 
b/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementInputConverter.java
index fb28e674be..64f0b63797 100644
--- 
a/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementInputConverter.java
+++ 
b/broker-plugins/management-amqp/src/main/java/org/apache/qpid/server/management/amqp/ManagementInputConverter.java
@@ -28,6 +28,8 @@ import tools.jackson.databind.ObjectMapper;
 
 class ManagementInputConverter
 {
+    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
     private final ManagementNode _managementNode;
 
     ManagementInputConverter(final ManagementNode managementNode)
@@ -70,10 +72,9 @@ class ManagementInputConverter
                 }
                 else if(Collection.class.isAssignableFrom(clazz) || 
Map.class.isAssignableFrom(clazz))
                 {
-                    ObjectMapper objectMapper = new ObjectMapper();
                     try
                     {
-                        return objectMapper.readValue(input.toString(), clazz);
+                        return OBJECT_MAPPER.readValue(input.toString(), 
clazz);
                     }
                     catch (JacksonException e)
                     {
diff --git 
a/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
 
b/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
index c1580e4729..6b5205470c 100644
--- 
a/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
+++ 
b/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
@@ -139,6 +139,7 @@ import 
org.apache.qpid.server.util.ServerScopedRuntimeException;
 public class HttpManagement extends AbstractPluginAdapter<HttpManagement> 
implements HttpManagementConfiguration<HttpManagement>, PortManager
 {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(HttpManagement.class);
+    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
 
     // 1 minute by default
     public static final int DEFAULT_TIMEOUT_IN_SECONDS = 60;
@@ -930,12 +931,11 @@ public class HttpManagement extends 
AbstractPluginAdapter<HttpManagement> implem
         }
 
         final Set<String> combinationsAsString = new 
HashSet<>(combinations.size());
-        ObjectMapper mapper = new ObjectMapper();
         for (Set<String> combination : combinations)
         {
             try
             {
-                
combinationsAsString.add(mapper.writeValueAsString(combination));
+                
combinationsAsString.add(OBJECT_MAPPER.writeValueAsString(combination));
             }
             catch (JacksonException e)
             {
diff --git 
a/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java
 
b/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java
index 4df5757031..ddf3de018b 100644
--- 
a/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java
+++ 
b/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/AbstractServlet.java
@@ -79,6 +79,8 @@ public abstract class AbstractServlet extends HttpServlet
     protected static final String GENERIC_ERROR_MESSAGE = "There was an error 
when performing request, " +
             "see log file for details";
 
+    protected static final ObjectMapper RESPONSE_OBJECT_MAPPER = 
ConfiguredObjectJacksonModule
+            .newObjectMapper(false, SerializationFeature.INDENT_OUTPUT);
     /**
      * Allowed response headers
      */
@@ -280,8 +282,7 @@ public abstract class AbstractServlet extends HttpServlet
     private void writeObjectToResponse(Object object, HttpServletRequest 
request,  HttpServletResponse response) throws IOException
     {
         OutputStream stream = getOutputStream(request, response);
-        ObjectMapper mapper = 
ConfiguredObjectJacksonModule.newObjectMapper(false, 
SerializationFeature.INDENT_OUTPUT);
-        mapper.writeValue(stream, object);
+        RESPONSE_OBJECT_MAPPER.writeValue(stream, object);
     }
 
     protected void sendCachingHeadersOnResponse(HttpServletResponse response)
diff --git 
a/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/QueryServlet.java
 
b/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/QueryServlet.java
index 53aaf86e19..71039b3670 100644
--- 
a/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/QueryServlet.java
+++ 
b/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/QueryServlet.java
@@ -56,6 +56,7 @@ import org.apache.qpid.server.query.engine.model.QueryRequest;
 public abstract class QueryServlet<X extends ConfiguredObject<?>> extends 
AbstractServlet
 {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(QueryServlet.class);
+    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
 
     private static final CSVFormat CSV_FORMAT = new CSVFormat();
 
@@ -110,7 +111,7 @@ public abstract class QueryServlet<X extends 
ConfiguredObject<?>> extends Abstra
             }
             else
             {
-                final QueryRequest queryRequest = new 
ObjectMapper().readValue(content, QueryRequest.class);
+                final QueryRequest queryRequest = 
OBJECT_MAPPER.readValue(content, QueryRequest.class);
                 final QuerySettings querySettings = 
queryRequest.toQuerySettings();
                 final QueryEvaluator queryEvaluator = 
_queryEngine.createEvaluator();
                 final EvaluationResult<List<Map<String, Object>>> result = 
queryEvaluator.execute(queryRequest.getSql(), querySettings);
diff --git 
a/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java
 
b/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java
index 3502bfbecd..8f5beb5f75 100644
--- 
a/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java
+++ 
b/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java
@@ -64,6 +64,7 @@ public class RestServlet extends AbstractServlet
     private static final long serialVersionUID = 1L;
     private static final String APPLICATION_JSON = "application/json";
     private static final Logger LOGGER = 
LoggerFactory.getLogger(RestServlet.class);
+    private static final ObjectMapper REQUEST_OBJECT_MAPPER = new 
ObjectMapper();
 
     private transient ManagementController _managementController;
 
@@ -293,9 +294,7 @@ public class RestServlet extends AbstractServlet
                                                                       response,
                                                                       
getManagementConfiguration()))
         {
-            ObjectMapper mapper = ConfiguredObjectJacksonModule
-                    .newObjectMapper(false, 
SerializationFeature.INDENT_OUTPUT);
-            mapper.writeValue(stream, formattedResponse);
+            RESPONSE_OBJECT_MAPPER.writeValue(stream, formattedResponse);
         }
     }
 
@@ -425,7 +424,6 @@ public class RestServlet extends AbstractServlet
         private <T> T parse(Class<T> type) throws IOException, ServletException
         {
             T providedObject;
-            final ObjectMapper mapper = new ObjectMapper();
 
             if (_headers.containsKey("Content-Type") && 
_request.getHeader("Content-Type")
                                                                 
.startsWith("multipart/form-data"))
@@ -437,7 +435,7 @@ public class RestServlet extends AbstractServlet
                 {
                     if ("data".equals(part.getName()) && 
"application/json".equals(part.getContentType()))
                     {
-                        items = mapper.readValue(part.getInputStream(), 
LinkedHashMap.class);
+                        items = 
REQUEST_OBJECT_MAPPER.readValue(part.getInputStream(), LinkedHashMap.class);
                     }
                     else
                     {
@@ -455,7 +453,7 @@ public class RestServlet extends AbstractServlet
             }
             else
             {
-                providedObject = mapper.readValue(_request.getInputStream(), 
type);
+                providedObject = 
REQUEST_OBJECT_MAPPER.readValue(_request.getInputStream(), type);
             }
             return providedObject;
         }


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


Reply via email to