From bcd9168143c593f2d5fe09372bd5b630e51a6609 Mon Sep 17 00:00:00 2001 From: "s.hardt" Date: Fri, 31 Aug 2018 18:18:47 +0200 Subject: [PATCH 1/4] Add JavaEnumFormat and some tests --- .../play/api/libs/json/JavaEnumFormat.scala | 34 +++++++++++++++++++ .../play/api/libs/json/JavaTestEnum.java | 15 ++++++++ .../api/libs/json/JavaTestsEnumsFormat.scala | 8 +++++ .../play/api/libs/json/ReadsSharedSpec.scala | 8 +++++ .../play/api/libs/json/WritesSharedSpec.scala | 8 +++++ 5 files changed, 73 insertions(+) create mode 100644 play-json/shared/src/main/scala/play/api/libs/json/JavaEnumFormat.scala create mode 100644 play-json/shared/src/test/scala/play/api/libs/json/JavaTestEnum.java create mode 100644 play-json/shared/src/test/scala/play/api/libs/json/JavaTestsEnumsFormat.scala diff --git a/play-json/shared/src/main/scala/play/api/libs/json/JavaEnumFormat.scala b/play-json/shared/src/main/scala/play/api/libs/json/JavaEnumFormat.scala new file mode 100644 index 000000000..78c859f0f --- /dev/null +++ b/play-json/shared/src/main/scala/play/api/libs/json/JavaEnumFormat.scala @@ -0,0 +1,34 @@ +package play.api.libs.json + +/** + * Helper for format a java enum into or from json + * + * public enum TestEnum { + * + * TEST1, + * TEST2, + * OKAY + * + * } + * + * implicit val TestEnumFormat = JavaEnumFormat.format[TestEnum] + * + * @author Sebastian Hardt (s.hardt@micromata.de) + */ +object JavaEnumFormat { + def format[A <: Enum[A]](implicit m: scala.reflect.Manifest[A]): Format[A] = { + new JsonJavaEnumFormat[A] + } +} + +/** + * Format for java enums from and to json + * + * @param classType the classType of the enum + * @tparam A the type of the enum + */ +class JsonJavaEnumFormat[A <: Enum[A]](implicit m: scala.reflect.Manifest[A]) extends Format[A] { + def reads(json: JsValue) = JsSuccess(Enum.valueOf[A](m.runtimeClass.asInstanceOf[Class[A]], json.as[String])) + + def writes(enumValue: A) = JsString(enumValue.name()) +} diff --git a/play-json/shared/src/test/scala/play/api/libs/json/JavaTestEnum.java b/play-json/shared/src/test/scala/play/api/libs/json/JavaTestEnum.java new file mode 100644 index 000000000..a4e09676b --- /dev/null +++ b/play-json/shared/src/test/scala/play/api/libs/json/JavaTestEnum.java @@ -0,0 +1,15 @@ +package play.api.libs.json; + + +public enum JavaTestEnum { + + TEST_1(true), + + TEST_2(false); + + public final boolean testPriv; + + JavaTestEnum(boolean testPriv) { + this.testPriv = testPriv; + } +} diff --git a/play-json/shared/src/test/scala/play/api/libs/json/JavaTestsEnumsFormat.scala b/play-json/shared/src/test/scala/play/api/libs/json/JavaTestsEnumsFormat.scala new file mode 100644 index 000000000..dbf7bf8b5 --- /dev/null +++ b/play-json/shared/src/test/scala/play/api/libs/json/JavaTestsEnumsFormat.scala @@ -0,0 +1,8 @@ +package play.api.libs.json + + +object JavaTestsEnumsFormat { + implicit val testsEnumsFormat = JavaEnumFormat[JavaTestEnum] +} + + diff --git a/play-json/shared/src/test/scala/play/api/libs/json/ReadsSharedSpec.scala b/play-json/shared/src/test/scala/play/api/libs/json/ReadsSharedSpec.scala index 2ddc3097a..a3c8d22ea 100644 --- a/play-json/shared/src/test/scala/play/api/libs/json/ReadsSharedSpec.scala +++ b/play-json/shared/src/test/scala/play/api/libs/json/ReadsSharedSpec.scala @@ -158,6 +158,14 @@ class ReadsSharedSpec extends WordSpec with MustMatchers { } } + "JavaEnumFormat" should { + import JavaTestsEnumsFormat._ + "deserialize correctly java enum with names" in { + JsString("TEST_1").validate[JavaTestEnum] mustEqual JsSuccess(JavaTestEnum.TEST_1) + JsString("TEST_2").validate[JavaTestEnum] mustEqual JsSuccess(JavaTestEnum.TEST_2) + } + } + // --- case class Owner( diff --git a/play-json/shared/src/test/scala/play/api/libs/json/WritesSharedSpec.scala b/play-json/shared/src/test/scala/play/api/libs/json/WritesSharedSpec.scala index 69b7a76e5..ef28845f1 100644 --- a/play-json/shared/src/test/scala/play/api/libs/json/WritesSharedSpec.scala +++ b/play-json/shared/src/test/scala/play/api/libs/json/WritesSharedSpec.scala @@ -76,6 +76,14 @@ class WritesSharedSpec extends WordSpec with MustMatchers { } } + "JavaEnumFormat" should { + import JavaTestsEnumsFormat._ + "serialize correctly java enum with names" in { + Json.toJson(JavaTestEnum.TEST_1) mustEqual JsString("TEST_1") + Json.toJson(JavaTestEnum.TEST_2) mustEqual JsString("TEST_2") + } + } + // --- case class Location(lat: Double, long: Double) From 75669aa6e712579ff17f3e3345be0df1760d78c5 Mon Sep 17 00:00:00 2001 From: "s.hardt" Date: Fri, 31 Aug 2018 18:23:38 +0200 Subject: [PATCH 2/4] Test fix --- .../play/api/libs/json/JavaEnumFormat.scala | 38 +++++++++---------- .../api/libs/json/JavaTestsEnumsFormat.scala | 4 +- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/play-json/shared/src/main/scala/play/api/libs/json/JavaEnumFormat.scala b/play-json/shared/src/main/scala/play/api/libs/json/JavaEnumFormat.scala index 78c859f0f..f590d7f51 100644 --- a/play-json/shared/src/main/scala/play/api/libs/json/JavaEnumFormat.scala +++ b/play-json/shared/src/main/scala/play/api/libs/json/JavaEnumFormat.scala @@ -1,20 +1,20 @@ package play.api.libs.json /** - * Helper for format a java enum into or from json - * - * public enum TestEnum { - * - * TEST1, - * TEST2, - * OKAY - * - * } - * - * implicit val TestEnumFormat = JavaEnumFormat.format[TestEnum] - * - * @author Sebastian Hardt (s.hardt@micromata.de) - */ + * Helper for format a java enum into or from json + * + * public enum TestEnum { + * + * TEST1, + * TEST2, + * OKAY + * + * } + * + * implicit val TestEnumFormat = JavaEnumFormat.format[TestEnum] + * + * @author Sebastian Hardt (s.hardt@micromata.de) + */ object JavaEnumFormat { def format[A <: Enum[A]](implicit m: scala.reflect.Manifest[A]): Format[A] = { new JsonJavaEnumFormat[A] @@ -22,11 +22,11 @@ object JavaEnumFormat { } /** - * Format for java enums from and to json - * - * @param classType the classType of the enum - * @tparam A the type of the enum - */ + * Format for java enums from and to json + * + * @param classType the classType of the enum + * @tparam A the type of the enum + */ class JsonJavaEnumFormat[A <: Enum[A]](implicit m: scala.reflect.Manifest[A]) extends Format[A] { def reads(json: JsValue) = JsSuccess(Enum.valueOf[A](m.runtimeClass.asInstanceOf[Class[A]], json.as[String])) diff --git a/play-json/shared/src/test/scala/play/api/libs/json/JavaTestsEnumsFormat.scala b/play-json/shared/src/test/scala/play/api/libs/json/JavaTestsEnumsFormat.scala index dbf7bf8b5..68d30f4dc 100644 --- a/play-json/shared/src/test/scala/play/api/libs/json/JavaTestsEnumsFormat.scala +++ b/play-json/shared/src/test/scala/play/api/libs/json/JavaTestsEnumsFormat.scala @@ -1,8 +1,6 @@ package play.api.libs.json - object JavaTestsEnumsFormat { - implicit val testsEnumsFormat = JavaEnumFormat[JavaTestEnum] + implicit val testsEnumsFormat = JavaEnumFormat.format[JavaTestEnum] } - From 18cae537422f43b89d1823cad74313208fa68334 Mon Sep 17 00:00:00 2001 From: Sebastian Hardt Date: Sun, 14 Oct 2018 17:53:48 +0200 Subject: [PATCH 3/4] Fixed copyright --- .../src/main/scala/play/api/libs/json/JavaEnumFormat.scala | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/play-json/shared/src/main/scala/play/api/libs/json/JavaEnumFormat.scala b/play-json/shared/src/main/scala/play/api/libs/json/JavaEnumFormat.scala index f590d7f51..17e55db09 100644 --- a/play-json/shared/src/main/scala/play/api/libs/json/JavaEnumFormat.scala +++ b/play-json/shared/src/main/scala/play/api/libs/json/JavaEnumFormat.scala @@ -1,3 +1,7 @@ +/* + * Copyright (C) 2009-2018 Lightbend Inc. + */ + package play.api.libs.json /** @@ -13,7 +17,6 @@ package play.api.libs.json * * implicit val TestEnumFormat = JavaEnumFormat.format[TestEnum] * - * @author Sebastian Hardt (s.hardt@micromata.de) */ object JavaEnumFormat { def format[A <: Enum[A]](implicit m: scala.reflect.Manifest[A]): Format[A] = { @@ -24,7 +27,6 @@ object JavaEnumFormat { /** * Format for java enums from and to json * - * @param classType the classType of the enum * @tparam A the type of the enum */ class JsonJavaEnumFormat[A <: Enum[A]](implicit m: scala.reflect.Manifest[A]) extends Format[A] { From 3bb7e5a1bfc76641b34103d2550088fcae648910 Mon Sep 17 00:00:00 2001 From: Sebastian Hardt Date: Sun, 14 Oct 2018 18:04:05 +0200 Subject: [PATCH 4/4] Add copyright to the test classes --- .../src/test/scala/play/api/libs/json/JavaTestEnum.java | 4 ++++ .../test/scala/play/api/libs/json/JavaTestsEnumsFormat.scala | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/play-json/shared/src/test/scala/play/api/libs/json/JavaTestEnum.java b/play-json/shared/src/test/scala/play/api/libs/json/JavaTestEnum.java index a4e09676b..78850e666 100644 --- a/play-json/shared/src/test/scala/play/api/libs/json/JavaTestEnum.java +++ b/play-json/shared/src/test/scala/play/api/libs/json/JavaTestEnum.java @@ -1,3 +1,7 @@ +/* + * Copyright (C) 2009-2018 Lightbend Inc. + */ + package play.api.libs.json; diff --git a/play-json/shared/src/test/scala/play/api/libs/json/JavaTestsEnumsFormat.scala b/play-json/shared/src/test/scala/play/api/libs/json/JavaTestsEnumsFormat.scala index 68d30f4dc..9e24bf266 100644 --- a/play-json/shared/src/test/scala/play/api/libs/json/JavaTestsEnumsFormat.scala +++ b/play-json/shared/src/test/scala/play/api/libs/json/JavaTestsEnumsFormat.scala @@ -1,3 +1,7 @@ +/* + * Copyright (C) 2009-2018 Lightbend Inc. + */ + package play.api.libs.json object JavaTestsEnumsFormat {