Skip to content

Commit

Permalink
Map value serializers are now cached for resolved value types.
Browse files Browse the repository at this point in the history
Signed-off-by: Roman Grigoriadi <roman.grigoriadi@oracle.com>
  • Loading branch information
Roman Grigoriadi committed Nov 3, 2017
1 parent d072154 commit f26d92d
Show file tree
Hide file tree
Showing 21 changed files with 28 additions and 132 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -145,11 +145,6 @@ protected String formatStrictIJson(T value) {
return JsonbDateFormatter.IJSON_DATE_FORMATTER.format(toTemporalAccessor(value));
}

@Override
protected void serialize(T obj, JsonGenerator generator, String key, Marshaller marshaller) {
throw new UnsupportedOperationException("Not supported in DateTimeSerializer");
}

@Override
protected void serialize(T obj, JsonGenerator generator, Marshaller marshaller) {
throw new UnsupportedOperationException("Not supported in DateTimeSerializer");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,20 +30,17 @@
*/
public abstract class AbstractNumberSerializer<T extends Number> extends AbstractValueTypeSerializer<T> {

private final JsonbNumberFormatter formatter;

/**
* Creates an instance.
*
* @param model Binding model.
*/
public AbstractNumberSerializer(JsonBindingModel model) {
super(model);
}

@Override
protected final void serialize(T obj, JsonGenerator generator, String key, Marshaller marshaller) {
if (!serializeFormatted(obj, formatted -> generator.write(key, formatted), marshaller.getJsonbContext())) {
serializeNonFormatted(obj, generator, key);
}
formatter = model.getCustomization() != null ?
model.getCustomization().getSerializeNumberFormatter() : null;
}

/**
Expand All @@ -57,7 +54,11 @@ protected final void serialize(T obj, JsonGenerator generator, String key, Marsh

@Override
protected void serialize(T obj, JsonGenerator generator, Marshaller marshaller) {
if (!serializeFormatted(obj, generator::write, marshaller.getJsonbContext())) {
if (formatter != null) {
final NumberFormat format = NumberFormat.getInstance(marshaller.getJsonbContext().getConfigProperties().getLocale(formatter.getLocale()));
((DecimalFormat)format).applyPattern(formatter.getFormat());
generator.write(format.format(obj));
} else {
serializeNonFormatted(obj, generator);
}
}
Expand All @@ -70,16 +71,4 @@ protected void serialize(T obj, JsonGenerator generator, Marshaller marshaller)
*/
protected abstract void serializeNonFormatted(T obj, JsonGenerator generator);

private boolean serializeFormatted(T obj, Consumer<String> formattedConsumer, JsonbContext jsonbContext) {
final Customization customization = model.getCustomization();
if (customization != null && customization.getSerializeNumberFormatter() != null) {
final JsonbNumberFormatter numberFormat = customization.getSerializeNumberFormatter();
//consider synchronizing on format instance or per thread cache.
final NumberFormat format = NumberFormat.getInstance(jsonbContext.getConfigProperties().getLocale(numberFormat.getLocale()));
((DecimalFormat)format).applyPattern(numberFormat.getFormat());
formattedConsumer.accept(format.format(obj));
return true;
}
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,5 @@ public void serialize(T obj, JsonGenerator generator, SerializationContext ctx)
serialize(obj, generator, marshaller);
}

protected abstract void serialize(T obj, JsonGenerator generator, String key, Marshaller marshaller);

protected abstract void serialize(T obj, JsonGenerator generator, Marshaller marshaller);
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,6 @@ public BooleanTypeSerializer(JsonBindingModel model) {
super(model);
}

@Override
protected void serialize(Boolean obj, JsonGenerator generator, String key, Marshaller marshaller) {
generator.write(key, obj);
}

@Override
protected void serialize(Boolean obj, JsonGenerator generator, Marshaller marshaller) {
generator.write(obj);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,6 @@ public ByteArrayBase64Serializer(Class<byte[]> clazz, JsonBindingModel model) {
super(model);
}

@Override
protected void serialize(byte[] obj, JsonGenerator generator, String key, Marshaller marshaller) {
generator.write(key, getEncoder(marshaller.getJsonbContext().getConfigProperties().getBinaryDataStrategy()).encodeToString(obj));
}

@Override
protected void serialize(byte[] obj, JsonGenerator generator, Marshaller marshaller) {
generator.write(getEncoder(marshaller.getJsonbContext().getConfigProperties().getBinaryDataStrategy()).encodeToString(obj));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,6 @@ public CharacterTypeSerializer(JsonBindingModel model) {
super(model);
}

@Override
protected void serialize(Character obj, JsonGenerator generator, String key, Marshaller marshaller) {
generator.write(key, String.valueOf(obj));
}

@Override
protected void serialize(Character obj, JsonGenerator generator, Marshaller marshaller) {
generator.write(String.valueOf(obj));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,6 @@ public DurationTypeSerializer(JsonBindingModel model) {
super(model);
}

@Override
protected void serialize(Duration obj, JsonGenerator generator, String key, Marshaller marshaller) {
generator.write(key, obj.toString());
}

@Override
protected void serialize(Duration obj, JsonGenerator generator, Marshaller marshaller) {
generator.write(obj.toString());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,6 @@ public EnumTypeSerializer(JsonBindingModel model) {
super(model);
}

@Override
protected void serialize(Enum obj, JsonGenerator generator, String key, Marshaller marshaller) {
generator.write(key, obj.name());
}

@Override
protected void serialize(Enum obj, JsonGenerator generator, Marshaller marshaller) {
generator.write(obj.name());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,6 @@ public JsonValueSerializer(JsonBindingModel model) {
super(model);
}

@Override
protected void serialize(JsonValue obj, JsonGenerator generator, String key, Marshaller marshaller) {
generator.write(key, obj);
}

@Override
protected void serialize(JsonValue obj, JsonGenerator generator, Marshaller marshaller) {
generator.write(obj);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,24 @@ public class MapSerializer<T extends Map> extends AbstractContainerSerializer<T>

private Type mapValueRuntimeType;

private final JsonbSerializer<?> valueSerializer;

protected MapSerializer(SerializerBuilder builder) {
super(builder);
mapValueRuntimeType = getRuntimeType() instanceof ParameterizedType ?
ReflectionUtils.resolveType(this, ((ParameterizedType) getRuntimeType()).getActualTypeArguments()[1])
: Object.class;

//Lets try to cache value serializer, runtime type must be unambiguous
Class<?> valueClass = ReflectionUtils.getRawType(mapValueRuntimeType);
if (valueClass == Object.class) {
valueSerializer = null;
return;
}

valueSerializer = new SerializerBuilder(builder.getJsonbContext()).withObjectClass(valueClass)
.withModel(new ContainerModel(mapValueRuntimeType,
resolveContainerModelCustomization(mapValueRuntimeType, builder.getJsonbContext()))).build();
}

@Override
Expand All @@ -50,9 +63,12 @@ protected void serializeInternal(T obj, JsonGenerator generator, SerializationCo
return;
}
generator.writeKey(keysString);
final JsonbSerializer<?> serializer = new SerializerBuilder(marshaller.getJsonbContext()).withObjectClass(value.getClass())
.withModel(new ContainerModel(mapValueRuntimeType,
resolveContainerModelCustomization(mapValueRuntimeType, marshaller.getJsonbContext()))).build();
JsonbSerializer<?> serializer = valueSerializer;
if (serializer == null) {
serializer = new SerializerBuilder(marshaller.getJsonbContext()).withObjectClass(value.getClass())
.withModel(new ContainerModel(mapValueRuntimeType,
resolveContainerModelCustomization(mapValueRuntimeType, marshaller.getJsonbContext()))).build();
}
serializerCaptor(serializer, value, generator, ctx);
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,16 +35,6 @@ public NumberTypeSerializer(JsonBindingModel model) {
super(model);
}

@Override
protected void serialize(Number obj, JsonGenerator generator, String key, Marshaller marshaller) {
BigDecimal bigDecimalValue = new BigDecimal(String.valueOf(obj));
if (BigNumberUtil.isIEEE754(bigDecimalValue)) {
generator.write(key, bigDecimalValue);
} else {
generator.write(key, String.valueOf(obj));
}
}

@Override
protected void serialize(Number obj, JsonGenerator generator, Marshaller marshaller) {
BigDecimal bigDecimalValue = new BigDecimal(String.valueOf(obj));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,6 @@ public OptionalDoubleTypeSerializer(JsonBindingModel model) {
super(model);
}

@Override
protected void serialize(OptionalDouble obj, JsonGenerator generator, String key, Marshaller marshaller) {
if (obj.isPresent()) {
generator.write(key, obj.getAsDouble());
} else if (model.getCustomization().isNillable()) {
generator.writeNull(key);
}
}

@Override
protected void serialize(OptionalDouble obj, JsonGenerator generator, Marshaller marshaller) {
if (obj.isPresent()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,6 @@ public OptionalIntTypeSerializer(JsonBindingModel model) {
super(model);
}

@Override
protected void serialize(OptionalInt obj, JsonGenerator generator, String key, Marshaller marshaller) {
if (obj.isPresent()) {
generator.write(key, obj.getAsInt());
} else if (model.getCustomization().isNillable()) {
generator.writeNull(key);
}
}

@Override
protected void serialize(OptionalInt obj, JsonGenerator generator, Marshaller marshaller) {
if (obj.isPresent()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,6 @@ public OptionalLongTypeSerializer(JsonBindingModel model) {
super(model);
}

@Override
protected void serialize(OptionalLong obj, JsonGenerator generator, String key, Marshaller marshaller) {
if (obj.isPresent()) {
generator.write(key, obj.getAsLong());
} else if (model.getCustomization().isNillable()) {
generator.writeNull(key);
}
}

@Override
protected void serialize(OptionalLong obj, JsonGenerator generator, Marshaller marshaller) {
if (obj.isPresent()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,6 @@ public PeriodTypeSerializer(JsonBindingModel model) {
super(model);
}

@Override
protected void serialize(Period obj, JsonGenerator generator, String key, Marshaller marshaller) {
generator.write(key, obj.toString());
}

@Override
protected void serialize(Period obj, JsonGenerator generator, Marshaller marshaller) {
generator.write(obj.toString());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,6 @@ private String toJson(String object, JsonbContext jsonbContext) {
return object;
}

@Override
protected void serialize(String obj, JsonGenerator generator, String key, Marshaller marshaller) {
generator.write(key, toJson(obj, marshaller.getJsonbContext()));
}

@Override
protected void serialize(String obj, JsonGenerator generator, Marshaller marshaller) {
generator.write(toJson(obj, marshaller.getJsonbContext()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,6 @@ public TimeZoneTypeSerializer(JsonBindingModel model) {
super(model);
}

@Override
protected void serialize(TimeZone obj, JsonGenerator generator, String key, Marshaller marshaller) {
generator.write(key, obj.getID());
}

@Override
protected void serialize(TimeZone obj, JsonGenerator generator, Marshaller marshaller) {
generator.write(obj.getID());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,6 @@ public URITypeSerializer(JsonBindingModel model) {
super(model);
}

@Override
protected void serialize(URI obj, JsonGenerator generator, String key, Marshaller marshaller) {
generator.write(key, obj.toString());
}

@Override
protected void serialize(URI obj, JsonGenerator generator, Marshaller marshaller) {
generator.write(obj.toString());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,6 @@ public URLTypeSerializer(JsonBindingModel model) {
super(model);
}

@Override
protected void serialize(URL obj, JsonGenerator generator, String key, Marshaller marshaller) {
generator.write(key, obj.toString());
}

@Override
protected void serialize(URL obj, JsonGenerator generator, Marshaller marshaller) {
generator.write(obj.toString());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,6 @@ public ZoneIdTypeSerializer(JsonBindingModel model) {
super(model);
}

@Override
protected void serialize(ZoneId obj, JsonGenerator generator, String key, Marshaller marshaller) {
generator.write(key, obj.getId());
}

@Override
protected void serialize(ZoneId obj, JsonGenerator generator, Marshaller marshaller) {
generator.write(obj.getId());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,6 @@ public ZoneOffsetTypeSerializer(JsonBindingModel model) {
super(model);
}

@Override
protected void serialize(ZoneOffset obj, JsonGenerator generator, String key, Marshaller marshaller) {
generator.write(key, obj.getId());
}

@Override
protected void serialize(ZoneOffset obj, JsonGenerator generator, Marshaller marshaller) {
generator.write(obj.getId());
Expand Down

0 comments on commit f26d92d

Please sign in to comment.