Skip to content

Commit ff97ac9

Browse files
authored
Merge pull request #262 from FasterXML/tatu/3.0/databind-3561-set-deser-ctxt
Fixes for [databind#3561] changes (can only be merged after that goes)
2 parents ab609c6 + d2fb376 commit ff97ac9

29 files changed

+131
-137
lines changed

afterburner/src/main/java/tools/jackson/module/afterburner/deser/ABDeserializerModifier.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
public class ABDeserializerModifier extends ValueDeserializerModifier
1717
{
18+
private static final long serialVersionUID = 3L;
19+
1820
/**
1921
* Class loader to use for generated classes; if null, will try to
2022
* use class loader of the target class.

afterburner/src/main/java/tools/jackson/module/afterburner/deser/BeanPropertyMutator.java

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package tools.jackson.module.afterburner.deser;
22

3-
import java.io.IOException;
4-
53
/**
64
* Abstract class that defines interface for implementations
75
* that can be used proxy-like to change values of properties,
@@ -27,34 +25,40 @@ public BeanPropertyMutator() { }
2725
/**********************************************************************
2826
*/
2927

30-
public void intSetter(Object bean, int propertyIndex, int value) throws IOException {
28+
// !!! 04-Dec-2024, tatu: Wrt [databind#3561] we really SHOULD take in
29+
// and pass first argument of type `DeserializationContext` here.
30+
// But doing that would require changes to bytecode generation that
31+
// are non-trivial, and Afterburner may be deprecated with 3.0 anyway
32+
// so for now we just pass `null`
33+
34+
public void intSetter(Object bean, int propertyIndex, int value) {
3135
throw new UnsupportedOperationException("No intSetters defined");
3236
}
33-
public void longSetter(Object bean, int propertyIndex, long value) throws IOException {
37+
public void longSetter(Object bean, int propertyIndex, long value){
3438
throw new UnsupportedOperationException("No longSetters defined");
3539
}
36-
public void booleanSetter(Object bean, int propertyIndex, boolean value) throws IOException {
40+
public void booleanSetter(Object bean, int propertyIndex, boolean value) {
3741
throw new UnsupportedOperationException("No booleanSetters defined");
3842
}
39-
public void stringSetter(Object bean, int propertyIndex, String value) throws IOException {
43+
public void stringSetter(Object bean, int propertyIndex, String value) {
4044
throw new UnsupportedOperationException("No stringSetters defined");
4145
}
42-
public void objectSetter(Object bean, int propertyIndex, Object value) throws IOException {
46+
public void objectSetter(Object bean, int propertyIndex, Object value) {
4347
throw new UnsupportedOperationException("No objectSetters defined");
4448
}
45-
public void intField(Object bean, int propertyIndex, int value) throws IOException {
49+
public void intField(Object bean, int propertyIndex, int value) {
4650
throw new UnsupportedOperationException("No intFields defined");
4751
}
48-
public void longField(Object bean, int propertyIndex, long value) throws IOException {
52+
public void longField(Object bean, int propertyIndex, long value) {
4953
throw new UnsupportedOperationException("No longFields defined");
5054
}
51-
public void booleanField(Object bean, int propertyIndex, boolean value) throws IOException {
55+
public void booleanField(Object bean, int propertyIndex, boolean value) {
5256
throw new UnsupportedOperationException("No booleanFields defined");
5357
}
54-
public void stringField(Object bean, int propertyIndex, String value) throws IOException {
58+
public void stringField(Object bean, int propertyIndex, String value) {
5559
throw new UnsupportedOperationException("No stringFields defined");
5660
}
57-
public void objectField(Object bean, int propertyIndex, Object value) throws IOException {
61+
public void objectField(Object bean, int propertyIndex, Object value) {
5862
throw new UnsupportedOperationException("No objectFields defined");
5963
}
6064
}

afterburner/src/main/java/tools/jackson/module/afterburner/deser/CreatorOptimizer.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,8 @@ public CreatorOptimizer(Class<?> valueClass, MyClassLoader classLoader,
5656

5757
public ValueInstantiator createOptimized()
5858
{
59-
/* [Issue#11]: Need to avoid optimizing if we use delegate- or
60-
* property-based creators.
61-
*/
59+
// [Issue#11]: Need to avoid optimizing if we use delegate- or
60+
// property-based creators.
6261
if (_originalInstantiator.canCreateFromObjectWith()
6362
|| _originalInstantiator.canCreateUsingDelegate()) {
6463
return null;
Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package tools.jackson.module.afterburner.deser;
22

3-
import java.io.IOException;
4-
53
import tools.jackson.databind.deser.SettableBeanProperty;
64

75
/**
@@ -21,44 +19,44 @@ public DelegatingPropertyMutator(SettableBeanProperty prop) {
2119
}
2220

2321
@Override
24-
public void intSetter(Object bean, int propertyIndex, int value) throws IOException {
25-
_fallback.set(bean, value);
22+
public void intSetter(Object bean, int propertyIndex, int value) {
23+
_fallback.set(null, bean, value);
2624
}
2725
@Override
28-
public void longSetter(Object bean, int propertyIndex, long value) throws IOException {
29-
_fallback.set(bean, value);
26+
public void longSetter(Object bean, int propertyIndex, long value) {
27+
_fallback.set(null, bean, value);
3028
}
3129
@Override
32-
public void booleanSetter(Object bean, int propertyIndex, boolean value) throws IOException {
33-
_fallback.set(bean, value);
30+
public void booleanSetter(Object bean, int propertyIndex, boolean value) {
31+
_fallback.set(null, bean, value);
3432
}
3533
@Override
36-
public void stringSetter(Object bean, int propertyIndex, String value) throws IOException {
37-
_fallback.set(bean, value);
34+
public void stringSetter(Object bean, int propertyIndex, String value) {
35+
_fallback.set(null, bean, value);
3836
}
3937
@Override
40-
public void objectSetter(Object bean, int propertyIndex, Object value) throws IOException {
41-
_fallback.set(bean, value);
38+
public void objectSetter(Object bean, int propertyIndex, Object value) {
39+
_fallback.set(null, bean, value);
4240
}
4341

4442
@Override
45-
public void intField(Object bean, int propertyIndex, int value) throws IOException {
46-
_fallback.set(bean, value);
43+
public void intField(Object bean, int propertyIndex, int value) {
44+
_fallback.set(null, bean, value);
4745
}
4846
@Override
49-
public void longField(Object bean, int propertyIndex, long value) throws IOException {
50-
_fallback.set(bean, value);
47+
public void longField(Object bean, int propertyIndex, long value) {
48+
_fallback.set(null, bean, value);
5149
}
5250
@Override
53-
public void booleanField(Object bean, int propertyIndex, boolean value) throws IOException {
54-
_fallback.set(bean, value);
51+
public void booleanField(Object bean, int propertyIndex, boolean value) {
52+
_fallback.set(null, bean, value);
5553
}
5654
@Override
57-
public void stringField(Object bean, int propertyIndex, String value) throws IOException {
58-
_fallback.set(bean, value);
55+
public void stringField(Object bean, int propertyIndex, String value) {
56+
_fallback.set(null, bean, value);
5957
}
6058
@Override
61-
public void objectField(Object bean, int propertyIndex, Object value) throws IOException {
62-
_fallback.set(bean, value);
59+
public void objectField(Object bean, int propertyIndex, Object value) {
60+
_fallback.set(null, bean, value);
6361
}
6462
}

afterburner/src/main/java/tools/jackson/module/afterburner/deser/OptimizedSettableBeanProperty.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public abstract void deserializeAndSet(JsonParser p, DeserializationContext ctxt
7878
Object arg2) throws JacksonException;
7979

8080
@Override
81-
public abstract void set(Object bean, Object value);
81+
public abstract void set(DeserializationContext ctxt, Object bean, Object value);
8282

8383
/*
8484
/**********************************************************************
@@ -102,8 +102,8 @@ public abstract Object deserializeSetAndReturn(JsonParser p,
102102

103103

104104
@Override
105-
public Object setAndReturn(Object instance, Object value) {
106-
return delegate.setAndReturn(instance, value);
105+
public Object setAndReturn(DeserializationContext ctxt, Object instance, Object value) {
106+
return delegate.setAndReturn(ctxt, instance, value);
107107
}
108108

109109
/*
@@ -126,7 +126,7 @@ public int getOptimizedIndex() {
126126
* Helper method called when an exception is throw from mutator, to figure
127127
* out what to do.
128128
*/
129-
protected void _reportProblem(Object bean, Object value, Throwable e)
129+
protected void _reportProblem(DeserializationContext ctxt, Object bean, Object value, Throwable e)
130130
throws JacksonException
131131
{
132132
if ((e instanceof IllegalAccessError)
@@ -144,7 +144,7 @@ protected void _reportProblem(Object bean, Object value, Throwable e)
144144
_propertyMutator = new DelegatingPropertyMutator(delegate);
145145
}
146146
}
147-
delegate.set(bean, value);
147+
delegate.set(ctxt, bean, value);
148148
return;
149149
}
150150
if (e instanceof JacksonException) {

afterburner/src/main/java/tools/jackson/module/afterburner/deser/PropertyMutatorCollector.java

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -583,19 +583,18 @@ protected StackManipulation invocationOperation(AnnotatedMember annotatedMember,
583583
private MethodList<MethodDescription> getMatchingMethods(TypeDefinition beanClassDescription, String methodName) {
584584
return (MethodList<MethodDescription>) beanClassDescription.getDeclaredMethods().filter(named(methodName));
585585
}
586-
587586
}
588587

589-
590-
private static class MethodAppender<T extends OptimizedSettableBeanProperty<T>> extends AbstractDelegatingAppender<T> {
591-
588+
private static class MethodAppender<T extends OptimizedSettableBeanProperty<T>>
589+
extends AbstractDelegatingAppender<T>
590+
{
592591
private final TypeDescription beanClassDescription;
593592
private final List<T> props;
594593
private final MethodVariableAccess beanValueAccess;
595594

596595
MethodAppender(TypeDescription beanClassDescription,
597-
List<T> props,
598-
MethodVariableAccess beanValueAccess) {
596+
List<T> props,
597+
MethodVariableAccess beanValueAccess) {
599598
super(props);
600599
this.beanClassDescription = beanClassDescription;
601600
this.props = props;
@@ -635,13 +634,10 @@ protected StackManipulation single() {
635634

636635
private <T extends OptimizedSettableBeanProperty<T>> DynamicType.Builder<?> _addSetters(
637636
DynamicType.Builder<?> builder, List<T> props, String methodName, MethodVariableAccess beanValueAccess) {
638-
639637
return builder.method(named(methodName))
640-
.intercept(
641-
new Implementation.Simple(
642-
new MethodAppender<T>(beanClassDefinition, props, beanValueAccess)
643-
)
644-
);
638+
.intercept(
639+
new Implementation.Simple(
640+
new MethodAppender<T>(beanClassDefinition, props, beanValueAccess)
641+
));
645642
}
646-
647643
}

afterburner/src/main/java/tools/jackson/module/afterburner/deser/SettableBooleanFieldProperty.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,18 @@ public void deserializeAndSet(JsonParser p, DeserializationContext ctxt, Object
4848
try {
4949
_propertyMutator.booleanField(bean, _optimizedIndex, b);
5050
} catch (Throwable e) {
51-
_reportProblem(bean, b, e);
51+
_reportProblem(ctxt, bean, b, e);
5252
}
5353
}
5454

5555
@Override
56-
public void set(Object bean, Object value) {
56+
public void set(DeserializationContext ctxt, Object bean, Object value) {
5757
// not optimal (due to boxing), but better than using reflection:
5858
final boolean b = ((Boolean) value).booleanValue();
5959
try {
6060
_propertyMutator.booleanField(bean, _optimizedIndex, b);
6161
} catch (Throwable e) {
62-
_reportProblem(bean, b, e);
62+
_reportProblem(ctxt, bean, b, e);
6363
}
6464
}
6565

@@ -70,10 +70,10 @@ public Object deserializeSetAndReturn(JsonParser p,
7070
{
7171
JsonToken t = p.currentToken();
7272
if (t == JsonToken.VALUE_TRUE) {
73-
return setAndReturn(instance, Boolean.TRUE);
73+
return setAndReturn(ctxt, instance, Boolean.TRUE);
7474
}
7575
if (t == JsonToken.VALUE_FALSE) {
76-
return setAndReturn(instance, Boolean.FALSE);
76+
return setAndReturn(ctxt, instance, Boolean.FALSE);
7777
}
7878
return delegate.deserializeSetAndReturn(p, ctxt, instance);
7979
}

afterburner/src/main/java/tools/jackson/module/afterburner/deser/SettableBooleanMethodProperty.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,18 @@ public void deserializeAndSet(JsonParser p, DeserializationContext ctxt, Object
4848
try {
4949
_propertyMutator.booleanSetter(bean, _optimizedIndex, b);
5050
} catch (Throwable e) {
51-
_reportProblem(bean, b, e);
51+
_reportProblem(ctxt, bean, b, e);
5252
}
5353
}
5454

5555
@Override
56-
public void set(Object bean, Object value) {
56+
public void set(DeserializationContext ctxt, Object bean, Object value) {
5757
// not optimal (due to boxing), but better than using reflection:
5858
final boolean b = ((Boolean) value).booleanValue();
5959
try {
6060
_propertyMutator.booleanSetter(bean, _optimizedIndex, b);
6161
} catch (Throwable e) {
62-
_reportProblem(bean, b, e);
62+
_reportProblem(ctxt, bean, b, e);
6363
}
6464
}
6565

@@ -70,10 +70,10 @@ public Object deserializeSetAndReturn(JsonParser p,
7070
{
7171
JsonToken t = p.currentToken();
7272
if (t == JsonToken.VALUE_TRUE) {
73-
return setAndReturn(instance, Boolean.TRUE);
73+
return setAndReturn(ctxt, instance, Boolean.TRUE);
7474
}
7575
if (t == JsonToken.VALUE_FALSE) {
76-
return setAndReturn(instance, Boolean.FALSE);
76+
return setAndReturn(ctxt, instance, Boolean.FALSE);
7777
}
7878
return delegate.deserializeSetAndReturn(p, ctxt, instance);
7979
}

afterburner/src/main/java/tools/jackson/module/afterburner/deser/SettableIntFieldProperty.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public void deserializeAndSet(JsonParser p, DeserializationContext ctxt, Object
4343
try {
4444
_propertyMutator.intField(bean, _optimizedIndex, v);
4545
} catch (Throwable e) {
46-
_reportProblem(bean, v, e);
46+
_reportProblem(ctxt, bean, v, e);
4747
}
4848
}
4949

@@ -53,20 +53,20 @@ public Object deserializeSetAndReturn(JsonParser p,
5353
throws JacksonException
5454
{
5555
if (p.isExpectedNumberIntToken()) {
56-
return setAndReturn(instance, p.getIntValue());
56+
return setAndReturn(ctxt, instance, p.getIntValue());
5757
}
5858
return delegate.deserializeSetAndReturn(p, ctxt, instance);
5959
}
6060

6161
@Override
62-
public void set(Object bean, Object value)
62+
public void set(DeserializationContext ctxt, Object bean, Object value)
6363
{
6464
// not optimal (due to boxing), but better than using reflection:
6565
final int v = ((Number) value).intValue();
6666
try {
6767
_propertyMutator.intField(bean, _optimizedIndex, v);
6868
} catch (Throwable e) {
69-
_reportProblem(bean, v, e);
69+
_reportProblem(ctxt, bean, v, e);
7070
}
7171
}
7272
}

afterburner/src/main/java/tools/jackson/module/afterburner/deser/SettableIntMethodProperty.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public void deserializeAndSet(JsonParser p, DeserializationContext ctxt, Object
4444
try {
4545
_propertyMutator.intSetter(bean, _optimizedIndex, v);
4646
} catch (Throwable e) {
47-
_reportProblem(bean, v, e);
47+
_reportProblem(ctxt, bean, v, e);
4848
}
4949
}
5050

@@ -54,20 +54,20 @@ public Object deserializeSetAndReturn(JsonParser p,
5454
throws JacksonException
5555
{
5656
if (p.isExpectedNumberIntToken()) {
57-
return setAndReturn(instance, p.getIntValue());
57+
return setAndReturn(ctxt, instance, p.getIntValue());
5858
}
5959
return delegate.deserializeSetAndReturn(p, ctxt, instance);
6060
}
6161

6262
@Override
63-
public void set(Object bean, Object value)
63+
public void set(DeserializationContext ctxt, Object bean, Object value)
6464
{
6565
// not optimal (due to boxing), but better than using reflection:
6666
int v = ((Number) value).intValue();
6767
try {
6868
_propertyMutator.intSetter(bean, _optimizedIndex, v);
6969
} catch (Throwable e) {
70-
_reportProblem(bean, v, e);
70+
_reportProblem(ctxt, bean, v, e);
7171
}
7272
}
7373
}

0 commit comments

Comments
 (0)