Commit d18d576c authored by mokj's avatar mokj
Browse files

Added support for propertyOrdering for HTML5-mode

parent a411f5a8
Loading
Loading
Loading
Loading
+16 −3
Original line number Diff line number Diff line
@@ -27,7 +27,8 @@ object JsonSchemaConfig {
    useHTML5DateTimeLocal = false,
    autoGenerateTitleForProperties = false,
    defaultArrayFormat = None,
    useOneOfForOption = false
    useOneOfForOption = false,
    usePropertyOrdering = false
  )

  /**
@@ -42,7 +43,8 @@ object JsonSchemaConfig {
    useHTML5DateTimeLocal = true,
    autoGenerateTitleForProperties = true,
    defaultArrayFormat = Some("table"),
    useOneOfForOption = true
    useOneOfForOption = true,
    usePropertyOrdering = true
  )
}

@@ -51,7 +53,8 @@ case class JsonSchemaConfig
  useHTML5DateTimeLocal:Boolean,
  autoGenerateTitleForProperties:Boolean,
  defaultArrayFormat:Option[String],
  useOneOfForOption:Boolean
  useOneOfForOption:Boolean,
  usePropertyOrdering:Boolean
)


@@ -442,6 +445,11 @@ class JsonSchemaGenerator

            Some(new JsonObjectFormatVisitor with MySerializerProvider {


              // Used when rendering schema using propertyOrdering as specified here:
              // https://github.com/jdorn/json-editor#property-ordering
              var nextPropertyOrderIndex = 1

              def myPropertyHandler(propertyName:String, propertyType:JavaType, prop: Option[BeanProperty], jsonPropertyRequired:Boolean): Unit = {
                l(s"JsonObjectFormatVisitor - ${propertyName}: ${propertyType}")

@@ -453,6 +461,11 @@ class JsonSchemaGenerator
                  val thisPropertyNode = JsonNodeFactory.instance.objectNode()
                  propertiesNode.set(propertyName, thisPropertyNode)

                  if ( config.usePropertyOrdering ) {
                    thisPropertyNode.put("propertyOrder", nextPropertyOrderIndex)
                    nextPropertyOrderIndex = nextPropertyOrderIndex + 1
                  }

                  // Check for Option/Optional-special-case
                  if ( config.useOneOfForOption &&
                    (    classOf[Option[_]].isAssignableFrom(propertyType.getRawClass)
+19 −1
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@ import java.util.{Optional, TimeZone}
import com.fasterxml.jackson.annotation.{JsonProperty, JsonSubTypes, JsonTypeInfo, JsonValue}
import com.fasterxml.jackson.databind.annotation.JsonDeserialize
import com.fasterxml.jackson.databind.module.SimpleModule
import com.fasterxml.jackson.databind.node.{ArrayNode, MissingNode, ObjectNode}
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.jsr310.JavaTimeModule
@@ -554,6 +554,24 @@ class JsonSchemaGeneratorTest extends FunSuite with Matchers {
    assert(schema.at("/properties/optionalList/title").asText() == "Optional List")
  }

  test("propertyOrdering") {
    {
      val jsonNode = assertToFromJson(jsonSchemaGeneratorHTML5, testData.classNotExtendingAnything)
      val schema = generateAndValidateSchema(jsonSchemaGeneratorHTML5, testData.classNotExtendingAnything.getClass, Some(jsonNode))

      assert(schema.at("/properties/someString/propertyOrder").asInt() == 1)
      assert(schema.at("/properties/myEnum/propertyOrder").asInt() == 2)
    }

    // Make sure propertyOrder is not enabled when not using html5
    {
      val jsonNode = assertToFromJson(jsonSchemaGenerator, testData.classNotExtendingAnything)
      val schema = generateAndValidateSchema(jsonSchemaGenerator, testData.classNotExtendingAnything.getClass, Some(jsonNode))

      assert(schema.at("/properties/someString/propertyOrder").isMissingNode == true)
    }
  }

}

trait TestData {