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

struberg pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/johnzon.git


The following commit(s) were added to refs/heads/master by this push:
     new 9539e6d  JOHNZON-226 register Adapters only once
9539e6d is described below

commit 9539e6d1487fbd26640aba55fafd4e5455c19ff8
Author: Mark Struberg <[email protected]>
AuthorDate: Tue Jul 30 17:45:58 2019 +0200

    JOHNZON-226 register Adapters only once
    
    Previous each MappingParserImpl has it's own set of ReverseAdapters.
    They got rebuilt with every parsing (as this creates a new MappingParserImpl
    each time.
    I've now moved the ReverseAdapterMap to Config and populate it upfront.
    
    I'm not yet fully happy with the solution as the ReverseAdapterMap also
    contains dynamically registered Adapters. So feel free to move the Map
    to a better place in the future.
---
 .../johnzon/core/RFC4627AwareInputStreamReader.java  |  2 +-
 .../java/org/apache/johnzon/mapper/MapperConfig.java | 13 +++++++++++++
 .../org/apache/johnzon/mapper/MappingParserImpl.java | 20 ++++----------------
 .../java/org/apache/johnzon/mapper/Mappings.java     |  1 +
 4 files changed, 19 insertions(+), 17 deletions(-)

diff --git 
a/johnzon-core/src/main/java/org/apache/johnzon/core/RFC4627AwareInputStreamReader.java
 
b/johnzon-core/src/main/java/org/apache/johnzon/core/RFC4627AwareInputStreamReader.java
index aa09804..2fe908e 100644
--- 
a/johnzon-core/src/main/java/org/apache/johnzon/core/RFC4627AwareInputStreamReader.java
+++ 
b/johnzon-core/src/main/java/org/apache/johnzon/core/RFC4627AwareInputStreamReader.java
@@ -87,7 +87,7 @@ final class RFC4627AwareInputStreamReader extends 
InputStreamReader {
         */
 
     private static Charset getCharset(final PushbackInputStream inputStream, 
Charset preferredCharset) {
-        Charset charset = preferredCharset != null ? preferredCharset : 
Charset.forName("UTF-8");
+        Charset charset = preferredCharset != null ? preferredCharset : 
StandardCharsets.UTF_8;
         int bomLength=0;
         try {
             final byte[] utfBytes = readAllBytes(inputStream);
diff --git 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
index f6aa057..02b150d 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MapperConfig.java
@@ -29,6 +29,7 @@ import java.nio.charset.Charset;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
 /**
@@ -59,6 +60,8 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig 
implements Cloneable {
     private final AccessMode accessMode;
     private final Charset encoding;
     private final ConcurrentMap<AdapterKey, Adapter<?, ?>> adapters;
+    private final ConcurrentMap<Adapter<?, ?>, AdapterKey> reverseAdapters;
+
     private final Map<Class<?>, ObjectConverter.Writer<?>> 
objectConverterWriters;
     private final Map<Class<?>, ObjectConverter.Reader<?>> 
objectConverterReaders;
     private final Comparator<String> attributeOrder;
@@ -100,7 +103,13 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig 
implements Cloneable {
         this.readAttributeBeforeWrite = readAttributeBeforeWrite;
         this.accessMode = accessMode;
         this.encoding = encoding;
+
+        // handle Adapters
         this.adapters = adapters;
+        this.reverseAdapters = new ConcurrentHashMap<>(adapters.size());
+        adapters.entrySet().forEach(e -> 
this.reverseAdapters.put(e.getValue(), e.getKey()));
+
+
         this.attributeOrder = attributeOrder;
         this.enforceQuoteString = enforceQuoteString;
         this.failOnUnknown = failOnUnknown;
@@ -292,6 +301,10 @@ public /* DON'T MAKE IT HIDDEN */ class MapperConfig 
implements Cloneable {
         return adapters;
     }
 
+    public ConcurrentMap<Adapter<?, ?>, AdapterKey> getReverseAdapters() {
+        return reverseAdapters;
+    }
+
     public Map<Class<?>, ObjectConverter.Writer<?>> 
getObjectConverterWriters() {
         return objectConverterWriters;
     }
diff --git 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
index 09a8a4d..43a089c 100644
--- 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
+++ 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java
@@ -85,7 +85,6 @@ public class MappingParserImpl implements MappingParser {
     private static final JohnzonParameterizedType ANY_LIST = new 
JohnzonParameterizedType(List.class, Object.class);
     private static final CharacterConverter CHARACTER_CONVERTER = new 
CharacterConverter(); // this one is particular, share the logic
 
-    protected final ConcurrentMap<Adapter<?, ?>, AdapterKey> 
reverseAdaptersRegistry;
     protected final ConcurrentMap<Class<?>, Method> valueOfs = new 
ConcurrentHashMap<Class<?>, Method>();
 
     private final MapperConfig config;
@@ -108,9 +107,6 @@ public class MappingParserImpl implements MappingParser {
 
         this.jsonReader = jsonReader;
 
-        reverseAdaptersRegistry = new 
ConcurrentHashMap<>(config.getAdapters().size());
-
-
         this.isDeduplicateObjects = isDeduplicateObjects;
 
         if (isDeduplicateObjects) {
@@ -476,21 +472,13 @@ public class MappingParserImpl implements MappingParser {
     }
 
     private AdapterKey getAdapterKey(final Adapter converter) {
-        AdapterKey adapterKey = reverseAdaptersRegistry.get(converter);
-        if (adapterKey == null) {
-            for (final Map.Entry<AdapterKey, Adapter<?, ?>> entry : 
config.getAdapters().entrySet()) {
-                if (entry.getValue() == converter) {
-                    adapterKey = entry.getKey();
-                    reverseAdaptersRegistry.put(converter, adapterKey);
-                    break;
-                }
-            }
-        }
+        AdapterKey adapterKey = config.getReverseAdapters().get(converter);
+
         if (adapterKey == null) {
             if (converter instanceof TypeAwareAdapter) {
                 TypeAwareAdapter typeAwareAdapter = (TypeAwareAdapter) 
converter;
                 adapterKey = new AdapterKey(typeAwareAdapter.getFrom(), 
typeAwareAdapter.getTo());
-                reverseAdaptersRegistry.putIfAbsent(converter, adapterKey);
+                config.getReverseAdapters().putIfAbsent(converter, adapterKey);
 
             } else {
                 final Type[] types = 
converter.getClass().getGenericInterfaces();
@@ -502,7 +490,7 @@ public class MappingParserImpl implements MappingParser {
                     if (Adapter.class == pt.getRawType()) {
                         final Type[] actualTypeArguments = 
pt.getActualTypeArguments();
                         adapterKey = new AdapterKey(actualTypeArguments[0], 
actualTypeArguments[1]);
-                        reverseAdaptersRegistry.putIfAbsent(converter, 
adapterKey);
+                        config.getReverseAdapters().putIfAbsent(converter, 
adapterKey);
                         break;
                     }
                 }
diff --git 
a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java 
b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java
index 539fdb8..061f1a5 100644
--- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mappings.java
@@ -70,6 +70,7 @@ public class Mappings {
         public final Method mapAdder;
         public final Class<?> mapAdderType;
 
+
         private Boolean deduplicateObjects;
         private boolean deduplicationEvaluated = false;
 

Reply via email to