Commit 2ca3e82e authored by mokj's avatar mokj
Browse files

More scala related improvements

parent 50aef1b2
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@
lazy val commonSettings = Seq(
  organization := "com.kjetland",
  organizationName := "mbknor",
  version := "1.0.1-SNAPSHOT",
  version := "1.0.1-build3-SNAPSHOT",
  scalaVersion := "2.11.8",
  publishMavenStyle := true,
  publishArtifact in Test := false,
+3 −3
Original line number Diff line number Diff line
@@ -366,12 +366,12 @@ class JsonSchemaGenerator(val rootObjectMapper: ObjectMapper, debug:Boolean = fa
                val childVisitor = createChild(thisPropertyNode)

                // Workaround for scala lists and so on
                if ( (propertyType.isArrayType || propertyType.isCollectionLikeType) && propertyType.containedTypeCount() >= 1) {
                if ( (propertyType.isArrayType || propertyType.isCollectionLikeType) && !classOf[Option[_]].isAssignableFrom(propertyType.getRawClass) && propertyType.containedTypeCount() >= 1) {
                  val itemType = propertyType.containedType(0)
                  // If visiting a scala list and using default acceptJsonFormatVisitor-apporach,
                  // If visiting a scala list and using default acceptJsonFormatVisitor-approach,
                  // we get java.lang.Object instead of actual type.
                  // By doing it manually like this it works.

                  l(s"JsonObjectFormatVisitor - forcing array for ${prop}")
                  childVisitor.expectArrayFormat(itemType).itemsFormat(null, itemType)
                } else if(classOf[Option[_]].isAssignableFrom(propertyType.getRawClass) && propertyType.containedTypeCount() >= 1) {

+28 −9
Original line number Diff line number Diff line
@@ -131,17 +131,30 @@ class JsonSchemaGeneratorTest extends FunSuite with Matchers {

  test("Generate scheme for plain class not using @JsonTypeInfo") {

    def doTest(pojo:Object, clazz:Class[_], g:JsonSchemaGenerator): Unit = {
    {

      val jsonNode = assertToFromJson(g, pojo)
      val schema = generateAndValidateSchema(g, clazz, Some(jsonNode))
      val jsonNode = assertToFromJson(jsonSchemaGenerator, testData.classNotExtendingAnything)
      val schema = generateAndValidateSchema(jsonSchemaGenerator, testData.classNotExtendingAnything.getClass, Some(jsonNode))

      assert( false == schema.at("/additionalProperties").asBoolean())
      assert( schema.at("/properties/someString/type").asText() == "string")

      assert( schema.at("/properties/myEnum/type").asText() == "string")
      assert( getArrayNodeAsListOfStrings(schema.at("/properties/myEnum/enum")) == List("A","B","C"))
    }

    doTest(testData.classNotExtendingAnything, testData.classNotExtendingAnything.getClass, jsonSchemaGenerator)
    doTest(testData.classNotExtendingAnythingScala, testData.classNotExtendingAnythingScala.getClass, jsonSchemaGeneratorScala)
    {

      val jsonNode = assertToFromJson(jsonSchemaGeneratorScala, testData.classNotExtendingAnythingScala)
      val schema = generateAndValidateSchema(jsonSchemaGeneratorScala, testData.classNotExtendingAnythingScala.getClass, Some(jsonNode))

      assert( false == schema.at("/additionalProperties").asBoolean())
      assert( schema.at("/properties/someString/type").asText() == "string")

      assert( schema.at("/properties/myEnum/type").asText() == "string")
      assert( getArrayNodeAsListOfStrings(schema.at("/properties/myEnum/enum")) == List("A","B","C"))
      assert( getArrayNodeAsListOfStrings(schema.at("/properties/myEnumO/enum")) == List("A","B","C"))
    }

  }

@@ -303,6 +316,10 @@ class JsonSchemaGeneratorTest extends FunSuite with Matchers {
    assertJsonSubTypesInfo(child1, "type", "child1")
    assert( child1.at("/properties/parentString/type").asText() == "string" )
    assert( child1.at("/properties/child1String/type").asText() == "string" )

    assert(schema.at("/properties/optionalList/type").asText() == "array")
    assert(schema.at("/properties/optionalList/items/$ref").asText() == "#/definitions/ClassNotExtendingAnythingScala")

  }

  test("custom serializer not overriding JsonSerializer.acceptJsonFormatVisitor") {
@@ -417,16 +434,17 @@ trait TestData {
  val classNotExtendingAnything = {
    val o = new ClassNotExtendingAnything
    o.someString = "Something"
    o.myEnum = MyEnum.C
    o
  }

  val classNotExtendingAnythingScala = ClassNotExtendingAnythingScala("Something")
  val classNotExtendingAnythingScala = ClassNotExtendingAnythingScala("Something", MyEnum.C, Some(MyEnum.A))

  val manyPrimitives = new ManyPrimitives("s1", 1, 2, true, false, true, 0.1, 0.2, MyEnum.B)

  val manyPrimitivesScala = ManyPrimitivesScala("s1", 1, true, 0.1)

  val pojoUsingOptionScala = PojoUsingOptionScala(Some("s1"), Some(1), Some(true), Some(0.1), Some(child1Scala))
  val pojoUsingOptionScala = PojoUsingOptionScala(Some("s1"), Some(1), Some(true), Some(0.1), Some(child1Scala), Some(List(classNotExtendingAnythingScala)))

  val pojoWithCustomSerializer = {
    val p = new PojoWithCustomSerializer
@@ -475,7 +493,7 @@ case class PojoWithArraysScala
  regularObjectList:List[ClassNotExtendingAnything]
)

case class ClassNotExtendingAnythingScala(someString:String)
case class ClassNotExtendingAnythingScala(someString:String, myEnum: MyEnum, myEnumO: Option[MyEnum])

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes(Array(new JsonSubTypes.Type(value = classOf[Child1Scala], name = "child1"), new JsonSubTypes.Type(value = classOf[Child2Scala], name = "child2")))
@@ -493,6 +511,7 @@ case class PojoUsingOptionScala(
                                 @JsonDeserialize(contentAs = classOf[Int])     _integer:Option[Int],
                                 @JsonDeserialize(contentAs = classOf[Boolean]) _boolean:Option[Boolean],
                                 @JsonDeserialize(contentAs = classOf[Double])  _double:Option[Double],
                                 child1:Option[Child1Scala]
                                 child1:Option[Child1Scala],
                                 optionalList:Option[List[ClassNotExtendingAnythingScala]]
                                 //, parent:Option[ParentScala] - Not using this one: jackson-scala-module does not support Option combined with Polymorphism
                               )
 No newline at end of file
+0 −0

File mode changed from 100644 to 100755.

+8 −4
Original line number Diff line number Diff line
@@ -3,20 +3,24 @@ package com.kjetland.jackson.jsonSchema.testData;
public class ClassNotExtendingAnything {

    public String someString;
    public MyEnum myEnum;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        if (!(o instanceof ClassNotExtendingAnything)) return false;

        ClassNotExtendingAnything child1 = (ClassNotExtendingAnything) o;
        ClassNotExtendingAnything that = (ClassNotExtendingAnything) o;

        return someString != null ? someString.equals(child1.someString) : child1.someString == null;
        if (someString != null ? !someString.equals(that.someString) : that.someString != null) return false;
        return myEnum == that.myEnum;

    }

    @Override
    public int hashCode() {
        return someString != null ? someString.hashCode() : 0;
        int result = someString != null ? someString.hashCode() : 0;
        result = 31 * result + (myEnum != null ? myEnum.hashCode() : 0);
        return result;
    }
}