Skip to content

Commit e13471a

Browse files
v2.6 (#18)
1 parent 7701c4c commit e13471a

32 files changed

+1678
-475
lines changed

README.md

Lines changed: 122 additions & 90 deletions
Large diffs are not rendered by default.

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ repositories {
2121
}
2222

2323
group 'ru.oleg-cherednik.jackson'
24-
version '2.5'
24+
version '2.6'
2525

2626
sourceCompatibility = '1.8'
2727
targetCompatibility = '1.8'

src/main/java/ru/olegcherednik/jackson/utils/ByteBufferInputStream.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public int read() throws IOException {
4444
public int read(byte[] buf, int offs, int len) throws IOException {
4545
if (this.buf.hasRemaining()) {
4646
len = Math.min(len, this.buf.remaining());
47-
this.buf.get(buf, offs, Math.min(len, this.buf.remaining()));
47+
this.buf.get(buf, offs, len);
4848
} else
4949
len = -1;
5050

src/main/java/ru/olegcherednik/jackson/utils/JacksonObjectMapperBuilder.java

Lines changed: 0 additions & 92 deletions
This file was deleted.
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
package ru.olegcherednik.jackson.utils;
20+
21+
import com.fasterxml.jackson.annotation.JsonAutoDetect;
22+
import com.fasterxml.jackson.annotation.JsonInclude;
23+
import com.fasterxml.jackson.annotation.PropertyAccessor;
24+
import com.fasterxml.jackson.core.JsonParser;
25+
import com.fasterxml.jackson.databind.DeserializationFeature;
26+
import com.fasterxml.jackson.databind.ObjectMapper;
27+
import com.fasterxml.jackson.databind.SerializationFeature;
28+
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
29+
import com.fasterxml.jackson.module.afterburner.AfterburnerModule;
30+
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
31+
import ru.olegcherednik.jackson.utils.enumid.EnumIdModule;
32+
import ru.olegcherednik.jackson.utils.serializers.JacksonUtilsDateSerializer;
33+
import ru.olegcherednik.jackson.utils.serializers.JacksonUtilsInstantSerializer;
34+
import ru.olegcherednik.jackson.utils.serializers.JacksonUtilsLocalDateTimeSerializer;
35+
import ru.olegcherednik.jackson.utils.serializers.JacksonUtilsLocalTimeSerializer;
36+
import ru.olegcherednik.jackson.utils.serializers.JacksonUtilsOffsetDateTimeSerializer;
37+
import ru.olegcherednik.jackson.utils.serializers.JacksonUtilsOffsetTimeSerializer;
38+
import ru.olegcherednik.jackson.utils.serializers.JacksonUtilsZonedDateTimeSerializer;
39+
40+
import java.time.Instant;
41+
import java.time.LocalDateTime;
42+
import java.time.LocalTime;
43+
import java.time.OffsetDateTime;
44+
import java.time.OffsetTime;
45+
import java.time.ZoneId;
46+
import java.time.ZoneOffset;
47+
import java.time.ZonedDateTime;
48+
import java.util.Date;
49+
import java.util.Optional;
50+
import java.util.function.Supplier;
51+
import java.util.function.UnaryOperator;
52+
53+
/**
54+
* @author Oleg Cherednik
55+
* @since 02.01.2021
56+
*/
57+
public class JacksonObjectMapperSupplier implements Supplier<ObjectMapper> {
58+
59+
public static final UnaryOperator<ZoneId> ZONE_MODIFIER_USE_ORIGINAL = zoneId -> zoneId;
60+
public static final UnaryOperator<ZoneId> ZONE_MODIFIER_TO_UTC = zoneId -> ZoneOffset.UTC;
61+
62+
protected final UnaryOperator<ZoneId> zoneModifier;
63+
protected final boolean useMilliseconds;
64+
65+
public static JacksonObjectMapperSupplier.Builder builder() {
66+
return new Builder();
67+
}
68+
69+
protected JacksonObjectMapperSupplier(Builder builder) {
70+
zoneModifier = builder.zoneModifier;
71+
useMilliseconds = builder.useMilliseconds;
72+
}
73+
74+
@Override
75+
public ObjectMapper get() {
76+
ObjectMapper mapper = new ObjectMapper();
77+
config(mapper);
78+
registerModule(mapper);
79+
return mapper;
80+
}
81+
82+
protected ObjectMapper config(ObjectMapper mapper) {
83+
return mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE)
84+
.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
85+
86+
.setSerializationInclusion(JsonInclude.Include.NON_NULL)
87+
.setSerializationInclusion(JsonInclude.Include.NON_EMPTY)
88+
89+
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
90+
.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)
91+
.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
92+
.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE)
93+
94+
.enable(SerializationFeature.WRITE_DATES_WITH_ZONE_ID)
95+
.enable(JsonParser.Feature.ALLOW_COMMENTS)
96+
.enable(JsonParser.Feature.ALLOW_YAML_COMMENTS);
97+
}
98+
99+
protected ObjectMapper registerModule(ObjectMapper mapper) {
100+
JacksonUtilsInstantSerializer instantSerializer =
101+
new JacksonUtilsInstantSerializer(zoneModifier, useMilliseconds);
102+
JacksonUtilsLocalDateTimeSerializer localDateTimeSerializer =
103+
new JacksonUtilsLocalDateTimeSerializer(useMilliseconds);
104+
JacksonUtilsLocalTimeSerializer localTimeSerializer = new JacksonUtilsLocalTimeSerializer(useMilliseconds);
105+
JacksonUtilsOffsetDateTimeSerializer offsetDateTimeSerializer =
106+
new JacksonUtilsOffsetDateTimeSerializer(zoneModifier, useMilliseconds);
107+
JacksonUtilsOffsetTimeSerializer offsetTimeSerializer =
108+
new JacksonUtilsOffsetTimeSerializer(zoneModifier, useMilliseconds);
109+
JacksonUtilsZonedDateTimeSerializer dateTimeSerializer =
110+
new JacksonUtilsZonedDateTimeSerializer(zoneModifier, useMilliseconds);
111+
JacksonUtilsDateSerializer dateSerializer = new JacksonUtilsDateSerializer(instantSerializer);
112+
113+
return mapper.registerModule(new ParameterNamesModule())
114+
.registerModule(new AfterburnerModule())
115+
.registerModule(new EnumIdModule())
116+
.registerModule(new JavaTimeModule().addSerializer(Instant.class, instantSerializer)
117+
.addSerializer(LocalDateTime.class, localDateTimeSerializer)
118+
.addSerializer(LocalTime.class, localTimeSerializer)
119+
.addSerializer(OffsetDateTime.class, offsetDateTimeSerializer)
120+
.addSerializer(OffsetTime.class, offsetTimeSerializer)
121+
.addSerializer(ZonedDateTime.class, dateTimeSerializer)
122+
.addSerializer(Date.class, dateSerializer)
123+
.addKeySerializer(Instant.class, instantSerializer)
124+
.addKeySerializer(LocalDateTime.class, localDateTimeSerializer)
125+
.addKeySerializer(LocalTime.class, localTimeSerializer)
126+
.addKeySerializer(OffsetDateTime.class, offsetDateTimeSerializer)
127+
.addKeySerializer(OffsetTime.class, offsetTimeSerializer)
128+
.addKeySerializer(ZonedDateTime.class, dateTimeSerializer)
129+
.addKeySerializer(Date.class, dateSerializer));
130+
}
131+
132+
public static class Builder {
133+
134+
private UnaryOperator<ZoneId> zoneModifier = ZONE_MODIFIER_TO_UTC;
135+
private boolean useMilliseconds = true;
136+
137+
protected Builder() {
138+
}
139+
140+
public Builder zone(ZoneId zone) {
141+
return zoneModifier(z -> zone);
142+
}
143+
144+
public Builder zoneModifier(UnaryOperator<ZoneId> zoneModifier) {
145+
this.zoneModifier = Optional.ofNullable(zoneModifier).orElse(ZONE_MODIFIER_TO_UTC);
146+
return this;
147+
}
148+
149+
public Builder withUseMilliseconds(boolean useMilliseconds) {
150+
this.useMilliseconds = useMilliseconds;
151+
return this;
152+
}
153+
154+
public JacksonObjectMapperSupplier build() {
155+
return new JacksonObjectMapperSupplier(this);
156+
}
157+
158+
}
159+
160+
}

src/main/java/ru/olegcherednik/jackson/utils/JacksonUtils.java

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,16 @@
2525
import java.util.Iterator;
2626
import java.util.List;
2727
import java.util.Map;
28+
import java.util.Set;
2829

2930
/**
3031
* @author Oleg Cherednik
3132
* @since 19.11.2014
3233
*/
3334
public final class JacksonUtils {
3435

35-
private static final ObjectMapperDecorator DELEGATE = new ObjectMapperDecorator(JacksonHelper::mapper);
36-
private static final ObjectMapperDecorator PRETTY_PRINT_DELEGATE = new ObjectMapperDecorator(JacksonHelper::prettyPrintMapper);
36+
private static final ObjectMapperDecorator DELEGATE = new ObjectMapperDecorator(JacksonUtilsHelper::mapper);
37+
private static final ObjectMapperDecorator PRETTY_PRINT_DELEGATE = new ObjectMapperDecorator(JacksonUtilsHelper::prettyPrintMapper);
3738

3839
// ---------- read String ----------
3940

@@ -49,6 +50,14 @@ public static <V> List<V> readList(String json, Class<V> valueClass) {
4950
return print().readList(json, valueClass);
5051
}
5152

53+
public static Set<Object> readSet(String json) {
54+
return print().readSet(json);
55+
}
56+
57+
public static <V> Set<V> readSet(String json, Class<V> valueClass) {
58+
return print().readSet(json, valueClass);
59+
}
60+
5261
public static List<Map<String, Object>> readListOfMap(String json) {
5362
return print().readListOfMap(json);
5463
}
@@ -79,6 +88,14 @@ public static <V> List<V> readList(ByteBuffer buf, Class<V> valueClass) {
7988
return print().readList(buf, valueClass);
8089
}
8190

91+
public static Set<Object> readSet(ByteBuffer buf) {
92+
return print().readSet(buf);
93+
}
94+
95+
public static <V> Set<V> readSet(ByteBuffer buf, Class<V> valueClass) {
96+
return print().readSet(buf, valueClass);
97+
}
98+
8299
public static Iterator<Object> readListLazy(ByteBuffer buf) {
83100
return print().readListLazy(buf);
84101
}
@@ -121,6 +138,14 @@ public static <V> List<V> readList(InputStream in, Class<V> valueClass) {
121138
return print().readList(in, valueClass);
122139
}
123140

141+
public static Set<Object> readSet(InputStream in) {
142+
return print().readSet(in);
143+
}
144+
145+
public static <V> Set<V> readSet(InputStream in, Class<V> valueClass) {
146+
return print().readSet(in, valueClass);
147+
}
148+
124149
public static List<Map<String, Object>> readListOfMap(InputStream in) {
125150
return print().readListOfMap(in);
126151
}

src/main/java/ru/olegcherednik/jackson/utils/JacksonHelper.java renamed to src/main/java/ru/olegcherednik/jackson/utils/JacksonUtilsHelper.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@
2828
* @author Oleg Cherednik
2929
* @since 19.11.2014
3030
*/
31-
public final class JacksonHelper {
31+
public final class JacksonUtilsHelper {
3232

33-
public static final Supplier<ObjectMapper> DEFAULT_BUILDER = new JacksonObjectMapperBuilder();
33+
public static final Supplier<ObjectMapper> DEFAULT_BUILDER = JacksonObjectMapperSupplier.builder().build();
3434

3535
private static Supplier<ObjectMapper> mapperBuilder = DEFAULT_BUILDER;
3636
private static ObjectMapper mapper = createMapper();
@@ -54,35 +54,35 @@ public static ObjectMapper createPrettyPrintMapper() {
5454
return mapperBuilder.get().enable(SerializationFeature.INDENT_OUTPUT);
5555
}
5656

57-
public static ObjectMapper createMapper(Supplier<ObjectMapper> mapperBuilder) {
58-
return mapperBuilder.get();
57+
public static ObjectMapper createMapper(Supplier<ObjectMapper> mapperSupplier) {
58+
return mapperSupplier.get();
5959
}
6060

61-
public static ObjectMapper createPrettyPrintMapper(Supplier<ObjectMapper> mapperBuilder) {
62-
return mapperBuilder.get().enable(SerializationFeature.INDENT_OUTPUT);
61+
public static ObjectMapper createPrettyPrintMapper(Supplier<ObjectMapper> mapperSupplier) {
62+
return mapperSupplier.get().enable(SerializationFeature.INDENT_OUTPUT);
6363
}
6464

65-
public static ObjectMapperDecorator createMapperDecorator(Supplier<ObjectMapper> mapperBuilder) {
66-
return new ObjectMapperDecorator(createMapper(mapperBuilder));
65+
public static ObjectMapperDecorator createPrettyPrintMapperDecorator(Supplier<ObjectMapper> mapperSupplier) {
66+
return new ObjectMapperDecorator(createPrettyPrintMapper(mapperSupplier));
6767
}
6868

69-
public static ObjectMapperDecorator createPrettyPrintMapperDecorator(Supplier<ObjectMapper> mapperBuilder) {
70-
return new ObjectMapperDecorator(createPrettyPrintMapper(mapperBuilder));
69+
public static ObjectMapperDecorator createMapperDecorator(Supplier<ObjectMapper> mapperSupplier) {
70+
return new ObjectMapperDecorator(createMapper(mapperSupplier));
7171
}
7272

7373
@SuppressWarnings({ "PMD.AvoidReassigningParameters", "PMD.CompareObjectsWithEquals" })
74-
public static synchronized void setMapperBuilder(Supplier<ObjectMapper> mapperBuilder) {
75-
mapperBuilder = Optional.ofNullable(mapperBuilder).orElse(DEFAULT_BUILDER);
74+
public static synchronized void setMapperBuilder(Supplier<ObjectMapper> mapperSupplier) {
75+
mapperSupplier = Optional.ofNullable(mapperSupplier).orElse(DEFAULT_BUILDER);
7676

77-
if (mapperBuilder == JacksonHelper.mapperBuilder)
77+
if (mapperSupplier == JacksonUtilsHelper.mapperBuilder)
7878
return;
7979

80-
JacksonHelper.mapperBuilder = mapperBuilder;
80+
JacksonUtilsHelper.mapperBuilder = mapperSupplier;
8181
mapper = createMapper();
8282
prettyPrintMapper = createPrettyPrintMapper();
8383
}
8484

85-
private JacksonHelper() {
85+
private JacksonUtilsHelper() {
8686
}
8787

8888
}

0 commit comments

Comments
 (0)