From b4e6fa332c4fa5fec7e4caab89748e252cc364db Mon Sep 17 00:00:00 2001 From: Shalnark <65479699+Shounaks@users.noreply.github.com> Date: Thu, 22 Feb 2024 08:14:07 +0530 Subject: [PATCH 1/2] Adding Single Integer Constructor Support for 2.17 --- .../AnnotationBasedIntrospector.java | 16 +++++----------- .../jr/ob/impl/BeanPropertyIntrospector.java | 14 ++++++-------- .../jackson/jr/ob/impl/BeanReader.java | 18 ++++++++++++------ .../jackson/jr/ob/impl/POJODefinition.java | 5 ++++- .../jackson/jr/ob/impl/ValueReaderLocator.java | 3 ++- .../jr/failing/ReadWithCtors25Test.java | 4 ++-- 6 files changed, 31 insertions(+), 29 deletions(-) diff --git a/jr-annotation-support/src/main/java/com/fasterxml/jackson/jr/annotationsupport/AnnotationBasedIntrospector.java b/jr-annotation-support/src/main/java/com/fasterxml/jackson/jr/annotationsupport/AnnotationBasedIntrospector.java index 53c3882f..1842ed97 100644 --- a/jr-annotation-support/src/main/java/com/fasterxml/jackson/jr/annotationsupport/AnnotationBasedIntrospector.java +++ b/jr-annotation-support/src/main/java/com/fasterxml/jackson/jr/annotationsupport/AnnotationBasedIntrospector.java @@ -85,6 +85,7 @@ protected POJODefinition introspectDefinition() Constructor defaultCtor = null; Constructor stringCtor = null; Constructor longCtor = null; + Constructor intCtor = null; // A few things only matter during deserialization: constructors, // secondary ignoral information: @@ -99,18 +100,16 @@ protected POJODefinition introspectDefinition() stringCtor = ctor; } else if (argType == Long.class || argType == Long.TYPE) { longCtor = ctor; - } else { - continue; + } else if(argType == Integer.class || argType == Integer.TYPE) { + intCtor = ctor; } - } else { - continue; } } } POJODefinition def = new POJODefinition(_type, _pruneProperties(_forSerialization), - defaultCtor, stringCtor, longCtor); + defaultCtor, stringCtor, longCtor, intCtor); if (_ignorableNames != null) { def = def.withIgnorals(_ignorableNames); } @@ -492,12 +491,7 @@ protected ANN _find(AnnotatedElement elem, Class a */ protected APropBuilder _propBuilder(String name) { - APropBuilder b = _props.get(name); - if (b == null) { - b = new APropBuilder(name); - _props.put(name, b); - } - return b; + return _props.computeIfAbsent(name,APropBuilder::new); } protected void _addIgnoral(String name) { diff --git a/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/BeanPropertyIntrospector.java b/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/BeanPropertyIntrospector.java index 1eb5815f..c23b3991 100644 --- a/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/BeanPropertyIntrospector.java +++ b/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/BeanPropertyIntrospector.java @@ -47,12 +47,13 @@ public POJODefinition pojoDefinitionForSerialization(JSONWriter w, Class pojo private POJODefinition _construct(Class beanType, int features) { - Map propsByName = new TreeMap(); + Map propsByName = new TreeMap<>(); _introspect(beanType, propsByName, features); Constructor defaultCtor = null; Constructor stringCtor = null; Constructor longCtor = null; + Constructor intCtor = null; for (Constructor ctor : beanType.getDeclaredConstructors()) { Class[] argTypes = ctor.getParameterTypes(); @@ -64,11 +65,9 @@ private POJODefinition _construct(Class beanType, int features) stringCtor = ctor; } else if (argType == Long.class || argType == Long.TYPE) { longCtor = ctor; - } else { - continue; + } else if (argType == Integer.class || argType == Integer.TYPE) { + intCtor = ctor; } - } else { - continue; } } final int len = propsByName.size(); @@ -82,7 +81,7 @@ private POJODefinition _construct(Class beanType, int features) props[i++] = builder.build(); } } - return new POJODefinition(beanType, props, defaultCtor, stringCtor, longCtor); + return new POJODefinition(beanType, props, defaultCtor, stringCtor, longCtor, intCtor); } private static void _introspect(Class currType, Map props, @@ -98,8 +97,7 @@ private static void _introspect(Class currType, Map prop // then public fields (since 2.8); may or may not be ultimately included // but at this point still possible for (Field f : currType.getDeclaredFields()) { - if (!Modifier.isPublic(f.getModifiers()) - || f.isEnumConstant() || f.isSynthetic()) { + if (!Modifier.isPublic(f.getModifiers()) || f.isEnumConstant() || f.isSynthetic()) { continue; } // Only include static members if (a) inclusion feature enabled and diff --git a/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/BeanReader.java b/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/BeanReader.java index 826f1cc8..e55dbb3f 100644 --- a/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/BeanReader.java +++ b/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/BeanReader.java @@ -34,12 +34,13 @@ public class BeanReader protected final Constructor _defaultCtor; protected final Constructor _stringCtor; protected final Constructor _longCtor; + protected final Constructor _intCtor; /** * Constructors used for deserialization use case */ public BeanReader(Class type, Map props, - Constructor defaultCtor, Constructor stringCtor, Constructor longCtor, + Constructor defaultCtor, Constructor stringCtor, Constructor longCtor, Constructor intCtor, Set ignorableNames, Map aliasMapping) { super(type); @@ -47,6 +48,8 @@ public BeanReader(Class type, Map props, _defaultCtor = defaultCtor; _stringCtor = stringCtor; _longCtor = longCtor; + _intCtor = intCtor; + if (ignorableNames == null) { ignorableNames = Collections.emptySet(); } @@ -59,8 +62,8 @@ public BeanReader(Class type, Map props, @Deprecated // since 2.11 public BeanReader(Class type, Map props, - Constructor defaultCtor, Constructor stringCtor, Constructor longCtor) { - this(type, props, defaultCtor, stringCtor, longCtor, null, null); + Constructor defaultCtor, Constructor stringCtor, Constructor longCtor,Constructor intCtor) { + this(type, props, defaultCtor, stringCtor, longCtor,intCtor, null, null); } public Map propertiesByName() { return _propsByName; } @@ -191,10 +194,13 @@ protected Object create(String str) throws Exception { } protected Object create(long l) throws Exception { - if (_longCtor == null) { - throw new IllegalStateException("Class "+_valueType.getName()+" does not have single-long constructor to use"); + if (_longCtor != null) { + return _longCtor.newInstance(l); + } else if(_intCtor != null) { + return _intCtor.newInstance((int) l); + } else { + throw new IllegalStateException("Class "+_valueType.getName()+" does not have single-long or single-int constructor to use"); } - return _longCtor.newInstance(l); } protected void handleUnknown(JSONReader reader, JsonParser parser, String fieldName) throws IOException { diff --git a/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/POJODefinition.java b/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/POJODefinition.java index 0673c05a..91ec797d 100644 --- a/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/POJODefinition.java +++ b/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/POJODefinition.java @@ -29,15 +29,17 @@ public class POJODefinition public final Constructor defaultCtor; public final Constructor stringCtor; public final Constructor longCtor; + public final Constructor intCtor; public POJODefinition(Class type, Prop[] props, - Constructor defaultCtor0, Constructor stringCtor0, Constructor longCtor0) + Constructor defaultCtor0, Constructor stringCtor0, Constructor longCtor0,Constructor intCtor0) { _type = type; _properties = props; defaultCtor = defaultCtor0; stringCtor = stringCtor0; longCtor = longCtor0; + intCtor = intCtor0; _ignorableNames = null; } @@ -49,6 +51,7 @@ protected POJODefinition(POJODefinition base, defaultCtor = base.defaultCtor; stringCtor = base.stringCtor; longCtor = base.longCtor; + intCtor = base.intCtor; _ignorableNames = ignorableN; } diff --git a/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/ValueReaderLocator.java b/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/ValueReaderLocator.java index c0bbb10c..96b05574 100644 --- a/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/ValueReaderLocator.java +++ b/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/ValueReaderLocator.java @@ -443,6 +443,7 @@ protected BeanReader _resolveBeanForDeser(Class raw, POJODefinition beanDef) Constructor defaultCtor = beanDef.defaultCtor; Constructor stringCtor = beanDef.stringCtor; Constructor longCtor = beanDef.longCtor; + Constructor intCtor = beanDef.intCtor; final boolean forceAccess = JSON.Feature.FORCE_REFLECTION_ACCESS.isEnabled(_features); if (forceAccess) { @@ -514,7 +515,7 @@ protected BeanReader _resolveBeanForDeser(Class raw, POJODefinition beanDef) } } } - return new BeanReader(raw, propMap, defaultCtor, stringCtor, longCtor, + return new BeanReader(raw, propMap, defaultCtor, stringCtor, longCtor,intCtor, beanDef.getIgnorableNames(), aliasMapping); } diff --git a/jr-objects/src/test/java/com/fasterxml/jackson/jr/failing/ReadWithCtors25Test.java b/jr-objects/src/test/java/com/fasterxml/jackson/jr/failing/ReadWithCtors25Test.java index 4b9e5c5f..f3408618 100644 --- a/jr-objects/src/test/java/com/fasterxml/jackson/jr/failing/ReadWithCtors25Test.java +++ b/jr-objects/src/test/java/com/fasterxml/jackson/jr/failing/ReadWithCtors25Test.java @@ -6,12 +6,12 @@ // for [jackson-jr#25], allowing single-int constructors public class ReadWithCtors25Test extends TestBase { - static class FromInt1 { + public static class FromInt1 { protected int value; public FromInt1(int v) { value = v; } } - static class FromInt2 { + public static class FromInt2 { protected int value; public FromInt2(Integer v) { value = v.intValue(); } } From 9a320cb81c1586458a1cd78ecc90a290ff55ea27 Mon Sep 17 00:00:00 2001 From: Shalnark <65479699+Shounaks@users.noreply.github.com> Date: Fri, 23 Feb 2024 22:06:06 +0530 Subject: [PATCH 2/2] Creating ConstructorDefinition for propogation of constructors. --- .../AnnotationBasedIntrospector.java | 20 ++-- .../jr/ob/impl/BeanPropertyIntrospector.java | 15 +-- .../jackson/jr/ob/impl/BeanReader.java | 107 ++++++++---------- .../jr/ob/impl/ConstructorDefinition.java | 29 +++++ .../jackson/jr/ob/impl/POJODefinition.java | 24 +--- .../jr/ob/impl/ValueReaderLocator.java | 18 +-- .../jr/ob/impl/ValueWriterLocator.java | 4 +- 7 files changed, 106 insertions(+), 111 deletions(-) create mode 100644 jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/ConstructorDefinition.java diff --git a/jr-annotation-support/src/main/java/com/fasterxml/jackson/jr/annotationsupport/AnnotationBasedIntrospector.java b/jr-annotation-support/src/main/java/com/fasterxml/jackson/jr/annotationsupport/AnnotationBasedIntrospector.java index 1842ed97..ac35c516 100644 --- a/jr-annotation-support/src/main/java/com/fasterxml/jackson/jr/annotationsupport/AnnotationBasedIntrospector.java +++ b/jr-annotation-support/src/main/java/com/fasterxml/jackson/jr/annotationsupport/AnnotationBasedIntrospector.java @@ -12,6 +12,7 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.jr.ob.JSON; +import com.fasterxml.jackson.jr.ob.impl.ConstructorDefinition; import com.fasterxml.jackson.jr.ob.impl.JSONReader; import com.fasterxml.jackson.jr.ob.impl.JSONWriter; import com.fasterxml.jackson.jr.ob.impl.POJODefinition; @@ -82,34 +83,29 @@ protected POJODefinition introspectDefinition() _findFields(); _findMethods(); - Constructor defaultCtor = null; - Constructor stringCtor = null; - Constructor longCtor = null; - Constructor intCtor = null; + ConstructorDefinition ctorDef = new ConstructorDefinition(); - // A few things only matter during deserialization: constructors, + // A few things only matter during deserialization: ctorDef, // secondary ignoral information: if (!_forSerialization) { for (Constructor ctor : _type.getDeclaredConstructors()) { Class[] argTypes = ctor.getParameterTypes(); if (argTypes.length == 0) { - defaultCtor = ctor; + ctorDef.register(null,ctor); } else if (argTypes.length == 1) { Class argType = argTypes[0]; if (argType == String.class) { - stringCtor = ctor; + ctorDef.register(String.class,ctor); } else if (argType == Long.class || argType == Long.TYPE) { - longCtor = ctor; + ctorDef.register(Long.class,ctor); } else if(argType == Integer.class || argType == Integer.TYPE) { - intCtor = ctor; + ctorDef.register(Integer.class,ctor); } } } } - POJODefinition def = new POJODefinition(_type, - _pruneProperties(_forSerialization), - defaultCtor, stringCtor, longCtor, intCtor); + POJODefinition def = new POJODefinition(_type, _pruneProperties(_forSerialization), ctorDef); if (_ignorableNames != null) { def = def.withIgnorals(_ignorableNames); } diff --git a/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/BeanPropertyIntrospector.java b/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/BeanPropertyIntrospector.java index d821d927..8b5f324f 100644 --- a/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/BeanPropertyIntrospector.java +++ b/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/BeanPropertyIntrospector.java @@ -50,23 +50,20 @@ private POJODefinition _construct(Class beanType, int features) Map propsByName = new TreeMap<>(); _introspect(beanType, propsByName, features); - Constructor defaultCtor = null; - Constructor stringCtor = null; - Constructor longCtor = null; - Constructor intCtor = null; + ConstructorDefinition ctorDef = new ConstructorDefinition(); for (Constructor ctor : beanType.getDeclaredConstructors()) { Class[] argTypes = ctor.getParameterTypes(); if (argTypes.length == 0) { - defaultCtor = ctor; + ctorDef.register(null,ctor); } else if (argTypes.length == 1) { Class argType = argTypes[0]; if (argType == String.class) { - stringCtor = ctor; + ctorDef.register(String.class,ctor); } else if (argType == Long.class || argType == Long.TYPE) { - longCtor = ctor; + ctorDef.register(Long.class,ctor); } else if (argType == Integer.class || argType == Integer.TYPE) { - intCtor = ctor; + ctorDef.register(Integer.class,ctor); } } } @@ -81,7 +78,7 @@ private POJODefinition _construct(Class beanType, int features) props[i++] = builder.build(); } } - return new POJODefinition(beanType, props, defaultCtor, stringCtor, longCtor, intCtor); + return new POJODefinition(beanType, props, ctorDef); } private static void _introspect(Class currType, Map props, diff --git a/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/BeanReader.java b/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/BeanReader.java index e55dbb3f..a33f11cb 100644 --- a/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/BeanReader.java +++ b/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/BeanReader.java @@ -16,7 +16,7 @@ * and serialize (write) POJO as JSON. */ public class BeanReader - extends ValueReader // so we can chain calls for Collections, arrays + extends ValueReader // so we can chain calls for Collections, arrays { protected final Map _propsByName; @@ -31,24 +31,16 @@ public class BeanReader // @since 2.11 protected final Set _ignorableNames; - protected final Constructor _defaultCtor; - protected final Constructor _stringCtor; - protected final Constructor _longCtor; - protected final Constructor _intCtor; + ConstructorDefinition _ctorDef = new ConstructorDefinition(); /** * Constructors used for deserialization use case */ - public BeanReader(Class type, Map props, - Constructor defaultCtor, Constructor stringCtor, Constructor longCtor, Constructor intCtor, - Set ignorableNames, Map aliasMapping) - { + public BeanReader(Class type, Map props, ConstructorDefinition ctorDef, + Set ignorableNames, Map aliasMapping) { super(type); _propsByName = props; - _defaultCtor = defaultCtor; - _stringCtor = stringCtor; - _longCtor = longCtor; - _intCtor = intCtor; + _ctorDef = ctorDef; if (ignorableNames == null) { ignorableNames = Collections.emptySet(); @@ -61,12 +53,13 @@ public BeanReader(Class type, Map props, } @Deprecated // since 2.11 - public BeanReader(Class type, Map props, - Constructor defaultCtor, Constructor stringCtor, Constructor longCtor,Constructor intCtor) { - this(type, props, defaultCtor, stringCtor, longCtor,intCtor, null, null); + public BeanReader(Class type, Map props, ConstructorDefinition ctorDef) { + this(type, props, ctorDef, null, null); } - public Map propertiesByName() { return _propsByName; } + public Map propertiesByName() { + return _propsByName; + } public BeanPropertyReader findProperty(String name) { BeanPropertyReader prop = _propsByName.get(name); @@ -82,23 +75,21 @@ private final BeanPropertyReader _findAlias(String name) { } @Override - public Object readNext(JSONReader r, JsonParser p) throws IOException - { + public Object readNext(JSONReader r, JsonParser p) throws IOException { JsonToken t = p.nextToken(); try { switch (t) { - case VALUE_NULL: - return null; - case VALUE_STRING: - return create(p.getText()); - case VALUE_NUMBER_INT: - return create(p.getLongValue()); - case START_OBJECT: - { + case VALUE_NULL: + return null; + case VALUE_STRING: + return create(p.getText()); + case VALUE_NUMBER_INT: + return create(p.getLongValue()); + case START_OBJECT: { Object bean = create(); final Object[] valueBuf = r._setterBuffer; String propName; - + for (; (propName = p.nextFieldName()) != null; ) { BeanPropertyReader prop = findProperty(propName); if (prop == null) { @@ -111,45 +102,43 @@ public Object readNext(JSONReader r, JsonParser p) throws IOException // also verify we are not confused... if (!p.hasToken(JsonToken.END_OBJECT)) { throw _reportProblem(p); - } + } return bean; } - default: + default: } } catch (IOException e) { throw e; } catch (Exception e) { throw JSONObjectException.from(p, "Failed to create an instance of " - +_valueType.getName()+" due to ("+e.getClass().getName()+"): "+e.getMessage(), + + _valueType.getName() + " due to (" + e.getClass().getName() + "): " + e.getMessage(), e); } throw JSONObjectException.from(p, - "Can not create a "+_valueType.getName()+" instance out of "+_tokenDesc(p)); + "Can not create a " + _valueType.getName() + " instance out of " + _tokenDesc(p)); } - + /** * Method used for deserialization; will read an instance of the bean * type using given parser. */ @Override - public Object read(JSONReader r, JsonParser p) throws IOException - { + public Object read(JSONReader r, JsonParser p) throws IOException { JsonToken t = p.getCurrentToken(); try { switch (t) { - case VALUE_NULL: - return null; - case VALUE_STRING: - return create(p.getText()); - case VALUE_NUMBER_INT: - return create(p.getLongValue()); - case START_OBJECT: - { + case VALUE_NULL: + return null; + case VALUE_STRING: + return create(p.getText()); + case VALUE_NUMBER_INT: + return create(p.getLongValue()); + case START_OBJECT: { Object bean = create(); String propName; final Object[] valueBuf = r._setterBuffer; - + for (; (propName = p.nextFieldName()) != null; ) { BeanPropertyReader prop = findProperty(propName); if (prop == null) { @@ -162,11 +151,11 @@ public Object read(JSONReader r, JsonParser p) throws IOException // also verify we are not confused... if (!p.hasToken(JsonToken.END_OBJECT)) { throw _reportProblem(p); - } - + } + return bean; } - default: + default: } } catch (IOException e) { throw e; @@ -178,28 +167,24 @@ public Object read(JSONReader r, JsonParser p) throws IOException throw JSONObjectException.from(p, "Can not create a %s instance out of %s", _valueType.getName(), _tokenDesc(p)); } - + protected Object create() throws Exception { - if (_defaultCtor == null) { - throw new IllegalStateException("Class "+_valueType.getName()+" does not have default constructor to use"); - } - return _defaultCtor.newInstance((Object[]) null); + return _ctorDef.generateDefault(_valueType); } - + protected Object create(String str) throws Exception { - if (_stringCtor == null) { - throw new IllegalStateException("Class "+_valueType.getName()+" does not have single-String constructor to use"); - } - return _stringCtor.newInstance(str); + return _ctorDef.generateOrThrow(String.class,str, () -> new IllegalStateException("Class " + _valueType.getName() + " does not have single-String constructor to use")); } protected Object create(long l) throws Exception { + Constructor _longCtor = _ctorDef.getConstructor(Long.class); + Constructor _intCtor = _ctorDef.getConstructor(Integer.class); if (_longCtor != null) { return _longCtor.newInstance(l); - } else if(_intCtor != null) { + } else if (_intCtor != null) { return _intCtor.newInstance((int) l); } else { - throw new IllegalStateException("Class "+_valueType.getName()+" does not have single-long or single-int constructor to use"); + throw new IllegalStateException("Class " + _valueType.getName() + " does not have single-long or single-int constructor to use"); } } @@ -217,7 +202,7 @@ protected void handleUnknown(JSONReader reader, JsonParser parser, String fieldN } } throw JSONObjectException.from(parser, -"Unrecognized JSON property \"%s\" for Bean type `%s` (known properties: [%s])", + "Unrecognized JSON property \"%s\" for Bean type `%s` (known properties: [%s])", fieldName, _valueType.getName(), sb.toString()); } } @@ -226,6 +211,6 @@ protected void handleUnknown(JSONReader reader, JsonParser parser, String fieldN } protected IOException _reportProblem(JsonParser p) { - return JSONObjectException.from(p, "Unexpected token "+p.currentToken()+"; should get FIELD_NAME or END_OBJECT"); + return JSONObjectException.from(p, "Unexpected token " + p.currentToken() + "; should get FIELD_NAME or END_OBJECT"); } } diff --git a/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/ConstructorDefinition.java b/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/ConstructorDefinition.java new file mode 100644 index 00000000..6353cc62 --- /dev/null +++ b/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/ConstructorDefinition.java @@ -0,0 +1,29 @@ +package com.fasterxml.jackson.jr.ob.impl; + +import java.lang.reflect.Constructor; +import java.util.HashMap; +import java.util.function.Supplier; + +public class ConstructorDefinition { + private final HashMap, Constructor> constructorMap = new HashMap<>(); + + public ConstructorDefinition register(Class firstArgClass, Constructor constructor) { + constructorMap.putIfAbsent(firstArgClass, constructor); + return this; + } + + public Constructor getConstructor(Class firstArgClass) { + return (Constructor) constructorMap.get(firstArgClass); + } + + public T generateOrThrow(Class firstArgClass, Object initargs, Supplier exceptionSupplier) + throws X,Exception { + if (constructorMap.containsKey(firstArgClass)) return getConstructor(firstArgClass).newInstance(initargs); + else throw exceptionSupplier.get(); + } + + public Object generateDefault(Class valueType) throws Exception { + if (constructorMap.containsKey(null)) return constructorMap.get(null).newInstance((Object[]) null); + else throw new IllegalStateException("Class " + valueType.getName() + " does not have default constructor to use"); + } +} \ No newline at end of file diff --git a/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/POJODefinition.java b/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/POJODefinition.java index 91ec797d..b2257402 100644 --- a/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/POJODefinition.java +++ b/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/POJODefinition.java @@ -1,6 +1,5 @@ package com.fasterxml.jackson.jr.ob.impl; -import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.*; @@ -26,32 +25,19 @@ public class POJODefinition */ protected final Set _ignorableNames; - public final Constructor defaultCtor; - public final Constructor stringCtor; - public final Constructor longCtor; - public final Constructor intCtor; + ConstructorDefinition _ctorDef; - public POJODefinition(Class type, Prop[] props, - Constructor defaultCtor0, Constructor stringCtor0, Constructor longCtor0,Constructor intCtor0) - { + public POJODefinition(Class type, Prop[] props, ConstructorDefinition ctorDef) { _type = type; _properties = props; - defaultCtor = defaultCtor0; - stringCtor = stringCtor0; - longCtor = longCtor0; - intCtor = intCtor0; + _ctorDef=ctorDef; _ignorableNames = null; } - protected POJODefinition(POJODefinition base, - Prop[] props, Set ignorableN) - { + protected POJODefinition(POJODefinition base, Prop[] props, Set ignorableN) { _type = base._type; _properties = props; - defaultCtor = base.defaultCtor; - stringCtor = base.stringCtor; - longCtor = base.longCtor; - intCtor = base.intCtor; + _ctorDef = base._ctorDef; _ignorableNames = ignorableN; } diff --git a/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/ValueReaderLocator.java b/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/ValueReaderLocator.java index 96b05574..0c2eae77 100644 --- a/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/ValueReaderLocator.java +++ b/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/ValueReaderLocator.java @@ -440,10 +440,10 @@ protected POJODefinition _resolveBeanDef(Class raw) { protected BeanReader _resolveBeanForDeser(Class raw, POJODefinition beanDef) { - Constructor defaultCtor = beanDef.defaultCtor; - Constructor stringCtor = beanDef.stringCtor; - Constructor longCtor = beanDef.longCtor; - Constructor intCtor = beanDef.intCtor; + Constructor defaultCtor = beanDef._ctorDef.getConstructor(null); + Constructor stringCtor = beanDef._ctorDef.getConstructor(String.class); + Constructor longCtor = beanDef._ctorDef.getConstructor(Long.class); + Constructor intCtor = beanDef._ctorDef.getConstructor(Integer.class); final boolean forceAccess = JSON.Feature.FORCE_REFLECTION_ACCESS.isEnabled(_features); if (forceAccess) { @@ -456,6 +456,9 @@ protected BeanReader _resolveBeanForDeser(Class raw, POJODefinition beanDef) if (longCtor != null) { longCtor.setAccessible(true); } + if(intCtor != null) { + intCtor.setAccessible(true); + } } final boolean caseInsensitive = JSON.Feature.ACCEPT_CASE_INSENSITIVE_PROPERTIES.isEnabled(_features); @@ -468,9 +471,9 @@ protected BeanReader _resolveBeanForDeser(Class raw, POJODefinition beanDef) propMap = Collections.emptyMap(); } else { propMap = caseInsensitive - ? new TreeMap(String.CASE_INSENSITIVE_ORDER) + ? new TreeMap<>(String.CASE_INSENSITIVE_ORDER) // 13-May-2021, tatu: Let's retain ordering here: - : new LinkedHashMap(); + : new LinkedHashMap<>(); final boolean useFields = JSON.Feature.USE_FIELDS.isEnabled(_features); for (int i = 0; i < len; ++i) { POJODefinition.Prop rawProp = rawProps.get(i); @@ -515,8 +518,7 @@ protected BeanReader _resolveBeanForDeser(Class raw, POJODefinition beanDef) } } } - return new BeanReader(raw, propMap, defaultCtor, stringCtor, longCtor,intCtor, - beanDef.getIgnorableNames(), aliasMapping); + return new BeanReader(raw, propMap, beanDef._ctorDef, beanDef.getIgnorableNames(), aliasMapping); } private TypeBindings _bindings(Class ctxt) { diff --git a/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/ValueWriterLocator.java b/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/ValueWriterLocator.java index dc30fcdf..31d87ac2 100644 --- a/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/ValueWriterLocator.java +++ b/jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/ValueWriterLocator.java @@ -92,8 +92,8 @@ protected ValueWriterLocator(int features, ReaderWriterProvider rwp, ReaderWriterModifier rwm) { _features = features; - _knownSerTypes = new ConcurrentHashMap(20, 0.75f, 2); - _knownWriters = new CopyOnWriteArrayList(); + _knownSerTypes = new ConcurrentHashMap<>(20, 0.75f, 2); + _knownWriters = new CopyOnWriteArrayList<>(); _writeContext = null; _writerProvider = rwp; _writerModifier = rwm;