Commit 41e36143 authored by mokj's avatar mokj
Browse files

Using improved way of mapping date-classes to format in html5-mode

parent 2831e0d6
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -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,
@@ -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("."))
+22 −13
Original line number Diff line number Diff line
@@ -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
)


@@ -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

@@ -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)
  }


@@ -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
    }
  }

+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}

@@ -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
@@ -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())
@@ -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 {
@@ -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())
}


@@ -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