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

rmannibucau 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 87fd97f9 fixing too much exception wrapping test and impl
87fd97f9 is described below

commit 87fd97f91321eb269537ae72047512b7bb1ca5d5
Author: Romain Manni-Bucau <rmannibu...@gmail.com>
AuthorDate: Thu Aug 4 07:58:23 2022 +0200

    fixing too much exception wrapping test and impl
---
 .../apache/johnzon/mapper/MappingParserImpl.java   | 80 +++++++++++-----------
 .../MapperBeanConstructorExceptionsTest.java       |  8 +--
 2 files changed, 43 insertions(+), 45 deletions(-)

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 f98edb6d..711453d8 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
@@ -69,12 +69,14 @@ import java.util.TreeSet;
 import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
+import java.util.function.Function;
 import java.util.stream.DoubleStream;
 import java.util.stream.IntStream;
 import java.util.stream.LongStream;
 import java.util.stream.Stream;
 
 import static java.util.Arrays.asList;
+import static java.util.stream.Collectors.joining;
 import static java.util.stream.Collectors.toList;
 import static java.util.stream.Collectors.toMap;
 import static javax.json.JsonValue.ValueType.ARRAY;
@@ -253,13 +255,8 @@ public class MappingParserImpl implements MappingParser {
 
     private Object buildObject(final Type inType, final JsonObject object, 
final boolean applyObjectConverter,
                                final JsonPointerTracker jsonPointer, final 
Collection<Class<?>> skippedConverters) {
-        Type type = inType;
-        if (inType == Object.class) {
-            type = new JohnzonParameterizedType(Map.class, String.class, 
Object.class);
-        }
-
+        final Type type = inType == Object.class ? new 
JohnzonParameterizedType(Map.class, String.class, Object.class) : inType;
         if (applyObjectConverter && !(type instanceof ParameterizedType)) {
-
             if (!(type instanceof Class)) {
                 throw new MapperException("ObjectConverters are only supported 
for Classes not Types");
             }
@@ -295,7 +292,6 @@ public class MappingParserImpl implements MappingParser {
                 final Type[] fieldArgTypes = aType.getActualTypeArguments();
                 if (fieldArgTypes.length >= 2) {
                     final Class<?> raw = Class.class.cast(aType.getRawType());
-
                     final Map map;
                     if (SortedMap.class.isAssignableFrom(raw) || 
NavigableMap.class == raw || TreeMap.class == raw) {
                         map = config.getAttributeOrder() == null ? new 
TreeMap() : new TreeMap(config.getAttributeOrder());
@@ -314,14 +310,7 @@ public class MappingParserImpl implements MappingParser {
                     }
 
                     if (map != null) {
-
-                        Type keyType;
-                        if 
(ParameterizedType.class.isInstance(fieldArgTypes[0])) {
-                            keyType = fieldArgTypes[0];
-                        } else {
-                            keyType = fieldArgTypes[0];
-                        }
-
+                        final Type keyType = fieldArgTypes[0];
                         final boolean any = fieldArgTypes.length < 2 || 
fieldArgTypes[1] == Object.class;
                         for (final Map.Entry<String, JsonValue> value : 
object.entrySet()) {
                             final JsonValue jsonValue = value.getValue();
@@ -367,12 +356,10 @@ public class MappingParserImpl implements MappingParser {
         if (classMapping.factory == null) {
             throw new MissingFactoryException(classMapping.clazz, object, 
config.getSnippet().of(object));
         }
-
         if (config.isFailOnUnknown()) {
             if (!classMapping.setters.keySet().containsAll(object.keySet())) {
-                throw new MapperException("(fail on unknown properties): " + 
new HashSet<String>(object.keySet()) {{
-                    removeAll(classMapping.setters.keySet());
-                }});
+                throw new MapperException("(fail on unknown properties): " +
+                        object.keySet().stream().filter(it -> 
!classMapping.setters.containsKey(it)).collect(joining(", ", "[", "]")));
             }
         }
 
@@ -381,13 +368,17 @@ public class MappingParserImpl implements MappingParser {
             if (classMapping.factory.getParameterTypes() == null || 
classMapping.factory.getParameterTypes().length == 0) {
                 t = classMapping.factory.create(null);
             } else {
-                t = classMapping.factory.create(createParameters(classMapping, 
object, jsonPointer));
+                t = classMapping.factory.create(createParameters(classMapping, 
object, jsonPointer, e -> {
+                    if (FactoryCreateException.class.isInstance(e)) {
+                        throw FactoryCreateException.class.cast(e);
+                    }
+                    throw new FactoryCreateException(type, object, 
config.getSnippet().of(object), e);
+                }));
             }
-        } catch (FactoryCreateException e){
+        } catch (final FactoryCreateException e){
             throw e;
-        } catch (Exception e) {
-            final String snippet = config.getSnippet().of(object);
-            throw new FactoryCreateException(type, object, snippet, e);
+        } catch (final Exception e) {
+            throw new FactoryCreateException(type, object, 
config.getSnippet().of(object), e);
         }
 
         // store the new object under it's jsonPointer in case it gets 
referenced later
@@ -410,7 +401,6 @@ public class MappingParserImpl implements MappingParser {
 
             final JsonValue jsonValue = jsonEntry.getValue();
             final JsonValue.ValueType valueType = jsonValue != null ? 
jsonValue.getValueType() : null;
-
             try {
                 if (JsonValue.class == value.paramType) {
                     value.writer.write(t, jsonValue);
@@ -438,14 +428,22 @@ public class MappingParserImpl implements MappingParser {
                     final Object convertedValue = toValue(
                             existingInstance, jsonValue, value.converter, 
value.itemConverter,
                             value.paramType, value.objectConverter,
-                            isDedup() ? new JsonPointerTracker(jsonPointer, 
jsonEntry.getKey()) : null, inType);
+                            isDedup() ? new JsonPointerTracker(jsonPointer, 
jsonEntry.getKey()) : null, inType,
+                            e -> {
+                                if 
(SetterMappingException.class.isInstance(e)) {
+                                    throw SetterMappingException.class.cast(e);
+                                }
+                                final String snippet = 
config.getSnippet().of(jsonValue);
+                                throw new SetterMappingException(
+                                        classMapping.clazz, 
jsonEntry.getKey(), value.writer.getType(), valueType, snippet, e);
+                            });
                     if (convertedValue != null) {
                         setterMethod.write(t, convertedValue);
                     }
                 }
-            } catch (SetterMappingException alreadyHandled) {
+            } catch (final SetterMappingException alreadyHandled) {
                 throw alreadyHandled;
-            } catch (Exception e) {
+            } catch (final Exception e) {
                 final String snippet = jsonValue == null? "null": 
config.getSnippet().of(jsonValue);
                 throw new SetterMappingException(classMapping.clazz, 
jsonEntry.getKey(), value.writer.getType(), valueType, snippet, e);
             }
@@ -458,7 +456,8 @@ public class MappingParserImpl implements MappingParser {
                         classMapping.anySetter.invoke(t, key,
                                 toValue(null, entry.getValue(), null, null,
                                         
classMapping.anySetter.getGenericParameterTypes()[1], null,
-                                isDedup() ? new 
JsonPointerTracker(jsonPointer, entry.getKey()) : null, type));
+                                        isDedup() ? new 
JsonPointerTracker(jsonPointer, entry.getKey()) : null, type,
+                                        MapperException::new));
                     } catch (final IllegalAccessException e) {
                         throw new IllegalStateException(e);
                     } catch (final InvocationTargetException e) {
@@ -467,13 +466,13 @@ public class MappingParserImpl implements MappingParser {
                 }
             }
         } else if (classMapping.anyField != null) {
-            final Type tRef = type;
             try {
                 classMapping.anyField.set(t, object.entrySet().stream()
                     .filter(it -> 
!classMapping.setters.containsKey(it.getKey()))
                     .collect(toMap(Map.Entry::getKey, e -> toValue(null, 
e.getValue(), null, null,
                             
ParameterizedType.class.cast(classMapping.anyField.getGenericType()).getActualTypeArguments()[1],
 null,
-                            isDedup() ? new JsonPointerTracker(jsonPointer, 
e.getKey()) : null, tRef))));
+                            isDedup() ? new JsonPointerTracker(jsonPointer, 
e.getKey()) : null, type,
+                            MapperException::new))));
             } catch (final IllegalAccessException e) {
                 throw new IllegalStateException(e);
             }
@@ -486,7 +485,8 @@ public class MappingParserImpl implements MappingParser {
                     final Object convertedValue = toValue(
                             null, e.getValue(), null, null,
                             classMapping.mapAdderType, null,
-                            new JsonPointerTracker(jsonPointer, e.getKey()), 
inType);
+                            new JsonPointerTracker(jsonPointer, e.getKey()), 
inType,
+                            MapperException::new);
                     if (convertedValue != null) {
                         try {
                             classMapping.mapAdder.invoke(t, e.getKey(), 
convertedValue);
@@ -498,7 +498,6 @@ public class MappingParserImpl implements MappingParser {
                     }
                 });
         }
-
         return t;
     }
 
@@ -1060,7 +1059,7 @@ public class MappingParserImpl implements MappingParser {
             collection.add(JsonValue.NULL.equals(value)
                     ? null
                     : toValue(null, value, null, itemConverter, mapping.arg, 
objectConverter,
-                    isDedup() ? new JsonPointerTracker(jsonPointer, i) : null, 
rootType));
+                    isDedup() ? new JsonPointerTracker(jsonPointer, i) : null, 
rootType, MapperException::new));
             i++;
         }
 
@@ -1083,7 +1082,8 @@ public class MappingParserImpl implements MappingParser {
     }
 
 
-    private Object[] createParameters(final Mappings.ClassMapping mapping, 
final JsonObject object, JsonPointerTracker jsonPointer) {
+    private Object[] createParameters(final Mappings.ClassMapping mapping, 
final JsonObject object, JsonPointerTracker jsonPointer,
+                                      final Function<Exception, 
RuntimeException> onException) {
         final int length = mapping.factory.getParameterTypes().length;
         final Object[] objects = new Object[length];
 
@@ -1097,7 +1097,8 @@ public class MappingParserImpl implements MappingParser {
                     parameterType,
                     mapping.factory.getObjectConverter()[i],
                     isDedup() ? new JsonPointerTracker(jsonPointer, paramName) 
: null,
-                    mapping.clazz); //X TODO ObjectConverter in 
@JohnzonConverter with Constructors!
+                    mapping.clazz, //X TODO ObjectConverter in 
@JohnzonConverter with Constructors!
+                    onException);
             if (objects[i] == null) {
                 objects[i] = getPrimitiveDefault(parameterType);
             }
@@ -1108,7 +1109,8 @@ public class MappingParserImpl implements MappingParser {
 
     private Object toValue(final Object baseInstance, final JsonValue 
jsonValue, final Adapter converter,
                            final Adapter itemConverter, final Type type, final 
ObjectConverter.Reader objectConverter,
-                           final JsonPointerTracker jsonPointer, final Type 
rootType) {
+                           final JsonPointerTracker jsonPointer, final Type 
rootType,
+                           final Function<Exception, RuntimeException> 
onException) {
 
         if (objectConverter != null) {
             return objectConverter.fromJson(jsonValue, type, this);
@@ -1118,11 +1120,11 @@ public class MappingParserImpl implements MappingParser 
{
             return converter == null ?
                     toObject(baseInstance, jsonValue, type, itemConverter, 
jsonPointer, rootType) :
                     convertTo(converter, jsonValue, jsonPointer, type);
-        } catch (Exception e) {
+        } catch (final Exception e) {
             if (e instanceof MapperException) {
                 throw e;
             }
-            throw new MapperException(e);
+            throw onException.apply(e);
         }
     }
 
diff --git 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperBeanConstructorExceptionsTest.java
 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperBeanConstructorExceptionsTest.java
index 3abb1ce6..c8a8570b 100644
--- 
a/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperBeanConstructorExceptionsTest.java
+++ 
b/johnzon-mapper/src/test/java/org/apache/johnzon/mapper/MapperBeanConstructorExceptionsTest.java
@@ -55,12 +55,8 @@ public class MapperBeanConstructorExceptionsTest {
                     return throwable;
                 }
             }, Spliterator.IMMUTABLE), false).collect(toList());
-            assertEquals(3, exceptionStack.size());
-
-            // warn: this *must* be 1 which requires to ensure the 
MapperException thrown by
-            //       org.apache.johnzon.mapper.MappingParserImpl.toValue is 
mutable to add the context/right message
-            //       (no need to strip it, an alternative could be to use 
addSuppressed but it would keep creating stacks for nothing)
-            assertEquals(2, 
exceptionStack.stream().filter(MapperException.class::isInstance).count());
+            assertEquals(2, exceptionStack.size());
+            assertEquals(1, 
exceptionStack.stream().filter(MapperException.class::isInstance).count());
         }
     }
 

Reply via email to