Skip to content

Commit 3a4da22

Browse files
authored
refactor!: use Jackson 3 for chart config serialization (#8024)
* refactor Charts to use Jackson 3 * update spreadsheet chart test * cleanup tests
1 parent c9462da commit 3a4da22

File tree

30 files changed

+245
-284
lines changed

30 files changed

+245
-284
lines changed

vaadin-charts-flow-parent/vaadin-charts-flow-integration-tests/src/main/java/com/vaadin/flow/component/charts/examples/AbstractChartExample.java

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,17 @@
1717
import com.fasterxml.jackson.annotation.JsonIgnoreType;
1818
import com.fasterxml.jackson.annotation.JsonInclude;
1919
import com.fasterxml.jackson.annotation.PropertyAccessor;
20-
import com.fasterxml.jackson.core.JsonProcessingException;
21-
import com.fasterxml.jackson.databind.ObjectMapper;
22-
import com.fasterxml.jackson.databind.SerializationFeature;
2320
import com.vaadin.flow.component.Component;
2421
import com.vaadin.flow.component.ComponentEvent;
2522
import com.vaadin.flow.component.UI;
2623
import com.vaadin.flow.component.charts.Chart;
2724
import com.vaadin.flow.component.html.Div;
2825
import com.vaadin.flow.server.Command;
2926

27+
import tools.jackson.core.JacksonException;
28+
import tools.jackson.databind.SerializationFeature;
29+
import tools.jackson.databind.json.JsonMapper;
30+
3031
/**
3132
* Abstract class for all chart examples.
3233
*/
@@ -42,19 +43,22 @@ protected void showNotification(String message) {
4243
}
4344

4445
protected String createEventString(ComponentEvent<Chart> event) {
45-
ObjectMapper mapper = new ObjectMapper()
46-
.setSerializationInclusion(JsonInclude.Include.NON_NULL)
46+
JsonMapper mapper = JsonMapper.builder()
47+
.changeDefaultPropertyInclusion(handler -> handler
48+
.withValueInclusion(JsonInclude.Include.NON_NULL))
4749
.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)
4850
.enable(SerializationFeature.INDENT_OUTPUT)
49-
.setVisibility(PropertyAccessor.ALL,
50-
JsonAutoDetect.Visibility.NONE)
51-
.setVisibility(PropertyAccessor.FIELD,
52-
JsonAutoDetect.Visibility.ANY)
53-
.addMixIn(Command.class, JacksonMixinForIgnoreCommand.class);
51+
.changeDefaultVisibility(handler -> handler
52+
.withVisibility(PropertyAccessor.ALL,
53+
JsonAutoDetect.Visibility.NONE)
54+
.withVisibility(PropertyAccessor.FIELD,
55+
JsonAutoDetect.Visibility.ANY))
56+
.addMixIn(Command.class, JacksonMixinForIgnoreCommand.class)
57+
.build();
5458

5559
try {
5660
return mapper.writeValueAsString(event);
57-
} catch (JsonProcessingException e) {
61+
} catch (JacksonException e) {
5862
e.printStackTrace(); // NOSONAR
5963
return "";
6064
}

vaadin-charts-flow-parent/vaadin-charts-flow-integration-tests/src/main/java/com/vaadin/flow/component/charts/examples/timeline/util/StockPrices.java

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,12 @@
88
*/
99
package com.vaadin.flow.component.charts.examples.timeline.util;
1010

11-
import java.io.IOException;
1211
import java.io.InputStreamReader;
1312
import java.util.ArrayList;
1413
import java.util.Collections;
1514
import java.util.List;
1615

17-
import com.fasterxml.jackson.databind.ObjectMapper;
16+
import tools.jackson.databind.ObjectMapper;
1817

1918
public class StockPrices {
2019

@@ -180,16 +179,11 @@ private static List<OhlcData> readOhlcData(String filename) {
180179
}
181180

182181
private static JsonData readJsonDataFrom(String filename) {
183-
try {
184-
ObjectMapper mapper = new ObjectMapper();
185-
return mapper.readValue(
186-
new InputStreamReader(
187-
StockPrices.class.getResourceAsStream(filename)),
188-
JsonData.class);
189-
190-
} catch (IOException e) {
191-
throw new RuntimeException("Cannot read data from " + filename, e);
192-
}
182+
ObjectMapper mapper = new ObjectMapper();
183+
return mapper.readValue(
184+
new InputStreamReader(
185+
StockPrices.class.getResourceAsStream(filename)),
186+
JsonData.class);
193187
}
194188

195189
}

vaadin-charts-flow-parent/vaadin-charts-flow-svg-generator/src/test/java/com/vaadin/flow/component/charts/export/StockPrices.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import java.util.Collections;
1818
import java.util.List;
1919

20-
import com.fasterxml.jackson.databind.ObjectMapper;
20+
import tools.jackson.databind.ObjectMapper;
2121

2222
public class StockPrices {
2323

vaadin-charts-flow-parent/vaadin-charts-flow/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
<description>Vaadin Charts</description>
1313
<properties>
1414
<osgi.bundle.license>https://vaadin.com/commercial-license-and-service-terms</osgi.bundle.license>
15+
<jackson.version>3.0.0-rc9</jackson.version>
1516
</properties>
1617
<dependencies>
1718
<dependency>
@@ -43,6 +44,11 @@
4344
<artifactId>slf4j-simple</artifactId>
4445
<scope>test</scope>
4546
</dependency>
47+
<dependency>
48+
<groupId>tools.jackson.core</groupId>
49+
<artifactId>jackson-databind</artifactId>
50+
<version>${jackson.version}</version>
51+
</dependency>
4652
</dependencies>
4753
<build>
4854
<plugins>

vaadin-charts-flow-parent/vaadin-charts-flow/src/main/java/com/vaadin/flow/component/charts/model/Labels.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@
88
*/
99
package com.vaadin.flow.component.charts.model;
1010

11-
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
1211
import com.vaadin.flow.component.charts.model.serializers.LabelsRotationSerializer;
1312
import com.vaadin.flow.component.charts.model.style.Style;
1413

14+
import tools.jackson.databind.annotation.JsonSerialize;
15+
1516
public class Labels extends AbstractConfigurationObject {
1617

1718
private HorizontalAlign align;

vaadin-charts-flow-parent/vaadin-charts-flow/src/main/java/com/vaadin/flow/component/charts/model/serializers/AbstractSeriesBeanSerializer.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,12 @@
88
*/
99
package com.vaadin.flow.component.charts.model.serializers;
1010

11-
import java.io.IOException;
12-
13-
import com.fasterxml.jackson.core.JsonGenerator;
14-
import com.fasterxml.jackson.databind.SerializerProvider;
1511
import com.vaadin.flow.component.charts.model.AbstractSeries;
1612
import com.vaadin.flow.component.charts.model.PlotOptionsSeries;
1713

14+
import tools.jackson.core.JsonGenerator;
15+
import tools.jackson.databind.SerializationContext;
16+
1817
/**
1918
* Custom bean serializer for {@link AbstractSeries} that adds the type field.
2019
* We need to use a bean serializer so that annotations work.
@@ -31,18 +30,17 @@ public Class<AbstractSeries> getBeanClass() {
3130
@Override
3231
public void serialize(AbstractSeries bean,
3332
BeanSerializerDelegator<AbstractSeries> serializer,
34-
JsonGenerator jgen, SerializerProvider provider)
35-
throws IOException {
33+
JsonGenerator jgen, SerializationContext context) {
3634
AbstractSeries series = bean;
3735

3836
jgen.writeStartObject();
3937

4038
// write other fields as per normal serialization rules
41-
serializer.serializeFields(bean, jgen, provider);
39+
serializer.serializeProperties(bean, jgen, context);
4240

4341
if (series.getPlotOptions() != null
4442
&& !(bean.getPlotOptions() instanceof PlotOptionsSeries)) {
45-
jgen.writeObjectField("type",
43+
jgen.writePOJOProperty("type",
4644
series.getPlotOptions().getChartType());
4745
}
4846

vaadin-charts-flow-parent/vaadin-charts-flow/src/main/java/com/vaadin/flow/component/charts/model/serializers/AxisListSerializer.java

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,36 +8,33 @@
88
*/
99
package com.vaadin.flow.component.charts.model.serializers;
1010

11-
import java.io.IOException;
12-
13-
import com.fasterxml.jackson.core.JsonGenerator;
14-
import com.fasterxml.jackson.core.JsonProcessingException;
15-
import com.fasterxml.jackson.databind.JsonSerializer;
16-
import com.fasterxml.jackson.databind.Module;
17-
import com.fasterxml.jackson.databind.SerializerProvider;
18-
import com.fasterxml.jackson.databind.module.SimpleModule;
1911
import com.vaadin.flow.component.charts.model.AxisList;
2012

13+
import tools.jackson.core.JsonGenerator;
14+
import tools.jackson.databind.JacksonModule;
15+
import tools.jackson.databind.SerializationContext;
16+
import tools.jackson.databind.ValueSerializer;
17+
import tools.jackson.databind.module.SimpleModule;
18+
2119
/**
2220
* Serializer for {@link AxisList}
2321
*
2422
*/
25-
public class AxisListSerializer extends JsonSerializer<AxisList> {
23+
public class AxisListSerializer extends ValueSerializer<AxisList> {
2624

27-
public static Module getModule() {
25+
public static JacksonModule getModule() {
2826
SimpleModule module = new SimpleModule();
2927
module.addSerializer(AxisList.class, new AxisListSerializer());
3028
return module;
3129
}
3230

3331
@Override
3432
public void serialize(AxisList value, JsonGenerator gen,
35-
SerializerProvider serializers)
36-
throws IOException, JsonProcessingException {
33+
SerializationContext context) {
3734
if (value != null && value.getNumberOfAxes() == 1) {
38-
gen.writeObject(value.getAxis(0));
35+
gen.writePOJO(value.getAxis(0));
3936
} else if (value != null) {
40-
gen.writeObject(value.getAxes());
37+
gen.writePOJO(value.getAxes());
4138
}
4239
}
4340
}

vaadin-charts-flow-parent/vaadin-charts-flow/src/main/java/com/vaadin/flow/component/charts/model/serializers/AxisTitleBeanSerializer.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,11 @@
88
*/
99
package com.vaadin.flow.component.charts.model.serializers;
1010

11-
import java.io.IOException;
12-
13-
import com.fasterxml.jackson.core.JsonGenerator;
14-
import com.fasterxml.jackson.databind.SerializerProvider;
1511
import com.vaadin.flow.component.charts.model.AxisTitle;
1612

13+
import tools.jackson.core.JsonGenerator;
14+
import tools.jackson.databind.SerializationContext;
15+
1716
/**
1817
* Serializer for {@link com.vaadin.flow.component.charts.model.AxisTitle}.
1918
*
@@ -29,14 +28,14 @@ public Class<AxisTitle> getBeanClass() {
2928
@Override
3029
public void serialize(AxisTitle bean,
3130
BeanSerializerDelegator<AxisTitle> serializer, JsonGenerator jgen,
32-
SerializerProvider provider) throws IOException {
31+
SerializationContext context) {
3332
jgen.writeStartObject();
3433

3534
if (bean != null && bean.getText() == null) {
36-
jgen.writeNullField("text");
35+
jgen.writeNullProperty("text");
3736
} else {
3837
// write fields as per normal serialization rules
39-
serializer.serializeFields(bean, jgen, provider);
38+
serializer.serializeProperties(bean, jgen, context);
4039
}
4140

4241
jgen.writeEndObject();

vaadin-charts-flow-parent/vaadin-charts-flow/src/main/java/com/vaadin/flow/component/charts/model/serializers/BeanSerializationDelegate.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,9 @@
88
*/
99
package com.vaadin.flow.component.charts.model.serializers;
1010

11-
import java.io.IOException;
12-
13-
import com.fasterxml.jackson.core.JsonGenerator;
14-
import com.fasterxml.jackson.databind.SerializerProvider;
15-
import com.fasterxml.jackson.databind.ser.std.BeanSerializerBase;
11+
import tools.jackson.core.JsonGenerator;
12+
import tools.jackson.databind.SerializationContext;
13+
import tools.jackson.databind.ser.bean.BeanSerializerBase;
1614

1715
/**
1816
* Abstract class for bean serializers. It is called by
@@ -26,5 +24,5 @@ public abstract class BeanSerializationDelegate<T> {
2624

2725
public abstract void serialize(T bean,
2826
BeanSerializerDelegator<T> serializer, JsonGenerator jgen,
29-
SerializerProvider provider) throws IOException;
27+
SerializationContext context);
3028
}

vaadin-charts-flow-parent/vaadin-charts-flow/src/main/java/com/vaadin/flow/component/charts/model/serializers/BeanSerializerDelegator.java

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,17 @@
88
*/
99
package com.vaadin.flow.component.charts.model.serializers;
1010

11-
import java.io.IOException;
1211
import java.util.Set;
1312

14-
import com.fasterxml.jackson.core.JsonGenerationException;
15-
import com.fasterxml.jackson.core.JsonGenerator;
16-
import com.fasterxml.jackson.databind.SerializerProvider;
17-
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
18-
import com.fasterxml.jackson.databind.ser.impl.BeanAsArraySerializer;
19-
import com.fasterxml.jackson.databind.ser.impl.ObjectIdWriter;
20-
import com.fasterxml.jackson.databind.ser.std.BeanSerializerBase;
13+
import tools.jackson.core.JsonGenerator;
14+
import tools.jackson.databind.SerializationContext;
15+
import tools.jackson.databind.ValueSerializer;
16+
import tools.jackson.databind.ser.BeanPropertyWriter;
17+
import tools.jackson.databind.ser.bean.BeanAsArraySerializer;
18+
import tools.jackson.databind.ser.bean.BeanSerializerBase;
19+
import tools.jackson.databind.ser.bean.UnwrappingBeanSerializer;
20+
import tools.jackson.databind.ser.impl.ObjectIdWriter;
21+
import tools.jackson.databind.util.NameTransformer;
2122

2223
/**
2324
* Delegates serialization calls to the given instance of
@@ -39,11 +40,6 @@ public BeanSerializerDelegator(BeanSerializerBase source,
3940
super(source, objectIdWriter);
4041
}
4142

42-
public BeanSerializerDelegator(BeanSerializerBase source,
43-
String[] toIgnore) {
44-
super(source, toIgnore);
45-
}
46-
4743
public BeanSerializerDelegator(BeanSerializerBase source, Object filterId) {
4844
super(source, null, filterId);
4945
}
@@ -61,11 +57,6 @@ public BeanSerializerBase withObjectIdWriter(
6157
return new BeanSerializerDelegator(this, objectIdWriter);
6258
}
6359

64-
@Override
65-
protected BeanSerializerBase withIgnorals(Set<String> toIgnore) {
66-
return new BeanSerializerDelegator(this, toIgnore);
67-
}
68-
6960
@Override
7061
protected BeanSerializerBase withByNameInclusion(Set<String> set,
7162
Set<String> set1) {
@@ -87,23 +78,28 @@ protected BeanSerializerBase withProperties(
8778
@Override
8879
protected BeanSerializerBase asArraySerializer() {
8980
// copied from BeanSerializer
90-
if ((_objectIdWriter == null) && (_propertyFilterId == null)) {
91-
return new BeanAsArraySerializer(this);
81+
if (canCreateArraySerializer()) {
82+
return BeanAsArraySerializer.construct(this);
9283
}
9384
return this;
9485
}
9586

9687
@Override
9788
public void serialize(Object bean, JsonGenerator jgen,
98-
SerializerProvider provider) throws IOException {
89+
SerializationContext provider) {
9990
delegate.serialize(delegate.getBeanClass().cast(bean), this, jgen,
10091
provider);
10192
}
10293

10394
@Override
104-
public void serializeFields(Object bean, JsonGenerator jgen,
105-
SerializerProvider provider)
106-
throws IOException, JsonGenerationException {
107-
super.serializeFields(bean, jgen, provider);
95+
public ValueSerializer<Object> unwrappingSerializer(
96+
NameTransformer unwrapper) {
97+
// copied from BeanSerializer
98+
return new UnwrappingBeanSerializer(this, unwrapper);
99+
}
100+
101+
public void serializeProperties(Object bean, JsonGenerator jgen,
102+
SerializationContext provider) {
103+
super._serializeProperties(bean, jgen, provider);
108104
}
109105
}

0 commit comments

Comments
 (0)