Loading build.sbt +4 −2 Original line number Diff line number Diff line Loading @@ -2,7 +2,7 @@ lazy val commonSettings = Seq( organization := "com.kjetland", organizationName := "mbknor", version := "1.0.5-SNAPSHOT", version := "1.0.5-b1-SNAPSHOT", scalaVersion := "2.11.8", publishMavenStyle := true, publishArtifact in Test := false, Loading Loading @@ -57,7 +57,9 @@ lazy val deps = Seq( "com.github.fge" % "json-schema-validator" % "2.2.6" % "test", "com.fasterxml.jackson.module" % "jackson-module-scala_2.11" % jacksonModuleScalaVersion % "test", "com.fasterxml.jackson.datatype" % "jackson-datatype-jdk8" % jacksonVersion % "test", "com.fasterxml.jackson.datatype" % "jackson-datatype-jsr310" % jacksonVersion % "test" "com.fasterxml.jackson.datatype" % "jackson-datatype-jsr310" % jacksonVersion % "test", "joda-time" % "joda-time" % "2.9.4" % "test", "com.fasterxml.jackson.datatype" % "jackson-datatype-joda" % jacksonVersion % "test" ) lazy val root = (project in file(".")) Loading src/main/scala/com/kjetland/jackson/jsonSchema/JsonSchemaGenerator.scala +22 −13 Original line number Diff line number Diff line Loading @@ -24,43 +24,43 @@ object JsonSchemaGenerator { object JsonSchemaConfig { val vanillaJsonSchemaDraft4 = JsonSchemaConfig( useHTML5DateTimeLocal = false, autoGenerateTitleForProperties = false, defaultArrayFormat = None, useOneOfForOption = false, usePropertyOrdering = false, hidePolymorphismTypeProperty = false, disableWarnings = false disableWarnings = false, useImprovedDateFormatMapping = false ) /** * Use this configuration if using the JsonSchema to generate HTML5 GUI, eg. by using https://github.com/jdorn/json-editor * * useHTML5DateTimeLocal - use "datetime-local" as format instead of "date-time" * autoGenerateTitleForProperties - If property is named "someName", we will add {"title": "Some Name"} * defaultArrayFormat - this will result in a better gui than te default one. */ val html5EnabledSchema = JsonSchemaConfig( useHTML5DateTimeLocal = true, autoGenerateTitleForProperties = true, defaultArrayFormat = Some("table"), useOneOfForOption = true, usePropertyOrdering = true, hidePolymorphismTypeProperty = true, disableWarnings = false disableWarnings = false, useImprovedDateFormatMapping = true ) } case class JsonSchemaConfig ( useHTML5DateTimeLocal:Boolean, autoGenerateTitleForProperties:Boolean, defaultArrayFormat:Option[String], useOneOfForOption:Boolean, usePropertyOrdering:Boolean, hidePolymorphismTypeProperty:Boolean, disableWarnings:Boolean disableWarnings:Boolean, useImprovedDateFormatMapping:Boolean ) Loading Loading @@ -88,6 +88,15 @@ class JsonSchemaGenerator val log = LoggerFactory.getLogger(getClass) val dateFormatMapping = Map[String,String]( // Java7 dates "java.time.OffsetDateTime" -> "datetime-local", // using datetime-local since it is supported in html5 "java.time.LocalDate" -> "date", // Joda-dates "org.joda.time.LocalDate" -> "date" ) trait MySerializerProvider { var provider: SerializerProvider = null Loading @@ -113,11 +122,7 @@ class JsonSchemaGenerator } private def setFormat(node:ObjectNode, format:String): Unit = { val formatToUse = if ( config.useHTML5DateTimeLocal && format == "date-time" ) "datetime-local" else format node.put("format", formatToUse) node.put("format", format) } Loading Loading @@ -660,6 +665,10 @@ class JsonSchemaGenerator Option(prop.getAnnotation(classOf[JsonSchemaFormat])).map { jsonSchemaFormat => jsonSchemaFormat.value() }.orElse { if( config.useImprovedDateFormatMapping ) { dateFormatMapping.get(prop.getType.getRawClass.getName) } else None } } Loading src/test/scala/com/kjetland/jackson/jsonSchema/JsonSchemaGeneratorTest.scala +23 −3 Original line number Diff line number Diff line package com.kjetland.jackson.jsonSchema import java.time.OffsetDateTime import java.time.{LocalDate, OffsetDateTime} import java.util import java.util.{Optional, TimeZone} Loading @@ -10,6 +10,7 @@ import com.fasterxml.jackson.databind.module.SimpleModule import com.fasterxml.jackson.databind.node.{ArrayNode, MissingNode, NullNode, ObjectNode} import com.fasterxml.jackson.databind.{JsonNode, ObjectMapper, SerializationFeature} import com.fasterxml.jackson.datatype.jdk8.Jdk8Module import com.fasterxml.jackson.datatype.joda.JodaModule import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule import com.fasterxml.jackson.module.scala.DefaultScalaModule import com.github.fge.jsonschema.main.JsonSchemaFactory Loading @@ -33,6 +34,7 @@ class JsonSchemaGeneratorTest extends FunSuite with Matchers { om.registerModule(new JavaTimeModule) om.registerModule(new Jdk8Module ) om.registerModule(new JodaModule) om.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false) om.setTimeZone(TimeZone.getDefault()) Loading Loading @@ -589,6 +591,17 @@ class JsonSchemaGeneratorTest extends FunSuite with Matchers { } } test("dates") { val jsonNode = assertToFromJson(jsonSchemaGeneratorScalaHTML5, testData.manyDates) val schema = generateAndValidateSchema(jsonSchemaGeneratorScalaHTML5, testData.manyDates.getClass, Some(jsonNode)) assert(schema.at("/properties/javaOffsetDate/format").asText() == "datetime-local") assert(schema.at("/properties/javaLocalDate/format").asText() == "date") assert(schema.at("/properties/jodaLocalDate/format").asText() == "date") } } trait TestData { Loading Loading @@ -674,7 +687,7 @@ trait TestData { ) val pojoUsingFormat = new PojoUsingFormat("test@example.com", true, OffsetDateTime.now(), OffsetDateTime.now()) val manyDates = ManyDates(OffsetDateTime.now(), LocalDate.now(), org.joda.time.LocalDate.now()) } Loading Loading @@ -721,3 +734,10 @@ case class PojoUsingOptionScala( optionalList:Option[List[ClassNotExtendingAnythingScala]] //, parent:Option[ParentScala] - Not using this one: jackson-scala-module does not support Option combined with Polymorphism ) case class ManyDates ( javaOffsetDate:OffsetDateTime, javaLocalDate:LocalDate, jodaLocalDate:org.joda.time.LocalDate ) No newline at end of file Loading
build.sbt +4 −2 Original line number Diff line number Diff line Loading @@ -2,7 +2,7 @@ lazy val commonSettings = Seq( organization := "com.kjetland", organizationName := "mbknor", version := "1.0.5-SNAPSHOT", version := "1.0.5-b1-SNAPSHOT", scalaVersion := "2.11.8", publishMavenStyle := true, publishArtifact in Test := false, Loading Loading @@ -57,7 +57,9 @@ lazy val deps = Seq( "com.github.fge" % "json-schema-validator" % "2.2.6" % "test", "com.fasterxml.jackson.module" % "jackson-module-scala_2.11" % jacksonModuleScalaVersion % "test", "com.fasterxml.jackson.datatype" % "jackson-datatype-jdk8" % jacksonVersion % "test", "com.fasterxml.jackson.datatype" % "jackson-datatype-jsr310" % jacksonVersion % "test" "com.fasterxml.jackson.datatype" % "jackson-datatype-jsr310" % jacksonVersion % "test", "joda-time" % "joda-time" % "2.9.4" % "test", "com.fasterxml.jackson.datatype" % "jackson-datatype-joda" % jacksonVersion % "test" ) lazy val root = (project in file(".")) Loading
src/main/scala/com/kjetland/jackson/jsonSchema/JsonSchemaGenerator.scala +22 −13 Original line number Diff line number Diff line Loading @@ -24,43 +24,43 @@ object JsonSchemaGenerator { object JsonSchemaConfig { val vanillaJsonSchemaDraft4 = JsonSchemaConfig( useHTML5DateTimeLocal = false, autoGenerateTitleForProperties = false, defaultArrayFormat = None, useOneOfForOption = false, usePropertyOrdering = false, hidePolymorphismTypeProperty = false, disableWarnings = false disableWarnings = false, useImprovedDateFormatMapping = false ) /** * Use this configuration if using the JsonSchema to generate HTML5 GUI, eg. by using https://github.com/jdorn/json-editor * * useHTML5DateTimeLocal - use "datetime-local" as format instead of "date-time" * autoGenerateTitleForProperties - If property is named "someName", we will add {"title": "Some Name"} * defaultArrayFormat - this will result in a better gui than te default one. */ val html5EnabledSchema = JsonSchemaConfig( useHTML5DateTimeLocal = true, autoGenerateTitleForProperties = true, defaultArrayFormat = Some("table"), useOneOfForOption = true, usePropertyOrdering = true, hidePolymorphismTypeProperty = true, disableWarnings = false disableWarnings = false, useImprovedDateFormatMapping = true ) } case class JsonSchemaConfig ( useHTML5DateTimeLocal:Boolean, autoGenerateTitleForProperties:Boolean, defaultArrayFormat:Option[String], useOneOfForOption:Boolean, usePropertyOrdering:Boolean, hidePolymorphismTypeProperty:Boolean, disableWarnings:Boolean disableWarnings:Boolean, useImprovedDateFormatMapping:Boolean ) Loading Loading @@ -88,6 +88,15 @@ class JsonSchemaGenerator val log = LoggerFactory.getLogger(getClass) val dateFormatMapping = Map[String,String]( // Java7 dates "java.time.OffsetDateTime" -> "datetime-local", // using datetime-local since it is supported in html5 "java.time.LocalDate" -> "date", // Joda-dates "org.joda.time.LocalDate" -> "date" ) trait MySerializerProvider { var provider: SerializerProvider = null Loading @@ -113,11 +122,7 @@ class JsonSchemaGenerator } private def setFormat(node:ObjectNode, format:String): Unit = { val formatToUse = if ( config.useHTML5DateTimeLocal && format == "date-time" ) "datetime-local" else format node.put("format", formatToUse) node.put("format", format) } Loading Loading @@ -660,6 +665,10 @@ class JsonSchemaGenerator Option(prop.getAnnotation(classOf[JsonSchemaFormat])).map { jsonSchemaFormat => jsonSchemaFormat.value() }.orElse { if( config.useImprovedDateFormatMapping ) { dateFormatMapping.get(prop.getType.getRawClass.getName) } else None } } Loading
src/test/scala/com/kjetland/jackson/jsonSchema/JsonSchemaGeneratorTest.scala +23 −3 Original line number Diff line number Diff line package com.kjetland.jackson.jsonSchema import java.time.OffsetDateTime import java.time.{LocalDate, OffsetDateTime} import java.util import java.util.{Optional, TimeZone} Loading @@ -10,6 +10,7 @@ import com.fasterxml.jackson.databind.module.SimpleModule import com.fasterxml.jackson.databind.node.{ArrayNode, MissingNode, NullNode, ObjectNode} import com.fasterxml.jackson.databind.{JsonNode, ObjectMapper, SerializationFeature} import com.fasterxml.jackson.datatype.jdk8.Jdk8Module import com.fasterxml.jackson.datatype.joda.JodaModule import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule import com.fasterxml.jackson.module.scala.DefaultScalaModule import com.github.fge.jsonschema.main.JsonSchemaFactory Loading @@ -33,6 +34,7 @@ class JsonSchemaGeneratorTest extends FunSuite with Matchers { om.registerModule(new JavaTimeModule) om.registerModule(new Jdk8Module ) om.registerModule(new JodaModule) om.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false) om.setTimeZone(TimeZone.getDefault()) Loading Loading @@ -589,6 +591,17 @@ class JsonSchemaGeneratorTest extends FunSuite with Matchers { } } test("dates") { val jsonNode = assertToFromJson(jsonSchemaGeneratorScalaHTML5, testData.manyDates) val schema = generateAndValidateSchema(jsonSchemaGeneratorScalaHTML5, testData.manyDates.getClass, Some(jsonNode)) assert(schema.at("/properties/javaOffsetDate/format").asText() == "datetime-local") assert(schema.at("/properties/javaLocalDate/format").asText() == "date") assert(schema.at("/properties/jodaLocalDate/format").asText() == "date") } } trait TestData { Loading Loading @@ -674,7 +687,7 @@ trait TestData { ) val pojoUsingFormat = new PojoUsingFormat("test@example.com", true, OffsetDateTime.now(), OffsetDateTime.now()) val manyDates = ManyDates(OffsetDateTime.now(), LocalDate.now(), org.joda.time.LocalDate.now()) } Loading Loading @@ -721,3 +734,10 @@ case class PojoUsingOptionScala( optionalList:Option[List[ClassNotExtendingAnythingScala]] //, parent:Option[ParentScala] - Not using this one: jackson-scala-module does not support Option combined with Polymorphism ) case class ManyDates ( javaOffsetDate:OffsetDateTime, javaLocalDate:LocalDate, jodaLocalDate:org.joda.time.LocalDate ) No newline at end of file