aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/fasterxml/jackson/databind/deser/std/StdValueInstantiator.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/fasterxml/jackson/databind/deser/std/StdValueInstantiator.java')
-rw-r--r--src/main/java/com/fasterxml/jackson/databind/deser/std/StdValueInstantiator.java125
1 files changed, 105 insertions, 20 deletions
diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/std/StdValueInstantiator.java b/src/main/java/com/fasterxml/jackson/databind/deser/std/StdValueInstantiator.java
index 2f4151271..280857cb3 100644
--- a/src/main/java/com/fasterxml/jackson/databind/deser/std/StdValueInstantiator.java
+++ b/src/main/java/com/fasterxml/jackson/databind/deser/std/StdValueInstantiator.java
@@ -8,6 +8,8 @@ import com.fasterxml.jackson.databind.annotation.JacksonStdImpl;
import com.fasterxml.jackson.databind.deser.*;
import com.fasterxml.jackson.databind.introspect.AnnotatedWithParams;
import com.fasterxml.jackson.databind.util.ClassUtil;
+import java.math.BigDecimal;
+import java.math.BigInteger;
/**
* Default {@link ValueInstantiator} implementation, which supports
@@ -46,7 +48,7 @@ public class StdValueInstantiator
protected SettableBeanProperty[] _constructorArguments;
// // // Delegate construction
-
+
protected JavaType _delegateType;
protected AnnotatedWithParams _delegateCreator;
protected SettableBeanProperty[] _delegateArguments;
@@ -56,13 +58,15 @@ public class StdValueInstantiator
protected JavaType _arrayDelegateType;
protected AnnotatedWithParams _arrayDelegateCreator;
protected SettableBeanProperty[] _arrayDelegateArguments;
-
+
// // // Scalar construction
protected AnnotatedWithParams _fromStringCreator;
protected AnnotatedWithParams _fromIntCreator;
protected AnnotatedWithParams _fromLongCreator;
+ protected AnnotatedWithParams _fromBigIntegerCreator;
protected AnnotatedWithParams _fromDoubleCreator;
+ protected AnnotatedWithParams _fromBigDecimalCreator;
protected AnnotatedWithParams _fromBooleanCreator;
/*
@@ -106,11 +110,13 @@ public class StdValueInstantiator
_arrayDelegateType = src._arrayDelegateType;
_arrayDelegateCreator = src._arrayDelegateCreator;
_arrayDelegateArguments = src._arrayDelegateArguments;
-
+
_fromStringCreator = src._fromStringCreator;
_fromIntCreator = src._fromIntCreator;
_fromLongCreator = src._fromLongCreator;
+ _fromBigIntegerCreator = src._fromBigIntegerCreator;
_fromDoubleCreator = src._fromDoubleCreator;
+ _fromBigDecimalCreator = src._fromBigDecimalCreator;
_fromBooleanCreator = src._fromBooleanCreator;
}
@@ -153,10 +159,14 @@ public class StdValueInstantiator
_fromLongCreator = creator;
}
+ public void configureFromBigIntegerCreator(AnnotatedWithParams creator) { _fromBigIntegerCreator = creator; }
+
public void configureFromDoubleCreator(AnnotatedWithParams creator) {
_fromDoubleCreator = creator;
}
+ public void configureFromBigDecimalCreator(AnnotatedWithParams creator) { _fromBigDecimalCreator = creator; }
+
public void configureFromBooleanCreator(AnnotatedWithParams creator) {
_fromBooleanCreator = creator;
}
@@ -193,11 +203,17 @@ public class StdValueInstantiator
}
@Override
+ public boolean canCreateFromBigInteger() { return _fromBigIntegerCreator != null; }
+
+ @Override
public boolean canCreateFromDouble() {
return (_fromDoubleCreator != null);
}
@Override
+ public boolean canCreateFromBigDecimal() { return _fromBigDecimalCreator != null; }
+
+ @Override
public boolean canCreateFromBoolean() {
return (_fromBooleanCreator != null);
}
@@ -245,7 +261,7 @@ public class StdValueInstantiator
public SettableBeanProperty[] getFromObjectArguments(DeserializationConfig config) {
return _constructorArguments;
}
-
+
/*
/**********************************************************
/* Public API implementation; instantiation from JSON Object
@@ -345,37 +361,106 @@ public class StdValueInstantiator
arg, rewrapCtorProblem(ctxt, t0));
}
}
+
+ if (_fromBigIntegerCreator != null) {
+ Object arg = BigInteger.valueOf(value);
+ try {
+ return _fromBigIntegerCreator.call1(arg);
+ } catch (Throwable t0) {
+ return ctxt.handleInstantiationProblem(_fromBigIntegerCreator.getDeclaringClass(),
+ arg, rewrapCtorProblem(ctxt, t0)
+ );
+ }
+ }
+
return super.createFromInt(ctxt, value);
}
@Override
public Object createFromLong(DeserializationContext ctxt, long value) throws IOException
{
- if (_fromLongCreator == null) {
- return super.createFromLong(ctxt, value);
+ if (_fromLongCreator != null) {
+ Object arg = Long.valueOf(value);
+ try {
+ return _fromLongCreator.call1(arg);
+ } catch (Throwable t0) {
+ return ctxt.handleInstantiationProblem(_fromLongCreator.getDeclaringClass(),
+ arg,
+ rewrapCtorProblem(ctxt, t0)
+ );
+ }
}
- Object arg = Long.valueOf(value);
- try {
- return _fromLongCreator.call1(arg);
- } catch (Throwable t0) {
- return ctxt.handleInstantiationProblem(_fromLongCreator.getDeclaringClass(),
- arg, rewrapCtorProblem(ctxt, t0));
+
+ if (_fromBigIntegerCreator != null) {
+ Object arg = BigInteger.valueOf(value);
+ try {
+ return _fromBigIntegerCreator.call1(arg);
+ } catch (Throwable t0) {
+ return ctxt.handleInstantiationProblem(_fromBigIntegerCreator.getDeclaringClass(),
+ arg, rewrapCtorProblem(ctxt, t0)
+ );
+ }
}
+
+ return super.createFromLong(ctxt, value);
+ }
+
+ @Override
+ public Object createFromBigInteger(DeserializationContext ctxt, BigInteger value) throws IOException
+ {
+ if (_fromBigDecimalCreator != null) {
+ try {
+ return _fromBigIntegerCreator.call1(value);
+ } catch (Throwable t) {
+ return ctxt.handleInstantiationProblem(_fromBigIntegerCreator.getDeclaringClass(),
+ value, rewrapCtorProblem(ctxt, t)
+ );
+ }
+ }
+
+ return super.createFromBigInteger(ctxt, value);
}
@Override
public Object createFromDouble(DeserializationContext ctxt, double value) throws IOException
{
- if (_fromDoubleCreator == null) {
- return super.createFromDouble(ctxt, value);
+ if(_fromDoubleCreator != null) {
+ Object arg = Double.valueOf(value);
+ try {
+ return _fromDoubleCreator.call1(arg);
+ } catch (Throwable t0) {
+ return ctxt.handleInstantiationProblem(_fromDoubleCreator.getDeclaringClass(),
+ arg, rewrapCtorProblem(ctxt, t0));
+ }
}
- Object arg = Double.valueOf(value);
- try {
- return _fromDoubleCreator.call1(arg);
- } catch (Throwable t0) {
- return ctxt.handleInstantiationProblem(_fromDoubleCreator.getDeclaringClass(),
- arg, rewrapCtorProblem(ctxt, t0));
+
+ if (_fromBigDecimalCreator != null) {
+ Object arg = BigDecimal.valueOf(value);
+ try {
+ return _fromBigDecimalCreator.call1(arg);
+ } catch (Throwable t0) {
+ return ctxt.handleInstantiationProblem(_fromBigDecimalCreator.getDeclaringClass(),
+ arg, rewrapCtorProblem(ctxt, t0));
+ }
}
+
+ return super.createFromDouble(ctxt, value);
+ }
+
+ @Override
+ public Object createFromBigDecimal(DeserializationContext ctxt, BigDecimal value) throws IOException
+ {
+ if (_fromBigDecimalCreator != null) {
+ try {
+ return _fromBigDecimalCreator.call1(value);
+ } catch (Throwable t) {
+ return ctxt.handleInstantiationProblem(_fromBigDecimalCreator.getDeclaringClass(),
+ value, rewrapCtorProblem(ctxt, t)
+ );
+ }
+ }
+
+ return super.createFromBigDecimal(ctxt, value);
}
@Override