com.owlike.genson.ext.javadatetime.TimestampHandler Maven / Gradle / Ivy
package com.owlike.genson.ext.javadatetime;
import com.owlike.genson.stream.ObjectReader;
import com.owlike.genson.stream.ObjectWriter;
import java.time.temporal.Temporal;
import java.time.temporal.TemporalAccessor;
import java.time.temporal.TemporalField;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.function.Function;
import java.util.function.Supplier;
/**
* Base class to handle the parsing/serializing of different timestamp formats
*/
abstract class TimestampHandler {
private Function toMillis;
private Function fromMillis;
private Function toNanos;
private Function fromNanos;
private LinkedHashMap temporalFields;
private Supplier instanceProvider;
TimestampHandler(Function toMillis, Function fromMillis, Function toNanos, Function fromNanos, LinkedHashMap temporalFields, Supplier instanceProvider) {
this.toMillis = toMillis;
this.fromMillis = fromMillis;
this.toNanos = toNanos;
this.fromNanos = fromNanos;
this.temporalFields = temporalFields;
this.instanceProvider = instanceProvider;
}
void writeNumericTimestamp(T object, ObjectWriter writer, TimestampFormat timestampFormat) {
if(timestampFormat == TimestampFormat.MILLIS){
writer.writeValue(toMillis.apply(object));
}
else{
writer.writeValue(toNanos.apply(object));
}
}
void writeObjectTimestamp(T object, ObjectWriter writer) {
writer.beginObject();
writeFieldsAsObject(object, writer);
writer.endObject();
}
protected void writeFieldsAsObject(T object, ObjectWriter writer) {
for(Map.Entry temporalFieldEntry: temporalFields.entrySet()){
String jsonName = temporalFieldEntry.getKey();
TemporalField field = temporalFieldEntry.getValue();
long value = object.getLong(field);
writer.writeName(jsonName);
writer.writeValue(value);
}
}
void writeArrayTimestamp(T object, ObjectWriter writer) {
writer.beginArray();
writeFieldsAsArray(object, writer);
writer.endArray();
}
protected void writeFieldsAsArray(T object, ObjectWriter writer) {
for(TemporalField field: temporalFields.values()){
long value = object.getLong(field);
writer.writeValue(value);
}
}
final T readNumericTimestamp(ObjectReader reader, TimestampFormat timestampFormat) {
long value = reader.valueAsLong();
Function numberToInstance = timestampFormat == TimestampFormat.MILLIS ? fromMillis : fromNanos;
if(numberToInstance == null){
throw new IllegalArgumentException("Timestamp format not supported");
}
return numberToInstance.apply(value);
}
final T readArrayTimestamp(ObjectReader reader) {
reader.beginArray();
T obj = readFieldsFromArray(instanceProvider, reader);
reader.endArray();
return obj;
}
protected T readFieldsFromArray(Supplier instanceProvider, ObjectReader reader) {
Temporal obj = (Temporal) instanceProvider.get();
for(TemporalField temporalField: temporalFields.values()){
if(reader.hasNext()){
reader.next();
long value = reader.valueAsLong();
obj = obj.with(temporalField, value);
}
}
return (T) obj;
}
final T readObjectTimestamp(ObjectReader reader) {
reader.beginObject();
T obj = readFieldsFromObject(instanceProvider, reader);
reader.endObject();
return obj;
}
protected T readFieldsFromObject(Supplier instanceProvider, ObjectReader reader) {
T obj = instanceProvider.get();
while(reader.hasNext()){
reader.next();
obj = readFieldFromObject(obj, reader);
}
return obj;
}
protected T readFieldFromObject(T obj, ObjectReader reader){
Temporal objTemporal = (Temporal) obj;
String jsonName = reader.name();
TemporalField field = temporalFields.get(jsonName);
long value = reader.valueAsLong();
return (T) objTemporal.with(field, value);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy