From 977523bb2675c4f10528d0fe338d4565ce4bd459 Mon Sep 17 00:00:00 2001 From: Wojciech Langiewicz Date: Fri, 6 May 2016 16:01:29 +0200 Subject: [PATCH 1/4] added AkkaHttpJsonapiSupport --- build.sbt | 1 + .../sprayjson/AkkaHttpJsonapiSupport.scala | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 src/main/scala/org/zalando/jsonapi/json/sprayjson/AkkaHttpJsonapiSupport.scala diff --git a/build.sbt b/build.sbt index e495755..3d4e5c8 100644 --- a/build.sbt +++ b/build.sbt @@ -24,6 +24,7 @@ libraryDependencies ++= Seq( "io.spray" %% "spray-httpx" % "1.3.3" % "provided", "com.typesafe.akka" %% "akka-actor" % "2.3.6" % "provided", "com.typesafe.play" %% "play-json" % "2.3.8" % "provided", + "com.typesafe.akka" %% "akka-http-spray-json-experimental" % "2.4.4" % "provided", "org.scalatest" %% "scalatest" % "2.2.4" % "test" ) diff --git a/src/main/scala/org/zalando/jsonapi/json/sprayjson/AkkaHttpJsonapiSupport.scala b/src/main/scala/org/zalando/jsonapi/json/sprayjson/AkkaHttpJsonapiSupport.scala new file mode 100644 index 0000000..b0f496e --- /dev/null +++ b/src/main/scala/org/zalando/jsonapi/json/sprayjson/AkkaHttpJsonapiSupport.scala @@ -0,0 +1,22 @@ +package org.zalando.jsonapi.json.sprayjson + +import akka.http.scaladsl.marshalling.{ToEntityMarshaller, Marshaller} +import org.zalando.jsonapi.model.RootObject +import spray.json._ +import akka.http.scaladsl.model.MediaTypes.`application/vnd.api+json` +import akka.http.scaladsl.unmarshalling.{FromEntityUnmarshaller, Unmarshaller} + +trait AkkaHttpJsonapiSupport extends SprayJsonJsonapiFormat with DefaultJsonProtocol { + implicit def akkaHttpJsonJsonapiMarshaller(implicit printer: JsonPrinter = PrettyPrinter): ToEntityMarshaller[RootObject] = { + Marshaller.StringMarshaller.wrap(`application/vnd.api+json`)(printer).compose(_.toJson) + } + + implicit def akkaHttpJsonJsonapiUnmarshaller: FromEntityUnmarshaller[RootObject] = { + Unmarshaller + .byteStringUnmarshaller + .forContentTypes(`application/vnd.api+json`) + .mapWithCharset((data, charset) => data.decodeString(charset.nioCharset.name).parseJson.convertTo[RootObject]) + } +} + +object AkkaHttpJsonapiSupport extends AkkaHttpJsonapiSupport From 3994350d919e5dca340f76285958cae311d5a681 Mon Sep 17 00:00:00 2001 From: Wojciech Langiewicz Date: Thu, 12 May 2016 19:47:00 +0200 Subject: [PATCH 2/4] formatting fix, use JDK 8 for travis builds --- .travis.yml | 2 ++ .../jsonapi/json/sprayjson/AkkaHttpJsonapiSupport.scala | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 45bb3db..a392ac9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,8 @@ language: scala scala: - 2.11.7 +jdk: + - oraclejdk8 branches: only: - master diff --git a/src/main/scala/org/zalando/jsonapi/json/sprayjson/AkkaHttpJsonapiSupport.scala b/src/main/scala/org/zalando/jsonapi/json/sprayjson/AkkaHttpJsonapiSupport.scala index b0f496e..bfd6857 100644 --- a/src/main/scala/org/zalando/jsonapi/json/sprayjson/AkkaHttpJsonapiSupport.scala +++ b/src/main/scala/org/zalando/jsonapi/json/sprayjson/AkkaHttpJsonapiSupport.scala @@ -1,10 +1,10 @@ package org.zalando.jsonapi.json.sprayjson -import akka.http.scaladsl.marshalling.{ToEntityMarshaller, Marshaller} +import akka.http.scaladsl.marshalling.{ ToEntityMarshaller, Marshaller } import org.zalando.jsonapi.model.RootObject import spray.json._ import akka.http.scaladsl.model.MediaTypes.`application/vnd.api+json` -import akka.http.scaladsl.unmarshalling.{FromEntityUnmarshaller, Unmarshaller} +import akka.http.scaladsl.unmarshalling.{ FromEntityUnmarshaller, Unmarshaller } trait AkkaHttpJsonapiSupport extends SprayJsonJsonapiFormat with DefaultJsonProtocol { implicit def akkaHttpJsonJsonapiMarshaller(implicit printer: JsonPrinter = PrettyPrinter): ToEntityMarshaller[RootObject] = { @@ -15,7 +15,7 @@ trait AkkaHttpJsonapiSupport extends SprayJsonJsonapiFormat with DefaultJsonProt Unmarshaller .byteStringUnmarshaller .forContentTypes(`application/vnd.api+json`) - .mapWithCharset((data, charset) => data.decodeString(charset.nioCharset.name).parseJson.convertTo[RootObject]) + .mapWithCharset((data, charset) ⇒ data.decodeString(charset.nioCharset.name).parseJson.convertTo[RootObject]) } } From 48ba51030e084e0107b0fd6d9b9411cbf9448bd0 Mon Sep 17 00:00:00 2001 From: Wojciech Langiewicz Date: Thu, 12 May 2016 19:58:04 +0200 Subject: [PATCH 3/4] drop support for scala 2.10 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 3d4e5c8..dd66487 100644 --- a/build.sbt +++ b/build.sbt @@ -12,7 +12,7 @@ scalaVersion := "2.11.8" scalacOptions ++= Seq("-feature", "-unchecked", "-deprecation") -crossScalaVersions := Seq("2.11.8", "2.10.6") +crossScalaVersions := Seq("2.11.8") resolvers ++= Seq( "spray" at "http://repo.spray.io/", From 2c01da9be193e5923d6c75f464004c750efb9e66 Mon Sep 17 00:00:00 2001 From: Wojciech Langiewicz Date: Thu, 26 May 2016 16:50:24 +0200 Subject: [PATCH 4/4] improve (un)marshalling after review --- .../sprayjson/AkkaHttpJsonapiSupport.scala | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/main/scala/org/zalando/jsonapi/json/sprayjson/AkkaHttpJsonapiSupport.scala b/src/main/scala/org/zalando/jsonapi/json/sprayjson/AkkaHttpJsonapiSupport.scala index bfd6857..e368320 100644 --- a/src/main/scala/org/zalando/jsonapi/json/sprayjson/AkkaHttpJsonapiSupport.scala +++ b/src/main/scala/org/zalando/jsonapi/json/sprayjson/AkkaHttpJsonapiSupport.scala @@ -1,22 +1,19 @@ -package org.zalando.jsonapi.json.sprayjson +package org.zalando.jsonapi.json +package sprayjson -import akka.http.scaladsl.marshalling.{ ToEntityMarshaller, Marshaller } +import akka.http.scaladsl.marshalling.{ Marshaller, ToEntityMarshaller } import org.zalando.jsonapi.model.RootObject import spray.json._ import akka.http.scaladsl.model.MediaTypes.`application/vnd.api+json` import akka.http.scaladsl.unmarshalling.{ FromEntityUnmarshaller, Unmarshaller } +import org.zalando.jsonapi._ -trait AkkaHttpJsonapiSupport extends SprayJsonJsonapiFormat with DefaultJsonProtocol { - implicit def akkaHttpJsonJsonapiMarshaller(implicit printer: JsonPrinter = PrettyPrinter): ToEntityMarshaller[RootObject] = { - Marshaller.StringMarshaller.wrap(`application/vnd.api+json`)(printer).compose(_.toJson) - } +trait AkkaHttpJsonapiSupport extends DefaultJsonProtocol with SprayJsonJsonapiFormat { + implicit def akkaHttpJsonJsonapiMarshaller[T: JsonapiRootObjectWriter]: ToEntityMarshaller[T] = + Marshaller.withFixedContentType(`application/vnd.api+json`)(_.rootObject.toJson.compactPrint) - implicit def akkaHttpJsonJsonapiUnmarshaller: FromEntityUnmarshaller[RootObject] = { - Unmarshaller - .byteStringUnmarshaller - .forContentTypes(`application/vnd.api+json`) - .mapWithCharset((data, charset) ⇒ data.decodeString(charset.nioCharset.name).parseJson.convertTo[RootObject]) - } + implicit def akkaHttpJsonJsonapiUnmarshaller[T: JsonapiRootObjectReader]: FromEntityUnmarshaller[T] = + Unmarshaller.stringUnmarshaller.forContentTypes(`application/vnd.api+json`).map(_.parseJson.convertTo[RootObject].jsonapi[T]) } object AkkaHttpJsonapiSupport extends AkkaHttpJsonapiSupport