diff --git a/ojdbc-provider-jackson-oson/README.md b/ojdbc-provider-jackson-oson/README.md index e9d2d4b6..9858d903 100644 --- a/ojdbc-provider-jackson-oson/README.md +++ b/ojdbc-provider-jackson-oson/README.md @@ -23,9 +23,13 @@ JDK versions. The coordinates for the latest release are: com.oracle.database.jdbc ojdbc-provider-jackson-oson - 1.0.1 + 1.0.2 ``` +### Note +The extention uses ojdbc8 as it's dependency. If the application env. has other ojdbc jar +in the dependency, be sure to exclude the ojdbc8 jar from the extention. + ## Building the provider module 1. Clone the repository: ```bash diff --git a/ojdbc-provider-jackson-oson/src/main/java/oracle/jdbc/provider/oson/OsonGenerator.java b/ojdbc-provider-jackson-oson/src/main/java/oracle/jdbc/provider/oson/OsonGenerator.java index 51f62f97..67672337 100644 --- a/ojdbc-provider-jackson-oson/src/main/java/oracle/jdbc/provider/oson/OsonGenerator.java +++ b/ojdbc-provider-jackson-oson/src/main/java/oracle/jdbc/provider/oson/OsonGenerator.java @@ -58,6 +58,7 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.nio.charset.StandardCharsets; +import java.sql.SQLException; import java.sql.Timestamp; import java.time.*; import java.util.Arrays; @@ -538,6 +539,18 @@ public void writeDate(Date value) throws IOException { } } + public void writeLocalDate(LocalDate value) throws IOException { + _verifyValueWrite("write LocalDate"); + DATE dd = null; + try { + dd = new DATE(value); + } catch (SQLException e) { + throw new RuntimeException(e); + } + OracleJsonDate jsonDate = new OracleJsonDateImpl(dd.shareBytes()); + gen.write(jsonDate); + } + public void writeTimeStamp(Timestamp value) throws IOException { _verifyValueWrite("write TimeStamp"); TIMESTAMP timestamp = new TIMESTAMP(value); diff --git a/ojdbc-provider-jackson-oson/src/main/java/oracle/jdbc/provider/oson/OsonModule.java b/ojdbc-provider-jackson-oson/src/main/java/oracle/jdbc/provider/oson/OsonModule.java index a9787bbc..5fef2f32 100644 --- a/ojdbc-provider-jackson-oson/src/main/java/oracle/jdbc/provider/oson/OsonModule.java +++ b/ojdbc-provider-jackson-oson/src/main/java/oracle/jdbc/provider/oson/OsonModule.java @@ -141,6 +141,9 @@ public OsonModule() { addDeserializer(UUID.class, OsonUUIDDeserializer.INSTANCE); addDeserializer(Boolean.class, OsonBooleanDeserializer.INSTANCE); + addSerializer(LocalDate.class, OsonLocalDateSerializer.INSTANCE); + addDeserializer(LocalDate.class, OsonLocalDateDeserializer.INSTANCE); + } @@ -153,14 +156,12 @@ public void setupModule(SetupContext context) { public JsonSerializer modifySerializer(SerializationConfig config, BeanDescription beanDesc, JsonSerializer serializer) { Iterator properties = serializer.properties(); while (properties.hasNext()) { + boolean serializerAssigned = false; BeanPropertyWriter writer = (BeanPropertyWriter) properties.next(); - if (Util.implementsSerializable(writer.getType().getInterfaces()) - && !Util.isJavaWrapperSerializable(writer)){ - writer.assignSerializer(OsonSerializableSerializer.INSTANCE); - } if (writer.getMember().hasAnnotation(Convert.class)) { Convert annotation = writer.getMember().getAnnotation(Convert.class); Class converterClass = annotation.converter(); + serializerAssigned = true; if (writer.getType().isArrayType()) { JsonSerializer mySerializer = new OsonConverterArraySerializer(converterClass); writer.assignSerializer((JsonSerializer) mySerializer); @@ -169,6 +170,11 @@ public JsonSerializer modifySerializer(SerializationConfig config, BeanDescri writer.assignSerializer(mySerializer); } } + if (Util.implementsSerializable(writer.getType().getInterfaces()) + && !Util.isJavaWrapperSerializable(writer) + && !serializerAssigned){ + writer.assignSerializer(OsonSerializableSerializer.INSTANCE); + } } return serializer; } @@ -187,15 +193,11 @@ public JsonDeserializer modifyDeserializer(DeserializationConfig config, Bean Iterator properties = ((BeanDeserializer) deserializer).properties(); while (properties.hasNext()) { SettableBeanProperty property = properties.next(); - if (Util.implementsSerializable(property.getType().getInterfaces()) && !Util.isJavaWrapperSerializable(property.getType())){ - JsonDeserializer deser = OsosnSerializableDeserializer.INSTANCE; - ((BeanDeserializer) deserializer).replaceProperty(property,property.withValueDeserializer(deser)); - } - + boolean deserializerAssigned = false; if (property.getMember().hasAnnotation(Convert.class)) { Convert annotation = property.getMember().getAnnotation(Convert.class); Class converterClass = annotation.converter(); - + deserializerAssigned = true; if(property.getType().isArrayType()){ JsonDeserializer deser = new OsonConverterArrayDeserializer(converterClass); ((BeanDeserializer) deserializer).replaceProperty(property,property.withValueDeserializer(deser)); @@ -204,6 +206,12 @@ public JsonDeserializer modifyDeserializer(DeserializationConfig config, Bean ((BeanDeserializer) deserializer).replaceProperty(property,property.withValueDeserializer(deser)); } } + if (Util.implementsSerializable(property.getType().getInterfaces()) + && !Util.isJavaWrapperSerializable(property.getType()) + && !deserializerAssigned){ + JsonDeserializer deser = OsosnSerializableDeserializer.INSTANCE; + ((BeanDeserializer) deserializer).replaceProperty(property,property.withValueDeserializer(deser)); + } } return deserializer; } diff --git a/ojdbc-provider-jackson-oson/src/main/java/oracle/jdbc/provider/oson/Util.java b/ojdbc-provider-jackson-oson/src/main/java/oracle/jdbc/provider/oson/Util.java index 5ddd077a..7614221b 100644 --- a/ojdbc-provider-jackson-oson/src/main/java/oracle/jdbc/provider/oson/Util.java +++ b/ojdbc-provider-jackson-oson/src/main/java/oracle/jdbc/provider/oson/Util.java @@ -4,20 +4,9 @@ import com.fasterxml.jackson.databind.ser.BeanPropertyWriter; import java.io.Serializable; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Date; import java.util.List; public class Util { - public static final ArrayList ignoreList = new ArrayList<>(); - static { - ignoreList.add("java.lang"); - ignoreList.add("java.util"); - ignoreList.add("java.sql"); - - } public static boolean isJavaSerializableType(Class clazz) { String packageName = clazz.getPackage().getName(); diff --git a/ojdbc-provider-jackson-oson/src/main/java/oracle/jdbc/provider/oson/deser/OsonLocalDateDeserializer.java b/ojdbc-provider-jackson-oson/src/main/java/oracle/jdbc/provider/oson/deser/OsonLocalDateDeserializer.java new file mode 100644 index 00000000..ba230b0b --- /dev/null +++ b/ojdbc-provider-jackson-oson/src/main/java/oracle/jdbc/provider/oson/deser/OsonLocalDateDeserializer.java @@ -0,0 +1,65 @@ +package oracle.jdbc.provider.oson.deser; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; +import oracle.jdbc.provider.oson.OsonParser; +import oracle.sql.json.OracleJsonParser; + +import java.io.IOException; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +public class OsonLocalDateDeserializer extends LocalDateDeserializer { + public static final OsonLocalDateDeserializer INSTANCE = new OsonLocalDateDeserializer(); + public OsonLocalDateDeserializer() { + super(); + } + public OsonLocalDateDeserializer(DateTimeFormatter dateFormat) { + super(dateFormat); + } + + public OsonLocalDateDeserializer(OsonLocalDateDeserializer base, DateTimeFormatter dtf) { + super(base, dtf); + } + + public OsonLocalDateDeserializer(OsonLocalDateDeserializer base, Boolean leniency) { + super(base, leniency); + } + + public OsonLocalDateDeserializer(OsonLocalDateDeserializer base, JsonFormat.Shape shape) { + super(base, shape); + } + + @Override + protected OsonLocalDateDeserializer withDateFormat(DateTimeFormatter dtf) { + return new OsonLocalDateDeserializer(dtf); + } + + @Override + protected OsonLocalDateDeserializer withShape(JsonFormat.Shape shape) { + return new OsonLocalDateDeserializer(this,shape); + } + + @Override + public LocalDate deserialize(JsonParser parser, DeserializationContext context) throws IOException { + if(_shape != null || _formatter!= DateTimeFormatter.ISO_LOCAL_DATE) + return super.deserialize(parser, context); + + if (parser instanceof OsonParser) { + OsonParser _parser = (OsonParser) parser; + + if(_parser.currentOsonEvent().equals(OracleJsonParser.Event.VALUE_DATE)) { + LocalDateTime dateTime = _parser.getLocalDateTime(); + LocalDate localDate = dateTime.toLocalDate(); + return localDate; + } + } + else { + return super.deserialize(parser, context); + } + return super.deserialize(parser, context); + } +} diff --git a/ojdbc-provider-jackson-oson/src/main/java/oracle/jdbc/provider/oson/deser/OsonUUIDDeserializer.java b/ojdbc-provider-jackson-oson/src/main/java/oracle/jdbc/provider/oson/deser/OsonUUIDDeserializer.java index bd5eb61b..8fde8194 100644 --- a/ojdbc-provider-jackson-oson/src/main/java/oracle/jdbc/provider/oson/deser/OsonUUIDDeserializer.java +++ b/ojdbc-provider-jackson-oson/src/main/java/oracle/jdbc/provider/oson/deser/OsonUUIDDeserializer.java @@ -41,8 +41,6 @@ import com.fasterxml.jackson.core.JacksonException; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer; import com.fasterxml.jackson.databind.deser.std.UUIDDeserializer; import oracle.jdbc.provider.oson.OsonParser; diff --git a/ojdbc-provider-jackson-oson/src/main/java/oracle/jdbc/provider/oson/ser/OsonLocalDateSerializer.java b/ojdbc-provider-jackson-oson/src/main/java/oracle/jdbc/provider/oson/ser/OsonLocalDateSerializer.java new file mode 100644 index 00000000..e3afd456 --- /dev/null +++ b/ojdbc-provider-jackson-oson/src/main/java/oracle/jdbc/provider/oson/ser/OsonLocalDateSerializer.java @@ -0,0 +1,49 @@ +package oracle.jdbc.provider.oson.ser; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; +import oracle.jdbc.provider.oson.OsonGenerator; + +import java.io.IOException; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +public class OsonLocalDateSerializer extends LocalDateSerializer { + + public static final OsonLocalDateSerializer INSTANCE = new OsonLocalDateSerializer(); + + public OsonLocalDateSerializer() { + super(); + } + + public OsonLocalDateSerializer(OsonLocalDateSerializer base, Boolean useTimestamp, + DateTimeFormatter dtf, JsonFormat.Shape shape) { + super(base, useTimestamp, dtf, shape); + } + + public OsonLocalDateSerializer(DateTimeFormatter formatter) { + super(formatter); + } + + @Override + protected OsonLocalDateSerializer withFormat(Boolean useTimestamp, DateTimeFormatter dtf, JsonFormat.Shape shape) { + return new OsonLocalDateSerializer(this, useTimestamp, dtf, shape); + } + + @Override + public void serialize(LocalDate date, JsonGenerator g, SerializerProvider provider) throws IOException { + if(_formatter != null || _shape != null) { + super.serialize(date, g, provider); + return; + } + if (g instanceof OsonGenerator) { + OsonGenerator generator = (OsonGenerator) g; + generator.writeLocalDate(date); + return; + }else { + super.serialize(date, g, provider); + } + } +}